欢迎光临
我们一直在努力

模块化与 CommonJS 入门(附 CJS vs ESM 对照表)

前言

当项目从一个 JS 文件发展到几十上百个文件时,最先失控的通常不是功能,而是依赖关系和全局变量污染。模块化就是解决这两个问题的基础能力。


1. 为什么需要模块化

在没有模块化的时代,代码拆分后会遇到两个典型问题:

  • 全局变量污染:不同文件的变量可能互相覆盖。
  • 依赖关系混乱:文件加载顺序不清晰,项目一大就容易出错。
  • 模块化的核心价值:

  • 隔离作用域,降低全局污染。
  • 管理依赖关系,明确“谁依赖谁”。
  • 支持协作开发和代码复用。
  • 常见标准:

    • CJS(CommonJS,部分中文资料会写作 CMJ):主要用于 Node.js 传统生态。
    • ESM(ES Module):JavaScript 官方模块标准,现代浏览器和 Node.js 都支持(在对应配置下)。

    2. CommonJS 最小示例

    2.1 math.js:定义并导出

    // math.js
    function add(a, b) {
    return a + b;
    }

    function isOdd(a) {
    // 兼容负数,例如 -3 也是奇数
    return Math.abs(a % 2) === 1;
    }

    module.exports = {
    add,
    isOdd
    };

    2.2 index.js:导入并使用

    // index.js
    const math = require('./math.js');

    console.log(math.isOdd(3)); // true
    console.log(math.add(2, 3)); // 5

    运行方式:

    node index.js


    3. CommonJS 规范

  • 在 CJS 体系下,文件会按模块方式加载(常见是 .js/.cjs,也包括 .json/.node 等)。
  • 模块内部有独立作用域,默认不会污染全局作用域。
  • 使用 module.exports 导出模块内容。
  • 使用 require() 导入其他模块。
  • 模块有缓存:首次加载后会缓存导出结果,重复 require 通常直接复用缓存。
  • 补充:Node.js 会按模块解析后的路径管理缓存;删除 require.cache 中对应项后,再次 require 会重新执行模块。


    4. CJS vs ESM

    维度CJSESM
    导入 require()(运行时) import(静态声明)
    导出 module.exports / exports export / export default
    加载 同步加载 原生支持异步加载(可配合 import())
    浏览器原生支持 不支持(需构建工具转换) 支持(现代浏览器)
    主要场景 Node.js 传统生态 浏览器 + Node.js 现代生态
    绑定特性 常见认知偏向“值拷贝” 实时绑定(live binding)

    5. 常见误区

    5.1 “Node 只能有一个入口文件”

    更准确说法是:一次 node xxx.js 命令只有一个启动入口文件;一个项目可以有多个可执行入口(例如不同 npm scripts)。

    5.2 “CJS 在浏览器可以直接用”

    浏览器原生不支持 require / module.exports,通常需要构建工具(如 Vite/Webpack)转换后再运行。

    5.3 “CMJ 才是标准缩写”

    主流标准写法是 CJS。CMJ 在中文资料中较常见,做笔记可保留别名说明,但对外交流建议使用 CJS。


    6. 总结

    这篇作为专栏第 01 篇,核心目标只有一个:把模块化的动机和 CommonJS 的基础机制先学扎实。后续不管是继续看 ESM,还是看工程化工具链,都会更容易理解。


    参考链接

    • CommonJS Modules
    • ECMAScript Modules
    • JavaScript Modules

    版权声明:本文首发于 CSDN,转载请注明出处。

    赞(0)
    未经允许不得转载:171主机测评 » 模块化与 CommonJS 入门(附 CJS vs ESM 对照表)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址