Skip to content

模块化

Nodejs 模块化规范遵循两套一套 CommonJS 规范另一套 ES Modules 规范

CommonJS 规范

package.json 中的 type 改成 commonjs(也可以不写)

引入模块(require)支持五种格式

支持引入内置模块例如 http os fs child_process 等nodejs内置模块 支持引入第三方模块express md5 koa 等 支持引入自己编写的模块 ./ ../ 等 支持引入addon C++扩展模块 .node文件 支持引入JSON文件

js
const fs = require('node:fs');  // 导入核心模块
const express = require('express');  // 导入 node_modules 目录下的模块
const myModule = require('./myModule.js');  // 导入相对路径下的模块
const nodeModule = require('./myModule.node');  // 导入扩展模块

导出模块exports 和 module.exports

js
module.exports = {
  hello: function() {
    console.log('Hello, world!');
  }
};

如果不想导出对象直接导出值

js
module.exports = 123

ES Modules 规范

package.json 中的 type 改成 module

查看导出的所有东西

js
import * as myModule from './myModule.js';

console.log(myModule)

将导出的内容重命名

js
import {name as myName} from './myModule.js';

console.log(myName)

不支持导入JSON文件,会报错,(但是可以使用实验性功能)

js
import json from './1.json' assert { type: 'json' };
console.log(json);

区别

  1. CommonJS 是基于运行时的同步加载,esm 是基于编译时的异步加载
  2. CommonJS 是可以修改值的,esm 值并且不可修改(可读的)
  3. CommonJS 不可以tree shaking,esm 支持tree shaking
  4. CommonJS 中顶层的this指向这个模块本身,而ES6中顶层this指向undefined

import 也可以掺杂在逻辑里面,使用import的函数模式

js
if(true){
  import('./1.js').then(res=>{
    console.log(res.name)
  })
}