1. 适用范围:
- Node.js就是采用的这一规范
2. 梗概:
一种针对JavaScript的模块化规范
3. 具体规定:
commonJS把每个js脚本视为一个模块 模块内部对外部是不可见的, 需要导入后才可见
1. 导入:
require('模块路径')//返回一个目标的module.exports对象
1.1. 说明:
- 模块路径可以省略后缀
- 如果省略了后缀, 会遵从以下顺序导入:
- 按照确切的文件名进行加载
- 补全
.js
拓展名 - 补全
.json
- 补全
.node
- 模块路径如果没有
./
, 则会被当作第三方模块或内置模块- 加载第三方模块的查找顺序:
例如:
假设在
"C:AUsers\itheima\project\foo.js"
文件里调用了require('tools")
,则 Node.js 会按以下顺序查找: "C:\Users\itheima\project\node_modules\tools"
"C:\Users\itheima\node_modules\tools"
"C:\Users\node_modules\tools"
"C:\node_modules\tools"
- 加载第三方模块的查找顺序:
例如:
假设在
- 如果传入的
模块路径
为目录 则加载顺序为- 在被加载的目录下查找一个叫做package.json的文件,并寻找main 属性,作为 require()加载的入口
- 如果目录里没有 package json 文件,或者 main 入口不存在或无法解析,则Nodejs将会试图加载目录下的indexjs 文件。
- 如果以上两步都失败了,则Nodejs会在终端打印错误消息,报告模块的缺失:
Error:Cannotfindmodule "xxx"
2. 导出:
module.exports = 对象//语法一,直接替换导出的整个对象
module.exports.名称 = 对象 //语法二,给导出对象上挂在属性或方法
exports.对象//语法三,其实就是
2.1. 说明:
module.exports
默认为{}
, 即空对象exports
与module.exports
指向的是同一个对象- 但导出时仍会导入
module.exports
所指的对象, 而不是exports
所指的 - 故不要让
exports
指向其他的对象
- 但导出时仍会导入
3. 获取当前模块信息:
console.log(module)
- 每个js文件都对应有一个module对象
模块化加载机制:
- 对同一个模块的
require
只会执行一次 require
中内置模块的导入优先级最高- 即如有自定义模块名为fs, 则
require('fs')
总是会返回内置的fs
模块
- 即如有自定义模块名为fs, 则
4. js的其他模块化规范
same::ES6模块化 ES module CommanJS与ES6对模块化有着不同的规范