白嫖jsdelivr挂了如何处理?
今天上午11:30左右接到北京技术大哥提醒,jsdelivr资源全挂了,赶紧跑生产地址看了看,还好当初准备白嫖jsdelivr时就做过应急处理策略,所以这次对咱们影响为0,除了页面控制台有点报错,其余一切正常。
下面两种备用,任选其一:
- cdn可以相互备份使用(bootcdn与jsdelivr一起)
- 可以自己保留一份静态资源传到自己的服务器上(还是自己的服务器稳,慢就慢点吧)
其实很简单,就是利用onerror事件,下面简单描述。
1. 普通的多页面项目(非工程化)
一般就是常规引入script链接地址,
<body>
<script>
function errorCDN(e) {
const target = e.getAttribute("data-name");
console.warn(target + "白嫖cdn失败,走自己的静态资源");
const scriptDOM = document.createElement("script");
scriptDOM.src = "./" + target; // 注意data-name需要和本地备份的脚本文件名一致,静态资源,我用了相对路径,自行拼接
document.head.appendChild(scriptDOM);
e.remove();
}
</script>
<script onerror="errorCDN(this)" data-name="eruda.min.js" type="text/javascript" src="https://cdn.jsdelivr.net/npm/eruda@2.4.1/eruda.min.js"></script>
</body>
2. webpack/vue-cli项目
这一类大多都是用htmlWebpackPlugin这个插件,只需要预定义cdn地址与名称,然后模板渲染时写好与静态资源的对应就行。当然你要愿意,使用非工程化手写onerror对应也行。
//vue.config.js url是cdn地址,name是资源名,资源在对应public静态模板已经放好了备用的
[ { name: "pdf.min.js", url: "https://cdn.jsdelivr.net/npm/pdfjs-dist@2.0.943/build/pdf.min.js", },]
//public/index.html
<script>
function errorCDN(e) {
const target = e.getAttribute("data-name");
console.warn(target + "白嫖cdn失败,走自己的静态资源");
const scriptDOM = document.createElement("script");
scriptDOM.src = "./" + target; // 注意data-name需要和本地备份的脚本文件名一致
document.head.appendChild(scriptDOM);
e.remove();
}
</script>
<!-- 挂掉的cdn统一走这 -->
<!-- CDN的 js -->
<% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %>
<script
onerror="errorCDN(this)"
data-name="<%= htmlWebpackPlugin.options.cdn.js[i].name %>"
src="<%= htmlWebpackPlugin.options.cdn.js[i].url %>"
></script>
<% } %>
3. vite项目
现在用vite的应该还不多,大致与webpack同样原理。使用的模板插件为vite-plugin-html.
...省略,自行写吧
生产实测图
希望今天出事的兄弟不要在官方issues里面抱怨了。毕竟免费的我觉得已经非常良心了,附上bootcdn留言(因为bootcdn当时用的jsdelivr链接也挂了,真是好兄弟-。-。)
公司有钱还是自己买cdn吧
转载自:https://juejin.cn/post/7043714179542286349