test.jsnode
require('x')
複製代碼
node_modules
文件夾下是否存在該模塊,直到根目錄,不然拋出Error('MODULE_NOT_FOUND')LOAD_AS_FILE:json
.js
.json
.node
文件(編譯好的二進制node插件)LOAD_AS_DIR:數組
X/package.json
中的main字段做爲模塊入口文件index.js
index.json
index.node
Module {
id: '.',
exports: {},
parent: null,
filename: '/Users/wl/Sites/myapp/node-learning/src/module/index.js',
loaded: false,
children:
[
Module
{
id: '/Users/wl/Sites/myapp/node-learning/src/module/a.js',
exports: [Object],
parent: [Circular],
filename: '/Users/wl/Sites/myapp/node-learning/src/module/a.js',
loaded: true,
children: [Array],
paths: [Array]
}
],
paths:
[
'/Users/wl/Sites/myapp/node-learning/src/module/node_modules',
'/Users/wl/Sites/myapp/node-learning/src/node_modules',
'/Users/wl/Sites/myapp/node-learning/node_modules',
'/Users/wl/Sites/myapp/node_modules',
'/Users/wl/Sites/node_modules',
'/Users/wl/node_modules',
'/Users/node_modules',
'/node_modules'
]
}
複製代碼
id
模塊id。一般爲模塊文件絕對
路徑,主模塊一般爲.
exports
模塊導出對象。這裏的exports指的是module.exportsparent
父模塊。即被依賴模塊filename
模塊文件名。一般與id
相同loaded
模塊加載狀態。是否已執行完成children
子模塊。即依賴模塊paths
模塊查找路徑數組。主要由如下兩點考慮緩存
注:建議啓用'use strict'模式,防止定義全局變量app
module
, require
有利於實現node模塊化機制(function(exports, require, module, __filename, __dirname) {
// Module code
});
複製代碼
在一個node上下文環境中,兩次require
同一個文件,一般
狀況下返回徹底相同的兩個對象引用。除非用高階函數返回工廠函數。模塊化
因爲node包相互依賴,則較大可能會造成循環引用
,node利用其緩存
機制避免無限循環。好比函數
index.js
ui
const prefix = '主模塊:'
const a = require('./a.js')
console.log(prefix, a) // {a:2}
console.log(prefix, require.main === module)
console.log(module)
複製代碼
a.js
spa
'use strict'
const prefix = 'A模塊:'
module.exports = {a:1}
const b = require('./b.js')
console.log(prefix, b) // {b:1}
module.exports = {a:2}
console.log(prefix, require.main === module)
複製代碼
b.js
插件
const prefix = 'b模塊:'
module.exports = {b:1}
const a = require('./a.js')
console.log(prefix, a) // {a:1}
console.log(prefix, require.main === module)
複製代碼
如上。當b.js引用a.js時,爲避免無限循環,a.js未完成的副本
(我認爲是require('./b.js')以前的全部代碼,可是在官方文檔中未獲得特別確切的表述)導出的對象被b.js引用