基于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代码编写需要注意的7个小细节小结
Sep 21 Javascript
js输出阴历、阳历、年份、月份、周示例代码
Jan 29 Javascript
JQuery设置时间段下拉选择实例
Dec 30 Javascript
解决js函数闭包内存泄露问题的办法
Jan 25 Javascript
js获取所有checkbox的值的简单实例
May 30 Javascript
JS Ajax请求如何防止重复提交
Jun 13 Javascript
jQuery层级选择器_动力节点节点Java学院整理
Jul 04 jQuery
Vue使用vux-ui自定义表单验证遇到的问题及解决方法
May 10 Javascript
浅析JS中回调函数及用法
Jul 25 Javascript
Vue组件中的data必须是一个function的原因浅析
Sep 03 Javascript
Three.js实现3D机房效果
Dec 30 Javascript
从0到1搭建Element的后台框架的方法步骤
Apr 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
40个迹象表明你还是PHP菜鸟
2008/09/29 PHP
纯php打造的tab选项卡效果代码(不用js)
2010/12/29 PHP
关于Zend Studio 配色方案插件的介绍
2013/06/24 PHP
php脚本运行时的超时机制详解
2016/02/17 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
2018/01/27 PHP
PHP实现的策略模式示例
2019/03/20 PHP
List the UTC Time on a Computer
2007/06/11 Javascript
js 省地市级联选择
2010/02/07 Javascript
js获取指定日期前后的日期代码
2013/08/20 Javascript
nodejs中转换URL字符串与查询字符串详解
2014/11/26 NodeJs
angularjs中的e2e测试实例
2014/12/06 Javascript
bootstrap table 服务器端分页例子分享
2015/02/10 Javascript
jQuery中extend()和fn.extend()方法详解
2015/06/03 Javascript
Bootstrap组合上、下拉框简单实现代码
2017/03/06 Javascript
JavaScript 过滤关键字
2017/03/20 Javascript
基于jQuery实现文字打印动态效果
2017/04/21 jQuery
在React 组件中使用Echarts的示例代码
2017/11/08 Javascript
vue-cli3.0 特性解读
2018/04/22 Javascript
小程序图片长按识别功能的实现方法
2018/08/30 Javascript
手把手教你 CKEDITOR 4 扩展插件制作
2019/06/18 Javascript
Vue3项目打包后部署到服务器 请求不到后台接口解决方法
2020/02/06 Javascript
Python备份目录及目录下的全部内容的实现方法
2016/06/12 Python
python 两种方法删除空文件夹
2020/09/29 Python
PyTorch中的拷贝与就地操作详解
2020/12/09 Python
荷兰在线体育用品商店:Avantisport.nl
2018/07/04 全球购物
英国时尚女装购物网站:Missguided
2018/08/23 全球购物
天网面试题
2013/04/07 面试题
投标邀请书范文
2014/01/31 职场文书
违纪检讨书2000字
2014/02/08 职场文书
高职教师先进事迹材料
2014/08/24 职场文书
党员反对四风问题思想汇报
2014/09/12 职场文书
2015年度党员个人总结
2015/02/14 职场文书
幼儿园教师个人工作总结2015
2015/05/12 职场文书
幽默导游词应该怎么写?
2019/08/26 职场文书
Java版 单机五子棋
2022/05/04 Java/Android
SQL解决未能删除约束问题drop constraint
2022/05/30 SQL Server