国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

node核心特性理解

huangjinnan / 1496人閱讀

摘要:概述本文主要介紹了我對的一些核心特性的理解,包括架構特點機制核心模塊與簡單應用。在此期間,主線程繼續執行其他任務。延續了瀏覽器端單線程,只用一個主線程執行,不斷循環遍歷事件隊列,執行事件。

原文地址在我的博客,轉載請注明來源,謝謝!

node是在前端領域經常看到的詞。node對于前端的重要性已經不言而喻,掌握node也是作為合格的前端工程師一項基本功了。知道node、知道后端的一些東西,才能更好的與別人合作,發揮更大的價值。

概述

本文主要介紹了我對node的一些核心特性的理解,包括node架構、特點、機制、核心模塊與簡單應用。

正文 從瀏覽器到node

首先,node是一個平臺,使用javascript作為編程語言,運行在服務端。服務端語言能做的,node一般都能做,而且有些情況下做的更好,因為它具有自己的特色。

node是javascript運行環境(runtime),就像瀏覽器一樣,是一個平臺。在瀏覽器中,V8引擎負責解釋javascript,你在javascript調用的接口都是瀏覽器實現并提供的,瀏覽器會調用底層的、由其他語言(C++)實現并封裝好的接口來完成任務;同樣,在node中,也是V8引擎負責解釋javascript,而你在javascript調用的瀏覽器提供的接口就不能用了,因為它脫離了瀏覽器的環境,但是因為你在node環境中,你就可以使用node提供的由C++語言實現的、由javascript封裝好的各種接口來完成后端任務。瀏覽器提供的API用于處理前端任務,比如彈個窗,換個主題,處理用戶操作等,而node因為服務后端,因此提供的API則用來處理后端任務,比如響應請求,讀取文件等,這些API由不同的模塊提供。因為關注領域不一樣,因此所做的任務就不一樣,提供的API就不一樣,但是原理、相關實現大致與瀏覽器端相同。

從瀏覽器到node這一塊如果想了解更多,推薦IBM的文章node.js到底是什么?

node 架構

node架構分為三層(參考鏈接):

圖片來源

Node standard library:node標準庫,也就是node模塊提供各種接口的javascript實現,任何javascript代碼、npm install 或者你寫的模塊都在這里

Node bindings:包括C/C++ bindings(膠水代碼)和Add on(添加其他C/C++庫時需要自己寫的Bindings),這一層向下封裝了V8和libuv接口,向上提供了基礎API接口,是連接javascript和C++的橋梁

第三層是支撐 Node.js 運行的關鍵,由 C/C++ 實現。

V8 是Google開發的JavaScript引擎,提供JavaScript運行環境,可以說它就是 Node.js 的發動機,負責解釋javascript,與chrome瀏覽器相同。

Libuv 是專門為Node.js開發的一個封裝庫,提供跨平臺的異步I/O能力,負責node運行時的線程池調度。

C-ares:提供了異步處理 DNS 相關的能力。

http_parser、OpenSSL、zlib 等:提供包括 http 解析、SSL、數據壓縮等系統底層的訪問。

平常我們用到的也就是第一層node各個模塊實現的接口。

那他們之間時如何協作的呢

程序啟動,V8引擎會首先解析javascript代碼,通過Node bindings來調用C/C++庫。執行到當前事件時,會把事件放在調用堆棧(stack和heap)處理(可以理解為放進一個工作空間,如上圖),在堆棧中的任何I/O請求都會交給libuv來處理,libuv維持一個線程池,里面是一些工作線程(如下圖),請求會調用這些線程來完成任務,這些線程則調用底層的C/C++庫。完成時,libuv再把結果返回事件隊列等待主線程執行。在此期間,主線程繼續執行其他任務。

node 執行特性
單線程、非阻塞型I/O

單線程的意思就是只在一個線程上運行javascript。首先,javascript 在瀏覽器端是單線程的,這是為了避免多線程產生任務沖突的情況;其次,java和PHP這類多線程后端語言,為避免同步I/O阻塞,每處理一個連接都會產生一個新線程,這樣的話在遇到大量并發請求時就會受到物理內存的限制。node 延續了瀏覽器端單線程javascript,只用一個主線程執行javascript,不斷循環遍歷事件隊列,執行事件。事實上,主線程發出的I/O請求,都會交給其他線程去完成,其他線程完成后悔返回結果放到事件隊列。在此期間,主線程會繼續執行其他任務,也就是在交給libuv后直接返回,繼續執行下面的任務,主線程只負責循環執行事件隊列,因此這種模式稱為非阻塞型I/O,性能很好,適用于處理大量并發請求,還能簡化開發。

事件驅動機制

還是跟瀏覽器的差不多。總的來說就是,瀏覽器端把鼠標點擊、鍵盤按鍵等定義為事件,而node把網絡請求、I/O操作等也看作事件,嚴格來說,一切動作都是事件,這就是事件驅動的思想。在程序啟動時,便進入事件循環,不斷遍歷執行事件隊列中產生的事件,而在執行過程中,又會產生新的事件,因此稱為事件循環。主線程執行事件時,遇到麻煩的I/O請求會交給libuv來調度其他工作線程來幫忙,忙完后就會形成事件返回結果到事件隊列等待主線程處理。在此期間,主線程會繼續執行其他任務。

mbp 曾經做過一個巧妙的比喻,把 Node.js 看成一家餐廳。我在此借用下他的例子,稍作修改來闡述下 Node.js 的執行情況:

把 Node.js 應用程序想象成一家星巴克,一個訓練有素的前臺服務生(唯一的主線程)在柜臺前接受訂單。當很多顧客同時光臨的時候,他們排隊(進入事件隊列)等候接待;每當服務生接待一位顧客,服務生會把訂單告知給經理(libuv),經理安排相應的專職人員去烹制咖啡(工作線程或者系統特性)。這個專職人員會使用不同的原料和咖啡機(底層 C/C++ 組件)按訂單要求制作咖啡或甜點,通常會有四個這樣的專職人員保持在崗待命(線程池),高峰期的時候也可以安排更多(不過需要在一早就安排人員來上班,而不能中午臨時通知)。服務生把訂單轉交給經理之后不需要等著咖啡制作完成,而是直接開始接待下一位顧客(事件循環放進調用堆棧的另一個事件),你可以把當前調用堆棧里的事件看成是站在柜臺前正在接受服務的顧客。

當咖啡完成時,會被發送到顧客隊列的最后位置,等它移動到柜臺前服務生會叫相應顧客的名字,顧客就來取走咖啡(最后這部分在真實生活中聽起來有點怪,不過你從程序執行的角度理解就比較合乎情理了)。

? ——By Amio

如果你想進一步了解javascript 事件驅動機制,推薦深入理解 javascript 事件循環機制

node 模塊

node 模塊機制是CommonJs 的實現。起初,javascript 標準一片混沌,并沒有其他成熟語言(例如C++)的模塊機制、標準庫、接口等,為了讓javascript 具備開發大型應用的能力,為了讓 javascript 能在后端運行,CommonJS 就制定了javascript 模塊規范。node 借鑒了這個規范,讓javascript 以模塊形式組織起來。模塊機制是一個成熟語言必備的,一個模塊代表一個功能的封裝,它就像搭積木一樣,不同模塊可以銜接在一塊,使語言具有極強的可擴展型。node 模塊機制同時制定了模塊規范,能讓全球的開發者都可以在node官網上傳自己的包。此外,node 社區又實現了node 包管理器npm,使用npm可以輕松管理各種包。

node 的模塊分為核心模塊和用戶模塊,前者是底層的、自帶的,后者是第三方。

核心模塊有Global(全局對象)、Http、fs(文件系統)、Buffer、Stream、Events、URL、path等,這些模塊提供了后端服務的基本功能,都提供自己關注功能的API。

在使用模塊時,require 即可。但在require背后,node 有一套尋找模塊的機制:

從上圖可以看到,node 優先從緩存區讀取,緩存區有直接讀取,沒有則加載并緩存,這樣做不用一遍一遍去找了,非常高效。node 在緩存區沒有發現模塊時,會分析require 的路徑和文件后綴,node 有個模塊路徑的查找策略,我們可以在名為module_paths 的js文件里console.log(module.paths)然后node module_paths.js 運行來間接查看node 尋找文件模塊的具體文件的方式:

[ "/home/username/nodeProject/node_modules",
 "/home/username/node_modules",
 "/home/node_modules",
 "/node_modules" ] //Linux下的數組輸出(/home/username因電腦不同而異)

[ "c:
odeProject
ode_modules", "c:
ode_modules" ] //Windows

也就是按照下面的順序:

當前文件目錄下的node_modules目錄。

父目錄下的node_modules目錄。

父目錄的父目錄下的node_modules目錄。

沿路徑向上逐級遞歸,直到根目錄下的node_modules目錄。

這些順序都是在查找緩存之后的。

在找到模塊后,node 將在引入之前對這個模塊進行編譯執行,編譯成功后會緩存,執行的結果會返回給調用者。

簡單應用

有了node 自帶核心模塊的基礎功能,就可以進一步封裝更強大、容易操作的功能了,就像jQuery 對于javascript 基礎API 一樣,node 社區也誕生了像 Express、KOA等框架來構建node.js程序

這些框架的詳情移步2017 Node.js 開發框架比較

另外,node 還可以連接MySQL,MangoDB進行數據庫操作。

下面是使用express 腳手架生成的基本 node應用結構:

.
├── app.js            //程序入口
├── bin
│   └── www              //二機制文件
├── package.json      //項目配置文件
├── public
│   ├── images        
│   ├── javascripts
│   └── stylesheets
│       └── style.css
├── routes
│   ├── index.js      //路由文件入口
│   └── users.js
└── views
    ├── error.jade    //界面模板
    ├── index.jade
    └── layout.jade

現在使用 node作為后端語言通常都要配合類庫和框架使用。

node 的單線程、非阻塞型特點讓它非常適合高并發的應用,適合處理大量重復的、簡單的邏輯,適合構建Rest/JSON API服務;同時,也正是因為這些特性,node 不適合CPU使用率較重、IO使用率較輕的偏計算應用。缺點是因為單線程,一個進程掛就全掛了,可靠性低,但這是可以避免的。node 更多的應用是在前端、中間件、前后端分離等。

由于 node 的諸多優點,現在越來越多大公司開始使用node、深度使用node。

總結

node 的核心概念、思想遠不止這么多,應用更是多了去了,無奈本人水平有限,只能說個淺層,還有很多像進程管理、異步編程、異常調試、部署、性能調優、與集群、CDN協調等都值得深入探索一下。無論如何,node 是讓javascript 邁向企業級開發語言重要的一步(也許已經是了),前端工程師從未像現在這樣的powerful,能做的事情越來越多,所能涉及的領域也越來越多。前端這行越來越令人興奮了。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/89064.html

相關文章

  • Node.js入門介紹

    摘要:是一個針對網絡應用開發的平臺它基于的運行時引擎但它不僅僅只是的標準類庫是它非常重要的一部分它涵蓋了從服務端到同步或者異步的文件管理已經迅速成為一個可行并且真正高效的開發平臺在誕生之前在服務端運行是件不可思議的事情并且對其他腳本語言來說要實現 Node是一個針對網絡應用開發的平臺,它基于Google的JavaScript運行時引擎V8,但它不僅僅只是V8.Node的標準類庫是它非常重要的...

    li21 評論0 收藏0
  • 深入理解Webpack核心模塊Tapable鉤子[同步版]

    摘要:本文將根據以下章節分別梳理每個鉤子同步鉤子首先安裝是簡單的同步鉤子,它很類似于發布訂閱。至此,我們把的所有同步鉤子都解析完畢異步鉤子比同步鉤子麻煩些,我們會在下一章節開始解析異步的鉤子傳送門深入理解核心模塊鉤子異步版代碼 記錄下自己在前端路上爬坑的經歷 加深印象,正文開始~ tapable是webpack的核心依賴庫 想要讀懂webpack源碼 就必須首先熟悉tapableok.下面是...

    cangck_X 評論0 收藏0
  • 【全文】狼叔:如何正確的學習Node.js

    摘要:感謝大神的免費的計算機編程類中文書籍收錄并推薦地址,以后在倉庫里更新地址,聲音版全文狼叔如何正確的學習簡介現在,越來越多的科技公司和開發者開始使用開發各種應用。 說明 2017-12-14 我發了一篇文章《沒用過Node.js,就別瞎逼逼》是因為有人在知乎上黑Node.js。那篇文章的反響還是相當不錯的,甚至連著名的hax賀老都很認同,下班時讀那篇文章,竟然坐車的還坐過站了。大家可以很...

    Edison 評論0 收藏0
  • 【全文】狼叔:如何正確的學習Node.js

    摘要:感謝大神的免費的計算機編程類中文書籍收錄并推薦地址,以后在倉庫里更新地址,聲音版全文狼叔如何正確的學習簡介現在,越來越多的科技公司和開發者開始使用開發各種應用。 說明 2017-12-14 我發了一篇文章《沒用過Node.js,就別瞎逼逼》是因為有人在知乎上黑Node.js。那篇文章的反響還是相當不錯的,甚至連著名的hax賀老都很認同,下班時讀那篇文章,竟然坐車的還坐過站了。大家可以很...

    fengxiuping 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<