require函数的大致执行细节
- 把传入的fileName转化为绝对路径(fileName可以是绝对路径,相对路径,后缀名可以省略,可以是路径)
- 判断是否该模块已有缓存,有缓存则返回缓存;没有则进入下一步
- 读取文件内容
- 创建运行函数,函数体即为文件内容(模块会在函数环境运行)
- 创建模块结构module对象
- 运行函数,绑定this为module.exports并传入module对象与其他参数
- 缓存模块
- 返回module.exports
| require("./module") |
| function require(fileName){ |
| |
| ... |
| const fileName =' D:\\test\\src\\myModule.js' |
| |
| |
| if(require.cache[path]) return require.cache[path] |
| |
| |
| const context = ... |
| |
| |
| function __temp(module, exports, require, __dirname, __filename){ |
| context |
| } |
| |
| |
| const PATH = require('path') |
| const module = { |
| exports: {}, |
| path: PATH.dirname(fileName), |
| fileName, |
| ... |
| } |
| const exports = module.exports |
| |
| |
| __temp.call(module.exports, module, exports, require, module.path, module.fileName) |
| |
| |
| require.cache[path]= module |
| |
| |
| return module.exports |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构