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);

image-20230206142449414

文件作为模块

当我们加载一个自定义的文件模块时,模块的路径必须以/、./../开头。如果不以这些开头,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.jsindex.node的顺序寻找主文件。

目录结构

image-20230206144158601

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);

image-20230206144355243