1. 适用范围:

  1. Node.js就是采用的这一规范

2. 梗概:

一种针对JavaScript的模块化规范

3. 具体规定:

commonJS把每个js脚本视为一个模块 模块内部对外部是不可见的, 需要导入后才可见

1. 导入:

require('模块路径')//返回一个目标的module.exports对象

1.1. 说明:

  1. 模块路径可以省略后缀
    1. 如果省略了后缀, 会遵从以下顺序导入:
    2. 按照确切的文件名进行加载
    3. 补全.js拓展名
    4. 补全.json
    5. 补全.node
  2. 模块路径如果没有./, 则会被当作第三方模块或内置模块
    1. 加载第三方模块的查找顺序: 例如: 假设在"C:AUsers\itheima\project\foo.js"文件里调用了 require('tools"),则 Node.js 会按以下顺序查找:
    2. "C:\Users\itheima\project\node_modules\tools"
    3. "C:\Users\itheima\node_modules\tools"
    4. "C:\Users\node_modules\tools"
    5. "C:\node_modules\tools"
  3. 如果传入的模块路径为目录 则加载顺序为
    1. 在被加载的目录下查找一个叫做package.json的文件,并寻找main 属性,作为 require()加载的入口
    2. 如果目录里没有 package json 文件,或者 main 入口不存在或无法解析,则Nodejs将会试图加载目录下的indexjs 文件。
    3. 如果以上两步都失败了,则Nodejs会在终端打印错误消息,报告模块的缺失: Error:Cannotfindmodule "xxx"

2. 导出:

module.exports = 对象//语法一,直接替换导出的整个对象
module.exports.名称 = 对象 //语法二,给导出对象上挂在属性或方法
exports.对象//语法三,其实就是

2.1. 说明:

  1. module.exports默认为{}, 即空对象
  2. exportsmodule.exports指向的是同一个对象
    1. 但导出时仍会导入module.exports所指的对象, 而不是exports所指的
    2. 故不要让exports指向其他的对象

3. 获取当前模块信息:

console.log(module)

  1. 每个js文件都对应有一个module对象

模块化加载机制:

  1. 对同一个模块的require只会执行一次
  2. require中内置模块的导入优先级最高
    1. 即如有自定义模块名为fs, 则require('fs')总是会返回内置的fs模块

4. js的其他模块化规范

same::ES6模块化 ES module CommanJS与ES6对模块化有着不同的规范