独立使用umi的核心插件模块示例详解

目录
  • 引言
  • 实践
  • 结语

引言

今天我们做一个有趣的尝试,将 umi 的核心插件模块独立出来作为另一个框架的基础架构,这里我们将它称为 konos。 介于 umi 自身的源码的独立拆分,要实现这个功能其实非常的简单。只需要单独使用 @umijs/core 就好。

实践

先看具体实践吧。以下步骤都是常规编写 cli 的一些步骤,我就不做过多的说明,如果你看不懂其中的某些代码,可以评论区留言,或者查看我的其他文章。

  • 新建空白文件夹,mkdir konos

你可以根据你使用的电脑执行对应的命令来新建一个文件夹,当然最简单的还是在你想要存放的位置使用鼠标右键新建文件夹。

  • 初始化 npm 项目 npm init -y

-y 表示 npm cli init 时提出的所有问题,我们都使用默认,因为这些信息都可以在后续的 package.json 中手动修改,所以我喜欢使用 -y 来跳过这些交互,你完全可以按照你自己的喜好来初始化。

  • 安装 @umijs/core 、@umijs/utils 和 father
pnpm i @umijs/core @umijs/utils father
  • 新增 father 配置 .fatherrc.ts

father 是一个代码编译包,它提供了很多丰富和实用的配置,来帮助你构建 node 包和组件库,如果你对 father 感兴趣,可以从官网获取所有配置的说明,我们以下配置表示,使用 cjs 的方式,将 src 文件夹构建到 dist。

import { defineConfig } from 'father';
export default defineConfig({
  cjs: {
    output: 'dist',
  },
});
  • 增加执行命令 package.json 中增加 build script
  "scripts": {
    "build": "father build",
    "dev": "father dev",
  },
  • 新建一个自定义服务,新建文件 src/service

这里是扩展了 umi core 的 Service,为了便于理解,这里的常量都是写死的,其实在扩展的时候,我们可以使用一些动态获取的数据来覆盖这些参数,达到给用户更大的自定义空间。

import { Service as CoreService } from "@umijs/core";
const DEFAULT_CONFIG_FILES = [".konorc.ts", ".konorc.js"];
export class Service extends CoreService {
  constructor(opts?: any) {
    const cwd = process.cwd();
    super({
      ...opts,
      env: process.env.NODE_ENV,
      cwd,
      defaultConfigFiles: DEFAULT_CONFIG_FILES || opts.defaultConfigFiles,
      frameworkName: "konos",
      presets: opts?.presets || [],
      plugins: opts?.plugins || [],
    });
  }
}
  • 增加 cli 主入口文件,新建文件 src/cli.ts

这里就是常规的格式化一下 cli 传入的参数。

import { printHelp, yParser } from '@umijs/utils';
import { Service } from './service';
export async function run() {
  const args = yParser(process.argv.slice(2), {
    alias: {
      version: ['v'],
      help: ['h'],
    },
    boolean: ['version'],
  });
  try {
    await new Service().run({
      name: args._[0],
      args,
    });
  } catch (e: any) {
    console.log(e);
    printHelp.exit();
    process.exit(1);
  }
}
run();
  • 增加 bin 入口文件,新建文件 bin/konos.js
#!/usr/bin/env node
require('../dist/cli')
  • 测试命令是否可用,package.json 中增加 konos script
  "bin": {
    "konos": "bin/konos.js"
  },
  • 执行测试命令 pnpm run konos version

执行 pnpm build 或者 pnpm dev 构建现有代码。再执行 pnpm run konos version

你将会在窗口中看到一个错误,提示你 version 命令没有注册。

Error: Invalid command version, it's not registered.

  • 尝试添加 version 命令插件

这里我们用到了 umi 的插件开发的知识,使用了 registerCommand 来声明一个可执行命令。如果你不了解插件开发的知识的话,可以先记住声明命令的模版代码就是这么编写的,后续我再写文章说明。

import type { PluginAPI } from "@umijs/core";
export default (api: PluginAPI) => {
  api.registerCommand({
    name: "version",
    alias: "v",
    description: "show konos version",
    configResolveMode: "loose",
    fn({}) {
      const version = require("../package.json").version;
      console.log(`konos@${version}`);
      return version;
    },
  });
};
  • 在 konos 中使用 version 插件,修改文件 src/cli.ts
- await new Service().run({
+ await new Service({ plugins: [require.resolve("./version")] }).run({
      name: args._[0],
      args,
    });
  • 执行测试命令 pnpm run konos version

执行 pnpm build 或者 pnpm dev 构建现有代码。再执行 pnpm run konos version

➜  konos pnpm run konos version
> konos@1.0.0 konos /Users/xx/konos
> node bin/konos.js "version"
konos@1.0.0
➜  konos

如果你在窗口中看到版本号正确打印,说明你的以上操作都是正确的。恭喜你,你已经完成了一个基础框架架构的搭建。

源码归档

结语

以上就是独立使用 umi 的核心插件模块示例详解的详细内容,更多关于umi 核心插件模块的资料请关注我们其它相关文章!

(0)

相关推荐

  • JavaScript @umijs/plugin-locale插件使用教程

    目录 介绍 启用方式 使用 App.ts配置 在组件中使用 getAllLocales getLocale useIntl setLocale 介绍 plugin-locale是一个国际化的插件,用于解决i18n问题,约定式的多语言支持,可以进行多个国际语言的切换 启用方式 在umirc.ts文件中配置locale:{}开启 使用 在src下创建一个locales文件夹,在文件夹下配置我们的语言文件 中文语言文件:zh-CN.js export default { WELCOME_TO_UMI_

  • Umi4集成阿里低代码框架lowcode-engine实现

    目录 前言 实现 搭建umi4项目 集成lowcode-engine 结束语 前言 最近准备研究下阿里低代码框架lowcode-engine, 官方Demo是提供好的脚手架,由于我们的框架使用的是umi,官方文档提供了一些教程,在此记录下在umi4集成lowcode-engine. 实现 搭建umi4项目 1.通过官方文档的快速开始,我们可以快速创建出项目 先找个地方建个空目录 mkdir myapp && cd myapp 通过官方工具创建项目, 这里我们采用pnpm包管理工具 $ pn

  • 独立使用umi的核心插件模块示例详解

    目录 引言 实践 结语 引言 今天我们做一个有趣的尝试,将 umi 的核心插件模块独立出来作为另一个框架的基础架构,这里我们将它称为 konos. 介于 umi 自身的源码的独立拆分,要实现这个功能其实非常的简单.只需要单独使用 @umijs/core 就好. 实践 先看具体实践吧.以下步骤都是常规编写 cli 的一些步骤,我就不做过多的说明,如果你看不懂其中的某些代码,可以评论区留言,或者查看我的其他文章. 新建空白文件夹,mkdir konos 你可以根据你使用的电脑执行对应的命令来新建一个

  • kotlin android extensions 插件实现示例详解

    目录 前言 原理浅析 总体结构 源码分析 插件入口 配置编译器插件传参 编译器插件接收参数 注册各种Extension IrGenerationExtension ExpressionCodegenExtension StorageComponentContainerContributor ClassBuilderInterceptorExtension PackageFragmentProviderExtension 总结 前言 kotlin-android-extensions 插件是 Ko

  • 人工智能学习pyTorch的ResNet残差模块示例详解

    目录 1.定义ResNet残差模块 ①各层的定义 ②前向传播 2.ResNet18的实现 ①各层的定义 ②前向传播 3.测试ResNet18 1.定义ResNet残差模块 一个block中,有两个卷积层,之后的输出还要和输入进行相加.因此一个block的前向流程如下: 输入x→卷积层→数据标准化→ReLU→卷积层→数据标准化→数据和x相加→ReLU→输出out 中间加上了数据的标准化(通过nn.BatchNorm2d实现),可以使得效果更好一些. ①各层的定义 ②前向传播 在前向传播中输入x,过

  • python编程开发时间序列calendar模块示例详解

    目录 calendar模块 设置每周第一天-setfirstweekday 1.默认情况:礼拜一是第一天 2.设置任意一天 是否闰年-isleap 年份间的闰年数-leapdays(y1, y2) 星期几-weekday(year, month, day) monthrange(year, month) 月的日历矩阵-monthcalendar(year, month) 月的日历-prmonth(year, month, w, l) 年的日历-calendar.calendar(year) 格式

  • 解决jest处理es模块示例详解

    目录 问题场景 解决方法 问题场景 项目使用jest进行测试时, 当引入外部库是es模块时, jest无法处理导致报错. Test suite failed to run Jest encountered an unexpected token This usually means that you are trying to import a file which Jest cannot parse, e.g. it's not plain JavaScript. By default, if

  • mybatis的插件机制示例详解

    前言 Mybatis作为一个应用广泛的优秀的ORM框架,已经成了JavaWeb世界近乎标配的部分,这个框架具有强大的灵活性,在四大组件(Executor.StatementHandler.ParameterHandler.ResultSetHandler)处提供了简单易用的插件扩展机制.Mybatis对持久层的操作就是借助于四大核心对象.MyBatis支持用插件对四大核心对象进行拦截,对mybatis来说插件就是拦截器,用来增强核心对象的功能,增强功能本质上是借助于底层的动态代理实现的,换句话说

  • Python代码缩进和测试模块示例详解

    前言 Python代码缩进和测试模块是大家学习python必不可少的一部分,本文主要介绍了关于Python代码缩进和测试模块的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 一.Python代码缩进 Python 函数没有明显的 begin 和 end ,没有标明函数的开始和结束的花括号.唯一的分隔符是一个冒号 ( : ),接着代码本身是缩进的. 例如:缩进 buil dCon necti onStr ing 函数 def buildConnectionString(

  • Unity EasyTouch摇杆插件使用示例详解

    EasyTouch摇杆插件使用,先给大家展示下效果图: Demo展示 双指缩放在电脑端无法掩饰,竖屏将就看看吧: 插件名叫EasyTouch,有需要给我留言,不想开仓库传了: 创建摇杆点这里: 初始化 On_JoystickMove这个回调是用来控制移动的:分两个方向,x和y轴: void OnEnable() { EasyJoystick.On_JoystickMove += OnJoystickMove; } private void OnDisable() { EasyJoystick.O

  • babel插件去除console示例详解

    目录 起因 介绍 窥探 初见AST Program ExpressionStatement CallExpression MemberExpression Identifier StringLiteral 公共属性 如何写一个babel插件? 构造visitor方法 去除所有console 增加env api 增加exclude api 增加commentWords api 细节完善 对于后缀注释 对于前缀注释 发布到线上 安装 使用 起因 已经颓废了很久 因为实在不知道写啥了 突然我某个同事对

  • Android热修复及插件化原理示例详解

    目录 1.前言 2.类加载机制 3.Android类加载 4.Tinker原理 代码实现 5.插件化 5.1 Activity启动流程简单介绍 5.2 插件化原理 5.2.1 绕开验证 5.2.2还原插件Activity 5.3 加载插件资源 5.3.1 Resources&AssetManager 5.3.2 id冲突 1.前言 热修复一直是这几年来很热门的话题,主流方案大致有两种,一种是微信Tinker的dex文件替换,另一种是阿里的Native层的方法替换.这里重点介绍Tinker的大致原

随机推荐