百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

手把手教你发布vue组件到npm

ztj100 2024-11-17 18:13 25 浏览 0 评论

环境

vue-cli 4.x

建项

vue create et-verify-code

建项过程中需要你选择要安装的依赖。我这里只打算写一个比较简单的组件,所以只需要 stylus、babel、eslint 就可以了。my 和 et-component 都是我之前做项目所保存下来的组合配置。你可以选择default(默认)或者 manually (手动)。

接下来可以删掉一些不需要的目录和文件,在src目录下,创建 main.js和et-verify-code.vue文件,如果要对webpack打包做一些配置,则需要在项目根目录下创建一个vue.config.js文件。于是,目录结构如下:


E:\ET-VERIFY-CODE
│  .browserslistrc
│  .eslintrc.js
│  .gitignore
│  babel.config.js
│  package-lock.json
│  package.json
│  README.md
│  vue.config.js
│
├─node_modules
└─src
    │  et-verify-code.vue
    │  main.js

配置

  1. package.json

{
  "name": "et-verify-code", // 项目名称,也是安装 npm 包的名称 npm install <name>
  "version": "0.1.0", // 项目版本
  "main": "lib/et-verify-code.umd.min.js", // 包的入口文件,语句 import [pkg] from '[package]' 时,其实导入的就是 main 定义的文件
  "author": "邮箱|作者",
  "description": "描述",
  "keywords": [ // 项目关键字
    "vue",
    "verify-code",
    "et-verify-code"
  ],
  "private": false,
  "scripts": { // 增加了 lib 命令
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lib": "vue-cli-service build --target lib --name et-verify-code --dest lib ./src/main.js",  // 指定src目录下的main.js文件为组件入口
    "lint": "vue-cli-service lint"
  },
  ...
  "repository": {
    "type": "git",
    "url": "项目的git地址"
  },
  "license": "MIT"
}

webpack 配置


项目根目录下的vue.config.js文件

module.exports = {
  css: {
    extract: false // 组件的样式是否另外打包成单独的css文件。默认为true
    // 因为我这个组件并不复杂,css代码又不多,不想使用组件的时候还要显式的去import css,所以就不另外打包成单独的css文件了
  }
  // productionSourceMap: false // 是否生成sourcemap,默认是true
}

这里展开一下,如果你在package.json中main属性设置为dist目录下的文件(比如 dist/et-verify-code.umd.min.js),那么你需要一些不同的配置。
因为默认的npm run build命令后生成在dist目录下的文件名默认是长这样的:app.[hash:8].js,中间有8位的随机生成的哈希值。

因此,如果你在package.json中main属性设置为dist目录下的文件,则需要对 build 命令做相应的配置(package.json文件中):


{
  ...
  "scripts": {
    "build": "vue-cli-service build --target lib --name et-verify-code --dest dist ./src/main.js" // 默认是"vue-cli-service build"
  }
  ...
}

该命令的参数解释如下(摘自官方文档:https://cli.vuejs.org/zh/guide/cli-service.html#vue-cli-service-build)

用法:vue-cli-service build [options] [entry|pattern]

选项:

  --mode        指定环境模式 (默认值:production)
  --dest        指定输出目录 (默认值:dist)
  --modern      面向现代浏览器带自动回退地构建应用
  --target      app | lib | wc | wc-async (默认值:app)
  --name        库或 Web Components 模式下的名字 (默认值:package.json 中的 "name" 字段或入口文件名)
  --no-clean    在构建项目之前不清除目标目录
  --report      生成 report.html 以帮助分析包内容
  --report-json 生成 report.json 以帮助分析包内容
  --watch       监听文件变化

--target 允许你将项目中的任何组件以一个库或 Web Components 组件的方式进行构建。更多细节请查阅构建目标(https://cli.vuejs.org/zh/guide/build-targets.html)。

最后你可以修改README.md文件,加上项目和包的说明,这个尽可自由发挥了。

组件开发

  • et-verify-code.vue

<template>
  <div class="vcWrap">
    <input v-for="n in len" :key="'codeInput' + n" :ref="'codeInput' + n" v-model.trim.number="code[n-1]" @keydown="onkeydown(n)" @keyup="onkeyup(n)" />
  </div>
</template>

<script>
export default {
  name: 'EtVerifyCode',
  props: ["length"],
  data () {
    return {
      len: this.length || 4, // 验证码长度
      code: new Array(this.len),
      keyCodes: [
        48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, // 数字
        8, // backspace
        // 37, 39, // arrowLeft, arrowRight
        13 // enter
      ]
    }
  },
  methods: {
    onkeydown (n) {
      // eslint-disable-next-line
      // console.log(event)
      if (!this.keyCodes.includes(event.keyCode)) { // 拦截keyCodes数组外的键盘输入
        event.returnValue = false
      } else if (event.keyCode === 8 && n > 1 && this.code[n - 1] === '') { // 删除键且this.code[n-1]为空
        this.$refs['codeInput' + (n - 1)][0].focus()
        event.returnValue = false
      }
    },
    onkeyup (n) {
      if ((event.keyCode >= 48 && event.keyCode <= 57) || (event.keyCode >= 96 && event.keyCode <= 105)) { // 数字键
        this.$set(this.code, n - 1, event.key)
        if (n < this.len) this.$refs['codeInput' + (n + 1)][0].focus()

        this.$emit('sendCodeInput', this.code.join(''))
      } else if (event.keyCode === 8) { // 删除键
        this.$emit('sendCodeInput', this.code.join(''))
      } else if (event.keyCode === 13) { // enter键
        if (this.code.join('').length === this.len) this.$emit('goNext')
      }
    }
  }
}
</script>

<style lang="stylus">
.vcWrap
  input
    width 40px
    height 40px
    line-height: 40px

    -webkit-appearance: none;
    // background-color: #fff;
    // background-image: none;
    // border: 1px solid #dcdfe6;
    background-color: #f7f9fa;
    border: 1px solid #f7f9fa;

    box-sizing: border-box;
    display: inline-block;
    font-size: inherit;
    outline: 0;
    padding: 0 14px;
    transition: border-color .2s cubic-bezier(.645,.045,.355,1);
    border-radius: 4px;

    margin-right 1em
    &:last-child
      margin-right 0
</style>


本地测试组件是否可用

  • Step 1:在项目中执行如下命令
npm run lib // 生成可供import的文件npm pack // 本地生成一个 et-verify-code-0.1.0.tgz 的包

这里需要注意一下你在 package.json 中 main 属性设置的值。该字段指定了包的主入口文件。
main 定义了包的入口文件,在NodeJS环境中,语句 import [pkg] from '[package]' 时,其实导入的就是main定义的文件。
所以,如果你在 main 这里写的是lib/et-verify-code.umd.min.js,那么执行上述命令没问题。但如果你写的是dist/et-verify-code.umd.min.js,那么在执行npm pack命令之前,就需要先执行npm run build(而不是npm run lib)生成dist目录下可供import的文件了。

Step 2:把生成的et-vcode-0.1.0.tgz包拷贝到用来测试组件的项目(这里你或许需要另外建一个新的项目)的根目录下,然后

npm install et-verify-code-0.1.0.tgznpm run serve // 启动项目

Step 3:在项目的入口文件main.js引入包

// src/main.jsimport EtVerifyCode from 'et-verify-code'Vue.use(EtVerifyCode)

Step 4:在 demo 页面中引用这个组件


// demo.vue
<template>
 <et-verify-code />
</template>

若测试可用,在测试项目中运行npm uninstall et-verify-code卸载组件,然后就可以发布到npm上了。

发布到npm


1. 注册npm账号

发布之前,得先有一个npm账号,如果没有的话上 官网(https://www.npmjs.com/) 注册一个,注册完账号之后,我们就要在本地登录并发布我们的组件了。

注意:因为有点童鞋会经常用cnpm源,所以,一定要切换到npm源上才可以,不然就会报错(error: no_perms Private mode enable, only admin can publish this module)。因此你要通过执行 npm config set registry http://registry.npmjs.org 命令切换到npm源。

2. 开始发布

在发包之前,先去npm官网搜索一下有没有和你的包名相同的,如果有就改一个其他的名字吧。


npm login // 登陆npm
// 然后输入你的账号、密码、邮箱
// 当你在控制台看到 Logged in as <Username> on https://registry.npmjs.org 说明登陆成功

// 如果你保证是最新版本且已经打包过,则跳过npm run build这一步
// 这一步是执行npm run build 还是 npm run lib,要看你在 package.json 中 main 属性设置的值,详见“本地测试”中 step 1 中的说明
npm run build // 或者 npm run lib, 根据你的配置决定跑哪个命令
npm publish // 发布你的包

注意:一个版本只能发布一次,也就是你不能发了1.0.0,下次还继续1.0.0,理论上可以覆盖,但是npm不允许这样,因为你这样覆盖,就无法知道你的版本信息了啊,插件和项目都是迭代的,like git,是有版本信息的。

  • 方法一:每一次npm publish前,自行手动更改 package.json的version
  • 方法二:通过npm version命令来发布

我们来学习一下 npm version 命令

在命令行敲入npm version --help就可以看到可以使用的命令:

npm version [<newversion> | major | minor | patch | premajor | preminor | prepatch | prerelease [--preid=<prerelease-id>] | from-git]

major:主版本号
minor:次版本号
patch:补丁号
premajor:预备主版本
preminor:预备次版本
prepatch:预备补丁号
prerelease:预发布版本

举例说明一下,假设当前版本为0.1.0
? npm version preminor
v0.2.0-0
? npm version minor
v0.2.0
? npm version prepatch
v0.2.1-0
? npm version patch
v0.2.1
? npm version prerelease
v0.2.2-0
? npm version prerelease
v0.2.2-1
? npm version premajor
v1.0.0-0
? npm version major
v1.0.0

对了,项目的git status必须是clear,才能使用npm version命令。
如果你的项目中包含git,命令还会自动给你提交更新到git(git commit -m "X.Y.Z"),所以还可以在npm version NEWVERSION后面加上-m参数来指定自定义的commit message。比如:

npm version patch -m "Upgrade to %s for reasons"

message中的%s将会被替换为版本号。

这里我们再展开一下
《版本号策略》版本号格式:主版本号.次版本号.修订号;主版本号:当你做了不兼容的 API 修改;次版本号:当你做了向后兼容的功能性新增;修订号:当你做了向后兼容的问题修正;

处于开发阶段的项目版本号以0.Y.Z形式表示,此阶段正在开发基础功能、公众API;版本号只能增加,禁止下降,代码的修改必须以新版本形式更新。

查看npm && 使用我们的包

这个时候,你稍微等几分钟去npm官网搜索一下你的包名,就可以找到啦。如果搜不到,那就再等等,或许更新慢,没有完全更新,但是你在自己 npm 账号可以查看到自己发布的包。

具体使用包的方法就是,在项目目录下执行命令

npm install et-verify-code // 安装我们的包

相关推荐

如何将数据仓库迁移到阿里云 AnalyticDB for PostgreSQL

阿里云AnalyticDBforPostgreSQL(以下简称ADBPG,即原HybridDBforPostgreSQL)为基于PostgreSQL内核的MPP架构的实时数据仓库服务,可以...

Python数据分析:探索性分析

写在前面如果你忘记了前面的文章,可以看看加深印象:Python数据处理...

CSP-J/S冲奖第21天:插入排序

...

C++基础语法梳理:算法丨十大排序算法(二)

本期是C++基础语法分享的第十六节,今天给大家来梳理一下十大排序算法后五个!归并排序...

C 语言的标准库有哪些

C语言的标准库并不是一个单一的实体,而是由一系列头文件(headerfiles)组成的集合。每个头文件声明了一组相关的函数、宏、类型和常量。程序员通过在代码中使用#include<...

[深度学习] ncnn安装和调用基础教程

1介绍ncnn是腾讯开发的一个为手机端极致优化的高性能神经网络前向计算框架,无第三方依赖,跨平台,但是通常都需要protobuf和opencv。ncnn目前已在腾讯多款应用中使用,如QQ,Qzon...

用rust实现经典的冒泡排序和快速排序

1.假设待排序数组如下letmutarr=[5,3,8,4,2,7,1];...

ncnn+PPYOLOv2首次结合!全网最详细代码解读来了

编辑:好困LRS【新智元导读】今天给大家安利一个宝藏仓库miemiedetection,该仓库集合了PPYOLO、PPYOLOv2、PPYOLOE三个算法pytorch实现三合一,其中的PPYOL...

C++特性使用建议

1.引用参数使用引用替代指针且所有不变的引用参数必须加上const。在C语言中,如果函数需要修改变量的值,参数必须为指针,如...

Qt4/5升级到Qt6吐血经验总结V202308

00:直观总结增加了很多轮子,同时原有模块拆分的也更细致,估计为了方便拓展个管理。把一些过度封装的东西移除了(比如同样的功能有多个函数),保证了只有一个函数执行该功能。把一些Qt5中兼容Qt4的方法废...

到底什么是C++11新特性,请看下文

C++11是一个比较大的更新,引入了很多新特性,以下是对这些特性的详细解释,帮助您快速理解C++11的内容1.自动类型推导(auto和decltype)...

掌握C++11这些特性,代码简洁性、安全性和性能轻松跃升!

C++11(又称C++0x)是C++编程语言的一次重大更新,引入了许多新特性,显著提升了代码简洁性、安全性和性能。以下是主要特性的分类介绍及示例:一、核心语言特性1.自动类型推导(auto)编译器自...

经典算法——凸包算法

凸包算法(ConvexHull)一、概念与问题描述凸包是指在平面上给定一组点,找到包含这些点的最小面积或最小周长的凸多边形。这个多边形没有任何内凹部分,即从一个多边形内的任意一点画一条线到多边形边界...

一起学习c++11——c++11中的新增的容器

c++11新增的容器1:array当时的初衷是希望提供一个在栈上分配的,定长数组,而且可以使用stl中的模板算法。array的用法如下:#include<string>#includ...

C++ 编程中的一些最佳实践

1.遵循代码简洁原则尽量避免冗余代码,通过模块化设计、清晰的命名和良好的结构,让代码更易于阅读和维护...

取消回复欢迎 发表评论: