我為大家介紹一個新的 React 開發框架,umi,大家可以叫他五米。經過近半年的細緻打磨,37 個 beta 版,23 個 rc 版,以及內外部專案的檢驗之後,今天終於迎來了他的 1.0 版本。非常感謝期間把 umi 應用到專案、提 issue 和 PR 的同學們,沒有大家的支援 umi 不能走到今天。
我把日常開發時遇到的問題做了下記錄:
- 我希望我的專案即可以跑在支付寶(淘寶)容器裡(多頁),又可以跑在普通瀏覽器裡(單頁),有啥辦法嗎?
- 隨著專案越來越大,開發除錯的啟動和熱更新時間越來越長。。
- 我所有的檔案都打包在一起釋出了,使用者反饋說網站開啟很慢,有沒有辦法基於路由做按需載入?
- 連 iOS 都支援 PWA 了,我能否一鍵開啟讓我的專案更快?
- 據說 preact 又小又快,我如何一鍵開啟?
- 開發完之後部署又遇到問題,publicPath 和 basename 是啥?又如何解決?
- 我要部署到靜態伺服器或 cdn 上,能否幫我把 HTML 也生成出來,部署後就能跑?
- antd{,-mobile} 還要配 babel-plugin-import?那個 es 資料夾又是啥?
- ts、jest、babel 的配置好麻煩,而且配了這個又和另一個衝突,怎麼辦?
- 據說 webpack 的 tree-shake、scope-hoist、side effect 等能進一步減少檔案大小,我如何最大化地利用?
- dva 的 model 一個個手寫載入好麻煩,還有 dva@2 之後 history 的 query 怎麼沒有了?
如果大家也遇到了,不妨試試 umi 。
umi 是什麼?
umi 是一個類 next.js 的專注效能的前端框架,他的優勢是:
- ? 內建的大量效能優化
- ? 多端,無縫支援容器和瀏覽器訪問
- ? 類 webpack 的外掛機制
- ? 針對 antd 和 dva 有友好的支援
他基於以下約定:
- 頁面是 React 元件
- 在 pages 目錄下新增檔案即可建立頁面
現在寫一個 React 應用你需要掌握很多知識,比如基於路由的 code-splitting、service-worker、webpack 配置、babel 配置、aslant 配置、效能優化、HMR、redbox、jest 測試、ts 配置、tree-shaking、scope-hoist、side-effect 等等。umi 把這些枯燥的事情全都做了,而你只需負責創造性的那部分。
效能
umi 在效能上做了很多努力,這些對於開發者是無感知的。“你只管寫業務程式碼,我會負責效能”,並且隨著 umi 的迭代,我保證你的應用會越來越快。
主要有:
- PWA Support
- Tree Shake
- antd(-mobile) 啟用 ES Module
- Scope Hoist
- 公共檔案的智慧提取
- 頁面級的按需載入
- Inline Critical CSS
- 提供 umi/dynamic 和 import() 語法,分別用於懶載入元件和模組
- 優化的 babel-preset-umi
- 靜態化的 SSR 處理
- link rel=preload
- hash 構建及服務端支援(雲鳳蝶)
- 通過 react-constant-elements 和 react-inline-elements 提升 rerender 效能
- 一鍵切換到 preact
- Progressive image loading
- 按需打包 umi 內建的路由程式碼
- ...
優化點很多,有些關乎尺寸,有些關乎執行效率,有些關乎首屏時間,有些關乎使用者體驗,細聊的話,能說上幾個小時。大家根據關鍵字應該能猜個大概,這裡就不展開了。
外掛機制
webpack 的生態好,和他靈活的外掛機制有很大關係。umi 也類似,他就是個架子,把坑挖好,然後通過外掛讓功能豐富起來,內部邏輯也是如此,由一個個外掛組成。
外掛能做什麼?基本什麼都能做,整個生命週期都能修改,包括配置、build、dev、html 和 臨時檔案的生成等,已全部挖好坑。
詳見 umijs/umi#87。
antd{,-mobile}
為了更方便地使用 antd{,-mobile},umi 對他們是直接內建的。所以 antd 和 antd-mobile 的元件可以直接用,然後 umi 會幫你做按需(基於 babel-plugin-import,使用 es 資料夾,開啟 tree-shaking)編譯。
當然,你也可以使用任意的其他元件庫。
dva
dva 是包含路由的,所以和 umi 結合主要是把路由的部分交給 umi 來處理,讓 dva 迴歸一個單純的資料流方案。我們通過外掛 umi-plugin-dva 的方式實現,同樣開箱即用:
- 內建 dva,所以有一個 umi-plugin-dva 依賴就可以了
- 內建 dva-loading
- 自動註冊 models 目錄下的檔案為 model
- history 的 query 回來了,不需要再手動用 query-string 進行處理
- ...
具體在 《umi + dva,完成使用者管理的 CURD 應用》 有詳細介紹。
上手使用
感興趣了嗎?下面我們為大家準備了一些專案上手的選擇:
- 可以跟著官網的《快速上手》文件一步步熟悉 umi
- 如果開發 dva 應用,請安裝
dva-cli@next
,並參考 《umi + dva,完成使用者管理的 CURD 應用》 - 如果要遷移 dva 專案到 umi + dva,可以參考 dva-hackernews!13,程式碼量
+187,-327
足以說明 umi 帶來了什麼 - Demo: 高仿版 ele.me
社群
大家可以加釘釘群。
也可以加微信群(群滿 100 人,加 sorryccpro
好友備註 umi
邀請加入)。
最後
umi 才剛剛起步,很希望你能一起來完善他,我們 Github 見!?