Common JS规范
模块就是一个js文件,在模块内部任何变量或其他对象都是私有的,不会暴露给外部模块。在CommonJS模块化规范中,在模块内部定义了一个module对象,module对象内部存储了当前模块的基本信息,同时module对象中有一个属性名为exports,exports用来指定需要向外部暴露的内容。只需要将需要暴露的内容设置为exports或exports的属性,其他模块即可通过require来获取这些暴露的内容
实例使用
第一种导出方式:
module1.js
const a = 10;
const b = 20;
const c = {
name: 'meowrain'
}
exports.a = a;
exports.b = b;
exports.c = c;
第二种导出方式:
module1.js
const a = 10;
const b = 20;
const c = {
name: 'meowrain'
}
module.exports = {
a,b,c
}
导入方式:
module2.js
const {a,b,c} = require('module1.js');
console.log(a);
console.log(b);
console.log(c);
文件作为模块
当我们加载一个自定义的文件模块时,模块的路径必须以/、./
或../
开头。如果不以这些开头,node会认为你要加载的是核心模块或node_modules
中的模块。
当我们要加载的模块是一个文件模块时,CommonJS规范会先去寻找该文件,比如:require("./m1")
时,会首先寻找名为m1的文件。如果这个文件没有找到,它会自动为文件添加扩展名然后再查询。扩展名的顺序为:js、json和node。还是上边的例子,如果没有找到m1,则会按照顺序搜索m1.js、m1.json、m1.node哪个先找到则返回哪个,如果都没有找到则报错。
文件夹作为模块
当我们使用一个文件夹作为模块时,文件夹中必须有一个模块的主文件。如果文件夹中含有package.json
文件且文件中设置main
属性,则main
属性指定的文件会成为主文件,导入模块时就是导入该文件。如果没有package.json
,则node会按照index.js
、index.node
的顺序寻找主文件。
目录结构
a.js
const a = 1; module.exports = { a }
b.js
const b = 3; module.exports = { b }
c.js
const c = 20; module.exports = { c }
index.js
const a = require('./a') const b = require('./b') const c = require('./c') module.exports = { a, b, c }
package.json
{ "name": "hello", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC" }
module.js
const hello = require('./hello') console.log(hello);