参考文章:CommonJS规范解析require加载模块路径module.exports导出模块~~~~每个模块都是沙盒环境,互不干扰根据文件后缀判断文件处理方式(json,js)写加载模块requirefunctionmyRequire(moduleRelPath){//可能是相对路径,需要解析path.resolve(__dirname,moduleRelPath);}ModuleclassmodulefunctionModule(moduleAbsPath){this.modulePath=moduleAbsPath;this.exports={}}拼接执行字符串模块。wrapper=["(function(exports,module,require){","})"]按文件处理Module.extension={".js"(module){},".json"(module){},}加载模块Module.prototype.load=function(){//获取文件扩展名letextname=path.extname(this.modulePath);//交给相应的方法处理Module.extension[extname](this);};导出函数myRequire(id){letabsPath=path.resolve(__dirname,id);让模块=新模块(absPath);//加载模块module.load();//exportreturnmodule.exports;}resolvefileprocessingjsonModule._extensions[".json"]=(module)=>{letstr=fs.readFileSync(module.id,"utf-8");str=JSON.parse(str);//取出内容直接绑定module.exportsmodule.exports=str;}处理jsconstvm=require("vm");Module._extensions[".js"]=(module)=>{letstr=fs.readFileSync(module.id,"utf-8");//拼接方式letscriptStr=Module.wrapper[0]+str+Module.wrapper[1];//沙盒环境letfn=vm.runInThisContext(scriptStr);//执行并传递参数fn.call(module.exports,module.exports,module,myRequire);}
