require 用來加載一個文件的代碼
簡單概括以下幾點:
- require 可加載 .js、.json 和 .node 后綴的文件
- require 的過程是同步的宴咧,所以這樣是錯誤的:
setTimeout(() => {
module.exports = { a: 'hello' };
}, 0);
require這個文件得到的是一個空對象{}
- require的目錄機制:
- 第一種方式是在根目錄下創(chuàng)建一個 package.json 文件尝江,并指定一個 main 模塊跃捣。 例子近顷,package.json 文件類似:
{ "name" : "app",
"main" : "./lib/app.js" }
如果這是在 ./app 目錄中,則 require('./app') 會試圖加載 ./app/lib/app.js久妆。
這就是 Node.js 處理 package.json 文件的方式。
注意:如果 package.json 中 "main" 入口指定的文件不存在跷睦,則無法解析筷弦,Node.js 會將模塊視為不存在,并拋出默認錯誤:
Error: Cannot find module 'some-library'
-
如果目錄里沒有 package.json 文件抑诸,則 Node.js 就會試圖加載目錄下的 index.js 或 index.node 文件烂琴。如果上面的例子中沒有 package.json 文件,則 require('./app') 會試圖加載:
./app/index.js
./app/index.node
-
require的文件模塊
- 如果按確切的文件名沒有找到模塊蜕乡,則 Node.js 會嘗試帶上 .js奸绷、.json 或 .node 拓展名再加載。
- .js文件會被解析為 JavaScript 文本文件层玲,.json 文件會被解析為 JSON 文本文件号醉。 .node文件會被解析為通過 dlopen加載的編譯后的插件模塊。
- 以 '/'為前綴的模塊是文件的絕對路徑辛块。 例如require('/home/app/app.js')會加載 /home/app/app.js
文件畔派。 - 以 './'為前綴的模塊是相對于調(diào)用 require()的文件的。 也就是說润绵,circle.js必須和 app.js在同一目錄下以便于 require('./circle') 找到它线椰。
- 當(dāng)沒有以 '/'、'./'或 '../' 開頭來表示文件時,這個模塊必須是一個核心模塊或加載自 node_modules 目錄筋讨。如果給定的路徑不存在凡人,則 require()會拋出一個 code屬性為 'MODULE_NOT_FOUND'
的 Error筐骇。
-
require的緩存機制
- 模塊在第一次加載后會被緩存饼齿。 這也意味著(類似其他緩存機制)如果每次調(diào)用 require('app') 都解析到同一文件掺逼,則返回相同的對象慢睡。
- 多次調(diào)用 require('app') 不會導(dǎo)致模塊的代碼被執(zhí)行多次疲恢。 這是一個重要的特性笨蚁。如果想要多次執(zhí)行一個模塊睹晒,可以導(dǎo)出一個函數(shù),然后調(diào)用該函數(shù)括细。
注意事項: - 模塊是基于其解析的文件名進行緩存的伪很。 由于調(diào)用模塊的位置的不同,模塊可能被解析成不同的文件名奋单。
- 此外锉试,在不區(qū)分大小寫的文件系統(tǒng)或操作系統(tǒng)中,被解析成不同的文件名可以指向同一文件览濒,但緩存仍然會將它們視為不同的模塊呆盖,并多次重新加載。 例如贷笛,require('./app') 和 require('./APP') 返回兩個不同的對象应又,而不會管 ./app 和 ./APP 是否是相同的文件。