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

优化前端项目无非就是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. Android与Libgdx入门实例

    本文讲解如何实现Android与Libgdx各自的Hello World过程. 1. Android版Hello World 点击Eclipse快捷方式,选择New Android Applicati ...

  2. 在nodejs中引进模块要经历的步骤

    在nodejs中引入模块需要经历如下3个步骤 1.路径分析 2.文件定位 3.编译执行 在nodejs中模块分为两类,一类是nodejs提供的模块,称为核心模块,另一类的用户编写的模块,称为文件模块. ...

  3. Frida----安装

    介绍 它是本机应用程序的 Greasemonkey,或者更多技术术语,它是一个动态代码检测工具包.它允许您将JavaScript或您自己的库的片段注入Windows,macOS,GNU / Linux ...

  4. java实验报告二

    一.实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计模式 二.实验步骤 (一)单元 ...

  5. YISMILE微信小程序使用说明

    使用说明: 程序名称:易校(YISMILE) 开发团队:KNY三人组 团队logo: 程序logo: 程序功能及使用说明: “失物招领”界面可以浏览发布的失物信息: “发布信息”界面用户可以针对物品类 ...

  6. oracle union

    union 取并集,去重不仅去掉两个集合之间的重复,也会去掉集合的自重复

  7. Thymeleaf 学习笔记

    (一)Thymeleaf 是个什么? 简单说, Thymeleaf 是一个跟 Velocity.FreeMarker 类似的模板引擎,它可以完全替代 JSP .相较与其他的模板引擎,它有如下三个极吸引 ...

  8. “数学口袋精灵”App的第二个Sprint计划----开发日记

    一.现状 在第一个sprint计划中,我们已经初步完成了“数学口袋精灵”App的基本框架,现在我们要继续完善app,使其功能更加强大,界面更加有趣. 二.任务认领 完成界面后的后续任务: 冯美欣:欢迎 ...

  9. Java实现模拟登录新浪微博

    毕设题目要使用到新浪微博数据,所以要爬取新浪微博的数据.一般而言,新浪微博的爬虫有两种模式:新浪官方API和模拟登录新浪微博.两种方法的异同点和适用情况就无须赘述了.前辈的文章已经非常多了.写这篇文章 ...

  10. ubuntu18.04配置nvidia docker和远程连接ssh+远程桌面连接(二)

    ubuntu18.04配置nvidia docker和远程连接ssh+远程桌面连接(二) 本教程适用于想要在远程服务器上配置docker图形界面用于深度学习的用户. (二)nvidia docker配 ...