<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Node.js是什么?能做什么?終于有人講明白了

          共 10274字,需瀏覽 21分鐘

           ·

          2022-08-26 14:40

          導(dǎo)讀:本文我們來(lái)認(rèn)識(shí)一下Node.js,了解它能幫助我們完成哪些工作。


          作者:史文強(qiáng)
          來(lái)源:大數(shù)據(jù)DT(ID:hzdashuju)

          在JavaScript語(yǔ)言努力擺脫“玩具語(yǔ)言”這個(gè)標(biāo)簽的進(jìn)化歷程中,Node.js絕對(duì)能記下濃墨重彩的一筆。Node.js并不是一個(gè)用于實(shí)現(xiàn)具體功能的第三方工具庫(kù),而是JavaScript程序的運(yùn)行環(huán)境。

          在Node.js出現(xiàn)之前,使用JavaScript語(yǔ)言編寫的腳本需要在網(wǎng)頁(yè)中被<script>標(biāo)簽引用后才能執(zhí)行,這就使得前端開發(fā)人員編寫的程序無(wú)論怎么看都像是界面的一種附屬品。而Node.js的出現(xiàn)打破了這個(gè)枷鎖,它提供的運(yùn)行時(shí)能夠讓JavaScript程序在桌面、命令行終端、手機(jī)、平板電腦甚至嵌入式系統(tǒng)上運(yùn)行,這不僅極大地豐富了JavaScript的應(yīng)用場(chǎng)景,也為后來(lái)的前端工程化發(fā)展和中間層架構(gòu)模型的興起奠定了基礎(chǔ)。

          十多年的技術(shù)沉淀和演進(jìn)使得Node.js早已經(jīng)不再是一項(xiàng)擴(kuò)展閱讀范疇的新興技術(shù),而是前端開發(fā)人員必須掌握的技能,那句“不懂Node的前端是不完整的”也早已不再是一句玩笑話。

          Node.js的出現(xiàn)使得前端開發(fā)人員可以不必切換語(yǔ)言就能完成客戶端和服務(wù)端的開發(fā),了解它的人往往對(duì)它愛不釋手,而不了解它的人則常會(huì)把它看作前端工程師自?shī)首詷返耐婢撸J(rèn)為Node.js能做到的事情Java都能做而且更加成熟。那么Node.js到底能做什么,又適合做什么呢?


          01 Node.js是什么

          Node.js是一個(gè)基于Chrome V8引擎的JavaScript運(yùn)行環(huán)境。Node.js使用了一個(gè)事件驅(qū)動(dòng)的、非阻塞式I/O的模型,輕量又高效,它的底層是用C/C++編寫的。這是Node.js的官方描述,對(duì)前端開發(fā)人員來(lái)說(shuō),想要搞清楚其中所包含的“引擎”“運(yùn)行環(huán)境”“事件驅(qū)動(dòng)”以及“非阻塞I/O模型”到底是什么意思,并不是一件容易的事情。

          那么Node.js到底是什么?我們先用一個(gè)類比的示例來(lái)進(jìn)行解釋。比如,有人向你發(fā)送了一個(gè)擴(kuò)展名為docx的文檔,你想要查看其中的內(nèi)容,于是打開記事本,把該文檔拖到記事本的窗口里,然后就看到了一大堆亂碼。這是因?yàn)橛浭卤境绦虿⒉荒茏R(shí)別這種格式的文檔,你需要先安裝Microsoft Office 2007以上版本的軟件,然后用Word程序打開,這樣才能看到正確解碼的內(nèi)容。

          如果把示例中的docx文件看作程序,那么Word就是它的運(yùn)行環(huán)境,這就像JavaScript程序與瀏覽器的關(guān)系一樣。如果你了解過(guò)現(xiàn)代瀏覽器的結(jié)構(gòu),就會(huì)知道其中包含了JavaScript引擎。

          以前,想要查看docx文件的內(nèi)容,幾乎只能依賴于Microsoft Office,后來(lái)金山公司也推出了辦公軟件工具WPS Office,它也能夠解釋和運(yùn)行docx文件,于是docx文件就有了多個(gè)可運(yùn)行環(huán)境,而Node.js對(duì)于JavaScript語(yǔ)言的意義也是如此。

          為了更加直觀地理解運(yùn)行時(shí)的概念,你可以嘗試一個(gè)有趣的實(shí)驗(yàn),自己創(chuàng)造一種簡(jiǎn)單的編程語(yǔ)言,規(guī)定一些簡(jiǎn)易的語(yǔ)法,然后使用JavaScript來(lái)編寫能夠解釋這些語(yǔ)法的代碼。

          例如,用自創(chuàng)的語(yǔ)言編寫一些簡(jiǎn)單的程序,最后通過(guò)Node.js運(yùn)行JavaScript程序,并在程序中用Node.js提供的文件讀寫接口(File API)讀入你用自創(chuàng)的編程語(yǔ)言編寫的程序,看看它能否被正確地解釋和執(zhí)行。待你了解了JavaScript是如何完成對(duì)自創(chuàng)編程語(yǔ)言的解釋和執(zhí)行的,自然就能明白在Node.js運(yùn)行環(huán)境中,C/C++對(duì)JavaScript腳本做了什么事情。

          當(dāng)然,真實(shí)的代碼解釋執(zhí)行過(guò)程要復(fù)雜得多,很多關(guān)鍵的思想和技術(shù)也被應(yīng)用在前端框架的設(shè)計(jì)中,這些可以在今后的學(xué)習(xí)中慢慢消化。

          相較于技術(shù)上的亮點(diǎn),Node.js設(shè)計(jì)者的開發(fā)思想或許更值得學(xué)習(xí),這一點(diǎn)正是大多數(shù)初級(jí)開發(fā)者所缺少的。Node.js的開發(fā)初衷是更方便地實(shí)現(xiàn)一個(gè)高性能的Web服務(wù)器,但當(dāng)它最終問世時(shí),并沒有宣稱自己是“實(shí)現(xiàn)高性能Web服務(wù)器的技術(shù)”,而是為開發(fā)人員提供了一個(gè)工具,這個(gè)工具的能力之一是實(shí)現(xiàn)高性能的Web服務(wù)器。

          這種思想差距在初級(jí)和高級(jí)開發(fā)人員之間表現(xiàn)得尤為明顯:初級(jí)開發(fā)人員往往會(huì)針對(duì)具體的業(yè)務(wù)需求采用面向過(guò)程的風(fēng)格進(jìn)行開發(fā),這使得他們編寫的程序幾乎無(wú)法靈活應(yīng)對(duì)任何需求變更;而有經(jīng)驗(yàn)的開發(fā)人員面對(duì)需求時(shí),通常會(huì)先設(shè)計(jì)一個(gè)類,或者抽象一個(gè)與業(yè)務(wù)邏輯無(wú)關(guān)的工具方法,然后在自己的程序中調(diào)用這個(gè)方法。

          要想成為優(yōu)秀的程序設(shè)計(jì)師,就要不斷地培養(yǎng)自己設(shè)計(jì)程序的能力,而不是僅僅完成語(yǔ)言層面的翻譯工作。



          02 Node.js能做什么

          在Node.js的諸多功能中,與前端開發(fā)人員關(guān)系最緊密的就是創(chuàng)建Web服務(wù)器和本地文件的讀寫能力。

          1. 創(chuàng)建高性能Web服務(wù)器

          許多Node.js的初學(xué)者應(yīng)該都見過(guò)那段只用了不到10行代碼就建立了一個(gè)Web服務(wù)器的經(jīng)典示例。盡管對(duì)于前端開發(fā)人員而言,他們依然需要學(xué)習(xí)基本的Web服務(wù)器知識(shí),才能更加得心應(yīng)手地進(jìn)行服務(wù)端開發(fā),但與配置Apache或Nginx來(lái)實(shí)現(xiàn)同樣的功能相比,這樣的學(xué)習(xí)成本已經(jīng)非常低了,畢竟前端開發(fā)人員可以使用自己最熟悉的JavaScript語(yǔ)言來(lái)構(gòu)建應(yīng)用。

          另一方面,在Node.js中,代碼可以與各類數(shù)據(jù)庫(kù)進(jìn)行交互,這就意味著前端工程師可以直接使用JavaScript語(yǔ)言編寫與數(shù)據(jù)庫(kù)進(jìn)行交互的代碼(盡管在大型應(yīng)用中并不推薦這樣做),且編寫業(yè)務(wù)邏輯代碼時(shí),Node.js與其他后端語(yǔ)言沒有明顯的差別,因此前端開發(fā)人員不用切換開發(fā)語(yǔ)言就可以掌握全棧開發(fā)的技能。

          由于Node.js底層使用的是異步非阻塞的I/O機(jī)制,因此它更適合于I/O密集、少量業(yè)務(wù)邏輯和計(jì)算消耗的場(chǎng)景。盡管解釋型腳本語(yǔ)言本身并不適合執(zhí)行計(jì)算型任務(wù),但Node.js底層是由C/C++代碼編寫的,并且提供了JavaScript代碼層與C/C++代碼交互的接口,面對(duì)計(jì)算密集型任務(wù)時(shí),Node.js只需要作為啟動(dòng)腳本調(diào)用底層C/C++程序來(lái)完成計(jì)算密集型任務(wù)就可以了。

          服務(wù)端執(zhí)行的任務(wù)大體可分為讀寫密集型任務(wù)計(jì)算密集型任務(wù)。對(duì)于讀寫密集型任務(wù)而言,CPU更多的時(shí)間是在等待磁盤讀寫,使用率并不高,在Web服務(wù)器上進(jìn)行的網(wǎng)絡(luò)通信、信息傳輸和磁盤讀寫等都屬于讀寫操作,它對(duì)磁盤的響應(yīng)速度和傳輸效率有著更高的需求。

          相較而言,計(jì)算密集型任務(wù)對(duì)CPU的運(yùn)算能力要求更高,但對(duì)磁盤讀寫造成的性能負(fù)擔(dān)很小,計(jì)算過(guò)程中通常也不需要與I/O接口進(jìn)行交互,可直接、高效地在內(nèi)存中執(zhí)行,這類任務(wù)的計(jì)算過(guò)程通常比較復(fù)雜,例如需要實(shí)現(xiàn)某些加密算法或者矩陣計(jì)算等。

          大型架構(gòu)的后端技術(shù)選型需要考慮的因素更為復(fù)雜,Node.js設(shè)計(jì)之初并沒有準(zhǔn)備承擔(dān)這項(xiàng)任務(wù),就連Node.js之父Ryan Dhal自己也說(shuō),在面對(duì)大型服務(wù)端應(yīng)用開發(fā)時(shí),Node.js的開發(fā)體驗(yàn)不如Go語(yǔ)言。

          但是,全世界目前有600多種編程語(yǔ)言,沒有任何一種語(yǔ)言能夠解決所有問題,語(yǔ)言只是承載和傳遞程序設(shè)計(jì)思想的媒介,如何為目標(biāo)場(chǎng)景選擇一項(xiàng)合適的技術(shù),或許是開發(fā)人員更應(yīng)該關(guān)注的問題。

          當(dāng)你在前端領(lǐng)域有一定的積累時(shí),很多前輩都會(huì)推薦你繼續(xù)學(xué)習(xí)Java或C++等更為完備也更為復(fù)雜的語(yǔ)言,這樣做的目的并不僅僅是擴(kuò)展能力邊界,更多的是希望你能夠跳出一種編程語(yǔ)言的束縛,學(xué)習(xí)和體會(huì)編程語(yǔ)言背后的思想。

          2. 本地文件的讀寫功能

          文件讀寫功能的底層所要解決的問題其實(shí)有很多。如果文件里的內(nèi)容比較多,讀入內(nèi)存的過(guò)程比較耗時(shí),應(yīng)該怎么處理呢?是等待讀入操作完成還是先去執(zhí)行其他任務(wù)?如果客戶端請(qǐng)求的資源是一部高清電影,文件比程序可用的總內(nèi)存還大,那么該文件是否就一定無(wú)法讀取了呢?

          Node.js的fs模塊幾乎為每個(gè)文件操作接口都提供了同步和異步兩種方法,同時(shí)也支持以流的方式對(duì)讀寫過(guò)程實(shí)現(xiàn)更細(xì)粒度的控制,甚至還可以監(jiān)測(cè)指定文件或文件夾的變動(dòng)。文件可讀寫意味著開發(fā)人員可以通過(guò)程序分析另一個(gè)程序中文件的內(nèi)容,并對(duì)其進(jìn)行檢查和糾錯(cuò),甚至可將其編譯成另一種語(yǔ)言,這便是前端工程化的能力基石。



          03 招黑的JavaScript全棧工程師

          Node.js憑借創(chuàng)建高性能Web服務(wù)器以及與數(shù)據(jù)庫(kù)通信的能力,為前端開發(fā)人員提供了服務(wù)端開發(fā)的機(jī)會(huì)。早在幾年之前,開發(fā)人員就可以使用MEAN(MongoDB + Express + Angular.js + Node.js)這種純JavaScript技術(shù)棧完成閉環(huán)的業(yè)務(wù)邏輯開發(fā),很多前端工程師也因此自詡為全棧工程師。

          不可否認(rèn)當(dāng)年這樣的技術(shù)棧確實(shí)可以使許多中小型團(tuán)隊(duì)以更少的人力和時(shí)間就把產(chǎn)品從創(chuàng)意階段推進(jìn)到線上,但這也使得JavaScript開發(fā)人員成為業(yè)內(nèi)最招黑的全棧工程師,因?yàn)闃I(yè)務(wù)邏輯的實(shí)現(xiàn)并不足以撐起全棧工程師進(jìn)行后端開發(fā)。

          在企業(yè)級(jí)開發(fā)中,后端開發(fā)仍然以Java工程師為主力軍。

          由于Java本身具有強(qiáng)類型和完整的面向?qū)ο蟮奶匦裕虼撕蠖斯こ處煹木幋a質(zhì)量和程序設(shè)計(jì)意識(shí)整體要高于前端工程師,再加上與Java開發(fā)體驗(yàn)非常相似的Angular技術(shù)棧的支持(Angular本身就是一項(xiàng)由Google的Java工程師開發(fā)和維護(hù)的技術(shù)),后端工程師很容易就能編寫出規(guī)范性和可維護(hù)性都不輸于前端開發(fā)人員的代碼,這大大提升了Java全棧工程師的競(jìng)爭(zhēng)力。

          如果不是工程化配置和CSS實(shí)戰(zhàn)經(jīng)驗(yàn)形成的門檻,前端工程師在面對(duì)后端全棧工程師時(shí)很難體現(xiàn)其自身價(jià)值。然而,前端開發(fā)出身的工程師在使用Node.js技術(shù)棧進(jìn)行服務(wù)端開發(fā)時(shí)卻沒有那么順利,最流行的Express和Koa框架,僅僅提供了框架和基本中間件,要想實(shí)現(xiàn)更多的功能,還需要引入或者自行開發(fā)大量中間件。

          這時(shí)開發(fā)人員之間的差別就會(huì)表現(xiàn)得非常明顯,即使完全不懂Node.js,后端開發(fā)人員也很清楚自己應(yīng)該尋找具備日志記錄、錯(cuò)誤追蹤、會(huì)話管理、安全校驗(yàn)、性能監(jiān)控、對(duì)象關(guān)系映射(ORM)、數(shù)據(jù)庫(kù)連接等功能的模塊或中間件,而普通的前端開發(fā)人員卻除了業(yè)務(wù)邏輯的增刪改查外,往往連使用“try...catch...”語(yǔ)句捕獲運(yùn)行時(shí)錯(cuò)誤的意識(shí)都沒有。

          前端工程師很容易只考慮業(yè)務(wù)邏輯一切正常的情況,只要主流程能夠正常運(yùn)行,就覺得萬(wàn)事大吉了,然而在真實(shí)的開發(fā)過(guò)程中,往往是那些沒有覆蓋到的邊界情況需要花費(fèi)更多的精力。

          把后端開發(fā)等同于編寫業(yè)務(wù)邏輯代碼,就好像把前端開發(fā)等同于編寫靜態(tài)頁(yè)面代碼一樣。如果真的想成為全棧工程師,需要用一顆謙虛求知的心,踏踏實(shí)實(shí)地去學(xué)習(xí)那些陌生的知識(shí),學(xué)習(xí)的過(guò)程可能充滿艱辛,但你一定會(huì)受益于所學(xué)的結(jié)果。

          關(guān)于作者:史文強(qiáng),前端資深技術(shù)專家,現(xiàn)任字節(jié)跳動(dòng)幸福里團(tuán)隊(duì)前端工程師、西安交通大學(xué)航天學(xué)院特聘軟件工程師,華為云云享專家,曾受Google GDG(Google開發(fā)者社區(qū))邀請(qǐng)進(jìn)行技術(shù)分享。擁有豐富的實(shí)戰(zhàn)經(jīng)驗(yàn),擅長(zhǎng)大型前端系統(tǒng)架構(gòu)設(shè)計(jì)、性能優(yōu)化及工程化體系建設(shè)。

          本文摘編自前端跨界開發(fā)指南:JavaScript工具庫(kù)原理解析與實(shí)戰(zhàn)》,經(jīng)出版方授權(quán)發(fā)布。(ISBN:978-7-111-70804-9

          延伸閱讀《前端跨界開發(fā)指南
          點(diǎn)擊上圖了解及購(gòu)買
          轉(zhuǎn)載請(qǐng)聯(lián)系微信:DoctorData

          推薦語(yǔ):本書是字節(jié)跳動(dòng)資深前端工程師嘔心瀝血之作,也是目前市場(chǎng)上少有的從原理到實(shí)戰(zhàn)深度剖析JavaScript生態(tài)中經(jīng)典工具庫(kù)的技術(shù)圖書。


          刷刷視頻??


          干貨直達(dá)??


          更多精彩??

          在公眾號(hào)對(duì)話框輸入以下關(guān)鍵詞
          查看更多優(yōu)質(zhì)內(nèi)容!

          讀書 | 書單 | 干貨 | 講明白 | 神操作 | 手把手
          大數(shù)據(jù) | 云計(jì)算 | 數(shù)據(jù)庫(kù) | Python | 爬蟲 | 可視化
          AI | 人工智能 | 機(jī)器學(xué)習(xí) | 深度學(xué)習(xí) | NLP
          5G | 中臺(tái) | 用戶畫像 數(shù)學(xué) | 算法 數(shù)字孿生

          據(jù)統(tǒng)計(jì),99%的大咖都關(guān)注了這個(gè)公眾號(hào)
          ??
          瀏覽 33
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久综合色气网站 | 色色色中文字幕 | 亚洲成人社区网站 | 一本一道无码免费看视频 | 美女裸体无遮挡天天摸天天做 |