如何從0開發一個Vue組件庫併發布到npm

来源:https://www.cnblogs.com/zdsdididi/archive/2022/06/20/16392869.html
-Advertisement-
Play Games

1、新建文件夾在終端打開執行 npm init -y 生成package.json如下,註意如果要發佈到npm,name不能有下劃線,大寫字母等 { "name": "vuecomponentdi", "version": "1.0.0", "description": "", "main": "i ...


1、新建文件夾在終端打開執行 npm init -y

生成package.json如下,註意如果要發佈到npm,name不能有下劃線,大寫字母等

{
"name": "vuecomponentdi",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}

2、建立目錄結構

目錄結構如下

-- vueComponentDi
-- packages
-- button
-- index.js
-- index.vue
-- toast
-- index.js
-- index.vue
-- index.js
-- package.json

3、本地調試

  • vueComponentDi/index.js
export default function(){
console.log('本地調試')
}
  • 新建一個vue項目
vue create testvue

在testvue下的package.json下的測試依賴devDependencies添加vueComponentDi/index.js絕對地址

"devDependencies": {
...
"vuecomponentdi": "F:/vueComponent@Di/vueComponentDi",//根據自己實際項目地址填寫
...
}
  • 執行npm link

在testvue執行npm link將vuecomponentdi軟鏈接到node_modules中

  • vuecomponentdi安裝Eslint

由於testvue引入組件會進行Eslint檢測,不安裝會報錯(testvue關閉Eslint可省略這一步)

安裝方法:

npm install [email protected] --save-dev
./node_modules/.bin/eslint --init
  • 在testvue使用vuecomponentdi

import test from "vuecomponentdi"

<template>
<div class="home">
<img alt="Vue logo" src="../assets/logo.png">
<HelloWorld msg="Welcome to Your Vue.js App"/>
</div>
</template>

<script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue'
import test from "vuecomponentdi"
export default {
name: 'Home',
components: {
HelloWorld
},
created(){
test()
}
}
</script>

控制台列印>本地調試

4、開發一個button組件

  • button模塊:進入vueComponentDi/packages/button/index.vue
    type只支持傳入primary屬性.
    v-on = "$listemers"表示包含了父作用域中的(不含.native修飾符的) v-on事件監聽器,它可以通過v-on="$listerners"傳入內部組件
<template>
<div>
<button class="di-button" v-on="$listeners" :class="[type?`di-button--${type}`:'']"><slot></slot></button>
</div>
</template>
<script>
export default {
name:"di-button",
props:{
type:String
}
}
</script>
<style>
.di-button{
display: inline-block;
line-height: 1;
white-space: nowrap;
cursor: pointer;
background: #fff;
border: 1px solid #dcdfe6;
color: #606266;
-webkit-appearance: none;
text-align: center;
box-sizing: border-box;
outline: none;
margin: 0;
transition: .1s;
font-weight: 500;
-moz-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
padding: 12px 20px;
font-size: 14px;
border-radius: 4px;
}
.di-button:focus, .di-button:hover {
color: #409eff;
border-color: #c6e2ff;
background-color: #ecf5ff;
}
.di-button:active {
color: #3a8ee6;
border-color: #3a8ee6;
outline: none;
}
.di-button--primary {
color: #fff;
background-color: #409eff;
border-color: #409eff;
}
.di-button--primary:focus, .di-button--primary:hover {
background: #66b1ff;
border-color: #66b1ff;
color: #fff;
}
.di-button--primary.is-active, .di-button--primary:active {
background: #3a8ee6;
border-color: #3a8ee6;
color: #fff;
}
</style>
  • button模塊導出:進入vueComponentDi/packages/button/index.js

如果導出一個帶有install函數的對象,則在Vue2中可以直接使用Vue.use(xx)調用此函數,既執行 Vue.component(name,option)創建了一個組件

import button from "./index.vue"
button.install=(Vue)=>{
Vue.component(button.name,button)
}
export default button
  • 聚合導出button:進入vueComponentDi/index.js

因為開發的組件不止一個,所以需要在入口文件統一導出

import diButton from "./packages/button"
export {
diButton
}
  • 在testvue使用
<template>
<div class="home">
<di-button type="primary">按鈕</di-button>
</div>
</template>
<script>
// @ is an alias to /src

import Vue from 'vue'
import {diButton} from "vuecomponentdi"
Vue.use(diButton)
export default {
name: 'Home'
}
</script>

5、開發一個toast彈窗

  • toast模塊:vueComponentDi/packages/toast/index.vue

type只支持warning和success

<template>
<div class="di-toast" :class="`di-toast--${type}`" v-if="show">
{{message}}
</div>
</template>
<script>
export default {
data(){
return {
message:'',
show:false,
type:''
}
}
}
</script>
<style>
.di-toast{
width: 60%;
width: 200px;
background: rgb(15, 15, 15);
padding:3px;
text-align: center;
color: #fff;
border-radius: 10px;
position: fixed;
left: calc(50% - 100px);
top: 200px;
}
.di-toast--warning{
background: #FDF6EC;
color: #E6A28B;
}
.di-toast--success{
background: #F0F9EB;
color: #93C26D;
}
</style>
  • toast模塊導出:vueComponentDi/packages/toast/index.js

因為toast彈窗需要在vue中支持this.$toast調用,所以用了Vue.extend方法,這個 API 在日常開發中很少使用,一般在開發組件的時候它才能派上用場,官方定義:使用基礎 Vue 構造器,創建一個“子類”。參數是一個包含組件選項的對象

import toast from './index.vue'
toast.install = (Vue) => {
const toastConstructor = Vue.extend(toast);//使用基礎 Vue 構造器,創建一個“子類”。參數是一個包含組件選項的對象。
let $vm = new toastConstructor();//將這個子類實例化
let $el = $vm.$mount().$el;//$vm執行$mount()手動掛載會返回一個帶有$el的對象,$el就是一個dom對象
document.querySelector("body").appendChild($el);//將這個dom對象添加到body中
//在Vue原型上註入$toast方法
Vue.prototype.$toast = (option) => {
$vm.show = true
if (!(option instanceof Object)) {
//如果傳的不是對象直接彈出
$vm.message = option
} else {
$vm.message = option.message
$vm.type = option.type
}
setTimeout(() => {
$vm.show = false
}, 2000)
}
}


export default toast
  • 聚合導出:vueComponentDi/index.js
import diButton from "./packages/button"
import toast from "./packages/toast"

export {
diButton,
toast
}
  • vuetest中使用toast
<template>
<div class="home">
<di-button type="primary" @click="toast">按鈕</di-button>
</div>
</template>
<script>
// @ is an alias to /src

import Vue from "vue";
import { diButton, toast } from "vuecomponentdi";
Vue.use(diButton);
Vue.use(toast);
export default {
name: "Home",
methods: {
toast() {
// this.toast("這是一個普通彈窗");
// this.$toast({
// message: "這是一個成功彈窗",
// type: "success",
// });
this.$toast({
message: "這是一個警告彈窗",
type: "warning",
});
},
},
};
</script>

6、發佈到npm

  • 公有配置

組件開發完成需要發佈到npm以便於別人使用;因為發佈的是公有包,所以需要在vueComponentDi/package.json中配置

"publishConfig": {
"access": "public"
},

完整package.json:

{
"name": "vuecomponentdi",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"eslint": "^6.7.2",
"eslint-plugin-vue": "^8.2.0"
},
"publishConfig": {
"access": "public"
}
}

  • 發佈

npm發佈很簡單,只需要兩個命令:

npm login
npm publish

執行npm login需要你有npm賬號,可以到 npm官網 註冊
發佈完成之後就可以在任何一個vue2項目中安裝使用了:

npm install vuecomponentdi

git地址: vue組件開發


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 原文鏈接:基於開源大數據調度系統Taier的Web前端架構選型及技術實踐 課件獲取:關註公眾號**“數棧研習社”,後臺私信“Taier”**獲得直播課件 視頻回放:點擊這裡 Taier開源項目地址:github丨gitee 上兩期,我們為大家分享了Taier入門及控制台的介紹,本期我們為大家分享Ta ...
  • **導讀:**在公司內部,業務線經常面臨數據有哪些、質量如何、是否可用、能產生多大價值的困惑,並且,隨著數據量的增加,計算和存儲資源面臨瓶頸。本次將圍繞數據治理重點關註的計算、存儲等方面,分享數據治理的產品實踐。通過分享,一方面可以瞭解當前業務線主要面臨的待治理的數據問題;另一方面,從計算、存儲等主 ...
  • user_profile表: id device_id gender age university province 1 2138 male 21 北京大學 Beijing 2 3214 male 復旦大學 Shanghai 3 6543 female 20 北京大學 Beijing 4 2315 ...
  • 隨著科技的發展,用戶通過網路進行線上支付越來越方便。平時上網購物、交水電費、轉賬匯款等都需要綁定銀行卡,但要手動輸入16-19位銀行卡號,速度慢、易出錯始終是線上移動支付的一個“硬傷”。為了給移動商業企業的用戶打造優質的支付體驗,簡化操作程式已經成為提升企業競爭力的重要手段。因此,使用華為機器學習服 ...
  • 為什麼要用lerna 將大型代碼倉庫分割成多個獨立版本化的 軟體包(package)對於代碼共用來說非常有用。但是,如果某些更改 跨越了多個代碼倉庫的話將變得很 麻煩 並且難以跟蹤,並且, 跨越多個代碼倉庫的測試將迅速變得非常複雜。 為瞭解決這些(以及許多其它)問題,某些項目會將 代碼倉庫分割成多個 ...
  • 組件的出現是為了實現以下兩個目標: 降低整體複雜度,提升代碼的可讀性和可維護性 提升局部代碼的可復用性 絕大部分情況下,一個組件就是頁面中某個區域,組件包含該區域的: 功能(JS代碼) 內容(模板代碼) 樣式(CSS代碼) 要在組件中包含樣式,需要構建工具的支撐 組件開發 創建組件 組件是根據一個普 ...
  • 前言 對於傳統的 JavaScript 程式我們會使用函數和基於原型的繼承來創建可重用的組件,但對於熟悉使用面向對象方式的程式員使用這些語法就有些棘手,因為他們用的是基於類的繼承並且對象是由類構建出來的。 從 ECMAScript 2015,也就是 ES6 開始, JavaScript 程式員將能夠 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 基於Vue.js 2.x系列 + Element UI 的後臺系統許可權控制 前言:關於vue許可權路由的那些事兒…… 項目背景:現有一個後臺管理系統,共存在兩種類型的人員 ①超級管理員(稱作admin),②普通用戶(稱作editor) 每種 ...
一周排行
    -Advertisement-
    Play Games
  • JWT(JSON Web Token)是一種用於在網路應用之間傳遞信息的開放標準(RFC 7519)。它使用 JSON 對象在安全可靠的方式下傳遞信息,通常用於身份驗證和信息交換。 在Web API中,JWT通常用於對用戶進行身份驗證和授權。當用戶登錄成功後,伺服器會生成一個Token並返回給客戶端 ...
  • 老周在幾個世紀前曾寫過樹莓派相關的 iOT 水文,之所以沒寫 Nano Framework 相關的內容,是因為那時候這貨還不成熟,可玩性不高。不過,這貨現在已經相對完善,老周都把它用在項目上了——第一個是自製的智能插座,這個某寶上50多塊可以買到,搜“esp32 插座”就能找到。一種是 86 型盒子 ...
  • 引言 上一篇我們創建了一個Sample.Api項目和Sample.Repository,並且帶大家熟悉了一下Moq的概念,這一章我們來實戰一下在xUnit項目使用依賴註入。 Xunit.DependencyInjection Xunit.DependencyInjection 是一個用於 xUnit ...
  • 在 Avalonia 中,樣式是定義控制項外觀的一種方式,而控制項主題則是一組樣式和資源,用於定義應用程式的整體外觀和感覺。本文將深入探討這些概念,並提供示例代碼以幫助您更好地理解它們。 樣式是什麼? 樣式是一組屬性,用於定義控制項的外觀。它們可以包括背景色、邊框、字體樣式等。在 Avalonia 中,樣 ...
  • 在處理大型Excel工作簿時,有時候我們需要在工作表中凍結窗格,這樣可以在滾動查看數據的同時保持某些行或列固定不動。凍結窗格可以幫助我們更容易地導航和理解複雜的數據集。相反,當你不需要凍結窗格時,你可能需要解凍它們以獲得完整的視野。 下麵將介紹如何使用免費.NET庫通過C#實現凍結Excel視窗以鎖 ...
  • .NET 部署 IIS 的簡單步驟一: 下載 dotnet-hosting-x.y.z-win.exe ,下載地址:.NET Downloads (Linux, macOS, and Windows) (microsoft.com) .NET 部署 IIS 的簡單步驟二: 選擇對應的版本,點擊進入詳 ...
  • 拓展閱讀 資料庫設計工具-08-概覽 資料庫設計工具-08-powerdesigner 資料庫設計工具-09-mysql workbench 資料庫設計工具-10-dbdesign 資料庫設計工具-11-dbeaver 資料庫設計工具-12-pgmodeler 資料庫設計工具-13-erdplus ...
  • 初識STL STL,(Standard Template Library),即"標準模板庫",由惠普實驗室開發,STL中提供了非常多對信息學奧賽很有用的東西。 vector vetor是STL中的一個容器,可以看作一個不定長的數組,其基本形式為: vector<數據類型> 名字; 如: vector ...
  • 前言 最近自己做了個 Falsk 小項目,在部署上伺服器的時候,發現雖然不乏相關教程,但大多都是將自己項目代碼複製出來,不講核心邏輯,不太簡潔,於是將自己部署的經驗寫成內容分享出來。 uWSGI 簡介 uWSGI: 一種實現了多種協議(包括 uwsgi、http)並能提供伺服器搭建功能的 Pytho ...
  • 1 文本Embedding 將整個文本轉化為實數向量的技術。 Embedding優點是可將離散的詞語或句子轉化為連續的向量,就可用數學方法來處理詞語或句子,捕捉到文本的語義信息,文本和文本的關係信息。 ◉ 優質的Embedding通常會讓語義相似的文本在空間中彼此接近 ◉ 優質的Embedding相 ...