- require
1. 绝对路径 其他写法(相对路径)最后都会转化为绝对路径
require("/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002/a.js"); // module a.js
2.相对路径
require("./a");//默认找js后缀的a文件
3.从node_modules导包
require("abc");
4.没有后缀文件的查找顺序
js、json 、node 、 mjs 按照这个顺序依次找
const res = require("./a");
5.如果仅提供目录,不提供文件名,则自动寻找该目录中的index.js
require("./test")
查找顺序 ./test ./test.js ./test.json ./test.node ./test.mjs ./test/index.js
6. package.json 中的main字段
6.1 表示包的默认入口
6.2 导入或执行包时若只提供目录,则使用main补全入口
6.3 默认值为index.js
在node_modules中新建abc文件,其他地方引用的规则如下
执行 node ./ ,会找到package.json 的 main字段对应的文件执行
require("abc"); //执行main声明的文件
require("abc/index"); //直接执行abc/index.js[自动补文件名]
- module对象
Module {
id: '/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002/src/index.js', // 模块的绝对路径,入口模块的绝对路径是个.
path: '/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002/src', // 这个模块的目录
exports: {}, //导出对象
parent: Module { // 那个模块在用它
id: '.',
path: '/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002',
exports: {},
parent: null,
filename: '/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002/index.js',
loaded: false, //是否加载完了
children: [ [Circular *1] ],
paths: [ //从什么位置找包
'/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002/node_modules',
'/Users/fuxing/Desktop/project/code/web/node/node_xuexi/node_modules',
'/Users/fuxing/Desktop/project/code/web/node/node_modules',
'/Users/fuxing/Desktop/project/code/web/node_modules',
'/Users/fuxing/Desktop/project/code/node_modules',
'/Users/fuxing/Desktop/project/node_modules',
'/Users/fuxing/Desktop/node_modules',
'/Users/fuxing/node_modules',
'/Users/node_modules',
'/node_modules'
]
},
filename: '/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002/src/index.js',
loaded: false, //是否运行完
children: [],//子模块
paths: [
'/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002/src/node_modules',
'/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002/node_modules',
'/Users/fuxing/Desktop/project/code/web/node/node_xuexi/node_modules',
'/Users/fuxing/Desktop/project/code/web/node/node_modules',
'/Users/fuxing/Desktop/project/code/web/node_modules',
'/Users/fuxing/Desktop/project/code/node_modules',
'/Users/fuxing/Desktop/project/node_modules',
'/Users/fuxing/Desktop/node_modules',
'/Users/fuxing/node_modules',
'/Users/node_modules',
'/node_modules'
]
}
- require函数
[Function: require] {
resolve: [Function: resolve] { paths: [Function: paths] }, // 转换为绝对路径
main: Module {// 主模块
id: '.',
path: '/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002',
exports: {},
parent: null,
filename: '/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002/index.js',
loaded: false,
children: [],
paths: [
'/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002/node_modules',
'/Users/fuxing/Desktop/project/code/web/node/node_xuexi/node_modules',
'/Users/fuxing/Desktop/project/code/web/node/node_modules',
'/Users/fuxing/Desktop/project/code/web/node_modules',
'/Users/fuxing/Desktop/project/code/node_modules',
'/Users/fuxing/Desktop/project/node_modules',
'/Users/fuxing/Desktop/node_modules',
'/Users/fuxing/node_modules',
'/Users/node_modules',
'/node_modules'
]
},
extensions: [Object: null prototype] {//扩展名,不同的后缀文件根据不同的方法执行
'.js': [Function (anonymous)],//不同的后缀文件根据不同的方法执行
'.json': [Function (anonymous)],
'.node': [Function (anonymous)]
},
cache: [Object: null prototype] { // 缓存的模块
'/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002/index.js': Module {//绝对路径作为id
id: '.',
path: '/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002',
exports: {},
parent: null,
filename: '/Users/fuxing/Desktop/project/code/web/node/node_xuexi/demo002/index.js',
loaded: false,
children: [],
paths: [Array]
}
}
4.当执行一个模块或使用require时,会将模块放置在一个函数环境中;ps:__dirname, __filename的来源,以及this、 exports 、module.exports的关系
【ps:this、 exports 、module.exports 开始是相等的】
================ a.js ================
console.log("当前模块路径:", __dirname);
console.log("当前模块文件:", __filename);
this.m = 5;
exports.c = 3;
console.log(this === exports, exports === module.exports); //true true
module.exports = {
a: 1,
b: 2,
};
console.log(this === exports, exports === module.exports); //true false
================ index.js ================
require("./a.js");
==========================================
分析a文件log的结果,以及 __dirname ,__filename 的来源【它们不是node的内置变量】
==>> 当执行一个模块或使用require时,会将模块放置在一个函数环境中
==>>require("./a.js")的伪代码如下,__dirname, __filename 实际上是这层函数传的参数
function _temp(module, exports, __dirname, __filename) {
console.log("当前模块路径:", __dirname);
console.log("当前模块文件:", __filename);
this.m = 5;
exports.c = 3;
console.log(this === exports, exports === module.exports); //true true
module.exports = {
a: 1,
b: 2,
};
console.log(this === exports, exports === module.exports); //true false
}