Vue 组件封装 并使用 NPM 发布的教程


Posted in Javascript onSeptember 30, 2018

正文开始

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文件

开发单个组件:

先看一下目标效果:

Vue 组件封装 并使用 NPM 发布的教程

开始开发:

 在 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 是对应组件的名字,要记得在 moor-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 发布的教程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Firebug 字幕文件JSON地址获取代码
Oct 28 Javascript
异步javascript的原理和实现技巧介绍
Nov 08 Javascript
JQuery实现鼠标滑过显示导航下拉列表
Sep 12 Javascript
原生JavaScript实现连连看游戏(附源码)
Nov 05 Javascript
jquery中get,post和ajax方法的使用小结
Feb 04 Javascript
JQuery实现样式设置、追加、移除与切换的方法
Jun 11 Javascript
Javascript将数值转换为金额格式(分隔千分位和自动增加小数点)
Jun 22 Javascript
AngularJS实现网站换肤实例
Feb 19 Javascript
如何快速上手Vuex
Feb 14 Javascript
JS解决IOS中拍照图片预览旋转90度BUG的问题
Sep 13 Javascript
vue父组件向子组件(props)传递数据的方法
Jan 02 Javascript
Vue路由history模式解决404问题的几种方法
Sep 29 Javascript
浅谈angular表单提交中ng-submit的默认使用方法
Sep 30 #Javascript
angularJs中$scope数据序列化的实例
Sep 30 #Javascript
mpvue+vuex搭建小程序详细教程(完整步骤)
Sep 30 #Javascript
mpvue项目中使用第三方UI组件库的方法
Sep 30 #Javascript
mpvue将vue项目转换为小程序
Sep 30 #Javascript
angularJs中ng-model-options设置数据同步的方法
Sep 30 #Javascript
vue-cli 脚手架基于Nightwatch的端到端测试环境的过程
Sep 30 #Javascript
You might like
Smarty模板快速入门
2007/01/04 PHP
可以在线执行PHP代码包装修正版
2008/03/15 PHP
destoon官方标签大全
2014/06/20 PHP
WordPress中对访客评论功能的一些优化方法
2015/11/24 PHP
学习php设计模式 php实现观察者模式(Observer)
2015/12/09 PHP
浅析Yii2集成富文本编辑器redactor实例教程
2016/04/25 PHP
PHP实现递归目录的5种方法
2016/10/27 PHP
Yii1.1中通过Sql查询进行的分页操作方法
2017/03/16 PHP
使用PHP访问RabbitMQ消息队列的方法示例
2018/06/06 PHP
XML+XSL 与 HTML 两种方案的结合
2007/04/22 Javascript
jquery实用代码片段集合
2010/08/12 Javascript
js实现的点击div区域外隐藏div区域
2014/06/30 Javascript
分享20款美化网站的 jQuery Lightbox 灯箱插件
2014/10/10 Javascript
获取url中用&amp;隔开的参数实例(分享)
2017/05/28 Javascript
vue环境搭建简单教程
2017/11/07 Javascript
Vue实现点击后文字变色切换方法
2018/02/11 Javascript
vue动画—通过钩子函数实现半场动画操作
2020/08/09 Javascript
[02:42]DOTA2城市挑战赛收官在即 四强之争风起云涌
2018/06/05 DOTA
[37:47]IG vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python网络爬虫采集联想词示例
2014/02/11 Python
Python实现获取某天是某个月中的第几周
2015/02/11 Python
对python3标准库httpclient的使用详解
2018/12/18 Python
python如何通过闭包实现计算器的功能
2020/02/22 Python
Python中使用filter过滤列表的一个小技巧分享
2020/05/02 Python
Python-opencv实现红绿两色识别操作
2020/06/04 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
2020/10/15 Python
Python爬虫Scrapy框架CrawlSpider原理及使用案例
2020/11/20 Python
python的dict判断key是否存在的方法
2020/12/09 Python
生物专业个人自荐信范文
2013/11/29 职场文书
六查六看自查材料
2014/02/17 职场文书
平面设计求职信
2014/03/10 职场文书
公司股份合作协议书
2014/12/07 职场文书
给校长的建议书范文
2015/09/14 职场文书
Django显示可视化图表的实践
2021/05/10 Python
SpringBoot工程下使用OpenFeign的坑及解决
2021/07/02 Java/Android
Android 界面一键变灰 深色主题工具类
2022/04/28 Java/Android