nodejs篇-CommonJS加载模块分析
码农天地 -参考文章:CommonJS规范
分析require 加载模块路径module.exports 导出模块~~~~每个模块都是一个沙箱环境,互不干扰根据文件后缀判断文件处理方式(json,js)编写加载模块 requirefunction myRequire(moduleRelPath){
// 可能是相对路径,需要resolve
path.resolve(__dirname,moduleRelPath);
}
Module 类模块function Module(moduleAbsPath){
this.modulePath = moduleAbsPath;
this.exports = {}
}
拼接执行字符串Module.wrapper = [
"(function(exports,module,require){","})"
]
按文件处理Module.extension = {
".js"(module){},
".json"(module){},
}
加载模块Module.prototype.load = function () {
// 获取文件后缀名
let extname = path.extname(this.modulePath);
// 交给对应方法处理
Module.extension[extname](this);
};
导出function myRequire(id) {
let absPath = path.resolve(__dirname, id);
let module = new Module(absPath);
// 加载模块
module.load();
// 导出
return module.exports;
}
解析文件处理jsonModule._extensions[".json"] = (module)=> {
let str = fs.readFileSync(module.id, "utf-8");
str = JSON.parse(str);
// 取出内容直接绑定到 module.exports
module.exports = str;
}
处理jsconst vm = require("vm");
Module._extensions[".js"] = (module)=> {
let str = fs.readFileSync(module.id, "utf-8");
// 拼接方法
let scriptStr = Module.wrapper[0] + str + Module.wrapper[1];
// 沙箱环境
let fn = vm.runInThisContext(scriptStr);
// 执行并传参
fn.call(module.exports, module.exports, module, myRequire);
}
特别申明:本文内容来源网络,版权归原作者所有,如有侵权请立即与我们联系(cy198701067573@163.com),我们将及时处理。
下一篇: jquey+node跨域