基于vue-cli3创建libs库的实现方法


Posted in Javascript onDecember 04, 2019

前言:当我写这篇博客之前我想过这些问题,是否你也被困扰过呢?

1:当你有自己觉得写的好的组件,是不是有一种想存下来,方便下一次使用的情况?

2:是不是大多数时候都是使用cv大法?from "a" to "b" to “c” to anyWhere.....

3:是不是你的的组件跟你npm install下来的有很大区别?

4:是不是想定义一套规则来管理公司项目的组件?(当然前提你得是,,,,大佬)

一:创建默认项目

使用 vue create xxx 创建一个默认项目

基于vue-cli3创建libs库的实现方法

二:修改原始目录结构

创建的默认目录如下,我们需要将原本的src目录改为examples,然后创建packages目录来编写自己的组件库文件,(其实目录命名你开心就好,,)

基于vue-cli3创建libs库的实现方法

基于vue-cli3创建libs库的实现方法

好了,接下来划重点!

三:配置example & packages

到这里你可能发现了,项目无法跑起来了,因为我们没有了原始默认的入口文件

在根目录下创建vue.config.js配置文件(vue-cli3的配置文件,在这里的配置会覆盖脚手架webpack默认的配置项)。

//不熟悉配置的可官网查看 https://cli.vuejs.org/zh/config/#pages
module.exports = {
  pages: {
    index: {
     entry: 'examples/main.js',
     template: 'public/index.html',
     filename: 'index.html'
    }
   }
}

进入packages目录创建一个组件目录(HelloWorld),一个index文件(用来暴露所有的组件),然后在组件目录新建index(暴露出当前组件)文件与src组件源码。

基于vue-cli3创建libs库的实现方法 

在HelloWorld下面的index中引入组件。

import HelloWord from './src/HelloWorld.vue';
HelloWord.install = (Vue)=>{
  Vue.components(HelloWord.name,HelloWord)
}
export default HelloWord;

在packages目录下面的index中引入所有的组件并注册。

import HelloWorld from './HelloWorld';

// 将引入的组件模块存储,方便循环注册所有组件
const components = [ HelloWorld ];

const install = (Vue,options)=>{
  if (install.installed) return;
  install.installed = true
  console.log(options)
  components.forEach(component => {
    Vue.component(component.name, component)
  })
}

// 如果是直接引入的
if (typeof window !== 'undefined' && window.Vue) {
  install(window.Vue)
}

export default {
  // 使用Vue.use必须具有install方法
  // https://cn.vuejs.org/v2/api/#Vue-use
  install,
  // 同时导出组件列表
  ...components
}

在examples中的入口文件main.js引入注册的全局组件。

//main.js
...
import libs from "../packages"
...
Vue.use(libs,{a:'test'})

到现在项目基本已经跑起来了,在项目中可以直接调用组件了,无需在components里注册,平时开发中你的全局组件也可以这样来注册使用。

基于vue-cli3创建libs库的实现方法 

四:组件打包

vue-cli3中提供了构建一个库的方法 ,默认是构建应用,这个方法提供的几个配置项主要有以下几个

target: 改为 lib 可启用构建库模式;
name: 构建库输出的文件名;
dest: 构建的输出目录,默认为 dist;
entry: 入口文件路径;

vue-cli-service build --target lib --name myLib --dest libs [entry]

所以需要在项目的package.json文件中添加一条上面的执行脚本

"scripts": {
  "lib": "vue-cli-service build --target lib --name common --dest lib packages/index.js"
}

vue-cli3的默认配置是只对src目录下的文件进行编译的,所有这里我们还需要在vue.config.js文件中将packages文件夹也加入loader编译的配置(后测试可不加)。

chainWebpack:(config)=>{
  config.module
    .rule('js')
    .include
      .add('/packages/')
      .end()
    .use('babel')
      .loader('babel-loader')
      .tap(options=>{
          //TODO
          return options
      })
}

然后执行npm run lib会在跟目录下生成lib文件夹,lib会生成三种形式的文件(commonjs,umd,umd-min)

基于vue-cli3创建libs库的实现方法

五:发布npm

有了上面的四步,基本上开发阶段算是完成了,接下来就是如何让你的库有一个存储的地方,方便下一次的复用,首先你应该想到了 npm ,这个node包管理库。

一个基础的npm包,你首先需要知道package.json中这些配置的作用

name -----> 包的名称,必须唯一,不能跟已有的npm包重名,否则发布不上去;

version -----> 包的版本,当你需要迭代版本时,必须修改这个值(可手动修改,可运行以下命令修改);

$ npm version patch 会增加小版本 1.0.1:属于小修改,不更改功能使用
$ npm version minor 会增加二级 1.1.0:可能添加了一些功能,不影响以前的使用。
$ npm version major 会增加大版本 2.0.0:可能改了API,输入大范围的修改。

main -----> 包的入口,当你使用import xx from 'xxxx'的时候默认引入的就是main文件;

private -----> 是否为私有包,如果传到npm上必须改为false;

license ----->开源协议

author ------>作者 <可选>

description ----->包的描述 <可选>

keyworlds ----->关键字 <可选>

repository ----->包存放的仓库地址

....... 还有很多配置项可自己查询配置项;

跟据上面的选项,最终配置出的结果如下

{
  "name":"vue-libs-demo",
  "version":"0.1.0",
  "author":{
    "name":"mrlwc",
    "email":"845822761@qq.com"
  },
  "private":false,
  "license":"MIT",
  "description":"test vue lib",
  "keyWorlds":["test","vue","libs"],
  "main":"lib/common.umd.min.js"
}

npm 的发布也有需要忽略的敏感信息文件,所以需要添加.npmignore文件,排除开发环境下的文件内容

# dir
examples/
packages/
public/
node_modules/

# Log 
filesnpm-debug.log*
yarn-debug.log*
yarn-error.log*
vue.config.js
babel.config.js
*.map

# Editor directories and files
.DS_Store
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
.prettierrc

配置完后,就可以发布了,首先使用 npm login 一步步输入账号,密码,邮箱(如果没有账号的直接去官网注册即可),然后运行 npm publish ,如果失败也许是包重名。

现在你的组件包已经发布成功了,在其他项目中使用 npm install vue-libs-demo 后在入口文件 Vue.use(xxx) 即可使用所有的组件。

六:发布git仓库

你是否想过,公司的代码或者组件库放到公开平台是不是有点不妥?毕竟这是公司赖以生存的宝贝不是?所以一般公司都会有自己的私有服务器,然后在上面搭建gitLab等一系列管理方式,所以公共组件库同样可以保存到这些仓库中。然后修改依赖安装路劲来下载这些公用组件。

下面我就用gitee这个平台来进行操作

首先去gitee去建立一个空的仓库;

将自己的项目推送到仓库中;

$ git remote add <repository path>
$ git push -u origin master

然后在自己的新项目中按下面的方式引入依赖后执行npm install

基于vue-cli3创建libs库的实现方法

好了到这里基本上就结束了!(如果有更好的解决方案,或者发现什么错误的地方,可留言共同学习)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript null和undefined区别分析
Oct 14 Javascript
将CKfinder整合进CKEditor3.0的新方法
Jan 10 Javascript
JavaScript call apply使用 JavaScript对象的方法绑定到DOM事件后this指向问题
Sep 28 Javascript
JavaScript的模块化:封装(闭包),继承(原型) 介绍
Jul 22 Javascript
2014 年最热门的21款JavaScript框架推荐
Dec 25 Javascript
在easyUI开发中,出现jquery.easyui.min.js函数库问题的解决办法
Sep 11 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
Feb 10 Javascript
security.js实现的RSA加密功能示例
Jun 06 Javascript
JavaScript 中的 this 工作原理
Jun 20 Javascript
Vue自定义指令封装节流函数的方法示例
Jul 09 Javascript
JavaScript对象拷贝与赋值操作实例分析
Dec 10 Javascript
js获取 gif 的帧数的代码实例
Sep 10 Javascript
使用vue-cli4.0快速搭建一个项目的方法步骤
Dec 04 #Javascript
Vue-drag-resize 拖拽缩放插件的使用(简单示例)
Dec 04 #Javascript
jQuery实现全选、反选和不选功能的方法详解
Dec 04 #jQuery
JavaScript中如何对多维数组(矩阵)去重的实现
Dec 04 #Javascript
Vue实现base64编码图片间的切换功能
Dec 04 #Javascript
Vue实现点击当前元素以外的地方隐藏当前元素(实现思路)
Dec 04 #Javascript
Vue实现图片与文字混输效果
Dec 04 #Javascript
You might like
Zend Studio for Eclipse的java.lang.NullPointerException错误的解决方法
2008/12/06 PHP
PHP的单引号和双引号 字符串效率
2009/05/27 PHP
php checkbox复选框值的获取与checkbox默认值输出方法
2010/05/15 PHP
PHP 中检查或过滤IP地址的实现代码
2011/11/27 PHP
ThinkPHP的MVC开发机制实例解析
2014/08/23 PHP
PHP如何防止用户重复提交表单
2020/12/09 PHP
JavaScript入门教程(9) Document文档对象
2009/01/31 Javascript
模仿JQuery.extend函数扩展自己对象的js代码
2009/12/09 Javascript
jquery $.ajax()取xml数据的小问题解决方法
2010/11/20 Javascript
火狐textarea输入法的bug的触发及解决
2013/07/24 Javascript
使用JavaScript实现Java的List功能(实例讲解)
2013/11/07 Javascript
DOM基础教程之使用DOM控制表单
2015/01/20 Javascript
基于jQuery+JSON的省市二三级联动效果
2015/06/05 Javascript
使用javascript将时间转换成今天,昨天,前天等格式
2015/06/25 Javascript
基于jquery实现省市区三级联动效果
2015/12/25 Javascript
javascript跨域请求包装函数与用法示例
2016/11/03 Javascript
AngulerJS学习之按需动态加载文件
2017/02/13 Javascript
jQuery层级选择器_动力节点节点Java学院整理
2017/07/04 jQuery
Vue.js中extend选项和delimiters选项的比较
2017/07/17 Javascript
基于jQuery Ajax实现下拉框无刷新联动
2017/12/06 jQuery
解决Layui数据表格中checkbox位置不居中的方法
2018/08/15 Javascript
微信小程序实现判断是分享到群还是个人功能示例
2019/05/03 Javascript
vue实现记事本功能
2019/06/26 Javascript
基于leaflet.js实现修改地图主题样式的流程分析
2020/05/15 Javascript
[01:17]辉夜杯战队访谈宣传片—EHOME
2015/12/25 DOTA
[01:30]2016国际邀请赛中国区预选赛神秘商店火爆开启
2016/06/26 DOTA
详解Python函数可变参数定义及其参数传递方式
2017/08/02 Python
python数据类型之间怎么转换技巧分享
2019/08/20 Python
CSS3教程(2):网页边框半径和网页圆角
2009/04/02 HTML / CSS
7款设计巧妙的css3飘带状3D立体效果的导航菜单和表单窗口
2013/02/04 HTML / CSS
CSS3与动画有关的属性transition、animation、transform对比(史上最全版)
2017/08/18 HTML / CSS
领导班子在批评与自我批评座谈会上的发言
2014/09/28 职场文书
自愿离婚协议书范本
2015/01/26 职场文书
伊索寓言读书笔记
2015/06/30 职场文书
电力企业职工培训心得体会
2016/01/11 职场文书
2016年圣诞节义工活动总结
2016/04/01 职场文书