模块最大的好处是大大提高了代码的可维护性
使用模块还可以避免函数名和变量名冲突
JavaScript
现在有两种模块。一种是 ES6
模块,简称 ESM
;另一种是 CommonJS
模块,简称 CJS
。
CommonJS
模块是 Node.js
专用的,与 ES6
模块不兼容。语法上面,两者最明显的差异是:
CommonJS
模块使用require()
和module.exports
ES6
模块使用import
和export
-
require/exports
用法const fs = require('fs'); exports.fs = fs; module.exports = fs;
注:不可以直接对
exports
赋值,如exports = { name: 'Hello', alia: 'World' }
// /src/a.js module.exports = { name: 'Hello', alia: 'World' }; // 等同于 exports.name = 'Hello'; exports.alia= 'World';
// /src/b.js const aModule = require('./a'); console.log('aModule:', aModule); // { name: 'Hello', alia: 'World' }
module.exports
把函数作为模块的输出暴露// /src/a.js module.exports = function() { return { name: 'Hello', alia: 'World' }; }; // /src/b.js const aModule = require('./a')(); console.log('aModule:', aModule); // { name: 'Hello', alia: 'World' }
-
import fs from 'fs'; import { readFile } from 'fs'; // 从 fs 导入 readFile 模块 import { default as fs } from 'fs'; // 从 fs 中导入使用 export default 导出的模块 import * as fileSystem from 'fs'; // 从 fs 导入所有模块,引用对象名为 fileSystem import { readFile as read } from 'fs'; // 从 fs 导入 readFile 模块,引用对象名为 read export default fs; export const fs; export function readFile; export { readFile, read }; export * from 'fs';
-
.mjs
文件总是以ES6
模块加载。
.cjs
文件总是以CommonJS
模块加载。
.js
文件的加载取决于package.json
中的"type": "module"
,则会被解释成ES6
模块。// package.json { "type": "module" }