儒猿互联网Java工程师面试突击(第二季)
const modules = {} // modules 用于缓存所有模块function execute(key) {
// key => index.js/a.js
if (modules[key]) {
return modules[key];
}
var item = depRelation.find(dep => dep.key === key);
var require = (path) => {
// 可能导入了其他的文件,所以需要将 execute 传递出去
// 输入一个文件路径,拿到路径去执行这个文件
return execute(pathToKey(path));
}
modules[key] = {__esModule: true}; // 标识这个模块是 ES 模块 => 自己有 default,不需要添加 default
var module = {exports: modules[key]};
// 执行一个文件的代码,传入导入其他模块的方法(require) + 如何导出自身模块(导出的东西放置在 module.exports 对象中)
item.code(require, module, module.exports); // 调用 code 转化的函数
return modules[key]}