[轉]使用npm發布vue組件

😶 NPM 是隨同 NodeJS 一起安裝的 javascript 包管理工具,能解決 NodeJS 代碼部署上的很多問題

發布前的準備

注冊一個 npm 賬號

前往 NPM 官網進行注冊

初始化項目

這里用的是webpack-simple,可以理解為精簡版的vue-cli

如果沒有全局安裝 vue 的話,需要先安裝

cnpm i -g  @vue/cli-init

然后再初始化 vue 項目,我們要寫的是一個簡單的 vue 組件,不需要依賴那么多而龐大的配置,所以,這里我們用簡介版本的 webapck 配置模板

vue init webpack-simple 項目名(最好去npm官網搜一下,防止重復)

創建之后的基本目錄

創建 vue 插件并發布

創建組件文件夾

舉個例子:封裝一個返回頂部的小組件

既然是封裝組件,那我們在 src 下面創建一個 plugins 文件放我們的插件,但是考慮到萬一要寫很多個的情況,當前組件的相關文件下創建一個 returnTop 文件夾,下面創建 returnTop.vue 和 index.js 先,結構變成下面這樣:

切換到當前根目錄,安裝依賴,啟動項目

cnpm installcnpm run dev

編寫組件代碼

示例代碼
returnTop.vue

<template><div class="right-return-top"><div class="return-top" @click="returnTop" v-show="topShow"><imgsrc="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAAHdbkFIAAAACXBIWXMAAAsSAAALEgHS3X78AAADGUlEQVR4nO2aT2vTYBzHv0/S9aKw7rJz34E5mP6zrRmOjeFgKozBcFAZwkAc6sHrttNgUBBPA5HNi5eBsJPX1k1XT9p3UF/B+g4iadI2ydI0T9P0SfX3hZDmeZI8n9/3efL8acJ0XYefJN/cICckHEfLGR3zCWB+BqjWWSfNYHBsT/O6/diZuaSamW/KvZPCRzEBH5wnPMnp2Ck5y3SE+TiruH2ZAOTQIkKXMM03WM4onYoz5K48m/4BE6kdxOEGCc/UBVXHLQmd7bYM6/cBDmv77lMjrsaNvI7t4u/RbrCaNdDmANzBbnnwTW6MDsam3W3rDzOp3vHLku55XpBec5ioJY6hIYVV6AgIYOoBvLvDQTK6ySQDZhgc+6TkTvPsOr005U/BRl7BVsG3ux6m0RxYzSpIsl+uKmji+EKJFmBBtRc8hy+Ndi/PmMCZbaCJaj04yKBxZuC2pKa4r/HZqCsmAOEA1AgJgAAIgACmaFasqftIsL3+NMxrdmz9PrL+mw0gGoymvBFuFtqo3EuJAVjPG1PyWQDXeF4cGWI0gLVct/A/Vso1XpRGguAHWMl2C2/i8480gGc9iNdlbgg+gMVMv/CzK3P1c/r91AHx9j4XRHAATVV6hZ83nEuvD5d2iHc8AHxLqQdq2jf/VenGCxhamhEAARAAAQyT8J5QtITXgGiRATFgECoyIAYMQkUGxIBBqMiAGDAIFd9L+6DS1DQY0pAZIBs2W3vZtpdcx55pjmtbOKy1xo0ajQFABcDemO95ACDQlxA8orVADBiESqwBm4U0tgqh/t4OKzGPwHpegYQaZDZrdXBNyEzDx8t2gKvHqskasJZTIFuBe48CphHHFxMzYjIGrGT7gfeHQTNYGY8gsxPXMGjmvf8WuRHRGrCYMQOXbIF3gzu7cga3XaxAwolrHtCExDRU65EZEY0BxqsUZqtxyRb4ecM/mJ1SBbLNiO61Rxxfw3EouhZgfOYnsxpktDq1+PUnXy3ulk0jJPYJ1XolGkiaCNFEiAyIAYNQkQExYBAqMiAGDEJFBsSAQaj+bwMA/AVQMPelPAquSAAAAABJRU5ErkJggg=="/></div></div>
</template>
<script>export default {name: "ToolReturnTop", //決定引用組件的名稱data() {return {scroll: 0,topShow: false,};},mounted() {window.addEventListener("scroll", this.scrolls);},methods: {returnTop() {window.scroll(0, 0);},scrolls() {this.scroll =document.documentElement &&document.documentElement.scrollTop + document.body.scrollTop;if (this.scroll > window.innerHeight / 2) {this.topShow = true;} else {this.topShow = false;}},},};
</script>
<style scoped>/* 返回頂部 */.right-return-top {position: fixed;left: 0;right: 0;bottom: 20px;z-index: 9;margin: auto;}/* .return-top {width: 0.63rem;height: 0.63rem;z-index: 9;margin: 0 auto;background-color: #f9f9f9;box-shadow: 0 0.01rem 0.05rem 0 rgba(0, 0, 0, 0.2) !important;-webkit-box-shadow: 0 0.01rem 0.05rem 0 rgba(0, 0, 0, 0.2) !important;border-radius: 1rem;} */.return-top {width: 40px;height: 40px;z-index: 9;margin: 0 auto;background-color: #f9f9f9;box-shadow: 0 0.01rem 0.05rem 0 rgba(0, 0, 0, 0.2) !important;-webkit-box-shadow: 0 0.01rem 0.05rem 0 rgba(0, 0, 0, 0.2) !important;border-radius: 1rem;-webkit-animation: show 350ms ease-out forwards 1;animation: show 350ms ease-out forwards 1;}.return-top img {width: 100%;height: 100%;}@-webkit-keyframes show {0% {-webkit-transform: rotate(0deg);}25% {opacity: 0.5;-webkit-transform: rotate(-3deg) translateY(-0.2rem);}75% {-webkit-transform: rotate(3deg);}100% {opacity: 0.9;-webkit-transform: rotate(0deg);}}@keyframes show {0% {transform: rotate(0deg);}25% {opacity: 0.5;transform: rotate(-3deg) translateY(-0.2rem);}75% {transform: rotate(3deg);}100% {opacity: 0.9;transform: rotate(0deg);}}
</style>

編輯 returTop/index.js 文件,目的:將該組件作為 Vue 插件

// sumFunction 插件對應組件的名字
import returnTop from "./returnTop";// Vue.js 的插件應當有一個公開方法 install 。第一個參數是 Vue 構造器,第二個參數是一個可選的選項對象
// 此處注意,組件需要添加name屬性,代表注冊的組件名稱,也可以修改成其他的
returnTop.install = (Vue) => Vue.component(returnTop.name, returnTop); //注冊組件// 標簽的方式引入
//const install = function(Vue, opts = {}) {
//  Vue.component(sumFunction.name, sumFunction);
//}/* 支持使用標簽的方式引入 Vue是全局變量時,自動install */
//if (typeof window !== 'undefined' && window.Vue) {
//  install(window.Vue);
//}export default returnTop;

此處需要注意的是 install。 Vue 的插件必須提供一個公開方法 install,該方法會在你使用該插件,也就是 Vue.use(yourPlugin)時被調用。這樣也就給 Vue 全局注入了你的所有的組件。

在src目錄下創建index.js文件,用來統一管理組件

import Vue from 'vue';
import ReturnTop from './plugins/returnTop/index.js';//返回頂部
// ...如果還有的話繼續添加
const components = [ReturnTop,
]
//循環遍歷注冊組件,就可以向其他ui組件庫那樣,使用Vue.use()來全局使用
const install = function (Vue, opts = {}) {components.map(component => {Vue.component(component.name, component);})
}/* 支持使用標簽的方式引入 */
if (typeof window !== 'undefined' && window.Vue) {install(window.Vue);
}export default {install,ReturnTop, //在這里多寫一次可以單獨調用,例如:Vue.use(vueutils.ReturnTop)
}

修改 package.json

{"name": "km-vue-utils","description": "vue常用工具合集","version": "0.0.1","author": "SuperKM","license": "MIT",  // 開源協議// 采用commonJs入口文件,如果不配置,我們在其他項目中就不用import XX from XX來引用了,只能以包名作為起點來指定相對的路徑"main": "dist/index.js","jsnext:main": "src/index.js", // 采用es6模塊化入口"private": false, // 因為組件包是公用的,所以private為false"scripts": {"dev": "cross-env NODE_ENV=development webpack-dev-server --open --hot","build": "cross-env NODE_ENV=production webpack --progress --hide-modules"},
// 指定代碼所在的倉庫地址"repository": {"type": "git","url": "https://github.com/superliebe/vueTools.git"},
// 提交bug的地址"bugs": {"url": "https://github.com/superliebe/vueTools/issues"},// 項目官網的url"homepage": "https://github.com/superliebe/vueTools","keywords": ["vue","component","tools","superkm"], // 指定關鍵字"dependencies": {"vue": "^2.5.11"},"browserslist": ["> 1%","last 2 versions","not ie <= 8"],"devDependencies": {...}
}

修改.gitignore

因為要用 dist 文件夾,所以在.gitignore 文件中把 dist/去掉。

修改 webpack.config.js

// 原
module.exports = {entry: './src/main.js',output: {path: path.resolve(__dirname, './dist'),publicPath: '/dist/',filename: 'build.js'}
...
}
// 新
const NODE_ENV = process.env.NODE_ENV
module.exports = {entry: NODE_ENV == 'development' ? './src/main.js' : './src/index.js',output: {path: path.resolve(__dirname, './dist'),publicPath: '/dist/',filename: 'index.js',libraryTarget: 'umd', // 指定輸出格式umdNamedDefine: true // 會對 UMD 的構建過程中的 AMD 模塊進行命名。否則就使用匿名的 define}
...
}

? 發布 npm 之前必須做兩件事情。

?? - 必須 npm run build 打包一下。

?? - 必須 修改 package.json 中的版本號。

發布包到 npm

  • 已經注冊過 npm 賬號,首先登陸,登陸過一次之后,就可以直接發布


npm login --registry http://registry.npmjs.org
//適用于使用了淘寶鏡像加速的//或者npm login //未采用鏡像加速過

輸入賬號-密碼-郵箱后,提示 Logged in as *** on http://registry.npmjs.org/. 就是登陸成功了

  • 然后直接發布

npm publish --registry http://registry.npmjs.org

發布成功后提示,前往自己的 npm 庫中就可以查看到剛剛發布的 npm 包

npm 庫中

  • 如果想刪除發布的包

npm unpublish km-vuetools --force --registry http://registry.npmjs.org

npm 發布中常見錯誤

  • 409 Conflict

npm login 或者 npm adduser 時 輸入完賬號密碼郵箱后 提示 E409 Conflict 報錯 一般因為淘寶鏡像的原因

解決方案,直接 registry 鏡像源

npm login --registry http://registry.npmjs.org

  • npm ERR! 403

可能是包名已經存在,或者是郵箱未認證

使用自己發布的包

使用 cnpm 安裝依賴

cnpm i km-vue-utils -S

在 main.js 文件 或者想要引入的文件導入

import utils from "km-vue-utils";
Vue.use(utils);

在想要引用的.vue 文件中直接寫

<!-- 該名稱由封裝組件中的name屬性決定 -->
<tool-return-top></tool-return-top><!-- 如果想引用組件中包含的方法,給Vue.prototype屬性Vue.prototype.$utils = utils;在需要調用的地方直接寫this.$utils.方法文件.方法名;-->

😜😜😜


---------------------
作者:superKM
來源:CSDN
原文:https://blog.csdn.net/superKM/article/details/107096256
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!
內容解析By:CSDN,CNBLOG博客文章一鍵轉載插件

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

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

相關文章

[置頂]tcpflow 抓包

轉自&#xff1a; http://www.rwifeng.com/jekyll/update/2015/04/16/how-to-tcpflow/ tcpflow 抓包 Apr 16, 2015 大家都知道 tcpdump 是一個很方便的抓包工具&#xff0c; 但是 tcpdump 是以包為單位進行輸出的&#xff0c;閱讀起來不是很方便。 而 tcpflow 是面向 TCP 流的…

spark-2.1.0 集群安裝

1、spark安裝前提——必須安裝好Hadoop&#xff08;本人有三臺機&#xff0c;已安裝好Hadoop&#xff09; 2、下載spark&#xff0c;解壓至master機本地文件 3、修改/conf/spark-env.sh&#xff08;原名spark-env.sh.template&#xff0c;把它改過來&#xff09; 配置如下&…

如何用grep命令同時顯示“匹配行”上下的n行?

如何用grep命令同時顯示匹配行上下的n行 標準unix/linux下的grep通過以下參數控制上下文grep -C 5 foo file 顯示file文件中匹配foo字串那行以及上下5行grep -B 5 foo file 顯示foo及前5行grep -A 5 foo file 顯示foo及后5行

【CASS精品教程】CASS自動插入DOM影像(附插件下載)

本文講解在CASS中快速自動插入柵格數據(影像、DOM、DEM)等,支持tif、img等格式。 文章目錄 一、效果預覽二、插件安裝三、插件下載一、效果預覽 二、插件安裝 打開CASS9.1軟件,輸入命令appload,回車。 選擇插入影像插件,點擊【加載】。 輸入命令aimg,回車,可以進行影像…

用python來獲取Github IP地址

Title: 快速獲Github網站的IP地址 Author: JackieZheng Date: 2022-01-20 19:37:35 LastEditTime: 2022-01-22 09:14:49 LastEditors: Please set LastEditors Description: FilePath: \\vsTemp\\gitdns.pyimport os import sys import re import shutil import requestshosts_…

DNS原理及其解析過程【精彩剖析】

DNS原理及其解析過程精彩剖析原創作品&#xff0c;允許轉載&#xff0c;轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://369369.blog.51cto.com/319630/812889網絡通訊大部分是基于TCP/IP的&#xff0c;而TCP/IP是基于IP地址的&am…

sybase sp_procxmode簡述

今天整合存儲過程的腳本時&#xff0c;看到如下語句&#xff1a; sp_procxmode P_InitTaskByCond, anymodeGO 于是查詢了一下【sp_procxmode】 的一些簡單介紹&#xff0c;進行記錄一下&#xff1a;整理中 https://www.google.com.hk/search?newwindow1&safestrict&si…

基于Kubernetes v1.24.0的集群搭建(二)

上一篇文章主要是介紹了&#xff0c;每臺虛擬機的環境配置。接下來我們開始有關K8S的相關部署。另外補充一下上一篇文章中的K8S的changelog鏈接&#xff1a;https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.24.md1 配置yum源 所有節點都需要執行此…

[轉]Python 獲取Windows管理員權限

最近在寫一個可以自動更換 hosts 的 python 腳本&#xff0c;但是操作 hosts 需要管理員權限 &#xff0c;所以就想著要怎么獲取。 總結了一下&#xff0c;有三種方法可以獲取&#xff0c;下面分別介紹一下。 1. 以管理員運行 cmd 這個方法很簡單&#xff0c;也無需多說&#x…

JavaScript中的一些特殊用法(一)

為什么80%的碼農都做不了架構師&#xff1f;>>> 1. 不使用script自閉合標簽 script中使用自閉合標簽&#xff0c;雖然他在XHTML中合法&#xff0c;但是不符合HTML規范&#xff0c;而且得不到某些瀏覽器的正確解析。我曾經就在引入EXT時使用此方式&#xff0c;導致無…

SPICE簡史

如今每一天都有不知其數的半導體芯片設計公司與設計驗證工程師&#xff0c;在用著電路仿真軟件SPICE。SPICE廣泛應用在仿真模擬電路&#xff08;例如運放Op Amp&#xff0c;能隙基準穩壓電源Bandgap Reference&#xff0c;數模/模數轉換 AD/DA等&#xff09;&#xff0c;混合信…

【GlobalMapper精品教程】003:影像裁剪、批量影像分幅案例詳解

本文以案例的形式&#xff0c;講解Globalmapper中進行影像矩形框裁剪&#xff0c;矢量范圍裁剪&#xff0c;標準圖幅批量分幅的方法&#xff0c;配套實驗數據為數據包中的data003.rar。訂閱專欄后私信作者&#xff0c;獲取中文安裝包及配套實驗數據包&#xff0c;便于同步學習。…

基于Kubernetes v1.24.0的集群搭建(三)

1 使用kubeadm部署Kubernetes 如無特殊說明&#xff0c;以下操作可以在所有節點上進行。1.1 首先我們需要配置一下阿里源cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] nameKubernetes baseurlhttp://mirrors.aliyun.com/kubernetes/yum/repos/kubernet…

C++獲取本機的ip地址程序

C獲取本機的ip地址程序 #include <WinSock2.h> #pragma comment(lib,"ws2_32") //鏈接到ws2_32動態鏈接庫class CInitSock { public:CInitSock(BYTE minorVer 2,BYTE majorVer 2){WSADATA wsaData;WORD VersionRequset;VersionRequset MAKEWORD(mino…

BAT批處理代碼快速打開注冊表并定位到指定目錄

主要代碼&#xff1a; echo off echo %1 copy %~nx0 c:\windows\system32 if "%1" NEQ "" (set regPath%1) else (set /p regPath輸入打開的注冊表路徑:) :trimRight if "%regPath:~-1%""\" set "regPath%regPath:~0,-1%" …

Elasticsearch的Groovy Script自定義評分檢索

需求&#xff1a;以索引中的boostapp列作為評分的基礎分值&#xff0c;同時根據carpublishtime&#xff08;數據的刷新時間字段&#xff09;按時間進行衰減。 基于Groovy腳本實現。 1、query腳本方式&#xff1a; {"fields": ["boost","ucarid",…

stm32串口通訊問題

stm32串口通訊問題 在串口試驗中&#xff0c;串口通訊不正常&#xff0c;則可能會出現以下問題&#xff1a; 1. 配置完成后&#xff0c;串口沒有任何消息打印。 原因&#xff1a;1&#xff0c;端口配置有問題&#xff0c;需要重新檢查I/O口的配置 2&#xff0c;接線有問題&…

中國元宇宙白皮書

PS&#xff1a;PDF目錄&#xff08;書簽&#xff09;是為便于閱讀&#xff0c;重新整理過的。 2022《中國元宇宙白皮書》-互聯網文檔類資源-CSDN下載1月26日&#xff0c;2022《中國元宇宙白皮書》在北京中關村正式全網發布。該白皮書由國科創新研究院首席科學家更多下載資源、學…

【GlobalMapper精品教程】002:GlobalMapper中文版安裝后的基本設置

本文講述安裝globalmapper后的一些簡單基本設置&#xff08;持續更新&#xff09;&#xff0c;為后續深入學習軟件打下基礎。訂閱專欄后私信作者&#xff0c;獲取中文安裝包及配套實驗數據包。 文章目錄1. 工具條的顯示與關閉2. 面積單位設置3. 選擇所選面要素的邊框4. 二三維聯…

SaltStack入門篇之遠程執行和配置管理

一、SaltStack概述 Salt&#xff0c;,一種全新的基礎設施管理方式&#xff0c;部署輕松&#xff0c;在幾分鐘內可運行起來&#xff0c;擴展性好&#xff0c;很容易管理上萬臺服務器&#xff0c;速度夠快&#xff0c;服務器之間秒級通訊。 salt底層采用動態的連接總線, 使其可以…