等等,你可能誤解nodejs了–通俗的概括nodejs的真相


最近剛把產品從cpp平台遷移到nodejs平台了.  很多以前關於nodejs的觀念被顛覆了. 這里分享出來, 歡迎大家批評指正.

"nodejs是做服務器端開發的, 它一定和web相關,幾乎是用來做網站開發的."  這是我之前一直的觀念.  相信這可能也是很多人對nodejs的初步認識吧.  但后來我才發現, 我可能錯了.

第一個問題:  nodejs到底是什么?

http://nodejs.org/ 官方主頁上有一段解釋: "Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices."

我們注意其中的幾個關鍵字:  nodejs是一個平台,  它構建在chrome的v8引擎之上,  能簡易的構建快速,可擴展的網絡應用程序.......

這里官方用的"網絡應用程序",  整個描述沒有提到"web", "server" 等等概念.  這段話的描述中, 有兩個是重點, 第一,就是chrome的v8引擎.  第二, 是事件驅動的非阻塞io模型.   把握住這兩點,  我覺得就算掌握了nodejs的真諦了.

這么說吧,  舉個例子, 類比來說,  概念上, nodejs相當於.net,   jvm 或者 python.   它是一個運行平台, 只不過它運行的是javascript語言而已.   類似地,  .net一般運行C#, vb等編譯過后的il.  而jvm一般運行java編譯成的字節碼,  python一般運行python語言.

你可能要問, 那么nodejs是不是也能實現 .net等等這些平台的功能呢.  比如寫個窗口桌面程序, 做socket網絡通信, 以及訪問磁盤文件等等.

恩, 這些問題的答案都是肯定的.

nodejs核心主要是由兩部分組成的:

第一, 是v8引擎, 它負責把javascript代碼解釋成本地的二進制代碼運行.

第二, 是libuv,  類似windows上的窗口消息機制, 它主要負責訂閱和處理系統的各種內核消息. 而且它也實現了消息循環(是不是很耳熟? 沒錯, 這個幾乎就和windows 的窗口消息循環是一個概念.).  它的前身是linux上的libev, 專門封裝linux上的內核消息機制.  后來nodejs重寫了它, 並在windows上使用iocp技術重新實現了一遍.  所以nodejs現在能跨平台運行在windows上了.

 

nodejs其實就是libuv的一個應用而已.

你自己寫程序也可以集成libuv進來, 這樣你的c++程序就有了消息循環了. 不再是簡單main函數了. 你可以訂閱系統的事件, 然后當事件發生時, 系統會調用你的回調函數, 就跟windows上的button click事件一樣方便. 而且是跨平台的哦. 是不是很酷.    你幾乎可以訂閱所有的系統事件,  比如socket事件, 文件讀寫事件等等.

nodejs簡單的說只是把javascript解釋成c++的回調, 並掛在libuv消息循環上, 等待處理.  這樣就實現了非阻塞的異步處理機制.

那么為什么是javascript而不是其他的語言.  很簡單, 因為javascript的閉包.  這非常適合做回調函數.  因為我們一般都希望當回調發生時, 它能記住它原來所在的上下文.  這就是閉包最好的應用場景.

這里有libuv的詳細介紹 http://nikhilm.github.io/uvbook/.

好像扯遠了,  說nodejs的, 怎么扯到libuv了.  很簡單, 因為 nodejs只是libuv的一個應用.  先了解libuv才能了解nodejs的實質和前世今生.

我們再回來說nodejs.

從另一個角度看,   上面的工作都分別由v8和libuv做了.  那么nodejs到底做了什么呢?   我們先看一下nodejs的文檔: http://nodejs.org/api/

對了,除了用javascript封裝libuv框架之外,   nodejs就是實現了這些api 功能.  這些api大部分是用javascript寫的, 也有一部分是c++寫的.

這是nodejs官方的倉庫, https://github.com/joyent  其中有很多nodejs的插件. 有了這些nodejs就可以實現非常豐富的功能了.

作為結尾, 寫一個簡單的nodejs 另類常規helloworld 程序.

//test.js

//=================

console.log("hello world!")

//=================

存成test.js.  然后運行: node test.js

就能看到效果了.

怎么樣,  看起來是不是很像python的感覺.  但是用的是javascript哦.  用這個代替python, 是不是爽死了.

就到這吧.  關於libuv, 關於nodejs插件.  等等話題, 希望能跟大家溝通交流.

歡迎大家訪問我的獨立博客: http://byNeil.com

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM