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 相关文章推荐
提高代码性能技巧谈—以创建千行表格为例
Jul 01 Javascript
jQuery中文入门指南,翻译加实例,jQuery的起点教程
Feb 09 Javascript
js操作Xml(向服务器发送Xml,处理服务器返回的Xml)(IE下有效)
Jan 30 Javascript
jquery解决图片路径不存在执行替换路径
Feb 06 Javascript
JavaScript中setUTCMilliseconds()方法的使用详解
Jun 12 Javascript
javascript将DOM节点添加到文档的方法实例分析
Aug 04 Javascript
js 获取元素所有兄弟节点的实现方法
Sep 06 Javascript
工厂模式在JS中的实践
Jan 18 Javascript
jQuery Ajax自定义分页组件(jquery.loehpagerv1.0)实例详解
May 01 jQuery
javascript 作用于作用域链的详解
Sep 27 Javascript
微信小程序顶部导航栏可滑动并选中放大
Dec 05 Javascript
小程序实现列表展开收起效果
Jul 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
php中文字符截取防乱码
2008/03/28 PHP
php笔记之:AOP的应用
2013/04/24 PHP
PHP整数取余返回负数的相关解决方法
2014/05/15 PHP
PHP获取音频文件的相关信息
2015/06/22 PHP
jQuery实现时尚漂亮的弹出式对话框实例
2015/08/07 Javascript
D3.js实现散点图和气泡图的方法详解
2016/09/21 Javascript
扩展jquery easyui tree的搜索树节点方法(推荐)
2016/10/28 Javascript
canvas实现绘制吃豆鱼效果
2017/01/12 Javascript
详解JavaScript添加给定的标签选项
2018/09/17 Javascript
怎样使你的 JavaScript 代码简单易读(推荐)
2019/04/16 Javascript
JavaScript 面向对象基础简单示例
2019/10/02 Javascript
基于JavaScript获取base64图片大小
2019/10/18 Javascript
简单了解vue 插值表达式Mustache
2020/07/22 Javascript
js面向对象方式实现拖拽效果
2021/03/03 Javascript
[02:56]DOTA2英雄基础教程 巨魔战将
2013/12/10 DOTA
Python中time模块和datetime模块的用法示例
2016/02/28 Python
对Python正则匹配IP、Url、Mail的方法详解
2018/12/25 Python
Python程序控制语句用法实例分析
2020/01/14 Python
利用django创建一个简易的博客网站的示例
2020/09/29 Python
python操作toml文件的示例代码
2020/11/27 Python
python中count函数知识点浅析
2020/12/17 Python
Silk Therapeutics官网:清洁、抗衰老护肤品
2020/08/12 全球购物
Python如何定义一个函数
2015/09/01 面试题
动物学专业毕业生求职信
2013/10/11 职场文书
门卫班长岗位职责
2013/12/15 职场文书
后备干部考察材料
2014/02/12 职场文书
学校消防演习方案
2014/02/19 职场文书
我们的节日国庆活动方案
2014/08/19 职场文书
学习三严三实对照检查材料思想汇报
2014/09/22 职场文书
学校师德师风自我剖析材料
2014/09/29 职场文书
晋江市委常委班子四风问题整改工作方案
2014/10/26 职场文书
城南旧事电影观后感
2015/06/16 职场文书
初中政教处工作总结
2015/08/12 职场文书
2016年暑假家长对孩子评语
2015/12/01 职场文书
2016年社区创先争优活动总结
2016/04/05 职场文书
CSS精灵图的原理与使用方法介绍
2022/03/17 HTML / CSS