什么是nodejs里的模塊?
我們寫程序的時候一般會把比較復雜而又低耦合的代碼會封裝到一起,nodejs也不例外。nodejs里的模塊包括內部的模塊,如我們前面使用的http、fs、querystring等等;第三方npm模塊,這部分可以用npm命令進行安裝,安裝到項目下的node_modules目錄下,此部分的模塊和業務不相關;我們自己的和業務相關的模塊,此部分可以封裝到項目目錄里面。
如何創建一個模塊
最簡單的模塊就是直接引用一個js文件。我們直接在項目根目錄下創建一個a.js文件,只寫一個打印語句:
console.log("這是a.js模塊")
在入口test.js文件引入:
require("./a"); // “./a”指是的控制臺目錄下的a.js文件(我們控制臺是在項目根目錄下啟動的)
執行后我們可以發現a.js里面的代碼被執行了。
如何暴露模塊的接口
我們知道一個模塊肯定是要向外暴露一下接口來給外部調用的,暴露接口使用exports關鍵詞,新建一個b.js向外暴露m、n變量和一個fun方法:
exports.m = 10;
exports.n = 100;
exports.fun = function(){
console.log("這是b.js模塊中的函數");
};
在test.js中去引用:
require("./a");
var b = require("./b");
console.log("m="+b.m);
console.log("n="+b.n);
b.fun();
模塊暴露一個類(整個模塊就暴露一個類)
nodejs默認會暴露一個空的類,此時會接收所有的exports暴露的東西,但一但module.exports接收了屬性、方法或者類之后所有的exports暴露的東西都無效了。
我們新建一個ClassC.js:
function ClassC(x,y,z){
this.x = x;
this.y = y;
this.z = z;
}
ClassC.prototype.fun = function() { // 向ClassC添加一個fun函數
console.log("這是ClassC.js模塊中的fun函數: x="+this.x+" y="+this.y+" z="+this.z);
};
module.exports = ClassC;
在text.js中引入:
require("./a");
var b = require("./b");
var ClassC = require("./ClassC");
console.log("m="+b.m);
console.log("n="+b.n);
b.fun();
// 這里的ClassC不是模塊暴露的ClassC也不是模塊文件名ClassC
// 而是引包時定義的var ClassC,這里只是約定俗成的使用模塊名作為變量名
var classC = new ClassC(1,2,3);
classC.fun();
多個文件打包成一個模塊
通常我們一個模塊會包含很多文件,如果直接散列在項目中,那畫面一定很美。我們可以創建一個文件夾m,在m文件夾里面新建一個index.js,在index.js中暴露接口,外部只需引入m文件夾nodejs會自動的引入m文件夾里面的index.js
function M(){
}
M.prototype.fun = function() { // 向ClassC添加一個fun函數
console.log("這是M模塊中的fun函數");
};
module.exports = M;
require("./a");
var b = require("./b");
var ClassC = require("./ClassC");
var M = require("./M");
console.log("m="+b.m);
console.log("n="+b.n);
b.fun();
// 這里的ClassC不是模塊暴露的ClassC也不是模塊文件名ClassC
// 而是引包時定義的var ClassC,這里只是約定俗成的使用模塊名作為變量名
var classC = new ClassC(1,2,3);
classC.fun();
var m = new M();
m.fun();
此時你可能會問,那如果我現在在根目錄下再創建一個m.js模塊呢?此時require("./M")引入的會是m.js,js文件優先級高于文件夾(大小寫不銘感)。
直接暴露一個函數
使用module.exports直接暴露一個函數,在引入模塊后可以直接加括號傳參,不需要加“.”:
module.exports = function(a,b){
...
}
// 使用
var fun = require("./xxx"); // 引入上面的模塊
fun(1,2); // 可以直接當成函數直接調用
源碼
如何下載使用第三方的npm模塊
npm(nodejs package management)是隨nodejs一起安裝的包管理器,原先是nodejs愛好者搭建的,后來被nodejs收錄。我們可以在npm官網下載或發布模塊。
在代碼中只需要使用“npm install 模塊名”命令就能下載npm上的模塊,下載后會放在項目目錄下的node_modules目錄中(npm官網可能會比較慢,可以使用淘寶鏡像安裝)。
引用node_modules目錄下的模塊不需要加模塊路徑,node_modules目錄可以在項目目錄中的任意一個父路徑中(逐級往上查找)。
項目依賴
可能你有發現,有些目錄廈門有一個package.json文件,這個文件是標明了當前項目(當前目錄)的屬性和依賴的模塊。如果沒有這個文件可以使用npm init命令來創建一個package.json文件(如果不需要修改直接一路回車即可),創建這個文件的好處是在文件中注明依賴之后項目遷移不需要打包node_modules文件夾(這個一般比較大),遷移后只需要使用npm install來安裝即可,npm會自動下載項目中的依賴模塊(依賴的依賴也會下載)。如:
{
"name": "icebreak",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node ./bin/www"
},
"dependencies": {
"body-parser": "~1.17.1",
"cookie-parser": "~1.4.3",
"debug": "~2.6.3",
"ejs": "~2.5.6",
"express": "~4.15.2",
"morgan": "~1.8.1",
"serve-favicon": "~2.4.2"
}
}
具體的項表示的意思可以參考官方文檔是說明。
在安裝npm包的時候加上“-save”(npm install 模塊名 -save)會自動在package.json加上依賴。
全局安裝
npm全局安裝的一般是命令行工具,在安裝時加上-g(npm install 模塊名 -g)。
如grunt、webpack、gulp、less等等,這些工具一般不需要跟隨項目,但也可以作為項目的開發工具依賴(devDependencies)。
使用npm root -g可以查看全局安裝的路徑。
一些npm命令
npm install:安裝所有依賴
npm install 模塊名:安裝
npm uninstall 模塊名:卸載
npm update 模塊名:更新
npm publish 模塊名:發布到npm