ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] 手写 CommonJS 的简单实现 # 示例 `a.js`: ~~~javascript const fn = function () { console.log('Hello'); } module.exports = fn; ~~~ # 第一种 ~~~js let fs = require('fs') //common.js规范实现(node中) let a = req('./a.js') function req(moduleName){ let content = fs.readFileSync(moduleName, 'utf-8') //下面是创建一个字符串函数 let fn = new Function('exports','module', 'require', '__dirname', '__filename', content + '\n return module.exports' ); //构造一个module对象,用于给module.exports赋值 let module = { exports:'' } //这里传入req是由于req的文件里面可能require其他文件 return fn(module.exports,module,req,__dirname,__filename) } /* * fn函数注释 */ // function fn(exports,module, require, __dirname, __filename){ // //let content = fs.readFileSync(moduleName, 'utf-8')执行结果是字符串 // module.exports = '我的第一个webpack' // return module.exports // } console.log(a) ~~~ # 第二种 ```js const path = require('path'); const fs = require('fs'); const vm = require('vm'); // Module处理 function Module(id) { this.id = id; this.exports = {}; }; // 缓存 Module.cache = {}; // 不同后缀类型处理 Module.extensions = {}; Module.extensions['.js'] = function (module) { let script = fs.readFileSync(module.id, 'utf8'); const wrapper = `(function (exports, require, module, __dirname, __filename) {${script}})`; const fn = vm.runInThisContext(wrapper); fn(module.exports, req, module, __dirname, __filename); return module.exports; }; Module.extensions['.json'] = function (module) { let jsonContent = fs.readFileSync(module.id, 'utf8'); return JSON.parse(jsonContent); }; Module.getPath = function (id) { const absPath = path.resolve(id); if (fs.existsSync(absPath)) { return absPath; } const extensions = Object.keys(Module.extensions); for (let i = 0; i < extensions.length; i++) { const extPath = `${absPath}${extensions[i]}`; if (fs.existsSync(extPath)) { return extPath; } } throw new Error('The file do not exist'); } const req = (id) => { const ext = Module.getPath(id); if (Module.cache[ext]) { return Module.cache[ext]; } const myModule = new Module(ext); // 对应后缀方法执行 const result = Module.extensions[path.extname(ext)](myModule); Module.cache[ext] = myModule; return result; }; //以下是使用req的代码块 const func = req('./b'); func(); // Hello ``` > [手写 commonJs](https://www.javascriptcn.com/read-103959.html)