【npm】如何将开发的vite插件发布到npm

news2024/11/28 8:49:25

前言

简单说下 npm 是什么:
npm 是一个 node 模块管理工具,也是全球最大的共享源。 npm 工具与 nodejs 配套发布,便利开发人员共享代码。npm 主要包括 npm 官方网站、CLI(控制台命令行工具)、和 registry(包/软件仓库)。

本文的插件功能为:DNS预解析
这里只用来演示如何发布到npm,该插件的功能具体是如何实现的请看本人另一篇文章:DNS解析优化。

一、创建本地项目

1. 初始化项目

生成项目目录并且初始化package.json

mkdir vite-plugin-tianbenchu-dns-prefetch
cd vite-plugin-tianbenchu-dns-prefetch
npm init -y

2. 安装开发依赖

本文使用了如下依赖

npm install vite --save-dev
npm install glob node-html-parser url-regex

3. 编写主要内容

src 目录下创建插件文件 index.js,将逻辑封装为 Vite 插件。

const fs = require("fs")
const path = require("path")
const { parse } = require("node-html-parser") // 可以脱离浏览器环境将html字符串解析成HTML节点
const { glob } = require("glob")
const urlRegex = require("url-regex") // 可以分析文件中所包含的url
const { strict } = require("assert")

const urlPattern = /(https?:\/\/[^/]*)/i // 获取外部链接
const urls = new Set() // url集合

// 遍历dist目录中的所有 HTML 文件
async function searchDomain() {
  const files = await glob("dist/**/*.{html,css,js}")
  for (const file of files) {
    const source = fs.readFileSync(file, "utf-8")
    const matches = source.match(urlRegex({ strict: true }))
    console.log(matches, "@@@@@@@@")
    if (matches) {
      matches.forEach((url) => {
        const match = url.match(urlPattern)
        if (match && match[1]) {
          urls.add(match[1]) // 将域名加到Set中
        }
      })
    }
  }
}

// 将遍历好的所有域名生成link预解析标签并插入到index.html中
async function insertLinks() {
  const files = await glob("dist/**/*.html")
  const links = [...urls]
    .map((url) => `<link rel="dns-prefetch" href="${url}">`)
    .join("\n")

  for (const file of files) {
    const html = fs.readFileSync(file, "utf-8")
    const root = parse(html)
    const head = root.querySelector("head")
    head.insertAdjacentHTML("afterbegin", links)
    fs.writeFileSync(file, root.toString(), "utf-8")
  }
}

async function main() {
  await searchDomain()
  await insertLinks()
}

main()

4. 配置package.json

{
  "name": "vite-plugin-tianbenchu-dns-prefetch",
  "version": "1.0.0",
  "main": "src/index.js",
  "scripts": {
    "build": "vite build"
  },
  "keywords": [
    "vite",
    "plugin",
    "dns-prefetch"
  ],
  "author": "TianBenChu",
  "license": "ISC",
  "description": "A Vite plugin to automatically add dns-prefetch links for external resources in the bundled HTML.",
  "devDependencies": {
    "vite": "^5.4.0"
  },
  "dependencies": {
    "glob": "^11.0.0",
    "node-html-parser": "^6.1.13",
    "url-regex": "^5.0.0"
  }
}

5. 添加README和LICENSE

书写 README.md 文件和 LICENSE 文件,以便用户了解插件的用途和使用方法。

二、本地测试

在插件项目目录外创建测试项目并安装依赖。

npm create vite@latest
npm install

插件项目中运行以下命令,将插件链接到本地 npm 包缓存中

npm link

测试项目中使用 npm link 链接本地插件,这里的链接名对应插件项目中package.json中的name。

npm link vite-plugin-tianbenchu-dns-prefetch

配置 vite.config.js,使用本地插件

import { defineConfig } from 'vite';
import dnsPrefetchPlugin from 'vite-plugin-dns-prefetch';

export default defineConfig({
  plugins: [
    dnsPrefetchPlugin()
  ]
});

本文正常测试结果如下:

1.未配置插件前执行npm run build,发现dist目录下index.html的head中并没有link标签。
在这里插入图片描述2.使用本地插件后执行npm run build,index.html的head中插入了link标签以保证dns预解析。
在这里插入图片描述

三、发布到npm

1. 登录npm账号

如何注册npm账号:npm官网链接

npm login

如果使用了淘宝镜像则会出现以下报错:
在这里插入图片描述
切换为官方注册表即可

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

2. 发布

npm publish

需要注意 package.json 中不能设置为私有,否则无法发布。

在这里插入图片描述

登录npm发现已经发布了该插件

在这里插入图片描述

3. 通过npm下载并测试插件

npm install vite-plugin-xxxxxx --save-dev

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

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

相关文章

系统架构设计定义

系统架构设计是软件开发和信息系统构建中至关重要的一环&#xff0c;它涉及到系统的整体结构、模块划分、接口定义以及设计原则等多个方面。以下是对系统架构设计的详细阐述&#xff1a; 一、系统架构设计的定义 系统架构设计是指对系统的整体结构、模块关系、接口定义以及交互…

IDEA2023版本创建mavenWeb项目及maven的相关配置

在使用idea创建maven项目之前&#xff0c;首先要确保本地已经下载并配置好maven的环境变量&#xff0c;可以参考我主页的maven下载及环境变量配置篇。 接下来首先介绍我们需要对maven安装目录文件进行的修改介绍。 maven功能配置 我们需要需改 maven/conf/settings.xml 配置…

数字孪生水利“天空地水工”一体化监测感知行动方案的框架及目标

监测感知数据是构建数字孪生水利体系的前提和基础。&#xff0c;推进物理流域监测系统科学建设和高频乃至在线运行&#xff0c;提升水利对象全要素和治理管理全过程智能监测感知能力&#xff0c;为数字孪生水利的高保真建设运行提供有力算据保障&#xff0c;支撑构建具有“四预…

博客系统测试用例报告

一、项目背景 ⼀款基于SpringBoot实现的简易⽹站&#xff0c;功能有⽤⼾注册及登录&#xff0c;博客列表展⽰&#xff0c;博客详情查看&#xff0c;博客编写和⽂章评论 点赞功能采⽤的技术有&#xff1a;HTML、CSS、Mybatis、Token、Ajax等技术。 二、项目功能 1.注册 进入…

仓颉编程入门 -- 泛型概述 , 如何定义泛型函数

泛型概述 , 如何定义泛型函数 1 . 泛型的定义 在仓颉编程语言中&#xff0c;泛型指的是参数化类型&#xff0c;参数化类型是一个在声明时未知并且需要在使用时指定的类型。类型声明与函数声明可以是泛型的。最为常见的例子就是 Array、Set 等容器类型。以数组类型为例&#xf…

inscode的会员计划的python环境问题【版本3.9.16】无法升级python

购买了inscode的会员计划后,部署python项目 遇到python环境无法升级的问题 inscode的会员计划的环境是3.9.16,但是项目用的例子需要3.10以上的版本,最终本人也无法完全解决,虽然手动安装了python3.10,一切都可以实现,但是最后环境自动恢复到3.9版本,导致自己手动配置的全…

速成cesium而忽略前端基础,你可能会遇到这些坑!

cesium作为一个功能强大的开源三维地球框架&#xff0c;做出来的效果受到众多企业的青睐。然而&#xff0c;许多小伙伴们都 希望能够快速掌握cesium&#xff0c;从而忽略了前端基础知识的重要性。这种急功近利的学习方式往往会导致一些不良后果&#xff1a; 1. 前端基础太薄弱…

【leetcode】找出与数组相加的整数II( 过程反思 思路详解 )

题目分析&#xff1a; 题目要咱们除掉nums1中的两个数&#xff0c;从另一个角度理解就是找到nums1中与nums2元素匹配的nums1.size() - 2个数 由题目可知&#xff0c;二者元素具有相差 x 的一一对应关系&#xff0c;如此&#xff0c;不难想到应首先通过对二者排序来构建大致的匹…

用Python制作开心消消乐游戏|附源码

制作一个完整的“开心消消乐”风格的游戏在Python中是一个相对复杂的项目&#xff0c;因为它涉及到图形界面、游戏逻辑、动画效果以及用户交互等多个方面。不过&#xff0c;我可以为你提供一个简化的版本和概念框架&#xff0c;帮助你理解如何开始这个项目&#xff0c;并提供一…

仪表板展示|DataEase看中国:2024巴黎奥运会中国体育代表团战绩报告

背景介绍 北京时间2024年8月12日凌晨&#xff0c;巴黎奥运会闭幕。在本届奥运会中&#xff0c;我们不仅见证了许多新世界纪录的诞生&#xff0c;更看到了中国体育的强大实力与无限潜力。中国运动健儿们卓越的表现和顽强的拼搏精神&#xff0c;不但让国人为之自豪&#xff0c;也…

普元EOS学习笔记-高低开结合方式实现图书的增删改查

1 前言 在《普元EOS学习笔记-低开实现图书的增删改查》的文章中&#xff0c;我描述了在精简应用中&#xff0c;基于低开实现图书分类的增删改查的操作&#xff0c;是为了简单展示EOS低开的能力。 低开天生会有一些问题&#xff0c;这个咱就不啰嗦了。而且&#xff0c;那篇文章…

(kali关怀版)kali调整字体图标显示大小

字体大小调整(图标字体) 字体在左上角搜apprence 图标大小调整 图标在桌面右键点apprence 任务栏大小调整 任务栏在上面右键&#xff0c;选择panel preference 终端字体大小调整 终端字体用ctrl和加号减号进行缩放 属于是kali关怀版了:) 还可指定锁屏和休眠时间&#…

科研绘图系列:Python语言箱线图

介绍 不同分组的python语言箱线图 加载Python包 import sys import pandas as pd import numpy as np import scipy as sp from scipy import stats import randomimport seaborn as sns import matplotlib.pyplot as plt from matplotlib

杂项复现-中间件

一、Apache HTTPD 多后缀解析漏洞 一、Apache HTTPD 多后缀解析漏洞 在有多个后缀的情况下&#xff0c;只要一个文件含有.php后缀的文件即将被识别成PHP文件&#xff0c;没必要是最后一个后缀。利用这个特性&#xff0c;将会造成一个可以绕过上传白名单的解析漏洞。 1、上传一个…

virtualbox 启动虚拟机后无法进入系统桌面、内存错误

我在virtualbox中创建了一个linux虚拟机、一个win10虚拟机&#xff0c;两个都在使用中偶尔遇到过启动问题。 解决方法1&#xff1a;先无界面启动&#xff0c;再显示界面 linux虚拟机 虚拟机启动后&#xff0c;进入桌面不到两分钟&#xff0c;就报错内存不可访问&#xff0c;…

大型、复杂、逼真的安全服和安全帽检测:数据集和方法

智能升级工地安全&#xff1a;SFCHD数据集与SCALE模块介绍 在人工智能&#xff08;AI&#xff09;技术飞速发展的今天&#xff0c;其在建筑工地安全领域的应用正逐渐展现出巨大潜力。尤其是高风险行业如化工厂的施工现场&#xff0c;对工人的保护措施要求极为严格。个人防护装…

PyTorch 基础学习(3) - 张量的数学操作

下面是关于PyTorch中常见数学操作的概述和教程&#xff0c;包括逐点运算、比较操作、线性代数操作等&#xff0c;突出每个操作的重点用法和示例。 逐点操作 (Pointwise Operations) 1. torch.abs 功能: 计算输入张量的每个元素的绝对值。用法: torch.abs(input)示例:import …

Oracle 专用/共享服务器连接模式(Dedicated/Shared Server)

当会话通过客户端连接到Oracle数据库时&#xff0c;根据服务器处理请求方式的不同&#xff0c;可以有两种连接模式&#xff0c;一种称为专用服务器连接&#xff08;Dedicated Server&#xff09;&#xff0c;另外一种称为共享服务器连接&#xff08;Shared Server&#xff09;。…

企业源代码也需要加密!十款好用的源代码加密软件排行榜

在当今竞争激烈的商业环境中&#xff0c;企业的源代码是其核心资产之一。为了保护这些宝贵的知识产权不被泄露&#xff0c;源代码加密成为了众多企业的重要举措。2024 年&#xff0c;市面上出现了众多功能强大的源代码加密软件。接下来&#xff0c;就让我们一同来探索十款备受好…

基于A*搜索算法的坦克动荡2路径规划问题

前言 《坦克动荡2》(Tank Trouble 2)是一款适用于PC平台的射击类网页游戏。游戏设定在一个迷宫般的竞技场中&#xff0c;玩家需要控制坦克&#xff0c;在对手摧毁自己之前先摧毁对方。本题目旨在各位自己实现A-star算法&#xff0c;并为接下来学习并自行编写替换nav2中的Plann…