commonjs 浏览器支持需通过工具模拟:one-click.js 可直接运行模块,browserify 适合打包已有代码,手动实现仅限教学;因缺乏同步文件系统,原生 require 无法真正复现,属过渡方案。

CommonJS 本身不是为浏览器设计的,原生不支持 require() 和 module.exports。但通过轻量级运行时或工具,可以在浏览器中“模拟”出 CommonJS 行为,无需构建、无需服务器——关键在于拦截模块加载逻辑并用 JS 实现模块解析与执行。
用 one-click.js 直接运行 CommonJS 模块
这是最接近“开箱即用”的方案:它把 CommonJS 的模块加载机制用纯 JavaScript 在浏览器里重实现。
- 下载
one-click.js(单文件,无依赖),放在项目目录中 - HTML 中用特殊 script 标签引入,并通过
data-main指定入口文件:<script src="./one-click.js" data-main="./main.js"></script> - 所有
require('./xxx.js')调用会被 one-click.js 拦截,转为 AJAX 请求加载对应 JS 文件,包裹在函数作用域中执行,再返回module.exports - 支持相对路径、嵌套 require、循环依赖基础处理,且能直接双击 HTML 文件运行
用 Browserify 打包后注入全局 require
如果你已有 Node.js 风格的 CommonJS 代码,想在浏览器里跑,Browserify 是成熟可靠的打包方案。
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
- 安装:
npm install -g browserify - 将入口文件打包成一个可直接引用的 bundle:
browserify main.js -o bundle.js - HTML 中引入:
<script src="bundle.js"></script> - 打包后的 bundle 内置了精简版 require 运行时,所有模块被静态分析、合并、重写为自执行函数,保留 CommonJS 语义
- 适合已有大量 Node.js 工具脚本需临时在浏览器调试的场景
手动实现简易 require(适合教学或极简场景)
若仅需几个模块、不想引入外部库,可用几行 JS 模拟核心逻辑:
- 维护一个模块缓存对象:
const cache = {} - 定义
myRequire(path):检查缓存 → 不存在则用fetch()加载源码 → 用new Function包裹执行(模拟模块闭包)→ 保存exports到缓存 → 返回exports - 模块文件需导出明确对象,避免顶层副作用(如直接发请求),推荐统一用
module.exports = { init() { ... } } - 注意:跨域、MIME 类型、ES6 语法需自行处理,仅适合可控环境下的原型验证
为什么不推荐直接改写 require 或 patch 全局?
浏览器没有 fs、没有同步文件系统 API,require() 的同步阻塞特性无法真正复现;强行模拟容易踩坑:
- 动态
require('string' + i)无法静态分析,导致加载失败 - 模块路径解析规则(如 node_modules 查找、扩展名补全)在浏览器里无意义
- 与现代 ESM 并存时可能引发命名冲突或执行顺序混乱
- 多数新项目已转向 ESM,CommonJS 浏览器模拟属于过渡性方案,非长期架构选择
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










