以下方式基于 @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. VirtualBox for Mac 6.0.14 开源免费虚拟机方案

    VirtualBox for mac是一款开源虚拟机软件,你可以利用该软件在Mac OS平台上运行Windows软件,即可以在一定程度上弥补Mac OS平台软件不足的劣势,玩家也可以获得Windows ...

  2. Qt5教程: (3) 自定义信号与槽

    1. 自定义槽 槽可以是任何成员函数.普通全局函数.静态函数 槽函数和信号的参数和返回值要一致 由于信号是没有返回值的, 槽函数也一定没有返回值 首先在mainwidget.h中添加槽函数: publ ...

  3. sqli-labs靶机注入笔记1-10关

    嗯,开始记录sqli-lab的每关笔记,复习一次 1-2关 基于错误的字符串/数字型注入 闭合的符号有区别而已 http://www.sqli-lab.cn/Less-1/?id=1 or 1=1 - ...

  4. web项目中登陆超时的功能实现(基于C#)

    当我们登陆进网站后,中途去看别的东西,没有再与该网站的服务器交互,就会弹出一个js窗口,登陆超时请重新登陆,并跳转到登陆页面. 步骤1.实现原理,在web.config中配置session的超时时间, ...

  5. JavaScript正则表达式之语法

    Regular Expressions翻译成中文叫正则表达式.也不知道是谁翻译过来的,听起来就很严肃.似乎翻译成通用表达式更能传达其精髓. 为什么叫通用表达式?因为它有一套和编程语言无关的文本匹配规则 ...

  6. opencv::Brisk检测与匹配

    Brisk(Binary Robust Invariant Scalable Keypoints)特征介绍 构建尺度空间 特征点检测 FAST9-16寻找特征点 特征点定位 关键点描述子

  7. php能在手机上运行吗

    php能在手机上运行吗? php能在手机上运行.但是需要你的手机具有PHP运行环境. 比如一款安卓手机上面的php运行环境软件:anmpp. ANMPP是Android NGINX MYSQL PGS ...

  8. JAVA实现扫描线算法

    首先说一下,教科书上的扫描线算法确实是用c++很好实现,而且网上有很多源码,而java实现的基本没有(可能是我没看到),所以肖先生还是打算自己码(实验作业写这个而自己又个是写java的猿0.0). 对 ...

  9. python-从文件中读取数据

    一.读取整个文件 learnFile.py 绝对路径 # coding=UTF-8 import sys reload(sys) with open(r'C:\Users\zhujiachun\Des ...

  10. javascript实用代码片段

    持续积累中~ 拓展原型 Function.prototype.method = function(name, extend) { if(!this.prototype[name]) { this.pr ...