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

Node.js中的模塊機(jī)制學(xué)習(xí)筆記

 更新時(shí)間:2014年11月04日 11:32:35   投稿:junjie  
這篇文章主要介紹了Node.js中的模塊機(jī)制學(xué)習(xí)筆記,本文講解了CommonJS模塊規(guī)范、Node模塊實(shí)現(xiàn)過(guò)程、模塊調(diào)用棧、包與NPM等內(nèi)容,需要的朋友可以參考下

Javascript自誕生以來(lái),曾經(jīng)沒(méi)有人拿它當(dāng)做一門(mén)編程語(yǔ)言。在Web 1.0時(shí)代,這種腳本語(yǔ)言主要被用來(lái)做表單驗(yàn)證和網(wǎng)頁(yè)特效。直到Web 2.0時(shí)代,前端工程師利用它大大提升了網(wǎng)頁(yè)上的用戶體驗(yàn),JS才被廣泛重視起來(lái)。在JS逐漸流行的過(guò)程中,它大致經(jīng)歷了工具類庫(kù)、組件庫(kù)、前端框架、前端應(yīng)用的變遷。Javascript先天就缺乏一項(xiàng)功能:模塊,而CommonJS規(guī)范的出現(xiàn)則彌補(bǔ)了這一缺陷。本文將介紹CommonJS規(guī)范及Node的模塊機(jī)制。

在其他高級(jí)語(yǔ)言中,Java有類文件,Python有import機(jī)制,PHP有include和require。而JS通過(guò)<script>標(biāo)簽引入代碼的方式顯得雜亂無(wú)章。過(guò)去人們不得不用命名空間等方式來(lái)人為地約束代碼,直到CommonJS規(guī)范的出現(xiàn),前后端的Javascript才得以實(shí)現(xiàn)大一統(tǒng)。Node借鑒了CommonJS的Modules規(guī)范實(shí)現(xiàn)了一套非常易用的模塊系統(tǒng)。

1. CommonJS模塊規(guī)范

CommonJS的模塊規(guī)范分為3個(gè)部分:

1).模塊引用:通過(guò)require()方法并傳入一個(gè)模塊標(biāo)識(shí)來(lái)引入一個(gè)模塊的API到當(dāng)前上下文中,如var math = require('math');
2).模塊定義:通過(guò)exports對(duì)象來(lái)導(dǎo)出當(dāng)前模塊的方法或變量。模塊中還存在一個(gè)module對(duì)象,exports實(shí)際上是module的屬性。在Node中,一個(gè)文件就是一個(gè)模塊,模塊內(nèi)的“全局變量”對(duì)外都不可見(jiàn),只有掛載在exports上的屬性才是公開(kāi)的,如exports.add = function() {}; exports.PI = 3.1415926;
3).模塊標(biāo)識(shí):實(shí)際上就是傳遞給require()的參數(shù),如上述的'math',它必須是符合camel命名法的字符串,或者是以“.”“..”開(kāi)頭的相對(duì)路徑或絕對(duì)路徑,它可以沒(méi)有文件名后綴“.js”

2. Node模塊實(shí)現(xiàn)過(guò)程

在Node中,模塊分為兩類:一類是Node本身提供的核心模塊,另一類是用戶自己編寫(xiě)的文件模塊。核心模塊有一部分在Node源代碼的編譯過(guò)程中,編譯成了二進(jìn)制文件,在Node啟動(dòng)時(shí)核心模塊就被直接加載進(jìn)內(nèi)存中,所以它的加載速度是最快的。文件模塊則是在運(yùn)行時(shí)動(dòng)態(tài)加載,需要經(jīng)歷三個(gè)步驟:路徑分析,文件定位,編譯執(zhí)行。注意,Node對(duì)引入過(guò)的模塊都會(huì)進(jìn)行緩存,以減少二次引入時(shí)的開(kāi)銷(xiāo),并對(duì)相同模塊的二次加載都采用最優(yōu)先從緩存加載的策略。

2.1 路徑分析

路徑分析主要分析上述提到的模塊標(biāo)識(shí)符,主要分為以下幾類:

1)、核心模塊,如http、fs、path等
2)、.或..開(kāi)始的相對(duì)路徑文件模塊
3)、以/開(kāi)始的絕對(duì)路徑文件模塊
4)、自定義文件模塊,可能是一個(gè)文件或包的形式。Node會(huì)根據(jù)模塊路徑數(shù)組module.paths來(lái)逐個(gè)嘗試查找目標(biāo)文件,通常是沿著當(dāng)前目錄逐級(jí)向上直到根目錄查找名為node_modules的目錄,所以這是查找最費(fèi)時(shí)的一種方式。

2.2 文件定位

在路徑分析的基礎(chǔ)上,文件定位需要注意如下細(xì)節(jié):

1)、文件擴(kuò)展名分析:由于CommonJS規(guī)范允許模塊標(biāo)識(shí)不填寫(xiě)擴(kuò)展名,Node會(huì)按.js、.json、.node的次序不足擴(kuò)展名,依次嘗試
2)、目錄分析和包:若通過(guò)上述文件擴(kuò)展名分析后沒(méi)有查找到對(duì)應(yīng)文件,卻得到一個(gè)目錄,Node會(huì)把目錄當(dāng)做一個(gè)包來(lái)處理

2.3 編譯執(zhí)行

定位到具體文件后,Node會(huì)新建一個(gè)模塊對(duì)象,根據(jù)路徑載入并編譯。對(duì)于不同的擴(kuò)展名,載入方法有所不同:

1)、.js文件:通過(guò)fs模塊同步讀取文件并編譯執(zhí)行
2)、.node文件:這是用C/C++編寫(xiě)的擴(kuò)展文件,通過(guò)dlopen()方法加載
3)、.json文件:通過(guò)fs模塊同步讀取文件,用JSON.parse()解析返回結(jié)果
4)、其余擴(kuò)展名文件:都被當(dāng)做.js文件載入

我們知道每個(gè)模塊文件中默認(rèn)都存在著require、exports、module這3個(gè)變量,甚至在Node的API文檔中,我們知道每個(gè)模塊還有filename、dirname這2個(gè)變量的存在,它們是從何而來(lái)的呢?Node的模塊又是怎么做到聲明的“全局變量”實(shí)際上是不會(huì)污染到其他模塊的?事實(shí)上,Node在編譯JS模塊過(guò)程中會(huì)對(duì)文件內(nèi)容進(jìn)行頭尾包裝。下面是一個(gè)JS文件經(jīng)過(guò)頭尾包裝的例子:

復(fù)制代碼 代碼如下:

(function(exports, require, module, __filename, __dirname) {
    /* 中間是JS文件的實(shí)際內(nèi)容 */
    var math = require('math');
    exports.area = function(radius) {
        return Math.PI * radius * radius;
    };
    /* JS文件的實(shí)際內(nèi)容結(jié)束 */
});

這樣每個(gè)模塊文件之間都進(jìn)行了作用域隔離,同時(shí)require、exports、module等變量也被注入到了模塊的上下文當(dāng)中。這就是Node對(duì)CommonJS模塊規(guī)范的實(shí)現(xiàn)。關(guān)于C/C++模塊及Node核心模塊的編譯過(guò)程較為復(fù)雜,不再贅述。

3. 模塊調(diào)用棧

有必要明確一下Node中各種模塊的調(diào)用關(guān)系,如下圖所示:

C/C++內(nèi)建模塊是最底層的模塊,屬于核心模塊,主要提供API給Javascript核心模塊和第三方Javascript文件模塊調(diào)用,實(shí)際中幾乎不會(huì)接觸到此類模塊。Javascript核心模塊主要職責(zé)有兩種:一種是作為C/C++內(nèi)建模塊的封裝層和橋接層供文件模塊調(diào)用,另一種是純粹的功能模塊,不需要跟底層打交道。文件模塊通常由第三方編寫(xiě),包括普通Javascript模塊和C/C++擴(kuò)展模塊。

4. 包與NPM

4.1 包結(jié)構(gòu)

包本質(zhì)上是一個(gè)存檔文件(一般為.zip或.tar.gz),安裝后解壓還原為目錄。CommonJS的包規(guī)范由包結(jié)構(gòu)和包描述文件兩部分組成。一個(gè)完全符合CommonJS規(guī)范的包結(jié)構(gòu)應(yīng)包含以下文件:

1).package.json:包描述文件
2).bin:存放可執(zhí)行二進(jìn)制文件的目錄
3).lib:存放Javascript代碼的目錄
4).doc:存放文檔的目錄
5).test:存放單元測(cè)試用例的目錄

4.2 包描述文件

包描述文件是一個(gè)JSON文件——package.json,位于包的根目錄下,是包的重要組成部分,用于描述包的概況信息。后面要提到的NPM的所有行為都與這個(gè)文件的字段息息相關(guān)。下面將以知名Web框架express項(xiàng)目的package.json文件為例說(shuō)明一些常用字段的含義。

1).name:包名
2).description:包簡(jiǎn)介
3).version:版本號(hào),需遵照“語(yǔ)義化的版本控制”,參照http://semver.org/
4).dependencies:使用當(dāng)前包所需要依賴的包列表。這個(gè)屬性十分重要,NPM會(huì)通過(guò)這個(gè)屬性自動(dòng)加載依賴的包
5).repositories:托管源代碼的位置列表

其余字段的用法可以參照NPM package.json說(shuō)明

4.3 NPM常用功能

NPM(node package manager),通常稱為node包管理器。它的主要功能就是管理node包,包括:安裝、卸載、更新、查看、搜索、發(fā)布等。

4.3.1 NPM包安裝

Node包的安裝分兩種:本地安裝、全局安裝。兩者的區(qū)別如下:

1).本地安裝npm install <package-name>:package會(huì)被下載到當(dāng)前所在目錄,也只能在當(dāng)前目錄下使用。
2).全局安裝npm install -g <package-name>:package會(huì)被下載到到特定的系統(tǒng)目錄下,安裝的package能夠在所有目錄下使用。

4.3.2 NPM包管理

下面以grunt-cli(grunt命令行工具)為例,列出常用的包管理命令:

1).npm install:安裝package.json文件的dependencies和devDependencies字段聲明的所有包
2).npm install grunt-cli@0.1.9:安裝特定版本的grunt-cli
3).npm install grunt-contrib-copy --save:安裝grunt-contrib-copy,同時(shí)保存該依賴到package.json文件
4).npm uninstall grunt-cli:卸載包
5).npm list:查看安裝了哪些包
6).npm publish <folder>:發(fā)布包

相關(guān)文章

  • Node.js如何快速導(dǎo)出多表頭的excel文件實(shí)現(xiàn)方法

    Node.js如何快速導(dǎo)出多表頭的excel文件實(shí)現(xiàn)方法

    這篇文章主要為大家介紹了Node.js如何快速導(dǎo)出多表頭的excel文件實(shí)現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • MQTT Client實(shí)現(xiàn)消息推送功能的方法詳解

    MQTT Client實(shí)現(xiàn)消息推送功能的方法詳解

    這篇文章主要介紹了MQTT Client實(shí)現(xiàn)消息推送功能的方法,結(jié)合實(shí)例形式詳細(xì)分析了MQTT Client實(shí)現(xiàn)消息推送的基本原理、實(shí)現(xiàn)方法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2023-05-05
  • Nodejs中解決cluster模塊的多進(jìn)程如何共享數(shù)據(jù)問(wèn)題

    Nodejs中解決cluster模塊的多進(jìn)程如何共享數(shù)據(jù)問(wèn)題

    本篇文章主要介紹了Nodejs中解決cluster模塊的多進(jìn)程如何共享數(shù)據(jù)問(wèn)題,有需要的可以了解一下。
    2016-11-11
  • node.js中process進(jìn)程的概念和child_process子進(jìn)程模塊的使用方法示例

    node.js中process進(jìn)程的概念和child_process子進(jìn)程模塊的使用方法示例

    這篇文章主要介紹了node.js中process進(jìn)程的概念和child_process子進(jìn)程模塊的使用方法,結(jié)合實(shí)例形式分析了node.js中process進(jìn)程和child_process子進(jìn)程模塊相關(guān)概念、原理、使用方法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • 在Node.js中處理Promise中錯(cuò)誤的示例代碼

    在Node.js中處理Promise中錯(cuò)誤的示例代碼

    在現(xiàn)代JavaScript開(kāi)發(fā)中,尤其在Node.js環(huán)境中,Promise已成為處理異步操作的重要方式,然而,Promise的錯(cuò)誤處理卻常常讓開(kāi)發(fā)者感到困惑,在這篇文章中,我們將深入探討如何在Node.js中處理Promise中的錯(cuò)誤,提供多個(gè)示例代碼,以便于理解和實(shí)踐,需要的朋友可以參考下
    2024-09-09
  • Node.js API詳解之 readline模塊用法詳解

    Node.js API詳解之 readline模塊用法詳解

    這篇文章主要介紹了Node.js API詳解之 readline模塊用法,結(jié)合實(shí)例形式詳細(xì)分析了Node.js API中readline模塊基本函數(shù)、功能、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-05-05
  • node.js express捕獲全局異常的三種方法實(shí)例分析

    node.js express捕獲全局異常的三種方法實(shí)例分析

    這篇文章主要介紹了node.js express捕獲全局異常的三種方法,結(jié)合實(shí)例形式簡(jiǎn)單分析了node.js express捕獲全局異常的常見(jiàn)操作方法與使用注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • Node對(duì)CommonJS的模塊規(guī)范

    Node對(duì)CommonJS的模塊規(guī)范

    這篇文章主要介紹了Node對(duì)CommonJS的模塊規(guī)范,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • npm安裝慢的問(wèn)題分析及解決方法

    npm安裝慢的問(wèn)題分析及解決方法

    在Node.js開(kāi)發(fā)過(guò)程中,npm install 是安裝和管理項(xiàng)目依賴的關(guān)鍵命令,然而,有時(shí)我們會(huì)遇到 npm install 運(yùn)行卡住不動(dòng)的情況,所以本文給大家介紹了npm安裝慢的問(wèn)題分析及解決方法,需要的朋友可以參考下
    2025-03-03
  • node.js中的fs.open方法使用說(shuō)明

    node.js中的fs.open方法使用說(shuō)明

    這篇文章主要介紹了node.js中的fs.open方法使用說(shuō)明,本文介紹了fs.open方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12

最新評(píng)論

鹤庆县| 肥西县| 洪雅县| 大竹县| 乌拉特前旗| 遂川县| 唐海县| 当涂县| 胶州市| 康乐县| 乌兰县| 贞丰县| 昌宁县| 银川市| 绍兴县| 阜新市| 和平区| 阳春市| 肃北| 嘉峪关市| 溧水县| 万年县| 临颍县| 即墨市| 涞水县| 黄山市| 柳河县| 郧西县| 台北县| 柳河县| 三原县| 柳林县| 杭锦旗| 三原县| 五寨县| 得荣县| 凤翔县| 饶阳县| 安吉县| 绥芬河市| 武乡县|