精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Node.js真的無(wú)所不能?那些不適用的應(yīng)用領(lǐng)域分析

原創(chuàng)
開(kāi)發(fā) 前端
其實(shí)到今天為止,很少有哪些大的互聯(lián)網(wǎng)公司是和 Node.js 無(wú)關(guān)的。LinkedIn,Yahho,Paypal, eBay, Walmart 都在將既有的系統(tǒng)向 Node.js 遷移(https://www.quora.com/Node-js/What-companies-are-using-Node-js-in-production 翻墻看)。國(guó)內(nèi)的淘寶、網(wǎng)易、百度等也都有很多項(xiàng)目運(yùn)行在 Node.js 之上。

Node.js是一個(gè)服務(wù)器端JavaScript解釋器,底層采用的還是libevent;它的目標(biāo)是幫助程序員構(gòu)建高度可伸縮的應(yīng)用程序,目前對(duì)Node.js 的采用狀況,Node.js 官方站點(diǎn)有一些羅列,但是相當(dāng)不完整。如果你自己公司用到,也可以在 github 上提交自己的 pull-request 來(lái)更新這個(gè)文檔。

http://nodejs.org/industry/

https://github.com/joyent/node/wiki/Projects,-Applications,-and-Companies-Using-Node

其實(shí)到今天為止,很少有哪些大的互聯(lián)網(wǎng)公司是和 Node.js 無(wú)關(guān)的。LinkedIn,Yahho,Paypal, eBay, Walmart 都在將既有的系統(tǒng)向 Node.js 遷移(https://www.quora.com/Node-js/What-companies-are-using-Node-js-in-production 翻墻看)。國(guó)內(nèi)的淘寶、網(wǎng)易、百度等也都有很多項(xiàng)目運(yùn)行在 Node.js 之上。

2011 年我開(kāi)始接觸 Node.js 的時(shí)候,npmjs.org 上只有不到 3,000 個(gè) Node.js 的 packages,今天(2014-3-2)則有 61,897 個(gè),這個(gè)數(shù)字還在快速增長(zhǎng)中。

下面有兩個(gè)鏈接,第一個(gè)是在講 Walmart 這幾年為什么以及如何遷移到 Node.js 上;第二個(gè)則為 eBay 是如何從 Node.js 的懷疑者轉(zhuǎn)變?yōu)椴捎谜摺?/p>

《Announcing ql.io》 這篇文章的最后一段,列出了 eBay 為什么選擇 Node.js。

每天都有幾百個(gè)新的 packages 被發(fā)布到 npm 上,小到幾行代碼,大到萬(wàn)行代碼的 Framework。一天有7百萬(wàn)次的包下載(安裝到某臺(tái)電腦上),對(duì)于單一開(kāi)發(fā)框架的社區(qū)來(lái)說(shuō),用沸騰的海洋來(lái)形容并不過(guò)分。

 

以下應(yīng)用領(lǐng)域和程序員不適合選擇Node.js:

  • 計(jì)算密集型應(yīng)用。Javascript 的計(jì)算性能是很難和 C 語(yǔ)言代碼相比的。當(dāng)然,也有反例:http://onlinevillage.blogspot.jp/2011/03/is-javascript-is-faster-than-c.html,只不過(guò)不具有典型性。
  • 需要精密控制內(nèi)存的分配和釋放的場(chǎng)景,如果用 Node.js 實(shí)現(xiàn) Redis 數(shù)據(jù)庫(kù),雖然程序會(huì)簡(jiǎn)單不少,但是 JVM 對(duì)內(nèi)存數(shù)據(jù)結(jié)構(gòu)的精密控制能力是比不了用 C 語(yǔ)言純手工打造的。
  • 大量且需要頻繁通過(guò) C Binding 調(diào)用 C library 的情況。這種場(chǎng)景下,往返參數(shù)的 Marshal/Unmarshal 的成本可能會(huì)大于 C Library 帶來(lái)的性能提升。
  • 實(shí)時(shí)性要求很高的場(chǎng)景,例如:交換機(jī)或者工控機(jī)器人。這是因?yàn)樗型ㄟ^(guò)垃圾回收機(jī)制來(lái)管理內(nèi)存的系統(tǒng)都有可能在 GC 過(guò)程中產(chǎn)生停頓,從而影響響應(yīng)速度,而且很難優(yōu)化。
  • 需要單一進(jìn)程控制大內(nèi)存的場(chǎng)景:v8 引擎的設(shè)計(jì)限制,在 32-bit下有 1GB 最大堆尺寸的限制,在 64-bit下是1.7GB。當(dāng)然,由于 node.js buffer 的分配不是在 v8 的堆上,因此可以超過(guò)此限制。這個(gè)限制可以通過(guò)向 v8 引擎?zhèn)鬟fmax_old_space_size 參數(shù)來(lái)超越,但是也會(huì)帶來(lái) GC 的性能退化。這一問(wèn)題在幾乎所有 GC Based 的系統(tǒng)下都存在。
  • 不關(guān)心系統(tǒng)吞吐率或者不需要異步調(diào)用的場(chǎng)景:例如,自動(dòng)化腳本,這些腳本不需要關(guān)心多用戶并發(fā)訪問(wèn)的性能消耗。用 Python 這樣的“膠水”語(yǔ)言寫(xiě)起來(lái)會(huì)更簡(jiǎn)單。
  • 某些非通用場(chǎng)景:例如 nginx 對(duì)于靜態(tài) web server 或者 反向代理的場(chǎng)景是特別設(shè)計(jì)的,這些場(chǎng)景中 nginx 的性能比 Node.js 要好。
  • 強(qiáng)類(lèi)型強(qiáng)迫癥:有些 Java 或者 .NET 過(guò)來(lái)的程序員會(huì)認(rèn)為只有強(qiáng)類(lèi)型語(yǔ)言和嚴(yán)格定義的類(lèi)型系統(tǒng)是專(zhuān)業(yè)化的象征,構(gòu)造這樣的系統(tǒng)是架構(gòu)師的使命,而動(dòng)態(tài)語(yǔ)言只是玩具,只能用來(lái)做 Demo 或者前端開(kāi)發(fā)。
  • 團(tuán)隊(duì)成員難以理解或者接受函數(shù)式編程:Javascript 本質(zhì)上更像函數(shù)式語(yǔ)言,有些程序員在理解和使用閉包、高階函數(shù)等概念時(shí)總是不能習(xí)慣,這個(gè)問(wèn)題在國(guó)內(nèi)的開(kāi)發(fā)團(tuán)隊(duì)中還挺普遍的。
  • 回調(diào)式編程的不習(xí)慣:Node.js 的異步IO 大量依賴回調(diào)?;卣{(diào)讓程序的執(zhí)行出現(xiàn)了兩條路徑,出現(xiàn)故障時(shí)調(diào)用棧也很難理解。這對(duì)習(xí)慣了同步編程的程序員來(lái)說(shuō)一開(kāi)始確實(shí)是個(gè)坎。async, Q promise 等 package 可以緩解這個(gè)問(wèn)題(在 ES6 的Generator 普及之前),不過(guò)這也帶來(lái)了更陡峭的學(xué)習(xí)曲線。一般情況下,需要半年到一年的習(xí)慣過(guò)程,當(dāng)然前提是多看,多寫(xiě)。隨著越來(lái)越多的經(jīng)驗(yàn)分享,這個(gè)過(guò)程也在不斷地縮短。

除此之外的領(lǐng)域,或者沒(méi)有上述問(wèn)題的,都都可以享受到 Node.js 帶來(lái)的生產(chǎn)力提升和穩(wěn)定的性能保障。

性能的爭(zhēng)議

不同開(kāi)發(fā)環(huán)境間的性能對(duì)比從來(lái)都是有爭(zhēng)議的話題。我只能說(shuō),當(dāng)開(kāi)發(fā) Web 或 網(wǎng)絡(luò)環(huán)境下的應(yīng)用時(shí),Node.js 靠以下幾個(gè)方面來(lái)避免出現(xiàn)不必要的性能問(wèn)題:

  1. Chrome V8,一個(gè)可靠的優(yōu)秀的虛擬機(jī)(hidden classes 和 inline caching),讓 Javascript 的運(yùn)行速度進(jìn)入了第一陣營(yíng)(C++, Java, .NET)。
  2. 異步 IO 大大降低了線程數(shù)量,莫名其妙的死鎖和等待的概率被降低了很多。大部分場(chǎng)景不用去考慮并發(fā)和同步鎖,犯錯(cuò)誤的機(jī)會(huì)少。而在 Python 中,異步 IO 并不是標(biāo)準(zhǔn),并沒(méi)有被貫穿到所有 Package 中,因此應(yīng)用程序也就很難獲得一致的性能保障。
  3. 非常輕巧的“內(nèi)核”。Node.js 的模塊分為 Core Modules 和 Userland 兩部分。Core Modules 非常精簡(jiǎn),只包括 TCP, HTTP, DNS, File System, child processes 和其他一些模塊,這些網(wǎng)絡(luò)庫(kù)還只有異步版本。相對(duì)地,在 Userland 中卻有著海量的 Packages。開(kāi)發(fā)應(yīng)用的時(shí)候,我們根據(jù)應(yīng)用的需求來(lái)組合 Userland 的 Packages,使得我們的應(yīng)用程序有機(jī)會(huì)在一個(gè)很低的資源消耗水平下運(yùn)行(在《Announcing ql.io》中指出,一臺(tái)開(kāi)發(fā)服務(wù)器就可以支持 12 萬(wàn)活躍連接,平均每個(gè)連接消耗 2k 內(nèi)存)。事實(shí)上,我開(kāi)發(fā)的 WebSockte 應(yīng)用在 Raspberry Pi 下都可以支持幾百并發(fā)長(zhǎng)連接(WebSocket)。和那些動(dòng)輒上萬(wàn)個(gè)類(lèi)的企業(yè)開(kāi)發(fā)框架相比,這是一個(gè)巨大的優(yōu)勢(shì)。這種方式降低了出現(xiàn)問(wèn)題的概率、查找問(wèn)題的成本以及減少部署成本。

對(duì) Javascript 的絕對(duì)性能的追求一直沒(méi)有停頓(例如, Mozilla 的 asm.js )。而 Node.js 則在絕對(duì)性能的基礎(chǔ)上,確保應(yīng)用程序可以獲得穩(wěn)定和可預(yù)測(cè)的性能保障( Benchmark 和實(shí)際的應(yīng)用運(yùn)行往往是兩回事)。

Node.js繼承了JavaScript 的靈活性,優(yōu)秀的JS庫(kù)應(yīng)當(dāng)如何選擇

可以在 npmjs.org 或者 google 上搜索關(guān)鍵詞。如果類(lèi)似的返回很多,則看其被其他 package 依賴的數(shù)量有多少。上 github 上查看 starred 和 forks 的數(shù)量,讀 issues。

如果是“名人”(substack, visionmedia (TJ Holowaychuk), dominictarr, rvagg 等)寫(xiě)的 Packages 自然會(huì)被加分。

最后是把 Git Repo. Clone 或者 Fork 下來(lái), 閱讀且注釋他們的源代碼。這個(gè)過(guò)程也可以發(fā)現(xiàn)很多他們依賴的其他 Packages。這是一個(gè)蠻享受的過(guò)程,可以學(xué)到很多新知識(shí)和新的用法。

還有一些亂槍打鳥(niǎo)的方法:

  1. 在 Tweeter 上關(guān)注 @nodenpm,所有在 npm 上發(fā)布或者更新的 packages 都會(huì)在該 handle 上發(fā)布出來(lái)。在你的碎片時(shí)間沒(méi)事可以刷刷這個(gè),當(dāng)然你需要 APN 翻墻。
  2. 關(guān)注一些推薦和評(píng)論賬號(hào):@dailyjs,@echojs 等。
  3. Changelog 會(huì)提供不錯(cuò)的開(kāi)源信息匯總,其中包括 Node.js、Javascript 和 npm 欄目。
  4. Hacker News 則不會(huì)讓你忽略軟件行業(yè)的一些“大事”或者新概念。

一個(gè)項(xiàng)目開(kāi)始前的研究階段,我大約會(huì)瀏覽幾十個(gè) Packages,精讀其中的5 ~ 10個(gè)。開(kāi)發(fā)過(guò)程中則根據(jù)需要還會(huì)不斷地發(fā)現(xiàn)和精讀一些,這些都被我計(jì)入了項(xiàng)目的成本。

"自由選擇,自己負(fù)責(zé)",在這個(gè)龐大的開(kāi)發(fā)社區(qū)了不要指望有人能告訴你“標(biāo)準(zhǔn)答案”。每個(gè)人面臨的問(wèn)題域和知識(shí)背景都不一樣,堅(jiān)持多看,多試,多思考,享受獲得新知識(shí)的過(guò)程比獲得“標(biāo)準(zhǔn)答案”更重要。

在眾多的成熟開(kāi)發(fā)框架下為什么需要Node.js

在每一個(gè)特定的問(wèn)題域,大家總是在嘗試找到最優(yōu)解。這個(gè)過(guò)程是沒(méi)有終結(jié)的,就想最終也會(huì)有其他框架代替 Node.js 一樣。

今天的 Web,是無(wú)數(shù)相互連接的 Web Services 組成的,這些連接的本質(zhì)是異步的。Node.js 天生異步的特性和這個(gè)場(chǎng)景的匹配度相對(duì)其他開(kāi)發(fā)框架要更高,因此實(shí)現(xiàn)起來(lái)也更自然。

除此之外,Node.js 的設(shè)計(jì)基本原則遵循了 《Unix 的編程藝術(shù)》,參見(jiàn) Isaac Z. Schlueter (前任 Node.js 的Gatekeeper,目前負(fù)責(zé) npm 的商業(yè)化) 的Blog: Unix Philosophy and Node.js。

npm 和 stream 就是上述哲學(xué)的產(chǎn)物。

npm

npm 是 Node.js 的包管理系統(tǒng)。包管理系統(tǒng)不是新東西,但是和 npm 的那些前輩和表兄弟不同的是:

  1. npm 直接集成在 Node.js 中,無(wú)需單獨(dú)安裝,發(fā)布,安裝 packages 非常簡(jiǎn)單。
  2. npmjs.org 提供一個(gè)統(tǒng)一的入口,你可以看到每個(gè) package 被哪些 packages 所依賴,你也可以一目了然地看到它依賴了誰(shuí),以及最近的下載次數(shù)。結(jié)合到 github 上的更新情況,基本上對(duì)一個(gè) package 的基本情況你都能了解到。
  3. 約定俗成的發(fā)布規(guī)范:一個(gè) git repo. 讓你可以直接找到源代碼;README.md 提供簡(jiǎn)要的說(shuō)明讓消費(fèi)者能盡快用起來(lái)。

對(duì)于開(kāi)發(fā)者來(lái)說(shuō),每一個(gè) package 就是一個(gè) "micro service",是最小重用單元。大部分的 package 只有幾百行代碼,甚至有些只有幾行代碼。這樣的重用粒度是在其他社區(qū)難以想象的。

在 Node.js 的應(yīng)用的開(kāi)發(fā)過(guò)程中,編寫(xiě) “一口尺寸”(bite-size)的 module 是推薦的編程方式。這也很方便你把這些小 module 封裝為 package 分享到社區(qū)當(dāng)中,而不用擔(dān)心泄露“企業(yè)機(jī)密”。

npm 是每一個(gè) Noder 的 "home",也是每一個(gè) Node.js 應(yīng)用的系統(tǒng)架構(gòu)的一部分。

#p#

Stream

如果說(shuō),npm 提供了“開(kāi)發(fā)時(shí)重用”的機(jī)制,那么 stream 的則提供了“運(yùn)行時(shí)”不同組件之間的“重用”機(jī)制。stream 概念和 unix 中的 stream 對(duì)應(yīng),應(yīng)用中的每一個(gè) component 則對(duì)應(yīng) unix 的 filter。下面舉一個(gè)實(shí)際的例子:

在某個(gè)應(yīng)用中,我需要一個(gè) API Server,它的客戶端包括 Web Browser,iOS App., 以及網(wǎng)絡(luò)中的其他 Server。Web Browser 和我們的 API Server 的通信基于 SockJS(當(dāng)然你也可以選擇 SocketIO,或者 Faye 等),它為瀏覽器兼容提供了適當(dāng)?shù)?“Fallback” 方案;對(duì)于 iOS App.來(lái)說(shuō),由于不需要考慮瀏覽器兼容,則采用基于標(biāo)準(zhǔn)的 RFC 6455 的純 WebSocket 通信協(xié)議,這樣實(shí)現(xiàn)起來(lái)更簡(jiǎn)單;而對(duì)于其他 Server 來(lái)說(shuō),局域網(wǎng)內(nèi)則用 TCP,互聯(lián)網(wǎng)上則用 TLS 來(lái)保證傳輸安全。

我在 Node.js 上是這么實(shí)現(xiàn)的:

  • 利用 donde 構(gòu)建一個(gè)通信無(wú)關(guān)的 RPC Server 來(lái)提供 API 服務(wù)。
  • 用 Node.js Core Modules 中的 tcp, tls 創(chuàng)建 TCP/TLS Server 并監(jiān)聽(tīng),用第三方的 SockJS 和 websocket-stream 分別創(chuàng)建 SockJS 和 WebSocket 的 Server 并監(jiān)聽(tīng)。
  • 當(dāng) Client 連接到不同的端口,在 Server 上就會(huì)創(chuàng)建基于該協(xié)議的 Commnucation Stream,然后創(chuàng)建一個(gè)新的 dnode 實(shí)例,得到一個(gè) dnode 的 Stream。最后將 Commnucation Stream 和 dnode Stream 像接水管一樣接到一起即可。
  1. net.createServer(function(connStream){  
  2.     dnodeStream = dnode({ func1: function(){} });  
  3.     connStream.pipe(dnodeStream).pipe connStream;  
  4. });  

考慮到在不穩(wěn)定的網(wǎng)絡(luò)環(huán)境下的自動(dòng)重連需求,也可以添加 reconnect。

不算你自己 RPC API 的實(shí)現(xiàn)邏輯,支持這么多的通信協(xié)議的 Server 框架只需要百十行代碼,還加上了一定程度的異常處理。

tcp, tls, SockJS,或者 reconnect 的開(kāi)發(fā)者并不能確定“消費(fèi)者”是如何使用這些 Package 的,但是大家都支持 Stream 的接口,則讓自己的 Package 能夠被運(yùn)用到更多的場(chǎng)景。

進(jìn)一步,我們也可以多路復(fù)用一個(gè)底層的 Stream。我們把上面的例子再擴(kuò)展一下:

在既有的通信連接上(connStream),除了提供 RPC API 之外,還需要添加分布式的狀態(tài)同步功能,例如:通過(guò) Scuttlebutt,完成 Client 與 Server 或 Server 與 Server 之間的常量數(shù)據(jù)自動(dòng)同步,而不用為這些功能設(shè)計(jì)新的 RPC API。通過(guò) mux-demux ,可以復(fù)用既有的網(wǎng)絡(luò)通信 Stream(tcp, SockJS, Web Socket...),避免建立不必要的網(wǎng)絡(luò)連接。

Stream 是 Node.js 的核心概念之一,其接口和工作方式被廣泛地采用,為不同組件在運(yùn)行時(shí)相互通信提供了最基本的支持。

在 Node.js 中,如何使用 Stream 可以用一本書(shū)的容量來(lái)描述,不是因?yàn)?Stream 的概念有多復(fù)雜,而是因?yàn)槠浣M合方式非常豐富。

小結(jié)

三年前接觸 Node.js,并且學(xué)習(xí)和采用,主要原因是因?yàn)?Node.js 在解決當(dāng)今網(wǎng)絡(luò)應(yīng)用的問(wèn)題時(shí),提供了高性能、高可靠和低功耗的方法。高性能、高可靠和低功耗,不是在于 Node.js 做了什么,而是在于 Node.js 不做什么。Node.js 和 Javascript 的概念,在 Java 或者其他開(kāi)發(fā)框架中都能找到對(duì)應(yīng)的概念。但是 Node.js 僅保留了它認(rèn)為最重要的部分作為 Core Modules,其他都讓給了 User Land,這才是高性能、高可靠和低功耗的最本質(zhì)的保障。

隨著 Node.js 這三年的發(fā)展,今天使我浸淫其中的理由已經(jīng)不是之前的那些特點(diǎn)了。

npm 建立了一個(gè)“人人為我,我為人人”社區(qū),無(wú)論你是一個(gè)入門(mén)級(jí)的 Noder,還是一個(gè)多年的老兵,都在自覺(jué)或不自覺(jué)地從這個(gè)社區(qū)吸取營(yíng)養(yǎng),也在不斷地回饋社區(qū)。在使用 npm 的過(guò)程中,你會(huì)很自然地發(fā)現(xiàn),將自己的應(yīng)用切割為盡量小的 Modules,發(fā)布為公有的 Packages,配上一個(gè)簡(jiǎn)單扼要的 README.md,反而是最有效率的系統(tǒng)架構(gòu)方式。

Node.js 所遵循的 Unix 設(shè)計(jì)哲學(xué),又提供了最簡(jiǎn)單有效的復(fù)用規(guī)范。簡(jiǎn)單有效,才會(huì)被大家自覺(jué)采用,采用得越多,重用的可能性就更大。以Express 4.0 ( MEAN 架構(gòu)中的那個(gè) 'E' )為例,這么一個(gè)流行的 MVC Web Framework的核心代碼只有 2,600 多行(不算測(cè)試,中間件和例子,但是包括注釋?zhuān)?/p>

npm 和 github 一起,為今天的軟件生產(chǎn)提供了新的生產(chǎn)關(guān)系,這也是當(dāng)前 Node.js 超越其他社區(qū)的根本原因。不是單純的性能,也不僅僅是因?yàn)閯?dòng)態(tài)語(yǔ)言,甚至不是因?yàn)榇罅渴煜?Javascript 的前端程序員(和后端程序員相比,由于缺少系統(tǒng)性的思維,前端 Javascript 程序員掌握 Node.js 未必有多少優(yōu)勢(shì) ),而是以更加便捷的分享式開(kāi)發(fā)為基礎(chǔ)的生產(chǎn)關(guān)系實(shí)實(shí)在在地提升了軟件生產(chǎn)力。

 

 

Node.js的駕馭能力

如果“復(fù)雜的后端程序” 等于 “龐大的繼承樹(shù)”,“強(qiáng)類(lèi)型安全”,“精細(xì)的異常定義和處理”,那么 Node.js 當(dāng)然無(wú)法駕馭。因?yàn)?Node.js 和 Java, .NET 相比,是一顆獨(dú)立的“科技樹(shù)”。原型繼承、函數(shù)式編程、模塊系統(tǒng)、回調(diào)...,這些概念和編程方式對(duì)習(xí)慣了 Java 以及 .NET 的程序員來(lái)說(shuō)不僅僅是不熟悉,甚至一開(kāi)始會(huì)產(chǎn)生“不舒服的”感覺(jué)。

從我的體驗(yàn)來(lái)看(Basic->C->VB->Delphi->.NET->Node.js),這種不舒服更多地來(lái)自于之前對(duì)嚴(yán)謹(jǐn)?shù)念?lèi)型系統(tǒng)的信仰。原本所謂的“架構(gòu)師”,承擔(dān)著整個(gè)應(yīng)用或項(xiàng)目的類(lèi)型系統(tǒng)的建設(shè)任務(wù),對(duì)任何破壞類(lèi)型一致性的行為都會(huì)自然而然的產(chǎn)生抵觸情緒。要想掌握 Node.js,最好的方法是先從 Java, .NET 這顆“科技樹(shù)”上爬下來(lái),清空自己,然后重新爬 Node.js 這棵樹(shù)。

程序員從 Java, .NET 可以學(xué)到面向?qū)ο蠛头盒瓦@些重用手段,而在 Node.js 的世界中,當(dāng)你接觸到大量來(lái)自于完全不同背景的程序員所編寫(xiě)的 Packages 的時(shí)候,你也會(huì)意識(shí)到,不是每樣?xùn)|西都是“類(lèi)”,重用也不一定都基于繼承。雖然有人試圖在 Node.js 中克隆之前自己熟悉的類(lèi)型系統(tǒng),但是更多的程序員則在不斷嘗試更優(yōu)雅、簡(jiǎn)單的編寫(xiě)方式。在 Node.js 的開(kāi)發(fā)過(guò)程中,沒(méi)有所謂的“最佳實(shí)踐”,類(lèi)似的問(wèn)題總會(huì)有人嘗試不同的解決方法。對(duì)于一個(gè)勤于思考和反思的程序員,這是一個(gè)充滿樂(lè)趣的過(guò)程。反之,如果你的團(tuán)隊(duì)是由缺少獨(dú)立思考或者獨(dú)立解決問(wèn)題的程序員組成的,那么 Node.js 確實(shí)不適合。你需要用強(qiáng)類(lèi)型語(yǔ)言搭好一個(gè)受限的框架,然后讓體力型的隊(duì)友去填空。

我們公司只有兩個(gè)程序員,一個(gè)負(fù)責(zé) iOS 開(kāi)發(fā),而我負(fù)責(zé)“復(fù)雜”后端程序和 Web Browser 開(kāi)發(fā)。如果用 Java 或者 .NET 來(lái)開(kāi)發(fā),完成同樣的功能需要至少三倍以上的人力。

Node.js能否統(tǒng)一前后端

完全統(tǒng)一既不可能,也沒(méi)必要。再說(shuō)這個(gè)所謂的“統(tǒng)一”與其放到 Node.js 腦袋上,不如送給 Javascript,因?yàn)?Javascript 用到的場(chǎng)景太多了。讓我們看幾個(gè)事實(shí):

  1. Node.js 讓我們可以用 Javascript 寫(xiě)后臺(tái)程序
  2. Node.js 讓我們寫(xiě) Web Browser 前端:一方面,可以通過(guò) Grunt 或者其他持續(xù)集成工具生成可發(fā)布的前端靜態(tài)網(wǎng)站內(nèi)容(例如: Bootstrap); 另一方面,也可以通過(guò) Browserify 在前端代碼中使用 Node.js 的 Modules,讓前后臺(tái)代碼使用統(tǒng)一的代碼基(例如:domready。很多 Node.js 的 Modules 本身就經(jīng)過(guò)了瀏覽器兼容測(cè)試,可以同時(shí)運(yùn)行在兩端)。
  3. 用 Node.js 開(kāi)發(fā)桌面應(yīng)用,例如:https://github.com/rogerwang/node-webkit/wiki/List-of-apps-and-companies-using-node-webkit,列出了基于 node-webkit 的桌面應(yīng)用列表。
  4. 即使在性能受限的移動(dòng)設(shè)備中,我們也可以通過(guò) Javascript Binding 將一部分應(yīng)用邏輯用 Javascript 來(lái)實(shí)現(xiàn),而 UI 的渲染還是 Native 的方式。這在很多游戲中已經(jīng)被采用(http://www.zhihu.com/question/21130385)。只要用到 Javascript,或者說(shuō),隨著 Javascript 代碼基的擴(kuò)大,npm based 的包管理方式就會(huì)通過(guò) Browserify 的方式被慢慢引入。

除了第二個(gè)問(wèn)題提到的那些不適合 Node.js 的地方,其他領(lǐng)域想徹底不碰 Node.js 是很難的。

 

Node.js發(fā)展方向

如果你的老板不讓你碰 Node.js,你需要讓他支付青春損失費(fèi)。開(kāi)個(gè)玩笑:)

投資在 Node.js 不會(huì)吃虧。

基于 Browserify 的貢獻(xiàn),前后臺(tái)一致的代碼基正在成為現(xiàn)實(shí)(在我的一個(gè)項(xiàng)目中已經(jīng)如此,Web Client 通過(guò) Node.js 的 stream 和后端傳遞數(shù)據(jù) )。你可以看到在前端使用原本為后臺(tái)寫(xiě)的Module,或者用寫(xiě)后端程序的方法寫(xiě)前端代碼,例如:domready。瀏覽器中無(wú)需運(yùn)行一個(gè)完整的 Node.js,只要打包好需要的 Modules 下載到瀏覽器執(zhí)行即可。

在問(wèn)題 5 中,大家已經(jīng)看到 Node.js 在分布式計(jì)算領(lǐng)域的應(yīng)用能力。 在問(wèn)題 8 中,大家可以看到 Node.js 在客戶端開(kāi)發(fā)中所扮演的角色。

傳統(tǒng)的數(shù)據(jù)庫(kù)這一領(lǐng)域也在發(fā)生變化。通用的數(shù)據(jù)庫(kù)系統(tǒng)在未來(lái)會(huì)慢慢“失寵”,“樂(lè)高積木”化的存儲(chǔ)服務(wù)會(huì)流行起來(lái)。Hackers 們圍繞著 LevelUp構(gòu)建自己的存儲(chǔ)引擎,從 key/value,到Graph DB;從基于 B 樹(shù)的一維索引到基于 R-Tree 的多維索引;從能夠在瀏覽器中運(yùn)行的嵌入數(shù)據(jù)庫(kù)到支持成千上萬(wàn)訪問(wèn)者,高可用的數(shù)據(jù)庫(kù)系統(tǒng);從支持兩階段提交的 Transaction 到,到支持實(shí)時(shí)增量的 Map-Reduce。在我的一個(gè)項(xiàng)目中已經(jīng)開(kāi)始采用這種方法,為特定的存儲(chǔ)和查詢需求構(gòu)建特定的存儲(chǔ)服務(wù)。這在以前是不可想象的,但是現(xiàn)在,也就是一個(gè)程序員的工作吧。

我是一個(gè)自己寫(xiě)程序的“產(chǎn)品經(jīng)理”。每年有8個(gè)月是集中開(kāi)發(fā)的時(shí)間,剩下的時(shí)間則是負(fù)責(zé)產(chǎn)品設(shè)計(jì)。關(guān)注的方向從 Web、Mobile App. 到后端系統(tǒng)。Node.js 給我提供了無(wú)數(shù)塊“樂(lè)高積木”,讓我可以拼裝自己的玩具,這是很快樂(lè)的體驗(yàn)的過(guò)程。遺憾的就是時(shí)間不夠多,有那么多東西沒(méi)時(shí)間去了解,去體會(huì)其他人的奇思妙想。小公司也是對(duì)成本極度敏感的,如果沒(méi)有 Node.js 很多東西連想都不敢想。

責(zé)任編輯:林師授 來(lái)源: 51cto.com
相關(guān)推薦

2014-03-31 10:49:47

IT技術(shù)周刊

2014-04-08 18:08:17

開(kāi)發(fā)技術(shù)周刊

2020-07-31 13:35:34

Node.js應(yīng)用分析前端

2021-04-07 10:02:18

人工智能技術(shù)互聯(lián)網(wǎng)

2013-05-22 14:05:18

2009-07-06 18:43:13

VB指針

2019-12-19 14:17:11

以太坊去中心化加密貨幣

2015-04-30 14:53:43

Build 2015微軟Azure

2025-02-17 00:00:25

CSS工具樣式

2017-03-20 13:43:51

Node.js內(nèi)存泄漏

2017-03-19 16:40:28

漏洞Node.js內(nèi)存泄漏

2017-11-27 11:59:40

Node.JSChrome調(diào)試程序

2023-11-28 12:09:43

Linux網(wǎng)絡(luò)工具

2022-01-07 08:00:00

Node.js開(kāi)發(fā)Web

2020-01-03 16:04:10

Node.js內(nèi)存泄漏

2021-08-16 10:13:26

AI DeepMind人工智能

2021-04-17 23:05:29

手機(jī)黑科技APP

2011-11-10 11:08:34

Node.js

2021-12-01 00:05:03

Js應(yīng)用Ebpf

2009-11-24 14:06:46

PHP應(yīng)用領(lǐng)域
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产日韩成人精品| 日韩中文欧美| 午夜精品久久久久久久久久 | 欧美日韩三级在线观看| 欧美高清hd| 欧美视频在线观看免费| 婷婷四房综合激情五月| 国产情侣自拍小视频| 99精品福利视频| 亚洲欧美自拍一区| 一级做a爱视频| 鲁鲁在线中文| 国产精品高清亚洲| 国内不卡一区二区三区| 中国黄色一级视频| 黑人一区二区| 日韩中文字幕免费看| 中文字幕在线永久| 日韩大陆av| 欧美日韩另类在线| 蜜臀av.com| 大地资源中文在线观看免费版| 激情综合色综合久久| 国产91精品久久久久久久| 午夜成人亚洲理伦片在线观看| 大奶在线精品| 欧美撒尿777hd撒尿| 国产av人人夜夜澡人人爽麻豆| 国产二区视频在线观看| 成人精品gif动图一区| 国产精品中文字幕久久久| 国产情侣在线视频| 亚洲一区在线| 这里只有精品丝袜| 久久精品国产亚洲av麻豆| 亚洲一二三区视频| 欧美三区在线视频| 日韩a在线播放| 亚洲91av| **性色生活片久久毛片| 青青影院一区二区三区四区| 黄色美女一级片| 极品尤物av久久免费看| 国产成人综合久久| 圆产精品久久久久久久久久久| 久久精品国内一区二区三区水蜜桃| 亚洲精品日韩欧美| 国产美女视频免费观看下载软件| 国产一区2区在线观看| 欧美色综合影院| 国产一区亚洲二区三区| 2018av在线| 亚洲综合色在线| 特级黄色录像片| 老司机福利在线视频| 国产精品你懂的在线| 欧美最大成人综合网| 日本1级在线| 91婷婷韩国欧美一区二区| 国产精品一区二区三区免费观看| 国产成人三级在线播放| 国产麻豆欧美日韩一区| 91精品在线国产| 亚洲一区二区天堂| 免费看欧美女人艹b| 国产精品久久999| 国产成人无码专区| 日日摸夜夜添夜夜添精品视频| 国产z一区二区三区| 免费无码国产精品| 久色成人在线| 国产精品午夜一区二区欲梦| 亚洲无码久久久久久久| 蜜臀av亚洲一区中文字幕| 国产专区欧美专区| av免费在线不卡| 国产不卡在线视频| 九色91国产| 你懂的视频在线观看| 国产欧美日韩中文久久| 一区二区三区三区在线| 国产色在线观看| 一片黄亚洲嫩模| 九九爱精品视频| japanese23hdxxxx日韩| 欧美日韩你懂的| 亚洲精品在线网址| 国产毛片久久久| 亚洲乱码国产乱码精品精| 国产调教在线观看| 综合天堂av久久久久久久| 久久久久久久成人| 91精品国产综合久久久蜜臀九色| 日韩精品高清不卡| 成人在线精品视频| 色一情一乱一区二区三区| 26uuu精品一区二区三区四区在线| 日本成人黄色| 91蜜桃在线视频| 欧美午夜精品久久久久久人妖| 精品日韩久久久| 日韩精品一区二区三区免费视频| 精品福利二区三区| 韩国三级hd中文字幕| 小处雏高清一区二区三区| 久久久免费精品视频| 中文字幕在线播| 国模无码大尺度一区二区三区 | 精品国产影院| 日韩最新在线视频| 国产精品久久久久久99| 久久精品国产77777蜜臀| 99国产在线| 国内在线精品| 1024成人网色www| 国产中文字幕免费观看| 精品一区二区三区中文字幕在线 | 午夜精品视频在线观看| wwwwxxxx日韩| 国产精品男女| 久久精品在线播放| 激情视频网站在线观看| 国产精品乡下勾搭老头1| 色视频一区二区三区| 动漫一区二区| 欧美日韩国产另类一区| 一出一进一爽一粗一大视频| 伊人情人综合网| 国产精品高精视频免费| 天天操天天射天天舔| 亚洲日本va在线观看| 午夜dv内射一区二区| 久久精品福利| 欧美精品做受xxx性少妇| 怡春院在线视频| 久久久久国产精品免费免费搜索| 国产一区二区片| 日韩毛片网站| 国产一区二区三区在线观看视频 | 国产欧美va欧美va香蕉在线| 日色在线视频| 午夜视频一区二区三区| 一区二区在线免费观看视频| 日韩av二区| 国产精品wwwwww| 中文字幕有码视频| 国产丝袜美腿一区二区三区| heyzo国产| 欧美成a人免费观看久久| 欧美日韩国产第一页| 91精品国自产| 国产精品久久久久久福利一牛影视 | 欧美艳星介绍134位艳星| 欧美亚洲另类在线| 无码精品在线观看| 亚洲aaa精品| 奇米777第四色| 99日韩精品| 久久福利电影| 成人av免费电影网站| 亚洲精品视频网上网址在线观看| 欧美激情亚洲综合| 91亚洲精华国产精华精华液| 5月婷婷6月丁香| 丝袜连裤袜欧美激情日韩| 91精品国产91久久| 免费在线黄色电影| 在线观看av一区二区| 日本一二三不卡视频| 久久精品久久综合| 国产大尺度在线观看| 一区二区三区视频播放| 孩xxxx性bbbb欧美| 免费在线看v| 欧美日韩激情一区二区| 午夜爽爽爽男女免费观看| 国产精品白丝av| 久久久久99精品成人片| 国产美女撒尿一区二区| 欧美综合一区第一页| 国产在线视频网站| 欧美区一区二区三区| 久久久久久国产精品视频| 99久久综合狠狠综合久久| 久久国产色av免费观看| 天天做天天爱天天爽综合网| av观看久久| 最新欧美色图| 日韩中文字幕在线| 好吊视频一区二区三区| 91精品1区2区| 黄色a级片在线观看| 成人动漫av在线| 人妻丰满熟妇av无码区app| 91亚洲一区| 国产三区精品| 国产极品久久久久久久久波多结野| 久久国产精品影片| 天堂中文字幕在线| 7777精品伊人久久久大香线蕉最新版 | 久久成人精品一区二区三区| 免费激情视频网站| 欧美性猛交一区二区三区精品| 中文字幕在线2021| 久久欧美中文字幕| 性生活一级大片| 久久高清免费观看| 欧美人与动牲交xxxxbbbb| 欧美极品在线观看| 97自拍视频| 韩国精品主播一区二区在线观看 | 视频一区二区三区免费观看| 911精品国产| 国产九九精品视频| 中文字幕人成乱码在线观看| 久久国产天堂福利天堂| 国内精品一区视频| 亚洲第一免费播放区| 国产乱码久久久| 欧美亚洲动漫制服丝袜| 亚州国产精品视频| 亚洲人成精品久久久久久| 国产又粗又猛又爽视频| 国产mv日韩mv欧美| 欧美激情国内自拍| 日韩精品高清不卡| 国产精品50p| 亚洲一级电影| 无码人妻精品一区二区三区99v| 免费毛片在线不卡| 国产欧美日韩综合一区在线观看 | 亚洲激情黄色| 99精品视频网站| 日韩精品第一区| 欧美三级网色| 性欧美xxxx免费岛国不卡电影| 91久久精品一区二区别| 96sao精品免费视频观看| 国产成人一区二区在线| 天堂av在线网| 57pao精品| 草草在线观看| 98精品国产自产在线观看| 国产网红在线观看| 欧美激情在线视频二区| 香蕉久久aⅴ一区二区三区| 日韩小视频在线观看| 成人在线观看网站| 亚洲午夜未满十八勿入免费观看全集 | 国产美女高潮在线| 国产69精品久久久久9| 欧美激情成人动漫| 欧美日韩xxx| 日本一本在线免费福利| 欧美精品在线第一页| 色呦呦在线观看视频| 九九久久国产精品| 欧美videosex性极品hd| 欧美大片第1页| 伊人精品影院| 欧美激情视频一区| h片视频在线观看| 77777少妇光屁股久久一区| 国产传媒av在线| 51午夜精品视频| 国产日韩另类视频一区| 国产精品嫩草影院久久久| 成人免费视频观看| 成人免费看黄网站| 亚洲欧洲国产精品一区| 国产精品三区www17con| 国产图片一区| 欧美日韩在线播放一区二区| 国产欧美日韩视频在线| 先锋影音一区二区三区| 天天色综合色| 夜夜添无码一区二区三区| 老鸭窝毛片一区二区三区| 亚洲综合色在线观看| 国产一区三区三区| 尤物网站在线观看| 国产日本亚洲高清| www色aa色aawww| 图片区小说区区亚洲影院| 欧美国产成人精品一区二区三区 | 国产精品亚洲lv粉色| 日韩视频免费观看高清完整版| 粉嫩av一区二区夜夜嗨| 亚洲精品天天看| 视频一区二区三区不卡| 欧美精品videosex牲欧美| 国产精品专区免费| 亚洲精品欧美一区二区三区| 欧美顶级毛片在线播放| 杨幂一区欧美专区| 在线精品在线| 黄色片在线免费| 国产精品亚洲综合一区在线观看| 国产特黄级aaaaa片免| 亚洲欧美偷拍三级| 性无码专区无码| 91麻豆精品国产| 欧美新色视频| 九九久久国产精品| 国产极品久久久久久久久波多结野| 91丨九色丨国产| 激情婷婷综合| 国产www免费| 免费视频一区二区| 中国一级特黄录像播放 | 久久av高潮av无码av喷吹| 色综合久久天天综合网| 国产成人精品免费看视频| 国产一区二区三区视频免费| av免费不卡国产观看| 国产自摸综合网| 国产成人黄色| 国产精品12345| 国产乱人伦精品一区二区在线观看| mm131丰满少妇人体欣赏图| 亚洲成人黄色影院| 国产成人av免费看| 亚洲最新中文字幕| 擼擼色在线看观看免费| 成人av免费电影| 91久久夜色精品国产按摩| 免费在线观看日韩视频| 成人激情免费网站| 欧美日韩在线视频免费播放| 欧美三级日韩三级| 黄色免费在线播放| 98精品在线视频| 成人av激情人伦小说| 特级西西444| 国产一区不卡在线| 国产精品69久久久久孕妇欧美| 色婷婷综合久久| 你懂的免费在线观看| 97精品国产97久久久久久春色| 亚洲精品福利| 黄色录像特级片| 精品一区二区在线免费观看| 97在线观看免费视频| 一本大道久久a久久综合婷婷| 四虎影院在线域名免费观看| 韩国视频理论视频久久| 7m精品国产导航在线| 国产一区二区三区小说| 粉嫩绯色av一区二区在线观看| 中文字幕av久久爽av| 欧美久久一二区| 黄色网在线免费观看| 亚洲999一在线观看www| 亚洲天堂免费| 下面一进一出好爽视频| 亚洲精品国产无套在线观| www.五月天激情| 欧美激情乱人伦一区| 久久久久久毛片免费看| 国产3p露脸普通话对白| 26uuu国产电影一区二区| 波多野结衣视频网站| 亚洲男人的天堂在线播放| 三上悠亚国产精品一区二区三区| 日韩视频专区| 久久精品国产99国产| 欧美日韩免费一区二区| 亚洲成人网在线| 最新中文字幕在线播放| 色一情一乱一伦一区二区三欧美| 久久成人麻豆午夜电影| 日本高清不卡免费| 欧美成人精品3d动漫h| 182在线视频观看| 免费亚洲一区二区| 奇米精品一区二区三区在线观看 | 在线精品国产| 国产吃瓜黑料一区二区| 精品福利在线观看| 国产一二三在线观看| 成人做爰www免费看视频网站| 牛牛国产精品| 日本免费福利视频| 欧美日韩免费观看一区二区三区| 精品孕妇一区二区三区| 成人激情直播| 久久xxxx| 成人涩涩小片视频日本| 亚洲级视频在线观看免费1级| 91精品影视| 黄色一级片黄色| 国产色产综合色产在线视频| 国产精品无码在线播放| 国产91精品高潮白浆喷水| 亚洲精品小说| 一级片手机在线观看| 日韩欧美一区二区久久婷婷| 亚洲天堂资源| 男人添女人下部视频免费| 久久精品亚洲乱码伦伦中文|