Node.JS 模組,包管理與開發

來源:互聯網
上載者:User

談到組件,JavaScript是不具備這個特點的,以前JavaScript很多功能都依賴不同廠商的實現。基本在組件這個方面有如下特點:

      .JavaScript沒有模組系統。沒有原生的支援密閉範圍或依賴管理。

      .JavaScript沒有標準庫。核心庫外,沒有檔案系統的API等,不過Html5規範出來後,這些將會有的:)。

      .JavaScript沒有標準API介面。

      .JavaScript沒有包管理系統。

當有了CommonJS(http://www.commonjs.org)規範的出現,其目標是為了構建JavaScript在包括Web伺服器,案頭,命令列工具,及瀏覽器方面的生態系統。

CommonJS制定瞭解決這些問題的一些規範,而Node.js就是這些規範的一種實現。Node.js自身實現了require方法作為其引入模組的方法,同時NPM也基於CommonJS定義的包規範,實現了依賴管理和模組自動安裝等功能。這裡我們將深入一下Node.js的require機制和NPM基於包規範的應用。

一,Node.JS模組包管理:

    1.編寫及載入使用模組

      在Node.JS中編寫及安裝一個js的模組是很簡單的。

      首先寫編寫一個test.js,內容如下:

     exports.myfunc= function () {
       console.log('hello,world');    

     };

     也可以寫成:

     var myfunc = function () {

       console.log('hello,world');    

     };

     exports.myfunc = myfunc;

     儲存這個檔案就可以在你的別的js代碼裡調用了,在這裡我寫一個app.js內容如下:

     var test = require('./test.js');
     console.log( 'test my function:\n ' + test.myfunc());

    在node.js的命令列中運行:

    node app.js

    你會發現列印出:

     test my function:

     hello world

     分析一下上述的行為,在你用node app.js時,有如下後台動作:

    首先node 用module對象來載入你的app.js.

    然後會把你的js內容進行封裝調用。原來app.js內從變成如下內容:

   (function (exports, require, module, __filename, __dirname) {

     var test = require('./test.js');
        console.log( 'test my function:\n ' + test.myfunc());

   })

  再進行執行。在執行到require('./test.js')時,會按著路徑進行搜尋test.js

  而其實這個require方法實際調用的就是module對象的load方法。load方法在載入、編譯、緩衝了module後,返回module的exports對象。這就是test.js檔案中只有定義在exports對象上的方法才能被外部調用的原因。

 其實require載入模組有一個複雜的邏輯。

 這裡簡單說一下,

  第一種情況。當require中的參數為沒有路徑,沒有檔案尾碼的一個字串時比如require('httpd');

 Node.JS搜尋順序如下:

 a.從緩衝中載入。b.從原生模組載入.c.從檔案載入。從檔案載入也有是很一個順序:

 Node.JS運行一個js程式比如剛才通過node app.js時,module載入時會形成一個當前的有效路徑,這是一個路徑集合。

 首先是當前路徑,然後是當前路徑的父目錄,再是父目錄的父目錄,只到根目錄。

 搜尋模組首先從當前路徑中的node_modules子目錄去尋找,找不到就找這個目錄中的package.json檔案中的main參數指定的目錄,然後就是父目錄的node_modules子目錄,一直找到根目錄,再沒找到。就找NODE_PATH中設定的目錄下去尋找。

  第二種情況:require參數是相對或絕對路徑下的模組名比如 require('./test.js') 或者require('/home/joezhang/nodejs/test')這個不用搜尋直接載入,因為有絕對路徑麻:)

    2.包的安裝:

    Node.JS中的包就是封裝模組的東西。一般情況下我們可以安裝一些包。用npm install來安裝。npm install package-name這樣安裝的是Node.JS包資產庫中的包你可通過如下命令來看這個資產庫伺服器

   $npm config get registry

   當然你也可以更改這個庫$npm config set registry "myregistry.xxx.com" 我在另一篇博文裡描述

   其實你還可以從網路上下載包,解壓後本地安裝這個包

   一般下載解壓後的包是一個目錄,這個目錄確定有一個package.json檔案存在。然後用如下命令安裝:

   npm install package-path 比如: npm install '/home/joezhang/program/mypkg'

  mypkg目錄下有一個符個CommonJS規範的package.json檔案。

 

二,模組開發:

   1.模組分類:

    原生:

    非原生:.js .node .json.

  2.模組開發一般有兩種,一種就是提到過的.js模組的開發,你也可以把這個js檔案模組直接載入到你的項目,也可以先封裝成包的格式,安裝到你的Node.JS全域環境中進行使用。

    js模組的開發,以前都提過。這裡重點是講一下C/C++第三方模組的開發與使用。

---未完待續----

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.