cdn加载vue很慢_Vue.js 项目打包优化实践

0949d23e7abcca02a6672b813fd7926b.png

首先上结果:

  1. 把常用的 Vue,router,vuex,axios 的 runtime 包拆分了出来,改为 cdn;
  2. 另外就是对于自己编写的业务代码进行分包,根据路由进行懒加载,可以较好的提高首屏加载速度。
  3. 添加了全局 loading 来提高体验。

716a1379f0d57c919dfccd3ee69e4417.png
优化前,可以看出包含了不少的runtime包

d36e27a394cf4012685a18c3774581af.png
经过优化体积大幅减小
不出意外core-js也可以改成CDN

配合静态资源的CDN加速,目前首页的速度大概是700ms,除了图片外加载的速度大概是200ms左右

abandon.work​abandon.work

CDN 优化

CDN 优化是在 webpack 中实现的,主要分为环境切换,webpack 打包技巧和 html-webpack-plugin配置三个部分。

这部分的代码可以点击这个链接

环境切换

通过process.env.NODE_ENV来切换环境,因为在 dev 环境的时候,最好还是使用本地包,方便 debug 等,在生产环境的时候才需要添加 CDN.

本项目的vue.config.js中就是这样安排的,这样就可以在不同环境对 webpack 进行配置,类似于vue-cli2的配置类型:

# cli 2
webpack.dev.js
webpack.prod.js

本项目中;

if (process.env.NODE_ENV === 'production') {webpackConfig['chainWebpack'] = config => {config.plugin('html').tap(args => {args[0].cdn = cdn;return args;});};webpackConfig['configureWebpack'] = config => {config['externals'] = {vue: 'Vue',vuex: 'Vuex','vue-router': 'VueRouter',axios: 'axios',};config['plugins'].push(new BundleAnalyzerPlugin());};
}module.exports = webpackConfig;

具体操作涉及vue/cli3+的配置,具体可以看这里;
对于configureWebpack, 有配置式和函数式,当使用函数式的时候,添加插件的方法可以看上面的片段,这是官方文档里面没有的。

打包技巧

那么该怎么设置 cdn 呢?

这里需要两个 webpack 的配置项:

  1. webpack.externals
  2. webpack.plugins.html-webpack-plugin
    具体也可以看代码,主要的思路就是在区分环境的基础上,在生产环境将需要 cdn 的包放在webpack.externals里面:
webpackConfig['configureWebpack'] = config => {config['externals'] = {vue: 'Vue',vuex: 'Vuex','vue-router': 'VueRouter',axios: 'axios',};
};

接着就是操作 plugin,这里选择链式操作,将需要填入的 cdn 连接的内容传给index.html模板:

let cdn = {js: [// 可以写成动态版本号'//cdn.bootcss.com/vue/2.6.10/vue.runtime.min.js','//cdn.bootcss.com/vue-router/3.1.3/vue-router.min.js','//cdn.bootcss.com/vuex/3.1.2/vuex.min.js','//cdn.bootcss.com/axios/0.19.0/axios.min.js',],
};
webpackConfig['chainWebpack'] = config => {config.plugin('html').tap(args => {args[0].cdn = cdn;return args;});
};

html-plugin 配置

上述的配置完成之后,需要在public/inedx.html中修改一下:

<div id="app"></div>
<% if(process.env.NODE_ENV==='production'){htmlWebpackPlugin.options.cdn.js.forEach(function(item){ if(item){ %>
<script type="text/javascript" src="<%= item %>"></script>
<% }})} %>
<!-- built files will be auto injected -->

这个的目的就是当是生产环境的时候,遍历生成 CDN 的元素。这是一个模板语法,可以看看html-webpack-plugin

参考文章

  1. webpack 使用 HtmlWebpackPlugin 进行 cdn 配置
  2. vue 打包优化
  3. 在 vue-cli 3.0 中根据不同环境动态注入 CDN
  4. webpack-cdn-plugin
  5. webpack4 配置的最佳实践

路由懒加载优化

这里主要是根据官方文档的实践:
结合 Vue 的异步组件和 Webpack 的代码分割功能,轻松实现路由组件的懒加载。

// src/router/index.js
// 路由懒加载 博客分块
const Blog = () => import(/* webpackChunkName: "group-blog" */ '../views/Blog/Blog.vue');
const ContentPage = () => import(/* webpackChunkName: "group-blog" */ '../views/Blog/ContentPage.vue');

loading 插件

为了美化加载的过程,自定义一个Loading插件,主要参考了这些文章

选择了一个蛮炫酷的动效

功能:

  • 单例模式
  • 可以在axios拦截器中使用

写在最后

希望大家可以多多关注我的abandon.work,一个nest.js+mongoDB+Vue.js的小站。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422641.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SharePoint 2010 网站模板要求在网站集中激活功能

从别人那里将其一个站点另存为模板&#xff0c;拷贝回来&#xff0c;上传到自己环境中的解决方案库里并激活。 然后新建站点&#xff0c;选择该模板&#xff0c;报如下错误&#xff1a; 解决方案&#xff1a; 打开在首要网站&#xff0c;网站操作---网站设置--网站集管理---网站…

springboot 添加允许跨域_SpringBoot添加支持CORS跨域访问

CORS(Cross-Origin Resource Sharing)"跨域资源共享"&#xff0c;是一个W3C标准&#xff0c;它允许浏览器向跨域服务器发送Ajax请求&#xff0c;打破了Ajax只能访问本站内的资源限制&#xff0c;CORS在很多地方都有被使用&#xff0c;微信支付的JS支付就是通过JS向微…

前端学习(359):svn服务器配置金和客户端安装

右键---新建仓库 下一步 写入仓库名称 下一步 下一步 点击finish 创建完成 选择user 单击右键 创建账号密码 创建完成 下载客户端 点击next 点击next 一直next安装 安装完成发现小乌龟&#xff08;需要重启电脑&#xff09;

neo4j与mysql数据库_Neo4j: 迁移MySQL的数据到Neo4j

目的: 用于社交关系的管理和维护. 社交关系是一种网状的关系图, RDBMS难于维护这样的数据.安装和配置需要满足下面几个条件安装 neo4j-apoc-procedures插件安装 APOC插件设置一下环境变量NEO4J_INSTALL_PATH/path/to/neo4j安装插件和JDBC驱动把mysql-connector-java-8.0.11.jar…

前端学习(360):svn操作前期连接工作

把地址发送给所有人 checkout 单击ok 得到账号密码

前端学习(361):svn操作后续

work下面新建文件夹 commit上传 上传 组员update 出现文件夹 新建文件夹 右键上传 点击小乌龟show-log 记录问题 版本操作 再次输入 bbb 先更新 更新之后再次上传 添加了bbb 单击右键 回滚

mysql 慢sql分析_如何分析Mysql慢SQL

内容摘要&#xff1a;开启慢查询日志捕获慢SQL使用explain分析慢SQL使用show profile查询SQL执行细节常见的SQL语句优化一、开启慢查询日志捕获慢SQL① 查询mysql是否开启慢日志捕获&#xff1a;SHOW VARIABLES LIKE %slow_query_log%;如果还没开启的话&#xff0c;开启&#x…

x264编码参数大测试:03 subme与crf(c)

一、测试内容 测试方法—— x264编码参数大测试&#xff1a;索引贴 http://www.cnblogs.com/zyl910/archive/2011/12/14/x264_encode_param.html 测试参数—— subme&#xff1a;9、10、11。设定子像素&#xff08;subpixel&#xff09;运动估计&#xff08;motion estimation&…

mysql 执行查询_MySQL查询的执行过程

我们总是希望MySQL能够获得更高的查询性能&#xff0c;最好的办法是弄清楚MySQL是如何优化和执行查询的。一旦理解了这一点&#xff0c;就会发现&#xff1a;很多的查询优化工作实际上就是遵循一些原则让MySQL的优化器能够按照预想的合理方式运行而已。当向MySQL发送一个请求的…

膨胀

转载于:https://www.cnblogs.com/carekee/articles/2296335.html

python安装依赖失败_python执行安装第三方依赖numpy失败:error: Unable to find vcvarsall.bat...

一台计算机上同时安装了python2.7和python3.7。现在为python2.7安装numpy包。失败&#xff1a;error: Unable to find vcvarsall.bat下载安装 Microsoft Visual C Compiler for Python 2.7user installations are disabled via policy on the machine.安装之后&#xff1a;C:\U…

zabbix mysql主从_zabbix监控mysql主从状态

1. zabbix客户端编辑脚本 /tmp/shell/mysql_slave_status.sh#! /bin/bash/usr/bin/mysql -p123456 -e ‘show slave status \G;‘|grep -E "Slave_IO_Running|Slave_SQL_Running"|awk ‘{print $2}‘|grep -c "Yes"2. 授执行权限chmod x mysql_slave_statu…

python输入日期时间转换格式_python如何格式化日期?

常用的时间函数如下&#xff1a;获取当前日期&#xff1a;time.time()获取元组形式的时间戳&#xff1a;time.local(time.time())格式化日期的函数(基于元组的形式进行格式化)&#xff1a;&#xff08;1&#xff09;time.asctime(time.local(time.time()))&#xff08;2&#x…

mysql 数据库表锁死_mysql 数据库表被锁住了_Mysql数据库表锁死如何处理?

处理方式有如下三种&#xff1a;1.查询不是sleep或者有状态的sqlselect * from information_schema.processlist where command !Sleep or state !2.查询运行中的事务select trx_state, trx_started, trx_mysql_thread_id, trx_query from information_schema.innodb_trx3.查看…

pycharm自带python环境_Pycharm安装+python安装+环境配置

Pycharm工具&#xff1a;1.安装jdk(64位)&#xff1a;jdk-8u65-windows-x64.exe路径&#xff1a;C:\Program Files\Java(默认路径)2.配置环境步骤一&#xff1a;系统变量→新建 JAVA_HOME变量 。变量值填写jdk的安装目录(本人是C:\Program Files\Java\jdk1.8.0_65)步骤二&#…

大学四年, 专业心得

林锐有一本书, 叫做 <<高质量 C/C 程序设计指南>>. 其中附录里有他的一篇十分震撼的文章叫做 <<大学十年>>. 讲述了林锐从大学以来学习的经历和所获得的感想. 我看过后, 内心深深的被触动了, 都是大学 4 年, 为何差距如此之大? 都是学计算机专业, 为何…

计算机视觉基础(11)——语义分割和实例分割

前言 在这节课&#xff0c;我们将学习语义分割和实例分割。在语义分割中&#xff0c;我们需要重点掌握语义分割的概念、常用数据集、评价指标&#xff08;IoU&#xff09;以及经典的语义分割方法&#xff08;Deeplab系列&#xff09;&#xff1b;在实例分割中&#xff0c;需要知…

使用vs2010+WCF发布json数据,ExtJS4.0进行调用

花了近一天的时间调试解决&#xff0c;希望对有相同需要的朋友有帮助&#xff1a;1、新建一空网站,添加一个web页面webform1.aspx&#xff0c;添加ExtJs相关引用<link href"ExtJs4.0.7/resources/css/ext-all.css"rel"stylesheet"type"text/css&qu…