vue 组件发布到npm

导读:本篇文章讲解 vue 组件发布到npm,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

以vue组件为例

一. 代码开发过程

1.1 先创建一个空的vue项目

vue create npm-vue

1.2 新建组件

我这边直接用的components文件夹,最好是自己在新建一个文件夹比如叫 packages 专门用来存放组件
image.png

1.3 zl-title组件代码示例

  • index.vue
<template>
  <div id="zl-title">
    <div class="title">{{ title }}</div>
  </div>
</template>
<script>
export default {
  name: 'zl-title',
  props: {
    title: {
      type: String,
      default: ''
    }
  }
}
</script>
<style lang="scss">
#zl-title{
  .title{
    font-size: 14px;
    color: #666666;
    font-weight: 500;
    padding: 10px 15px;
    border-bottom: 1px solid #e5e5e5;
    margin: 15px 0 25px 20px;
    position: relative;
    width: 100%;
    font-weight: bold;
    &::before{
      content: "";
      position: absolute;
      width: 4px;
      height: 16px;
      background: #3296fa;
      left: 0px;
      top: 12px;
    }
  }
}
</style>



/**
 * 以vue插件的方式注册
 */
import zlTitle from './index.vue'

zlTitle.install = Vue => Vue.component(zlTitle.name, zlTitle)

// 支持使用script标签方式引入
if (typeof window !== 'undefined' && window.Vue) {
  window.Vue.use(zlTitle)
}

export default zlTitle

1.4 本地测试

  • main.js 入口文件
  • 按照下面的过程就可以在任意一个vue文件(子组件)里面使用了 <zl-title/>
import Vue from 'vue'
import App from './App.vue'
// 引入的是index.js 不是index.vue
import zlTitle from './components/zl-title/index'
Vue.use(zlTitle)
Vue.config.productionTip = false

new Vue({
  render: h => h(App),
}).$mount('#app')

1.5 打包一个类似 elemet-ui

  • zlBox组件跟zlTitle过程类似,只不过组件的功能内容不一样而已

————— 我是一条华丽的分割线 —————
在components文件夹下面新建一个 index.js 文件

import zlTitle from './zl-title/index'
import zlBox from './zl-box/index'

// 数组里面存放的就是一个个对象,import导入的vue组件其实导入的就是一个对象而已,可以自己打印看一下
const components = [
  zlTitle,
  zlBox
]

const install = function (Vue, opts = {}) {
  // 循环挂载到全局组件
  components.forEach(component => {
    Vue.component(component.name, component)
  })
}

// 支持script方式引入
if (typeof window !== 'undefined' && window.Vue) {
  install(window.Vue)
}

export default {
  install,
  zlBox,
  zlTitle
}

现在可以在main.js里面引入测试一下

import Vue from 'vue'
import App from './App.vue'
// 重点看这里了
import zlUI from './components/index'
Vue.use(zlUI)
Vue.config.productionTip = false

new Vue({
  render: h => h(App),
}).$mount('#app')

二.打包命令

2.1 vue-cli3 构建目标

https://cli.vuejs.org/zh/guide/build-targets.html

image.png

2.2 package.json scripts 新增打包命令

  • –dest 后面参数 lib 的意思是打包出来的文件夹为 lib 否则默认是 dist
"lib": "vue-cli-service build --target lib --name zlUI --dest lib src/components/index.js"

2.3 打包出来的文件

image.png

三. 发布到npm

首先你要有npm账号,官网注册即可

3.1 package.json 修改

  • 添加 main 属性 主文件是哪一个
"main": "lib/zlUI.umd.min.js"
  • private 属性设置为 false 因为我们没办法发布私有包,如果不设置可以使用以下命令发布
npm publish --access public
  • 记住 name 里面要使用小写 不要用 ZLUI 这种写法
{
  "name": "zl-ui-ysy",
  "version": "0.1.0",
  "private": false,
  "main": "lib/zlUI.umd.min.js",
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint",
    "lib": "vue-cli-service build --target lib --name zlUI --dest lib src/components/index.js"
  },
  "dependencies": {
    "core-js": "^3.4.4",
    "vue": "^2.6.10",
    "zl-ui-ysy": "^0.1.0"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "^4.1.0",
    "@vue/cli-plugin-eslint": "^4.1.0",
    "@vue/cli-service": "^4.1.0",
    "babel-eslint": "^10.0.3",
    "eslint": "^5.16.0",
    "eslint-plugin-vue": "^5.0.0",
    "node-sass": "^4.13.0",
    "sass-loader": "^8.0.0",
    "vue-template-compiler": "^2.6.10"
  },
  "eslintConfig": {
    "root": true,
    "env": {
      "node": true
    },
    "extends": [
      "plugin:vue/essential",
      "eslint:recommended"
    ],
    "rules": {},
    "parserOptions": {
      "parser": "babel-eslint"
    }
  },
  "browserslist": [
    "> 1%",
    "last 2 versions"
  ]
}

3.2 发布操作

以下操作都是在本项目执行的 cmd 命令

# 执行完会让你输入用户名 密码 邮箱 
npm login

# 发布 前提private设置为false
npm publish

3.3 发布过程中报错

  • 可以参考以下这篇文章

https://blog.csdn.net/zhangjing1019/article/details/102896421
https://segmentfault.com/a/1190000017463371

3.4 版本控制

  • 每次发布的时候 版本号version不能重复

四.查看

可以去npm官网搜一下自己的包 也就是package.json里面name对应的值
image.png

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/17193.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!