前端性能优化《一》:vue-cli3中使用external进行cdn配置

2023-11-02



一、背景

作为前端开发人员,在开发的时候,生产环境中会把js,css,图片等压缩,尽量减少文件的大小,从而提升响应速度,尤其是移动端。
在我们使用vue-cli3打包项目的时候,我们的js/css文件都是会根据依赖关系自动打包压缩的,但是项目比较大的时候,引入的外部库很多,往往打出来的包vender.js会很大,导致首屏加载很慢。

二、作用

这时候用webpack提供的externals属性,像vue.js 、vuex.js 、vue-router.js 等这些外部库,基本不会变的,如果将它们独立出来单独加载就能利于浏览器的缓存机制,不用每次都重新加载这些库js,并且大大的减少了打包的vendor.js文件。

三、基本用法

这时候用webpack提供的externals属性,像vue.js 、vuex.js 、vue-router.js 等这些外部库,基本不会变的,如果将它们独立出来单独加载就能利于浏览器的缓存机制,不用每次都重新加载这些库js,并且大大的减少了打包的vendor.js文件。
下面我们以vue-cli3项目为例进行说明:

第一步:vue.config.js中配置externals

首先我们看看我们的main.js文件示例:

import 'Vue' from 'vue'
import 'VueRouter' from 'vue-router'
import * as BABYLON from 'babylonjs'

然后我们新建vue.config.js文件

module.exports = {
	// ...
	externals: {
		// 我们挂载在全局的变量名称:引入的模块名称
		'vue': 'Vue',
		'vue-router': 'VueRouter',
		'babylonjs': 'BABYLON',
	}

这样配置之后,我们在main.js中引入的相关模块就不会打包至js文件中,而是会去找html中找我们使用script引入的文件,所以接下来,我们要在html中引入文件。

第二步:html中引入静态资源

<script src="https://cdn.jsdelivr.net/npm/vue@2.6.11"></script>
<script src="https://unpkg.com/vue-router@3.1.6/dist/vue-router.js"></script>
<script src="https://cdn.babylonjs.com/babylon.js"></script>

注意:引入cdn的时候最好使用官方的,不然挂了就…

配置完成

我们来查看一下效果:
优化前:优化前
优化后:优化后
由此可见,第三方包被我们抽离出来之后,chunk和vendor体积大大减小了。


四、区分生产环境和开发环境

之所以区分两个环境主要原因是,当我们在开发环境的时候,使用cdn引入js文件会比我们直接模块引入要慢,不是很方便。所以我们想要配置,只在生产环境下才使用externals。
那么,配置的思路就是对当前环境进行判定,如果是生产环境,我们就使用externals;如果是开发环境,就不使用。

第一步:vue.config.js中配置externals

vue.config.js代码修改为:

module.exports = {
    // ...
    configureWebpack: config => {
        const plugins = [];
        // 利用环境变量进行判断是否是生产环境production
        if (process.env.NODE_ENV === 'production') { 
            config.externals = {
                'vue': 'Vue',
                'vue-router': 'VueRouter',
                'babylonjs': 'BABYLON'
            }
        }
        // 然后将新增externals选项合并至plugins配置中
        config.plugins = [
            ...config.plugins,
            ...plugins
        ]
    },
    chainWebpack: config => {
        if (process.env.NODE_ENV === 'production') {
            // 生产环境下注入一个变量cdn 变量可以在html中通过htmlWebpackPlugin.options进行获取 
            config.plugin('html')
                .tap(args => {
                    args[0].cdn = 'prod';
                    return args;
                })
        }
    }
}

第二步:html中引入静态资源

既然要在区分两个环境,自然在html中也要进行区分,这个时候就要用到我们在vue.config.js中注入的cdn变量来进行判断了。
html修改为:

 <!-- ...-->
 <% if(htmlWebpackPlugin.options.cdn == 'prod'){ %>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.6.11"></script>
  <script src="https://unpkg.com/vue-router@3.1.6/dist/vue-router.js"></script>
  <script src="https://cdn.babylonjs.com/babylon.js"></script>
  <% } %>

完成配置

运行项目,当在开发的时候没有引用cdn, 生产环境下使用了cdn,这就算是完成配置啦~
你以为这就结束了吗?哈哈哈没有,我们还可以继续优化配置一下。

五、进一步优化

vue.config.js配置

// vue.config.js
const isProduction = process.env.NODE_ENV === 'production';
const cdn = {
    css: [],
    js: [
        'https://cdn.jsdelivr.net/npm/vue@2.6.11',
        'https://unpkg.com/vue-router@3.1.6/dist/vue-router.js',
        'https://cdn.babylonjs.com/babylon.js'
    ]
}

module.exports = {
    configureWebpack: config => {
        if (isProduction) {
            // 用cdn方式引入,分离第三方插件
            config.externals = {
               'vue': 'Vue',
               'vue-router': 'VueRouter',
               'babylonjs': 'BABYLON'
            }
        } 
    },
	chainWebpack: config => {
		if (isProduction) {
            config.plugin('html')
                .tap(args => {
                    args[0].cdn = cdn;
                    return args;
                })
        }
    }
}

html配置

<!DOCTYPE html>
<html lang="zh">

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <link rel="icon" href="<%= BASE_URL %>static/favicon.ico" type="image/x-icon" />
  <link rel="shortcut icon" href="<%= BASE_URL %>static/favicon.ico" type="image/x-icon" />
  <title>my-project</title>
  <!-- 使用CDN的CSS文件 -->
  <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.css) { %>
    <link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="preload" as="style">
    <link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="stylesheet">
  <% } %>
  <!-- 使用CDN的JS文件 -->
  <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %>
    <link href="<%= htmlWebpackPlugin.options.cdn.js[i] %>" rel="preload" as="script">
  <% } %>
</head>

<body>
  <noscript>
    <strong>We're sorry but eye-admin doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
  </noscript>
  <div id="app"></div>
  <!-- built files will be auto injected -->
  <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %>
    <script src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script>
  <% } %>
</body>

</html>

不过使用externals属性要注意的是,虽然可以优化首屏加载速度,但是由于静态资源分离,也会增加http请求数量。所以如果是小项目,最好就不要用externals属性,因为小项目打包的出来的vender.js体积不大,建议项目体量较大的项目再用比较合适。


参考文章

真是要加油学习呢~
[1]: vue-cli3项目打包优化配置要点
[2]: vue-cli@3.0使用及配置说明
[3]: webpack使用HtmlWebpackPlugin进行cdn配置

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前端性能优化《一》:vue-cli3中使用external进行cdn配置 的相关文章

随机推荐

  • mybatis Example条件查询

    Criterion是最基本 最底层的Where条件 用于字段级的筛选 Criteria Criteria包含一个Cretiron的集合 每一个Criteria对象内包含的Cretiron之间是由AND连接的 是逻辑与的关系 oredCrit
  • 2023 第十四届蓝桥杯模拟赛(第三期)题解

    文章目录 最小的十六进制 Excel的列 相等日期 取数 最大连通分块 哪一天 信号覆盖 清理水草 最长滑行 区间最小值 单调队列O n 优先队列O NlgN 线段树O NlgN 个人Java题解 据我所知题目一样的 可以参考一下 欢迎评论
  • 集成开放平台接口中心基于IdentityServer4的鉴权机制

    源宝导读 企业数字化生态建设中为解决集成多样性和资源统一管理的痛点引入企业级网关 网关作为资源访问的大门 身份认证鉴权是其业务的重中之重 本文将介绍企业级网关 天际集成开放平台是如何通过IdentityServer4来做到身份认证和鉴权业务
  • QT 5.6.1使用虚拟键盘,适用于arm-linux

    获取源码 https github com hanshuaipeng QtInputMethod GooglePinyin git 编译后得到的文件 包含全志A64 IMX6ULL和UBUNTU可用的 so文件 https download
  • 清华大学的计算机课程表,清华大学计算机专业课程表

    清华大学计算机专业课程表 应用泛函分析4学分 流形上的微积分4 秋 数论与编码 代数编码理论3 春 初等数论与多项式2 秋 应用统计3学分 必修不少于12学分 允许在院系教务部门认可下选修理学院的同类型课程 以下课程中必修4 门课 不少于1
  • AS 3.4.1 gradle问题

    编译后报错信息大概如下 Gradle s dependency cache may be corrupt this sometimes occurs after a network connection timeout Re downloa
  • 2023年国家护网0day-poc/exp漏洞全汇总(目前已更新到91个..实时更新中...)

    文章目录 前言 0x01 Sxf 报表系统 版本有限制 0x02 E Cology 某版本 SQL注入漏洞 0x03 某恒明御运维审计与风险控制系统xmlrpc sock任意用户添加漏洞 0x04 泛微 E Cology 某版本 SQL注入
  • Qt 多种方式读写二进制文件

    将文本数据写入二进制文件 然后从二进制文件中读出 还原为文本数据 include mainwindow h include
  • 服务器数码管不显示,单片机数码管亮但是没有数字咋回事?

    题目要求是 利用ADC0809设计一个简易数字电压表 要求可以测量0 5V之间8路输入电压值 电压值由4位LED数码管显示 并在数码管上轮流显示或单路选择显示 2 测量最小分辨率为0 019V 测量误差约为 0 02V include un
  • 【05】Nginx之Rewrite功能配置

    Rewrite是Nginx服务器提供的一个重要基本功能 是Web服务器产品中几乎必备的功能 主要的作用是用来实现URL的重写 注意 Nginx服务器的Rewrite功能的实现依赖于PCRE的支持 因此在编译安装Nginx服务器之前 需要安装
  • 【Python】 numpy数组操作

    数据类型转换 frame gt ndarray 函数 table name np array frame name import numpy as np data array np array data print type data ar
  • API测试方案

    接口测试方案 目录 一 简介 一 定义 二 为什么做接口测试 1 越底层发现bug 修复成本越低 越早发现bug 修复成本越低 2 前后端按约定的接口开发 接口测好了 前端随便改 后端不用变 3 如今的系统复杂度不断上升 传统的测试方法成本
  • Ubuntu 指定文件默认打开方式(以QT Creator为例)

    Ubuntu 14 04 32位系统 想用QT Creator做Ubuntu下的代码编辑器 以前安装的QT4 8 6自带QT Creator 2 4 1版本太老 现在的QT Creator在Linux下已经都是64位版本了 官方最后的Lin
  • Python装饰器学习

    第一步 最简单的函数 准备附加额外功能 1 2 3 4 5 6 7 8 coding gbk 示例1 最简单的函数 表示调用了两次 def myfunc print myfunc called myfunc myfunc 第二步 使用装饰函
  • 运行项目报错Unable to build: the file dx.jar was not loaded from the SDK folder!

    在Eclipse中运行项目时 报题目中的错误 出现该问题的原因是高版本 如26 0 0 的build tools中的dx jar不可用 可能是兼容问题 因此问题的解决方法有两种 使用低版本 如25 0 2 build tools中的dx j
  • Vivado的FIR IP核实现低通滤波器

    本文介绍如何使用Vivado的FIR IP核实现低通滤波器 我们将设计一个采样频率为10MHz 通带0 1MHz 阻带高于2MHz的FIR低通滤波器 测试时 滤波器的输入信号为1MHz和3MHz的正弦波的叠加信号 期望滤波器能输出失真较小的
  • 高德地图显示影藏交通图层

    效果如图 核心代码 this traffic new AMap TileLayer Traffic autoRefresh true 是否自动刷新 默认为false interval 180 刷新间隔 默认180s zIndex 10 zo
  • 数字IC手撕代码-泰凌微笔试真题

    前言 本专栏旨在记录高频笔面试手撕代码题 以备数字前端秋招 本专栏所有文章提供原理分析 代码及波形 所有代码均经过本人验证 目录如下 1 数字IC手撕代码 分频器 任意偶数分频 2 数字IC手撕代码 分频器 任意奇数分频 3 数字IC手撕代
  • bes2300开发调试笔记

    记录学习过程以及遇到的问题 持续看心情更新 bes2300之环境搭建 一 bes2300之按键配置 二 bes2300之led配置 三 bes2300之prompt配置 四 bes2300之RTX介绍及简单运用 五 bes2300之电源管理
  • 前端性能优化《一》:vue-cli3中使用external进行cdn配置

    目录 一 背景 二 作用 三 基本用法 第一步 vue config js中配置externals 第二步 html中引入静态资源 配置完成 四 区分生产环境和开发环境 第一步 vue config js中配置externals 第二步 h