模塊化
基本概念
在nodejs中,應用由模塊組成,nodejs中採用commonJS模塊規範。
- 一個js文件就是一個模塊
- 每個模塊都是一個獨立的作用域,在這個而文件中定義的變量、函數、對象都是私有的,對其他文件不可見,引入後會報錯。
node中模塊分類
- 1 核心模塊
- 由 node 本身提供,不需要通過npm安裝,可直接引入使用
- 2 第三方模塊
- 由社區或個人提供,需要通過npm安裝後使用
- 3 自定義模塊
- 由我們自己創建,比如:tool.js 、 user.js
核心模塊
常見的核心模塊有:
- fs:文件操作模塊
- http:網絡操作模塊
- path:路徑操作模塊
- url: 解析地址的模塊
- querystring: 解析參數字符串的模塊
- 基本使用:1 先引入 2 再使用
// 引入fs模塊
const fs = require('fs');
第三方模塊
- 第三方模塊是由社區或個人提供的
- 比如:mime模塊/art-template/jquery…
- 基本使用:1 先通過npm下載 2 再引入 3 最後使用
用戶自定義模塊
- 由開發人員創建的模塊(JS文件)
- 基本使用:1 創建模塊 2 引入模塊
- 注意:自定義模塊的路徑必須以
./
獲取../
開頭,不然會被當做核心模塊或者第三方模塊引入
// 加載自定義模塊
require('./a') // 推薦使用,省略.js後綴!
require('./a.js') //不省略.js後綴
模塊的導入與導出
模塊導入
- 通過
require("fs")
來加載模塊 - 如果是第三方模塊,需要先使用npm進行下載
- 如果是自定義模塊,需要加上相對路徑
./
或者../
,可以省略.js
後綴,如果文件名是index.js
那麼index.js也可以省略。 - 模塊可以被多次引入,但是只會在第一次加載
模塊導出
- 在模塊的內部,
module
變量代表的就是當前模塊,它的exports
屬性就是對外的接口,加載某個模塊,加載的就是module.exports
屬性,這個屬性指向一個空的對象。
//module.exports指向的是一個對象,我們給對象增加屬性即可。
module.exports.num = 123;
module.exports.age = 18;
//通過module.exports也可以導出一個值或者函數,但是多次導出會覆蓋
module.exports = '123';
module.exports = "abc";
module.exports與exports
exports
是module.exports
的引用- 注意:給
module.exports
賦值會切斷與exports
之間的聯繫- 1 直接添加屬性兩者皆可
- 2 賦值操作時,只能使用
module.exports
console.log( module.exports === exports ) // ==> true
// 等價操作
module.exports.num = 123
exports.num = 123
// 賦值操作:不要使用 exports = {}
module.exports = {}
模塊查找規則
核心模塊
- 直接去node安裝包中找
第三方模塊(以mime包爲例)
- 先基於當前文件模塊所屬目錄找 node_modules 目錄
- 如果找到,則去該目錄中找 mime 目錄
- 如果找到 mime 目錄,則找該目錄中的 package.json 文件
- 如果找到 package.json 文件,則找該文件中的 main 屬性
- 如果找到 main 屬性,則拿到該屬性對應的文件路徑
- 如果找到 mime 目錄之後
- 發現沒有 package.json
- 或者 有 package.json 沒有 main 屬性
- 或者 有 main 屬性,但是指向的路徑不存在
- 則 node 會默認去看一下 mime 目錄中有沒有 index.js index.node index.json 文件
- 如果找不到 index 或者找不到 mime 或者找不到 node_modules
- 則進入上一級目錄找 node_moudles 查找規則同上
- 如果上一級還找不到,繼續向上,一直到當前文件所屬磁盤根目錄
- 如果最後到磁盤根目錄還找不到,最後報錯:
can not find module xxx
自定義模塊
- 直接相對於當前文件去找