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

2023-12-20

一、编写组件

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
  • 新增 author license keywords description repository homepage 等字段,没有的可以不用配置
    在这里插入图片描述

配置详情:

{
  // 发布的包名,默认是上级文件夹名。不得与现在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 即可

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于vue-cli快速发布vue npm 包 的相关文章

随机推荐

  • 【go语言】error错误机制及自定义错误返回类型

    简介 Go 语言通过内置的 error 接口来处理错误 该接口定义如下 type error interface Error string 这意味着任何实现了 Error 方法的类型都可以作为错误类型 在 Go 中 通常使用 errors
  • 产品经理和项目经理怎么区分?看完你也会

    产品经理的英文名叫Product Manager 项目经理的英文名叫Project Manager 两个都简称为PM 在工作中 这两种角色的工作内容常常有相同的地方 一些小公司甚至是产品经理和项目经理由同一个人承担 那今天我就给大家讲讲他们
  • 在线客服系统中的全渠道服务:多渠道整合与无缝沟通体验

    很多采购人员在了解在线客服系统的时候都会遇到一个名词 全渠道 很多人第一次接触可能并不理解它是什么意思 也不知道自己的企业是否需要这个 全渠道 今天这篇文章就为大家解答一二 一 全渠道是什么 全渠道 Omni Channel 就是企业为了满
  • LeetCode经典150题.274.H指数

    题目 274 H 指数 给你一个整数数组 citations 其中 citations i 表示研究者的第 i 篇论文被引用的次数 计算并返回该研究者的 h 指数 根据维基百科上 h 指数的定义 h 代表 高引用次数 一名科研人员的 h 指
  • ubuntu git: ‘lfs‘ is not a git command. See ‘git --help‘.

    sudo apt get install git lfs
  • EXCEL VLOOKUP函数

    参考资料 Excel 史上最全的VLOOKUP应用教程 VLOOKUP函数最全面最详细的讲解大全 涵盖17个重要和常见用法 目录 零 前提条件 一 单条件查找 1 1 顺向查找 1 2 逆向查找 二 多条件查找 2 1 顺向查找
  • 让你的查询更快——11个数据库优化技术

    数据库往往成为软件性能的瓶颈 好的数据对于高性能系统至关重要 以下是 11 种有效的数据库优化技术 1 索引 索引 索引是提供快速查找机制的数据结构 可显著提高查询性能 通过创建排序的数据结构来工作 该结构允许数据库引擎快速定位满足 WHE
  • 电子学会C/C++编程等级考试2022年06月(六级)真题解析

    C C 等级考试 1 8级 全部真题 点这里 第1题 小白鼠再排队2 N只小白鼠 1 lt N lt 100 每只鼠头上戴着一顶有颜色的帽子 现在称出每只白鼠的重量 要求按照白鼠重量从小到大的顺序输出它们头上帽子的颜色 帽子的颜色用 red
  • 内网穿透工具frp安装使用

    摘要 之前使用的 nps 目前没有维护更新了 和在使用的过程中做内网穿透的的网速应该有限制 不论云服务器带宽是多少 下载速度都比较慢 这里切换到 frp 试试 对安装和使用简单记录 其和 nps 有很大的操作配置不同之处 相关文章 内网穿透
  • 内网穿透工具frp安装使用

    摘要 之前使用的 nps 目前没有维护更新了 和在使用的过程中做内网穿透的的网速应该有限制 不论云服务器带宽是多少 下载速度都比较慢 这里切换到 frp 试试 对安装和使用简单记录 其和 nps 有很大的操作配置不同之处 相关文章 内网穿透
  • 【广州华锐互动】AR变电站交互仿真实训系统让你学生掌握专业技能

    随着科技的不断发展 智能变电站已经成为了电力系统的重要组成部分 为了提高电力系统的运行效率和安全性 培养高素质的电力工程技术人才 越来越多的高校和职业院校开始开设AR仿真实训课程 本文将为大家简单介绍一下广州华锐互动为知名电力集团开发的AR
  • Python教程84:程序主动退出进程有哪些方法?5种方式总有一种适合你

    在Python中 有多种方法可以主动退出程序进程 这里介绍5种方法 给大家参考一下 1 sys exit 这是最常见的方式 它将引发SystemExit异常 如果这个异常没有被捕获 那么Python解释器将会退出 你可以选择传递一个退出状态
  • 京东岗位吼哔多,具体有啥牛牛说!5类方向近20个岗位等你选~

    字节 测试开发 日常实习 三面面经 已发offer 字节测开秋招面经 华为上海青浦研究所现状 而我 落荒而逃 得物实习小记 运营岗位爆料 干了5年运营后我才知道的事 华为海思麒麟开奖清蒸白菜新鲜出炉 真的难啊 华为上海青浦研究所现状 华为上
  • 测试开发 | 智能农业引领农业革新,人工智能携手农业改写未来

    互联网40的包值得去吗 回暖分析 战绩结算 on 赛文X 软件技术就业单位分析 山东大厂浪潮集团 国家电网研究院VS杭州华为 华为跟银行怎么选 别焦虑 计算机的同学就业率也很低 华为 薪资爆料 字节电商运营实习面经分享 京东 Java OC
  • ESP8266 烧录 (关于BearPi扩展Wifi模块的烧录方式)

    简介 ESP 12F 模块是BearPI IOT购买的一个套餐所带的扩展模块 用来接通网络 但是默认电路不支持重新烧录 下面就是可支持重新烧录的方式 ESP 12F 电路原理图 如上图 GPIO15 gt GND gt 高电平 GPIO2
  • ros2 学习07 rclpy包 详解

    rclpy 是 python 操作ros2 封装的一个工具包 rclpy 源码路径 https github com ros2 rclpy 文档说明地址 https docs ros2 org latest api rclpy index
  • 题解 | #返回购买价格为 10 美元或以上产品的顾客列表#

    脚气怎样治能够根除 2022腾讯秋招面经导航汇总 测试篇 华为上海青浦研究所现状 华为上海青浦研究所现状 华为上海青浦研究所现状 TP普联嵌入式一面 HC还有一千多个 招不到就浪费了 求求大家投下小米吧 吃透计算机网络八股文 年薪40万 实
  • <img src=“x“ onerror=“alert(1)“>

    华为上海青浦研究所现状 华为上海青浦研究所现状 华孝子的胜利 xdm西安交行软开和电信西分怎么选 系表情包 一 旷视科技 一面 求问各位嵌入式Linux有什么好的项目 备战春招了 计软转嵌入式经验分享 嵌入式项目 华为上海青浦研究所现状 字
  • 拼多多temu招人,有较多hc,年前发起流程,拿完年终再入职

    海尔集团 海尔智家 嵌入式硬件工程师面经 MySQL高频面试题 整理牛客网100份面经的C C 校招 社招面试题总结 哇为 再次入池 敏你 华为华子 上海 青浦 第一批 薪资统计 大疆车载 嵌入式软件实习生 底层软件方向 冬季招聘专场感想
  • 基于vue-cli快速发布vue npm 包

    一 编写组件 1 初始化项目并运行 vue create vue digital count npm run serve 2 组件封装 新建package文件夹 因为我们可能会封装多个组件 所以在src下面新建一个 package 文件夹用