Vue基础学习之项目整合及优化


Posted in Javascript onJune 02, 2019

前言

使用 webpack 构建过 Vue 项目的同学应该知道 alias 的作用,我们可以使用它将复杂的文件路径定义成一个变量来访问。在不使用 alias 的项目中,我们引入文件的时候通常会去计算被引入文件对于引入它的文件的相对路径,比如像这样

import HelloWorld from '../../../../HelloWorld.vue'

一旦相对层次结构较深,我们就很难去定位所引入文件的具体位置,其实这并不是我们应该操心的地方,完全可以交给 webpack 来进行处理。在原生的 webpack 配置中我们可以定义 alias 来解决这一问题:

const path = require('path')

const resolve = dir => {
 return path.join(__dirname, dir)
}

module.exports = {
 ...
 
 resolve: {
 alias: {
 '@': resolve('src'), // 定义 src 目录变量
 _lib: resolve('src/common'), // 定义 common 目录变量,
 _com: resolve('src/components'), // 定义 components 目录变量,
 _img: resolve('src/images'), // 定义 images 目录变量,
 _ser: resolve('src/services'), // 定义 services 目录变量,
 }
 },
 
 ...
}

上方我们在 webpack resolve (解析)对象下配置 alias 的值,将常用的一些路径赋值给了我们自定义的变量,这样我们便可以将第一个例子简化为:

import HelloWorld from '_com/HelloWorld.vue'

而在 CLI 3.x 中我们无法直接操作 webpack 的配置文件,我们需要通过 chainWebpack 来进行间接修改,代码如下

/* vue.config.js */
module.exports = {
 ...
 
 chainWebpack: config => {
 config.resolve.alias
 .set('@', resolve('src'))
 .set('_lib', resolve('src/common'))
 .set('_com', resolve('src/components'))
 .set('_img', resolve('src/images'))
 .set('_ser', resolve('src/services'))
 },
 
 ...
}

这样我们修改 webpack alias 来简化路径的优化就实现了。但是需要注意的是对于在样式及 html 模板中引用路径的简写时,前面需要加上 ~ 符,否则路径解析会失败,如:

.img {
 background: (~_img/home.png);
}

二、整合功能模块

在多页应用的构建中,由于存在多个入口文件,因此会出现重复书写相同入口配置的情况,这样对于后期的修改和维护都不是特别友好,需要修改所有入口文件的相同配置,比如在 index 单页的入口中我们引用了 VConsole 及 performance 的配置,同时在 Vue 实例上还添加了 $openRouter 方法:

import Vue from 'vue'
import App from './index.vue'
import router from './router'
import store from '@/store/'
import { Navigator } from '../../common'

// 如果是非线上环境,不加载 VConsole
if (process.env.NODE_ENV !== 'production') {
 var VConsole = require('vconsole/dist/vconsole.min.js');
 var vConsole = new VConsole();

 Vue.config.performance = true;
}

Vue.$openRouter = Vue.prototype.$openRouter = Navigator.openRouter;

new Vue({
 router,
 store,
 render: h => h(App)
}).$mount('#app')

而在 page1 和 page2 的入口文件中也同样进行了上述配置,那我们该如何整合这些重复代码,使其能够实现一次修改多处生效的功能呢?最简单的方法便是封装成一个共用方法来进行调用,这里我们可以在 common 文件夹下新建 entryConfig 文件夹用于放置入口文件中公共配置的封装,封装代码如下

import { Navigator } from '../index'

export default (Vue) => {

 // 如果是非线上环境,不加载 VConsole
 if (process.env.NODE_ENV !== 'production') {
 var VConsole = require('vconsole/dist/vconsole.min.js');
 var vConsole = new VConsole();

 Vue.config.performance = true;
 }

 Vue.$openRouter = Vue.prototype.$openRouter = Navigator.openRouter;
}

上述代码我们向外暴露了一个函数,在调用它的入口文件中传入 Vue 实例作为参数即可实现内部功能的共用,我们可以将原本的入口文件简化为:

import Vue from 'vue'
import App from './index.vue'
import router from './router'
import store from '@/store/'
import entryConfig from '_lib/entryConfig/'

// 调用公共方法加载配置
entryConfig(Vue)

new Vue({
 router,
 store,
 render: h => h(App)
}).$mount('#app')

三、开启 Gzip 压缩

/* vue.config.js */
const isPro = process.env.NODE_ENV === 'production'

module.exports = {
 ...
 
 configureWebpack: config => {
 if (isPro) {
  return {
  plugins: [
   new CompressionWebpackPlugin({
    // 目标文件名称。[path] 被替换为原始文件的路径和 [query] 查询
   asset: '[path].gz[query]',
   // 使用 gzip 压缩
   algorithm: 'gzip', 
   // 处理与此正则相匹配的所有文件
   test: new RegExp(
    '\\.(js|css)$'
   ),
   // 只处理大于此大小的文件
   threshold: 10240,
   // 最小压缩比达到 0.8 时才会被压缩
   minRatio: 0.8,
   })
  ]
  }
 }
 }
 ...
}

上方我们通过在生产环境中增加 Gzip 压缩配置实现了打包后输出增加对应的 .gz 为后缀的文件,而由于我们配置项中配置的是只压缩大小超过 10240B(10kB)的 JS 及 CSS,因此不满足条件的文件不会进行 Gzip 压缩。

Gzip 压缩能在普通压缩的基础上再进行 50% 以上 的压缩,我们可以直接来看下控制台的输出对比图

Vue基础学习之项目整合及优化

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
让iframe框架网页在任何浏览器下自动伸缩
Aug 18 Javascript
Javascript+XMLHttpRequest+asp.net无刷新读取数据库数据
Aug 09 Javascript
基于JQuery的访问WebService的代码(可访问Java[Xfire])
Nov 19 Javascript
Javascript页面添加到收藏夹的简单方法
Aug 07 Javascript
浅谈JS日期(Date)处理函数
Dec 07 Javascript
javascript中关于&& 和 || 表达式的小技巧分享
Apr 10 Javascript
JavaScript中isPrototypeOf函数作用和使用实例
Jun 01 Javascript
详谈javascript中的cookie
Jun 03 Javascript
js实现仿qq消息的弹出窗效果
Jan 06 Javascript
js省市县三级联动效果实例
Apr 15 Javascript
React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)
Jul 11 Javascript
vue 动态添加class,三个以上的条件做判断方式
Nov 02 Javascript
JavaScript判断对象和数组的两种方法
May 31 #Javascript
vue中node_modules中第三方模块的修改使用详解
May 31 #Javascript
Vuex新手的理解与使用详解
May 31 #Javascript
一文快速了解JQuery中的AJAX
May 31 #jQuery
gulp构建小程序的方法步骤
May 31 #Javascript
jQuery实现动态加载(按需加载)javascript文件的方法分析
May 31 #jQuery
自定义javascript验证框架示例【附源码下载】
May 31 #Javascript
You might like
改德生G88 - 加装等响度低音提升电路
2021/03/02 无线电
php 分页原理详解
2009/08/21 PHP
PHP测试程序运行时间的类
2012/02/05 PHP
PHP面向对象教程之自定义类
2014/06/10 PHP
php进行支付宝开发中return_url和notify_url的区别分析
2014/12/22 PHP
yii2多图上传组件的使用教程
2018/05/10 PHP
laravel接管Dingo-api和默认的错误处理方式
2019/10/25 PHP
PHP设计模式之适配器模式(Adapter)原理与用法详解
2019/12/12 PHP
Prototype Array对象 学习
2009/07/19 Javascript
jquery 无限级联菜单案例分享
2013/03/26 Javascript
js实现弹窗插件功能实例代码分享
2013/12/12 Javascript
jquery根据属性和index来查找属性值并操作
2014/07/25 Javascript
jquery中radio checked问题
2015/03/16 Javascript
在AngularJS中使用AJAX的方法
2015/06/17 Javascript
利用jQuery实现WordPress中@的ID悬浮显示评论内容
2015/12/11 Javascript
jQuery可见性过滤选择器用法示例
2016/09/09 Javascript
详解利用exif.js解决ios手机上传竖拍照片旋转90度问题
2016/11/04 Javascript
javascript入门之window对象【新手必看】
2016/11/22 Javascript
AngularJS指令中的绑定策略实例分析
2016/12/14 Javascript
js排序与重组的实例讲解
2017/08/28 Javascript
javascript中的闭包概念与用法实践分析
2019/07/26 Javascript
webpack 如何同时输出压缩和未压缩的文件的实现步骤
2020/06/05 Javascript
VSCode launch.json配置详细教程
2020/06/18 Javascript
JS实现数据动态渲染的竖向步骤条
2020/06/24 Javascript
python爬虫中get和post方法介绍以及cookie作用
2018/02/08 Python
python如何将图片转换为字符图片
2020/08/19 Python
Python基于FTP模块实现ftp文件上传操作示例
2018/04/23 Python
pytorch多GPU并行运算的实现
2019/09/27 Python
tensorflow 实现打印pb模型的所有节点
2020/01/23 Python
利用Python脚本实现自动刷网课
2020/02/03 Python
python解决OpenCV在读取显示图片的时候闪退的问题
2021/02/23 Python
倩碧美国官网:Clinique美国
2016/07/20 全球购物
Shell脚本如何向终端输出信息
2014/04/25 面试题
党员公开承诺书
2014/03/25 职场文书
小区物业管理2015年度工作总结
2015/10/22 职场文书
8个JS的reduce使用实例和reduce操作方式
2021/10/05 Javascript