在 vue-cli 构建的项目中配置使用资源CDN,加速我们的项目

本文介绍了如何在 Vue CLI 构建的项目中,通过配置将第三方库排除在打包之外,改由 CDN 加载,以提高应用加载速度。详细讲解了如何配置 externals 字段以排除指定模块,以及如何设置 CDN 链接并在模板中插入资源脚本,以实现资源的外部加载。最后,通过打包分析展示了配置前后的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面

出于对网站性能的要求,有时候我们不希望一些比较大的第三方库直接打包到最后的 bundle 中,而会选择在打包的时候忽略他们,并直接使用 CDN 上面的资源。

生产环境中将项目依赖的一些第三方包替换成通过 cdn 方式外部加载,而不是打包到 vender,对于提升应用的加载、响应速度很有意义。

vue-cli3 及以后的项目中,相关配置都需要在 vue.config.js 这个文件中进行,如果你没有这个文件请自己新建一个(与 package.json 同级)。

实现目标

以目前常见的前端项目为例,建议把常用的资源进行 cdn 引用及配置;如:vuevuexvue-routeraxioselementUI ...

目标过程

一、配置需要拎出来的模块

这里我们首先配置 configureWebpackexternals 字段,把不需要打包的资源进行相应的配置。如下所示:

module.exports = {...configureWebpack: {externals: {'vue': 'Vue','element-ui': 'ELEMENT','vue-router': 'VueRouter','vuex': 'Vuex'}},...
} 

这里我们排除了 vueelement-uivue-routervuex

关于这个配置怎么写的问题:

以打包时忽略 element-ui 为例,'element-ui' 指的是你 import 语句中 import ElementUI from 'element-ui' 中的 'element-ui''ELEMENT'element-ui 这个库暴露出来的全局对象。这个对象你可以从 cdn 资源的源码中找到或者根据需要引用的文件去 node_modules 文件夹下去寻找。下面我们从 node_modules 文件夹下的源码找一下 element-uivue-routervuex 暴露出的全局对象,以下是各源码的截图:

以后需要排除其他的三方库或者插件的时候,大家可以自己去找暴露出来的全局对象了。

二、配置 cdn 链接

配置完 externals 之后我们还需要利用 htmlWebpackPlugin 的能力让我们在打包的时候可以获取我们需要的 cdn 资源数据。首先我们在 vue.config.js 定义一个存放 cdn 资源连接的对象 cdn,如下所示:

const cdn = {css: ['//unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css'],js: ['//unpkg.com/vue@2.6.11/dist/vue.min.js','//unpkg.com/vue-router@2.8.1/dist/vue-router.min.js','//unpkg.com/vuex@3.1.2/dist/vuex.min.js','//unpkg.com/element-ui@2.13.0/lib/index.js']
} 

其次我们把 cdn 这个对象放入我们配置中的 page 字段里,完整配置如下:

 const cdn = {css: ['//unpkg.com/element-ui@2.13.0/lib/theme-chalk/index.css'],js: ['//unpkg.com/vue@2.6.11/dist/vue.min.js','//unpkg.com/vue-router@2.8.1/dist/vue-router.min.js','//unpkg.com/vuex@3.1.2/dist/vuex.min.js','//unpkg.com/element-ui@2.13.0/lib/index.js']
}
 
module.exports = {publicPath: '/',productionSourceMap: process.env.NODE_ENV !== 'production',devServer: {port: 8077},chainWebpack: config => {config.resolve.symlinks(true)},configureWebpack: {externals: {'vue': 'Vue','element-ui': 'ELEMENT','vue-router': 'VueRouter','vuex': 'Vuex'}},pages: {index: {entry: 'src/main.ts',template: 'public/index.html',filename: 'index.html',title: 'sass-admin',chunks: ['chunk-vendors', 'chunk-common', 'index'],cdn: cdn}}
} 

做完这些之后,我们还需要在入口文件的 html 模板处加上生成 cssjs 脚本的代码,比如这里的 html 模板位置就是 'public/index.html'

这里比较简单就直接放送完整的 html 模板代码了,如下:

<!DOCTYPE html>
<html lang="en"><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 %>favicon.ico"><title><%= htmlWebpackPlugin.options.title %></title><% for (let i in htmlWebpackPlugin.options.cdn.css) { %><link rel="stylesheet" href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" /><% } %></head><body><noscript><strong>We're sorry but <%= htmlWebpackPlugin.options.title %> 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 (let i in htmlWebpackPlugin.options.cdn.js) { %><scripttype="text/javascript"src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script><% } %></body>
</html> 

其中:

  • <%= VALUE %> 用来做不转义插值
  • <% expression %> 用来描述 JavaScript 流程控制

这些用到了 lodash template 的语法 ,感兴趣的朋友可以去了解更多内容,这里不做展开。

做完这一切之后我们用打包分析工具分析一下配置完 CDN 前后 bundle 内容的变化。

配置 cdn 之前的分析图:

配置 cdn 之后的分析图:

通过对比,发现我们的 chunk-vendors 已经少了我们配置在 CDN 中的第三方资源,另一个直观的比较就是打包后 chunk-vendors 的资源大小,这里不再展开。另一个重要的变化就是我们打包之后的 html 上也加上了相应的资源脚本,如图所示:

把资源放在 CDN 上一方面可以减轻自己服务器的带宽消耗(资源从别的服务器下载,而不是你自己的服务器),另一方面 CDN 上的资源一般是你不会轻易修改的,而且浏览器访问之后还会缓存下来,用户再次访问就无需二次下载资源,网站后续的整体访问速度就更快了,同时 CDN 还可以做加速。


最后

为大家准备了一个前端资料包。包含54本,2.57G的前端相关电子书,《前端面试宝典(附答案和解析)》,难点、重点知识视频教程(全套)。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值