CommonJS
系列文章
这是JavaScript
系列文章:
简介
- 输出
在Node中,每个js文件都相当于一个独立的‘域’,域外和域内互不干涉,但是我们想要访问属于域内的变量或者函数,就需要人为添加标识暴露出来。
这个标识:
module
当前模块,对象类型
exports
是module的属性,是实际对外的接口module.exports
module.export = app => {}
- Node中引用某个模块
const example = require('./example.js');
- CommonJS特点
- 仅在模块作用域内有效
- 多次加载的模块仅加载一次,并缓存,之后会从缓存读取模块
- 模块加载顺序和引用顺序相对应
module
module对象
属性 | 对象 | 说明 |
---|---|---|
id | String | 模块标识符,绝对路径模块名 |
filename | String | 模块文件名,带有绝对路径 |
loader | Boolean | 模块是否已经完成加载 |
parent | Object | 调用此模块的模块 |
chileren | Array | 该模块调用的其他模块 |
exports | - | 对外输出的变量或者函数 |
module.exports
module.exports
其实就像对接口,其他模块实际调用的就是这个 module.exports
变量
exports
-
exports
本质上是Node实现的module.exports
的简写模式:var exports = module.exports;
-
因此,不能直接将某个值赋值给
exports
错误示例:exports = function(x) {console.log(x)};
-
只给
module.exports
赋单一值时,就意味着exports
不会再起作用
module.exports = function (x) { console.log(x);};
-
为了避免混淆,最好的办法是放弃
exports
require
require用于加载模块文件,若未读取到指定模块则会报错
调用自身
// initial.js 文件
module.exports = function () {
console.log('立刻执行该函数');
}
require('./initial.js')(); // 立即执行: "立刻执行该函数"
加载路径
require
加载的文件默认会添加 ‘.js’,
所以说:const test = require('./test');
= const test = require('./test.js');
开头 | 路径说明 | 示例代码 | 加载结果 |
---|---|---|---|
/ | 绝对路径 | require('/app/test.js') | /app/test.js |
./ | 相对路径,相对于当前执行js的文件的同层文件路径 | require('./test.js') | 同层test.js |
- | 默认提供的是核心模块,或者node_module内的模块 | require('./test.js') | 同层test.js |
- 路径 | 先找到路径首文件,在以此为基础查找 | require('app/test.js') | 先找到app文件夹,在此基础上找test.js |
- | 若上面都未查找到,则会在未添加后缀的引用尝试添加其他后缀(.js /.json /.node )继续查找 | - | - |
文件夹下加载规则
参考链接
[1] 阮一峰, CommonJS规范