手把手教你封装 Vue 组件并使用 NPM 发布
Vue 开发插件
我们可以先查看Vue的插件的开发规范
我们开发的之后期望的结果是支持 import、require 或者直接使用 script 标签的形式引入,就像这样:
ps: 这里注意一下包的名字前缀是 unisoft ,组件的名字前缀是 uni
import UniSoftUI from 'unisoft-ui';
// 或者 const CustomUI = require('unisoft-ui');
// 或者 <script src="..."></script>
Vue.use(UniSoftUI);
构建一个 Vue 项目
开发组件我们使用 webpack-simple 模板:
vue init webpack-simple <project-name>
ps: 这里我选择了 use sass 因为之后开发组件会用到
目录结构如图:
├── src/ // 源码目录
│ ├── packages/ // 组件目录
│ │ ├── switch/ // 组件(以switch为例)
│ │ ├── uni-switch.vue // 组件代码
│ │ ├── index.js // 挂载插件
│ ├── App.vue // 页面入口
│ ├── main.js // 程序入口
│ ├── index.js // (所有)插件入口
├── index.html // 入口html文件
开发单个组件:
先看一下目标效果:

开始开发:
在 packages 文件夹下新建一个 switch 文件夹用来存放 switch 组件的源码,继续在 switch 文件夹中新建 uni-switch.vue 和 index.js 文件
uni-switch.vue 组件:
<template>
<div class="uni-switch">
<div class="wrapper">
<span><slot></slot></span>
<div :class="[{closed: !checked}, 'switch-box']"
@click="handleChange(value)">
<span :class="{closed: !checked}"></span>
</div>
<input
type="checkbox"
@change="handleChange"
:true-value="activeValue"
:false-value="inactiveValue"
:disabled="disabled"
:value="value"/>
</div>
</div>
</template>
<script>
export default {
name: "UniSwitch",
data() {
return {}
},
props: {
value: {
type: [Boolean, String, Number],
default: false
},
activeValue: {
type: [Boolean, String, Number],
default: true
},
inactiveValue: {
type: [Boolean, String, Number],
default: false
},
disabled: {
type: Boolean,
default: false
}
},
computed: {
checked() {
return this.value === this.activeValue;
}
},
methods: {
handleChange(value) {
this.$emit('input', !this.checked ? this.activeValue : this.inactiveValue);
}
}
}
</script>
index.js:
// UniSwitch 是对应组件的名字,要记得在 uni-switch.vue 文件中还是 name 属性哦
import UniSwitch from './UniSwitch.vue';
UniSwitch.install = Vue => Vue.component(UniSwitch.name, UniSwitch);
export default UniSwitch;
好了基本完成了,但是为了将所有的组件集中起来比如我还有 select、 input、 button 等组件,那么我想要统一将他们放在一个文件这中便于管理
所以在 App.vue 同级目录我新建了一个 index.js 文件
import UniSwitch from './packages/switch/index';
import UniSlider from './packages/slider/index';
import UniNumberGrow from './packages/number-grow/index';
import './common/scss/reset.css'
// ...如果还有的话继续添加
const components = [
UniSwitch,
UniSlider,
UniNumberGrow
// ...如果还有的话继续添加
]
const install = function (Vue, opts = {}) {
components.map(component => {
Vue.component(component.name, component);
})
}
/* 支持使用标签的方式引入 */
if (typeof window !== 'undefined' && window.Vue) {
install(window.Vue);
}
export default {
install,
UniSwitch,
UniSlider,
UniNumberGrow
// ...如果还有的话继续添加
}
好了到这里我们的组件就开发完成了;下面开始说怎么打包发布到 npm 上
发布到 npm
打包之前,首先我们需要改一下 webpack.config.js 这个文件;
// ... 此处省略代码
const NODE_ENV = process.env.NODE_ENV
module.exports = {
// 根据不同的执行环境配置不同的入口
entry: NODE_ENV == 'development' ? './src/main.js' : './src/index.js',
output: {
// 修改打包出口,在最外级目录打包出一个 index.js 文件,我们 import 默认会指向这个文件
path: path.resolve(__dirname, './dist'),
publicPath: '/dist/',
filename: 'custom-ui.js',
library: 'custom-ui', // 指定的就是你使用require时的模块名
libraryTarget: 'umd', // libraryTarget会生成不同umd的代码,可以只是commonjs标准的,也可以是指amd标准的,也可以只是通过script标签引入的
umdNamedDefine: true // 会对 UMD 的构建过程中的 AMD 模块进行命名。否则就使用匿名的 define
},
// ... 此处省略代码
}
然后, 再修改package.json 文件:
// 发布开源因此需要将这个字段改为 false
"private": false,
// 这个指 import custom-ui 的时候它会去检索的路径
"main": "dist/unisoft-ui.js",
发布命令只有两步骤:
npm login // 登陆
npm publish // 发布
完成之后我们就可以在项目中安装使用了
在项目中使用unisoft-ui
在自己的项目中使用unisoft-ui, 先从 npm 安装
npm install unisoft-ui -S
在 mian.js 中引入
import UniSoftUI from 'unisoft-ui'
Vue.use(UniSoftUI)
在组件中使用:
<template>
<div id="app">
<h1>{{msg}}</h1>
<uni-switch v-model="isSwitch">
<span class="text">{{switchText}}</span>
</uni-switch>
</div>
</template>
<script>
export default {
name: 'app',
data() {
return {
msg: 'welecom to unisoft-ui',
isSwitch: false,
}
},
computed: {
switchText() {
return this.isSwitch ? '开' : '关';
}
},
}
</script>
注意: 在发布npm包之前要先修改 .gitignore 去掉忽略 dist, 因为我们打包的文件也需要提交;每次上到 npm 上需要更改版本号,package.json 里的 version 字段
手把手教你封装 Vue 组件并使用 NPM 发布的更多相关文章
- 手把手教你封装 Vue 组件,并使用 npm 发布
Vue 开发插件 开发之前先看看官网的 开发规范 我们开发的之后期望的结果是支持 import.require 或者直接使用 script 标签的形式引入,就像这样: // 这里注意一下包的名字前缀是 ...
- iOS回顾笔记(05) -- 手把手教你封装一个广告轮播图框架
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
- 封装Vue组件的一些技巧
封装Vue组件的一些技巧 本文同步在个人博客shymean.com上,欢迎关注 写Vue有很长一段时间了,除了常规的业务开发之外,也应该思考和反思一下封装组件的正确方式.以弹窗组件为例,一种实现是在需 ...
- 手把手教你使用Vue/React/Angular三大框架开发Pagination分页组件
DevUI是一支兼具设计视角和工程视角的团队,服务于华为云DevCloud平台和华为内部数个中后台系统,服务于设计师和前端工程师.官方网站:devui.designNg组件库:ng-devui(欢迎S ...
- 手把手教你使用VUE+SpringMVC+Spring+Mybatis+Maven构建属于你自己的电商系统之vue后台前端框架搭建——猿实战01
猿实战是一个原创系列文章,通过实战的方式,采用前后端分离的技术结合SpringMVC Spring Mybatis,手把手教你撸一个完整的电商系统,跟着教程走下来,变身猿人找到工作不是 ...
- 手把手教你写vue插件并发布(二)
前记:上一篇 https://www.cnblogs.com/adouwt/p/9211003.html, 说到了一个完整的vue插件开发.发布的流程,总结下来就讲了这么一个事,如何注入vue, 如果 ...
- 自己封装 vue 组件 和 插件
vue 组件 一.组件的创建,两种方法.(本质上是1.2两种,vue文件,只是创建了一个 组件选项对象,仅是一个js对象)1.定义组件:Vue.component('button-counter', ...
- docker封装vue项目并使用jenkins发布
一.概述 vue项目可以打一个dist静态资源包,直接使用Nginx发布即可. 现在由于要上docker,需要将vue项目和nginx打成一个镜像才行. 项目结构如下: ./ ├── build │ ...
- vue组件从开发到发布
组件化是前端开发非常重要的一部分,从业务中解耦出来,可以提高项目的代码复用率.更重要的是我们还可以打包发布,俗话说集体的力量是伟大的,正因为有许许多多的开源贡献者,才有了现在的世界. 不想造轮子的工程 ...
随机推荐
- jquery的call()和apply()方法
call方法: 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call 方法可以用来 ...
- c++中指针的指针和指针的引用的使用
当指针作为函数的参数进行传递时,实际上本质上是安置传递,即将指针进行了一份拷贝,在函数的内部对这个指针的修改实际上就是对一个在函数内部的那个局部变量的修改.这点事和引用不同的,引用实际上是在参数传递时 ...
- css3实现切片动画
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <meta http- ...
- Vsftpd完全攻略(三)基于系统用户支持ftp上传 访问和vsftp安全设置
原文链接:http://viong.blog.51cto.com/844766/261342 1.关闭匿名用户登录 ftp支持匿名登录是不安全,所以要禁止匿名ftp登录 在/etc/vsftpd/vs ...
- 常用模块xml,shelve,configparser,hashlib
XML 什么XML:全称 可扩展标记语言 标记指的是代表某种含义的字符 XML<> 为什么需要XML 为能够在不同的平台间继续数据的交换 为了使交换的数据能让对方看懂 就需要按照一定的语法 ...
- VHDL基础1
Description Structure 一个可综合的VHDL描述中一般由3部分组成:LIBRARY declarations.ENTITY.ARCHITECTURE Library(库)用来设计重 ...
- bzoj2388(分块 凸包)
好像没有什么高级数据结构能够很高效地实现这个东西: 那就上万能的分块,我们用一些数形结合的思想,把下标看成横坐标,前缀和的值看成纵坐标: 给区间内每个数都加k相当于相邻两点的斜率都加上k: 这种东西我 ...
- java基础-day25
第02天 java基础加强 今日内容介绍 u Properties的基本操作 u 反射综合案例 u BeanUtils概述及使用 第1章 Properties的基本操作 1.1 Properti ...
- 网络timeout区分
ConnectTimeout 连接建立时间,三次握手完成时间 SocketTimeout 数据传输过程中数据包之间间隔的最大时间 下面重点说下SocketTimeout,比如有如下图所示的http请求 ...
- poj2186tarjan算法缩点求出度
poj2186tarjan算法缩点求出度 自己打一遍第一题,入门啦,入门啦 题目还算简单,多头牛,给你仰慕关系(可传递),问你最后有没有牛被所有的牛仰慕 根据关系可以建图,利用tarjan算法缩点处理 ...