近期发现正在使用的 CDN 每次加载都异常缓慢,不仅 JS 资源都未被缓存,协议还是 http 1.1,严重影响体验。打算更换 CDN 服务时,发现正在使用的服务提供商被列为被攻击名单中,资源可能会出现投毒等情况。没想到使用了大厂的 CDN 服务也会出现这种问题(说明还不够大~~~)

国外

虽然推荐的都是大厂稳定的服务,但是仍建议做好资源完整性的验证,在资源引入时填写 SRI 哈希。

访问较慢,稳定优先

测速来源:https://www.itdog.cn/tcping/Tcping,均使用 443 端口。测速时间:2024/09/27

组织 域名 协议 平均速度(https 注意事项
cloudflare.com cdnjs.cloudflare.com h2 国内: 528 ms
国外:4 ms
1. 同步 cdnjs,进入复制即可
2. 默认缓存时间 1
3. 资源并非完全同步 npm,对资源有要求。
若资源未被收录可在该项目提 PR cdnjs/packages
⭐️ jsdelivr cdn.jsdelivr.net h2 国内: 274 ms
国外:15 ms
同步 npm js,默认缓存一年,支持 esm
语法:https://cdn.jsdelivr.net/npm/package@version/file
示例:https://cdn.jsdelivr.net/npm/jquery@3.6.4/dist/jquery.min.js
Michael Jackson unpkg.com h2 国内:346 ms
国外:3 ms
同步 npm js,默认缓存一年(建议通过语法来获取包内容)
语法:https://unpkg.com/:package@:version/:file
示例:https://unpkg.com/react@latest/umd/react.production.min.js
通过 /any/file?meta 可获取元数据,例如文件 integritysize 等信息,示例:react@18.0.3
通过 ?module 获取 ES 版本

国内 - 大厂

虽有大厂背书,生产仍需谨慎使用,做好完整性的验证。

组织 域名 协议 平均速度(https 注意事项
又拍云 s4.zstatic.net h2 国内: 22 ms
国外:27 ms
同步 cdnjs(又拍云赞助,相当于国内 cdn js,访问站点搜索资源)
使用又拍云提供的 SRI Hash 生成器
知乎 unpkg.zhihu.com
unpkg.zhimg.com
h3 国内: 6 ms
国外:21 ms
理论同步 unpkg.com,可能会有资源同步问题(维护未知),腾讯云 CDN 服务
使用同 unpkg 替换域名即可:https://unpkg.zhimg.com/react@latest/umd/react.production.min.js

不稳定,且有风险的 CDN,资源无缓存,不建议使用,仍在使用的建议更换

相关文章:

Polyfill supply chain attack hits 100K+ sites
https://web.archive.org/web/20240229113710/https://github.com/polyfillpolyfill/polyfill-service/issues/2834
https://www.v2ex.com/t/1053497

  • bootcdn
  • staticfile CDN

三方自建

稳定性未知,不建议生产项目中使用,注意验证资源的完整性

组织 域名 协议 平均速度(https 注意事项
7ED Services use.sevencdn.com h2 国内: 5 ms
国外:281 ms
同步 cdnjs,将域名替换 use.sevencdn.com 即可
示例:https://use.sevencdn.com/ajax/libs/twitter-bootstrap/4.3.1/js/bootstrap.min.js
webcache cdnjs.webstatic.cn h2 国内: 22 ms
国外:186 ms
支持 cdnjsunpkg.com,使用 阿里云 CDN
cdn jshttps://cdnjs.webstatic.cn/ajax/libs/:package/:version/:file
unpkghttps://npm.webcache.cn/:package@:version/:file
渺软CDN https://jsd.onmicrosoft.cn (jsDelivr)
https://npm.onmicrosoft.cn (UNPKG)
https://cdnjs.onmicrosoft.cn (cdnjs)
h1.1 国内: 43 ms
国外:130 ms
根据不同的域名选择不同的服务,使用 cloudflare CDN

子资源完整性 - SRI

Subresource Integrity

通过在资源引用标签(如 <script><link>)中添加 integrity 属性,来确保加载的外部资源(如脚本或样式表)在传输过程中未被篡改

可在 SRI Hash Generator 中生成相应的 Hash

script 中使用

对于跨源资源共享(CORS)的资源需要配置 crossoriginanonymoususe-credentials空值,推荐 anonymous。 同源资源可无需配置

<script
  crossorigin="anonymous"
  src="https://s4.zstatic.net/ajax/libs/react/18.3.1/umd/react.development.js"
  integrity="sha512-YFI6ChaPQ5hH9o8Q4n5ZzDHrhrwZ3dhgZSQ2JC/pgmYuD0QtG0iwQgfFa1J+o4jvklsKBupcHz5Tx1yqa25FFQ=="
></script>