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

資訊專欄INFORMATION COLUMN

Node.js入門:模塊機制

alanoddsoff / 2356人閱讀

摘要:模塊載入策略的模塊分為兩類,一類為原生核心模塊,一類為文件模塊。最后傳入對象的,方法,,文件名,目錄名作為實參并執行。在這個主文件中,可以通過方法去引入其余的模塊。以上所描述的模塊載入機制均定義在中。

CommonJS規范?

早在Netscape誕生不久后,JavaScript就一直在探索本地編程的路,Rhino是其代表產物。無奈那時服務端JavaScript走的路均是參考眾多服務器端語言來實現的,在這樣的背景之下,一沒有特色,二沒有實用價值。但是隨著JavaScript在前端的應用越來越廣泛,以及服務端JavaScript的推動,JavaScript現有的規范十分薄弱,不利于JavaScript大規模的應用。那些以JavaScript為宿主語言的環境中,只有本身的基礎原生對象和類型,更多的對象和API都取決于宿主的提供,所以,我們可以看到JavaScript缺少這些功能:

JavaScript沒有模塊系統。沒有原生的支持密閉作用域或依賴管理。?

JavaScript沒有標準庫。除了一些核心庫外,沒有文件系統的API,沒有IO流API等。?

JavaScript沒有標準接口。沒有如Web Server或者數據庫的統一接口。?

JavaScript沒有包管理系統。不能自動加載和安裝依賴。?

于是便有了CommonJS(http://www.commonjs.org)規范的出現,其目標是為了構建JavaScript在包括Web服務器,桌面,命令行工具,及瀏覽器方面的生態系統。CommonJS制定了解決這些問題的一些規范,而Node.js就是這些規范的一種實現。Node.js自身實現了require方法作為其引入模塊的方法,同時NPM也基于CommonJS定義的包規范,實現了依賴管理和模塊自動安裝等功能。這里我們將深入一下Node.js的require機制和NPM基于包規范的應用。

簡單模塊定義和使用

在Node.js中,定義一個模塊十分方便。我們以計算圓形的面積和周長兩個方法為例,來表現Node.js中模塊的定義方式。

1 var PI = Math.PI; 
2 exports.area = function (r) { 
3  return PI * r * r; 
4 }; 
5 exports.circumference = function (r) {
 6  return 2 * PI * r; 
7 };
}//歡迎加入全棧開發交流圈一起學習交流:582735936 ]//面向1-3年前端人員 } //幫助突破技術瓶頸,提升思維能力

將這個文件存為circle.js,并新建一個app.js文件,并寫入以下代碼:

1 var circle = require("./circle.js"); 
2 console.log( "The area of a circle of radius 
3 is " + circle.area(
4));

可以看到模塊調用也十分方便,只需要require需要調用的文件即可。

在require了這個文件之后,定義在exports對象上的方法便可以隨意調用。Node.js將模塊的定義和調用都封裝得極其簡單方便,從API對用戶友好這一個角度來說,Node.js的模塊機制是非常優秀的。

模塊載入策略

Node.js的模塊分為兩類,一類為原生(核心)模塊,一類為文件模塊。原生模塊在Node.js源代碼編譯的時候編譯進了二進制執行文件,加載的速度最快。另一類文件模塊是動態加載的,加載速度比原生模塊慢。但是Node.js對原生模塊和文件模塊都進行了緩存,于是在第二次require時,是不會有重復開銷的。其中原生模塊都被定義在lib這個目錄下面,文件模塊則不定性。

node app.js

由于通過命令行加載啟動的文件幾乎都為文件模塊。我們從Node.js如何加載文件模塊開始談起。加載文件模塊的工作,主要由原生模塊module來實現和完成,該原生模塊在啟動時已經被加載,進程直接調用到runMain靜態方法。

1 // bootstrap main module. 
2 Module.runMain = function () {
 3     // Load the main module--the command line argument. 
4     Module._load(process.argv[1], null, true); 5 };

_load靜態方法在分析文件名之后執行

var module = new Module(id, parent);

并根據文件路徑緩存當前模塊對象,該模塊實例對象則根據文件名加載。

module.load(filename);

實際上在文件模塊中,又分為3類模塊。這三類文件模塊以后綴來區分,Node.js會根據后綴名來決定加載方法。

.js。通過fs模塊同步讀取js文件并編譯執行。?

.node。通過C/C++進行編寫的Addon。通過dlopen方法進行加載。?

.json。讀取文件,調用JSON.parse解析加載。

這里我們將詳細描述js后綴的編譯過程。Node.js在編譯js文件的過程中實際完成的步驟有對js文件內容進行頭尾包裝。

以app.js為例,包裝之后的app.js將會變成以下形式:

1 (function (exports, require, module, __filename, __dirname) { 
2     var circle = require("./circle.js"); 
3     console.log("The area of a circle of radius
 4 is " + circle.area(4)); 4 });

這段代碼會通過vm原生模塊的runInThisContext方法執行(類似eval,只是具有明確上下文,不污染全局),返回為一個具體的function對象。最后傳入module對象的exports,require方法,module,文件名,目錄名作為實參并執行。

這就是為什么require并沒有定義在app.js 文件中,但是這個方法卻存在的原因。從Node.js的API文檔中可以看到還有__filename、__dirname、module、exports幾個沒有定義但是卻存在的變量。其中__filename和__dirname在查找文件路徑的過程中分析得到后傳入的。module變量是這個模塊對象自身,exports是在module的構造函數中初始化的一個空對象({},而不是null)。

在這個主文件中,可以通過require方法去引入其余的模塊。而其實這個require方法實際調用的就是load方法。

load方法在載入、編譯、緩存了module后,返回module的exports對象。這就是circle.js文件中只有定義在exports對象上的方法才能被外部調用的原因。

以上所描述的模塊載入機制均定義在lib/module.js中。

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

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

相關文章

  • Node.js入門模塊機制

    摘要:模塊載入策略的模塊分為兩類,一類為原生核心模塊,一類為文件模塊。最后傳入對象的,方法,,文件名,目錄名作為實參并執行。在這個主文件中,可以通過方法去引入其余的模塊。以上所描述的模塊載入機制均定義在中。 CommonJS規范? 早在Netscape誕生不久后,JavaScript就一直在探索本地編程的路,Rhino是其代表產物。無奈那時服務端JavaScript走的路均是參考眾多服務器端...

    everfight 評論0 收藏0
  • Node.js入門介紹

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

    li21 評論0 收藏0
  • Node.js入門到上線》入門篇 (持續更新中)

    摘要:最近利用空閑時間寫了一個從入門到上線的的實戰教程從入門到上線目前還在更新中,入門篇已基本成型。本項目使用語法,采用搭建了一個博客系統,實現了文章管理用戶登錄注冊權限控制分類管理等功能。實現線上部署左手代碼右手磚拋磚引玉 最近利用空閑時間寫了一個從入門到上線的的node實戰教程《Node.js從入門到上線》A blog build with Koa2. 目前還在更新中,入門篇已基本成型。...

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

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

    Edison 評論0 收藏0

發表評論

0條評論

alanoddsoff

|高級講師

TA的文章

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