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


談到組件,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++第三方模塊的開發與使用。

---未完待續----


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM