2024-07-11 从零搭建一个基于vue3+ts的ui组件库,npm上传以及如何使用

前言:最近搞了个ui组件库,顺便写一下搭建过程。示例地址:https://iuniko.github.io/#/

其实吧,ui组件库就是一个插件的集合,只要搞懂了基本的demo,其他都是照猫画虎,顺水推舟即可。

基本的ui demo如何搭建?其实,这里面主要包括搭建组件的运行环境,然后把该组件给导出,最终通过打包形式上传到npm上,我们就可以引用该组件了。主要是三个步骤:

一:创建ui组件运行环境

我这里使用vite新建vue项目 npm init vite@latest

初始化后新建packages文件夹,在里面新建button文件夹和index.js,button文件夹里新建button.vue和index.js

// packages/index.ts
import "./index.less";
import tButton from "./button/index";
const install = app => {
    app.use(tButton);
};

const TUI = {
    install
};

export default TUI;
// packages/button/button.vue
<template>
  <div>
    <button><slot></slot></button>
  </div>
</template>

<script>
export default {
  name: "tButton",
};
</script>
// packages/button/index.ts
import tButton from "./index.vue";

tButton.install = app => {
    app.component(tButton.name, tButton);
};

export default tButton;

目录如下:

image.png

写完button组件后要在main.js引入

import { createApp } from 'vue';
import './style.css';

import App from "./App.vue";
import TUI from "../packages";

const app = createApp(App);
app.use(TUI);
app.mount('#app');

在App.vue引用一下

<template>
    <div>
        <t-button>按钮</t-button>
    </div>
</template>

如下图,表示ui组件可成功被引用,到这儿第一步算是完成

image.png

二:打包ui组件并上传到npm

打包这是个🔺重点。但是!如果你的电脑无法访问npm镜像源(https://registry.npmjs.org/) ,那么你将无法把ui组件上传到npm!你会问:用淘宝镜像之类的代替可以吗?(哒咩!)不行,因为npm不信任其他镜像源。

好了,我们先配置package.json文件

项目初始化的package.json文件是这样的

{
  "name": "vite-project",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview"
  },
  "dependencies": {
    "vue": "^3.4.31"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "^5.0.5",
    "vite": "^5.3.4"
  }
}

加入下面配置:

    "name": "这里输入你的自定义ui组件库名称,注意不要和npm上的重复",

    "private": false,
    "main": "./dist/baseUi.umd.ts",
    "module": "./dist/baseUi.es.ts",
    "exports": {
        ".": {
            "import": "./dist/baseUi.es.ts",
            "require": "./dist/baseUi.umd.ts"
        }
    },
    "files": [
        "dist/*"
    ],

这些配置主要是说明打的这个包是公开的,非私有的(private),如果你设置了private为true,那到下面就无法上传到npm;还有就是定义了导出的包的文件路径等。

然后配置vue.config.js文件

build: {
        lib: {
            entry: './packages/index.js',
            name: 'baseUI',
            fileName: (format) => `baseUI.${format}.ts`, 
            formats: ['es', 'umd'], 
        },
        rollupOptions: {
            external: ['vue'], 
            output: {
                globals: {
                    vue: 'Vue', // 抛出一个全局对象
                },
            },
        },
    },

接着就是开始打包:npm run build,示例:

image.png

image.png

嗯,紧接着就要上传到npm官网了。

如果!你没有npm账号,好说,先创建一个账号,下面的操作其实很简单,就只需执行2行命令即可。

首次上传需要登录npm,执行命令 npm login

ps:它会让你输入你的用户名、登录密码以及邮箱,还有邮箱验证码;登录成功,下次再publish就不需要再登录了。

image.png

登录成功了,就开始publish吧,执行命令npm publish

上传完了,可以到npm官网(https://www.npmjs.com/) 查看一下是否有你的包在,示例:

image.png

到这儿,算是完成了90%,剩下这一步就是引用

三:引用上传的组件

这里以我的ui库为例npm i iuniko-ui,然后在main.js(ts)里引用

import { createApp } from 'vue';
import App from "./App.vue";
import '/node_modules/iuniko-ui/dist/style.css'
import Iuniko from 'iuniko-ui';

const app = createApp(App);
app.use(Iuniko);
app.mount('#app');

效果如下:
image.png

image.png

至此,一个简单ui组件库demo算是完成了。

注意:我虽然用的是vue3,但是创建ui库的逻辑都是一样的,ui库一般由ui插件和ui文档组成,插件谁都会写,关键就是你把这个有多个插件组成的集合导出成一个库,就成了最基础的ui库,至于ui文档,它就是个网站,所以懂了这点你想写vue亦或是react的库就有思路了。

posted @ 2024-07-11 17:39  叶乘风  阅读(7)  评论(0编辑  收藏  举报