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 相关文章推荐
用javascript控制iframe滚动的代码
Apr 10 Javascript
javascript 当前日期加(天、周、月、年)
Aug 09 Javascript
javascript学习笔记(二十) 获得和设置元素的特性(属性)
Jun 20 Javascript
javascript基础知识大全 便于大家学习,也便于我自己查看
Aug 17 Javascript
jquery操作checked属性以及disabled属性的多种方法
Jun 20 Javascript
jQuery插件制作之全局函数用法实例
Jun 01 Javascript
JavaScript面对国际化编程时的一些建议
Jun 24 Javascript
微信小程序 购物车简单实例
Oct 24 Javascript
Ionic2开发环境搭建教程
Aug 20 Javascript
angular2 ng2 @input和@output理解及示例
Oct 10 Javascript
jQuery自动或手动图片切换效果
Oct 11 jQuery
浅谈Web Storage API的使用
Jun 23 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
改进的IP计数器
2006/10/09 PHP
php 删除无限级目录与文件代码共享
2008/11/22 PHP
Base64在线编码解码实现代码 演示与下载
2011/01/08 PHP
PHP多进程编程实例
2014/10/15 PHP
PHP使用PHPExcel实现批量上传到数据库的方法
2017/06/08 PHP
php基于数组函数实现关联表的编辑操作示例
2017/07/04 PHP
实例解析php的数据类型
2018/10/24 PHP
JQuery实现表格中相同单元格合并示例代码
2013/06/26 Javascript
Javascript 多物体运动的实现
2014/12/24 Javascript
jQuery获取页面及个元素高度、宽度的总结——超实用
2015/07/28 Javascript
js实现网站最上边可关闭的浮动广告条代码
2015/09/04 Javascript
jQuery实现的简单折叠菜单(折叠面板)效果代码
2015/09/16 Javascript
解决JS请求服务器gbk文件乱码的问题
2015/10/16 Javascript
window.location.hash知识汇总
2015/11/09 Javascript
js数组常见操作及数组与字符串相互转化实例详解
2015/11/10 Javascript
浅谈JavaScript中变量和函数声明的提升
2016/08/09 Javascript
Node接收电子邮件的实例代码
2017/07/21 Javascript
JQuery判断radio单选框是否选中并获取值的方法
2019/01/17 jQuery
javascript之分片上传,断点续传的实际项目实现详解
2019/09/05 Javascript
Cordova(ionic)项目实现双击返回键退出应用
2019/09/17 Javascript
[01:35]辉夜杯战队访谈宣传片—LGD
2015/12/25 DOTA
三步实现Django Paginator分页的方法
2019/06/11 Python
浅析PyTorch中nn.Linear的使用
2019/08/18 Python
python+selenium select下拉选择框定位处理方法
2019/08/24 Python
python同步两个文件夹下的内容
2019/08/29 Python
Python中*args和**kwargs的区别详解
2019/09/17 Python
瑞典在互联网上最大的宠物商店:Animail
2020/10/31 全球购物
仓库理货员岗位职责
2013/12/18 职场文书
出国留学计划书
2014/04/27 职场文书
微电影大赛策划方案
2014/06/05 职场文书
七年级上册语文教学计划
2015/01/22 职场文书
合作意向书怎么写
2019/06/24 职场文书
Python 读写 Matlab Mat 格式数据的操作
2021/05/19 Python
PyTorch 实现L2正则化以及Dropout的操作
2021/05/27 Python
MySQL 分区表中分区键为什么必须是主键的一部分
2022/03/17 MySQL
多人盗宝《绿林侠盗》第三赛季4.5上线 跨平台实装
2022/04/03 其他游戏