首页 > 其他分享 >自己开发组件库

自己开发组件库

时间:2023-12-11 15:26:28浏览次数:22  
标签:vue 自己 element 开发 plus components 组件 import

搭建vue3 & ts组件库脚手架

目标

  1. pnpm搭建monorepo项目,和使用workspace测试组件库
  2. 组件支持typescript,可以被使用的项目识别
  3. 组件支持整体导入、按需自动导入

环境要求

node ≥ 18 , pnpm ≥ 8 , vue ≥ 3.3

初始化项目模板

首先使用vitepnpm 创建一个项目模板,这里使用pnpm,方便后面monorepo的使用。

pnpm create vite

在交互命令中填写项目名称,选择 Vue + Typescript 模板

init-vite

然后进入项目目录,使用 pnpm install 安装依赖

使用monorepo管理组件库

使用 monorepo 可以将多个包放在一下项目下维护,包之间可以互相引用,相同的依赖和配置也可以统一维护起来。除了组件库,可能后面还会新增工具库和插件库,使用monorepo可以更好的进行管理。

创建过程如下:

  1. 首先指定 monorepo 目录。在项目根目录创建 packages 文件夹和 pnpm-workspace.yaml 文件,文件的内容为:

    packages:
        - 'packages/**'
    

    这样就可以指定项目packages下的文件夹为子包。

  2. packages 文件夹下新建 components 文件夹,并在新建的文件夹中新建一个 package.json 文件,初始内容如下:

    {
        "name": "@giegie/components",
        "version": "0.0.1",
        "description": "练习了2年半的高性能组件库",
        "scripts": {}
    }
    

    其中 @giegie/componentnpm包的名称,@giegie 是包的作用域,可以避免包的冲突。

创建第一个组件

先来创建一个简单的 Input 组件用作测试,如图所示,需要在src下建立一个Input文件夹,且需要创建几个固定的文件:

first-component

  • style/index.scss — 用于定义组件的样式。在里面补充一点简单的样式:

    .gie-input {
        &__control {
            color: red;
        }
    }
    

    为什么样式要拆开而不是直接写在Input组件里呢? 因为需要在构建时打包成一个css文件用于组件库整体导入。按需导入时,样式放在约定的目录,也方便让按需导入的插件自动引入样式。

  • Input.ts — 用于定义类型文件,如Inputprops类型,emit类型和instance类型等,内容如下:

    import Input from './Input.vue';
    
    /**
     * 定义props类型
     */
    export interface InputProps {
        modelValue: string;
        disabled?: boolean;
    }
    
    /**
     * 定义emit类型
     */
    export type InputEmits = {
        'update:modelValue': [value: string];
    };
    
    /**
     * 定义instance类型
     */
    export type InputInstance = InstanceType<typeof Input>;
    

    InputInstance是用来干啥的? 在写公共组件时,会使用defineExpose暴露一些方法。如在element-plus中,就会使用formRef.validate 来校验表单,instance里就有暴露方法的类型签名。

  • Input.vue — 组件文件。内容如下:

    <template>
        <div class="gie-input">
            <input
                v-model="state"
                ref="inputRef"
                class="gie-input__control"
                type="text"
                :disabled="props.disabled"
            />
        </div>
    </template>
    <script setup lang="ts">
        import { computed, ref } from 'vue';
        import type { InputEmits, InputProps } from './Input';
    
        defineOptions({
            name: 'GieInput',
        });
    
        const emit = defineEmits<InputEmits>();
    
        const props = withDefaults(defineProps<InputProps>(), {
            modelValue: '',
            disabled: false,
        });
    
        const state = computed({
            get: () => props.modelValue,
            set: (val) => {
                emit('update:modelValue', val);
            },
        });
    
        const inputRef = ref<HTMLInputElement>();
    
        function focus() {
            inputRef.value?.focus();
        }
    
        defineExpose({
            focus,
        });
    </script>
    

    在该组件中简单的定义了组件名、代理了一下v-model,并暴露出了一个方法focus

  • index.ts — 定义Input组件的入口文件

    import { withInstall } from '../utils/install';
    
    import Input from './Input.vue';
    
    export const GieInput = withInstall(Input);
    export default GieInput;
    
    export * from './Input.vue';
    export * from './Input';
    

    在入口文件中,使用withInstall封装了一下导入的Input组件,并默认导出。且在下面导出了所有类型文件。

    这个withInstall函数的作用就是把组件封装成了一个可被安装,带install方法的vue插件,这个函数是直接从element-plus项目复制的

    标签:vue,自己,element,开发,plus,components,组件,import
    From: https://www.cnblogs.com/wp-leonard/p/17894496.html

相关文章

  • 奥特曼被指爱权力胜过金钱;人类才是「幻觉问题」根本原因丨 RTE 开发者日报 Vol.103
       开发者朋友们大家好:这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内......
  • 如何使用DC电源模块进行快速原型开发
    如何使用DC电源模块进行快速原型开发BOSHIDADC电源模块是一种用于转换电源电压的电子元件,它可以把输入的直流电压转换为不同的输出电压,让我们可以在无需改变设备硬件的情况下,实现电压的升降。它广泛应用于不同的电子设备中,比如:机器人、智能家居、LED照明等等。下面,我将为大家介......
  • 支付宝云开发 H5 页面渲染提升优化实践
    支付宝云开发产品是一款蚂蚁集团独立自研的Serverless小程序一站式开发平台。蚂蚁内部FaaS产品有多年的研发、实践积累,并在内部众多业务线大规模应用,基于蚂蚁FaaS产品蚂蚁团队打造了全新的支付宝云开发产品。云开发产品具备极速弹性能力、高性能、高稳定性,在满足业务场景的同......
  • 一文浅入Springboot+mybatis-plus+actuator+Prometheus+Grafana+Swagger2.9.2开发运维
    Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTFUL风格的Web服务,是非常流行的API表达工具。Swagger能够自动生成完善的RESTFULAP文档,,同时并根据后台代码的修改同步更新,同时提供完整的测试页面来调试API。Prometheus是一个开源的服务监控系统和时序数据库......
  • 分享一个 asp.net core 多文件分块同时上传的组件
    分享一个可多个文件同时上传、断点续传,并实时反馈上传进度的Asp.Netcore组件。服务器端引用nuget包:JMS.FileUploader.AspNetCore然后启用上传组件:app.UseAuthorization();app.MapControllers();//启用上传组件,并限制单个文件最......
  • FPGA驱动RGB888屏幕——基于正点原子达芬奇FPGA开发板
    RGB888简介重要提示:由于我没有RGB888屏幕,所以代码未经验证,但是我将其在HDMI中使用了,证明代码还是有一定的正确性一个像素点由三种颜色控制,每个颜色8bit,共24bit,三个字节,这就是RGB888。同样的还有RGB565等。LCD屏幕介绍1、HSYNC(水平同步信号、行同步信号):产生此信号,说明开始显......
  • 关键字 开发-11 yaml文件中添加fixture功能
    前言每一条pytest用例都可以添加fixture的前置功能,只需要在用例的参数中传入在conftest.py文件中写的函数的名称就可以实现每条用例的前置和后置。1.yaml文件中加入fixture的功能因为我们实现了动态生成测试用例,所以我们可以直接通过在生成动态用例的时候就传入该fixture函数......
  • Sermant:无代理服务网格架构解析及无门槛玩转插件开发
    本文分享自华为云社区《Sermant:无代理服务网格架构解析及无门槛玩转插件开发》,作者:华为云社区精选。本期直播的主题是《从架构设计到开发实践,深入浅出了解Sermant》,华为云云原生DTSE技术布道师、华为云高级工程师、Sermant开源社区PMC核心成员栾文飞,为广大开发者详细从架构设计......
  • 飞凌OK113i-C全志T113-i开发板 rtl8723du WIFI 功能测试及蓝牙驱动移植
    飞凌OK113i-C全志T113-i开发板板载一个RTL8723duwifi/蓝牙二合一模块,板子出厂已经移植好了WIFI驱动但是蓝牙驱动没有,所以这篇文章我们主要做蓝牙驱动的移植和功能验证。./build.shmenuconfig在DeviceDrivers>Networkdevicesupport>WirelessLAN下找到Realtek8723DU......
  • IntelliJ IDEA无公网远程连接本地Mysql(提高开发效率!!!)
    IDEA作为Java开发最主力的工具,在开发过程中需要经常用到数据库,如mysql数据库,但是在IDEA中只能连接本地数据库,有时候需要访问其他地方如家里或者公司的数据库,将无法访问,内网的局限性导致我们只能在同一网络访问,无法跨网络访问,所以,本例将介绍如何在异地也可以实现远程连接......