创建一个vue2项目
 
npm install -g @vue/cli
vue create xiaoququ-ui
 
根目录下新建一个plugins文件夹,用来放组件
 

 
vue.config.js配置打包规则
 
const path = require('path')
module.exports = {
  
  pages: {
    index: {
      entry: 'src/main.js', 
      template: 'public/index.html', 
      filename: 'index.html' 
    }
  },
  
  chainWebpack: config => {
    
    
    config.resolve.alias
      .set('~', path.resolve('plugins'))
    
    config.module
      .rule('js')
      .include.add(/plugins/).end()
      .use('babel')
      .loader('babel-loader')
      .tap(options => {
        
        return options
      })
  }
}
 
编写组件
 
- qbutton/qbutton.vue 自定义颜色按钮
<template>
  <div>
    <h1 class="blue">你是二憨憨</h1>
    <button class="btn" :style="{ '--color': color, '--mixColor': mixColor }">按鈕</button>
  </div>
</template>
  
<script>
export default {
  name: 'qqButton',
  props: {
    color: {
      type: String,
      default: '#e83e8c'
    },
  },
  computed: {
    mixColor() {
      return this.getRgbNum(this.color, 0.1) 
    }
  },
  methods: {
    
    getRgbNum(sColor, percent) {
      if (sColor.length === 4) {
        let sColorNew = '#'
        for (let i = 1; i < 4; i += 1) {
          
          sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1))
        }
        sColor = sColorNew
      }
      
      let sColorChange = []
      for (let i = 1; i < 7; i += 2) {
        
        sColorChange.push(parseInt('0x' + sColor.slice(i, i + 2)))
      }
      
      return 'rgba(' + sColorChange.join(',') + ',' + percent + ')'
    },
  },
}
</script>
<style lang='scss' scoped>
$color: var(--color);
.btn {
  padding: 20px 40px;
  font-size: 30px;
  color: $color;
  
  background: var(--mixColor);
  border: 1px solid $color;
  border-radius: 10px;
}
</style>
 
 
import qbutton from "./qbutton.vue";
qbutton.install = Vue => Vue.component(qbutton.name, qbutton); 
export default qbutton;
 
 
import qinput from "./components/qinput/qinput.vue";
import qbutton from "./components/qbutton/qbutton.vue";
const components = [qinput, qbutton];
const install = Vue => {
  
  if (install.installed) return;
  install.installed = true;
  
  components.map(component => Vue.component(component.name, component));
};
if (typeof window !== "undefined" && window.Vue) {
  install(window.Vue);
}
export default {
  install,
  
  ...components
};
 
测试组件
 
 
import ComponentBox from "../plugins/index";
Vue.use(ComponentBox)
 
 
<template>
  <div>
    <qq-input></qq-input>
    <qq-button color="#2e93ff"></qq-button>
    <qq-button color="#ff976a"></qq-button>
    <qq-button color="#ee0a24"></qq-button>
    <qq-button color="#07c160"></qq-button>
    <qq-button color="#ccc"></qq-button>
  </div>
</template>
 

 
打包配置
 
 
{
  "name": "xiaoququ-ui", 
  "version": "1.0.1",
  "private": false,
  "description": "第一个组件库",
  "author": "小曲曲",
  "license": "MIT",
  "keywords": [
    "小曲"
  ],
  "main": "dist/xiaoququ-ui.umd.min.js", 
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lib": "vue-cli-service build --target lib --name xiaoququ-ui plugins/index.js", 
    "lint": "vue-cli-service lint"
  },
}
 
发布到npm
 
- npm run lib 打包生成dist文件夹
  
- npm login 输入npm账号、密码(输不进去无所谓)、邮箱、验证码(发送邮箱)
- npm publish (发布失败检查是否包名重复)
使用组件库
 
 
import ququ from "xiaoququ-ui";
import "xiaoququ-ui/dist/xiaoququ-ui.css";
Vue.use(ququ)
 
 
<qq-button color="#ccc"></qq-button>
 
遗留问题