实现简易版commonjs加载阅读代码带着以下问题!节点中的文件是模块?如何执行读取的js文件?exports与module.exports的关系?js中对象之间的引用关系?如何理解一个文件是一个模块?在node中,js代码在引入的时候会被打包成如下函数。是不是只需要在我们的require函数中调用这个函数(当然下面的函数需要我们读取文件内容组装成下面的函数形式),将函数字符串解析成可执行的js,传入参考的参数。module.exports将被分配。然后返回module.exports,会得到需要的模块的内容//(function(exports,module,require){this==module.exports//truemodule.exports='hello';//})module.exportsandexportsexports=module.exportsexports.a='xxx'//一个引用地址,module.exports也会被赋值exports='xxx'//这个时候exports的引用地址是错误的。当获取不到模块的内容时,参数的引用但是我们传递给函数的参数是引用类型的数据。函数执行时,首先执行参数赋值阶段。如果使用引用类型数据,则分配的是引用地址。会出现如下情况vartest={}functionfn(a){a.name='xxx'}fn(test)console.log(test)//{name:'xxx'}代码实现如下constfs=require("fs");constpath=require("path");constvm=require("vm");functionModule(filePath){this.id=filePath;this.exports={};}Module._cache={};Module.fnStr=["(function(module,exports,req,__fileName,__dirname){\n","})"];Module.extensions={".js":function(module){constcontent=fs.readFileSync(module.id,"utf8");constfnString=Module.fnStr[0]+content+Module.fnStr[1];constfn=vm.runInThisContext(fnString);//fileismoduleexports=module.exportsexports其实就是指向的module.exports//函数执行后,传入的module.exports会被赋值。module是另一个对象,函数参数的引用赋值给下面实例化的模块。你可以得到文件的内容fn.call(module.exports,module,module.exports,req,module.id,path.dirname(module.id));},".json":function(module){constjsonString=fs.readFileSync(module.id,"utf8");module.exports=JSON.parse(jsonString);}};Module.resolveFileName=function(filePath){letabsolutePath=path.resolve(__dirname,filePath);让flag=fs.existsSync(absolutePath);//判断文件是否存在letcurrent=absolutePath;if(!flag){letkeys=Object.keys(Module.extensions);for(leti=0;i
