Appearance
模块化
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 = 123ES 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);区别
CommonJS是基于运行时的同步加载,esm是基于编译时的异步加载CommonJS是可以修改值的,esm值并且不可修改(可读的)CommonJS不可以tree shaking,esm支持tree shakingCommonJS中顶层的this指向这个模块本身,而ES6中顶层this指向undefined
import 也可以掺杂在逻辑里面,使用import的函数模式
js
if(true){
import('./1.js').then(res=>{
console.log(res.name)
})
}