成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Umi 插件實戰教程,你學會了嗎?

開發 前端
本文介紹了如何編寫 Umi 插件,包括插件的結構和編寫過程。通過編寫 Umi 插件,你可以擴展 Umi 的功能,提高開發效率,并且可以將你的插件分享給其他人使用。

引言

筆者最近開發了一款 umi 插件:plugin-umi-cmdk[1],該插件的功能主要是:在 umi 項目里可以方便的集成 cmd + k ,實現菜單等搜索。

主體功能并不復雜,但是在集成作為 umi 插件過程中踩了不少坑,主要是 umi 官方文檔的, 開發插件 | UmiJS[2]實屬寫得爛,看完之后根本無法上手。

所以寫一篇完整的插件開發教程,手把手上手 umi 插件開發。

準備工作

創建項目

新建一個文件夾umi-plugin-demo,直接通過 umi 的官方模版進行創建。

yarn create umi

之后選擇模板的時候選擇:Umi Plugin。

圖片

創建 example 目錄用于測試

然后創建完之后在 umi-plugin-demo 的根目錄新建一個 example 文件夾,用于測試。

將 example 初始化成一個 umi 項目:

cd example
// 然后
yarn create umi

根據你的需求選擇一個模板。

圖片

我選了 Ant Design Pro ,現在整個目錄結構大致是這樣。

圖片

掛載插件

1、在 src/index.ts 里增加 log。

import type { IApi } from 'umi';

export default (api: IApi) => {
  // See https://umijs.org/docs/guides/plugins
  api.onStart(() => {
    console.log("歡迎關注前端桃園!");
  });
};

這個代碼的意思就是在插件啟動的時候打一個 log「插件開始加載了!!!」。

2、在 example/.umirc 里引入插件。

import { defineConfig } from '@umijs/max';
import { join } from 'path';

export default defineConfig({
  plugins: [join(__dirname, '../src/index.ts')],
  // 其他的配置
 })

通過 plugins 這個配置,將插件文件進行引入,在啟動 example 項目的時候插件就會被加載。

3、查看 logo 然后在 example 下,通過 npm start 啟動項目,即可看到控制臺的 log。

圖片

當我們看到控制臺輸出了想要的日志,到這一步,準備工作已經就緒,接下來就可以開始寫插件了。

更多掛載方式

除了通過 plugins 配置項掛載插件,umi 還提供了一種約定式的掛載方式。

在 umi 體系中,約定根目錄下存在 plugin 文件夾作為本地插件的約定入口。只要存在該文件夾,其中的插件就會被自動掛載,無需再進行額外的配置。

例如,在我們的示例中,可以直接在 example 目錄下創建一個 plugin.ts 文件,即可將插件掛載到 umi 中,無需在 .umirc 配置文件中添加插件配置。這種方式通常用于本地測試插件。

編寫插件

一般的插件機制是通過暴露鉤子來實現的,鉤子會在運行時執行并提供一些屬性供插件開發者使用。插件開發者可以在鉤子中實現想要的功能,從而擴展插件的功能。因此,插件開發就是在鉤子中編寫代碼實現自定義功能的過程。

所以一般在編寫框架插件的時候就需要先了解一下該框架提供了哪些鉤子,這個決定了開發者可以做哪些擴展的事情。

一般開發插件的基本流程如下:1、 瀏覽 umi 提供的插件 API2、確定插件的目的和功能 3、找到需要的插件 API 和生命周期方法

功能分析

我以我寫的插件 cmdk 插件舉例分析。

cmdk 搜索那個就是一個純 react 組件的功能,作為插件的話其實就是想辦法把這個插件在 umi 運行的時候就插入到整個 umi 的最外層。

另外就是支持配置一些參數,比如有些用戶不想用 cmd + k,想用 cmd + m 來調出彈框。那么就需要配置快捷鍵的 key。

大致就這兩個功能吧。

  1. 將 cmkd 的 react 組件插入到 umi。
  2. 支持配置快捷鍵

需要用到 API

  1. [api. describe ()](https://umijs.org/docs/api/plugin-api#describe "api. describe ( "api. describe ()")")。用于在插件注冊階段執行,用于描述插件或者插件集的 key、配置信息和啟用方式等。在 .umirc 配置快捷鍵的時候需要用到。
  2. [api. onGenerateFiles ()](https://umijs.org/docs/api/plugin-api#ongeneratefiles "api. onGenerateFiles ( "api. onGenerateFiles ()")")。生成臨時文件的鉤子,就是把運行時需要的文件生成到 .umi 目錄下的那個鉤子。
  3. [api. writeTmpFile ()](https://umijs.org/docs/api/plugin-api#writetmpfile "api. writeTmpFile ( "api. writeTmpFile ()")").生成臨時文件的方法,在 onGenerateFiles 階段進行調用的,將臨時文件寫入進去。
  4. 圖片

看到這些文件,這些就是在 umi 運行時需要用到的文件,都是對應的插件生成的。umi 在運行時這些代碼都是會執行的,在我們這里也是需要把 cmdk 那個 react 組件寫到這里面來,這樣在運行時才能用。

1、給插件傳遞屬性并做參數校驗

比如我們需要將 .umirc 的快捷鍵配置傳遞給插件,配置文件大致是這樣配置:

export default defineConfig({
  plugins: [join(__dirname, '../src/index.ts')],
  cmdk: {
    keyFilter: "cmd+w",
  },
}

意思就是插件的 key 叫 cmdk,有一個 keyFilter 的配置。插件里的代碼就可以這樣的寫。

import type { IApi } from 'umi';

export default (api: IApi) => {
 api.describe({
    key: 'cmdk',  // 定義插件名稱,跟 .umirc 的配置的 key 相同。
    config: {
      schema(joi) {  // 返回值,定義配置的 schema 結構,我們只需要這個對象里有一個 keyFilter 的字符串。
        return joi.object({
          keyFilter: joi.string(),
        });
      },
    },
    enableBy: api.EnableBy.config,
  })
}

這樣就可以實現對配置參數的校驗了。我們可以通過 api.userConfig.cmdk 拿到配置。

2、給 react 組件傳遞屬性

可以通過 api.userConfig.cmdk 拿到了配置參數,最終目的是要傳遞給 react 組件的。

在 src 下新建一個文件 cmdk.tpl 用于方 cmdk 的 react 代碼。

然后通過 [api. writeTmpFile ()](https://umijs.org/docs/api/plugin-api#writetmpfile "api. writeTmpFile ( "api. writeTmpFile ()")") 將配置參數傳進去,在 umi 插件里由于不是 react 組件,沒辦法通過 props 傳遞屬性,所以只能通過用模板的方式進行傳遞參數。

umi 插件用的模板引擎是 Mustache 。

所以插件代碼這里就可以這么寫:

import type { IApi } from 'umi';

export default (api: IApi) => {
  // 其他代碼
 api.onGenerateFiles({
  fn() {
    const runtimeTpl = readFileSync(
   join(__dirname, 'cmdk.tpl'),
   'utf-8',
    );

    api.writeTmpFile({
   path: 'runtime.tsx',
   content: Mustache.render(runtimeTpl, {
     props: JSON.stringify(api.userConfig.cmdk)
   }),
    });
 }
  })
}

這段代碼的意思就是在 onGenerateFiles 鉤子里,就是生成臨時文件的鉤子。

先通過 readFileSync 從插件的源碼里讀取要寫入臨時文件的模板文件 cmkd.tpl,然后再通過 writeTmpFile 寫入到 .umi 下去,同時將 api.userConfig.cmdk 作為參數,寫入到 props 這個模板參數里.

umi 會自動寫到對應的插件目錄下。

在 cmdk.tpl 里可以這樣拿到傳遞的參數。

const _props =  {{{ props }}};
const { keyFilter = 'meta.k' } =  _props;

第一行是 Mustache 模板引擎的語法,用于變量替換,第二行就是簡單的一個解構。這樣就可以拿到 keyFilter 了。

大致思路就是這樣了。

另外--如何拿到整個 rootContainer

因為我們需要把我們的 react 組件,放到組件的最外層,可以通過 rootContainer 這個函數進行處理。代碼如下:

export function rootContainer(container) {
  return <>
    {container}
    <CommandMenu></CommandMenu>
  </>
}

CommandMenu 就是寫的 React 組件,跟 container 平級放就好了,container 就是整個 react 容器。

到此,基本功能就可以了,接下來就是發布了。

發布

打包構建

由于該例子是基于 umi 腳手架創建的,本身集成了 umi,打包什么的都很方便。

只需要關注 2 個點:

  1. .fatherrc.ts 的配置是否正確:
import { defineConfig } from 'father';

export default defineConfig({
  cjs: { output: 'dist' },
  esm: { output: 'es' },
});

主要關注需要打包的模塊化文件,cjs 是 commonjs 的,如果需要在 node 環境,就需要配置一下,如果只是瀏覽器環境用的包,只需要配置 esm 即可。

需要關注一下 package.json 里的入口文件是否跟輸出的文件匹配:

圖片

module 填的是 es module 的入口文件。

最后再執行一下 npm run build ,即可將產物構建出來。

發布到 npm

產物構建出來之后,然后再執行:

npm publish

將模塊發布到 npm 上供別人使用。

小結

本文介紹了如何編寫 umi 插件,包括插件的結構和編寫過程。通過編寫 umi 插件,你可以擴展 umi 的功能,提高開發效率,并且可以將你的插件分享給其他人使用。

當你開始編寫 umi 插件時,建議你先了解 umi 的基本用法和原理,并且熟悉 React、Webpack 和 Node. js 等相關技術。同時,你也可以參考 umi 官方提供的插件列表和開源社區中的插件,以了解其他人是如何編寫 umi 插件的,并從中學習到一些有用的技巧和經驗。

希望本文能對你有所幫助,祝你編寫出高質量的 umi 插件!

參考文章

  • [插件開發 (umijs.org)](https://v3.umijs.org/zh-CN/guide/plugin-develop "插件開發 (umijs.org "插件開發 (umijs.org)")")。

參考資料

[1]plugin-umi-cmdk:https://github.com/crazylxr/plugin-umi-cmdk。

[2]開發插件 | UmiJS:https://umijs.org/docs/guides/plugins。

責任編輯:姜華 來源: 前端桃園
相關推薦

2023-06-26 00:01:11

2023-10-30 07:05:31

2024-07-17 09:23:58

Vite插件機制

2023-12-08 13:23:00

大數據MySQL存儲

2021-11-14 16:06:54

實戰中文Linkerd

2023-08-01 12:51:18

WebGPT機器學習模型

2024-01-02 12:05:26

Java并發編程

2024-01-19 08:25:38

死鎖Java通信

2024-02-04 00:00:00

Effect數據組件

2023-07-26 13:11:21

ChatGPT平臺工具

2023-01-10 08:43:15

定義DDD架構

2022-02-12 20:45:49

AndroidPC 端工具

2024-03-06 08:28:16

設計模式Java

2022-06-16 07:50:35

數據結構鏈表

2022-12-06 07:53:33

MySQL索引B+樹

2023-01-31 08:02:18

2023-10-06 14:49:21

SentinelHystrixtimeout

2022-07-13 08:16:49

RocketMQRPC日志

2023-05-05 06:54:07

MySQL數據查詢

2023-03-26 22:31:29

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区二区三区高清 | 偷拍自拍网站 | 超碰97在线免费 | 国产成人在线视频播放 | 亚洲精品二区 | 狠狠综合久久av一区二区小说 | 99热这里有精品 | 一级网站 | 国产精品一区久久久 | 欧美中文视频 | 亚洲综合成人网 | 97精品超碰一区二区三区 | 国产视频综合 | 福利社午夜影院 | 久久成人一区二区三区 | 亚洲综合一区二区三区 | 国产一区三区在线 | 91久久久久 | 欧美一区久久 | 成人在线视频一区 | 欧美精品区 | a爱视频 | 国产不卡一区 | 国产精品视频免费看 | 亚洲综合一区二区三区 | 久久国产精品-久久精品 | 久久国产精品精品国产色婷婷 | 中文字幕在线三区 | 一级黄色片在线免费观看 | 日本不卡一区二区三区在线观看 | 99热精品6| www.国产.com | 久久久国产精品 | 国产精品一区二区欧美 | 国产一区二区中文字幕 | 国产精品国产三级国产aⅴ原创 | 国产精品视频久久久久 | 精品国产一区二区三区久久久久久 | 成人a免费 | 女人精96xxx免费网站p | 一区二区三区视频免费看 |