[Node.js] Node.js Web 開發環境與語言架構指南

Intro

Node.js

Wiki

Node.js 採用 Google 開發的 V8 執行程式碼,使用事件驅動非阻塞/非同步輸入輸出模型等技術來提高效能,可優化應用程式的傳輸量和規模。

Node.js 主要用於編寫應用於Web伺服器,與其他語言最大的不同之處:

  • 如 PHP 等語言為阻塞I/O: 只有前一條命令執行完畢才會執行後面的命令
  • Node.js 為非阻塞I/O: 多條命令可以同時被執行,通過回呼函式得知命令已結束執行

總之,Node.js 結合了 JavaScript 的易學易用和 Unix網路編程的特性。

Diagram

Thread (執行緒)

Node.js 以單執行緒執行,使用非阻塞I/O呼叫,來支援並行連線。Node.js 應用程式的設計目標是任何需要操作I/O的函式都使用回呼函式。

這種設計的缺點是,如果不使用 clusterpm2 等模組,Node.js 就難以處理多核或多執行緒等情況。


安裝 Node.js

Downloads - Node.js

檢查版本

$ node --version
v14.17.5

NPM套件管理器

NPM JS

package.json - 放置於 Git 根目錄的 NPM 套件設定檔

Creating and publishing unscoped public packages - npm Docs

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

Node JS Process

環境變數設定檔 .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,如上述8080port本地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 中處理。

Node Cluster


Concurrency - 並發/並行

Multi-processing

Child process | Node.js Documentation

Node.js | multi-process(多進程)

Multi-threading

限制於 Node.js thread 特性


References

Leave a Reply

Your email address will not be published. Required fields are marked *