哈喽,好久不见!
Umi 2 发布已经是一年半之前的事了,在这段时间里,我们发现之前的架构正逐渐不能满足业务飞速发展的需要,于是我们重写了一遍 Umi。经过几个月的 “007 ” 研发,Umi 3 在今天正式和大家见面了,并调整 slogan 为“插件化的企业级前端应用框架”。
◆ ◆ ◆ ◆ ◆
Umi 是什么?
有些朋友可能还不太了解 Umi。
Umi 是蚂蚁金服的底层前端框架,已直接或间接地服务了 3000+ 应用,包括 java、node、H5 无线、离线(Hybrid)应用、纯前端 assets 应用、CMS 应用等。他已经很好地服务了我们的内部用户,同时希望他也能服务好外部用户。
它包含以下特性:
🎉 可扩展,完整的生命周期,插件化,支持插件和插件集
📦 开箱即用,内置路由、构建、部署、测试等,仅需一个依赖即可上手
🐠 企业级,经蚂蚁内部 3000+ 项目以及阿里、优酷、网易、飞猪、口碑等公司项目的验证
🚀 大量自研,微前端、组件打包、文档工具、请求库、hooks 库、数据流等
🌴 完备路由,支持配置式路由和约定式路由,同时保持功能的完备性
🚄 面向未来,一直在尝试新技术的探索,dll 提速、modern mode、webpack@5、自动化化 external、bundler less 等
◆ ◆ ◆ ◆ ◆
Umi 3 改进了什么?
彻底重写的代码和文档,80%+ 的覆盖率,~100M 的尺寸
Umi 2 随着功能累加,Umi 越来越庞大。然后在 Umi 3 里,通过严格控制依赖包,以及统一依赖库,比如请求库只用 got,命令行参数解析库只用 yargs 等等,我们把尺寸控制在了 100M 左右。
同时,我们在设计 Umi 3 的时候给予了更多分层,比如渲染器可以不是 react、打包工具也可以不是 webpack。为了和 webpack 解耦,连 Dev Server 都重新实现了一份。
官方插件、插件集和最佳实践
与 Umi 3 同步发布的还有我们为 React 应用准备的官方插件集 @umijs/preset-react,他包含以下功能,
plugin-access,权限管理
plugin-analytics,统计管理
plugin-antd,整合 antd UI 组件,新增一键切换暗色主题
plugin-crossorigin,通常用于 JS 出错统计
plugin-dva,整合 dva 数据流
plugin-initial-state,初始化数据管理
plugin-layout,配置启用 ant-design-pro 的布局
plugin-locale,国际化能力
plugin-model,基于 hooks 的简易数据流
plugin-request,基于 umi-request 和 umi-hooks 的请求方案
不知大家是否记得之前在《蚂蚁前端研发最佳实践》聊到我们针对中台的一套垂直领域框架?他就包含在里面。比如:
建一个 models 文件夹,就拥有了数据流能力,如果你写的是 dva model,用 connect 使用,如果写的是 hooks 数据流,通过 useModel 使用
建一个 locales 文件夹,就拥有了国际化能力,然后通过 useIntl 使用
建一个 access 文件夹,就拥有了权限管理能力,然后通过 useAccess 使用
在 app.ts 里导出 getInitialState 方法,就拥有了初始化数据管理能力,然后通过 useInitialState 使用
等等
更智能
比如 CSS Modules 的自动识别,不用 .module.css
后缀,不会再配 disableCSSModules
和 cssModulesWithAffix
,一个文件是否为 CSS Modules 由引用他的方式决定,
// 是 css modules
import styles from './a.css';
// 不是 css modules
import './a.css';
比如约定式路由会自动识别 pages 下的文件是否为路由文件, dva 插件会自动识别 models 下的文件是否为 dva model ,mock 目录下的文件会自动识别是否为有效的 mock 文件,可以避免我们之前在里面写一个 utils 或者其他文件时还需要配 exclude 规则的麻烦。
比如 Socket Server 无需再配置,之前如果配合 egg 或其他服务端时需要配回 umi 的 dev server;比如 cssPublicPath 无需再配置,会使用基于 css 文件的相对路径。
比如配置和 MOCK 依赖文件的 ES6 支持,不仅仅是入口文件支持 es6,依赖的文件也会在运行时做编译以支持 ES6 的语法,让大家更少踩坑。
Import “所有” from Umi
简单说就是所有能力都从 umi 中 import 获取,