沉淀自己的pro-table组件,并发布到npm(Vue3、element-plus)

这篇具有很好参考价值的文章主要介绍了沉淀自己的pro-table组件,并发布到npm(Vue3、element-plus)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

沉淀自己的pro-table组件,并发布到npm

传送门

约定:npm包名vue3-el-pro-table,引用vue3-el-pro-table的包名为“本项目”。

声明:Vue3ProTable.vue代码是在这个项目的基础上进行修改的。

作者:hans774882968以及hans774882968以及hans774882968

Quick Start

yarn add vue3-el-pro-table

src/main.ts

import 'vue3-el-pro-table/dist/vue3-el-pro-table.css';
import Vue3ProTable from 'vue3-el-pro-table';

createApp(App)
  .use(Vue3ProTable)
  .mount('#app');

Then use <vue3-pro-table /> directly in .vue file.

Import interface:

import { Vue3ProTableProps } from 'vue3-el-pro-table';

Component props definition:

export declare interface Vue3ProTableProps {
  request: (...args: any[]) => Promise<{ data: object[], total: number }>
  // 表格标题
  title?: string
  // 是否隐藏标题栏
  hideTitleBar?: boolean
  // 搜索表单配置,false表示不显示搜索表单
  search?: boolean | object
  border?: boolean
  // 表头配置
  columns?: object[]
  // 行数据的Key,同elementUI的table组件的row-key
  rowKey?: string
  // 分页配置,false表示不显示分页
  pagination?: boolean | object
  tree?: object
  // The above attributes are all from https://github.com/huzhushan/vue3-pro-table. The following properties are added by me.
  loadTableDataBeforeMount?: boolean
  blockRedundantRequestOnReset?: boolean
  paddingLeft?: string | number
  paddingRight?: string | number
}

Plz refer to https://github.com/huzhushan/vue3-pro-table for instructions on how to use vue3-el-pro-table.

开发过程笔记

根据参考链接3,实际上我们只需要提供一个符合Vue插件格式的入口install.js,和一个Vue组件。但为了满足npm包迭代过程中的预览、测试等需求,我们仍然需要以组件库的标准来开发这个npm包。因此我采用的方案是:先使用vue-cli快速创建一个项目,满足组件的预览、测试等需求,在此基础上再新增一个构建流程。

  1. 使用vue-cli创建一个普通的Vue3 + TS项目。
  2. 新增组件src/components/Vue3ProTable.vue
  3. 新增Vue插件入口src/install.js
import HelloWorld from './components/HelloWorld.vue';
import Vue3ProTable from './components/Vue3ProTable.vue';

function install(app) {
  if (install.installed) return;
  install.installed = true;

  app.component('test-hello-world', HelloWorld); // 顺便把脚手架生成的组件也注册为全局组件
  app.component('vue3-pro-table', Vue3ProTable);
}

Vue3ProTable.install = install;

export default { install };
  1. 新增build-lib命令并运行yarn build-lib——这就是vue3-el-pro-table生成Vue插件的构建命令:
{
  "scripts": {
    "build": "vue-cli-service build", // 作为对比
    "build-lib": "vue-cli-service build --target lib --name vue3-el-pro-table ./src/install.js" // 参考:https://cli.vuejs.org/guide/build-targets.html#library
  },
}
  1. 构建成功后修改package.json修改下入口:
{
  "main": "dist/vue3-el-pro-table.umd.js",
}

在另一个项目(即本项目)预览最新改动:

yarn add file:../vue3-el-pro-table

接下来开始踩坑了。当引入的组件使用slot的时候会报错:

Cannot read properties of null (reading 'isCE')

根据参考链接2,原因是本项目和vue3-el-pro-table各有一个vue,即使它们版本相同也会引起冲突。虽然参考链接2的提问说给webpack添加vue配置无济于事,但我的项目用这个配置是可以解决问题的。

在本项目的vue.config.js禁用symlinks并alias vue:

const { defineConfig } = require('@vue/cli-service');
const path = require('path');

module.exports = defineConfig({
  chainWebpack(config) {
    config.resolve.symlinks(false);
    config.resolve.alias.set('vue', path.resolve('./node_modules/vue'));
  },
  devServer: {
    port: 8090,
  },
  transpileDependencies: true,
});

add TS Support

为了防止本项目报TS错误,我们的npm包vue3-el-pro-table需要给出.d.ts文件。

  1. 本项目package.json指定类型定义文件路径:
{
  "types": "dist/global.d.ts"
}
  1. 本项目tsconfig.json新增配置:
{
  "compilerOptions": {
    "types": [
      "webpack-env",
      "jest",
      "vue3-el-pro-table/dist/global.d.ts", // 获取 vue3-el-pro-table 注册的全局组件的类型提示
      "element-plus/global.d.ts" // 获取 element-plus 组件的类型提示
    ],
  }
}

global.d.ts不应该放在dist目录,因此我把它放到了src/global.d.ts,并配置CopyWebpackPluginvue3-el-pro-tablevue.config.js

const { defineConfig } = require('@vue/cli-service');
const path = require('path');
const CopyWebpackPlugin = require('copy-webpack-plugin');

module.exports = defineConfig({
  configureWebpack: {
    plugins: [
      new CopyWebpackPlugin({
        patterns: [
          {
            from: path.resolve(__dirname, 'src', 'global.d.ts'),
            to: path.resolve(__dirname, 'dist'),
          },
        ],
      }),
    ],
  },
  transpileDependencies: true,
});

最理想的情况下dist/global.d.ts能在编译时直接生成,但可惜我们参考的Vue3ProTable.vue不是一个TS组件,且改造为TS组件的工作量过大,因此global.d.ts是手动维护的,传送门。

我们期望dist/global.d.ts能够给组件提供类型提示。根据参考链接4,需要以下代码:

declare const CVue3ProTable: import('vue').DefineComponent<......>;
declare const CHelloWorld: import('vue').DefineComponent<{
  msg: StringConstructor;
}, unknown, unknown, object, object, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, object, string, import('vue').VNodeProps & import('vue').AllowedComponentProps & import('vue').ComponentCustomProps, Readonly<import('vue').ExtractPropTypes<{
  msg: StringConstructor;
}>>, object, object>;

declare module 'vue' {
  export interface GlobalComponents {
    Vue3ProTable: typeof CVue3ProTable
    TestHelloWorld: typeof CHelloWorld
  }
}

这里的CVue3ProTable, CHelloWorld看上去很复杂,不会是手写的吧?的确不是手写的,可以让vue-tsc生成。首先安装vue-tsc并新增命令:

{
  "gen-declaration": "vue-tsc -p tsconfig.declaration.json"
}

然后新增tsconfig.declaration.json

{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "outDir": "es",
    "declaration": true,
    "emitDeclarationOnly": true
  },
  "include": ["src"],
  "exclude": ["node_modules", "**/__tests__/**", "**/__demos__/**", "**/*.md"]
}

最后执行yarn gen-declaration,把组件的类型定义复制到global.d.ts即可。文章来源地址https://www.toymoban.com/news/detail-596396.html

参考资料

  1. 声明式 UI 介绍:https://flutter.cn/docs/get-started/flutter-for/declarative
  2. Cannot read properties of null (reading ‘isCE’):https://stackoverflow.com/questions/71063992/when-importing-self-made-vue-3-library-into-vue-3-project-uncaught-typeerror
  3. 在 NPM 上创建并发布您的第一个 Vue.JS 插件:https://5balloons.info/create-publish-you-first-vue-plugin-on-npm-the-right-way/
  4. 全局组件类型声明的最佳实践 (Vue3+TS+Volar):https://juejin.cn/post/7066730414626308103

到了这里,关于沉淀自己的pro-table组件,并发布到npm(Vue3、element-plus)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue3 + vite自定义封装vue + element-ui 表格组件,发布到npm包的全过程。

    当我们项目中用到的表格太多的话,就会导致我们的代码量一直增加,所以我们要封装一个公共得组件,通过传参引入来使用,下面这篇文章主要给大家介绍了关于vue3+vite自定义封装vue组件发布到npm包的相关资料,需要的朋友可以参考下。 提示我们要安装 create-vite@4.1.0 得依赖

    2024年02月02日
    浏览(50)
  • Vue2自己封装的基础组件库或基于Element-ui再次封装的基础组件库,如何发布到npm并使用(支持全局或按需引入使用),超详细

    以下我以 wocwin-admin-vue2 项目为例 修改目录结构,最终如下 1、导入组件,组件必须声明 name 2、定义 install 方法,接收 Vue 作为参数。如果使用 use 注册插件,则所有的组件都将被注册 3、导出的对象必须具有 install,才能被 Vue.use() 方法安装(全局使用) 4、按需引入 5、packa

    2024年02月08日
    浏览(61)
  • Vue3+Vite+Element-plus搭建组件库并使用Vitepress编辑组件库文档且发布到 npm并且部署 github pages(vitepress文档渲染.vue组件-推荐使用第二种)

    可以参考我之前发布的vite快速搭建vue3项目文章来创建;也可以直接使用我开源Vue3.2+Ts+Vite3+Pinia+Element-Plus模板wocwin-admin 以下我以 wocwin-admin 项目为例 当前目录结构如下 1、编辑 packages/table/index.ts,实现组件的导出 2、编辑 packages/index.ts 文件,实现组件的全局注册 1、安装vite

    2024年02月13日
    浏览(91)
  • 发布自己的npm包

    输入npm init后,一路默认即可初始化成功,如下: 初始化成功后会生成一个package.json文件 n(以我的文件夹demo-npm-dir为例) package.json配置如下: 然后在index.js写即可。 这里我设置发布到npm公有平台,根据个人项目需要配置。 注:检测npm源命令 没有请先在官网注册,登录时会

    2024年02月10日
    浏览(43)
  • 发布自己的npm 包

    没有账号先注册一个,注册地址https://www.npmjs.com 之后npm 网站搜索包名就可以看到了

    2024年02月15日
    浏览(33)
  • 如何发布自己的npm包

    首先创建一个文件夹(唯一的命名) 创建package.json包,输出npm init,一直回车就好。 创建index.js文件,向外暴露方法。 将包上传或更新到 npm   执行登录命令:npm login 登录npm官网,根据提示输入用户名和密码,邮箱(邮箱必须在注册时进行验证)  发布版本,在登陆命令后接

    2024年02月14日
    浏览(25)
  • 发布属于自己的 npm 包

    注意:输入密码的时候 不会显示出来,输入完整直接按回车即可

    2024年02月13日
    浏览(28)
  • 前端(vue)npm如何发布自己的包

    4.1然后执行:npm run lib会得到lib文件夹 4.2配置package.json 在npm官网(https://www.npmjs.com/)按照步骤注册一个账号,我这边已经注册好了直接登录就行 6.1注册成功之后然后在终端中输入命令 出现这个之后就说明登陆成功了 6.2更新命令 这就可以使用了!!!

    2024年02月12日
    浏览(33)
  • 前端工程化:发布一个属于自己的规范 npm 包

    初始化项目 首先在github创建一个仓库,协议选择MIT,gitignore选择Node,添加README.md描述文件。使用git clone将项目克隆到本地。cd 进入目录,使用vscode打开(终端输入code . 命令即可)。 然后创建一个合理的目录结构: 配置 typescript 统一代码风格 首先,配置eslint,使用遵循Air

    2024年02月05日
    浏览(35)
  • 73 # 发布自己的 http-server 到 npm

    1、添加 .npmignore 文件,忽略不需要的文件 2、去官网https://www.npmjs.com/检查自己的包名是否被占用 3、切换到官方源,然后检查确认 4、登录 npm 账号 5、发布 6、查看发布情况,发布成功之后,等一会,我们就能看到自己的包在 npm 上了 7、更新版本,我们添加一个 README.md 文件

    2024年02月11日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包