导入一个模块,会按以下方式寻找。
如果没有a.js
//index.js const result = require("./a"); console.log(result);
会自动寻找./src/index.js文件 在package.json中main字段是入口文件
记录了当前模块的信息。
// index.js require("./b"); // b.js console.log(module);导入一个模块的内部原理
//这里只是一个过程原理,主要理解导入一个模块的过程 function require(modulePath){ //1.将modulePath转换为绝对路径:F:\****\node学习\1-2模块化细节\b.js //2.判断是否该模块已有缓存 if(require.cache["F:\\****\\node学习\\1-2模块化细节\\b.js"]){ return require.cache["F:\\****\\node学习\\1-2模块化细节\\b.js"].result; }; //3.读取文件内容 //4.包裹到一个函数中 function __temp(module,export,require,__dirname,__filename){ console.log('当前模块路径:',__dirname); console.log('当前模块文件:',__filename); exports.c = 3; module.exports = { a: 1, b: 2 }; this.m = 5; } //5.创建module对象 module.exports = {}; const exports = module.exports;//后将模块中的module.exports赋予module.exports,commonJs部分已讲过 __temp.call(module.exports,module,exports,require,module.id,module.filename); //一开始module.exports、module、exports都指向{},this也是。 //但模块的module.exports赋值,再改exports和this就没用了,最终返回的是return module.exports。 }所以模块里的this可以看做和exports相等。(module.exports被重新赋值了)
// b.js console.log('当前模块路径:',__dirname); console.log('当前模块文件:',__filename); exports.c = 3; module.exports = { a: 1, b: 2 } this.m = 5; console.log(this); console.log(exports); console.log(module.exports); console.log(this === module.exports); console.log(exports === module.exports); console.log(this === exports);也可以通过this.c改变exports.c的值。