Vue之项目整合与优化
栏目: JavaScript · 发布时间: 5年前
内容简介:使用一旦相对层次结构较深,我们就很难去定位所引入文件的具体位置,其实这并不是我们应该操心的地方,完全可以交给 webpack 来进行处理。在原生的 webpack 配置中我们可以定义 alias 来解决这一问题:上方我们在
使用 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% 以上 的压缩,我们可以直接来看下控制台的输出对比图
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Spring整合ActiveMQ项目实战
- React Native 项目整合 CodePush 完全指南
- maven项目下solr和spring的整合配置
- 基于 Docker 部署的项目如何和 skywalking agent 进行整合
- Spring Boot从入门到实战:整合Web项目常用功能
- Docker 部署 SpringBoot 项目整合 Redis 镜像做访问计数Demo
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
C语言接口与实现
David R. Hanson / 郭旭 / 人民邮电出版社 / 2011-9 / 75.00元
《C语言接口与实现:创建可重用软件的技术》概念清晰、实例详尽,是一本有关设计、实现和有效使用C语言库函数,掌握创建可重用C语言软件模块技术的参考指南。书中提供了大量实例,重在阐述如何用一种与语言无关的方法将接口设计实现独立出来,从而用一种基于接口的设计途径创建可重用的API。 《C语言接口与实现:创建可重用软件的技术》是所有C语言程序员不可多得的好书,也是所有希望掌握可重用软件模块技术的人员......一起来看看 《C语言接口与实现》 这本书的介绍吧!