在此之前,我们先谈谈前端项目的性能优化。

优化前端项目无非就是2方面的优化:

一、网络性能优化(重点)

  1. 减少请求数量(webpack的天职就是打包)
  2. 减少请求资源大小(压缩gzip,后端会完成)
  3. CDN加速、负载均衡(运维负责)

二、运行性能优化

  1. 减少DOM操作
  2. 减少图片数量

显而易见的,我们前端除了一些游戏、WEBGL项目、有大量DOM操作项目之外,运行性能都不至于太差,所以我们接下来谈论的是webpack对网络性能的优化:

主要从“请求数量”和“请求资源大小”入手,我们知道如果没有脚手架,一般我们自己配置webpack,会把所有内容打包到一个js文件上,这个时候请求数量的确变少了,但是与此同时请求资源的大小也变大了,这就需要我们来衡量了,什么时候需要将某些chunk模块移出去呢?

当我们用到vue-cli的时候我们发现,打包完的文件中,js被分成了三个文件(原理就是我们之前提到过的CommonsChunkPlugin),其中有两个文件是比较大的,一个是app.xxx.js(存放我们写的代码)另一个是vendor.xxx.js(存放从node_modules引入的第三方库)

所以现在问题就转移到变成如何优化app和vendor了(我们讨论的是vue-cli里面webpack打包的优化):


app.xxx.js:

这里的优化就是所谓的“懒加载(按需加载)”

1.  用 const test = () => import('@/components/test')    代替   import test from '@/components/test'

   注意:这个语法糖是需要先安装 babel-plugin-syntax-dynamic-import,然后配置babel  plugins: ["syntax-dynamic-import"]  后才能使用的

分组:在import方法前面加入一个特殊的注释  /*webpackChunkName: "haha233"*/  ,就可以实现分组了

const nav = () => import(/*webpackChunkName: "haha233"*/'../nav/nav')
const haha = () => import(/*webpackChunkName: "haha233"*/'../test/test') 
 

2.  用 const test = resolve => require.ensure([],() => resolve(require('@/components/test')))  代替  const test = require('@/components/test')

require.ensure(dependencies: String[], callback: function, chunkName: String)

   这个是webpack官网提供的方法

      分组:在ensure方法最后传相同的组名就可以实现分组了

const test = resolve => require.ensure([], () => resolve(require('@/components/test')),'haha233')
const nav = resolve => require.ensure([], () => resolve(require('@/components/nav')),'haha233')

所谓分组就是,build后发现多出来一个js文件(除了正常的app、vendor和manifest),里面会包含同组模块的内容(例如上面的例子就是 nav和test模块的内容)

上面两点都有特殊的语法,1.要先用箭头函数包裹import('~~~'),2.要用带resolve参数的箭头函数包裹require.ensure然后在第二个参数中用resolve来处理require(‘~~~’)

这两种特殊的语法都是把promise包裹一下,变成vueRouter能接受的形式,实行按路由模块分文件


vendor.xxx.js:

vendor是,vue-cli帮我们配置好的,打包第三方库的文件,当我们引入大量库的时候,这个vendor文件会变得异常巨大,我们就需要主要优化这个文件,减小其大小

我们当然可以用上面两种方法来加载第三方库了,例如JQ

var $ = null

import(/* webpackChunkName: "JQ" */'jquery').then(res => {
$ = res
}, err => {
console.log(err)
})

但是对于第三方js库我们一般不这么做,因为上面的方法是异步加载,有些库往往是我们项目代码的依赖,必须先加载完成不能够使用异步加载,因此我们来介绍下其他提取的方法:

1.我们可以用之前提到过的CommonsChunkPlugin

2.当然我们也可以自己动手,很简单,把库手动引入index.html,文件放在项目目录下的static/js下面,完成~

这样提出来的库要注意配置一下.eslintrc.js , 例如提取了jquery出来,应该加入如下配置

  globals: {
'$': false
}

不配置的话,eslint-loader编译会报错说    ’$‘ is  not defined


说到这里我们又可能会有一个疑问了:我们该什么时候把模块分出来呢?这个问题就关系到了衡量请求数量请求资源大小对性能影响的平衡点了

我们分开app和vendor来讨论吧

app:    我们自己写的模块来说,我们一般按照路由来分

所以其实上面提到的”懒加载“技巧多用在router.js里面,这样就可以实现到当路由切换到某个组别的时候才去加载这个组的js

vendor: 对于第三方库来说,一般就是考虑大小了,如果库比较笨重最好就提出来了

vue-cli内部webpack的打包优化的更多相关文章

  1. Vue.js中用webpack合并打包多个组件并实现按需加载

    对于现在前端插件的频繁更新,所以多多少少要对组件化有点了解,下面这篇文章主要给大家介绍了在Vue.js中用webpack合并打包多个组件并实现按需加载的相关资料,需要的朋友可以参考下.   前言 随着 ...

  2. Vue -- vue-cli(vue脚手架) npm run build打包优化

    这段时间公司新项目立项,开发组选用 Vue2.0 进行开发.当然也就一并用到 vue cli 进行自动化构建.结果在基础版本开发完成后,用 npm run build 命令打包上线时,发现以下几个问题 ...

  3. @vue/cli 3.x项目脚手架 webpack 配置

    @vue/cli  是一个基于 Vue.js 进行快速开发的完整系统. @vue/cli   基于node服务  需要8.9以上版本 可以使用 nvm等工具来控制node版本  构建于 webpack ...

  4. vue cli 3

    介绍 Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统 通过 @vue/cli 搭建交互式的项目脚手架. 通过 @vue/cli + @vue/cli-service-global 快 ...

  5. 分离vue组件内部css

    当我们使用vue组件的时候,使用webpack打包的时候,默认会把vue组件内部的css打包到页面上,但是打包到页面上很丑陋,所以我们希望可以把vue组件内部的css抽离到css文件中,使用vue-s ...

  6. vue cli 中关于vue.config.js中chainWebpack的配置

    Vue CLI  的官方文档上写:调整webpack配置最简单的方式就是在vue.config.js中的configureWebpack选项提供一个对象. Vue CLI 内部的 webpack 配置 ...

  7. axios踩坑记录+拦截器使用+vue cli代理跨域proxy+webpack打包部署到服务器

    1.小小的提一下vue cli脚手架前端调后端数据接口时候的本地代理跨域问题,如我在本地localhost访问接口http://40.00.100.100:3002/是要跨域的,相当于浏览器设置了一道 ...

  8. Vue(SPA) WebPack模块化打包、SEO优化(Vue SSR服务端同构直出)、全浏览器兼容完整解决方案

    白驹过隙,时光荏苒 大概去年这个时候写了angular 结合webpack的一套前端方案,今年此时祭出vue2结合webpack的一套前端方案. 明年的这个时候我又是在做什么... 读在最前面: 1. ...

  9. webpack原理探究 && 打包优化

    在做vue项目和react项目时,都用到了webpack.webpack帮助我们很好地提高了工作效率,但是一直以来没有对其原理进行探究,略有遗憾. 因为使用一个工具,能够深入了解其原理才能更好地使用. ...

随机推荐

  1. Google是如何教会机器玩Atari游戏的

    转自:http://blog.csdn.net/revolver/article/details/50177219 今年上半年(2015年2月),Google在Nature上发表了一篇论文:Human ...

  2. 在Windows商店应用中使用浅色主题

    在开发商店应用时会遇到这样的情况,设计师给我们的设计是浅色背景/深色文本,而商店应用默认是深色背景/浅色文本.那我们需要在每个页面去显式声明背景色和前景色吗,这显然是不理想的.这时就需要设置应用的主题 ...

  3. nodejs 监控代码变动实现ftp上传

    被动模式下 //https://www.npmjs.com/package/watch //文件同步功能 var watch = require('watch'); var path = requir ...

  4. CentOS7使用winbind加入AD

    https://ishm.idv.tw/?p=336 CentOS 7 使用 winbind 加入 AD 需求:已經熟悉 CentOS 6 的 AD 加入方式,CentOS 7 已將 winbind ...

  5. React Router学习

    React Router教程 本教程引用马伦老师的的教程 React项目的可用的路由库是React-Router,当然这也是官方支持的.它也分为: react-router 核心组件 react-ro ...

  6. 2-Eleventh Scrum Meeting20151211

    第二阶段任务分工整理会议 1.会议任务: (1)明晰第二阶段的开发内容,统计未完成的功能留需完善开发. (2)安排任务分工,每个人的工作安排. (3)PM职位担任. (4)博客内容负责. 2.会议记录 ...

  7. C++的OOP特性

    内存模型和名称空间 存储持续性,作用域和链接性 C++有三种方案来存储数据 自动存储持续性:在函数定义中声明的变量,包括函数参数.在函数或代码块开始执行时创建.执行完函数或者代码块,内存自动释放. 静 ...

  8. Perfmon - Windows 自带系统监测工具(转)

    本文转自:http://blog.csdn.net/oscar999/article/details/7918385 一. 简述 可以用于监视CPU使用率.内存使用率.硬盘读写速度.网络速度等. Pe ...

  9. spring动态数据源+事务

    今天在尝试配置spring的动态数据源和事务管理的时候,遇到了几处配置上的问题,在此记录下: 1.使用了spring的aop思想,实现了动态数据源的切换. 2.spring的事务管理,是基于数据源的, ...

  10. MYSQL 解决中文字符集乱码问题的方法

    修改 /etc/mysql/my.cnf 增加内容 [client] default-character-set = utf8mb4 [mysql] default-character-set = u ...