commonJS 是怎么导入和导出的?
众所周知, commonJS 是不支持 TreeShaking 的, 这跟它的导入导出方式有关. 最近看了个视频讲 commonJS 是怎么导出, 浅浅在这写一下. 视频链接
require
在导入的时候其实使用的是 require 函数, 这个函数要传入一个模块路径作为参数.
js
function require(modulePath) {
var moduleId = getModuleId(modulePath);
}
将模块路径转为一个绝对路径, 然后根据这个绝对路径找之前有没有导入过这个模块.
js
if (cache[moduleId]) {
return cache[moduleId];
}
然后是真正的导入函数.
js
_require(exports, require, module, __filename, __dirname) {
// 执行模块里的代码
// ...
}
要调用这个_require
, 需要准备一些参数.
js
var module = {
// 还有其它属性
exports = {},
}
var exports = module.exports
var __filename = moduleId
var __dirname = getDirname(__filename)
调用这个函数
js
_require.call(exports, exports, require, module, __filename, __dirname);
cache[moduleId] = module.exports;
return module.exports;
比较完整的 require
js
function require(modulePath) {
var moduleId = getModuleId(modulePath)
if (cache[moduleId]) {
return cache[moduleId]
}
_require(exports, require, module, __filename, __dirname) {
// 执行模块里的代码
// ...
}
var module = {
// 还有其它属性
exports = {},
}
var exports = module.exports
var __filename = moduleId
var __dirname = getDirname(__filename)
_require.call(exports, exports, require, module, __filename, __dirname)
cache[moduleId] = module.exports
return module.exports
}