commonjs规范 require 函数解析
function require(modulePath) {
//1.根据传入的模块路径 得到模块完整的绝对路径
const moduleId = getModuleId(modulePath)
//2.判断缓存
if (cache[moduleId]) {
return cache[moduleId]
}
//3.真正运行代码模块的辅助函数
function _require(exports, require, module, __filename, __dirname) {
//目标模块的代码在这里执行
}
//4.准备并运行辅助函数
const module = {
exports:{}
}
const exports = module.exports
//得到模块文件的绝对路径
const __filename = moduleId
const __dirname = getDirname(__filename)
_require.call(exports, exports, require, module, __filename, __dirname)
//5.缓存module.exports
cache[moduleId] = module.exports
//6.返回module.exports
return module.exports
}
getModuleId、getDirname实现细节不必过多关注
模块内代码会放在_require函数内执行,所以可以在代码内直接打印arguments#
console.log(argument)
直接执行node test.js
会有以下输出
arguments [Arguments] {
'0': {},
'1': [Function: require] {
resolve: [Function: resolve] { paths: [Function: paths] },
main: Module {
id: '.',
path: '/Users/whh/Documents/webpack5',
exports: {},
filename: '/Users/whh/Documents/webpack5/test.js',
loaded: false,
children: [],
paths: [Array]
},
extensions: [Object: null prototype] {
'.js': [Function (anonymous)],
'.json': [Function (anonymous)],
'.node': [Function (anonymous)]
},
cache: [Object: null prototype] {
'/Users/whh/Documents/webpack5/test.js': [Module]
}
},
'2': Module {
id: '.',
path: '/Users/whh/Documents/webpack5',
exports: {},
filename: '/Users/whh/Documents/webpack5/test.js',
loaded: false,
children: [],
paths: [
'/Users/whh/Documents/webpack5/node_modules',
'/Users/whh/Documents/node_modules',
'/Users/whh/node_modules',
'/Users/node_modules',
'/node_modules'
]
},
'3': '/Users/whh/Documents/webpack5/test.js',
'4': '/Users/whh/Documents/webpack5'
}
_require函数接受exports, require, module, __filename, __dirname参数#
所以在commonJS规范下 模块内可直接使用require
, module.exports
,exports
,filename
,dirname
_require辅助函数通过.call
执行绑定this
指向exports
#
所以在模块加载执行前 this
,exports
,module.exports
是相等的
console.log(this === exports,this === module.exports)
直接执行node test.js
上面的代码会打印 true true
最终返回的是module.exports
#
所以有一下代码test.js
this.a = 1
exports.b = 2
export = {
c:3
}
module.exports = {
d:4
}
exports.e = 5
this.f = 6
/**
解析 初始 this = exports = module.exports
执行后:
this,
{a:1,b:2,f:6}
export,
{c:3,e:5}
module.exports,
{d:4}
*/
最终在别的模块内引入
const test = require(./test.js)
console.log(test)
输出
{d:4}
作者:whh666
出处:https://www.cnblogs.com/whh666/p/16906076.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2021-11-19 echarts自定义系列