【npm】基于vite制作自己的npm包+ts【超详细】

news2024/11/22 20:54:13

前言

头脑一热想做自己的npm包,但是又无从下手,于是我找到了度娘…看着别人做挺简单,自己上手真难受。一路的坑。注意事项也挺多的,所以我特地详细介绍如何制作自己的npm包,并附上ts类型检测。提升用户体验感。
初次踩坑,我的项目中,如果有不明白的,休要优化的,或者写的不对的,请留言

1.创建项目

Vite 需要 Node.js 版本 14.18+,16+。然而,有些模板需要依赖更高的 Node 版本才能正常运行,当你的包管理器发出警告时,请注意升级你的 Node 版本。
使用vite创建项目

#使用 NPM:
npm create vite@latest
#使用Yarn
yarn create vite
##使用 PNPM:
yarn create vite

在这里插入图片描述

2.规划目录

└─ customVideo    //前端
  │─ v1
    │─ lib      			  		// 项目打包后的文件
    │─ package      		// 插件文件
    ├─ src       		  	 	// 入口文件 
    ├─ types           	 	// ts类型定义
    ├─ vite              	 	// vite项目配置
    ├─ .gitignore     	 	// git忽略上传清单
    ├─ .npmignore  	 	// npm包上传忽略清单
    ├─ package.json  	// 项目或者模块包的描述
    ├─ README.md     // 项目说明
    ├─ vite.config.ts     // 项目配置
    ├─ tsconfig.build.json      // ts build配置
    └─ tsconfig.json      // ts配置

在这里插入图片描述

3.配置项目

vite.config.ts相关配置项

import { Plugin ,defineConfig } from 'vite'
import path, { join } from 'path';
import setupPlugins from "./vite/plugins";
import dts from "vite-plugin-dts"
import vue from '@vitejs/plugin-vue'

export default defineConfig(({ command, mode }) => {
  const isBuild = command == 'build'

  return {
    publicPath:"/",
    plugins: [
    vue({ reactivityTransform: true },
        //生成ts声明文件
        dts({
        include:"./package"
    })],
    //设置别名
    resolve: {
      alias: {
        "@/package": join(__dirname, './package/')
      },
      extensions: [".vue",'.js', '.json', '.ts', '.tsx'],//使用别名省略的后缀名
    },
    build: {
      outDir: "lib", //输出文件名称
      lib: {
        entry: join(__dirname, './package/index.ts'), //指定组件编译入口文件
        name: 'vueVideoXg',
        fileName: (format) => `index.${format}.js` // 打包后的文件名
      }, //库编译模式配置
      rollupOptions: {
        // 确保外部化处理那些你不想打包进库的依赖
        external: ["vue"],
        output: {
          // 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量
          globals: {
            vue: "Vue",
          },
        },
      }, // rollup打包配置
    }
  }

})

tsconfig.json相关配置项

{
  "compilerOptions": {
    "target": "ESNext",
    "noImplicitAny": false, //关闭any提示
    "useDefineForClassFields": true,
    "suppressImplicitAnyIndexErrors":false,
    "module": "ESNext",
    "moduleResolution": "Node",
    "strict": true,
    "jsx": "preserve",
    "sourceMap": true,
    "resolveJsonModule": true,
    "isolatedModules": true,
    "esModuleInterop": true,
    "lib": ["ESNext", "DOM"],`在这里插入代码片`
    "skipLibCheck": true,
    "paths": {
      "@/*": ["./src/*"],
      "@/package/*": ["./package/*"]
    }
  },
  //需要编译的文件
  "include": [
    "package/**/*.ts",
    "package/**/*.d.ts",
    "package/**/*.tsx",
    "package/**/*.vue"
  ],
  "references": [{ "path": "./tsconfig.node.json" }],
  "exclude": ["node_modules", "lib"]
}

.npmignore相关配置项(设置npm上传忽略目录和文件)

# 忽略目录
.idea
.vscode
scripts/
packages/
public/
node_modules/
src/
types/
vite/

# 忽略指定文件
vite.config.ts
tsconfig.json
.gitignore
*.map

.gitignore相关配置项(设置git上传忽略目录和文件)

node_modules
lib
yarn.lock

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

4.开发组件

在这里插入图片描述

pagckage/index.ts

import CustomVideo from "./customVideo"
import {App} from "vue";
let comps = [CustomVideo]
const install = (Vue:App) =>{
    comps.map((component:any)=>{
        Vue.component(component.__name as string, component);
    })
}
//使用import.meta.globEager遍历获取文件,会丢失icon图标和style样式
//获取文件
// const components:any = import.meta.globEager('./**/*.vue');
// const install = (Vue:any) =>{
//     for(let i in components) {
//         let component = components[i].default;
//         //注册组件
//         Vue.component(component.__name, component);
//     }
// }

let windowObj = window as any
/* 支持使用标签的方式引入 */
if (typeof windowObj !== 'undefined' && windowObj.Vue) {
    install(windowObj.Vue);
}

export default install

package/customVideo/index.ts

import "./assets/font/iconfont.css"
import "./assets/css/base.less"
import customVideo from "./src/customVideo.vue"

export default customVideo

其他文件代码:https://gitee.com/derekgo

5.发布组件

package.json相关配置项
在这里插入图片描述

{
  "name": "vue-video-xg",#包名,在npm官网名称中不可重复
  "version": "0.0.19",#项目版本号,每次发布需要修改版本号,不能与历史版本号重复
  "author": "沉默小管",#插件作责
  "description": "vue3自定义视频播放器",#报名描述
  "main": "dist/index.umd.js",#项目入口文件
  "module": "dist/index.es.js",
  "style": "dist/style.css",
  "types": "dist/index.d.ts",#types文件,TS组件需要。
  "files": ["dist"],#发布文件
  "scripts": {
    "dev": "vite",
    "build": "vue-tsc --noEmit && vite build",#vue-tsc --noEmit对文件进行类型检查,不进行编译输出
    "preview": "vite preview"
  },
  "dependencies": {
    "less": "^4.1.3",
    "less-loader": "^11.1.3",
    "loader": "^2.1.1",
    "path": "^0.12.7",
    "vite-plugin-compression": "^0.5.1",
    "vite-plugin-dts": "1.4.1",
    "vue": "^3.2.47",
    "vue-video-xg": "^0.0.19"
  },
  "devDependencies": {
    "@types/node": "^20.3.3",
    "@vitejs/plugin-vue": "^4.1.0",
    "typescript": "^5.0.2",
    "vite": "^4.3.9",
    "vue-tsc": "^1.4.2"
  },
  "keywords": [#关键词
    "vue-video",
    "vue-video-xg",
    "vue3",
    "vue3-video"
  ],
  "license": "MIT",#开源协议
  "homepage": "https://gitee.com/derekgo/tool-collection/blob/master/customVideo/vue3/pluginVersion/v1/README.md",
  "repository": "https://gitee.com/derekgo/tool-collection/tree/master/customVideo/vue3/pluginVersion/v1/lib"
}

执行打包命令

yarn build

在这里插入图片描述

编写README.md文件
README.md源码:源码文件

npm发布
修改好package.json内发布的版本号,然后进入项目根目录,发布项目。
1.登陆

npm login

2.发布

npm publish

6.注意事项

1.不能使用import.meta.globEager遍历获取文件,打包运行后会丢失图标和样式等
2.发布项目前需要修改pacage.json版本号,不能与历史版本重复

7.项目源码

项目源码
打包后源码

踩坑不易,还希望各位大佬支持一下 \textcolor{gray}{踩坑不易,还希望各位大佬支持一下} 踩坑不易,还希望各位大佬支持一下

📃 我的开源项目: \textcolor{green}{我的开源项目:} 我的开源项目: vueCms.cn

🔥 技术交流 Q Q 群: 837051545 \textcolor{green}{技术交流QQ群:837051545} 技术交流QQ群:837051545

👍 点赞,你的认可是我创作的动力! \textcolor{green}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向! \textcolor{green}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富! \textcolor{green}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!

如果有不懂可以留言,我看到了应该会回复
如有错误,请多多指教

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

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

相关文章

如何编写高质量的测试计划

1.1目的 简述本计划的目的,旨在说明各种测试阶段任务、人员分配和时间安排、工作规范等。 测试计划在策略和方法的高度说明如何计划、组织和管理测试项目。测试计划包含足够的信息使测试人员明白项目需要做什么是如何运作的。另外,清晰的文档结构能使任…

three.js学习2(基础)

目录 前言: 参考文档(gsap使用): 目标一、使物体移动、旋转 Ⅰ、设置时钟方式 Ⅱ、使用gsap 1、安装 2、引入使用 目标二、自适应 目标三、双击全屏或者退出全屏 前言: 上面学习了three.js在页面上的简单显示…

【Java项目实战-牛客社区】--idea maven配置

第一 IDEA集成Maven插件,并配置Maven 以下步骤中,重点关注红色方框的配置 第二 IDEA 创建 Maven 项目 步骤一:创建模块,选择Maven,点击Next 步骤二:填写模块名称,坐标信息,点击finis…

vue2 实现后台管理系统左侧菜单联动实现 tab根据路由切换联动内容,并支持移动端框架

效果图: pc端 移动端 由于代码比较多,我这里就不一一介绍了,可以去我的git上把项目拉下来 git地址https://gitee.com/Flechazo7/htglck.git 后台我是用node写的有需要的可以评论联系

EDM营销过时了?不,这才是跨境电商成功的最佳工具

根据最近的一项研究,电子邮件仍然是最具说服力的营销工具和沟通形式之一。虽然即时通讯等其他渠道正在扎根,但电子邮件仍然是影响最深远的商业交流形式。到2023年,每天发送和接收的电子邮件总数可能会超过333亿封。所以,如果您希望…

Tensorflow和Keras安装流程,jupyter无法使用keras解决方案

Tensorflow和Keras安装流程,jupyter无法使用keras解决方案 1.Base: anaconda https://www.anaconda.com/download 2.安装python3.8,Tensorflow2.13.0,Keras2.13.1 –创建conda环境-在Anaconda Prompt中输入命令, conda create -n tensorfl…

安森美深力科汽车空调自动控制方案,助力推动能效、安全、节能、环保

NCV4266-2CST50T3G 安森美深力科汽车空调自动控制方案,助力推动能效、安全、节能、环保 汽车智能化、自动驾驶、电动汽车/汽车功能电子化等趋势的推进正使汽车变得更加安全、舒适、环保和节能,是创新的关键。为自动驾驶、汽车功能电子化、传统动力总成…

[JavaScript游戏开发] 2D二维地图绘制、人物移动、障碍检测

系列文章目录 第一章 2D二维地图绘制、人物移动、障碍检测 文章目录 系列文章目录前言一、列计划1.1、目标1.2、步骤 二、使用步骤2.1、准备素材(图片):草坪、人物(熊猫)、障碍(石头)2.2、初始化布局(表格),边距设置为0,无边框,设…

ASFF Learning Spatial Fusion for Single-Shot Object Detection 论文学习

1. 解决了什么问题? 目标检测取得了显著成绩,但是检测不同尺度的目标仍然是一个挑战。金字塔或多层级特征是解决目标检测中尺度变化的常用手段。但对于单阶段目标检测器而言,各特征尺度之间不一致性制约了算法的表现。与图像金字塔相比&…

Java版知识付费源码 Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台

知识付费平台主要指的是能够通过付费来满足用户知识需求的平台,用户可以通过该平台来消费知识或者开展知识买卖等行为。 此处的平台是一个广义的概念,可以是微信小程序或者论坛,也可以是网页或者手机APP,等,就我国的情…

新东方教育收入前景良好,估值低迷,股票回购令人失望

来源:猛兽财经 作者:猛兽财经 分析师对新东方的收入预测 考虑到新东方(EDU)的销售指引和卖方分析师的预测,猛兽财经认为,新东方目前的收入增长前景非常好。 根据其财务指引的中点,新东方预计其…

Mysql——》InnoDB内存结构和磁盘存储结构

推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

options 预检测请求

文章目录 产生原因简单请求复杂请求携带了 cookie 情况 优化预检测请求 产生原因 在跨域的情况下,如果浏览器发送的是复杂请求,会先发送一个 OPTIONS 预检测请求,从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实…

认识Spring(1)

hi,大家好,今天继续为大家带来Spring的相关内容 文章目录 🧁1.理解Spring和IOC🧁2.DI和DF🍸2.1什么是DI🍸2.2什么是DF🍸2.3DI和DF的区别 🧁3 Spring创建和使用🍸3.1创建Spring项目&#x1f361…

如何调整Vivado菜单栏字体大小

Vivado整体字体缩放开关 点击齿轮图标Settings 点击齿轮图标Settings Tool Settings下找到Display选项:找到Scaling选项选择User defined即可调整缩放倍率(100/125/150/175%…)。 点击Apply重启后生效

字符函数和字符串函数上篇(详解)

❤️ 作者简介 :RO-BERRY 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识,对纯音乐有独特的喜爱 📗 日后方向 : 偏向于CPP开发以及大数据方向,如果你也感兴趣的话欢迎关注博主,期待更新 字符函数和字符串函数 &a…

css之flex两端对齐,且元素自动换行、flex、flow

文章目录 效果图htmlstyleflex-flow 效果图 html <div class"parent_element"><div class"item">7</div><div class"item">7</div><div class"item">7</div><div class"item"…

红队打靶:KIOPTRIX1.2打靶思路详解(vulnhub)

目录 写在开头 第一步&#xff1a;主机发现和端口扫描 第二步&#xff1a;Web渗透与CMS漏洞利用 第三步&#xff1a;敏感信息搜索 第四步&#xff1a;SSH登录与提权 总结与思考 写在开头 本篇博客根据大佬红队笔记的视频进行打靶&#xff0c;详述了打靶的每一步思路&a…

ACL 2023 | 通过语音离散表示统一语音翻译和机器翻译

前言 在当今全球化和多元文化的时代&#xff0c;语音翻译技术正成为我们跨越语言障碍的得力助手&#xff01;语音翻译&#xff08;Speech Translation, ST&#xff09;旨在将源语言语音翻译成目标语言文本&#xff0c;广泛应用于会议演讲翻译、视频字幕翻译、AR增强翻译等各种…

【启发式算法】灰狼优化算法【附python实现代码】

写在前面&#xff1a; 首先感谢兄弟们的订阅&#xff0c;让我有创作的动力&#xff0c;在创作过程我会尽最大能力&#xff0c;保证作品的质量&#xff0c;如果有问题&#xff0c;可以私信我&#xff0c;让我们携手共进&#xff0c;共创辉煌。 路虽远&#xff0c;行则将至&#…