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

优化前端项目无非就是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. 利用Github搭建自己的博客

    教程链接:搭建个人博客 嘿嘿嘿!!一直想自己搭建博客的,一直没机会,这次终于把博客搭了起来.虽然只是一个壳子..套了别人的模板~不过还是很令人兴奋哟!总的来说,就按照这个教程一直往下走,其中有一个坑就 ...

  2. sudo apt-get update 去除设置的代理

    今天想装个软件(wine),使用 sudo apt-get update 命令时,发现给出很多Ign 语句,总出现 Connecting to proxy.http://10.0.126.1:1312 ...

  3. .NET Core 开发之旅 (1. .NET Core R2安装教程及Hello示例)

    前言 前几天.NET Core发布了.NET Core 1.0.1 R2 预览版,之前想着有时间尝试下.NET Core.由于各种原因,就没有初试.刚好,前几天看到.NET Core发布新版本了,决定 ...

  4. CSS技巧收集——毛玻璃效果

    先上 demo和 源码 其实毛玻璃的模糊效果技术上比较简单,只是用到了 css 滤镜(filter)中的 blur 属性.但是要做一个好的毛玻璃效果,需要注意很多细节. 比如我们需要将上图中页面中间的 ...

  5. 杂谈---LZ的编程之路以及十点建议

    LZ本人是09年毕业的,在某二流本科院校学的非计算机专业,在兴趣的驱使之下,最终毅然决然的走上了编程这一条“不归路”. 说起LZ的经历虽不算是跌宕起伏,但也真正算是人生无常. 当初09年7月回到家里, ...

  6. 微软职位内部推荐-Senior Software Engineer-Eco

    微软近期Open的职位: The MOD Ecosystem team is dedicated to expanding the reach and value of Office by enabl ...

  7. 【MOOC EXP】Linux内核分析实验三报告

     程涵  原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 [跟踪分析Linux内核的启动过程] ...

  8. C语言编程—自动生成四则运算升级版

    #include<stdio.h> #include<time.h> struct fenshu { int fenzi; int fenmu; }Fenshu[]; int ...

  9. IIS错误提示:另一个程序正在使用此文件 进程无法访问

    在IIS管理中,启动一个配置好的网站时,提示:另一个程序正在使用此文件 进程无法访问 原因:网站绑定端口被占用 解决办法:更换绑定端口或者将占用此端口的程序关掉即可

  10. 【壹拾壹周】final_review

    项目名:俄罗斯方块 组名:新蜂 组长:武志远 组员:宫成荣 杨柳 谢孝淼 李桥 final Review会议 时间:2016.12.3 会议内容 设想和目标 1.在final阶段发布时的预期目标是什么 ...