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

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

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

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

  其特點為:

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

  2,依賴于Chrome V8引擎進行代碼解釋

  3,事件驅(qū)動

  4, 非阻塞I/O

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

  6,單進程,單線程

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

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

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

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

  (2),Node.js不是JS應用、而是JS運行平臺

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

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

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

    

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

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

  (3),Node.js的特點

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

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

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

二,重要概念

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

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

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

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

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

     ?。?),新建進程。使用fork命令,為每個任務新建一個進程。

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

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

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

    這跟歷史有關系:

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

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

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

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

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

      回到EventLoop:

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

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

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

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

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

      如下圖:

        

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

三,實例講解

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

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

  代碼如下:

復制代碼 代碼如下:
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)建和初始化任務進行有效的分離,職責專一,降低耦合度,這是大家平時編程時可以借鑒的思想。

  

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

四,總體概述

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

  2,依賴于Chrome V8引擎進行代碼解釋

  3,事件驅(qū)動

  4, 非阻塞I/O

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

  6,單進程,單線程

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

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

相關文章

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

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

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

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

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

    Nest 復雜查詢示例解析

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

    NodeJS實現(xiàn)微信公眾號關注后自動回復功能

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評論