欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Nodejs為什么選擇javascript為載體語言

 更新時(shí)間:2015年01月13日 09:45:54   投稿:hebedich  
準(zhǔn)備寫一個(gè)NodeJS方面的系列文章,由淺入深,循序漸進(jìn),秉承的理念是重思想,多實(shí)踐,勤能補(bǔ)拙,貴在堅(jiān)持。本文首先來點(diǎn)基礎(chǔ)知識(shí)的開篇吧。

我們先來看看NodeJS官網(wǎng)上的介紹:

  其特點(diǎn)為:

  1,它是一個(gè)Javascript運(yùn)行環(huán)境

  2,依賴于Chrome V8引擎進(jìn)行代碼解釋

  3,事件驅(qū)動(dòng)

  4, 非阻塞I/O

  5, 輕量、可伸縮,適于實(shí)時(shí)數(shù)據(jù)交互應(yīng)用

  6,單進(jìn)程,單線程

  (1),Nodejs為什么選擇javascript為載體語言

    事實(shí)上,在實(shí)現(xiàn) Node.js 之初,作者 Ryan Dahl 并沒有選擇 JavaScript,他嘗試過 C、Lua,皆因其欠缺一些高級語言的特性,如閉包、函數(shù)式編程,致使程序復(fù)雜,難以維護(hù)。

    而 JavaScript 則是支持函數(shù)式編程范型的語言,很好地契合了 Node.js 基于事件驅(qū)動(dòng)的編程模型。加之 Google 提供的 V8 引擎,使 JavaScript 語言的執(zhí)行速度大大提高。

    最終呈現(xiàn)在我們面前的就成了 Node.js,而不是 Node.c,Node.lua 或其他語言的實(shí)現(xiàn)。

 ?。?),Node.js不是JS應(yīng)用、而是JS運(yùn)行平臺(tái)

    看到Node.js這個(gè)名字,初學(xué)者可能會(huì)誤以為這是一個(gè)Javascript應(yīng)用,事實(shí)上,Node.js采用C++語言編寫而成,是一個(gè)Javascript的運(yùn)行環(huán)境。

    Node.js采用了Google Chrome瀏覽器的V8引擎,性能很好,同時(shí)還提供了很多系統(tǒng)級的API,如文件操作、網(wǎng)絡(luò)編程等。

    以下是NodeJS所涉及的全部模塊:

    

    瀏覽器端的Javascript代碼在運(yùn)行時(shí)會(huì)受到各種安全性的限制,對客戶系統(tǒng)的操作有限。

    相比之下,Node.js則是一個(gè)全面的后臺(tái)運(yùn)行時(shí),為Javascript提供了其他語言能夠?qū)崿F(xiàn)的許多功能。

 ?。?),Node.js的特點(diǎn)

    Node.js在設(shè)計(jì)上也是比較創(chuàng)新,它以單進(jìn)程,單線程模式運(yùn)行(這和Javascript的運(yùn)行方式是一致的),

    事件驅(qū)動(dòng)機(jī)制是Node.js通過內(nèi)部單線程高效率地維護(hù)事件循環(huán)隊(duì)列來實(shí)現(xiàn)的,沒有多線程的資源占用和上下文切換,這意味著面對大規(guī)模的http請求,Node.js憑借事件驅(qū)動(dòng)搞定一切,

    習(xí)慣了傳統(tǒng)語言的網(wǎng)絡(luò)服務(wù)開發(fā)人員可能對多線程并發(fā)和協(xié)作非常熟悉,但是面對Node.js,我們需要接受和理解它的特點(diǎn)。

二,重要概念

  1,什么是 Event Loop ?(很重要的概念)

    Event Loop 是一個(gè)很重要的概念,指的是計(jì)算機(jī)系統(tǒng)的一種運(yùn)行機(jī)制。

    想要理解Event Loop,就要從程序的運(yùn)行模式講起。運(yùn)行以后的程序叫做進(jìn)程(Process),一般情況下,一個(gè)進(jìn)程一次只能執(zhí)行一個(gè)任務(wù)。

    如果有很多任務(wù)需要執(zhí)行,不外乎三種解決方法。

      (1),排隊(duì)。因?yàn)橐粋€(gè)進(jìn)程一次只能執(zhí)行一個(gè)任務(wù),只好等前面的任務(wù)執(zhí)行完了,再執(zhí)行后面的任務(wù)。

     ?。?),新建進(jìn)程。使用fork命令,為每個(gè)任務(wù)新建一個(gè)進(jìn)程。

      (3),新建線程。因?yàn)檫M(jìn)程太耗費(fèi)資源,所以如今的程序往往允許一個(gè)進(jìn)程包含多個(gè)線程,由線程去完成任務(wù)。

    以JavaScript語言為例,它是一種單線程語言,所有任務(wù)都在一個(gè)線程上完成,即采用上面的第一種方法。一旦遇到大量任務(wù)或者遇到一個(gè)耗時(shí)的任務(wù),網(wǎng)頁就會(huì)出現(xiàn)"假死",因?yàn)镴avaScript停不下來,也就無法響應(yīng)用戶的行為。

    你也許會(huì)問,JavaScript為什么是單線程,難道不能實(shí)現(xiàn)為多線程嗎?

    這跟歷史有關(guān)系:

      JavaScript語言的一大特點(diǎn)就是單線程,也就是說,同一個(gè)時(shí)間只能做一件事。那么,為什么JavaScript不能有多個(gè)線程呢?這樣能提高效率啊。

      JavaScript的單線程,與它的用途有關(guān)。作為瀏覽器腳本語言,JavaScript的主要用途是與用戶互動(dòng),以及操作DOM。這決定了它只能是單線程,否則會(huì)帶來很復(fù)雜的同步問題。

      比如,假定JavaScript同時(shí)有兩個(gè)線程,一個(gè)線程在某個(gè)DOM節(jié)點(diǎn)上添加內(nèi)容,另一個(gè)線程刪除了這個(gè)節(jié)點(diǎn),這時(shí)瀏覽器應(yīng)該以哪個(gè)線程為準(zhǔn)?

      所以,為了避免復(fù)雜性,從一誕生,JavaScript就是單線程,這已經(jīng)成了這門語言的核心特征,將來也不會(huì)改變。

      為了利用多核CPU的計(jì)算能力,HTML5提出Web Worker標(biāo)準(zhǔn),允許JavaScript腳本創(chuàng)建多個(gè)線程,但是子線程完全受主線程控制,且不得操作DOM。
      所以,這個(gè)新標(biāo)準(zhǔn)并沒有改變JavaScript單線程的本質(zhì)。

      回到EventLoop:

      單線程就意味著,所有任務(wù)需要排隊(duì),前一個(gè)任務(wù)結(jié)束,才會(huì)執(zhí)行后一個(gè)任務(wù)。如果前一個(gè)任務(wù)耗時(shí)很長,后一個(gè)任務(wù)就不得不一直等著。

      如果排隊(duì)是因?yàn)橛?jì)算量大,CPU忙不過來,倒也算了,但是很多時(shí)候CPU是閑著的,因?yàn)镮O設(shè)備(輸入輸出設(shè)備)很慢(比如Ajax操作從網(wǎng)絡(luò)讀取數(shù)據(jù)),不得不等著結(jié)果出來,再往下執(zhí)行。

      JavaScript語言的設(shè)計(jì)者意識(shí)到,這時(shí)主線程完全可以不管IO設(shè)備,掛起處于等待中的任務(wù),先運(yùn)行排在后面的任務(wù)。等到IO設(shè)備返回了結(jié)果,再回過頭,把掛起的任務(wù)繼續(xù)執(zhí)行下去。

      于是,所有任務(wù)可以分成兩種,一種是同步任務(wù)(synchronous),另一種是異步任務(wù)(asynchronous)。同步任務(wù)指的是,在主線程上排隊(duì)執(zhí)行的任務(wù),只有前一個(gè)任務(wù)執(zhí)行完畢,

      才能執(zhí)行后一個(gè)任務(wù);異步任務(wù)指的是,不進(jìn)入主線程、而進(jìn)入"任務(wù)隊(duì)列"(task queue)的任務(wù),只有"任務(wù)隊(duì)列"通知主線程,某個(gè)異步任務(wù)可以執(zhí)行了,該任務(wù)才會(huì)進(jìn)入主線程執(zhí)行。

      如下圖:

        

       只要主線程空了,就會(huì)去讀取"任務(wù)隊(duì)列",這就是JavaScript的運(yùn)行機(jī)制。這個(gè)過程會(huì)不斷重復(fù)。

三,實(shí)例講解

  好了,“廢話”不多說了,馬上開始我們第一個(gè)NodeJS應(yīng)用:“Hello 大熊”。

  打開你最喜歡的編輯器,創(chuàng)建一個(gè)HelloWorld.js文件。

  代碼如下:

復(fù)制代碼 代碼如下:
1 var http = require("http") ;2 http.createServer(function(request,response){3 response.writeHead(200,{4 "Content-Type" : "text/plain"5 }) ;6 response.write("Hello,大熊 !") ;7 response.end() ;8 }).listen(8888) ;

  我們來運(yùn)行并且測試這段代碼。首先,用Node.js執(zhí)行你的腳本:

  打開命令行工具CMD,切換到你的工作目錄,運(yùn)行命令“node HelloWorld.js”

  接下來,打開瀏覽器訪問http://localhost:8888/,你會(huì)看到一個(gè)寫著 “Hello,大熊 !” 的網(wǎng)頁。

  一點(diǎn)小的擴(kuò)展知識(shí):

  如下圖所示,這是NodeJS中的http.js部分源碼,createServer是一個(gè)對用戶很友好的接口,內(nèi)部實(shí)現(xiàn)采用了單例模式,這樣做的好處是,把實(shí)例的創(chuàng)建和初始化任務(wù)進(jìn)行有效的分離,職責(zé)專一,降低耦合度,這是大家平時(shí)編程時(shí)可以借鑒的思想。

  

  哈哈哈,是不是很有意思,這只是一次短暫的體驗(yàn),后面會(huì)陸續(xù)講解很多的知識(shí)點(diǎn),大家慢慢體會(huì)O(∩_∩)O哈哈~

四,總體概述

  1,它是一個(gè)Javascript運(yùn)行環(huán)境

  2,依賴于Chrome V8引擎進(jìn)行代碼解釋

  3,事件驅(qū)動(dòng)

  4, 非阻塞I/O

  5, 輕量、可伸縮,適于實(shí)時(shí)數(shù)據(jù)交互應(yīng)用

  6,單進(jìn)程,單線程

  最后我想說的話是:這篇的例子不是很多,但是這些概念相當(dāng)重要,一定要有一個(gè)清晰的理解,這樣為以后的NodeJS學(xué)習(xí)會(huì)打下牢固的基礎(chǔ)的,朋友們加油一起努力。

       哈哈哈,本篇結(jié)束,未完待續(xù),希望和大家多多交流夠溝通,共同進(jìn)步。。。。。。呼呼呼……(*^__^*)

相關(guān)文章

  • nodejs如何獲取當(dāng)前連接的網(wǎng)絡(luò)ip

    nodejs如何獲取當(dāng)前連接的網(wǎng)絡(luò)ip

    這篇文章主要介紹了nodejs如何獲取當(dāng)前連接的網(wǎng)絡(luò)ip問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Node.js 深度調(diào)試方法解析

    Node.js 深度調(diào)試方法解析

    這篇文章主要介紹了Node.js 深度調(diào)試方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Nest 復(fù)雜查詢示例解析

    Nest 復(fù)雜查詢示例解析

    這篇文章主要為大家介紹了Nest 復(fù)雜查詢示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • NodeJS實(shí)現(xiàn)微信公眾號關(guān)注后自動(dòng)回復(fù)功能

    NodeJS實(shí)現(xiàn)微信公眾號關(guān)注后自動(dòng)回復(fù)功能

    這篇文章主要為大家詳細(xì)介紹了NodeJS實(shí)現(xiàn)微信公眾號關(guān)注后自動(dòng)回復(fù)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Node.js API詳解之 repl模塊用法實(shí)例分析

    Node.js API詳解之 repl模塊用法實(shí)例分析

    這篇文章主要介紹了Node.js API詳解之 repl模塊用法,結(jié)合實(shí)例形式分析了Node.js API中repl模塊基本功能、函數(shù)、使用方法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-05-05
  • 利用yarn實(shí)現(xiàn)一個(gè)webpack+react種子

    利用yarn實(shí)現(xiàn)一個(gè)webpack+react種子

    其實(shí)以前就寫過如何使用React-router和Webpack快速構(gòu)建一個(gè)react程序。后來發(fā)現(xiàn)版本太老,于是乎最近又重新組織了下結(jié)構(gòu),使用最近發(fā)布的yarn作為包管理工具,介紹下基本安裝步驟,有需要的朋友們下面來一起看看吧。
    2016-10-10
  • Node.js中環(huán)境變量process.env的一些事詳解

    Node.js中環(huán)境變量process.env的一些事詳解

    這篇文章主要給大家介紹了關(guān)于Node.js中環(huán)境變量process.env的一些事,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用node.js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • Node.js打包管理工具NPM用法

    Node.js打包管理工具NPM用法

    這篇文章介紹了Node.js打包管理工具NPM的用法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Node.js中Express框架的使用教程詳解

    Node.js中Express框架的使用教程詳解

    這篇文章主要為大家詳細(xì)介紹了Node.js中的開發(fā)框架Express,利用Express框架可以快速的進(jìn)行Web后端開發(fā),感興趣的小伙伴可以了解一下
    2022-04-04
  • 說說node中的可讀流和可寫流的區(qū)別

    說說node中的可讀流和可寫流的區(qū)別

    這篇文章主要介紹了說說node中的可讀流和可寫流的區(qū)別,詳細(xì)的介紹了可讀流和可寫流,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06

最新評論