- 首发:2023-04-30 23:50:01
- 教程
- 2445
在Web开发中,我们通常使用CDN(内容分发网络)来加速网站的静态资源(如CSS和JavaScript文件)加载。然而,CDN有时可能会失效,导致网站加载速度变慢或者无法正常运行。本文将详细介绍一种优化方案,当HTML中引入的style或JavaScript静态资源CDN失效时,自动切换为加载本地js/css。我们还将介绍一个名为 "CDN to Local Fallback for HTML Files" 的VSCode插件,帮助您更轻松地实现这个方案。
前端静态资源CDN加载失败的优化方案
要实现这个优化方案,我们需要在HTML文件中添加一个特殊的<script>
标签,当CDN资源加载失败时,该脚本将自动切换到使用本地资源。具体实现方法如下:
loadFallbackResource函数实现及原理
首先,我们需要实现loadFallbackResource
函数,该函数接受两个参数:一个是发生错误的元素(<link>
或<script>
标签),另一个是本地资源的相对路径。函数的实现代码如下:
function loadFallbackResource(element, fallbackUrl) {
if (!element || !fallbackUrl) {
return;
}
const url = new URL(fallbackUrl, window.location.href);
if (element.tagName === 'LINK') {
var link = document.createElement('link');
link.rel = 'stylesheet';
link.href = url.href;
document.head.appendChild(link);
} else if (element.tagName === 'SCRIPT') {
var script = document.createElement('script');
script.src = url.href;
document.body.appendChild(script);
}
}
函数首先检查传入的参数是否有效。然后根据element
的标签名(LINK
或SCRIPT
),创建一个新的<link>
或<script>
元素,并将其href
或src
属性设置为本地资源的完整URL。最后,将新创建的元素添加到<head>
或<body>
中。
方案实现步骤
- 遍历HTML文件中所有引用外部CSS和JavaScript资源的
<link>
和<script>
标签。 - 下载这些标签所指向的CDN资源,并将其保存到本地目录。
- 在每个
<link>
和<script>
标签中添加一个onerror
属性,该属性指向一个名为loadFallbackResource
的函数。 - 在HTML文件中添加一个
<script>
标签,该标签包含loadFallbackResource
函数的实现,以及一个在页面加载完成后遍历所有带有onerror
属性的元素并调用loadFallbackResource
的事件监听器。
CDN to Local Fallback for HTML Files插件开发过程
为了简化实现上述方案的过程,我们开发了一个名为 "CDN to Local Fallback for HTML Files" 的VSCode插件。插件的开发过程包括以下几个步骤:
- 使用
axios
和cheerio
库分析和操作HTML文件。 - 下载CDN资源并保存到本地目录。
- 修改HTML文件中的
<link>
和<script>
标签,添加onerror
属性和data-fallback-url
属性。 - 将
loadFallbackResource
函数及事件监听器添加到HTML文件中。
下面是插件的核心代码以及详细说明:
代码解析
首先,我们导入所需的模块:
import * as vscode from 'vscode';
import axios from 'axios';
import * as cheerio from 'cheerio';
import * as fs from 'fs';
import * as path from 'path';
import * as url from 'url';
然后,我们实现一个download
函数,用于下载CDN资源:
async function download (url: string, dest: string): Promise<void> {
const response = await axios.get(url, { responseType: 'arraybuffer' });
fs.writeFileSync(dest, new Buffer(response.data), 'binary');
}
接下来,我们定义插件的主要功能,并注册为一个VSCode命令:
export function activate (context: vscode.ExtensionContext) {
let disposable = vscode.commands.registerCommand(
'cdntolocal.downloadAndAddFallback',
async () => {
// ...
}
);
context.subscriptions.push(disposable);
}
插件的核心逻辑包括以下部分:
- 检查当前活动编辑器和文档类型,确保它们是有效的HTML文件。
- 加载HTML文件并使用
cheerio
库解析为DOM结构。 - 遍历所有引用外部CSS和JavaScript资源的
<link>
和<script>
标签,下载CDN资源并保存到本地目录。同时,修改标签的属性,添加onerror
和data-fallback-url
属性。 - 将修改后的HTML文件写回到磁盘。
- 在HTML文件的
<head>
标签内插入loadFallbackResource
函数及事件监听器。
插件代码
完整的插件代码已经开源在GitHub仓库(https://github.com/yi-ge/cdntolocal),欢迎尝试并提出宝贵意见。
总结
本文介绍了一种前端静态资源CDN加载失败的优化方案,当HTML中引入的style或JavaScript静态资源CDN失效时,可以自动切换为加载本地js/css。我们还介绍了一个名为 "CDN to Local Fallback for HTML Files" 的VSCode插件,帮助您更轻松地实现这个方案。
需要注意的是,虽然这个方案可以解决静态资源CDN失效的问题,但在实际应用中,您可能还需要手动重新初始化业务代码以确保应用正常运行。这个方案并不能解决所有CDN加载失败带来的问题,但它至少可以在某种程度上保证网站在CDN失效的情况下仍然可以正常显示和运行。
通过使用这个方案和插件,您可以更好地为您的用户提供稳定的服务,减少因CDN问题导致的访问失败和用户流失。我们鼓励您尝试这个方案和插件,并根据您的具体需求进行调整和优化。我们期待您的反馈和改进意见,以便我们不断改进这个方案和插件,为更多开发者提供帮助。
注意: 本文及相关代码完全由GPT4完成,人工修改及验证。
暂无内容
老师你好,我希望能用一个openwrt路由器实现IPv4和IPv6的桥接,请问我该如何实现?我尝试了直接新增dhcpv6的接口,但是效果不甚理想(无法成功获取公网的ipv6,但是直连上级路由的其他设备是可以获取公网的ipv6地)
![%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE20241205230845.png](https://cdn.wyr.me/visitor-files/2024-12-05/1733411344287屏幕截图 2024-12-05 230845.png)你好
,为什么我这里是0039 813C 0600 0075 16xx xx xx,只有前6组是相同的,博客中要前8位相同,这个不同能不能照着修改呢?我系统版本是Win1124H2
大神你好,win11专业版24h2最新版26100.2033,文件如何修改?谢谢
win11专业版24h2最新版26100.2033,Windows Feature Experience Pack 1000.26100.23.0。C:\Windows\System32\termsrv.dll系统自带的这个文件,39 81 3C 06 00 00 0F 85 XX XX XX XX 替换为 B8 00 01 00 00 89 81 38 06 00 00 90。仍然无法远程连接。原来是win11 21h2系统,是可以远程链接的。共享1个主机,2个显示器,2套键鼠,各自独立操作 各自不同的账号,不同的桌面环境。
博主,win11专业版24h2最新版,C:\Windows\System32\termsrv.dll系统自带的这个文件,找不到应该修改哪个字段。我的微信:一三五73二五九五00,谢谢