哈嘍,好久不見!
Umi 2 發(fā)布已經(jīng)是一年半之前的事了,在這段時(shí)間里,我們發(fā)現(xiàn)之前的架構(gòu)正逐漸不能滿足業(yè)務(wù)飛速發(fā)展的需要,于是我們重寫了一遍 Umi。經(jīng)過(guò)幾個(gè)月的 “007 ” 研發(fā),Umi 3 在今天正式和大家見面了,并調(diào)整 slogan 為“插件化的企業(yè)級(jí)前端應(yīng)用框架”。
◆ ◆ ◆ ◆ ◆
Umi 是什么?
有些朋友可能還不太了解 Umi。
Umi 是螞蟻金服的底層前端框架,已直接或間接地服務(wù)了 3000+ 應(yīng)用,包括 java、node、H5 無(wú)線、離線(Hybrid)應(yīng)用、純前端 assets 應(yīng)用、CMS 應(yīng)用等。他已經(jīng)很好地服務(wù)了我們的內(nèi)部用戶,同時(shí)希望他也能服務(wù)好外部用戶。
它包含以下特性:
?? 可擴(kuò)展,完整的生命周期,插件化,支持插件和插件集
?? 開箱即用,內(nèi)置路由、構(gòu)建、部署、測(cè)試等,僅需一個(gè)依賴即可上手
?? 企業(yè)級(jí),經(jīng)螞蟻內(nèi)部 3000+ 項(xiàng)目以及阿里、優(yōu)酷、網(wǎng)易、飛豬、口碑等公司項(xiàng)目的驗(yàn)證
?? 大量自研,微前端、組件打包、文檔工具、請(qǐng)求庫(kù)、hooks 庫(kù)、數(shù)據(jù)流等
?? 完備路由,支持配置式路由和約定式路由,同時(shí)保持功能的完備性
?? 面向未來(lái),一直在嘗試新技術(shù)的探索,dll 提速、modern mode、webpack@5、自動(dòng)化化 external、bundler less 等
◆ ◆ ◆ ◆ ◆
Umi 3 改進(jìn)了什么?
徹底重寫的代碼和文檔,80%+ 的覆蓋率,~100M 的尺寸
Umi 2 隨著功能累加,Umi 越來(lái)越龐大。然后在 Umi 3 里,通過(guò)嚴(yán)格控制依賴包,以及統(tǒng)一依賴庫(kù),比如請(qǐng)求庫(kù)只用 got,命令行參數(shù)解析庫(kù)只用 yargs 等等,我們把尺寸控制在了 100M 左右。
同時(shí),我們?cè)谠O(shè)計(jì) Umi 3 的時(shí)候給予了更多分層,比如渲染器可以不是 react、打包工具也可以不是 webpack。為了和 webpack 解耦,連 Dev Server 都重新實(shí)現(xiàn)了一份。
官方插件、插件集和最佳實(shí)踐
與 Umi 3 同步發(fā)布的還有我們?yōu)?React 應(yīng)用準(zhǔn)備的官方插件集 @umijs/preset-react,他包含以下功能,
plugin-access,權(quán)限管理
plugin-analytics,統(tǒng)計(jì)管理
plugin-antd,整合 antd UI 組件,新增一鍵切換暗色主題
plugin-crossorigin,通常用于 JS 出錯(cuò)統(tǒng)計(jì)
plugin-dva,整合 dva 數(shù)據(jù)流
plugin-initial-state,初始化數(shù)據(jù)管理
plugin-layout,配置啟用 ant-design-pro 的布局
plugin-locale,國(guó)際化能力
plugin-model,基于 hooks 的簡(jiǎn)易數(shù)據(jù)流
plugin-request,基于 umi-request 和 umi-hooks 的請(qǐng)求方案
不知大家是否記得之前在《螞蟻前端研發(fā)最佳實(shí)踐》聊到我們針對(duì)中臺(tái)的一套垂直領(lǐng)域框架?他就包含在里面。比如:
建一個(gè) models 文件夾,就擁有了數(shù)據(jù)流能力,如果你寫的是 dva model,用 connect 使用,如果寫的是 hooks 數(shù)據(jù)流,通過(guò) useModel 使用
建一個(gè) locales 文件夾,就擁有了國(guó)際化能力,然后通過(guò) useIntl 使用
建一個(gè) access 文件夾,就擁有了權(quán)限管理能力,然后通過(guò) useAccess 使用
在 app.ts 里導(dǎo)出 getInitialState 方法,就擁有了初始化數(shù)據(jù)管理能力,然后通過(guò) useInitialState 使用
等等
更智能
比如 CSS Modules 的自動(dòng)識(shí)別,不用 .module.css
后綴,不會(huì)再配 disableCSSModules
和 cssModulesWithAffix
,一個(gè)文件是否為 CSS Modules 由引用他的方式?jīng)Q定,
// 是 css modules
import styles from './a.css';
// 不是 css modules
import './a.css';
比如約定式路由會(huì)自動(dòng)識(shí)別 pages 下的文件是否為路由文件, dva 插件會(huì)自動(dòng)識(shí)別 models 下的文件是否為 dva model ,mock 目錄下的文件會(huì)自動(dòng)識(shí)別是否為有效的 mock 文件,可以避免我們之前在里面寫一個(gè) utils 或者其他文件時(shí)還需要配 exclude 規(guī)則的麻煩。
比如 Socket Server 無(wú)需再配置,之前如果配合 egg 或其他服務(wù)端時(shí)需要配回 umi 的 dev server;比如 cssPublicPath 無(wú)需再配置,會(huì)使用基于 css 文件的相對(duì)路徑。
比如配置和 MOCK 依賴文件的 ES6 支持,不僅僅是入口文件支持 es6,依賴的文件也會(huì)在運(yùn)行時(shí)做編譯以支持 ES6 的語(yǔ)法,讓大家更少踩坑。
Import “所有” from Umi
簡(jiǎn)單說(shuō)就是所有能力都從 umi 中 import 獲取,