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

Nodejs為什么選擇javascript為載體語(yǔ)言

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

我們先來(lái)看看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)程,單線程

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

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

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

    最終呈現(xiàn)在我們面前的就成了 Node.js,而不是 Node.c,Node.lua 或其他語(yǔ)言的實(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++語(yǔ)言編寫而成,是一個(gè)Javascript的運(yùn)行環(huán)境。

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

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

    

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

    相比之下,Node.js則是一個(gè)全面的后臺(tái)運(yùn)行時(shí),為Javascript提供了其他語(yǔ)言能夠?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通過(guò)內(nèi)部單線程高效率地維護(hù)事件循環(huán)隊(duì)列來(lái)實(shí)現(xiàn)的,沒(méi)有多線程的資源占用和上下文切換,這意味著面對(duì)大規(guī)模的http請(qǐng)求,Node.js憑借事件驅(qū)動(dòng)搞定一切,

    習(xí)慣了傳統(tǒng)語(yǔ)言的網(wǎng)絡(luò)服務(wù)開(kāi)發(fā)人員可能對(duì)多線程并發(fā)和協(xié)作非常熟悉,但是面對(duì)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í)行,不外乎三種解決方法。

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

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

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

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

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

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

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

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

      比如,假定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)成了這門語(yǔ)言的核心特征,將來(lái)也不會(huì)改變。

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

      回到EventLoop:

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

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

      JavaScript語(yǔ)言的設(shè)計(jì)者意識(shí)到,這時(shí)主線程完全可以不管IO設(shè)備,掛起處于等待中的任務(wù),先運(yùn)行排在后面的任務(wù)。等到IO設(shè)備返回了結(jié)果,再回過(guò)頭,把掛起的任務(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è)過(guò)程會(huì)不斷重復(fù)。

三,實(shí)例講解

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

  打開(kāi)你最喜歡的編輯器,創(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) ;

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

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

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

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

  如下圖所示,這是NodeJS中的http.js部分源碼,createServer是一個(gè)對(duì)用戶很友好的接口,內(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)程,單線程

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

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

    NodeJS之優(yōu)缺點(diǎn)及適用場(chǎng)景討論

    這篇文章主要介紹了NodeJS之優(yōu)缺點(diǎn)及適用場(chǎng)景討論,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    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的幾個(gè)重要的知識(shí)點(diǎn):node.js作用、回調(diào)、同步和異步代碼 以及事件循環(huán)
    2014-07-07
  • node.js中實(shí)現(xiàn)GET和POST請(qǐng)求的代碼示例

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

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

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

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

最新評(píng)論

阳春市| 靖宇县| 万山特区| 稻城县| 湖州市| 庄浪县| 河北省| 大同县| 阿城市| 上饶市| 社旗县| 商水县| 德安县| 韶关市| 黔江区| 民县| 望城县| 宝清县| 临猗县| 阳春市| 泰来县| 富宁县| 隆回县| 兴安盟| 桑植县| 东乡| 汝州市| 湟源县| 龙川县| 东城区| 夹江县| 滦平县| 宜兴市| 临沂市| 齐齐哈尔市| 易门县| 沂南县| 通许县| 巴中市| 江口县| 蓝田县|