commonjs模块需通过打包工具构建时转译才能在浏览器运行。browserify专为此设计,递归打包依赖为单文件;webpack内置兼容解析,但非运行时支持;esm是现代推荐方案,commonjs存在tree-shaking等局限;手动垫片不可靠,因缺少node环境语义。

CommonJS 模块(require/module.exports)本身是为 Node.js 设计的,浏览器等无 Node 环境原生不支持。想在浏览器或纯前端项目中使用 CommonJS 风格代码,必须通过打包工具将其转换为可执行格式——不是“运行时兼容”,而是“构建时转译”。
Browserify:最直接的 CommonJS 打包方案
Browserify 是专为解决这个问题诞生的工具,它能递归解析 require() 语句,把整个依赖树打包成单个 JS 文件。
- 安装:全局或本地安装
npm install -g browserify - 打包命令示例:
browserify src/index.js -o dist/bundle.js - 支持直接
require('lodash')、require('./utils.js'),自动从node_modules解析 - 输出文件可在浏览器中直接通过
<script src="bundle.js"></script>加载
Webpack:更现代但需配置适配
Webpack 默认支持 CommonJS,但需注意它本质是“兼容解析”,而非“运行时支持”。
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
- 入口文件写
const _ = require('lodash')完全合法 - 关键配置项:确保
entry指向 CommonJS 入口,output.path用path.resolve()绝对路径 - 无需额外 loader 处理 .js 的 CommonJS 语法(webpack 内置支持)
- 若混用 ES Module(
import),webpack 会统一处理并做 tree-shaking
ESM 转换不是必须,但建议渐进迁移
虽然可以一直用 Browserify 或 Webpack 打包 CommonJS,但长期看存在局限:
- 无法静态分析导出项,影响 tree-shaking 效果(尤其生产环境体积)
- 部分新特性(如动态
import()、条件导出)CommonJS 不支持 - 现代工具链(Vite、Rollup)默认优先处理 ESM,CommonJS 需额外兼容层
- 推荐做法:新项目用
export/import;老项目可保留 CommonJS,用打包工具兜底
不推荐的手动方式
试图靠简单替换或运行时垫片(如 systemjs、es-module-shims)来“运行” CommonJS 是不可靠的:
-
require是同步阻塞调用,浏览器没有模块加载器实现该语义 - 没有
__dirname、process、fs等 Node 内置对象,很多 CommonJS 包会直接报错 - 即使加 polyfill,也无法还原 Node 的模块解析逻辑(如
package.json#exports、向上查找 node_modules)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










