做天貓還是做網(wǎng)站推廣怎么開通百度推廣賬號
模塊化的定義
講一個復(fù)雜的程序文件按照一定的規(guī)則拆分成多個獨(dú)立的小文件,這些小文件就是小模塊,這就是模塊化。
每個小模塊內(nèi)部的數(shù)據(jù)是私有的,可以暴露內(nèi)部數(shù)據(jù)給外部其他模塊使用。
模塊化優(yōu)點(diǎn)
- 減少命名的沖突
- 提高復(fù)用性
- 提高可維護(hù)性
- 按需加載
模塊化使用
1.單個模塊暴露
// index.js
const userObj = require("./user.js");
// 調(diào)用收到的函數(shù) user()
userObj();
// user.js
function user(){console.log("這是用戶信息。");
}
// 對外暴露 user 數(shù)據(jù)
module.exports = user;
2.多個模塊暴露
// index.js
const userObj = require("./user.js");
// 分別使用對外暴露的函數(shù)
userObj.user();
userObj.userInfo();
// user.js
function user(){console.log("這是用戶。");
}
function userInfo(){console.log("這是用戶信息。");
}
// 方式一:對外暴露 user 和 userInfo 數(shù)據(jù)對象
module.exports = {user,userInfo
};
// 方式二:單獨(dú)暴露 user 和 userInfo 數(shù)據(jù)
exports.user = user;
exports.userInfo= userInfo;
暴露數(shù)據(jù)時,不能使用 exports = user 形式暴露,返回的是一個空對象。
exports 和 module.exports 的關(guān)系:exports = module.exports = { }
因為 require() 加載其他模塊的時候,返回結(jié)果的目標(biāo)模塊中 module.exports 的值。
導(dǎo)入模塊注意點(diǎn)
- 導(dǎo)入自己創(chuàng)建的模塊時,使用相對路徑,并且不能省略 ./ 和 …/
// 正確
const userObj = require("./user.js");
// 錯誤
const userObj = require("user.js");
- 導(dǎo)入的模塊文件如果是 .js 或 .json 可以省略后綴
const userObj = require("./user");
如果導(dǎo)入的模塊是其他類型的,默認(rèn)以 js 模塊文件處理(.txt .doc)。
- 導(dǎo)入文件夾
const userObj = require("./module");
如果導(dǎo)入的是文件夾,那么先去找該文件夾下 package.json 文件中的 main 屬性對應(yīng)的路徑文件,如果有此文件,就導(dǎo)入該文件,否則找不到此文件就會報錯。
// ./module/package.json
// 找到后導(dǎo)入
{"main": "./main.js"
}
// 沒有此文件報錯
{"main": "./main2.js"
}
如果 main 屬性找不到,或者 package.json 也找不到,就去該文件夾下找到 index.js 和 index.json 文件,如果找到了這兩個文件就會導(dǎo)入,否則也報錯。
// ./module/index.js
module.exports = "暴露出去的信息"
也就是 package.json 文件中的 main 屬性對應(yīng)的路徑文件 main.js 和 module 文件夾下 index.js 文件其中一個存在即可。
導(dǎo)入模塊的基本流程
- 將相對路徑轉(zhuǎn)為覺得路徑,path.resolve(),定位目標(biāo)文件;
- 緩存檢測,若讀取過文件,從緩存中再次讀取,否則重新讀取;
- 讀取目標(biāo)文件代碼,readFile();
- 包裹一個函數(shù)并自執(zhí)行,通過arguments.callee.toString()查看自執(zhí)行函數(shù);
- 緩存模塊的值,將讀取過得文件進(jìn)行緩存;
- 返回 module.exports 的值。