webpack bundle 主要分两部分
- 项目文件,pages目录
- 依赖模块,node_modules目录
https://gitee.com/hy417393356/saas-ui
https://search.gitee.com/?skin=rec&type=repository&q=alibabacloud-console-components&sort=best_match
https://csr632.gitee.io/a**-components/guides/quick-start
源码编译可选 babel、swc 和 esbuild
- 源码编译
- 依赖编译
esbuild 适用于 dev;因为快
swc 适用于 build;不支持 top level await,和 mfsu 会有些冲突
源码编译用 esbuild 相比 babel 在 M1 2020 无缓存情况下会快 3s
css 压缩 cssnano
js 压缩 swc、terser 和 uglifyJs
esbuild
esbuild 不仅用于压缩,还被用到 JS/TS 文件实时编译、import/export 分析、测试等环节
esbuild 压缩 CSS 速度提升 6 倍,而尺寸仅增加约 1%
充分利用缓存和多线程
按需编译
Code Splitting
Tree Shaking
Ast To Code
hmr
配置覆盖率
首屏性能优化
UI 好看,交互流畅
- 合理的缓存和预加载策略,这样页面切换更快
babel
Babel语言特性又分两类,编译类和补丁类
Babel 覆盖范围只有项目代码,Bundler 层覆盖整个产物
- Babel 作为编译器不应该处理 modules 类型的转换,比如 esm 到 cjs 或 systemjs,
- modules 类型的转换应交给 Bundler,Bundler 通常还要依赖 esm 模块做 tree-shaking,所以 preset-env 里的 modules 是个废配置,始终设为 false 就好
- plugin-transform-runtime 不要配 corejs 带上补丁,不管是项目还是组件;
- 因为:这部分应该用 babel-polyfill 来解决,毕竟是兼容IE浏览器,最新的浏览器要这些补丁做啥呢?
MFSU 联邦模块
MFSU,Module Federation based Speed Up solution
Module Federation,联邦模块
基于 Webpack 5 Module Federation 出发而实现的提速方案,Module Federation 也是目前在用的预编译产物格式
MFSU,相对于 esbuild,解决:build构建时兼容性问题
MFSU特点
- 基于 webpack,相比 esbuild + esm 基本无兼容问题,复用 Webpack 生态
- 适合 build场景,不适合 dev场景
- 利用缓存让 CI、流程 build 等同样快
- 首次编译不会那么快,因为需要预编译依赖,但二次编译和改完代码后的热编译效果会很好
- 因为二次没有编译 node_modules 依赖
MFSU 所做的最重要的事就是预编译 node_modules 并把他缓存起来,以避免重复编译,让日常开发只编译项目文件
加 ANALYZE=1 后看到的只有项目文件,同时由于整体 Bundle 的减少,改完代码后的热编译也会快地多
- webpack 预编译,输出 Module Federation 格式
- Module Federation Loader 加载预编译好的依赖
Vite首次编译
- 预编译依赖用 esm 格式,基于 esbuild,比 MFSU 快地多
- 热更新快,
- 因为项目文件按需编译
- 启动快但浏览器打开慢是 Bundless 方案(包括 Vite)的通病,原因:请求多。
- MFSU 的解法是和 Bundle 方案一样通过 code splitting 做 chunks 合并,把大部分依赖合到一个文件里,从此不再有请求数量问题