Intro
Node.js 採用 Google 開發的 V8 引擎執行 JavaScript 代碼,通過事件驅動、非阻塞/非同步輸入輸出模型提應用效能,適用於併發需求。
與其他語言最大的不同之處:
- 傳統語言(如 PHP)使用阻塞 I/O 模型: 只有前一條命令執行完畢才會執行後面的命令
- Node.js 使用非阻塞 I/O 模型: 任務可以發送後即繼續執行其他操作,多條命令可以同時被執行,通過回調函式如 Promise 得知任務完成狀態
總之,Node.js 承襲了 JavaScript 的 Event loop 的特性,在單一執行緒架構下可以輕易實現非阻塞 I/O 任務併發應用
Promise.all() 在 Event loop 中的概念可以對應 Multithreading 中的 join()
安裝 Node.js
檢查版本
$ node --version
v14.17.5
NPM套件管理器
package.json - 放置於 Git 根目錄的 NPM 套件設定檔
Namespace 規則: {package name}
(與 Github 無關連)
專案內安裝套件
npm install {require package name}
常用指令
# 列出專案內清楚
的已安裝套件
npm list --depth=0
# 列出全域已安裝套件
npm list --global
# 查看某package是否已安裝
npm list
Quick Start
How do I start with Node.js after I installed it?
直接任一創建一個檔案app.js
:
console.log("Hello world");
接著使用node
指令直譯程式:
$ node app.js
Hello world
常用函數
console.log()
return
process.exit()
Process / Environment Variable
環境變數設定檔 .env for Process.env
利用建立.env
檔案來設定環境變數並生效至runtime中的Process.env
。
記得
.env
需.gitignore
而勿上傳至Git repository
使用 dotenv 套件方式
dotenv 套件可以協助程式載入.env
的變數至Process.env
,安裝參考如下:
npm install dotenv --save
一般來說可以加入require('dotenv').config();
至程式碼中以便啟動套件載入變數, 若不希望異動程式碼而想利用 Command 方式啟動,可以在指令中利用-r --require
參數帶入以啟用:
node -r dotenv/config app.js
Web建置
快速建立HTTP Server
How do I create a HTTP server?
反向代理 Reverse Proxy
可以使用nginx做反向代理NodeJS App,如上述8080
port本地web app,nginx反向代理設定範例如下:
server {
listen 80;
server_name _;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Host $host;
}
}
Node Cluster - 多進程
Nodejs web 同其語言性質一樣為 Single Thread 在處理 Requests (但為 Asynchronous I/O),可以透過 Node Cluster 模組在一台 Web server 上建立多個 worker,透過 IPC 與 父行程溝通,將工作分散至不同的 CPU 中處理。
Concurrency - 並發/並行
Multi-threading
- Worker threads | Node.js Documentation (Added in: v10.5.0)
Multi-processing
在版本有支援 Worker threads 下應該很少情境會用上 Multi-processing。