node 初步 (一)

node 介 紹

node.js 的一些 '是' 與 '不是'

  • 不是一個框架, 庫
  • 不是一門新的語言
  • 是一個平臺
  • 是一個 JS 的運行環境(瀏覽器也是 JS 的運行環境)
  • 運行在 Chrome 的 V8 引擎中, 性能很高

    • 並不在瀏覽器沙箱中運行
    • 功能上類似C/C++
    • 能訪問電腦上的資源(文件,網絡等)

node.js 現階段應用場景

  • 高性能 web 服務器

    • 單線程異步實現
    • 其他語言 Java / Python / NGINX
  • 前端構建/前端工程化(搭環境)

    • 轉義( es6 -> es5, less/sass -> css)
    • 壓縮, 混淆(把易讀的源代碼轉化成幾乎不可讀的, 最主要的手段就是通過改變形參的名字)
    • 打包(把從入口文件開始的所有使用到的文件打包成一個文件)
  • 爬蟲, 命令行工具等
  • Electron (VScode, Atom)

    • 由於沒有 UI 框架, node 和瀏覽器結合, 利用瀏覽器窗口實現用戶界面(VScode)

背 景

  • 常見的 輸入-輸出 模型

    1. 同步I/O
      當文件讀取完全結束時返回內容

      • 傳統方式
        一個文件完全讀取執行完成後, 再讀取下一個

           for(var i = 0; i < 10; i++) {
               var content = readFile(i + '.txt')
           }
      • 優化方式(C/C++)
        所有文件同時讀取, 哪個先讀取完, 哪個先執行
        select 函數是系統自帶的一個函數, 會在所傳入參數數組中的任何一個元素準備好時進行返回

           var conn1 = connect()
           var conn2 = connect()
           var conn3 = connect()
          
           while(true){
                   var readyConns = select([conn1, conn2, conn3])
                   for(var readyConn of readyConns) {
                        var data = read(readyConn)
                        var result = process(data)
                        Write(readyConn, result)
                   }
           }
      • 多線程
        多個文件在多個線程中進行
    2. 異步I/O(node.js)
      腳本在讀寫設備的同時繼續執行, 並在任務完成時調用回調函數
      實際上是通過多個線程實現的, 只不過多線程相對隱藏, 只能夠應用相應接口進行調用

      fs.readFile('a.txt', (err, data) => {
      
      })
      console.log(1)
  • 同步/異步
    同步模式中含有隱藏的等待I/O, 適用於直線控制流程序
    異步模式中的等待I/O在管控之中, 適用於非直線控制模型

node 版本號相關

  • 每年4月和每年10月發佈一個大的版本號(11.x.x->12.x.x)
  • 奇數版本維護的時間相對較短(在下一個偶數號版本發佈後完全停止維護)
  • 在新的偶數號版本發佈後, 前一個偶數號版本會成爲LTS(Long Term Service)版本,並繼續維護1.5年
  • LTS版本非常穩定(API幾乎不會發生變化), 並會修復漏洞

node 命令

  • 執行JS文件

    $ node hello.js(文件名)
  • 交互式控制檯(REPL)

    $ node
    > 1 + 1
    2
    
    > .help // 一些常見幫助信息(break/clear/editor/exit/load/save)
    $
    
  • 命令行參數
    process.argv可以獲取傳遞給腳本的命令行參數
    showargv.js中只包含一條console.log(process.argv)語句

    $ node showargv.js one --and two
    ["node", "/home/margin/showargv.js", "one", "--and", "two"]
  • 調試

    • 在瀏覽器中調試

      $ node --inspect-brk hello.js

      運行完命令,打開Chrome的控制檯點擊node圖標即可
      brk使命令暫停在第一行,可不加

    • 在VScode中直接調試
    • ndb

模 塊

node並沒有在全局作用域中添加很多功能, 多數功能都是通過調用 require 函數從模塊中獲取的

從路徑爲 y 的模塊中 require(x)
  1. 如果 x 是一個內置模塊
    -> 直接返回內置模塊
    -> 結束
  2. 如果 x 以'/'開頭
    -> 將 y 設置爲根目錄
  3. 如果 x 以 './' 或 '../' 或 '/' 開頭
    -> 加載 y + x 組合的路徑
  4. 如果 x 看起來不像一個路徑

    • 在當前文件夾的 node-modules 文件夾裏查找名爲 x 的文件夾

      • 如果此文件夾裏有 package.json , 則加載 main 字段所指向的文件
      • 如果沒有 package.json , 則直接加載文件夾裏的 index 文件
    • 如果在當前文件夾的 node-modules 裏找不到名爲 x 的文件夾

      • 則在當前文件夾的父級文件夾裏查找 node-modules
    • 如果 x 爲 xx/yy 則加載 xx 文件夾中的 yy 文件
     chunk1 = require('lodash').chunk  // 加載了整個 lodash , 只把 chunk 讀取了出來
     chunk2 = require('lodash/chunk')  // 只加載了 lodash 中的 chunk.js 文件

安裝 NPM 模塊

$ npm install figlet
$ npm i figlet//install和global可以縮寫
$ npm i -g figlet
  • npm install : 把文件下載下來, 裝到當前工作目錄的node-modules文件夾裏面
  • npm install --global : 全局安裝, 注意全局安裝並不是在所有地方都可以 require, 只能在當前文件夾中 require , 這裏的指的是一個命令行工具裝在全局中
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章