Bundle Mode
我们知道一个标准的前端项目,通过npm run build打包后会生成若干静态资源文件,将这些文件部署到对应的服务器就可以在浏览器中访问了。这些静态资源文件一般有以下几个特点:
- 通常经过编译和压缩
- 浏览器可以直接或间接地进行加载
- 打包后的目录结构和源码目录无关(Bundle)
简单来说目前主流的打包工具(webpack, vite, rsbuild etc...) 在production mode都是采用bundle模式,会将分散的源码模块及其依赖合并为一个或多个静态资源文件以减少http请求数量,提高兼容性
DeepSeek: 尽管Bundleless模式在开发阶段(如Vite的热更新)具有速度优势,但生产环境中Bundle模式通过网络优化、执行效率、缓存策略、兼容性保障四大核心优势,成为主流选择。未来随着HTTP/3普及和浏览器性能提升,Bundleless可能在特定场景(如微前端子应用)中逐渐渗透,但短期内Bundle仍是性能敏感型项目的首选
这里引用Vite官网上的一张图:
Bundless Mode
面向业务的前端项目Bundle模式就能满足大多数场景。如果是开发一个组件库,还得考虑bundless模式
Tips:bundless简单来说就是在打包时只对源码进行编译后输出,不进行依赖分析和模块的合并
以Antd Design为例, 打包后es和lib目录下的代码就是bundless, 每个组件都有自己独立的文件夹, 根目录通过一个index文件统一导出; dist目录中的代码是bundle的,所有的组件代码打包在一起:
组件库使用Bundless格式的代码的目的有二:
-
开发环境实现按需加载
-
生产环境实现TreeShaking优化
模块管理
除了Bundle和Bundless两种打包模式,组件库还根据面向的使用场景不同分别采用了ESM,CJS,UMD三种模块管理方案:
- ES Module是现代ES标准的模块系统,支持静态分析和按需加载,现代浏览器和构建工具默认都会采用这种模式
- CommonJS是NodeJS (version < 20.0.0) 环境的模块系统,一般用于服务端开发和同构应用
- UMD是通用模块管理方案,适合跨环境使用或直接在html文件中进行引入
打包模式和模块管理方案之间的关系如下:
总结
现代前端项目在生产环境中一般采用Bundle模式,将分散的源码和依赖合并为一个或多个静态资源文件
如果开发一个组件库,会考虑同时使用Bundle和Bundless两种模式以兼容不同的使用场景
组件库还需要分别生成ESM,CJS,UMD三种模块管理的代码。
ESM支持静态分析和按需加载,现代浏览器和构建工具默认都会采用这种模式;
CommonJS (NodeJS version < 20.0.0) 一般用于服务端开发和同构应用;
UMD适合跨环境引入或直接在html文件中进行引入。
打包模式和模块管理模式的关系:ESM和CJS采用bundless模式,UMD采用Bundle模式