npm 發布流程——從創建組件到發布到 npm 倉庫

1. 準備組件

1.1 創建一個 Vue 組件

假設我們要創建一個簡單的按鈕組件:

src/MyButton.vue

<template><button class="my-btn" @click="$emit('click')"><slot /></button>
</template><script setup lang="ts">// 可以在這里加 props
</script><style scoped>
.my-btn {padding: 8px 16px;background: #42b983;color: white;border-radius: 4px;cursor: pointer;
}
</style>

2. 項目結構和 package.json 配置

2.1 項目結構

my-button-component/
├─ src/
│  └─ MyButton.vue
├─ dist/              # 打包后的文件(發布到 npm 后包含的文件)
├─ package.json       # npm 包配置
├─ vite.config.ts     # Vite 配置(用來打包組件)
├─ .npmignore         # 發布時忽略不需要的文件
└─ README.md          # 組件說明

2.2 package.json 配置

你需要配置 package.json,確保別人能夠正確安裝和使用組件。最重要的是配置好 入口文件類型聲明

{"name": "@your-username/my-button",  // 組件的 npm 包名(如果是私有發布需要用組織名)"version": "1.0.0","main": "dist/index.cjs.js",         // CommonJS 入口"module": "dist/index.esm.js",       // ES Module 入口"types": "dist/index.d.ts",          // 類型聲明"scripts": {"build": "vite build"              // 構建命令},"peerDependencies": {"vue": "^3.0.0"                    // 依賴 Vue},"devDependencies": {"vite": "^3.0.0",                  // 構建工具"typescript": "^4.0.0",            // TypeScript 支持"@vitejs/plugin-vue": "^3.0.0"     // Vue 插件},"keywords": ["vue", "component", "button"],"author": "Your Name","license": "MIT"
}

2.3 .npmignore 文件

你需要確保不把 src/node_modules/ 和一些不必要的文件(例如測試文件、文檔等)發布到 npm 上。你可以在 .npmignore 中指定這些文件。

.npmignore

src/            # 源代碼文件夾
node_modules/   # 不需要發布 node_modules
example/        # 示例文件夾
.vscode/         # 編輯器配置
.git/           # Git 配置
tests/          # 測試文件
README.md       # 可選,通常 README 會發布到 npm

3. 配置構建工具(Vite)

為了讓 Vue 組件能夠正確地打包成 npm 包,你可以使用 Vite 來打包它。

3.1 安裝 Vite 和相關依賴

首先安裝 Vite 和 Vue 插件,便于構建和打包 Vue 組件。

npm install vite @vitejs/plugin-vue --save-dev

3.2 配置 vite.config.ts

在根目錄下創建 vite.config.ts 來配置 Vite 打包,確保它正確打包 Vue 組件并生成類型聲明文件。

vite.config.ts

import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import dts from "vite-plugin-dts";  // 用來生成類型聲明文件export default defineConfig({plugins: [vue(), dts()],build: {lib: {entry: "src/index.ts",   // 入口文件name: "MyButton",        // 全局變量名(UMD格式)fileName: "index",       // 輸出的文件名},rollupOptions: {external: ["vue"],       // 確保 Vue 作為外部依賴,不打包進來output: {globals: {vue: "Vue",           // UMD 格式時,全局變量名稱},},},},
});

3.3 創建 src/index.ts 文件

src/index.ts

import MyButton from "./MyButton.vue";// 作為模塊導出
export { MyButton };// 或者提供一個 install 方法以支持全局注冊
import type { App } from "vue";
export default {install(app: App) {app.component("MyButton", MyButton);},
};

4. 本地測試

在發布之前,你可以通過本地測試來驗證組件是否能夠正常工作。

4.1 創建一個本地測試項目(可選)

在本地創建一個簡單的 Vue 項目,然后從你的組件庫中導入并測試:

cd example
npm install ../my-button-component
<template><MyButton @click="handleClick">點擊我</MyButton>
</template><script setup>
import { MyButton } from "@your-username/my-button";const handleClick = () => {console.log("按鈕被點擊了");
};
</script>

4.2 運行本地測試

在本地測試是否一切正常。如果都可以正常使用,就可以繼續發布。


5. 發布到 npm

5.1 登錄 npm

如果你還沒有登錄 npm,你需要先執行登錄命令:

npm login

5.2 打包并發布

運行以下命令進行打包,并發布到 npm:

npm run build
npm publish --access public

如果是私有包,可以改成:

npm publish --access restricted

6. 其他建議

  • 版本管理:每次修改組件時,需要更新 package.json 中的 version,遵循語義化版本(SemVer)規則:major.minor.patch
  • README.md:在 README.md 中寫好文檔,描述組件的用法、安裝方式、配置選項等。
  • CI/CD:可以設置 CI/CD 來自動化打包和發布,比如使用 GitHub Actions 或 GitLab CI 來實現。

7. 使用

發布成功后,別人就可以通過 npm 安裝并使用你的組件了:

npm install @your-username/my-button

然后就可以在 Vue 項目中這樣使用:

<template><MyButton @click="handleClick">點擊我</MyButton>
</template><script setup>
import { MyButton } from "@your-username/my-button";const handleClick = () => {console.log("按鈕被點擊了");
};
</script>

這樣,整個 發布到 npm 的流程就完成了!你可以根據需要隨時更新和發布新版本。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/96605.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/96605.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/96605.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL入門基礎指南

目錄 一、什么是數據庫&#xff1f; 僅依靠文件存儲數據存在以下幾個明顯缺點&#xff1a; 數據庫的存儲介質通常包括&#xff1a; 二、主流數據庫介紹 三、客戶端 VS 服務器 四、推薦看的MySQL安裝技術博客 五、數據庫的存儲介質 數據庫的存儲介質主要分為以下兩類&am…

【實戰中提升自己完結篇】分支篇之分支之無線、內網安全與QOS部署(完結)

1 1拓撲 「模擬器、工具合集」復制整段內容 鏈接&#xff1a;https://docs.qq.com/sheet/DV0xxTmFDRFVoY1dQ?tab7ulgil1 分支無線部署 說明&#xff1a;分支無線用瘦AP部署&#xff0c;通過VPN直接注冊到總部的AC上面&#xff0c;實現無線的業務提供&…

帶你了解STM32:GPIO通用輸入輸出口

目錄 3.1 GPIO簡介 3.2 GPIO基本結構 3.3 GPIO位結構 輸入部分&#xff1a; 二極管的保護作用&#xff1a; 施密特觸發器&#xff1a; 片上外設端口 輸出部分&#xff1a; MOS管 3.4 GPIO模式 3.4.1 浮空/上拉/下拉輸入 3.4.2 模擬輸入 3.4.3 開漏/推挽輸出 3.4.…

Http(自寫)

作為一個程序員&#xff0c;假設我們要在a電腦的進程里發一段數據到b電腦&#xff0c;一般使用socket編程&#xff0c;可選項也就tcp&#xff0c;udp二選一socket本質上就是一個代碼庫tcp有粘包問題&#xff08;字節流&#xff09;&#xff0c;純裸tcp不能之際拿來使用所以我們…

C#使用OpenVinoSharp和PP-Human進行行人檢測

效果 項目依賴 OpenCvSharp 4.11.0.20250507 OpenVINO.CSharp.Windows 2024.0.0.1 主要代碼 using OpenCvSharp; using OpenVinoSharp; using System; using System.Windows.Forms;namespace HelloPPHuman {public partial class Form1 : Form{public Form1(){InitializeCo…

四、Scala深入面向對象:類、對象與伴生關系

在前幾節中&#xff0c;我們學習了 Scala 的基礎語法和流程控制。現在&#xff0c;我們將深入探索 Scala 作為一門純粹的面向對象語言的核心。在 Scala 中&#xff0c;萬物皆對象&#xff0c;沒有像 Java 那樣的原始類型和靜態成員的區分。本節將重點介紹如何定義對象的藍圖&am…

【大語言模型 58】分布式文件系統:訓練數據高效存儲

分布式文件系統&#xff1a;訓練數據高效存儲 關鍵詞&#xff1a;分布式文件系統、HDFS、Lustre、GlusterFS、數據本地性、I/O優化、存儲架構、大數據存儲、訓練數據管理、存儲性能調優 摘要&#xff1a;本文深入探討大語言模型訓練中的分布式文件系統技術&#xff0c;從存儲架…

【科研繪圖系列】R語言繪制散點圖以及線性回歸擬合曲線圖

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹 加載R包 數據下載 函數 導入數據 數據預處理 畫圖 總結 系統信息 介紹 數據導入 代碼的開始部分涉及多個數據集的導入,這些數據集涵蓋了不同類型的生態學數據,包括實驗室培養…

SQL 數據庫操作語言詳解

1. SQL 語言概述SQL&#xff08;Structured Query Language&#xff09;是用于管理關系型數據庫的標準語言&#xff0c;主要分為以下幾個子語言&#xff1a;- DQL&#xff08;數據查詢語言&#xff09;&#xff1a;SELECT - 用于數據查詢 - DML&#xff08;數據操作語言&#x…

積分變換的前世今生

積分變換常應用于解微分方程微分方程的解法&#xff1a;時域經典法&#xff1b;頻域變換法&#xff1b;“積分變換”最初并不是為了解微分方程&#xff0c;而是出于更“純粹”的數學動機——理解函數的結構、求解代數或幾何問題&#xff0c;以及簡化復雜的積分運算。微分方程的…

《Linux——gflags》

一、什么是gflags&#xff1f; gflags 是一個由 Google 開發的命令行參數解析庫&#xff0c;主要用于在 C&#xff08;也支持其他語言&#xff09;程序中便捷地處理命令行參數。它的核心作用是幫助開發者快速定義、解析和使用命令行選項&#xff0c;避免手動編寫繁瑣的參數解析…

編譯器的前端中端和后端

前面說的詞法分析和語法分析&#xff0c;確實是編譯器前端 (Front End) 最核心的兩個部分。但前端的工作還沒有結束。編譯器各階段劃分 一個完整的編譯器通常可以分為三個部分&#xff1a;前端、中端 (Middle End)、后端 (Back End)。 前端 (Front End) 核心職責: 理解源代碼。…

黑馬Java進階教程,全面剖析Java多線程編程,并發和并行,筆記02

黑馬Java進階教程&#xff0c;全面剖析Java多線程編程&#xff0c;并發和并行&#xff0c;筆記02 一、并發和并行 并發&#xff1a;在同一時刻&#xff0c;有多個指令在單個CPU上交替執行 并行&#xff1a;在同一時刻&#xff0c;有多個指令在多個CPU上同時執行 二、為什么有…

20250908 背包DP總結

引子 ~ 我們都有一個家&#xff0c;名字叫背包 ~ 背包DP 顧名思義&#xff0c;背包DP是用來解決背包最值問題的。題目會給出背包的容量&#xff0c;以及幾個物品的屬性&#xff0c;比如重量&#xff0c;價值&#xff0c;限額等等&#xff0c;具體是什么看題目。 01背包 01…

Redis持久化之RDB:快照機制原理、配置與最佳實踐

Redis持久化之RDB&#xff1a;快照機制原理、配置與最佳實踐 1. RDB持久化概述 1.1 什么是RDB RDB&#xff08;Redis Database&#xff09;是Redis的默認持久化方式&#xff0c;它在指定的時間間隔內生成數據集的快照&#xff08;snapshot&#xff09;&#xff0c;并將快照保…

daily notes[44]

文章目錄基礎references基礎 hello,world是幾乎所有編程語言的第一例子&#xff0c;rust也不例外。但和其它語言不一樣&#xff0c;Rust的源碼最好擁有自己的項目目錄。 $ mkdir ~/pro $ cd ~/pro $ mkdir helloWorld $ cd helloWorld源代碼文件名為main.rs&#xff0c;內容如…

JavaScript對象創建方式完全指南:從原始到現代的演進之路

前言 作為一名前端開發者&#xff0c;JavaScript中對象創建是很重要。在JavaScript這門基于原型的語言中&#xff0c;對象幾乎無處不在。今天&#xff0c;我將帶領大家回顧JavaScript對象創建的7種方式&#xff0c;從最原始的字面量到現代的ES6 class&#xff0c;每一步演進都解…

基于單片機的無線水塔監控系統設計(論文+源碼)

本設計為基于單片機的無線水塔監控系統設計&#xff0c;主要由以下幾部分組成&#xff1a;均采用STC89C52RC單片機為主控&#xff1b;主機&#xff1a;NRF24L01無線通訊模塊&#xff0c;1602LCD液晶顯示屏。從機&#xff1a;NRF24L01無線通訊模塊&#xff0c;水位傳感器&#x…

凌晨0-3點不睡,你熬的不是夜,是人生!

“熬夜”這個詞&#xff0c;早已成為現代生活的常態。有人為了工作加班到深夜&#xff0c;有人為了娛樂刷劇到天明&#xff0c;但你知道嗎&#xff1f;熬夜最“要命”的時間段&#xff0c;其實是凌晨0點到凌晨3點。別以為只是少睡幾個小時而已&#xff0c;這個時間段不睡&#…

大語言模型基石:Transformer

一、引言 如今火爆的 GPT、LLaMA、通義千問、ChatGLM 等大語言模型&#xff0c;背后都離不開一個核心架構——Transformer。 2017 年&#xff0c;Google 在論文《Attention Is All You Need》中首次提出 Transformer 模型&#xff0c;徹底改變了自然語言處理的發展方向。它摒…