1、新建文件夹在终端打开执行 npm init -y
生成package.json如下,注意如果要发布到npm,name不能有下划线,大写字母等
{ "name": "vuecomponentdi", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "isc"}
2、建立目录结构
目录结构如下
-- vuecomponentdi -- packages -- button -- index.js -- index.vue -- toast -- index.js -- index.vue -- index.js -- package.json
3、本地调试
vuecomponentdi/index.jsexport default function(){ console.log('本地调试')}
新建一个vue项目vue create testvue
在testvue下的package.json下的测试依赖devdependencies添加vuecomponentdi/index.js绝对地址
"devdependencies": { ... "vuecomponentdi": "f:/vuecomponent@di/vuecomponentdi",//根据自己实际项目地址填写 ... }
执行npm link在testvue执行npm link将vuecomponentdi软链接到node_modules中
vuecomponentdi安装eslint由于testvue引入组件会进行eslint检测,不安装会报错(testvue关闭eslint可省略这一步)
安装方法:
npm install eslint@6.7.2 --save-dev ./node_modules/.bin/eslint --init
在testvue使用vuecomponentdiimport test from "vuecomponentdi"
<template> <div class="home"> <img alt="vue logo" src="../assets/logo.png"> <helloworld msg="welcome to your vue.js app"/> </div></template><script>// @ is an alias to /srcimport helloworld from '@/components/helloworld.vue'import test from "vuecomponentdi"export default { name: 'home', components: { helloworld }, created(){ test() }}</script>
控制台打印>本地调试
4、开发一个button组件
button模块:进入vuecomponentdi/packages/button/index.vuetype只支持传入primary属性,v-on="listeners"表示包含了父作用域中的(不含.native修饰器的)v−on事件监听器。它可以通过v−on="listeners"表示包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。它可以通过 v-on="listeners"表示包含了父作用域中的(不含.native修饰器的)v−on事件监听器。它可以通过v−on="listeners" 传入内部组件
<template> <div> <button class="di-button" v-on="$listeners" :class="[type?`di-button--${type}`:'']"><slot></slot></button> </div></template><script>export default { name:"di-button", props:{ type:string }}</script><style>.di-button{ display: inline-block; line-height: 1; white-space: nowrap; cursor: pointer; background: #fff; border: 1px solid #dcdfe6; color: #606266; -webkit-appearance: none; text-align: center; box-sizing: border-box; outline: none; margin: 0; transition: .1s; font-weight: 500; -moz-user-select: none; -webkit-user-select: none; -ms-user-select: none; padding: 12px 20px; font-size: 14px; border-radius: 4px;}.di-button:focus, .di-button:hover { color: #409eff; border-color: #c6e2ff; background-color: #ecf5ff;}.di-button:active { color: #3a8ee6; border-color: #3a8ee6; outline: none;}.di-button--primary { color: #fff; background-color: #409eff; border-color: #409eff;}.di-button--primary:focus, .di-button--primary:hover { background: #66b1ff; border-color: #66b1ff; color: #fff;}.di-button--primary.is-active, .di-button--primary:active { background: #3a8ee6; border-color: #3a8ee6; color: #fff;}</style>
button模块导出:进入vuecomponentdi/packages/button/index.js如果导出一个带有install函数的对象,则在vue2中可以直接使用vue.use(xx)调用此函数,既执行 vue.component(name,option)创建了一个组件
import button from "./index.vue"button.install=(vue)=>{ vue.component(button.name,button)}export default button
聚合导出button:进入vuecomponentdi/index.js因为开发的组件不止一个,所以需要在入口文件统一导出
import dibutton from "./packages/button"export { dibutton}
在testvue使用<template> <div class="home"> <di-button type="primary">按钮</di-button> </div></template><script>// @ is an alias to /srcimport vue from 'vue'import {dibutton} from "vuecomponentdi"vue.use(dibutton)export default { name: 'home'}</script>
5、开发一个toast弹窗
toast模块:vuecomponentdi/packages/toast/index.vuetype只支持warning和success
<template> <div class="di-toast" :class="`di-toast--${type}`" v-if="show"> {{message}} </div></template><script>export default { data(){ return { message:'', show:false, type:'' } }}</script><style>.di-toast{ width: 60%; width: 200px; background: rgb(15, 15, 15); padding:3px; text-align: center; color: #fff; border-radius: 10px; position: fixed; left: calc(50% - 100px); top: 200px;}.di-toast--warning{ background: #fdf6ec; color: #e6a28b;}.di-toast--success{ background: #f0f9eb; color: #93c26d;}</style>
toast模块导出:vuecomponentdi/packages/toast/index.js因为toast弹窗需要在vue中支持this.$toast调用,所以用了vue.extend方法,这个 api 在日常开发中很少使用,一般在开发组件的时候它才能派上用场,官方定义:使用基础 vue 构造器,创建一个“子类”。参数是一个包含组件选项的对象
import toast from './index.vue'toast.install = (vue) => { const toastconstructor = vue.extend(toast);//使用基础 vue 构造器,创建一个“子类”。参数是一个包含组件选项的对象。 let $vm = new toastconstructor();//将这个子类实例化 let $el = $vm.$mount().$el;//$vm执行$mount()手动挂载会返回一个带有$el的对象,$el就是一个dom对象 document.queryselector("body").appendchild($el);//将这个dom对象添加到body中 //在vue原型上注入$toast方法 vue.prototype.$toast = (option) => { $vm.show = true if (!(option instanceof object)) { //如果传的不是对象直接弹出 $vm.message = option } else { $vm.message = option.message $vm.type = option.type } settimeout(() => { $vm.show = false }, 2000) }}export default toast
聚合导出:vuecomponentdi/index.jsimport dibutton from "./packages/button" import toast from "./packages/toast" export { dibutton, toast}
vuetest中使用toast<template> <div class="home"> <di-button type="primary" @click="toast">按钮</di-button> </div></template><script>// @ is an alias to /srcimport vue from "vue";import { dibutton, toast } from "vuecomponentdi";vue.use(dibutton);vue.use(toast);export default { name: "home", methods: { toast() { // this.toast("这是一个普通弹窗"); // this.$toast({ // message: "这是一个成功弹窗", // type: "success", // }); this.$toast({ message: "这是一个警告弹窗", type: "warning", }); }, },};</script>
6、发布到npm
公有配置组件开发完成需要发布到npm以便于别人使用;因为发布的是公有包,所以需要在vuecomponentdi/package.json中配置
"publishconfig": { "access": "public" },
完整package.json:
{ "name": "vuecomponentdi", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "isc", "devdependencies": { "eslint": "^6.7.2", "eslint-plugin-vue": "^8.2.0" }, "publishconfig": { "access": "public" }}
发布npm发布很简单,只需要两个命令:
npm loginnpm publish
执行npm login需要你有npm账号,可以到 npm官网 注册
npm官网地址:https://www.npmjs.com/
发布完成之后就可以在任何一个vue2项目中安装使用了:
npm install vuecomponentdi
git地址: vue组件开发(https://gitee.com/geeksdidi/vue-component-di)
【相关推荐:vue.js教程】
以上就是如何从0撸出一个vue组件库并发布到npm的详细内容。
