nodeJS---模組與npm包管理工具
一:從模組外部訪問另一個模組內的成員;
假如我現在還在D盤中的node資料夾內中的app.js程式碼改成如下:
var msg = 'hello';
var funName = function(){
return 1;
}
exports.msg = msg;
exports.funName = funName;
使用exports物件將模組中的成員對外可以訪問,之後我在同目錄下新建app2.js,來呼叫app.js內的成員msg和funName函式,如下程式碼:
var foo = require('./app');
console.log(foo.msg);
console.log(foo.funName());
執行如下所示:
即可看出可以在模組A內呼叫模組B的成員,只需要使用exports物件即可。
那麼現在假如模組是一個類的話(在javascript叫建構函式),比如現在app.js程式碼改成如下的:
function App(name,age){ this.name = name; this.age = age; } App.prototype = { setName: function(name){ this.name = name; }, getName: function(){ return this.name; } } exports.App = App;
還是使用exports.App匯出類的話,就會報錯,我們現在在app2.js呼叫如下:
var foo = require('./app'); var myFoo = new foo("longen",'28'); console.log(myFoo.getName());
就會報錯,如下所示:
但是呢 如果我們在app.js內使用module.exports匯出的話。就ok了,exports是module的一個屬性。app.js程式碼改成如下:
function App(name,age){ this.name = name; this.age = age; } App.prototype = { setName: function(name){ this.name = name; }, getName: function(){ return this.name; } } module.exports = App;
接著執行app2.js程式碼如下所示:
可以執行了;
二:組織與管理模組
如何載入一個模組的基本知識點,這裡先略,如果想要更詳細的瞭解的話,可以看看樸靈寫的深入淺出的nodejs,那邊書的理論很詳細;
1. 模組物件的屬性
在模組檔案內部,可以訪問當前模組的如下所示的一些屬性;
module.id: 屬性值為當前模組的ID。在預設情況下,主模組的ID屬性值為”.” 其他模組的ID屬性值為該模組檔案的絕對路徑,在模組檔案中可以修改當前模組的ID屬性值。
如下app.js程式碼改成如下:
console.log(module.id);
module.id = "longen2";
console.log(module.id);
在app2.js中呼叫var foo = require('./app'); 然後執行如下:
可以看到module.id改為longen2;
Module.filename: 屬性值為當前模組檔案的檔名;現在我們把foo.js改成如下:console.log(module.filename);
app2.js不變,直接呼叫,執行如下:
module.loaded: 屬性值為布林值,當屬性值為false時表示模組尚未載入完畢,屬性值為true時表示模組載入完畢。下面是app.js改成如下:
console.log(module.loaded);
繼續執行如下所示:
module.parent: 屬性值為當前模組的父模組物件,即呼叫當前模組的模組物件,現在foo.js改為如下:
function App(name,age){ this.name = name; this.age = age; } App.prototype = { setName: function(name){ this.name = name; }, getName: function(){ return this.name; } } module.exports = App; console.log(module.parent);
繼續呼叫app2.js,列印如下:
module.children: 屬性值為一個陣列,其中存放了當前模組的所有子模組物件,即當前模組中已載入的所有模組物件。如上圖所示
三:包與npm包管理工具。
在nodejs中,可以通過包來對一組具有相互依賴關係的模組進行統一管理。一個包其實就是一個目錄,其中包含了用於對包進行描述的JSON格式的package.json檔案,在一個包中,通常包含如下所示的內容:
1) 在包的根目錄存放package.json檔案。
2) 在bin子目錄中存放二進位制檔案。
3) 在lib子目錄中存放javascript檔案。
4) 在doc子目錄存放對包和包的使用方法進行說明的文件。
5) 在test子目錄中存放一些對包進行單元測試的測試用例。
在一個package.json檔案中,一個package.json檔案中通常應該包含如下欄位,下面分別對這些欄位進行說明如下:
1) name, 包名。包名是唯一的,由小寫字母,數字和下劃線組成,不能包含空格。
2) preferglobal, 是否支援全域性安裝。欄位值為true是支援全域性安裝,為false時不支援全域性安裝。
3) description, 包說明。對包進行簡要概述.
4) vrsion, 版本號。
5) author 作者資訊陣列。每個陣列元素中可包含name(作者姓名)欄位,email(作者e-mail),web(作者網址)欄位。
6) maintainers, 包維護者資訊陣列。每個陣列元素中可包含name(包維護者的姓名)欄位,email(包維護者Email)欄位,web(包維護者的網址)欄位。
7) bugs, bug的提交地址,可以是網址或電子郵件。
8) licenses. 許可證陣列。每個元素要包含type(許可證名稱)和url(連結到許可證文字的地址)欄位。
9) repository, 倉庫託管地址陣列。每個元素要包含type(倉庫型別,如Git),url(倉庫地址)和path(相對於倉庫的路徑,可選)欄位。
10)keywords, 關鍵字陣列,通常用於搜尋。
11)dependencies, 本包所依賴的包。是一個關聯的陣列,有包名和版本號組成。
下面我們來看看如何在專案的根目錄下建立一個package.json,當然我們可以手動建立package.json,我們也可以進入我們的專案的根目錄後,使用命令視窗來建立,如下我現在還是使用我們node資料夾作為包目錄。下面我們先進入node包內,然後執行 命令 npm init;
之後在我node目錄下生成一個package.json,內容如下:
{ "name": "bag", "version": "0.0.1", "description": "\"A simple demo\"", "main": "app.js", "scripts": { "test": "\"a demo\"" }, "repository": { "type": "git", "url": "https:github.com/tugenhua0707" }, "keywords": [ "[\"longen\"]" ], "author": "longen", "license": "BAT" }
當然還有一些依賴包,我們需要的時候可以手動加進去。
現在我們先來看看如何釋出包了;
一:我們在F盤目錄下新建一個包名為publicbag,包名儘量不要取名和node或者javascript有關的名字,然後把app.js和package.json複製到該資料夾內,package中的包名改成 publicbag了;現在我們先進入包publicbag內 執行命令安裝express依賴包,需要生成node_module目錄;如下:
npm install express
就在publicbag包內生存檔案node_module檔案了,如下:
我們也可以全域性安裝,如下:
npm install express –g
可以看到如上的路徑,安裝到npm的路徑下了。
一:下面我們可以來看看如何使用npm打包釋出nodejs程式包了;
- 首先在npmjs.org註冊一個賬號,如下:
2. 通過npm adduser來註冊新賬號或登入老賬號:
如下所示:
3. 通過命令 npm publish . 釋出包了,如下所示:
我們可以登入npm檢視已經發布的包,如下:
可以看到publicbag是我們剛剛釋出的包~。
二:如何下載我們剛剛釋出的包?
下面我們還是進入F盤後,新建資料夾loadBag檔案,然後進入命令列視窗後,進入loadBag檔案內,使用命令 npm install publicbag 即可把publicbag包下載到loadBag檔案內,如下所示:
然後在loadBag檔案內生存包publicbag,如下所示:
當然我們也可以全域性下載安裝;npm install publicbag –g 如下:
就自動下載到我們npm安裝包路徑下了;
npm 包管理工具;
在node.js中,提供了一個npm包管理工具,該管理工具可用第三方網站上下載node.js包。我們可以在命令列中,通過不同的命令輸入以執行npm包管理工具中的各種功能。
- 可以通過如下所示的命令來解除安裝命令列提示視窗當前目錄下安裝的某個包:
npm uninstall <包名>
2. 可以通過如下所示的命令來解除安裝Node.js的全域性包的安裝路徑下的安裝的某個包。
npm uninstall -g <包名>
3. 可以通過如下所示的命令來更新命令列提示視窗當前目錄下安裝的某個包。
npm update <包名>
4. 可以通過如下所示的命令來更新Node.js的全域性包的安裝路徑下安裝的某個包。
npm update –g <包名>
5. 可以通過如下所示的命令來更新命令列提示視窗當前目錄下安裝的所有包。
npm update
6. 可以通過如下所示的命令來更新Node.js的全域性包的安裝路徑下安裝所有包。
npm update -g