一、node模块化细节
1.模块的查找
1.绝对路径
//a.js
console.log('a.js');
//index.js
require("F:\\****\\node学习\\1-2模块化细节\\a.js");
2.相对路径./或…/
//index.js
require("./a.js");
3.模块路径
//index.js
require("abc");
导入一个模块,会按以下方式寻找。
4.关于后缀名
//index.js
require("./a");
如果没有a.js
//index.js
const result = require("./a");
console.log(result);
5.关于文件名
// src/index.js
console.log('src/index.js');
// index.js
require("./src");
会自动寻找./src/index.js文件
在package.json中main字段是入口文件
2.module对象
记录了当前模块的信息。
// index.js
require("./b");
// b.js
console.log(module);
3.require
// b.js
console.log('当前模块路径:',__dirname);
console.log('当前模块文件:',__filename);
exports.c = 3;
module.exports = {
a: 1,
b: 2
}
this.m = 5;
// index.js
require("./b");
导入一个模块的内部原理
//这里只是一个过程原理,主要理解导入一个模块的过程
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的值。