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)
背 景
-
常見的 輸入-輸出 模型
-
同步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) } }
- 多線程
多個文件在多個線程中進行
-
-
異步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)
- 如果 x 是一個內置模塊
-> 直接返回內置模塊
-> 結束 - 如果 x 以'/'開頭
-> 將 y 設置爲根目錄 - 如果 x 以 './' 或 '../' 或 '/' 開頭
-> 加載 y + x 組合的路徑 -
如果 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 , 這裏的指的是一個命令行工具裝在全局中