阅读视图

发现新文章,点击刷新页面。

CommonJS 与 ESM

CommonJS 与 ESM

bible-2778631_1280.jpg

Node.js 自诞生以来发展出了两套模块系统:CommonJS (CJS) 和 ECMAScript Modules (ESM)。这两套系统在设计理念、语法和使用方式上都有显著差异,理解它们的特性和适用场景对现代 Node.js 开发至关重要。

一、CommonJS:Node.js 的传统模块系统

  1. 基本特性

    CommonJS是2009年随 Node.js 一起出现,其设计目的是问了满足服务端JavaScript的模块化需求

  2. 语法示例

    使用require() 导入模块,使用 module.exports 或 exports 导出

    // 导入模块
    const fs = require('fs');
    const { funcA } = require('./moduleA');
    
    // 导出模块
    module.exports = {
      foo: 'bar',
      doSomething: function() {}
    };
    
    // 或者
    exports.doSomething = function() {};
    
  3. 特性

    • 同步加载:模块在require()调用时立即加载并执行
    • 动态依赖:可根据条件动态引入不同模块
    • 缓存机制:模块首次加载后会被缓存,后续require()调用返回缓存实例,可以通过require.cache可访问缓存

二、ECMAScript Modules (ESM):JavaScript 标准模块系统

  1. 基本特性

    ECMAScript Modules (ESM),ES6 (2015) 语言标准的一部分,其目的是为了统一浏览器和服务端的模块系统

  2. 语法示例

    使用 import / export 语法 导入导出

    // 导入模块
    import fs from 'fs';
    import { funcA } from './moduleA.js';
    import * as utils from './utils.js';
    
    // 导出模块
    export const foo = 'bar';
    export function doSomething() {}
    
    // 默认导出
    export default function() {}
    
  3. 特性

    • 静态结构:导入导出必须在顶层,不能动态导入(除 import()
    • 异步加载:模块加载过程异步
    • 严格模式:默认启用严格模式
    • 文件扩展名:必须明确指定(如 .js.mjs
❌