Vue3 + Vite 构建组件库发布到 npm

简介: 这篇文章介绍了如何使用Vue3和Vite构建组件库并发布到npm,包括初始化项目、配置项目结构、创建组件目录、设置入口文件以及导出组件等步骤。

前言

你有构建完组件库后,因为不知道如何发布到 npm 的烦恼吗?本教程手把手教你用 Vite 构建组件库发布到 npm

搭建项目

1、 这里我们使用 Vite 初始化项目,执行命令:

pnpm create vite my-vue-app --template vue

2、 这里以我的项目 vue3-xmw-table 为例

https://ele-plus-table.baiwumm.com

调整目录结构

1、 首先需要创建一个 packages 目录,用来存放组件

2、 将 src 目录改为 examples 用作示例

3、 启动项目的时候,默认入口文件是 src/main.js,将 src 目录改为 examples 之后,就需要重新配置入口文件,在根目录下创建一个 vue.config.js 文件

// vue.config.js
  module.exports = {
    // 将 examples 目录添加为新的页面
    pages: {
      index: {
        // page 的入口
        entry: 'examples/main.ts',
        // 模板来源
        template: 'public/index.html',
        // 输出文件名
        filename: 'index.html'
      }
    }
  }

4、 修改根目录入口文件 index.html 中的 main.ts 引入路劲

<script type="module" src="/examples/main.ts"></script>

5、 完整的目录结构如下:

image.png

组件开发

1、 之前我们创建的 packages 目录,用来存放组件

2、 该目录下存放每个组件单独的开发目录,和一个 index.js 整合所有组件,并对外导出

3、 每个组件都应该归类于单独的目录下,包含其组件源码目录 src,和 index.js 便于外部引用

4、 这里以组件 xmwTable 为例,完整的 packages 目录结构如下

image.png

5、 xmwTable/src/main.vue 就是组件的入口文件,这里有一点要非常注意:

需要注意的是,组件必须声明 name,这个 name 就是组件的标签

<script lang="ts">
  export default {
    name: "vue3-xmw-table", //这个⾮常重要,就是未来你放到其他项⽬中,组件标签的名字,⽐如:<vue3-xmw-table></vue3-xmw-table>
  };
</script>

整合并导出组件

1、 编辑 packages/xmwTable/index.ts,实现组件的导出

// 导入组件,组件必须声明 name
import XmwTable from './src/main.vue'

// 为组件添加 install 方法,用于按需引入
XmwTable.install = function (Vue: any) {
    Vue.component(XmwTable.name, XmwTable)
}

export default XmwTable

2、 编辑 packages/index.ts 文件,实现组件的全局注册

// packages / index.js

// 导入单个组件
import XmwTable from './xmwTable/index'

// 以数组的结构保存组件,便于遍历
const components = [
    XmwTable
]

// 定义 install 方法
const install = function (Vue: any) {
    if (install.installed) return
    install.installed = true
    // 遍历并注册全局组件
    components.map(component => {
        Vue.component(component.name, component)
    })
}

if (typeof window !== 'undefined' && window.Vue) {
    install(window.Vue)
}

export default {
    // 导出的对象必须具备一个 install 方法
    install,
    // 组件列表
    ...components
}

编写 package.json 文件

1、 package.json 文件里面有很多字段要填写,否则不能正确发布。最重要的是以下几个:

  • name: 包名,该名字是唯一的。可在 npm 官网搜索名字,如果存在则需换个名字。

  • version: 版本号,不能和历史版本号相同。

  • files: 配置需要发布的文件。

  • main: 入口文件,默认为 index.js,这里改为 dist/vue3-xmw-table.umd.js。

  • module: 模块入口,这里改为 dist/vue3-xmw-table.es.js。

2、 完整的 package.json 如下:

{
    "name": "vue3-xmw-table",
    "version": "1.1.2",
    "main": "dist/vue3-xmw-table.umd.js",
    "module": "dist/vue3-xmw-table.es.js",
    "types": "vue3-xmw-table.d.ts",
    "files": [
      "dist/*",
      "vue3-xmw-table.d.ts"
    ],
    "private": false,
    "author": {
      "name": "baiwumm",
      "email": "843348394@qq.com"
    },
    "license": "ISC",
    "scripts": {
      "dev": "vite",
      "build": "vite build",
      "preview": "vite preview"
    },
    "dependencies": {
      "@types/node": "^17.0.6",
      "element-plus": "^1.3.0-beta.1",
      "vue": "^3.2.26",
      "vue-router": "^4.0.12"
    },
    "devDependencies": {
      "@vitejs/plugin-vue": "^2.0.0",
      "@vitejs/plugin-vue-jsx": "^1.3.10",
      "@vue/compiler-sfc": "^3.1.4",
      "eslint": "^8.6.0",
      "eslint-plugin-vue": "^8.2.0",
      "sass": "^1.45.2",
      "sass-loader": "^12.4.0",
      "typescript": "^4.4.4",
      "vite": "^2.7.2",
      "vue-tsc": "^0.29.8"
    }
}

vite 打包配置

1、 因为组件库一般都是 jsx 语法编写,所以要加上 @vitejs/plugin-vue-jsx,打包成 lib,编辑 vite.config.ts:

// filename: vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'

// https://vitejs.dev/config/
export default defineConfig({
    plugins: [vue(), vueJsx({})],
    build: {
      rollupOptions: {
        // 请确保外部化那些你的库中不需要的依赖
        external: ['vue'],
        output: {
          // 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量
          globals: {
            vue: 'Vue',
          },
        },
      },
      lib: {
        entry: './packages/index.ts',
        name: 'vue3-table',
      },
    },
})

2、 执行 yarn run build 会生成 dist 文件夹,里面有以下几个文件:

image.png

本地模拟

1、 修改文件 main.ts

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import XmwTable from '../dist/vue3-xmw-table.es.js'

createApp(App).use(router).use(ElementPlus).use(XmwTable).mount('#app')

2、 若 vue3-xmw-table 组件能成功显示在页面,则证明组件的打包是没问题的。

发布到 npm

1、 先查看 npm 的 registry

npm config get registry

2、 设置 npm 的 registry 为官方源

npm config set registry https://registry.npmjs.org

3、 执行命令 npm login 登录到 npm

npm login

image.png

4、 执行命令 npm publish 发布到 npm

npm publish

如出现以下信息,则证明包发布成功:

image.png

注:上传的 npm 包,在 72小时 后不可删除,如果是测试用的包,记得 72小时 内删除。

安装验证

1、 执行命令

npm i vue3-xmw-table

2、 在 main.ts 引入并注册

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import Xmwtable from 'vue3-xmw-table'

createApp(App).use(router).use(ElementPlus).use(Xmwtable).mount('#app')

3、 页面中引用

<!-- 数据表格 -->
    <vue3-xmw-table
      stripe
      border
      show-summary
      :summary-method="getSummaries"
      :tableData="state.tableData"
      :loading="state.loading"
      :columns="state.firstLoad ? firstColumns : state.tableColumns"
      :tableConfig="tableConfig"
      :showPagination="false"
      style="margin-top: 20px"
      :span-method="objectSpanMethod"
    >
      <template v-slot:handler="{ scope }">
        <el-button
          size="small"
          type="primary"
          @click="
            scope.$index == state.tableData.length - 1
              ? hanglerEditSpending(scope)
              : handlerEdit(scope)
          "
          >编辑</el-button
        >
        <el-button
          type="danger"
          size="small"
          @click="handlerDelect(scope)"
          :disabled="scope.$index == state.tableData.length - 1"
          >删除</el-button
        >
      </template>
    </vue3-xmw-table>

组件正常显示,恭喜💐你,你的包已经发布成功拉,赶紧去使用吧🎉🎉

相关文章
|
JavaScript vr&ar
vue3通过ref获取dom元素并修改样式
vue3通过ref获取dom元素并修改样式
1503 0
|
前端开发 jenkins 应用服务中间件
使用verdaccio打造自己的npm私有化仓库
使用verdaccio打造自己的npm私有化仓库
1244 0
使用verdaccio打造自己的npm私有化仓库
|
前端开发
从0搭建Vue3组件库(七):使用 gulp 打包组件库并实现按需加载
从0搭建Vue3组件库(七):使用 gulp 打包组件库并实现按需加载
738 0
|
JavaScript 前端开发 数据安全/隐私保护
Vue封装组件并发布到npm仓库
前言 使用Vue框架进行开发,组件封装是一个很常规的操作。一个封装好的组件可以在项目的任意地方使用,甚至我们可以直接从npm仓库下载别人封装好的组件来进行使用,比如iview、element-ui这一类的组件库。但是每个公司的业务场景可能不同,开发人员还是得必须封装自己得组件,如果换了一个项目,那么我们就只能复制组件代码到新的项目里面去了,这样稍显麻烦,其实我们可以将组建上传到npm仓库,要用的时候可以直接从npm安装使用。 总结下来有两点好处: 方面使用,任何项目无缝衔接。 可作为开源项目,积累经验。
1156 0
Vue封装组件并发布到npm仓库
|
前端开发 JavaScript 开发工具
从零开始:构建、打包并上传个人前端组件库至私有npm仓库的完整指南
从零开始:构建、打包并上传个人前端组件库至私有npm仓库的完整指南
3293 0
|
资源调度 JavaScript API
Vue3+TS+Vite开发组件库并发布到npm
这篇文章介绍了如何使用Vue 3、TypeScript和Vite开发一个包含35个常用UI组件和8个API功能函数的组件库`vue-amazing-ui`,并将其发布到npm,同时提供了组件库的安装使用说明和在线预览。
627 2
Vue3+TS+Vite开发组件库并发布到npm
|
JavaScript 前端开发 API
vue3 v-md-editor markdown编辑器(VMdEditor)和预览组件(VMdPreview )的使用
本文介绍了如何在Vue 3项目中使用v-md-editor组件库来创建markdown编辑器和预览组件。文章提供了安装步骤、如何在main.js中进行全局配置、以及如何在页面中使用VMdEditor和VMdPreview组件的示例代码。此外,还提供了一个完整示例的链接,包括编辑器和预览组件的使用效果和代码。
vue3 v-md-editor markdown编辑器(VMdEditor)和预览组件(VMdPreview )的使用
|
数据可视化 JavaScript
Vue3项目使用G6可视化组件实现一个树形机构图
在Vue 3项目中使用G6可视化组件库实现树形机构图的构建和展示。
3992 1
Vue3项目使用G6可视化组件实现一个树形机构图
|
前端开发 Java C++
超简单使用Vite+Vue3构建共享开发和分模块打包的前端项目
使用Vite和Vue3构建支持共享组件和分模块独立打包的前端项目的方法。
1931 0
超简单使用Vite+Vue3构建共享开发和分模块打包的前端项目
|
资源调度 前端开发 安全
前端实战:基于Verdaccio搭建私有npm仓库,轻松上传与下载自定义npm插件包
前端实战:基于Verdaccio搭建私有npm仓库,轻松上传与下载自定义npm插件包
1723 0