以下方式基于 @vue/cli 快速搭建的交互式项目脚手架

1. 路由懒加载

当打包构建应用时,JavaScript 包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了。

结合 Vue 的异步组件和 Webpack 的代码分割功能,轻松实现路由组件的懒加载。

 import Vue from 'vue'
import Router from 'vue-router'
import store from './store'
import Home from './views/Home.vue' Vue.use(Router) const router = new Router({
routes: [
{
path: '/',
name: 'home',
component: Home,
},
{
path: '/make',
name: 'make',
component: () => import(/* webpackChunkName: "make" */ './views/Make.vue'),
}
],
})

2. webpack动态导入

将statically import(静态导入) 改为 dynamic import(动态导入)进行代码拆分

 import(/* webpackChunkName: "html2canvas" */ 'html2canvas').then(
({ default: html2canvas }) => {
html2canvas(document.querySelector('.container'), {
scale: window.devicePixelRatio,
allowTaint: false,
useCORS: true,
}).then(canvas => {
console.log(canvas.toDataURL('image/jpeg', 0.9))
})
}
)

3. 预取/预加载模块(prefetch/preload module)

在声明 import 时,使用下面这些内置指令,可以让 webpack 输出 "resource hint(资源提示)",来告知浏览器:

  prefetch(预取):将来某些导航下可能需要的资源
  preload(预加载):当前导航下可能需要资源

import(/* webpackPrefetch: true */ 'LoginModal');

import(/* webpackPreload: true */ 'ChartingLibrary');

这会生成 <link rel="prefetch" href="login-modal-chunk.js"> 并追加到页面头部,指示着浏览器在闲置时间预取 login-modal-chunk.js 文件。

只要父 chunk 完成加载,webpack 就会添加 prefetch hint(预取提示)。

与 prefetch 指令相比,preload 指令有许多不同之处:

  • preload chunk 会在父 chunk 加载时,以并行方式开始加载。prefetch chunk 会在父 chunk 加载结束后开始加载。
  • preload chunk 具有中等优先级,并立即下载。prefetch chunk 在浏览器闲置时下载。
  • preload chunk 会在父 chunk 中立即请求,用于当下时刻。prefetch chunk 会用于未来的某个时刻。
  • 浏览器支持程度不同。

vue默认开启,可在vue.config.js中全局禁用prefetch,再针对指定模块开启。

chainWebpack: config => {
config.plugins.delete('prefetch')
},

4. 添加Gzip打包配置(compression-webpack-plugin)

  yarn add compression-webpack-plugin -D

configureWebpack: config => {
const CompressionPlugin = require('compression-webpack-plugin')
config.plugins.push(new CompressionPlugin())
}

5. 添加页面预渲染(prerender-spa-plugin)

在单页应用程序中预呈现静态HTML,可以极大的提高网页访问速度,而且配合一些meat插件,基本可以满足SEO需求。

预渲染基本上是在启动无头浏览器,加载应用程序的路由并将结果保存到静态HTML文件中。然后将其与以前使用的任何静态文件服务解决方案一起使用,是无需更改代码或添加服务器端渲染的解决方法。

不过,它仅适用于HTML5 history,因为每个预渲染的路由都会生成一个对应的HTML,在hash模式下使用只会有一个HTML。

  yarn add prerender-spa-plugin -D

 configureWebpack: config => {
const path = require('path')
const PrerenderSPAPlugin = require('prerender-spa-plugin')
config.plugins.push(
new PrerenderSPAPlugin({
staticDir: path.join(__dirname, 'dist'),
routes: ['/'],
minify: {
collapseBooleanAttributes: true,
collapseWhitespace: true,
keepClosingSlash: true,
decodeEntities: true,
sortAttributes: true,
},
renderer: new PrerenderSPAPlugin.PuppeteerRenderer({
renderAfterDocumentEvent: 'render-event',
renderAfterTime: 5000,
// headless: false,
}),
})
)
} new Vue({
router,
store,
render: h => h(App),
mounted() {
// 预渲染 renderAfterDocumentEvent.
document.dispatchEvent(new Event('render-event'))
},
}).$mount('#app')

prerender-spa-plugin 利用了 Puppeteer 的爬取页面的功能。 Puppeteer 是一个 Chrome官方出品的 headlessChromenode 库。它提供了一系列的 API, 可以在无 UI 的情况下调用 Chrome 的功能, 适用于爬虫、自动化处理等各种场景。它很强大,所以很简单就能将运行时的 HTML 打包到文件中。原理是在 Webpack 构建阶段的最后,在本地启动一个 Puppeteer 的服务,访问配置了预渲染的路由,然后将 Puppeteer 中渲染的页面输出到 HTML 文件中,并建立路由对应的目录。

6. 压缩js,删除console(terser-webpack-plugin)

  yarn add terser-webpack-plugin -D

 configureWebpack: config => {
const TerserPlugin = require('terser-webpack-plugin')
config.optimization.minimizer.push(
new TerserPlugin({
extractComments: false,
terserOptions: { compress: { drop_console: true } },
})
)
}

7. bundle 分析(webpack-bundle-analyzer)

将 bundle 内容展示为便捷的、交互式、可缩放的树状图形式。

  yarn add -D webpack-bundle-analyzer

 configureWebpack: config => {
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer')
.BundleAnalyzerPlugin
config.plugins.push(new BundleAnalyzerPlugin())
}

8. WebP

WebP(发音 weppy),是一种支持有损压缩和无损压缩的图片文件格式,派生自图像编码格式 VP8。根据 Google 的测试,无损压缩后的 WebP 比 PNG 文件少了 45% 的文件大小,即使这些 PNG 文件经过其他压缩工具压缩之后,WebP 还是可以减少 28% 的文件大小。

不过WebP目前在IOS上兼容性不好,可以使用JavaScript进行检测,对支持 WebP 的用户输出 WebP 图片。

 created() {
const htmlClass = document.documentElement.classList
this.checkWebpSupport() ? htmlClass.add('webps') : htmlClass.remove('webps')
} checkWebpSupport() {
try {
return (
document
.createElement('canvas')
.toDataURL('image/webp')
.indexOf('data:image/webp') === 0
)
} catch (err) {
return false
}
}

记一次BUG:

  在默认情况下,页面加载完成执行 this.checkWebpSupport() && document.documentElement.classList.add('webps'),没有问题。

  但使用了prerender-spa-plugin进行预渲染后,因为执行预渲染的浏览器是支持WebP的,所有会直接在页面中加上'webps'类,所以即使浏览器不支持WebP,不执行此方法也会有该类名。

9. 网页性能优化测试(googlespeed)

进行网页测试,根据优化建议针对性的修改,提高网页加载速度。

  https://www.googlespeed.cn/




Vue项目性能优化整理的更多相关文章

  1. 【Vuejs】335-(超全) Vue 项目性能优化实践指南

    点击上方"前端自习课"关注,学习起来~ 前言 Vue 框架通过数据双向绑定和虚拟 DOM 技术,帮我们处理了前端开发中最脏最累的 DOM 操作部分, 我们不再需要去考虑如何操作 D ...

  2. vue项目性能优化总结

    在使用elementUI构建公司管理系统时,发现首屏加载时间长,加载的网络资源比较多,对系统的体验性会差一点,而且用webpack打包的vuejs的vendor包会比较大.所以通过搜集网上所有对于vu ...

  3. VUE项目性能优化实践——通过懒加载提升页面响应速度

    本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 最近我司因业务需求,需要在一个内部数据分析平台集成在线Excel功能,既然我 ...

  4. vue项目性能优化,优化项目加载慢的问题

    一. 对路由组件进行懒加载: 如果使用同步的方式加载组件,在首屏加载时会对网络资源加载加载比较多,资源比较大,加载速度比较慢.所以设置路由懒加载,按需加载会加速首屏渲染.在没有对路由进行懒加载时,在C ...

  5. 浅谈Vue 项目性能优化 经验

    我优化公司的项目总结的几点: 1.先查看引入的图片大小,如果太大了,可以压缩,压缩路径:https://zhitu.isux.us/ 2.代码包优化, 待下项目开发完成.进行打包源码上线环节,需要对项 ...

  6. vue项目性能优化(路由懒加载、gzip加速、cdn加速)

    前端工程性能优化一说意义深远悠长,本章主要介绍除了一些基础优化外如何实行路由懒加载.Gzip加速.CDN加速,让网页飞的快一些. 基础优化 老生常谈的一些: 不要在模板中写复杂的表达式 慎用watch ...

  7. Vue常用性能优化

    Vue常用性能优化 Vue常用的一些优化方式,主要是在构建项目过程需要注意的方面. 编码优化 避免响应所有数据 不要将所有的数据都放到data中,data中的数据都会增加getter和setter,并 ...

  8. vuejs项目性能优化总结

    在使用elementUI构建公司管理系统时,发现首屏加载时间长,加载的网络资源比较多,对系统的体验性会差一点,而且用webpack打包的vuejs的vendor包会比较大.所以通过搜集网上所有对于vu ...

  9. vue页面性能优化方案

    个人在项目中用到的页面性能优化的方式总结. 一.均衡页面加载文件的大小和数量 1.项目中小图片图片转base64,通过工具如webpack进行图片压缩,文件进行压缩混淆等 2.vue-router 懒 ...

随机推荐

  1. .NET北京俱乐部,技术的饕餮盛宴,不枉此行

    在19年年尾,我们相约于.NET北京俱乐部 DNT精英论坛暨.NET北京俱乐部是由资深.NET专家和社区活跃分子发起的技术论坛,以“分享.成长.合作.共赢”为原则,致力于打造一个领先的技术分享平台和成 ...

  2. 渗透测试-基于白名单执行payload--Pcalua

    0x01 Pcalua简介 Windows进程兼容性助理(Program Compatibility Assistant)的一个组件. 说明:Pcalua.exe所在路径已被系统添加PATH环境变量中 ...

  3. python中的随机函数

    python--随机函数(random,uniform,randint,randrange,shuffle,sample) 本文转载自:[chamie] random() random()方法:返回随 ...

  4. html简介(1)

    HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言: HyperText Markup Language HTML 不是一种编程语言,而是一种标记语言

  5. (一)如何理解java面向对象编程

    哲学中,事物总是螺旋式上升,波浪式前进.因而编程也逐渐向人类更容易理解的方向前进,多年来人们苦苦追求的编程境界 : 高扩展性(extensibility),高复用性(reuseable).java语言 ...

  6. PHP安装amqp拓展(win环境)

    安装php扩展amqp 先查看自己的php版本 记住版本  至于这个线程安全问题 这里引用了别人的自己看看吧  http://blog.csdn.net/aoyoo111/article/detail ...

  7. 百万年薪python之路 -- python的历史

    1.python的历史 ​ 2004 Django框架诞生了 ​ python2: ​ 源码不统一,有重复的功能代码 ​ python3: ​ 源码统一,没有重复的功能 2.python是一个什么编程 ...

  8. 斯坦福机器学习课程 Exercise 习题二

    Exercise 2: Linear Regression 话说LaTex用起来好爽 Matlab代码 迭代并且画出拟合曲线 Linear regression 公式如下 hθ(x)=θTx=∑i=0 ...

  9. 实战SpringCloud响应式微服务系列教程(第九章)使用Spring WebFlux构建响应式RESTful服务

    本文为实战SpringCloud响应式微服务系列教程第九章,讲解使用Spring WebFlux构建响应式RESTful服务.建议没有之前基础的童鞋,先看之前的章节,章节目录放在文末. 从本节开始我们 ...

  10. 并发中如何保证缓存DB双写一致性(JAVA栗子)

    并发场景中大部分处理的是先更新DB,再(删缓.更新)缓存的处理方式,但是在实际场景中有可能DB更新成功了,但是缓存设置失败了,就造成了缓存与DB数据不一致的问题,下面就以实际情况说下怎么解决此类问题. ...