[转]使用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.mzph.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 流的…

【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…

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

上一篇文章主要是介绍了&#xff0c;每台虚拟机的环境配置。接下来我们开始有关K8S的相关部署。另外补充一下上一篇文章中的K8S的changelog链接&#xff1a;https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.24.md1 配置yum源 所有节点都需要执行此…

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…

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%" …

中国元宇宙白皮书

PS&#xff1a;PDF目录&#xff08;书签&#xff09;是为便于阅读&#xff0c;重新整理过的。 2022《中国元宇宙白皮书》-互联网文档类资源-CSDN下载1月26日&#xff0c;2022《中国元宇宙白皮书》在北京中关村正式全网发布。该白皮书由国科创新研究院首席科学家更多下载资源、学…

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

本文讲述安装globalmapper后的一些简单基本设置&#xff08;持续更新&#xff09;&#xff0c;为后续深入学习软件打下基础。订阅专栏后私信作者&#xff0c;获取中文安装包及配套实验数据包。 文章目录1. 工具条的显示与关闭2. 面积单位设置3. 选择所选面要素的边框4. 二三维联…

【GlobalMapper精品教程】005:影像拼接与裁切(分幅)作业案例教程

本文讲述Globalmapper影像拼接与裁剪案例教程。 文章目录 一、影像的拼接(1)针对少量影像的拼接(2)针对大量影像的拼接二、影像的裁剪一、影像的拼接 (1)针对少量影像的拼接 如果影像数量比较小,可以通过加载→导出的方式进行拼接。 如下图所示,案例数据(配套实验数…

元宇宙行业深度研究报告:为什么元宇宙是下一代互联网?

目录 1、什么是元宇宙&#xff1f;为什么元宇宙是下一代互联网 1.1、 元宇宙&#xff1a;下一代沉浸式互联网 1.1.1、超越虚拟与现实的科幻畅想&#xff1a;元宇宙概念来源 1.1.2、新技术由点突破连接成面&#xff0c;移动互联网继承者的孕育 1.1.3、元宇宙的五大要素&…

redis 安装错误 jemalloc.h: No such file or directory

为什么80%的码农都做不了架构师&#xff1f;>>> 错误描述 [rootmysql-rtb-slave redis-4.0.1]# make && make install cd src && make all make[1]: Entering directory /usr/local/src/redis-4.0.1/srcCC Makefile.dep make[1]: Leaving director…

OAuth,JWT ,OIDC你们搞得我好乱啊

hi&#xff0c;这里是桑小榆&#xff0c;这次分享的不是生活文&#xff0c;而是技术文。基于OAuth2.0协议的授权认证&#xff0c;初次接触授权认证知识的时候&#xff0c;出现了不少热门名词&#xff0c;“OAuth”&#xff0c;“JWT”&#xff0c;“OIDC”&#xff0c;这简直让…

软件测试技术第二次作业——程序错误的判断

在做作业之前我们首先要明确软件测试过程中的几个名词&#xff1a; Fault&#xff1a;在软件测试中&#xff0c;fault是指程序中静态的缺陷&#xff0c;也就是指在程序中存在的编程错误。 Error&#xff1a;在软件测试中&#xff0c;error是指由于程序中存在的fault而产生的不正…

不只是日志收集,项目监控工具Sentry的安装、配置、使用

前言上一篇文章介绍了ExceptionLess这个日志收集系统&#xff1a;ExceptionLess的安装、配置、使用由于ExceptionLess官方提供的客户端只有.Net/.NetCore平台和js的&#xff0c;本文继续介绍另一个日志收集系统&#xff1a;SentrySentry 是一个实时事件日志记录和聚合平台。&am…

64个数据分析常用术语

导读&#xff1a;本篇文章&#xff0c;我们来讲讲数据分析常用语。 内容综合整理自网络 01 绝对数和相对数 绝对数&#xff1a;是反应客观现象总体在一定时间、一定地点下的总规模、总水平的综合性指标&#xff0c;也是数据分析中常用的指标。比如年GDP&#xff0c;总人口等等。…