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;网站操作---网站设置--网站集管理---网站…

C语言进阶深度学习目录表

学习交流加&#xff08;可免费帮忙下载CSDN资源&#xff09;&#xff1a;个人微信(进微信群加)&#xff1a; LyyCoder学习交流资源分享qq群1&#xff08;已满&#xff09;&#xff1a; 962535112学习交流资源分享qq群2&#xff08;已满&#xff09;&#xff1a; 780902027学习交…

一个c++ 2d图形引擎 AGG

相关站点http://www.antigrain.com/agg_docs/doc_tutorial.html 用法&#xff0c;学习中。。。 A. 这是个不错的中文介绍http://www.cnblogs.com/Kane_zzt/archive/2009/02/15/1271793.html 转载于:https://www.cnblogs.com/vilyLei/archive/2011/12/12/2284821.html

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…

ASP.NET中TextBox控件的AutoCompleteType属性(不保存历史输入记录)

ASP.NET AutoCompleteType 属性 返回 ASP.NET TextBox 控件参考手册 定义和用法 AutoCompleteType 属性用于设置或返回 TextBox 控件的 AutoComplete 种类。 为了协助用户的数据输入&#xff0c;Microsoft Internet Explorer 5 及更高版本和 Netscape 都支持名为自动完成的功能…

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

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

MySQL赋权navicat_mysql 的root 用户无法授权及解决navicat 远程授权提示1044问题

先看解决方案#------------mysql root 用户无法赋权问题解决 --------1&#xff0c;登录 mysql -u root -p2&#xff0c;use mysql; 选择mysql数据库3&#xff0c;执行以下操作(查询用户的赋权权限&#xff0c;更改赋权权限 &#xff0c;刷新生效)mysql> select user,host,g…

Linux文件系统中的链接

inode在讨论Linux系统的链接之前&#xff0c;不得不先说下inode。Linux文件系统中的每一个对象都有唯一的inode索引&#xff0c;每一个inode号和文件系统的一个对象一一对应&#xff0c;要查看文件或目录的inode号可在ls命令中使用-i选项&#xff0c;每个目录下的.&#xff08;…

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

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

mysql 组复制 不一致_使用MySQL组复制的限制和局限性

本节列出和解释了组复制相关的要求和限制。1.组复制的要求要使用组复制&#xff0c;每个MySQL节点必须满足以下条件&#xff1a;1.1 基本要求InnoDB存储引擎&#xff1a;数据必须存储在事务型的InnoDB存储引擎中。事务以乐观形式执行&#xff0c;然后在提交前会检测冲突问题。如…

摘记

◇马云说&#xff1a;今天很残酷&#xff0c;明天更残酷&#xff0c;后天很美好&#xff0c;但是大多数人死在明天晚上&#xff0c;看不到后天的太阳&#xff01;&#xff01;&#xff01; ◇晚上想想千条路,早上醒来走原路&#xff01;&#xff01;&#xff01; ◇人要成功一定…

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 host %s_python mysql:虽然%s和列匹配,但并非SQL语句中使用的所有参数

PythonMySQL.connector一直给我错误不是SQL语句中使用的所有参数。这是我的代码&#xff1a;import mysql.connectorcon mysql.connector.Connect(userroot, passwordpassword, databaseDB, hostlocalhost)cur con.cursor()#data inserteradd_data "INSERT INTO DB.ver…

如何处理Global symbol * requires explicit package name编译错误,以及use strict用法

编写下面的简单示例来说明如何处理如下类型的错误提示&#xff1a; Global symbol "$c" requires explicit package name at *.pl line 8. Execution of *.pl aborted due to compilation errors. #############Code Starts############### #!/usr/bin/perl -w use s…

mysql error 1201_ERROR 1201 (HY000): Could not initialize master info structure; .....

配置mysql主从复制&#xff0c;start slave是报错&#xff1a;ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MySQL error log原因&#xff1a;之前做过主从复制解决办法&#xff1a;mysql> stop slave;Query …

如何将函数的实际参数转换成数组

转自&#xff1a;http://www.planabc.net/2010/01/06/arguments_to_array/ 实际参数在函数中我们可以使用 arguments 对象获得 &#xff08;注&#xff1a;形参可通过 arguments.callee 获得&#xff09;&#xff0c;虽然 arguments 对象与数组形似&#xff0c;但仍不是真正意义…