基于vue-cli快速发布vue npm 包

一、编写组件

1. 初始化项目并运行
vue create vue-digital-count

npm run serve
2. 组件封装
  • 新建package文件夹

​ 因为我们可能会封装多个组件,所以在src下面新建一个package文件夹用来存放所有需要上传的组件。
​ 当然,如果只有一个组件,直接放到src下面也无可厚非。
在这里插入图片描述

  • 编写组件代码 digitalCount
    可通过正常组件使用流程引入进行开发、调试
<template>
  <div class="module-count-box"> 
    <div v-for="(site, index) in list" :key="index">
      <div v-if="site.num !== ','" class="site-item">
        <!-- :style 动态移动距离 -->
        <div class="num-list-box" :style="{ top:'-'+site.top+'px' }">
          <p v-for="num in numList" :key="num + '-' + Math.random()" class="num-item">{{ num }}</p>
        </div>
      </div>
      <div v-else class="comma-item">,</div>
    </div>
  </div>
</template>

<script>
  export default {
  	// 必须要有name属性哦,便于后期组件引入并作为组件名
    name: 'VueDigitalCount',
    props: { 
      number: { // 显示的数字
        type: [Number, String],
        default: 0
      },
      showLength: { // 最长显示多少位数字
        type: Number,
        default: 9
      },
      autoFillLength: { // 是否自动用0补齐显示的长度
        type: Boolean,
        default: true
      }
    }, 
    data() { 
      return { 
        list: [], 
        numList: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
      } 
    }, 
    watch: {
      number: {
        handler(newValue, oldValue) {
          this.initNumber()
        },
      }
    },
    mounted() { 
      this.initNumber(true)
    }, 
    methods: { 
      // 在指定位置添加逗号; 参数是字符串
      addCommaToStr(str) {
        let tempArr = str.split('').reverse(); // 实际显示多少位
        for (let i = tempArr.length - 1; i >= 0; i--) {  
          if ((i + 1) % 3 === 0) {  
            tempArr.splice(i + 1, 0, ',');  
          }  
        }
        // 如果最后一个元素为,则删除
        if (tempArr.at(-1) === ',') {
          tempArr.pop();
        }

        // 反过来展示,变成从后面往前,每隔3位加逗号
        return tempArr.reverse();
      },
      // 给数组计算要偏移的高度
      calcMoveHeight(dealArr, isReset) {
        let result = dealArr.map(value => {
          return { num: value }
        }); 
        if (isReset) { // 只有第一次需要重置数据
          result = result.map(item => {
            return {
              ...item,
              top: 0
            }
          })
        }
        
        let itemHeight = 80; // 每一个元素的高度
        result.forEach((value, index) => {
          setTimeout(() => { 
            // value.top = parseFloat((value.num * itemHeight)) || 0; 
            // 使用$set保证数据更新时能触发页面更新
            this.$set(value, 'top', parseFloat((value.num * itemHeight)) || 0)
          }, (index === null ? 0 : index) * 150); // 每个元素间隔150ms去计算偏移的距离
        }); 
        return result;
      },
      initNumber(isReset = false) {
        let fillContent = ''; // 前面填充的字符串(全是0)
        const numStr = this.number.toString(); // 将props转成字符串
        let showNumber = numStr; // 最终展示的字符串,默认就是传过来的数据
        if (this.autoFillLength) { // 需要自动填充
          if (numStr.length < this.showLength) { // 小于指定显示的位数
            fillContent = new Array(this.showLength - numStr.length).fill(0).join(''); // 生成指定位数的0的数组并转化为字符串
          }
          showNumber = fillContent + showNumber; // 在前面填充0,达到指定位数
        }

        // 通过方法,往字符串里添加逗号
        const resultArr = this.addCommaToStr(showNumber);

        // 计算每个数字需要滚动的距离
        this.list = this.calcMoveHeight(resultArr, isReset);
      },
    } 
  }
</script>

<style scoped>
.module-count-box {
  display: flex;
}
.module-count-box .site-item { 
  width: 66px; 
  height: 80px; 
  overflow: hidden;
  text-align: center; 
  display: flex;
  margin: 0 4px; 
  background: url("@/assets/count_num_bg.png") no-repeat;
  background-size: 100% 100%; 
  position: relative; 
}
.module-count-box .site-item .num-list-box {
  position: absolute; 
  top: 0; 
  left: 0; 
  transition: all 1.5s ease-in-out 0s;
  /* top: -80px; */
} 
.module-count-box .site-item .num-list-box > .num-item {
  width: 66px; 
  height: 80px; 
  font-size: 56px;
  font-weight: 600;
  display: flex;
  justify-content: center;
  align-items: center;
  margin: 0px;
  color: #fff
}

.module-count-box .comma-item {
  font-size: 100px;
  color: #BBD7FF;
  margin-top: -26px;
}
</style>
3. 使用vue插件模式

该步骤时组件封装的重点,即利用vue的公开方法: install
install 方法会在你使用 Vue.use(plugin) 时被调用,这样使得我们的插件注册到了全局,在子组件的任何地方都可以使用。

在package目录下新建index.js文件,代码如下:

// 1. 引入组件
import VueDigitalCount from './digitalCount';

// 2. 用数组保存组件,便于遍历
const components = { VueDigitalCount };

// 3. 定义 install 方法,接收 Vue 作为参数。如果使用 use 注册插件,则所有的组件都将被注册
const install = function (Vue) {
  // 判断是否安装
  if (install.installed) return;
  install.installed = true; //标识已经安装
  // 遍历并注册全局组件
  Object.keys(components).forEach(key => {
    Vue.component(key, components[key]);
  });
}

// 对于那些没有在应用中使用模块化系统的用户(如在html中直接使用vue),他们往往将通过 <script> 标签引用你的插件,并期待插件无需调用 Vue.use() 便会自动安装 
// 添加如下几行代码来实现自动安装:
if (typeof window !== 'undefined' && window.Vue) {
  install(window.Vue)
};


// 4. 导出组件
// 将每个组件导出,便于不全局注册时,单个使用component注册为页面级组件
export {
  VueDigitalCount
};

// 导出install方法,用于vue.use 注册全局插件
export default install;

二、使用 vue-cli 打包库

首页,来看看官网的描述:构建模板 - 应用
在这里插入图片描述

注意: css: { extract: false } 这个配置;

因为vue-cli默认打包后是将css抽离出来成为一个单独的文件;所以在使用的时候就需要单独将css引入,相对麻烦。类似element-ui有这么一步:

import 'element-ui/lib/theme-chalk/index.css';
1. 修改 package.json 文件,在scripts配置打包命令
"package": "vue-cli-service build --target lib ./src/package/index.js --name vue-digital-count --dest dist"

打包命令解释:

  • target lib 关键字, 指定打包的目录
  • name 打包后的文件名字
  • dest 打包后的文件夹的名称

打包后的文件如下:
因为我在 vue.config.js 配置了 css: { extract: false };所以没有单独的css文件

在这里插入图片描述

修改package.json 其他配置,适用于npm发包
  • 重要:新增配置入口文件 mian ,使用umd.min.js(适用于所有平台)
  • 去除 "private": true, private字段可以防止我们意外地将私有库发布到npm服务器。只需要将该字段设置为true
  • 新增 authorlicensekeywordsdescriptionrepositoryhomepage 等字段,没有的可以不用配置
    在这里插入图片描述

配置详情:

{
  // 发布的包名,默认是上级文件夹名。不得与现在npm中的包名重复。包名不能有大写字母/空格/下滑线!
  "name": "#####",
  // 版本号,每次要更新
  "version": "1.0.0",
  // 包的描述
  "description": "仅供测试,别下载",
  // 文件入口,默认是 index.js,可修改
  "main": "index.js",
  "scripts": {
    // 测试命令,可以不填直接回车
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  // 作者名称
  "author": "###",
  // 包遵循的开源协议,默认是ISC
  "license": "ISC",
  // 因为组件包是公用的,所以 private 为 false
  "private": false,
  // 当前包需要依赖的第三方组件,如何安装使用依赖包,可以看看文章顶部的NPM命令介绍文章
  "dependencies": {},
  // "devDependencies": {}
  // 指定代码所在的仓库地址
  "repository": {
    "type": "git",
    "url": "https://github.com/dengzemiao/DZMFullPage.git"
  },
  // bug在哪里提
  "bugs": {
     "url": "https://github.com/dengzemiao/DZMFullPage/issues"
  },
  // 项目官网的地址
  "homepage": "https://github.com/dengzemiao/DZMFullPage",
  // 指定打包后,包中存在的文件夹
  "files": [
    "dist",
    "src"
  ],
  // 指定了项目的目标浏览器的范围
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not ie <= 8"
  ],
  // 项目关键词,供搜索
  "keywords": [
    "测试"
  ]
}

三、上传至 npm

ps: 想要发布到npm仓库,就必须要有一个账号,先去npm官网注册一个账号,注意记住用户名、密码和邮箱,发布的时候可能会用到。

1. 设置npm源

如果本地npm采用的是淘宝镜像源或者其它,需要改成 npm 官方源

npm config set registry=https://registry.npmjs.org

npm 查看使用的包源是哪一个:`npm config get registry`
2. 添加npm用户

进入 vue-digital-count 目录,执行命令:

npm adduser

需要输入账号、密码、邮箱和邮箱验证码;第一次才需要
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/e5318c9d1e5e4fd5a6

3. 发布
npm publish

发布包前最后提前在npm官网查询报名是否重名,避免发布失败。发布成功后即可到npm官网上查看自己发布的npm包。

4. 更新包

修改package.json文件里面的version字段,然后重新 npm publish 即可

文章仅为本人学习过程的一个记录,仅供参考,如有问题,欢迎指出!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL面试题挑战01:打折日期交叉问题

目录 问题&#xff1a;SQL解答&#xff1a;第一种方式&#xff1a;第二种方式&#xff1a; 问题&#xff1a; 如下为某平台的商品促销数据&#xff0c;字段含义分别为品牌名称、打折开始日期、打折结束日期&#xff0c;现在要计算每个品牌的打折销售天数&#xff08;注意其中的…

【yolov8系列】 yolov8 目标检测的模型剪枝

前言 最近在实现yolov8的剪枝&#xff0c;所以有找相关的工作作为参考&#xff0c;用以完成该项工作。 先细读了 Torch-Pruning&#xff0c;个人简单记录了下 【剪枝】torch-pruning的基本使用&#xff0c;有框架完成的对网络所有结构都自适应剪枝是最佳的&#xff0c;但这里没…

Redis 系统性总结看这一篇就够了

Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 之前在公司一直忙于使用&#xff0c;很少做系统性的总结&a…

工具系列:PyCaret介绍_单变量时间序列代码示例

&#x1f44b; 工具系列&#xff1a;PyCaret介绍_单变量时间序列代码示例 PyCaret是一个开源的、低代码的Python机器学习库&#xff0c;可以自动化机器学习工作流程。它是一个端到端的机器学习和模型管理工具&#xff0c;可以大大加快实验周期&#xff0c;提高工作效率。 与其…

用C#也能做机器学习?

前言✨ 说到机器学习&#xff0c;大家可能都不陌生&#xff0c;但是用C#来做机器学习&#xff0c;可能很多人还第一次听说。其实在C#中基于ML.NET也是可以做机器学习的&#xff0c;这种方式比较适合.NET程序员在项目中集成机器学习模型&#xff0c;不太适合专门学习机器学习&a…

从Gitee克隆项目、启动方法

从gitee克隆VUE项目到本地后&#xff0c;不能直接运行&#xff0c;需要进行npm install安装node_modules文件夹里面的内容&#xff0c;因为在git上传的时候&#xff0c;一般都会过滤到node_modules中的依赖文件。 安装依赖以后&#xff0c;启动通过npm run serve启动项目出错。…

迪文屏开发保姆级教程——页面键盘

迪文屏页面键盘保姆级教程。 本篇文章主要介绍了在DGBUS平台上使用页面键盘的步骤。 迪文屏官方开发指南PDF&#xff1a;&#xff08;不方便下载的私聊我发给你&#xff09; https://download.csdn.net/download/qq_21370051/88647174?spm1001.2014.3001.5503https://downloa…

一篇文章带你搞定ARCHPR的下载和使用

除了bp这款爆破神器之外&#xff0c;另外还有一款ARCHPR的字典爆破神器&#xff0c;好处是很方便&#xff0c;而且爆破速度贼快 链接&#xff1a;https://pan.baidu.com/s/1-Ewx2JpZ-o5PunlfkRupYg 提取码&#xff1a;sg51 这里直接给大家安排了&#xff0c;自取就好 攻击的…

常用的电源芯片有哪些?怎么分类

科技的发展也带动了电源的发展&#xff0c;因此需要更多的电源管理芯片。说到电源管理芯片&#xff0c;作为工程师最熟悉的芯片之一。所谓电源管理芯片&#xff0c;就是负责电子设备系统中电能的转换、分配、检测等电能管理的芯片。主要负责识别CPU电源范围&#xff0c;产生相应…

【疑问】学前端是不是已经找不到工作了?深度回复“前端已死论”。

随着人工智能和低代码的崛起&#xff0c;“前端已死”的声音逐渐兴起。前端已死&#xff1f;尊嘟假嘟&#xff1f;快来发表你的看法吧&#xff01; 文章目录 一、为什么会出现“前端已死”的言论技术发展框架和工具的泛滥市场饱和全栈开发的兴起 二、你如何看待“前端已死”技术…

1.CentOS7网络配置

CentOS7网络配置 查看网络配置信息 ip addr 或者 ifconfig 修改网卡配置信息 vim /etc/sysconfig/network-scripts/ifcfg-ens192 设备类型&#xff1a;TYPEEthernet地址分配模式&#xff1a;BOOTPROTOstatic网卡名称&#xff1a;NAMEens192是否启动&#xff1a;ONBOOTye…

【halcon深度学习之那些封装好的库函数】create_dl_preprocess_param_from_model

函数简介 create_dl_preprocess_param_from_model 是一个用于创建深度学习模型预处理参数的程序。以下是该程序的详细介绍&#xff1a; 参数: DLModelHandle (输入): 用于预处理的深度学习模型的句柄。 NormalizationType (输入): 预处理时的归一化类型参数。可能的取值包括…

手机怎么设置每年公历或农历生日提醒?生日提醒设置小妙招

生日是一个人在一年中比较特殊的日子之一&#xff0c;人们通常希望能够在这一天得到亲朋好友的祝福和庆祝。然而&#xff0c;随着人们生活节奏的加快&#xff0c;很多人表示自己很容易忘记他人的生日&#xff0c;导致不能够及时送出祝福和礼物。如果经常忘记亲朋好友的生日&…

安防视频融合云平台/智慧监控平台EasyCVR如何添加验证码调用接口?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

Seata1.4.2分布式事务搭建部署【Spring cloud Alibaba】

包下载 https://github.com/apache/incubator-seata/releases下载并上传到服务器 //解压 tar -zxvf seata-server-1.4.2.tar.gz创建Seata的数据库及表&#xff0c;地址&#xff1a;https://github.com/seata/seata/tree/develop/script/server 根据数据类型复制相应的sql&…

工具系列:PyCaret介绍_多分类代码示例

&#x1f44b; 工具系列&#xff1a;PyCaret介绍_多分类代码示例 PyCaret 介绍 PyCaret是一个开源的、低代码的Python机器学习库&#xff0c;可以自动化机器学习工作流程。它是一个端到端的机器学习和模型管理工具&#xff0c;可以大大加快实验周期并提高生产效率。 与其他开…

验证码:防范官网恶意爬虫攻击,保障用户隐私安全

网站需要采取措施防止非法注册和登录&#xff0c;验证码是有效的防护措施之一。攻击者通常会使用自动化工具批量注册网站账号&#xff0c;以进行垃圾邮件发送、刷量等恶意活动。验证码可以有效阻止这些自动化工具&#xff0c;有效防止恶意程序或人员批量注册和登录网站。恶意程…

【bug日记】如何切换jdk版本,如何解决java和javac版本不一致

背景 今天在安装jenkins后&#xff0c;使用java运行war包的时候&#xff0c;提示jdk1.8版本太低&#xff0c;需要提高版本&#xff0c;所以就需要切换jdk版本 解决 在用户变量中&#xff0c;首先更改了JAVA_HOME的地址为17的目录&#xff0c;发现javac的版本改为17了&#x…

高防服务器防御靠谱吗?

​  随着互联网的普及和信息技术的不断发展&#xff0c;网络安全问题日益突出。高防服务器作为一种专业的网络安全设备&#xff0c;在防御网络攻击方面扮演着越来越重要的角色。然而&#xff0c;高防服务器是否靠谱&#xff0c;是否能够有效地防御各种网络攻击&#xff0c;一…

人工智能的发展之路:时间节点、问题与解决办法的全景解析

导言 人工智能的发展历程充满了里程碑式的事件&#xff0c;从早期的概念到今天的广泛应用&#xff0c;每个时间节点都伴随着独特的挑战和创新。本文将详细描述每个关键时间节点的事件&#xff0c;探讨存在的问题、解决办法&#xff0c;以及不同阶段之间的联系。 1. 195…