最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

  其特點為:

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

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

  3,事件驅(qū)動

  4, 非阻塞I/O

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

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

 ?。?),Nodejs為什么選擇javascript為載體語言

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

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

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

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

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

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

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

    

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

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

 ?。?),Node.js的特點

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

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

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

二,重要概念

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

    Event Loop 是一個很重要的概念,指的是計算機系統(tǒng)的一種運行機制。

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

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

     ?。?),排隊。因為一個進(jìn)程一次只能執(zhí)行一個任務(wù),只好等前面的任務(wù)執(zhí)行完了,再執(zhí)行后面的任務(wù)。

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

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

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

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

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

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

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

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

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

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

      回到EventLoop:

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

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

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

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

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

      如下圖:

        

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

三,實例講解

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

  打開你最喜歡的編輯器,創(chuàng)建一個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) ;

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

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

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

  一點小的擴展知識:

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

  

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

四,總體概述

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

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

  3,事件驅(qū)動

  4, 非阻塞I/O

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

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

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

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

相關(guān)文章

  • Node.js系列之安裝配置與基本使用(1)

    Node.js系列之安裝配置與基本使用(1)

    這篇文章主要為大家詳細(xì)介紹了Node.js系列之安裝配置與基本使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • node.js中Util模塊作用教程示例詳解

    node.js中Util模塊作用教程示例詳解

    這篇文章主要為大家介紹了node.js中Util模塊的教程示例詳解,帶大家充分的了解node.js的util模塊,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • Node定時備份MySQL的實現(xiàn)

    Node定時備份MySQL的實現(xiàn)

    本文主要介紹了Node定時備份MySQL的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 簡單談?wù)勱P(guān)于 npm 5.0 的新坑

    簡單談?wù)勱P(guān)于 npm 5.0 的新坑

    最近使用到了npm5.0,第一次使用確實被驚艷了,但隨著而來的是一些坑,下面這篇文章主要給大家簡單介紹了關(guān)于npm 5的一些新坑,需要的朋友可以參考學(xué)習(xí),下面來一起看看吧。
    2017-06-06
  • 從Node.js事件觸發(fā)器到Vue自定義事件的深入講解

    從Node.js事件觸發(fā)器到Vue自定義事件的深入講解

    這篇文章主要給大家介紹了關(guān)于從Node.js事件觸發(fā)器到Vue自定義事件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 使用NVM管理Node版本的詳細(xì)教程

    使用NVM管理Node版本的詳細(xì)教程

    Node Version Manager(NVM)是一個非常流行的工具,用于在同一個系統(tǒng)上管理多個 Node.js 版本,NVM 允許你安裝、使用和切換不同的 Node.js 版本,這對于開發(fā)人員來說非常有用,本文給大家介紹了使用NVM管理Node版本的詳細(xì)教程,需要的朋友可以參考下
    2025-02-02
  • NodeJS之優(yōu)缺點及適用場景討論

    NodeJS之優(yōu)缺點及適用場景討論

    這篇文章主要介紹了NodeJS之優(yōu)缺點及適用場景討論,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 我的Node.js學(xué)習(xí)之路(三)--node.js作用、回調(diào)、同步和異步代碼 以及事件循環(huán)

    我的Node.js學(xué)習(xí)之路(三)--node.js作用、回調(diào)、同步和異步代碼 以及事件循環(huán)

    本篇文章主要介紹了node.js的幾個重要的知識點:node.js作用、回調(diào)、同步和異步代碼 以及事件循環(huán)
    2014-07-07
  • node.js中實現(xiàn)GET和POST請求的代碼示例

    node.js中實現(xiàn)GET和POST請求的代碼示例

    在很多場景中,我們的服務(wù)器都需要跟用戶的瀏覽器打交道,如發(fā)送驗證碼、登錄表單提交,請求服務(wù)器數(shù)據(jù)一般都使用GET請求,表單提交到服務(wù)器一般都使用POST請求,本文詳細(xì)介紹了在Node.js中如何處理GET和POST請求,需要的朋友可以參考下
    2024-12-12
  • node.js WEB開發(fā)中圖片驗證碼的實現(xiàn)方法

    node.js WEB開發(fā)中圖片驗證碼的實現(xiàn)方法

    這篇文章主要介紹了node.js WEB開發(fā)中圖片驗證碼的實現(xiàn)方法,使用ccap模塊實現(xiàn),需要的朋友可以參考下
    2014-06-06

最新評論

神农架林区| 同江市| 白城市| 岑溪市| 酉阳| 枣强县| 玉屏| 福泉市| 麟游县| 永胜县| 洪雅县| 汨罗市| 敦化市| 嘉义县| 云龙县| 青州市| 凤山市| 通山县| 扎鲁特旗| 聂荣县| 蒙阴县| 乌鲁木齐市| 石城县| 新巴尔虎右旗| 霍山县| 荃湾区| 遂平县| 扎兰屯市| 资中县| 阿克陶县| 靖西县| 邯郸市| 长乐市| 水富县| 宁晋县| 原阳县| 高阳县| 中阳县| 霍邱县| 明溪县| 梁山县|