{"id":19430216,"url":"https://github.com/etherdream/freecdn","last_synced_at":"2025-05-16T13:02:43.938Z","repository":{"id":37661058,"uuid":"309241825","full_name":"EtherDream/freecdn","owner":"EtherDream","description":"A front-end CDN based on ServiceWorker","archived":false,"fork":false,"pushed_at":"2022-06-07T12:14:34.000Z","size":31906,"stargazers_count":996,"open_issues_count":7,"forks_count":81,"subscribers_count":12,"default_branch":"master","last_synced_at":"2025-05-16T13:01:51.823Z","etag":null,"topics":["avif-image","cdn","ddos-mitigation","javascipt","network","proxy","service-worker","web","web-image"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/EtherDream.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-11-02T02:56:08.000Z","updated_at":"2025-05-05T07:50:27.000Z","dependencies_parsed_at":"2022-08-01T08:19:55.444Z","dependency_job_id":null,"html_url":"https://github.com/EtherDream/freecdn","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EtherDream%2Ffreecdn","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EtherDream%2Ffreecdn/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EtherDream%2Ffreecdn/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EtherDream%2Ffreecdn/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/EtherDream","download_url":"https://codeload.github.com/EtherDream/freecdn/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254535826,"owners_count":22087398,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["avif-image","cdn","ddos-mitigation","javascipt","network","proxy","service-worker","web","web-image"],"created_at":"2024-11-10T14:24:00.080Z","updated_at":"2025-05-16T13:02:43.839Z","avatar_url":"https://github.com/EtherDream.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# freecdn\n\n[![npm version](https://img.shields.io/npm/v/freecdn.svg?style=flat)](https://www.npmjs.com/package/freecdn)\n\nfreecdn 是一个纯前端的 CDN 解决方案，用于降低网站流量成本，同时提高网站稳定性、安全性，并且无需修改现有的业务逻辑。\n\n# 最近更新\n\n新增文件合并功能，可将大文件切割成多个小文件，运行时自动合并。从而能突破免费 CDN 单个文件体积限制。\n\n新增资源包功能，可将多个小文件合并成一个资源包，运行时从中提取。[查看更多](CHANGELOG.md)\n\n# 功能亮点\n\n## 自动选择公共库\n\n互联网上有很多免费的公共库 CDN，例如 `cdnjs`、`jsdelivr`、`unpkg`，但哪个最稳定，始终没有明确的答案。\n\n现在你无需纠结这个问题，随意选择即可。freecdn 可根据用户的网络状况，实时切换到合适的 CDN。[查看更多](docs/feature/README.md#自动选择公共库)\n\n## 全站 Hash 校验\n\n现代浏览器可通过 SRI 校验资源完整性，降低第三方站点的风险。但 SRI 也存在一些不足，例如支持的类型太少、需要修改 HTML、缺少备用机制。\n\nfreecdn 能校验任意类型的资源，例如图片是否被篡改，从而提升内容安全；无需修改 HTML，并且所有 Hash 统一维护，方便使用和更新；即使校验失败，自动切换到备用资源，避免损坏业务。[查看更多](docs/feature/README.md#全站-Hash-校验)\n\n## 充分利用图床\n\n网站图片很耗流量，不少人将图片上传到图床、相册等第三方站点，充当免费 CDN。但这也存在诸多难以预测的情况，例如图片被删、限制外链、添加水印、有损压缩、限速等等。\n\n现在你无需担心这些问题。你只需将图片备份到多个图床，freecdn 会依次尝试，直到获得预期内容。此外，不仅是图片，任意类型的文件都可通过图床加速！[查看更多](docs/feature/README.md#充分利用图床)\n\n## 网站离线运行\n\n任何网站都无法避免网络故障，例如机房故障、DNS 故障、运营商丢包、DDOS 攻击，导致网站无法稳定访问。\n\nfreecdn 支持网站离线运行。用户只有首次访问依赖你的服务器，之后即使服务器关机，前端程序也能从备用站点加载最新的页面和资源，成为一个不依赖中心的网站。[查看更多](docs/feature/README.md#网站离线运行)\n\n## WebP 无缝兼容\n\n相比 JPG/PNG/GIF 等格式，WebP 有着更高的压缩率，但并非所有浏览器都支持，因此需处理兼容性。传统的无缝兼容需要后端支持，服务器根据 Accept 请求头决定是否返回 WebP 格式，从而实现同个 URL 返回不同格式的效果。\n\nfreecdn 可在前端实现这个功能，无需后端支持。[查看更多](docs/feature/README.md#WebP-无缝兼容)\n\n## 资源快速更新\n\nHTTP 的缓存时间，一直是个头疼的问题。时间太短，性能不够好；时间太长，更新不及时。因此很多网站都有自己的资源更新方案。\n\nfreecdn 使用独特的更新机制，只需更新一个清单文件，就能更新所有资源。[查看更多](docs/feature/README.md#资源快速更新)\n\n\n# 功能演示\n\n* [使用免费 CDN 加速公共资源](examples/pub-cdn/)\n\n* [自动切换故障 CDN](examples/cdn-fallback/)\n\n* [更新快速生效](examples/quick-update/)\n\n* [使用免费 CDN 加速任意资源](examples/free-host/)\n\n* [使用免费 CDN 加速清单文件](examples/ext-manifest/)\n\n* [网站离线运行](examples/offline-site/)\n\n* [WebP 自动适配](examples/webp-upgrade/)\n\n* [📦 多个小文件合并成资源包](examples/bundle/)\n\n* [将大文件切分成多个小文件](examples/file-split/)\n\n* [POST 请求代理](examples/post-proxy/)\n\n# 常用文档\n\n* [命令行工具](docs/cli)\n\n* [透明接入模式](docs/transparent-mode)\n\n* [清单文件格式](docs/manifest)\n\n* [解码参数列表](docs/manifest/params.md)\n\n\n# 兼容问题\n\nfreecdn 前端脚本依赖 Service Worker API，并使用了 ES2020 语法和特性。不过即使浏览器不支持也没问题，页面仍从原始 URL 加载资源。\n\n如果你的网站本身也有 Service Worker，请参考 [共享接入模式](docs/shared-mode/)。\n\n由于 Service Worker 只能在安全环境中开启，因此你的站点必须是 HTTPS。本地测试（127.0.0.1/localhost）时可以使用 HTTP。\n\n\n# 相关组件\n\n## 前端脚本\n\nfreecdn-js：https://github.com/EtherDream/freecdn-js\n\n页面引用的脚本体积极小，压缩后只有几百字节，最大程度减少你的网站流量。\n\n## 公共库\n\nfreecdn-publib：https://github.com/EtherDream/freecdn-publib\n\n公共库收集了十几个 CDN 站点 1000 多万条 URL 记录。\n\n## 更新服务\n\nfreecdn-update-svc：https://github.com/EtherDream/freecdn-update-svc\n\n使用更新推送服务，长缓存资源也能快速更新。\n\n\n# 项目进展\n\n目前基本功能已实现，处于公开测试阶段。如果你对该项目感兴趣，可以在个人博客、特效演示等站点试验，期待反馈存在的问题，并提供更好的建议。\n\n本项目将长期维护。\n\n\n# 新功能...\n\n目前开发中的功能：\n\n* 更智能的站点选择算法（目前规则还很简单，需进一步完善）\n\n* 纯前端日志（通过 Service Worker 采集用户访问日志，发送到开发者提供的接口。适用于 GitHub Pages 等无法查看详细日志的站点）\n\n* 子集搜索（如果待搜索文件是公共资源的一部分，工具生成裁剪范围；如果公共资源是待搜索文件的绝大部分，补充缺失的前缀或后缀数据）\n\n* HTTP over WebRTC（将内网中的设备作为网站节点，分担流量和计算量）\n\n\n# License\n\nMIT","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fetherdream%2Ffreecdn","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fetherdream%2Ffreecdn","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fetherdream%2Ffreecdn/lists"}