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

news2025/1/15 16:30:09

这里分享一下本开源项目是如何构建组件库及其如何发布到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

示例地址

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

file-unpumper:一款针对PE文件的安全分析工具

关于file-unpumper file-unpumper是一款针对PE(可移植可执行)文件的安全分析工具,可以帮助广大研究人员轻松对PE文件执行安全分析与审计任务。 file-unpumper是一款功能强大的命令行实用程序,旨在清理和分析可移植可执行(PE)文件…

XPath网页数据提取的得力助手

使用影刀RPA操作网页元素,你会发现总会有获取不到情况,这时我们就需要使用XPath来获取了。上一篇博文抓取小说内容,我们就是使用XPath来定位元素,简单快捷。 今天我们就来简单聊聊XPath! 在当今数字化的时代&#xff…

介绍 MarsCode AI:下一代智能编程助手

在现代软件开发中,效率和代码质量的提升越来越成为开发者关注的焦点。今天,我们将介绍一款革命性的编程助手—— 豆包 MarsCode 编程助手,它由北京引力弹弓科技有限公司开发,旨在极大地提高开发流程中的各种环节,让编程…

Cuda-By-Example - 4

引入Thread概念 第4章使用GPU做并行运算的例子,归结起来就是定义一个内核函数,将数组dev_a和dev_b某一对元素相加。GPU发起N个block运行内核函数。每个block有自己的索引,这样kernel就可以凭借这个索引区分自身,来计算数组对应的…

Github 优质项目推荐(第七期):涵盖免费服务、API、低代码、安卓root、深度学习

文章目录 Github优质项目推荐 - 第七期一、【LangGPT】,5.7k stars - 让每个人都成为提示专家二、【awesome-selfhosted】,198k stars - 免费软件网络服务和 Web 应用程序列表三、【public-apis】,315k stars - 免费 API四、【JeecgBoot】&am…

如何在 cPanel 中使用 PHP-FPM

PHP性能一直是影响网站托管的一个重要问题。PHP是当前网络上使用最广泛的服务器编程语言,远远领先于其他语言。最受欢迎的内容管理系统和电子商务应用程序,如WordPress、Joomla、Drupal、Magento等,都是用PHP编写的。 PHP-FPM加速了在繁忙服务…

推荐几本编程入门书目

对于编程入门,推荐以下几本书籍,这些书籍覆盖了不同的编程语言,适合零基础的学习者逐步掌握编程基础: 1. 《Python编程快速上手——让繁琐工作自动化》 特点:以简单易懂的方式介绍了Python的基础知识和编程概念&#…

2024年四非边缘鼠鼠计算机保研回忆(记录版 碎碎念)

Hi,大家好,我是半亩花海。写下这篇博客时已然是金秋十月,心中的石头终于落地,恍惚间百感交集。对于保研这条路,我处于摸着石头过河、冲击、随缘的这些状态。计算机保研向来比其他专业难,今年形势更是艰难。…

如何做好薪酬福利体系设计,更好实现员工激励?

如何做好薪酬福利体系设计,更好实现员工激励? 中国作为福利制度建设的佼佼者,尤其在新中国成立后,员工福利体系日益丰富,涵盖了健康保障、休假权益及养老规划等多元化形式,作为间接报酬,有效激…

按模板批量生成工作表

按模板批量生成工作表,前提一个模板,然后用代码遍历循环填写人名,再保存为副本,即可达到效果 按模板批量生成工作表代码 Sub 批量生成员工表()last Sheet73.Range("C65535").End(xlUp).Row 普通区域arr Sheet73…

Redis配置篇 - 指定Redis配置的三种方式,以及Redis配置文件介绍

文章目录 1 指定Redis配置的三种方式1.1 通过命令行参数来指定Redis配置1.2 通过配置文件来指定Redis配置1.3 在服务器运行时更​​改 Redis 配置 2 关于Redis配置文件 1 指定Redis配置的三种方式 1.1 通过命令行参数来指定Redis配置 在redis启动时,可以直接通过命…

UCI-HAR数据集深度剖析:训练仿真与可视化解读

在本篇文章中,我们将深入探讨如何使用Python对UCI人类活动识别(HAR)数据集进行分割和预处理,以及运用模型网络CNN对数据集进行训练仿真和可视化解读。 一、UCI-HAR数据集分析及介绍 UCI-HAR数据集是一个公开的数据集&#xff0c…

xtu oj 彩球

样例输入# 3 7 5 3 1 2 3 1 2 3 1 6 4 3 1 2 2 3 1 3 6 2 2 1 2 3 4 5 5 样例输出# Yes Yes No 滑动窗口问题 AC代码 #include<stdio.h> #define N 10005 int main(){int T;scanf("%d",&T);while(T--){int n,m,k,i,flag1;//m个k种颜色 scanf("%d%d…

【C++入门篇 - 3】:从C到C++第二篇

文章目录 从C到C第二篇new和delete命名空间命名空间的访问 cin和coutstring的基本使用 从C到C第二篇 new和delete 在C中用来向系统申请堆区的内存空间 New的作用相当于C语言中的malloc Delete的作用相当于C语言中的free 注意&#xff1a;在C语言中&#xff0c;如果内存不够…

一台电脑轻松接入CANFD总线_来可CNA板卡介绍

在工业控制领域&#xff0c;常常使用的总线技术有CAN(FD)、RS-232、RS-485、Modbus、Profibus、Profinet、EtherCAT等。RS-485以其长距离通信能力著称&#xff0c;Modbus广泛应用于PLC等设备&#xff0c;EtherCAT则以其低延迟和高实时性在自动化系统中备受青睐。 其中&#xff…

The Ether: EvilScience VM靶机打靶记录

一、靶机介绍 下载地址&#xff1a;https://www.mediafire.com/file/502nbnbkarsoisb/theEther.zip 二、信息收集 扫描一下目标靶机的ip&#xff1a;192.168.242.135 arp-scan -l 扫描端口 nmap -p- -A 192.168.242.135 这里看开放了 22&#xff0c;80端口 扫描一下目录 …

剧场的客户端形式区别,APP,小程序,H5的不同优势以及推广方案

剧场的客户端形式区别与推广策略 在数字化时代&#xff0c;剧场的线上化成为大势所趋。不同的线上平台如APP、小程序和H5各有千秋&#xff0c;如何选择最适合自己的平台&#xff0c;并制定有效的推广方案&#xff0c;成为了剧场管理者需要考虑的重要问题。 APP&#xff1a;深度…

【每日刷题】Day138

【每日刷题】Day138 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 6. Z 字形变换 - 力扣&#xff08;LeetCode&#xff09; 2. 38. 外观数列 - 力扣&#xff08;Leet…

【2024版】超详细安装教程以及环境配置和使用指南, 学Python看完这一篇就够了!

windows版本PyCharm安装 1.点击蓝色链接---->PyCharm官网&#xff0c;进入之后是这个界面。 2.点击"Download"进入下载页面 注意&#xff1a;若有老版本IDEA&#xff0c;先卸载&#xff08;控制面板卸载&#xff09;&#xff0c;再安装&#xff01; 以管理员身…

1788C - Matching Numbers

给你n&#xff0c;求permutation [ 1 , 2 n ] [1,2n] [1,2n]数字能不能构造出 n n n个数字&#xff0c;每个数字是其中两个数字之和。 偶数不行&#xff0c;通过之和相同构造n和k的关系&#xff0c;k是构造后的首项。 奇数的话&#xff0c;我们把 [ 1 , 2 n ] [1,2n] [1,2n]…