CommonJS
系列文章
这是JavaScript系列文章:
简介
- 输出
在Node中,每个js文件都相当于一个独立的‘域’,域外和域内互不干涉,但是我们想要访问属于域内的变量或者函数,就需要人为添加标识暴露出来。
这个标识:module当前模块,对象类型exports是module的属性,是实际对外的接口module.exportsmodule.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规范