? ? ? ?用了4年多的node.js,再去閱讀《深入淺出Node.js》這本書,發(fā)現(xiàn)別有一番滋味。接下來我將用幾小篇文章重新帶大家領(lǐng)略Node.js的風采。
? ? ? ? 故事要追溯到2009年3月,28歲的美國程序猿Ryan Dahl宣布要基于V8創(chuàng)建一個輕量級的Web服務器并提供一套utils,之后他僅僅花了兩個月時間,也就是當年5月份就發(fā)布了第一個版本。?

? ? ? ?2010年年底,就拿到了硅谷云服務商Joyent的贊助,他也加入了Joyent并全職負責Node的發(fā)展。可以看得出,他是一個能力很強并且很有天賦的程序猿,通過查看Wiki發(fā)現(xiàn),他6歲的時候他媽媽就給了一臺蘋果電腦(Apple IIc,如下圖)給他,拿到電腦他不是第一時間拿來打游戲,而是拿來研究技術(shù)。因為他對技術(shù)的熱愛,后面他進入了羅切斯特大學(University of Rochester)學習數(shù)學專業(yè)。

? ? ? ?這東西為啥叫Node呢?為啥不叫什么D語言、E語言呢?起初,這個項目是叫web.js,也就是一個Web服務器,但項目的發(fā)展很給力,漸漸變成了基礎框架,大家可以在它的基礎上構(gòu)建更多的東西,例如服務器、客戶端、命令行等工具。它自身非常簡單,而且易擴展,大家可以通過統(tǒng)一的規(guī)范來構(gòu)建大型網(wǎng)絡應用。每一個Node進程都構(gòu)成這個網(wǎng)絡應用中的一個節(jié)點,這就是為什么它叫Node.js。
? ? ? ? 那Node.js有哪些特點呢?總結(jié)下來有4點,異步I/O、事件與回調(diào)函數(shù)、單線程、跨平臺。
一、異步I/O
我們知道對于Java語言,程序語句是一行行執(zhí)行的,但是對于node.js來說,底層有很多異步I/O的API,包含文件讀取(https://nodejs.org/dist/latest-v12.x/docs/api/fs.html)、網(wǎng)絡請求(https://nodejs.org/dist/latest-v12.x/docs/api/http.html)等等,每個調(diào)用之間無需等之前I/O調(diào)用結(jié)束,這樣的意義在于,我們可以從語言層面很自然地進行并行I/O操作
二、事件與回調(diào)函數(shù)
對于Node.js來說,我們處理請求,只需要關(guān)注成功和失敗的時候的業(yè)務邏輯即可,在多個異步任務的場景下,事件與事件之間各自獨立,具有輕量級、松耦合的特點。但這樣的設計對于如何協(xié)助是一個問題,它和常規(guī)的同步方法相比,變得不是那么一目了然。后期我們可以通過一些方法可以解決這個問題,比如promise、async/await。
三、單線程
Node.js保持了Javascript在瀏覽器中單線程的特點,它最大的好處是不用像多線程編程那樣處處在意狀態(tài)的同步問題,沒有死鎖的存在,也沒有線程上下文交換帶來的性能上的開銷。但它也存在一些缺點,比如無法利用多核的CPU,錯誤會引起整個應用退出、對于CPU密集型的事件需要等待計算任務完成才能重新到事件循環(huán)取事件。
四、跨平臺
起初,Node.js只能在Linux平臺上運行,后面隨著Node.js的發(fā)展,微軟幫助了它實現(xiàn)了Windows平臺的兼容,在v0.6.0的時候已經(jīng)可以在Windows上運行了。這得益于中間的這層libuv,它是一個可以在許多平臺上實現(xiàn)跨平臺的基礎組件,Node的第三方C++模塊也可以通過libuv實現(xiàn)跨平臺。
由于Node.js具有以上四個特點,那么它的應用場景有哪些呢?第一個當然是需要高性能I/O的實時應用,比如聊天工具,花瓣網(wǎng)、蘑菇街的實時通知功能就是通過socket.io來實現(xiàn)的;第二個是利用并行I/O高效利用分布式環(huán)境,比如eBay的ql.io就是借用Node并行I/O的能力,高效地利用已有的數(shù)據(jù)。第三個是利用穩(wěn)定接口提升Web渲染能力,例如LinkedIn的移動版網(wǎng)站就摒棄了同步的方式,利用并行I/O加速數(shù)據(jù)的獲取,提升Web渲染速度。
參考文獻:
1.Ryan Dahl介紹:https://en.wikipedia.org/wiki/Ryan_Dahl
2. ql.io的代碼倉庫和發(fā)布會:
https://github.com/ql-io/ql.io
https://tech.ebayinc.com/engineering/announcing-ql-io/
3.Event Loop +V8 Engine + libuv threadpool