手把手教你封装 Vue 组件,并使用 npm 发布
Vue 开发插件
开发之前先看看官网的 开发规范
我们开发的之后期望的结果是支持 import、require 或者直接使用 script 标签的形式引入,就像这样:
// 这里注意一下包的名字前缀是 custom ,组件的名字前缀是 moor
// 这是因为那个名字发布包的时候被占用了(我做实验的时候叫 moor-ui)现在改成了custom-ui,但是组件的前缀懒得改
import CustomUI from 'custom-ui';
// 或者 const CustomUI = require('custom-ui');
// 或者 <script src="..."></script>
Vue.use(CustomUI);
复制代码
构建一个 Vue 项目
开发组件我们使用 webpack-simple :
vue init webpack-simple <project-name>
复制代码
PS: 这里我选择了 use sass 因为,之后开发组件会用到
开发组件的文件结构如下,参考了一下 element 不过我们这个是简易版,仅供分享和自己使用
.
├── src/ // 源码目录
│ ├── packages/ // 组件目录
│ │ ├── switch/ // 组件(以switch为例)
│ │ ├── moor-switch.vue // 组件代码
│ │ ├── index.js // 挂载插件
│ ├── App.vue // 页面入口
│ ├── main.js // 程序入口
│ ├── index.js // (所有)插件入口
├── index.html // 入口html文件
.
复制代码
好了,到这里准备工作做好了,我们可以开始开发组件了,接着上面的例子,下面开始开发一个 switch 组件。
开发单个组件
先看一下目标效果:
开始开发:在 packages 文件夹下新建一个 switch 文件夹用来存放 switch 组件的源码,继续在 switch 文件夹中新建 moor-switch.vue 和 index.js 文件
moor-switch.vue
这个文件是组件源码,我这里就不放源码了,这里就说一下我个人认为最重要的点吧,这也是封装表单类组件最为重要的点:
自定义组件绑定 v-model,官网地址
使用:
<!-- 使用父组件的值绑定 -->
<!-- isSwitch = false -->
<moor-switch
v-model="isSwitch">开关:
</moor-switch>
<!-- 子组件必须要有 input 来处理对应的值 -->
<!-- 其中最重要的就是需要 :value="value" 用来绑定值 -->
<!-- @change="$emit('input', $event.target.value)" 事件触发改变值 -->
<input
type="checkbox"
@change="$emit('input', $event.target.value)"
:true-value="activeValue"
:false-value="inactiveValue"
:disabled="disabled"
:value="value">
<!-- 当然还需要使用 props 来接受这个 value -->
<script>
// ... 此处省略代码
props: {
value: {
type: [Boolean, String, Number],
default: false
}
}
// ... 此处省略代码
</script>
复制代码
index.js
这个文件没什么好说的就是将该组件作为 Vue 插件,代码就三行这里就放在这吧:
// MoorSwitch 是对应组件的名字,要记得在 moor-switch.vue 文件中还是 name 属性哦
import MoorSwitch from './moor-switch';
MoorSwitch.install = Vue => Vue.component(MoorSwitch.name, MoorSwitch);
export default MoorSwitch;
复制代码
好了基本完成了,但是为了将所有的组件集中起来比如我还有 select、 input、 button 等组件,那么我想要统一将他们放在一个文件这中便于管理
所以在 App.vue 同级目录我新建了一个 index.js 文件,内容也没啥好说的看看就懂了:
import HelloWorld from './packages/hello-world/index.js';
import MoorSwitch from './packages/switch/index.js';
// ...如果还有的话继续添加
const components = [
HelloWorld,
MoorSwitch
// ...如果还有的话继续添加
]
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,
HelloWorld,
MoorSwitch
// ...如果还有的话继续添加
}
复制代码
本地运行通过 <script/> 标签的方式使用,修改 index.html 文件:
<!-- 省略部分代码 -->
<div id="app">
<moor-hello-world :color="color" :msg="msg"></moor-hello-world>
<moor-switch
v-model="lightSwitch">开关:</moor-switch>
</div>
<script src="./node_modules/vue/dist/vue.js"></script>
<script src="/dist/custom-ui.js"></script>
<script>
new Vue({
el: '#app',
data() {
return {
color: 'red',
msg: 'hello world!',
lightSwitch: false
}
}
})
</script>
复制代码
然后运行 npm run dev 你就可以看到效果了:
好了到这里我们的组件就开发完成了;下面开始说怎么打包发布到 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/custom-ui.js",
复制代码
发布命令其实就是两句话
// 这里需要你有一个 npm 的账号,文章开头有官网链接
npm login // 登陆
npm publish // 发布
复制代码
完成之后我们就可以在项目中安装使用了
npm install custom-ui -S
复制代码
在 main.js 中引入插件
import CustomUI from 'custom-ui'
Vue.use(CustomUI)
复制代码
在组件中使用:
<!-- 直接使用脚手架的HelloWorld组件 -->
<!-- 此处有省略代码,看对地方加入代码哦 -->
<div class="moor-item">
<label>Input: </label>
<moor-input
v-model="input1"
placeholder="请输入信息">
</moor-input>
<moor-input
v-model="input2"
placeholder="请输入信息">
</moor-input>
<moor-input
placeholder="输入框禁用"
:disabled="inputDisabled">
</moor-input>
</div>
<div class="moor-item">
<label>Switch: </label>
<moor-switch
v-model="lightSwitch">开关(开):</moor-switch>
<moor-switch
v-model="switchLight">开关(关):</moor-switch>
</div>
<script>
export default {
name: 'HelloWorld',
data () {
return {
// HelloWorld
msg: 'Welcome to moor UI!',
color: 'red',
// input
input1: '',
input2: '这是默认值',
inputDisabled: true,
// switch
lightSwitch: false,
switchLight: true
}
},
watch: {
lightSwitch: newValue => console.log('开关:', newValue),
}
}
</script>
<style scoped>
.moor-select, .moor-btn, .moor-switch, .moor-input {
margin: 10px 6px;
}
.moor-item {
display: flex;
align-items: center;
}
.moor-item label {
width: 100px;
display: inline-block;
}
</style>
复制代码
预览效果如下:
PS: 修改 .gitignore 去掉忽略dist,因为我们打包的文件也需要提交;每次上到npm上需要更改版本号,package.json 里的 version 字段
写的比较简单,主要还是提供思路。用习惯了开源的组件自己总得了解一下嘛,有的时候在开发的过程中我们找不到合适的开源组件就需要自己开发了,这个时候我们把自己写的一些精致的小插件开源出来挺好的...
最后希望你给个 Star 源码地址
哦,对了README,不想写了...哈哈
手把手教你封装 Vue 组件,并使用 npm 发布的更多相关文章
- 手把手教你封装 Vue 组件并使用 NPM 发布
Vue 开发插件 我们可以先查看Vue的插件的开发规范 我们开发的之后期望的结果是支持 import.require 或者直接使用 script 标签的形式引入,就像这样: ps: 这里注意一下包的名 ...
- 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组件从开发到发布
组件化是前端开发非常重要的一部分,从业务中解耦出来,可以提高项目的代码复用率.更重要的是我们还可以打包发布,俗话说集体的力量是伟大的,正因为有许许多多的开源贡献者,才有了现在的世界. 不想造轮子的工程 ...
随机推荐
- java 编写小工具 尝试 学习(七)
1.在java 编写小工具 尝试 学习(六)里学会了,控件 的随意摆放, 以及大小(x,y,width,height),又根据前面学习的按钮 被点击 的事件监控 的方法 ,点击 按钮 在显示区域显示“ ...
- Visual Studio 中常用的快捷键
项目相关的快捷键 Ctrl + Shift + B = 生成项目 Ctrl + Alt + L = 显示 Solution Explorer(解决方案资源管理器) Shift + Alt+ C = 添 ...
- 20181030NOIP模拟赛T2
WYT的刷子 WYT有一把巨大的刷子,刷子的宽度为M米,现在WYT要使用这把大刷子去粉刷有N列的栅栏(每列宽度都为1米:每列的高度单位也为米,由输入数据给出). 使用刷子的规则是: 1.与地面垂直,从 ...
- SQL语句中生成UUID方法
SQL语句中生成UUID方法为UUID() 生成带横线UUID: select UUID() 形如:abaffaca-fd55-11e5-b3d0-d2 ...
- WIN10下WNMP开发环境部署
刚刚开始学习PHP时,一直使用phpstudy,后面发现很多东西自己单独配置安装会理解更深刻,所以自己总结了一下windows下开发环境的部署教程. 以前经常在CSDN和博客园看别人的教程,今天才注册 ...
- python教程(一)·python环境搭建
python的环境搭建总的来说分为两大步:下载.安装(废话@_@).在这里以windows为例(Linux通常内置了python,就算没有内置,相信Linux用户也非常清楚软件的安装方法) 第一步-下 ...
- Python 爬虫 (一)
爬: 爬一个网站需要几步? 确定用户的需求 根据需求,寻找网址 读取网页 urllib request requests 定位并提取数据 正则 xpath beautiful soup 存储数据 my ...
- java随笔一(关于定时任务)
public class ThreadTest { class MyTask implements Runnable{ public void run() { say(); } } public vo ...
- 优步UBER司机全国各地奖励政策汇总 (2月15日-2月21日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 成都Uber优步司机奖励政策(3月16日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...