<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Umi 4發(fā)布了

          共 7921字,需瀏覽 16分鐘

           ·

          2022-06-26 12:51

          本文適合覺得使用umi,或者對umi感興趣的小伙伴閱讀。

          歡迎關注前端早茶,與廣東靚仔攜手共同進階~

          一、前言

          本文基于開源項目:

          https://github.com/umijs/umi-next
          https://umijs.org/

              廣東靚仔使用umi開發(fā)也有一段時間了,從Umi 2 到 Umi 3,現(xiàn)在官方推出了Umi 4。
              廣東靚仔從官網(wǎng)找來了Umi4帶來的一些改變,搶先看:
          • ?? 新官網(wǎng)和文檔
          • ?? MFSU V3 & 默認開啟
          • ?? 雙構建引擎和 ESMi
          • ?? Webpack 5
          • ????♂? React Router 6 & 新路由
          • ?? 最佳實踐迭代
          • ??? 依賴預打包
          • ?? Umi Max
          • ?? Low Import 研發(fā)模式
          • ?? 強約束功能集成
          • ?? Import All From Umi 迭代
          • ?? srcTranspiler 和 depTranspiler
          • ?? jsMinifier 和 cssMinifier
          • ?? 應用元數(shù)據(jù)
          • ?? 微生成器
          • ?? 貼心小改進

          二、Umi 4 帶來了哪些改變

          新官網(wǎng)

             新的官網(wǎng)重新梳理的文檔、信息結構、以及新寫的文檔插件

          MFSU V3 & 默認開啟

          兩個示例、四種模式、四個維度的對比。MFSU 可脫離 Umi 運行。

          在這幾個場景下,MFSU with esbuild 數(shù)據(jù)領先。因此在 Umi 4 中默認開啟

          雙構建引擎和 ESMi

          Umi 4 提供 Vite 和 Webpack 兩種構建模式供開發(fā)者選擇,并盡可能保證他們之間功能的一致性,可能有些同學會喜歡 dev 用 vite,build 用 webpack 這樣的組合。同時基于 Vite 模式實現(xiàn)了 ESMi 的 Client 端,ESMi 依賴服務端,在外網(wǎng)還無法使用。

          Webpack 5

          Umi 4 默認使用 webpack 5 并開啟物理緩存。

          React Router 6 & 新路由

          升級了路由方案到 React Router 6,喜憂參半。好消息是,React Router 6 是 Remix 的基礎庫,面向框架層做了很多優(yōu)化,路由實現(xiàn)層更優(yōu)雅,Umi 得以刪除大量路由渲染的代碼;壞消息是,帶來不少 Break Change,比如之前父路由渲染子路由用 children,得換成如下:
          - { props.children }
          + <Outlet 

          API 路由

          Umi 4 約定 src/api 目錄下存放的 Serverless Function 格式的文件即為 API 路由。這部分路由會打包成不同平臺支持的 Serverless Function 產(chǎn)物。場景比如帶 token 的 API 調(diào)用、動態(tài)數(shù)據(jù)源、基于 Notion API 的 Blog、Hackernews Clone 等等。
          export default {
            apiRoute: {},

          Low Import 研發(fā)模式

          這是 Umi 4 的試驗性功能之一,目前已開發(fā)完成,解的問題是讓開發(fā)者少些或不寫 import 語句。項目中大量的 import 其實都可以通過工程化的方式自動處理。Umi 4 里通過 lowImport: 開啟,然后就可以無 import 直接用路由相關的 Link、useLocation 等,數(shù)據(jù)流相關的 connect、useModel,antd 組件 Button、Calendar 等,以及其他更多。

          支持 Vue

          Umi 4 中提供了 Vue 支持,只需裝載一個 preset 即可切換到 Vue。
          export default {
            presets: ['@umijs/preset-vue'],
          }

          微生成器

          此概念來自 Modern.js。Modern.js 引入很多新概念,其中「微生成器」還是非常貼切的。他包含兩個功能:
          1)小型腳手架,
          2)功能的開啟與關閉。
          Umi 3 雖然也有 generate 命令,但只包含功能 1。Umi 4 拓展了下 generate(alias 為 g)命令。除了支持更多類型的小型腳手架生成,還支持功能的開啟與關閉,以及比如 Monorepo、react 和 antd 版本等的功能切換。
          $ npx umi g
          ? Pick generator type ? - Use arrow-keys. Return to submit.
          ?   創(chuàng)建頁面 -- Create a umi page by page name
              創(chuàng)建組件 -- .
              創(chuàng)建 mock 代碼 -- .
              創(chuàng)建 model 代碼 -- .
              啟用 Prettier -- Setup Prettier Configurations
              啟用 Jest -- Setup Jest Configuration
              啟用 E2E 測試 -- .
              啟用 Tailwind CSS -- Setup Tailwind CSS configuration
              啟用 SSR -- .
              啟用 Low Import 研發(fā)模式 -- .
              啟用權限方案 -- .
              啟用 Monaco 編輯器 -- .
              關閉 Dva 數(shù)據(jù)流 -- Configuration, Dependencies, and Model Files for Dva
              關閉 MFSU -- .
              切換為 Monorepo 項目 -- .
              切換 React 為 18 -- .
              切換 Antd 為 5 -- 

          項目級插件:plugin.ts

          為進一步降低我們項目中使用插件的門檻,Umi 4 中約定項目根目錄下的 plugin.ts 為插件,開發(fā)者可在此直接調(diào)用插件 API,無需注冊,支持 TypeScript。
          import { IApi } from 'umi';
          export default (api: IApi) => {
            // 比如修改 HTML
            api.modifyHTML($ => {
              return $;
            });
            // 比如在入口的 umi.ts 中添加代碼
            api.addEntryCodeAhead(() => [`console.log('entry code ahead')`]);
            api.addEntryCode(() => [`console.log('entry code')`]);
            // 比如在構建完成時做額外的事
            api.onBuildComplete((opts) => {});
            // 比如在啟動階段做額外的事
            api.onStart((opts) => {});
            // 比如校驗每個 JavaScript/TypeScript 代碼
            api.onCheckCode((args) => {});
            // 比如動態(tài)修改路由
            api.modifyRoutes((routes) => {});

          自動 https

           Umi 4 的 https dev server 的實現(xiàn)基于 mkcert,啟動過程中會基于 hosts 自動生成對應的 key 和 cert。我們除了安裝前置的 mkcert,其他無需關心。

          三、Umi 4下一步計劃

          Umi 4 發(fā)布后,Umi 團隊今年還會在以下方向發(fā)力。


          ① 2022 版的最佳實踐

          ② MFSU V4:更快的 MFSU

          ③ Father 4 和 dumi 2:新一代組件研發(fā)方案

          ④ ESMi:面向未來的 Bundless 構建方案

          ⑤ DX(開發(fā)體驗)和速度

          四、非Umi項目獨立使用 MFSU

          安裝

          pnpm add -D @umijs/mfs


          配置 MFSU

          一共需要簡單的四步操作,請確保以下所有行為都只在開發(fā)環(huán)境生效。


          1. 初始化實例

          初始化一個 MFSU 實例,這是 MFSU 的基礎:

          // webpack.config.js
           
          const { MFSU } = require('@umijs/mfsu')
          const webpack = require('webpack')
           
          // [mfsu] 1. init instance
          const mfsu = new MFSU({
            implementor: webpack,
            buildDepWithESBuildtrue,
          })


          2. 添加中間件

          第二步,添加 MFSU 的 devServer 中間件到 webpack-dev-server 中,將為提供 MFSU 所需打包后的資源:

          webpack 5

          // webpack.config.js
           
          module.exports = {
            devServer: {
              // [mfsu] 2. add mfsu middleware
              setupMiddlewares(middlewares, devServer) {
                middlewares.unshift(
                  ...mfsu.getMiddlewares()
                )
                return middlewares
              },
            }


          3. 配置轉換器

          第三步,需要配置一種源碼轉換器,作用是用來收集、轉換依賴導入路徑,替換為 MFSU 的模塊聯(lián)邦地址(中間件所提供的)。

          此處提供兩種方案:babel plugins 或 esbuild handler ,一般情況下選擇 babel plugins 即可。

          Babel Plugins

          // webpack.config.js
           
          module.exports = {
            module: {
              rules: [
                // handle javascript source loader
                {
                  test/\.[jt]sx?$/,
                  exclude/node_modules/,
                  use: {
                    loader'babel-loader',
                    options: {
                      plugins: [
                        // [mfsu] 3. add mfsu babel plugins
                        ...mfsu.getBabelPlugins()
                      ]
                    }
                  }
                }
              ]
            }


          4. 設定 webpack 配置

          第四步,調(diào)用 MFSU 提供的方法改變你的 webpack 配置,在這里只有增量行為,無需擔心會影響到你原來的配置內(nèi)容。

          如下代碼所示,mfsu.setWebpackConfig 是一個異步方法,為了調(diào)用他需要將原來的 webpack 配置單獨抽為一個對象 config 之后,再將調(diào)用此方法的返回值導出。

          // webpack.config.js
           
          const config = {
            // origin webpack config
          }
           
          const depConfig = {
            // webpack config for dependencies
          }
           
           
          // [mfsu] 4. inject mfsu webpack config
          const getConfig = async () => {
            await mfsu.setWebpackConfig({
              config, depConfig
            });
            return config
          }
           
          module.exports = getConfig(

          到此為止,MFSU 完全配置完畢,下面可以開始啟動項目使用。


          使用

          進行完 4 步配置后,啟動你的項目,可以從項目根目錄得到 .mfsu 文件夾,即 MFSU 緩存文件夾,記得將其添加到 git 的忽略列表。

          # .gitignore
           
          .mfs


          五、最后

              在我們閱讀完官方文檔后,我們一定會進行更深層次的學習,比如看下框架底層是如何運行的,以及源碼的閱讀。
              這里廣東靚仔給下一些小建議:
          • 在看源碼前,我們先去官方文檔復習下框架設計理念、源碼分層設計
          • 閱讀下框架官方開發(fā)人員寫的相關文章
          • 借助框架的調(diào)用棧來進行源碼的閱讀,通過這個執(zhí)行流程,我們就完整的對源碼進行了一個初步的了解
          • 接下來再對源碼執(zhí)行過程中涉及的所有函數(shù)邏輯梳理一遍

          關注我,一起攜手進階

          歡迎關注前端早茶,與廣東靚仔攜手共同進階~

          瀏覽 652
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  插逼无码 | 欧美性爱内射在线 | 俺来也俺也去 | 国产成人久久777777黄蓉 | 天堂一区二区三区 |