构建button组件

在后续组件开发过程中,新增组件的目录结构与 button 组件一致,并将新增的组件导入 packages/components/index.tspackages/components.ts 两个文件,便可自动完成组件的按需加载和全局注册。

(1)创建按钮组件

components 目录下创建 button 组件

推荐的目录结构
1.
2├─ packages
3│  ├─ components
4│  │  ├─ button             # 组件根目录
5│  │  │  ├─ style           # button 组件的样式目录 
6│  │  │  ├─ src
7│  │  │  │  └─ button.vue   # button 组件的UI渲染文件
8│  │  │  └─ index.ts        # 访问 button 组件的入口文件
9│  │  ├─ index.ts           # 导出 components 下的所有组件
10│  │  └─ package.json
11│  ├─ utils
12│  │  ├─ install.ts
13│  │  └─ package.json
14│  ├─ component.ts
15│  └─ index.ts
16└─ package.json
1<script setup lang="ts">
2defineOptions({
3  // 组件名称
4  name: "BButton",
5});
6</script>
7
8<template>
9  <button>这是一个测试的按钮</button>
10</template>
11
12<style lang="scss" scoped></style>

:::

(2)按需加载并导出组件

utils 工具类中建立 install.ts 文件,定义 registerComponent 方法用于注册组件。

1import type { App, Component } from "vue";
2
3/**
4 * 可安装组件类型
5 * 继承自Vue的Component类型,并添加了name属性和install方法
6 */
7export type InstallableComponent = Component & {
8  name: string;
9  install: (app: App) => void;
10};
11
12/**
13 * 将普通组件转换为可安装组件
14 * @param component 要注册的 Vue 组件
15 * @returns 返回一个可安装的组件
16 */
17export const registerComponent = (
18  component: Component
19): InstallableComponent => {
20  // 将传入组件转换为 InstallableComponent 类型
21  const installable = component as InstallableComponent;
22
23  // 为组件添加 install 方法
24  installable.install = (app) => {
25    // 在 Vue引用中注册该组件
26    app.component(installable.name, installable);
27  };
28  return installable;
29};
1export * from "./install";

:::

components/button/index.ts 中引入 registerComponent 方法,并导出 BButton 组件

1// 引入工具类的 registerComponent 方法
2import { registerComponent } from "@better-ui/utils";
3
4import Button from "./src/button.vue";
5
6// 提供按需加载的方式
7export const BButton = registerComponent(Button);
8
9// 导出组件
10export default BButton;

components/index.ts 中,汇总并导出所有 按需加载 的组件:

1export * from "./button";

(3)全局注册导出组件

全局注册组件是将所有组件汇聚到一个文件中,使用循环的方式批量注册组件。

packages 目录下新建 components.ts 文件和 index.ts 文件。

1import { BButton } from "@better-ui/components";
2
3// 使用数组的方式导出,便于循环批量注册
4export default [BButton];
1import type { App } from "vue";
2
3// 按需加载
4export * from "./components/index";
5
6// 全局注册
7import components from "./components";
8
9// 全局安装
10export const install = (app: App) => {
11  // 判断是否安装
12  if (install.installed) return;
13  // 安装组件
14  components.forEach((com) => {
15    app.use(com);
16  });
17};
18
19export default install;

:::

这样,您就可以通过 packages/index.ts 作为入口,全局注册或按需加载组件了。注意,按需加载组件时,样式的处理可能需要额外的配置以确保样式的正确加载。