基于 CSS Grid 的简易拖拉拽 Vue3 组件,从代码到NPM发布(2)- NPM发布、在线示例

这里分享一下本开源项目是如何构建组件库及其如何发布到NPM上的,还有组件库与在线示例的构建有什么差异。

请大家动动小手,给我一个免费的 Star 吧~

大家如果发现了 Bug,欢迎来提 Issue 哟~

github源码

NPM

示例地址

版本更新信息

这两天抽空增加实现了基本的选择、调整大小等交互,欢迎大家理性交流交流哈。

在这里插入图片描述

关于构建

与构建有关的文件,主要有:

└─ dist - 构建的组件库文件
└─ docs - 构建的在线示例网站
└─ src
   └─ main.ts - 在线示例代码入口
└─ index.html - 在线示例HTML入口
└─ package.json - 库信息
└─ tsconfig.build.json - 用于构建组件库配套的类型声明文件
└─ vite.config.ts - 构建配置

关键构建信息与命令,主要有:

package.json

{
  "name": "vue3-grid-drag-resize",
  "version": "0.0.10",
  "type": "module",
  "files": [
    "dist"
  ],
  "module": "./dist/index.js",
  "types": "./dist/index.d.ts",
  "homepage": "https://github.com/xachary/vue3-grid-drag-resize",
  "scripts": {
    "build": "run-p type-check \"build-only {@}\" --",
    "build-docs": "run-p type-check \"build-only --mode docs {@}\" --",
    "build-only": "vite build"
  }
}

这里列出了和构建相关的主要信息,大部分都是为了构建 NPM 组件库必须的,指明了:

  • name 为组件库名称
  • version 版本信息
  • dist 为构建后的代码目录
  • ./dist/index.js 为代码入口
  • ./dist/index.d.ts 为类型声明文件
  • homepage 为显示在 NPM 页面中主页信息

name 必须在 NPM 上唯一的,否则发布会失败。假如非要保留你的命名,可以添加自己的命名空间,例如 @xxx/vue3-grid-drag-resize。
version 每次发布 NPM,必须增加版本号。发布成功后,不能删除,只能 deprecate。

详细看
npm-publish
npm-deprecate

这里有 3 个 构建 命令:

  • build 为构建组件库
  • build-docs 为构建在线示例
  • build-only 为 vite build 入口

build、build-docs 通过 --mode 传入 vite build,让 vite build 执行不同的构建配置信息,从而构建出 dist、docs 两个不同的目录,dist 为组件库、docs 为在线示例。

vite 构建配置,主要有:

vite.config.ts

// 略

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

// 略

import PackageJSON from './package.json'

import cssInjectedByJsPlugin from 'vite-plugin-css-injected-by-js'
import dts from 'vite-plugin-dts'

// 略

// https://vitejs.dev/config/
export default defineConfig(({ mode }) => {
  const m = mode === 'docs' ? 'docs' : 'dist'
  console.log('build mode:', m)

  return {
    plugins: [
      vue(),
      ...(m === 'dist'
        ? [
            dts({
              tsconfigPath: './tsconfig.build.json',
              rollupTypes: true
              // insertTypesEntry: true
            })
          ]
        : []),
      cssInjectedByJsPlugin()
    ],
    // 略
    build: {
      outDir: m,
      minify: m === 'dist',
      copyPublicDir: m === 'docs',
      lib:
        m === 'dist'
          ? {
              name: PackageJSON.name,
              entry: fileURLToPath(
                new URL('./src/lib/components/GridDragResize/index.ts', import.meta.url)
              ),
              formats: ['es'],
              fileName: 'index.js'
            }
          : undefined,
      rollupOptions:
        m === 'dist'
          ? {
              external: ['vue'],
              output: {
                globals: {
                  vue: 'Vue'
                }
              }
            }
          : undefined
    },
    // 略
  }
})

上面的 m 即 mode 修饰之后的值,要么是 “dist” 要么是 “docs”,即代表“组件库”和“在线示例”。

关于“plugins”

构建组件库的时候,会增加 vite-plugin-dts 插件的使用,其中 rollupTypes 指的是把左右类型声明都集中到一个声明文件中(最场景),而 tsconfig.build.json 主要是指向从那里开始生成类型声明:

tsconfig.build.json

{
  "extends": "@vue/tsconfig/tsconfig.dom.json",
  "include": ["src/lib/components/GridDragResize/*"],
  "exclude": ["src/**/__tests__/*"],
  "compilerOptions": {
    "composite": true,
    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",

    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"]
    }
  }
}

主要关注的是 extends,其余的信息与 tsconfig.app.json 基本一致。

值得注意是,生成的入口,必须 export 所有需要的模块和类型:

src/lib/components/GridDragResize/index.ts

import GridDragResize from './GridDragResize.vue'
import GridDragResizeItem from './GridDragResizeItem.vue'

import './style.less'

export * from './types' // 别忘了 export 模块以外的类型声明

export { GridDragResize, GridDragResizeItem }

组件库样式

上面看到使用一个 vite-plugin-css-injected-by-js 的插件,原因是 vite 默认情况下,构建结果如下:

└─ dist - 构建的组件库文件
   └─ index.d.ts
   └─ index.js
   └─ style.css

一般情况下,通过 import 组件即可,不应该需要额外引入 css 文件,这会造成不便。
所以,使用 vite-plugin-css-injected-by-js 插件后,构建结果变为:

└─ dist - 构建的组件库文件
   └─ index.d.ts
   └─ index.js

此时,css 已经内嵌至 index.js 中。

关于“build”

我分开一下上面的 build 配置:

1、在线示例

build: {
  outDir: 'docs', // 输出目录
  minify: false, // 不 minify
  copyPublicDir: true, // 复制 public 资源
}

vite 默认以 index.html 为入口,在这里无需过多的配置。

2、组件库

    build: {
      outDir: 'dist', // 输出目录
      minify: true, // 需要 minify
      copyPublicDir: false, // 无需复制 public 资源
      lib: {
        name: PackageJSON.name, // 组件库名称
        entry: fileURLToPath(
          new URL('./src/lib/components/GridDragResize/index.ts', import.meta.url)
        ), // 组件库代码入口
        formats: ['es'], // 只构建 es 版本
        fileName: 'index' // 构建后的文件名
      },
      // 排除 vue 库代码
      rollupOptions: {
        external: ['vue'],
        output: {
          globals: {
            vue: 'Vue'
          }
        }
      }
    }

在线示例发布

这里简单说一下是如何把开源代码的示例放到 github 上静态托管的,直接看图:
在这里插入图片描述
设置好 分支 和 静态目录,基本就可以了,稍后就会出现上面的 Visit site 地址,即可静态访问该目录作为静态网站了。

每次提交代码,都会自动更新,不过更新之前,需要等待 commit 的检查:
在这里插入图片描述

NPM发布

假设已经 build 成功了,生成好了 dist 目录,这个时候就可以准备发布 NPM 包了。

1、注册 NPM 账号
2、在终端中输入 npm adduser,根据提示会前往浏览器中进行 NPM 账号的登陆。
3、登陆成功后,输入 npm publish --access public 即可,意为“以公开的方式发布”。

小提示:这里大概率需要 科学 上网 才能发布成功。

如果一切执行成功,就将会在你的 NPM 账号中看到:

在这里插入图片描述
此时通过,类似 pnpm i vue3-grid-drag-resize,即可安装该组件库了。

今天基本分享到这!主要目的是展示最精简的组件库构建配置与 NPM 发布,更多详细信息,请异步至 Vite 和 NPM 官方文档哈!

More Stars please!勾勾手指~

github源码

NPM

示例地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/889954.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自动化测试中如何高效进行元素定位!

前言 在自动化测试中,元素定位是一项非常重要的工作。良好的元素定位可以帮助测试人员处理大量的测试用例,加快测试进度,降低工作负担。但是在实际的测试工作中,我们常常遇到各种各样的定位问题,比如元素定位失败、元…

鸿蒙开发之ArkUI 界面篇 三十三 Builder(封装容器)

鸿蒙开发中遇到容器相同、容器下面的子组件相同,就是子组件的文字不同,背景颜色不同,文字颜色不同之类,就可以使用Builder来封装,语法格式如下: 例如下面的界面: Row4个ColumImageText来实现&am…

Python WebSocket 的原理及其应用

Python WebSocket 的原理及其应用 在现代 Web 开发中,实时通信成为了越来越多应用的重要组成部分。尤其是像聊天应用、实时数据更新、在线游戏等场景,服务器与客户端之间的即时数据传输需求非常迫切。在传统的 HTTP 协议中,通信往往是基于请…

麒麟V10系统下的调试工具(网络和串口调试助手)

麒麟V10系统下的调试工具(网络和串口调试助手) 1.安装网络调试助手mnetassist arm64-main ①在linux下新建一个文件夹 mkdir /home/${USER}/NetAssist②将mnetassist arm64-main.zip拷贝到上面文件夹中,并解压给权限 cd /home/${USER}/Ne…

JS 运算符

目录 1. 赋值运算符 2. 一元运算符 2.1 自增 2.1.1 前置自增 2.1.2 后置自增 2.1.3 前置与后置自增对比 3. 比较运算符 3.1 字符串比较 4. 逻辑运算符 4.1 案例 5. 运算符优先级 1. 赋值运算符 2. 一元运算符 2.1 自增 2.1.1 前置自增 2.1.2 后置自增 2.1.3 前置与后…

Ubuntu安装Apache教程

系统版本:Ubuntu版本 23.04 Ubuntu是一款功能强大且用户友好的操作系统,而Apache是一款广泛使用的Web服务器软件。在Ubuntu上安装Apache可以帮助用户搭建自己的网站或者进行Web开发。为大家介绍如何在Ubuntu上安装Apache,并提供详细的教程和操…

日语学习零基础生活日语口语柯桥外语学校|股票用日语怎么说?

在日语中,“股票”可以说: • 株(かぶ) 这是最常用的表达方式,直接表示“股票”。 例如: 株を買う - 买股票 株を売る - 卖股票 • 株式(かぶしき) 这个词也是“股票”的意…

网站集群批量管理-Ansible(ad-hoc)

1. 概述 1. 自动化运维: 批量管理,批量分发,批量执行,维护 2. 无客户端,基于ssh进行管理与维护 2. 环境准备 环境主机ansible10.0.0.7(管理节点)nfs01 10.0.0.31(被管理节点)backup10.0.0.41(被管理节点) 2.1 创建密钥认证 安装sshpass yum install -y sshpass #!/bin/bash ##…

息肉检测数据集 yolov5 yolov8适用于目标检测训练已经调整为yolo格式可直接训练yolo网络

息肉检测数据集 yolov5 yolov8格式 息肉检测数据集介绍 数据集概述 名称:息肉检测数据集(基于某公开的分割数据集调整)用途:适用于目标检测任务,特别是内窥镜图像中的息肉检测格式:YOLO格式(边…

YOLO11改进 | 注意力机制 | 轻量级的空间组增强模块SGE【全网独家】

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 本文介绍了一个空间组增强(S…

论文笔记:Prototypical Verbalizer for Prompt-based Few-shot Tuning

论文来源:ACL 2022 论文地址:https://arxiv.org/pdf/2203.09770.pdfhttps://arxiv.org/pdf/2203.09770.pdf 论文代码:https://github.com/thunlp/OpenPrompthttps://github.com/thunlp/OpenPrompt Abstract 基于提示的预训练语言模型&#…

highcharts样式记录

图表设置 const rendChart (min, max) > {Highcharts.setOptions({global: { useUTC: false },});Highcharts.chart(hourly-chart, {chart: {spacingBottom: 0,marginLeft: 53,marginTop: 10,marginBottom: 0,marginRight: 13,style: {fontSize: 0.2rem,color: #363a44,li…

Java创建型模式(二)——工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式、工厂模式扩展等完整详解,附有代码——案例)

文章目录 五.工厂模式5.1 概述5.2简单工厂模式5.2.1 概述5.2.2 结构5.2.3 实现5.2.4 优缺点5.2.5 扩展—静态工厂 5.3 工厂方法模式5.3.1概述5.3.2 结构5.3.3 实现5.3.4 优缺点 5.4 抽象工厂模式5.4.1 概述5.4.2 结构5.4.3 实现5.4.4 优缺点5.4.5 使用场景 5.5 工厂模式扩展 五…

MyBatis-Plus 之 typeHandler 的使用

一、typeHandler 的使用 1、存储json格式字段 如果字段需要存储为json格式,可以使用JacksonTypeHandler处理器。使用方式非常简单,如下所示: 在domain实体类里面要加上,两个注解 TableName(autoResultMap true) 表示自动…

JAVA基础 day12

一、File、IO流 File是java.io.包下的类,file类的对象,用于代表当前操作系统的文件(可以代表文件、文件夹),使用File可以操作文件及文件夹。 注意:File只能对文件本身进行操作,不能读写文件里…

Redis到底是单线程还是多线程的?详解

1. Redis是单线程还是多线程的? Redis 的核心执行模型是单线程的,但自 Redis 6.0 版本起,在特定场景下支持了多线程处理。 1.1. Redis 的核心执行是单线程的 Redis 的单线程指的是 Redis 的⽹络 IO 以及键值对指令读写是由⼀个线程来执⾏的…

Unity实现自定义图集(四)

以下内容是根据Unity 2020.1.0f1版本进行编写的   在之前的篇章中已经把自定义图集在编辑器上的使用,以及运行时所需的信息都准备好了,接下来就是魔改UGUI的Image组件,使其能够像Image那样运行时如果引用的资源有打自定义图集,则加载对应自定义图集的Texture。 1、思路 …

【C语言】指针练习题

一、指针指向问题 int main() {int a[5] { 1, 2, 3, 4, 5 };int* ptr (int*)(&a 1);printf("%d,%d", *(a 1), *(ptr - 1));return 0; } 结果为:2,5。&a是整个数组(&a 1)被强转为(int*&am…

使用 Helsinki-NLP 中英文翻译本地部署 - python 实现

通过 Helsinki-NLP 本地部署中英文翻译功能。该开源模型性价比相对高,资源占用少,对于翻译要求不高的应用场景可以使用,比如单词,简单句式的中英文翻译。 该示例使用的模型下载地址:【免费】Helsinki-NLP中英文翻译本…

效率提高——自动登录校园网(河海大学)与模拟点击与输入获取最新消息

文章目录 零、前言一、自动登录校园网1.1 快速锁定小工具1.2 版本问题1.3 出现进程未结束的情况1.4 关于chromedriver.exe1.5 打包ico图片格式 二、获取信息门户最新消息参考文章 零、前言 最近被校园网弄的也是比较烦心,而且准备远程弄弄这些玩具,为以…