第263期 / September 5, 2019

分享到臉書!分享到維特!分享到噗浪!分享到Google+!分享到微博!轉寄友人友善列印

NodeJS之基本介紹

作者/黃俊皓

[發表日期:2019/9/5]

作者簡歷

目前任職於凌群電腦電信軟體研發處,曾參與衛生福利部所屬醫院之相關「新一代門、急診及住院雲端醫療照護系統」及「健康檢查管理系統」開發、Cisco ChatBot、Cisco Conference、SYSCOM IOT Solution等計畫。

前言-什麼是NodeJS
NodeJS是一個能夠在服務器端(Server)運行JavaScript的開放源代碼、跨平台 JavaScript 執行環境,由官方網站上的定義NodeJS是一個JavaScript的執行時期(runtime) ,包含了執行程式所需的編譯器以及作業系統的底層支援, NodeJS採用Google開發的V8運行代碼,使用事件驅動、非阻塞和非同步輸入輸出模型等技術來提高性能,可優化應用程序的傳輸量和規模。這些技術通常用於數據密集的即時應用程序。

NodeJS的開發者Ryan Dahl選擇JavaScript與V8的原因是基於JavaScript語法的靈活性,V8因為以下三個特點 使得JavaScript更高的效率與實現:

1.V8是基於BSD授權條款的開源軟體。

2.V8速度非常快。

3.V8專注於網路功能,在HTTP、DNS、TCP等方面更加成熟。

NodeJS的特點

一、非同步I/O

在Node中大部分的操作都是非同步呼叫的方式,非同步呼叫與同步呼叫最大相異處在於是否需要等待每個呼叫皆完成才能繼續往下一個呼叫去進行,非同步I/O能大幅提升程式的效率,Node中依靠libuv來完成非同步I/O, libuv是一個多平台支持庫,專注於非同步I / O,下圖是libuv官網中說明libuv組成的不同部分以及相關的子系統


《圖一》


二、事件循環

事件循環允許Node.js執行非阻塞I / O操作 ,儘管JavaScript是單線程的 ,Node將操作卸載到系統內核NodeJs不使用行程或執行緒處理連接,而是採用事件循環來處理並行連接。

每個瀏覽器中JavaScript的底層實現多少會有區別的,而Node中的事件循環只有一種實現方法相對單純,是交由底層的libuv來實現,libuv是一個跨平台的非同步I O庫,最早是由Node作者開發,專門提供Node多平台下的非同步I O,而libuv是圍繞事件驅動的異步I / O模型設計。下圖是官網上對於Node中事件循環的實際流程,由於其中過程較為複雜,有興趣的讀者建議可結合libuv原始程式閱讀會較容易理解。


《圖二》


timers:此階段執行由setTimeout() 和調度的回調setInterval()。

pending callbacks::執行延遲到下一個循環迭代的I / O回調。

idle, prepare:僅在內部使用。

poll:不斷檢查是否有新的I / O事件; 執行與I / O相關的回調(幾乎所有回調都是關閉回調,定時器調度的回調,以及setImmediate()); 事件循環在此處可能會阻塞。

check:setImmediate()在這裡調用回調。

close callbacks:一些關閉回調,例如socket.on('close', …)

三、單執行緒

在Node中維持JavaScript在瀏覽器中單執行緒的特性,單執行緒的最大好處是可以避免鎖死(deadlock)的狀況. 。

四、跨平台

Node最開始只能在Linux平台上,隨著Node持續發展,也被微軟所注意到,進而協助Node與Windows系統之間的相容,v0.6.0版本之後的Node皆可在Windows平台上運行,能夠在實現在平台間的相容性,主要是因為Node使用libuv作為跨平台的基礎元件。

模組機制

CommonJS是JavaScript的一種模組標準之一,而NodeJS是CommonJS的實現,CommonJS視每個檔案為個別模組,而模組內部所定義之變數都為私有的,無法在模組外作使用,只能透過exports和require關鍵字提供模組外之使用,經由exports可以在模組外部獲得模組內部的屬性及方法,而Node.js包括三種類型的模塊:核心模塊;本地模塊;第三方模塊,其中幾個重要的核心模塊例如: http,url,querystring,path,fs都很常使用到,下面為一個簡單建立server範例。


《圖三》


套件與NPM

NPM是Node Package Manager的縮寫它是一個線上套件庫,可以下載各式各樣的 Javascript 套件來使用,雖然Node本身有一些基本的API ,但是隨著許多第三方模塊的發展,NPM能夠讓使用者更便利的發佈、安裝第三方模組,安裝Node.js後,能通過在終端或命令提示符下編寫以下命令 npm install 來安裝所需套件,例如:npm install express,就可將開發Node常用的express框架安裝到所需的專案中,NPM的使用也能讓初學者更容易上手。

結論

在了解NodeJS幾個重要的特點之後,相對於其他伺服器語言,NodeJS能夠在處理高平行處理請求上更為優異,也能更有效率的使用伺服器記憶體資源,而其能夠單獨實現一個server也是一個很大的優點,例如:HTTP Web伺服器的架設應用。

此外對於熟悉前端許多程式語言的開發著來說,NodeJS是他們能夠快速往全端開發人員邁進的工具,且基於NodeJS許多好用的API對於開發來說能夠更快速的達到專案需求。

參考資料

1.http://docs.libuv.org/en/v1.x/design.html
2.https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick
3.https://www.tutorialsteacher.com/nodejs/nodejs-modules
4.http://nqdeng.github.io/7-days-nodejs/#1
5.https://zh.wikipedia.org/zh-tw/Node.js
6.https://nodejs.org/en/about/resources/
7.https://nodejs.org/en/docs/meta/topics/dependencies/#libuv
8.ps://www.npmjs.com/