Umi 4 设计思路

如果无法正常显示,请先停止浏览器的去广告插件。
分享至:
1. Umi 4 设计思路 云谦(陈成) 蚂蚁集团中台前端框架负责人
2. 关于我 阿里 & 蚂蚁 10 年 + 老前端,ZJU,Umi & Dva 等开源库作者,蚂蚁中台框架 Owner, 「MDH 前端周刊」作者,Webpack 配置「专 家」,初级路亚爱好者,游戏收藏师。 https://sorrycc.com
3. Umi 是什么 ?
4. Umi 是什么 • • • • • 蚂蚁集团 / 开源框架 / 基于 React 内部 10000+ 应用 / 社区 25.33% 用户选择 Umi 4 研发中 编译时框架 / 插件体系 / 默认快 / 依赖预打包 / ... Webpack & Vite 双构建引擎 / Low Import / ... https://github.com/umijs/umi
5. Umi 是什么 Bigfish 是基于 Umi 的蚂蚁内部中台框架 最佳实践 Umi 社区 业务和平台 Big sh 开发者
6. All in one 最佳实践 强约束 import all from umi 插件体系 集中式和组装式 依赖预打包 约束与开放 内外一致 Rich Mode ESM CDN 编译时框架 双构建引擎 默认快 Low Import Mode
7. 目录 01 02 03 04 编译时框架 依赖预打包 默认快 约束与开放
8. /01 编译时框架
9. 时过境迁 相比十年前 ? ⏱ ? ? ? 代码写少了 报错提前了 产物变小了 代码配置化了 配置约定化了 专注业务,少写很多 脚手架代码 从浏览器提前到命令 行,减少线上故障 tree-shaking、babel- plugin-import、JIT 功能配置化,配置约 定华,提升 DX 功能配置化,配置约 定华,提升 DX
10. 非编译时框架 源码 Webpack
11. 编译时框架 语法树 源码 检测 临时文件 依赖 图谱 ... 编译后 源码 Webpack 编译时
12. 社区的编译时 • • • • • Angular 的 AOT 和 JIT prepack solid.js export not found 的编译时和运行时 React Forget (function () { function hello() { return 'hello'; } function world() { return 'world'; } global.s = hello() + ' ' + world(); })(); ↓ ↓ ↓ s = "hello world"; prepack export not found
13. Umi 的编译时 - index.tsx - users.tsx + src/.umi + src - access.ts 约定式权限 + src/models - users.ts - global.ts 约定式数据流 约定式国际化 + src/locales - zh-ZN.json - en-US.json
14. One More Thing... Low Import 研发模式 import { useModel } from '@alipay/bigfish';
15. /02 依赖预打包
16. 睡一觉醒来 dev 或 build 跑不起来了 啥都没干迭代发布后线上白屏还背了个故障 npm i 时出现某人的求职广告 某黑客给某依赖库挂?了 babel 连续发了 8 个 bug x 版本 eslint 规则更新,然后 CI 挂了 ... • • • • • • •
17. package.json 中只有 10 个依赖 https://npm.anvaka.com/#/view/2d/umi-3-3-9
18. semver 的理想与现实 理想 现实
19. 社区的解 ? ? bug-versions patch-package resolution 配置 package-lock.json cnpm 提供,用于安 装时忽略问题库 代码层侵入式地修复 问题依赖 锁定指定依赖的版本 锁定全部依赖 临时 ? ? ⻓期
20. ? 中间商锁依赖,定期主动更新,并对此负责
21. 框架是开发者的倒数第二道防线
22. 依赖预打包 框架的解 webpack 启用前 ? babel dependency ❌ Umi ❌ 用户项目 devDependency ✅ Umi ✅ 用户项目 ... webpack 启用后 ? babel ...
23. 1309 ➡ 314 umi 3.3 vs. umi 3.4
24. 怎么预打包? HOW NCC 依赖代码打包 https://github.com/vercel/ncc + bundler-webpack + compiled + webpack - index.js - index.d.ts + src - index.js + node_modules + webpack - package.json dts-packer 依赖类型定义打包 https://github.com/sorrycc/dts-packer
25. Father 是基于 Umi 的组件打包方案 One more thing... Father 4 Bundless 内建 3 类 4 种构建核心 提供组件 (库) 研发最佳实践 支持 2 种构建产物类型 支持预编译并打包依赖 babel esbuild Bundle 依赖打包 webpack ncc + dts-packer 工程化能力生成器 智能诊断 更高效、精准的错误提示 灵活组装 test/lint/prettier 等工程能力 提供研发最佳实践指引 不仅清楚地描述错误、更给出解决方案 ES Module UMD Pre-bundling dist
26. Two more thing... browser 依赖锁 node 依赖
27. /03 默认快
28. Lint 慢 用户故事 依赖安装慢 构建 OOM CI 慢 本地启动慢 提交慢 node_modules 大 测试慢 改完代码后热更新慢 启动时间 热更新时间 脚手架 30s 3s 蚂蚁某中后台较慢应用 301s 32s
29. 提速三宝 Src Transpiler: SWC external with umd Webpack 5 物理缓存 压缩缓存 缓存 babel 缓存 ESM CDN Vite Optmize MFSU 延迟处理 基于请求的按需编译 延迟编译 sourcemap Native Code JS Mini
30. 提速方案时间线 externals auto externals code-splitting strategy dll NODE_OPTIONS=--max_old_space_size=4096 parcel 2 hard-source-webpack-plugin delay source map fs cache cache-loader swc happypack thread-loader babel cache module.noParse 缓存 延迟处理 Native Code esbuild remove Progress Plugin compile on demand vite snowpack rome cheaper source map prefer smaller dependency mfsu esm cdn 昨天 今天 明天
31. webpack MFSU Module Federation based Speed Up solution ⛹ ? ? 基于 Webpack 1000+ 应用实践 快 可上生产 既要 Webpack 的功 能和生态,又要 Vite 的速度 蚂蚁集团内网验证数 月,默认开启 启动快、热更新快、⻚面 打开也快 除了本地开发快, 让 CI CD 流程也快
32. MFSU 效果 webpack MFSU V2 首次启动 MFSU V3 热更新时间 0 二次启动 0 17.5 35 52.5 70 0.75 1.5 2.25 3
33. MFSU 原理 dependency import a from 'a' src { a: {} } babel plugin dep graph dep builder federated dependency modi ed src import a from 'remote/a' webpack / esbuild transformer ModuleFederation plugin { modules: { a } }
34. MFSU 时间线 理想 现实 优化 协作 Dep CDN、首次启动快 维护成本高、依赖覆盖率看脸 本地化、二次启动快、依赖覆盖率 95%+ 首次启动慢、⻚面打开速度看脸 首次启动也快、⻚面打开快 无 在路上 MFSU V1 MFSU V2 MFSU V3 MFSU V4 2020.10 2021.6 2021.12 2022
35. MFSU 使用 1 umi 4 默认开启 mfsu # 两行命令尝鲜 $ npm create umi@next $ npm start 2 基于 @umijs/mfsu,用于任意 webpack 项目
36. MFSU 使用 1 umi 4 默认开启 mfsu 2 基于 @umijs/mfsu,用于任意 webpack 项目 https://github.com/sorrycc/example-webpack-mfsu
37. 多构建引擎 bundler-vite bundler- webpack bundler- esbuild
38. Umi 4 的默认快 src transpiler 可选 swc babel dependency transpiler MFSU esbuild、swc、lite babel javascript mini er esbuild swc、terser、uglifyJs css mini er esbuild dependency precompile esbuild con g & mock le transformer esbuild esbuild jest transformer 默认 cssnano、parcel-css webpack swc、babel ... fast refresh lazy import remote cache code splitting strategy
39. npm 包 dep info cjs 2 esm Dep Analyzer ESMI Clients ESMI Server import maps es-module-shims import maps Umi Client module preload 不支持 IE builder esbuild export 级 bundle esm les 云凤蝶 Client BROWSER CDN HTTP/2 多路复用
40. /04 约束与开放
41. 围城 方案太多,怎么选 社区 内置方案不好,能换吗 蚂蚁团队内部
42. 社区要开放,团队要约束
43. 强约束 禁止依赖声明能用 * 统一数据流 统一图表库 统一请求库 统一目录结构 统一 ESM 模块规范 禁止混用 CJS 和 ESM 方案一致性 编码一致性 统一 TypeScript 安全性 强约束 规则集 禁用 eval、new Function 等 禁止依赖声明能用 * 规避常⻅错误 禁止使用未定义的变量 禁止跨 group 或 page 引用 提升可维护性 严格模式 组件限 600 行 禁止三层 ../ 引用文件 全量 TypeScript,禁 JavaScript 全量 FC,禁 Class Component server 下发规则 强制 tsc 校验
44. Bigfish 是基于 Umi 的蚂蚁内部中台框架 一个版本的好处 50 无版本碎片化问题 应用治理容易 框架升级轻松 37.5 25 12.5 0 Big sh 1 Big sh 2 Big sh 3 Big sh 4 增加「一个版本」规则
45. 集中配置和原子组装 集中功能 + 配置 Big 原子功能 + 组装 框架提供 开发者自定义
46. Bigfish 是基于 Umi 的蚂蚁内部中台框架 One more thing... Big sh 强约束规则集公开 https://www.yuque.com/docs/share/45a14118-c56c-4f27-b1cf-6b200ad4d450 已过滤不适合对外的规则和内容
47. Umi 4 ? ? ⚙ ? ⛹ ? 默认快 体系化有体感 的快 依赖预打包 双构建引擎 技术栈最新 最佳实践 V2 Umi Pro 安全又稳定 含 ESMi,面 向未来 Webpack 和 React Router 等 请求、数据 流、国际化等 内部 Bigfish 框架对外
48. 谢谢观看

Accueil - Wiki
Copyright © 2011-2024 iteam. Current version is 2.137.1. UTC+08:00, 2024-11-17 17:39
浙ICP备14020137号-1 $Carte des visiteurs$