【脚手架创建 Vue3 公共组件库】

脚手架创建 Vue3 公共组件库

创建一个支持 Vue2 和 Vue3 的公共组件库需要配置多版本兼容的脚手架,并通过分包构建实现按需加载。以下是具体实现方法:


初始化项目结构

使用 Vue CLI 或 Vite 初始化项目,目录结构需区分 Vue2 和 Vue3 版本:

复制代码
my-component-lib/
├── packages/          # 多版本组件目录
│   ├── vue2/          # Vue2 组件
│   │   ├── src/
│   │   └── package.json
│   └── vue3/          # Vue3 组件
│       ├── src/
│       └── package.json
├── build/             # 构建配置
├── node_modules/
└── package.json

配置多版本构建

1. 修改根目录 package.json

json 复制代码
{
  "scripts": {
    "build:vue2": "cd packages/vue2 && npm run build",
    "build:vue3": "cd packages/vue3 && npm run build",
    "build": "npm run build:vue2 && npm run build:vue3"
  }
}

2. Vue2 组件配置(packages/vue2/package.json

json 复制代码
{
  "name": "@my-lib/vue2",
  "version": "1.0.0",
  "main": "dist/index.js",
  "module": "dist/index.esm.js",
  "peerDependencies": {
    "vue": "^2.6.0"
  }
}

3. Vue3 组件配置(packages/vue3/package.json

json 复制代码
{
  "name": "@my-lib/vue3",
  "version": "1.0.0",
  "main": "dist/index.js",
  "module": "dist/index.esm.js",
  "peerDependencies": {
    "vue": "^3.0.0"
  }
}

实现组件兼容性

Vue2 组件示例(packages/vue2/src/Button.vue

vue 复制代码
<template>
  <button class="vue2-btn">{{ text }}</button>
</template>

<script>
export default {
  props: ['text']
}
</script>

Vue3 组件示例(packages/vue3/src/Button.vue

vue 复制代码
<template>
  <button class="vue3-btn">{{ text }}</button>
</template>

<script setup>
defineProps(['text'])
</script>

配置 Rollup/Vite 打包

Vue2 的 vite.config.js

javascript 复制代码
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue2'

export default defineConfig({
  plugins: [vue()],
  build: {
    lib: {
      entry: 'src/index.js',
      name: 'MyLibVue2',
      fileName: 'index'
    },
    rollupOptions: {
      external: ['vue']
    }
  }
})

Vue3 的 vite.config.js

javascript 复制代码
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

export default defineConfig({
  plugins: [vue()],
  build: {
    lib: {
      entry: 'src/index.js',
      name: 'MyLibVue3',
      fileName: 'index'
    },
    rollupOptions: {
      external: ['vue']
    }
  }
})

发布到 npm

  1. 登录 npm 账户:
bash 复制代码
npm login
  1. 分别进入子目录发布:
bash 复制代码
cd packages/vue2 && npm publish --access public
cd ../vue3 && npm publish --access public

使用组件库

Vue2 项目安装:

bash 复制代码
npm install @my-lib/vue2

Vue3 项目安装:

bash 复制代码
npm install @my-lib/vue3

全局注册示例(Vue3):

javascript 复制代码
import { createApp } from 'vue'
import MyLib from '@my-lib/vue3'

createApp(App).use(MyLib).mount('#app')

注意事项

  • 通过 peerDependencies 声明 Vue 版本依赖,避免重复打包
  • 构建时需分离 CSS 文件以便按需加载
  • 推荐使用 unplugin-vue-components 实现自动按需导入
  • 版本更新时需同步修改两个子包的版本号
相关推荐
夜郎king24 分钟前
HTML5 SVG 实现日出日落动画与实时天气可视化
前端·html5·svg 日出日落
夏幻灵1 小时前
HTML5里最常用的十大标签
前端·html·html5
Mr Xu_2 小时前
Vue 3 中 watch 的使用详解:监听响应式数据变化的利器
前端·javascript·vue.js
未来龙皇小蓝2 小时前
RBAC前端架构-01:项目初始化
前端·架构
程序员agions2 小时前
2026年,微前端终于“死“了
前端·状态模式
万岳科技系统开发2 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
程序员猫哥_2 小时前
HTML 生成网页工具推荐:从手写代码到 AI 自动生成网页的进化路径
前端·人工智能·html
龙飞052 小时前
Systemd -systemctl - journalctl 速查表:服务管理 + 日志排障
linux·运维·前端·chrome·systemctl·journalctl
我爱加班、、2 小时前
Websocket能携带token过去后端吗
前端·后端·websocket
AAA阿giao2 小时前
从零拆解一个 React + TypeScript 的 TodoList:模块化、数据流与工程实践
前端·react.js·ui·typescript·前端框架