<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>ZeroXin Blog</title>
  
  <subtitle>分享技术，记录生活</subtitle>
  <link href="https://www.zeroxin.xin/atom.xml" rel="self"/>
  
  <link href="https://www.zeroxin.xin/"/>
  <updated>2026-07-31T10:24:34.910Z</updated>
  <id>https://www.zeroxin.xin/</id>
  
  <author>
    <name>ZeroXin</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>AI Disk Cleaner - AI 驱动的智能磁盘清理助手</title>
    <link href="https://www.zeroxin.xin/2026/07/31/ai-disk-cleaner-introduction/"/>
    <id>https://www.zeroxin.xin/2026/07/31/ai-disk-cleaner-introduction/</id>
    <published>2026-07-30T16:00:00.000Z</published>
    <updated>2026-07-31T10:24:34.910Z</updated>
    
    <content type="html"><![CDATA[<h1>AI Disk Cleaner - AI 驱动的智能磁盘清理助手</h1><p>在日常使用电脑的过程中，磁盘空间不足是一个常见的问题。传统的磁盘清理工具往往只能删除已知类型的临时文件或缓存，无法智能地识别哪些文件是真正可以安全删除的。<strong>AI Disk Cleaner</strong> 正是为了解决这个问题而诞生的 — 一款利用大语言模型（LLM）进行智能磁盘分析的开源工具。</p><h2 id="项目简介">项目简介</h2><p><a href="https://github.com/vudsen/ai-disk-cleaner">AI Disk Cleaner</a> 是一款 AI 驱动的智能磁盘清理助手，通过 LLM 对磁盘文件树进行智能分析，自动识别可删除的垃圾文件，并以清晰的方式呈现分析结果。项目使用 Go 语言开发，基于 Wails 框架构建跨平台桌面应用。</p><h2 id="核心功能">核心功能</h2><h3 id="🤖-LLM-智能分析">🤖 LLM 智能分析</h3><p>利用大语言模型对磁盘占用情况进行分析，自动识别可以安全删除的垃圾文件，并汇总结果展示给用户。LLM 会遍历文件树，找出占用空间最大的文件，并判断其是否为可清理的垃圾。</p><p><img src="/medias/featureimages/ai-disk-cleaner-overview.png" alt="LLM 智能分析"></p><h3 id="📦-迁移管理">📦 迁移管理</h3><p>提供软链接的统一管理功能，支持一键将文件迁移到其他磁盘分区。这对于需要定期整理多磁盘存储的用户来说非常实用。</p><p><img src="/medias/featureimages/ai-disk-cleaner-migrations.png" alt="迁移管理"></p><h2 id="工作原理">工作原理</h2><p>AI Disk Cleaner 的整个架构分为三步：</p><ol><li><strong>扫描文件树</strong>：使用 <a href="https://github.com/dundee/gdu">gdu</a> 扫描指定位置，并将文件树加载到内存中。</li><li><strong>LLM 分析</strong>：暴露文件树读取工具，让 LLM 分析文件树，找出占用空间最大的文件。在找到垃圾文件后，LLM 会调用 <code>add_trash_file</code> 工具来标记文件。</li><li><strong>结果展示</strong>：系统汇总 LLM 分析结果，以表格和可视化方式展示给用户。</li></ol><p><img src="/medias/featureimages/ai-disk-cleaner-trash-table.png" alt="文件扫描与垃圾标记"></p><p><img src="/medias/featureimages/ai-disk-cleaner-llm.png" alt="LLM 输出结果"></p><h2 id="快速开始">快速开始</h2><ol><li>从 <a href="https://github.com/vudsen/ai-disk-cleaner/releases">Releases</a> 页面下载最新版本的 <code>.exe</code>（目前仅支持 Windows）。</li><li>将下载的 <code>.exe</code> 放在一个单独的文件夹中（应用启动后会在 exe 当前目录生成数据文件）。</li><li>打开应用（推荐以管理员权限打开，否则某些删除或迁移操作可能会报错）。</li><li>进入设置页面，配置大模型参数。</li><li>回到首页，开始扫描。</li></ol><h2 id="技术栈">技术栈</h2><table><thead><tr><th>组件</th><th>技术</th></tr></thead><tbody><tr><td>后端语言</td><td>Go</td></tr><tr><td>桌面框架</td><td>Wails</td></tr><tr><td>磁盘扫描</td><td>gdu</td></tr><tr><td>AI 分析</td><td>LLM API</td></tr><tr><td>许可证</td><td>MIT</td></tr></tbody></table><h2 id="为什么选择-AI-Disk-Cleaner？">为什么选择 AI Disk Cleaner？</h2><p>传统的磁盘清理工具依赖于预定义规则和文件扩展名匹配，容易误删重要文件或遗漏真正无用的文件。AI Disk Cleaner 的核心优势在于：</p><ul><li><strong>智能判断</strong>：LLM 能够理解文件的上下文和用途，做出更准确的删除建议</li><li><strong>自然语言交互</strong>：用户可以通过自然语言与 LLM 交流，了解每个文件的详细信息</li><li><strong>迁移便捷</strong>：软链接管理和一键迁移功能，让多磁盘管理变得简单高效</li></ul><h2 id="项目链接">项目链接</h2><ul><li><strong>GitHub 仓库</strong>：<a href="https://github.com/vudsen/ai-disk-cleaner">vudsen/ai-disk-cleaner</a></li><li><strong>许可证</strong>：MIT</li><li><strong>当前版本</strong>：持续更新中</li></ul><p>如果你正在寻找一款智能、高效的磁盘清理工具，AI Disk Cleaner 值得一试。</p>]]></content>
    
    
    <summary type="html">AI Disk Cleaner 是一款 AI 驱动的智能磁盘清理助手，利用大语言模型分析磁盘占用情况，自动识别可删除的垃圾文件，并提供迁移管理功能，帮助用户高效释放磁盘空间。</summary>
    
    
    
    <category term="开源项目" scheme="https://www.zeroxin.xin/categories/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE/"/>
    
    
    <category term="AI" scheme="https://www.zeroxin.xin/tags/AI/"/>
    
    <category term="开源项目" scheme="https://www.zeroxin.xin/tags/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE/"/>
    
    <category term="磁盘清理" scheme="https://www.zeroxin.xin/tags/%E7%A3%81%E7%9B%98%E6%B8%85%E7%90%86/"/>
    
    <category term="Windows" scheme="https://www.zeroxin.xin/tags/Windows/"/>
    
    <category term="LLM" scheme="https://www.zeroxin.xin/tags/LLM/"/>
    
  </entry>
  
  <entry>
    <title>LaTeXSnipper：一款开源免费的公式识别与数学编辑工作空间</title>
    <link href="https://www.zeroxin.xin/2026/07/26/LaTeXSnipper%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D/"/>
    <id>https://www.zeroxin.xin/2026/07/26/LaTeXSnipper%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D/</id>
    <published>2026-07-26T03:35:00.000Z</published>
    <updated>2026-07-26T04:03:11.346Z</updated>
    
    <content type="html"><![CDATA[<h2 id="项目概述">项目概述</h2><p><strong>LaTeXSnipper</strong> 是由开发者 <a href="https://github.com/SakuraMathcraft">SakuraMathcraft</a> 创建的一个跨平台桌面数学工作空间。它不再只是一个"截图公式转 LaTeX"工具，而是覆盖端到端数学内容工作流：</p><ul><li>📸 从截图或 PDF 中识别数学公式</li><li>✍️ 在专用手写画布中书写并自动转换为 LaTeX</li><li>🧮 在集成数学工作台中编辑、计算和回写</li><li>🔄 支持 30+ 种导出格式（LaTeX、Markdown、MathML、HTML、Word、Typst 等）</li></ul><h3 id="项目亮点">项目亮点</h3><table><thead><tr><th>特性</th><th>说明</th></tr></thead><tbody><tr><td><strong>公式识别</strong></td><td>基于 MathCraft OCR，支持公式、文字及混合内容识别</td></tr><tr><td><strong>手写识别</strong></td><td>专用手写窗口，支持自动识别与实时预览</td></tr><tr><td><strong>数学工作台</strong></td><td>独立工作空间，集成公式编辑与计算</td></tr><tr><td><strong>公式编辑</strong></td><td>内置 MathLive <code>math-field</code> 及虚拟数学键盘</td></tr><tr><td><strong>多格式导出</strong></td><td>30 种导出选项，覆盖 LaTeX/Markdown/MathML/HTML/OMML/SVG/Typst/Word/EPUB/RTF 等</td></tr><tr><td><strong>符号计算</strong></td><td>基于 Compute Engine，支持化简、求值、展开、因式分解、求解</td></tr><tr><td><strong>离线优先</strong></td><td>识别与高级求解可本地运行，保护隐私</td></tr><tr><td><strong>主题支持</strong></td><td>亮色/暗色自动适配</td></tr></tbody></table><hr><h2 id="安装教程">安装教程</h2><h3 id="Windows（推荐）">Windows（推荐）</h3><h4 id="方式一：Inno-安装包（推荐新手）">方式一：Inno 安装包（推荐新手）</h4><ol><li>前往 <a href="https://github.com/SakuraMathcraft/LaTeXSnipper/releases/latest">GitHub Releases</a> 页面。</li><li>下载 <code>LaTeXSnipperSetup-2.4.0.exe</code>。</li><li>运行安装程序，按提示完成安装。</li><li>桌面上生成快捷方式，双端启动。</li></ol><h4 id="方式二：Microsoft-Store-MSIX">方式二：Microsoft Store / MSIX</h4><ul><li>在 Microsoft Store 中搜索 <strong>LaTeXSnipper</strong> 进行安装。</li><li>或从 Release 页面下载 MSIX 包手动安装。</li></ul><h3 id="Linux">Linux</h3><h4 id="一键安装命令">一键安装命令</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/SakuraMathcraft/LaTeXSnipper.git</span><br><span class="line"><span class="built_in">cd</span> LaTeXSnipper</span><br><span class="line"></span><br><span class="line">python3 -m venv .venv</span><br><span class="line"><span class="built_in">source</span> .venv/bin/activate</span><br><span class="line"></span><br><span class="line">pip install -r requirements-linux.txt</span><br><span class="line">python src/main.py</span><br></pre></td></tr></tbody></table></figure><h4 id="打包为-Debian-Ubuntu-安装包">打包为 Debian/Ubuntu 安装包</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 构建 .deb 包</span></span><br><span class="line">bash scripts/build_deb.sh</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装</span></span><br><span class="line"><span class="built_in">sudo</span> dpkg -i latexsnipper_*.deb</span><br></pre></td></tr></tbody></table></figure><blockquote><p>💡 Linux 平台依赖 <code>grim</code>、<code>maim</code>、<code>gnome-screenshot</code> 等截图工具来提升截图回退行为，这些工具需通过发行版包管理器自行安装，LaTeXSnipper 的依赖向导仅管理 Python 依赖层。</p></blockquote><h3 id="macOS">macOS</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/SakuraMathcraft/LaTeXSnipper.git</span><br><span class="line"><span class="built_in">cd</span> LaTeXSnipper</span><br><span class="line"></span><br><span class="line">python3 -m venv .venv</span><br><span class="line"><span class="built_in">source</span> .venv/bin/activate</span><br><span class="line"></span><br><span class="line">pip install -r requirements-macos.txt</span><br><span class="line">python src/main.py</span><br></pre></td></tr></tbody></table></figure><p>macOS 打包产物为 <code>.app.zip</code> 和 <code>.dmg</code>，可从 Releases 页面下载。</p><h3 id="更新-LaTeXSnipper">更新 LaTeXSnipper</h3><ul><li><strong>Windows</strong>：下载新版安装包重新运行即可。</li><li><strong>GitHub Actions</strong>：Tag 发布时会自动构建各平台包，关注 Releases 页面获取最新版本。</li></ul><hr><h2 id="快速开始">快速开始</h2><h3 id="截图识别">截图识别</h3><ol><li>启动 LaTeXSnipper。</li><li>点击截图按钮或使用快捷键捕获屏幕上的数学公式。</li><li>MathCraft OCR 自动识别公式并生成 LaTeX 代码。</li><li>在右侧工作台中编辑、调整公式。</li><li>点击"复制"或"插入"将 LaTeX 放回原文档。</li></ol><h3 id="手写识别">手写识别</h3><ol><li>打开手写窗口。</li><li>使用鼠标或触控笔书写数学表达式。</li><li>系统实时识别并预览 LaTeX 结果。</li><li>确认后发送到主编辑器。</li></ol><h3 id="数学计算">数学计算</h3><p>在工作台中可直接对公式进行符号运算：</p><ul><li><strong>化简</strong>（Simplify）</li><li><strong>数值求值</strong>（Evaluate）</li><li><strong>展开</strong>（Expand）</li><li><strong>因式分解</strong>（Factor）</li><li><strong>求解方程</strong>（Solve）</li></ul><p>对于更复杂的表达式，系统会自动回退到本地 SymPy/mpmath 引擎。</p><hr><h2 id="核心功能详解">核心功能详解</h2><h3 id="多格式导出">多格式导出</h3><p>LaTeXSnipper 支持 30 种导出格式：</p><table><thead><tr><th>类别</th><th>格式</th></tr></thead><tbody><tr><td>文档标记</td><td>LaTeX, Markdown, HTML, reStructuredText, Typst, Org-mode</td></tr><tr><td>数学格式</td><td>MathML, OMML, LaTeX, AsciiMath</td></tr><tr><td>矢量图形</td><td>SVG</td></tr><tr><td>办公文档</td><td>Word (DOCX), RTF, ODT</td></tr><tr><td>电子书</td><td>EPUB</td></tr><tr><td>维基</td><td>Wiki 格式</td></tr><tr><td>数据</td><td>JSON, CSV</td></tr></tbody></table><h3 id="离线优先">离线优先</h3><ul><li>公式识别与高级求解均在本地运行，无需网络连接</li><li>MathCraft OCR 模型通过 ONNX Runtime 推理，不依赖 PyTorch 运行时</li><li>所有数据保留在本地，保护学术与隐私敏感内容</li></ul><hr><h2 id="项目结构">项目结构</h2><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">LaTeXSnipper/</span><br><span class="line">├── mathcraft_ocr/          # MathCraft OCR 独立运行时与 CLI</span><br><span class="line">├── src/</span><br><span class="line">│   ├── main.py             # 主桌面应用入口</span><br><span class="line">│   ├── distribution.py      # GitHub / Microsoft Store 渠道策略</span><br><span class="line">│   ├── backend/            # OCR 封装、CUDA 诊断、截图、平台服务</span><br><span class="line">│   ├── bootstrap/          # 依赖向导与运行时验证</span><br><span class="line">│   ├── core/               # 文档组合、导出契约、重启契约</span><br><span class="line">│   ├── editor/             # 数学工作台与公式编辑 UI</span><br><span class="line">│   ├── handwriting/        # 手写画布、PDF 预览、文档工具</span><br><span class="line">│   └── ...</span><br><span class="line">├── requirements-linux.txt</span><br><span class="line">├── requirements-macos.txt</span><br><span class="line">├── LaTeXSnipper.spec       # PyInstaller 打包配置</span><br><span class="line">├── Inno/                   # Windows Inno 安装脚本</span><br><span class="line">├── packaging/debian/       # Debian 打包配置</span><br><span class="line">└── scripts/</span><br><span class="line">    ├── build_deb.sh        # Linux .deb 构建脚本</span><br><span class="line">    ├── build_macos.sh      # macOS 打包脚本</span><br><span class="line">    └── build_store_msix.ps1 # MSIX 打包脚本</span><br></pre></td></tr></tbody></table></figure><hr><h2 id="技术栈">技术栈</h2><ul><li><strong>语言</strong>: Python 3.10+</li><li><strong>UI 框架</strong>: PyQt6 + Q Fluent Widgets</li><li><strong>OCR</strong>: MathCraft OCR（ONNX Runtime 推理）</li><li><strong>公式编辑</strong>: MathLive <code>math-field</code></li><li><strong>符号计算</strong>: MathLive Compute Engine / SymPy / mpmath</li><li><strong>构建</strong>: PyInstaller + Inno Setup (Windows) / PyInstaller + DMG (.macOS) / Debian (.Linux)</li><li><strong>许可证</strong>: MIT License</li></ul><hr><h2 id="适用场景">适用场景</h2><ul><li>📝 <strong>学术写作</strong>：快速将论文中的手写公式或截图公式转为 LaTeX</li><li>📚 <strong>教学课件</strong>：从 PDF 或幻灯片中提取数学公式并复用</li><li>💻 <strong>Office 集成</strong>：通过 Word/PowerPoint 插件在文档中直接插入识别公式</li><li>🔬 <strong>科研工作</strong>：将文献中的公式离线转换为可编辑的 LaTeX 代码</li><li>✍️ <strong>手写输入</strong>：使用笔输入数学表达式，实时预览 LaTeX</li></ul><hr><h2 id="项目统计">项目统计</h2><ul><li><strong>GitHub Stars</strong>: ⭐ 760</li><li><strong>Forks</strong>: 40</li><li><strong>提交数</strong>: 332</li><li><strong>最新版本</strong>: v2.4.0 LTS（2026年7月）</li><li><strong>许可证</strong>: MIT License</li><li><strong>项目地址</strong>: <a href="https://github.com/SakuraMathcraft/LaTeXSnipper">https://github.com/SakuraMathcraft/LaTeXSnipper</a></li></ul><hr><h2 id="总结">总结</h2><p>LaTeXSnipper 是一个功能完整、离线优先的数学公式识别与编辑工作空间。它覆盖了从截图识别、手写输入到公式计算和多格式导出的完整工作流，特别适合需要频繁处理数学公式的学术工作者和科研人员。Windows 用户可以通过 Inno 安装包一键安装，Linux 和 macOS 用户也可以通过源码快速运行。作为一个开源免费无广告的项目，其持续维护和社区活跃度值得肯定。</p><p><strong>项目地址</strong>: <a href="https://github.com/SakuraMathcraft/LaTeXSnipper">https://github.com/SakuraMathcraft/LaTeXSnipper</a></p>]]></content>
    
    
    <summary type="html">LaTeXSnipper 是一款集截图 OCR、手写识别、公式编辑、符号计算与多格式导出于一体的桌面数学工具。本文提供详细的安装教程与使用指南。</summary>
    
    
    
    <category term="开源项目" scheme="https://www.zeroxin.xin/categories/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE/"/>
    
    
    <category term="开源项目" scheme="https://www.zeroxin.xin/tags/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE/"/>
    
    <category term="Python" scheme="https://www.zeroxin.xin/tags/Python/"/>
    
    <category term="LaTeX" scheme="https://www.zeroxin.xin/tags/LaTeX/"/>
    
    <category term="OCR" scheme="https://www.zeroxin.xin/tags/OCR/"/>
    
    <category term="数学工具" scheme="https://www.zeroxin.xin/tags/%E6%95%B0%E5%AD%A6%E5%B7%A5%E5%85%B7/"/>
    
    <category term="PyQt6" scheme="https://www.zeroxin.xin/tags/PyQt6/"/>
    
  </entry>
  
  <entry>
    <title>dnspick：一句话选出最适合你的 DNS 服务器</title>
    <link href="https://www.zeroxin.xin/2026/07/26/dnspick%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D/"/>
    <id>https://www.zeroxin.xin/2026/07/26/dnspick%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D/</id>
    <published>2026-07-26T03:30:00.000Z</published>
    <updated>2026-07-26T03:27:50.448Z</updated>
    
    <content type="html"><![CDATA[<h2 id="项目概述">项目概述</h2><p><strong>dnspick</strong> 是由开发者 <a href="https://github.com/palemoky/dnspick">palemoky</a> 创建的一个跨平台命令行 DNS 性能测试工具。它并发基准测试一批主流及自定义 DNS 服务器，涵盖 <strong>UDP</strong>、<strong>DNS-over-TLS (DoT)</strong>、<strong>DNS-over-HTTPS (DoH)</strong> 和 <strong>DNS-over-HTTP/3 (DoH3)</strong> 四种协议，对一组常用的国内/国外域名反复查询，结合<strong>平均延迟</strong>与<strong>成功率</strong>给出综合评分，同时自动检测当前系统默认 DNS 并纳入对比，最后推荐最优选择。</p><h3 id="项目亮点">项目亮点</h3><ul><li>🌐 <strong>跨平台</strong>：完美运行于 Windows、macOS、Linux、Raspberry Pi (ARM/ARM64) 等主流平台</li><li>🔒 <strong>多协议</strong>：同时测试 UDP、DoT、DoH（RFC 8484）、DoH3（基于 QUIC）</li><li>📊 <strong>综合评分</strong>：不仅测速，还结合成功率智能打分，避免"虽快但不稳定"的 DNS 跻身前列</li><li>🔍 <strong>自动检测当前 DNS</strong>：自动探测系统默认 DNS 并参与对比，给出是否需要切换的建议</li><li>🔄 <strong>自更新</strong>：运行时自动检查新版本，交互式终端中可原地升级</li><li>🌏 <strong>中英双语界面</strong>：默认跟随系统 <code>LANG</code>，支持手动切换</li></ul><hr><h2 id="安装教程">安装教程</h2><h3 id="一键安装（推荐）">一键安装（推荐）</h3><p>脚本会自动检测操作系统与 CPU 架构，下载对应版本并安装到 <code>PATH</code>。</p><h4 id="Linux-macOS">Linux / macOS</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -fsSL https://raw.githubusercontent.com/palemoky/dnspick/main/install.sh | sh</span><br></pre></td></tr></tbody></table></figure><h4 id="Windows（PowerShell）">Windows（PowerShell）</h4><figure class="highlight powershell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">irm</span> https://raw.githubusercontent.com/palemoky/dnspick/main/install.ps1 | <span class="built_in">iex</span></span><br></pre></td></tr></tbody></table></figure><blockquote><p>💡 macOS 用户无需手动处理 Gatekeeper 拦截，脚本会自动解除隔离标记。</p></blockquote><h3 id="手动安装">手动安装</h3><p>你也可以从 <a href="https://github.com/palemoky/dnspick/releases">GitHub Releases</a> 页面下载预编译版本。</p><ol><li>前往最新 Release 页面。</li><li>根据你的操作系统和 CPU 架构下载对应压缩包（如 <code>dnspick-windows-amd64.zip</code>、<code>dnspick-linux-arm64.tar.gz</code>）。</li><li>解压后即可在终端中使用。</li></ol><p>建议将可执行文件移动到系统 <code>PATH</code> 包含的目录中：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Linux / macOS</span></span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">mv</span> dnspick /usr/local/bin/</span><br><span class="line"></span><br><span class="line"><span class="comment"># Windows（PowerShell，以管理员权限运行）</span></span><br><span class="line">Move-Item dnspick.exe C:\Windows\System32\</span><br></pre></td></tr></tbody></table></figure><h3 id="更新-dnspick">更新 dnspick</h3><p>随时原地升级到最新版本：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">dnspick update</span><br></pre></td></tr></tbody></table></figure><p>dnspick 运行时会在后台检查新版本。在交互式终端中发现新版本会自动原地更新；输出被管道接管或在 CI 中则只打印提示（不会自我修改）。该检查不阻塞主流程，离线时静默跳过。</p><h3 id="macOS-提示「已损坏-移动到垃圾桶」">macOS 提示「已损坏 / 移动到垃圾桶」</h3><p>由于 dnspick 未经过 Apple 付费公证，macOS Gatekeeper 会拦截从网络下载的程序，出现「无法验证开发者」「已损坏，应移到废纸篓」等提示。<strong>文件并非真正损坏</strong>，任选以下方式解除即可：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 推荐：解除下载隔离标记（一行搞定）</span></span><br><span class="line">xattr -dr com.apple.quarantine ./dnspick</span><br></pre></td></tr></tbody></table></figure><ul><li><strong>图形界面方式</strong>：在访达中右键点击 → 选择「打开」→ 弹窗中再次确认「打开」</li><li><strong>较新 macOS</strong>：双击运行一次（会被拦截），然后到 <strong>系统设置 → 隐私与安全性</strong>，点击底部「仍要打开」</li></ul><hr><h2 id="快速开始">快速开始</h2><p>直接运行即可开始测试：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">dnspick</span><br></pre></td></tr></tbody></table></figure><p>输出示例：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line">dnspick: benchmarking 33 DNS servers against 20 domains...</span><br><span class="line"></span><br><span class="line">Progress: 45% (594/1320)</span><br><span class="line">┌──────────────┬────────┬────────────────┬────────┐</span><br><span class="line">│   Domestic   │ Status │    Foreign     │ Status │</span><br><span class="line">├──────────────┼────────┼────────────────┼────────┤</span><br><span class="line">│ baidu.com    │ ✔      │ google.com     │ ✔      │</span><br><span class="line">│ qq.com       │ ✔      │ youtube.com    │ 60%    │</span><br><span class="line">│ taobao.com   │ 60%    │ github.com     │ -      │</span><br><span class="line">└──────────────┴────────┴────────────────┴────────┘</span><br><span class="line"></span><br><span class="line">--- Benchmark Results ---</span><br><span class="line">┌────┬───────────────────────┬─────────────────┬─────────────┬────────────────┬────────┐</span><br><span class="line">│ #  │      DNS Server       │     Address     │ Avg Latency │  Success Rate  │ Score  │</span><br><span class="line">├────┼───────────────────────┼─────────────────┼─────────────┼────────────────┼────────┤</span><br><span class="line">│ 1  │ Freenom 2 (UDP)       │ 80.80.81.81     │ 6.16ms      │ 100.0% (40/40) │ 162.33 │</span><br><span class="line">│ 2  │ Cloudflare 2 (UDP)    │ 1.0.0.1         │ 6.227ms     │ 100.0% (40/40) │ 160.58 │</span><br><span class="line">│ 3  │ DNSPod 1 (UDP)        │ 119.28.28.28   │ 6.337ms     │ 100.0% (40/40) │ 157.80 │</span><br><span class="line">└────┴───────────────────────┴─────────────────┴─────────────┴────────────────┴────────┘</span><br><span class="line"></span><br><span class="line">--- Top 3 Recommendations ---</span><br><span class="line">#1: Freenom 2 (UDP) (80.80.81.81)</span><br><span class="line">    Score: 162.33, avg latency: 6.16ms, success rate: 100.0%</span><br><span class="line">#2: Cloudflare 2 (UDP) (1.0.0.1)</span><br><span class="line">    Score: 160.58, avg latency: 6.227ms, success rate: 100.0%</span><br><span class="line">#3: DNSPod 1 (UDP) (119.28.28.28)</span><br><span class="line">    Score: 157.80, avg latency: 6.337ms, success rate: 100.0%</span><br></pre></td></tr></tbody></table></figure><hr><h2 id="高级用法">高级用法</h2><h3 id="自定义测试参数">自定义测试参数</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 查看所有可用参数</span></span><br><span class="line">dnspick --<span class="built_in">help</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 每个域名查询 5 次，使用自定义域名列表</span></span><br><span class="line">dnspick -q 5 -d <span class="string">"google.com,github.com,youtube.com"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 单次查询超时 1 秒，并发数降到 8</span></span><br><span class="line">dnspick -t 1s -c 8</span><br><span class="line"></span><br><span class="line"><span class="comment"># 强制使用英文界面</span></span><br><span class="line">dnspick --lang en</span><br><span class="line"></span><br><span class="line"><span class="comment"># 输出机器可读 JSON（适合脚本和 CI）</span></span><br><span class="line">dnspick --json | jq <span class="string">'.recommendation.top'</span></span><br></pre></td></tr></tbody></table></figure><table><thead><tr><th>参数</th><th>简写</th><th>默认值</th><th>描述</th></tr></thead><tbody><tr><td><code>--domains</code></td><td><code>-d</code></td><td>内置列表</td><td>自定义测试域名（逗号分隔，自动去重）</td></tr><tr><td><code>--servers</code></td><td><code>-s</code></td><td>内置列表</td><td>自定义 DNS 服务器（协议按 scheme 自动推断：<code>1.1.1.1</code> → UDP，<code>tls://host</code> → DoT，<code>https://host/dns-query</code> → DoH，<code>h3://host/dns-query</code> → DoH3）</td></tr><tr><td><code>--queries</code></td><td><code>-q</code></td><td><code>3</code></td><td>每个域名的查询次数</td></tr><tr><td><code>--timeout</code></td><td><code>-t</code></td><td><code>2s</code></td><td>单次查询超时</td></tr><tr><td><code>--concurrency</code></td><td><code>-c</code></td><td><code>16</code></td><td>同时测试的服务器数量上限</td></tr><tr><td><code>--no-system-dns</code></td><td></td><td><code>false</code></td><td>不检测系统默认 DNS</td></tr><tr><td><code>--lang</code></td><td></td><td><code>$LANG</code></td><td>界面语言：<code>en</code> 或 <code>zh</code></td></tr><tr><td><code>--json</code></td><td></td><td><code>false</code></td><td>输出 JSON 到 stdout（不显示进度界面）</td></tr></tbody></table><h3 id="JSON-输出（用于自动化）">JSON 输出（用于自动化）</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">dnspick --json | jq <span class="string">'.recommendation.top'</span></span><br></pre></td></tr></tbody></table></figure><p>JSON 输出的关键字段：</p><table><thead><tr><th>字段</th><th>描述</th></tr></thead><tbody><tr><td><code>results[]</code></td><td>所有被测服务器，按综合评分降序排列</td></tr><tr><td><code>results[].avg_latency_ms</code></td><td>平均延迟（毫秒，微秒精度）</td></tr><tr><td><code>results[].success_rate</code></td><td>成功率，范围 <code>0.0</code>–<code>1.0</code></td></tr><tr><td><code>recommendation.top[]</code></td><td>成功率超过 98% 的 Top 3 推荐</td></tr><tr><td><code>recommendation.system_dns.verdict</code></td><td><code>best</code>（已最优）/ <code>good_enough</code>（无需更换）/ <code>switch</code>（建议切换）/ <code>all_failed</code>（全部失败）</td></tr></tbody></table><h3 id="综合评分计算方式">综合评分计算方式</h3><p>综合评分 = <code>(1 / 平均延迟秒数) × 成功率²</code></p><ul><li><strong>延迟项 <code>1 / 平均延迟</code></strong>：延迟越低，分数越高，呈反比放大</li><li><strong>可靠性权重 <code>成功率²</code></strong>：成功率做平方惩罚，对丢包/超时非常敏感。100% 成功率乘以 1.0，90% 只剩 0.81，50% 直接砍到 0.25</li></ul><p>这样可以避免"延迟很低但偶尔解析失败"的 DNS 排到前面。</p><hr><h2 id="技术细节">技术细节</h2><ul><li><strong>语言</strong>: Go 1.21+</li><li><strong>许可证</strong>: MIT License</li><li><strong>构建</strong>: GitHub Actions 跨平台自动构建，支持 Windows、macOS、Linux（含 ARM/ARM64）</li><li><strong>当前版本</strong>: 持续更新中，266+ GitHub 星标</li><li><strong>仓库</strong>: <a href="https://github.com/palemoky/dnspick">palemoky/dnspick</a></li></ul><hr><h2 id="适用场景">适用场景</h2><ul><li>🏠 <strong>家庭用户</strong>：检测 ISP 提供的 DNS 是否足够快，探索更快的公共 DNS</li><li>🏢 <strong>网络管理员</strong>：批量评估不同 DNS 解析器的性能，为企业网络选型</li><li>📊 <strong>开发者</strong>：在 CI/CD 中集成 DNS 性能监控，确保解析质量</li><li>🌍 <strong>跨境访问优化</strong>：对比国内外 DNS 对不同域名的解析延迟，找到最优搭配</li></ul><hr><h2 id="总结">总结</h2><p>dnspick 是一个轻量但功能完整的 DNS 性能测试工具，支持四种主流 DNS 协议（UDP、DoT、DoH、DoH3），提供智能综合评分和自动当前 DNS 检测。其一键安装脚本大大降低了使用门槛，macOS 用户也不必担心 Gatekeeper 拦截（脚本自动处理）。如果你正在寻找一款能帮你选出最优 DNS 的工具，dnspick 值得一试。</p><p><strong>项目地址</strong>: <a href="https://github.com/palemoky/dnspick">https://github.com/palemoky/dnspick</a></p>]]></content>
    
    
    <summary type="html">dnspick 是一个跨平台 DNS 性能基准测试工具，支持 UDP、DoT、DoH、DoH3 四种协议，自动检测当前系统 DNS 并给出推荐。本文提供详细的安装教程与使用指南。</summary>
    
    
    
    <category term="开源项目" scheme="https://www.zeroxin.xin/categories/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE/"/>
    
    
    <category term="开源项目" scheme="https://www.zeroxin.xin/tags/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE/"/>
    
    <category term="DNS" scheme="https://www.zeroxin.xin/tags/DNS/"/>
    
    <category term="网络工具" scheme="https://www.zeroxin.xin/tags/%E7%BD%91%E7%BB%9C%E5%B7%A5%E5%85%B7/"/>
    
    <category term="Go" scheme="https://www.zeroxin.xin/tags/Go/"/>
    
    <category term="命令行" scheme="https://www.zeroxin.xin/tags/%E5%91%BD%E4%BB%A4%E8%A1%8C/"/>
    
  </entry>
  
  <entry>
    <title>Linux 桌面环境全面指南：主流 GUI 桌面环境对比与安装</title>
    <link href="https://www.zeroxin.xin/2026/06/27/Linux-Desktop-Environments-Guide/"/>
    <id>https://www.zeroxin.xin/2026/06/27/Linux-Desktop-Environments-Guide/</id>
    <published>2026-06-26T16:00:00.000Z</published>
    <updated>2026-07-13T14:34:33.533Z</updated>
    
    <content type="html"><![CDATA[<p>Linux 桌面环境的多样性是其最独特的优势之一。与 Windows 和 macOS 不同，Linux 允许用户自由选择和更换桌面环境，每种环境都代表着不同的设计哲学、资源占用和使用体验。本文带你详细了解当前最流行的八大 Linux 桌面环境。</p><h2 id="什么是桌面环境？">什么是桌面环境？</h2><p>桌面环境（Desktop Environment，简称 DE）是提供图形用户界面交互体验的整套组件集合，包括窗口管理器、面板、菜单、系统设置、文件管理器及配套应用。不同的桌面环境在性能、美观度、可定制性上各有侧重。</p><h2 id="各桌面环境速览对比">各桌面环境速览对比</h2><table><thead><tr><th>桌面环境</th><th>工具包</th><th>资源占用</th><th>可定制性</th><th>目标用户</th></tr></thead><tbody><tr><td>GNOME</td><td>GTK 4</td><td>较高</td><td>中等（通过扩展）</td><td>现代工作流用户</td></tr><tr><td>KDE Plasma</td><td>Qt 6</td><td>中等</td><td>极高</td><td>高级用户、定制爱好者</td></tr><tr><td>Xfce</td><td>GTK 3</td><td>低</td><td>良好</td><td>旧硬件、效率用户</td></tr><tr><td>Cinnamon</td><td>GTK 3</td><td>中等</td><td>良好</td><td>传统桌面用户</td></tr><tr><td>MATE</td><td>GTK 3</td><td>低-中等</td><td>良好</td><td>经典桌面爱好者</td></tr><tr><td>LXQt</td><td>Qt 6</td><td>极低</td><td>有限</td><td>资源受限环境</td></tr><tr><td>Budgie</td><td>GTK 3</td><td>中等</td><td>良好</td><td>寻求简洁的用户</td></tr><tr><td>Deepin DDE</td><td>Qt 5/6</td><td>中等</td><td>有限</td><td>美观追求者</td></tr></tbody></table><hr><h2 id="1-GNOME">1. GNOME</h2><p><img src="https://gnome.org/img/laptop.webp" alt="GNOME"></p><p>GNOME 是当今最流行的 Linux 桌面环境之一，被 Ubuntu、Fedora、Debian 等主流发行版采用。它以简洁、现代化的设计和键盘驱动的工作流著称。</p><h3 id="优势">优势</h3><ul><li><strong>现代化的交互设计</strong>：通过 Activities 概览和多工作区管理，提供流畅的任务切换体验</li><li><strong>强大的扩展生态</strong>：通过 GNOME Shell Extensions（<a href="http://extensions.gnome.org">extensions.gnome.org</a>）可以大幅扩展功能</li><li><strong>出色的无障碍支持</strong>：内置屏幕阅读器、高对比度主题等无障碍功能</li><li><strong>稳定性和一致性</strong>：严格的 UI/UX 设计规范保证了统一的用户体验</li></ul><h3 id="劣势">劣势</h3><ul><li><strong>资源占用较高</strong>：默认情况下需要至少 4GB 内存才能流畅运行</li><li><strong>原生定制能力有限</strong>：许多自定义需求依赖第三方扩展，扩展可能因版本更新而失效</li><li><strong>学习曲线</strong>：与传统桌面布局差异较大，新用户需要适应</li></ul><h3 id="安装方法">安装方法</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Ubuntu/Debian</span></span><br><span class="line"><span class="built_in">sudo</span> apt install gnome gnome-shell ubuntu-gnome-desktop</span><br><span class="line"></span><br><span class="line"><span class="comment"># Fedora（已默认安装）</span></span><br><span class="line"><span class="built_in">sudo</span> dnf groupinstall <span class="string">"GNOME Desktop Environment"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Arch Linux</span></span><br><span class="line"><span class="built_in">sudo</span> pacman -S gnome gnome-extra</span><br></pre></td></tr></tbody></table></figure><hr><h2 id="2-KDE-Plasma">2. KDE Plasma</h2><p><img src="https://kde.org/announcements/plasma/6/6.7.0/fullscreen_with_apps.png" alt="KDE Plasma"></p><p>KDE Plasma 是一款功能极其丰富、可定制性极高的桌面环境，基于 Qt 工具包开发。它既有惊艳的视觉效果，又在 Plasma 6 中实现了令人惊讶的轻量级表现。</p><h3 id="优势-2">优势</h3><ul><li><strong>无与伦比的定制性</strong>：从面板、小部件到窗口装饰，几乎每个像素都可以自定义</li><li><strong>功能丰富</strong>：内置大量实用的 KDE 应用套件（Dolphin 文件管理器、Konsole 终端等）</li><li><strong>轻量级表现</strong>：Plasma 6 优化出色，资源占用远低于预期</li><li><strong>KDE Connect</strong>：与手机无缝集成，支持通知同步、文件传输、远程输入等</li><li><strong>多平台支持</strong>：除 Linux 外，还支持 BSD、乃至 Windows/macOS</li></ul><h3 id="劣势-2">劣势</h3><ul><li><strong>选项过多</strong>：大量的设置项可能让新用户感到不知所措</li><li><strong>默认配置不够精简</strong>：开箱即用的体验需要一些调整才能达到理想状态</li><li><strong>Wayland 过渡期</strong>：虽然 Plasma 6 已全面转向 Wayland，部分应用仍存在兼容性问题</li></ul><h3 id="安装方法-2">安装方法</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Ubuntu/Kubuntu</span></span><br><span class="line"><span class="built_in">sudo</span> apt install kde-plasma-desktop plasma-workspace</span><br><span class="line"></span><br><span class="line"><span class="comment"># Fedora</span></span><br><span class="line"><span class="built_in">sudo</span> dnf groupinstall <span class="string">"KDE Plasma Workspaces"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Arch Linux</span></span><br><span class="line"><span class="built_in">sudo</span> pacman -S plasma plasma-desktop plasma-wayland-session kde-applications</span><br></pre></td></tr></tbody></table></figure><hr><h2 id="3-Xfce">3. Xfce</h2><p><img src="https://cdn.xfce.org/about/screenshots/4.20-1.png" alt="Xfce"></p><p>Xfce 是一款经典的轻量级桌面环境，在性能与功能之间取得了绝佳平衡。它特别适合老旧硬件或追求极致效率的用户。</p><h3 id="优势-3">优势</h3><ul><li><strong>极低的资源占用</strong>：512MB 内存即可流畅运行</li><li><strong>稳定可靠</strong>：开发节奏稳健，每个版本都经过充分测试</li><li><strong>高度可配置</strong>：虽然没有 KDE 那样丰富的选项，但足以满足大多数需求</li><li><strong>优秀的远程体验</strong>：轻量特性使其在远程桌面和虚拟机中表现出色</li><li><strong>良好的模块化设计</strong>：组件可以独立升级和替换</li></ul><h3 id="劣势-3">劣势</h3><ul><li><strong>视觉风格传统</strong>：默认外观较为朴素，缺少现代化特效</li><li><strong>Wayland 支持滞后</strong>：直到 4.20 版本才开始实验性支持 Wayland</li><li><strong>内置应用较少</strong>：相比 GNOME 和 KDE，Xfce 自带的配套应用较为基础</li></ul><h3 id="安装方法-3">安装方法</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Ubuntu/Xubuntu</span></span><br><span class="line"><span class="built_in">sudo</span> apt install xfce4 xfce4-goodies</span><br><span class="line"></span><br><span class="line"><span class="comment"># Fedora</span></span><br><span class="line"><span class="built_in">sudo</span> dnf groupinstall <span class="string">"Xfce Desktop"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Arch Linux</span></span><br><span class="line"><span class="built_in">sudo</span> pacman -S xfce4 xfce4-goodies</span><br></pre></td></tr></tbody></table></figure><hr><h2 id="4-Cinnamon">4. Cinnamon</h2><p><img src="https://linuxmint.com/web/img/screenshots/thumb_c1.jpg" alt="Cinnamon"></p><p>Cinnamon 是 Linux Mint 团队从 GNOME 3 分支开发的桌面环境，旨在提供传统、熟悉且具有现代功能的桌面体验。它是 Linux Mint 旗舰版默认的桌面环境。</p><h3 id="优势-4">优势</h3><ul><li><strong>熟悉的传统布局</strong>：底部面板 + 应用菜单的布局对 Windows 用户非常友好</li><li><strong>开箱即用的体验</strong>：Linux Mint 对 Cinnamon 进行了大量优化，上手即用</li><li><strong>Applets 和 Desklets</strong>：丰富的桌面小程序扩展生态</li><li><strong>稳定的 GTK 主题兼容性</strong>：主题和图标主题的支持非常完善</li><li><strong>Spices 在线商店</strong>：可通过图形界面直接安装扩展、主题和 applet</li></ul><h3 id="劣势-4">劣势</h3><ul><li><strong>生态相对独立</strong>：主要围绕 Linux Mint 生态发展，其他发行版上的体验可能不如 Mint 完善</li><li><strong>资源占用中等</strong>：相比 Xfce 和 LXQt，对内存的要求更高</li><li><strong>Wayland 支持进展缓慢</strong>：Cinnamon 目前仍以 X11 为主要显示服务器</li></ul><h3 id="安装方法-4">安装方法</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Ubuntu</span></span><br><span class="line"><span class="built_in">sudo</span> apt install cinnamon cinnamon-desktop-environment</span><br><span class="line"></span><br><span class="line"><span class="comment"># Fedora</span></span><br><span class="line"><span class="built_in">sudo</span> dnf install @cinnamon-desktop-environment</span><br><span class="line"></span><br><span class="line"><span class="comment"># Arch Linux</span></span><br><span class="line"><span class="built_in">sudo</span> pacman -S cinnamon cinnamon-translations</span><br></pre></td></tr></tbody></table></figure><hr><h2 id="5-MATE">5. MATE</h2><p><img src="https://mate-desktop.org/screens/screenshot.jpg" alt="MATE"></p><p>MATE 是 GNOME 2 的延续，保留了经典的桌面交互范式。它既轻量又功能完整，是追求传统桌面体验用户的绝佳选择。</p><h3 id="优势-5">优势</h3><ul><li><strong>与 GNOME 2 一脉相承</strong>：保留了经典的底部面板、应用菜单和桌面图标</li><li><strong>轻量高效</strong>：资源占用低于 Cinnamon，接近 Xfce 水平</li><li><strong>功能完善</strong>：提供完整的配套应用（Caja 文件管理器、Pluma 文本编辑器等）</li><li><strong>良好的兼容性</strong>：与大多数 GTK 应用完美配合</li></ul><h3 id="劣势-5">劣势</h3><ul><li><strong>设计语言略显老旧</strong>：界面现代感不足，缺少动画和视觉特效</li><li><strong>开发资源有限</strong>：维护团队规模较小，新功能开发速度较慢</li><li><strong>Wayland 支持有限</strong>：目前仍主要运行在 X11 上</li></ul><h3 id="安装方法-5">安装方法</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Ubuntu/Ubuntu MATE</span></span><br><span class="line"><span class="built_in">sudo</span> apt install ubuntu-mate-desktop mate-desktop-environment</span><br><span class="line"></span><br><span class="line"><span class="comment"># Fedora</span></span><br><span class="line"><span class="built_in">sudo</span> dnf groupinstall <span class="string">"MATE Desktop"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Arch Linux</span></span><br><span class="line"><span class="built_in">sudo</span> pacman -S mate mate-extra</span><br></pre></td></tr></tbody></table></figure><hr><h2 id="6-LXQt">6. LXQt</h2><p><img src="https://lxqt-project.org/images/screenshots/ambiance.png" alt="LXQt"></p><p>LXQt 是 LXDE 的下一代产品，将 LXDE 的轻量理念与 Qt 工具包的现代特性相结合。它是资源受限设备或追求极简体验用户的最佳选择。</p><h3 id="优势-6">优势</h3><ul><li><strong>极致的轻量级</strong>：最低只需 512MB 内存即可运行，CPU 占用极低</li><li><strong>现代化的 Qt 技术栈</strong>：相比基于 GTK 2 的旧版 LXDE，LXQt 拥有更现代的代码基础</li><li><strong>模块化设计</strong>：每个组件都可以独立替换</li><li><strong>Wayland 支持积极</strong>：自 2.3.0 版本起，Wayland 会话已不再是实验性功能</li></ul><h3 id="劣势-6">劣势</h3><ul><li><strong>功能较为基础</strong>：内置应用和功能远不如 KDE 或 GNOME 丰富</li><li><strong>视觉效果简约</strong>：默认外观较为朴素</li><li><strong>应用生态有限</strong>：专门为 LXQt 开发的应用较少</li></ul><h3 id="安装方法-6">安装方法</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Ubuntu/Lubuntu</span></span><br><span class="line"><span class="built_in">sudo</span> apt install lxqt lxqt-core sddm</span><br><span class="line"></span><br><span class="line"><span class="comment"># Fedora</span></span><br><span class="line"><span class="built_in">sudo</span> dnf groupinstall <span class="string">"LXQt Desktop"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Arch Linux</span></span><br><span class="line"><span class="built_in">sudo</span> pacman -S lxqt xdg-utils</span><br></pre></td></tr></tbody></table></figure><hr><h2 id="7-Budgie">7. Budgie</h2><p><img src="https://raw.githubusercontent.com/BuddiesOfBudgie/budgie-desktop/main/.github/screenshots/MainDesktop.jpg" alt="Budgie"></p><p>Budgie 是一款强调简洁、现代和优雅的独立桌面环境，最初为 Solus 发行版开发，现在已可在多款主流发行版中使用。其设计核心理念是"让桌面不打扰用户"。</p><h3 id="优势-7">优势</h3><ul><li><strong>简洁优雅的设计</strong>：界面干净清爽，没有多余元素</li><li><strong>Raven 侧边栏</strong>：集成了通知中心、日历、媒体控制和系统设置</li><li><strong>多布局支持</strong>：可轻松切换为类 macOS、Windows 或 Unity 布局</li><li><strong>基于成熟的 GNOME 技术栈</strong>：稳定性有保障</li></ul><h3 id="劣势-7">劣势</h3><ul><li><strong>开发团队规模较小</strong>：更新频率低于 GNOME 和 KDE</li><li><strong>扩展生态有限</strong>：相比 GNOME 和 KDE，可用的 applet 较少</li><li><strong>独立发行版支持差异大</strong>：不同发行版上的体验和默认配置差异明显</li></ul><h3 id="安装方法-7">安装方法</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Ubuntu/Ubuntu Budgie</span></span><br><span class="line"><span class="built_in">sudo</span> apt install ubuntu-budgie-desktop budgie-desktop</span><br><span class="line"></span><br><span class="line"><span class="comment"># Fedora</span></span><br><span class="line"><span class="built_in">sudo</span> dnf install @budgie-desktop-environment</span><br><span class="line"></span><br><span class="line"><span class="comment"># Arch Linux</span></span><br><span class="line"><span class="built_in">sudo</span> pacman -S budgie-desktop budgie-desktop-view</span><br></pre></td></tr></tbody></table></figure><hr><h2 id="8-Deepin-DDE">8. Deepin DDE</h2><p><img src="https://www.deepin.org/wp-content/uploads/2017/01/deepin-screenshot1.png" alt="Deepin DDE"></p><p>Deepin DDE（Deepin Desktop Environment）是由武汉深之度科技有限公司开发的桌面环境，以其精致美观的 UI 设计闻名。它在视觉体验上可与 macOS 和 Windows 11 媲美，是追求美观用户的理想选择。</p><h3 id="优势-8">优势</h3><ul><li><strong>极致的视觉设计</strong>：统一的圆角设计语言、毛玻璃效果和流畅动画</li><li><strong>深度自研的 DTK 开发框架</strong>：提供了统一的应用开发接口</li><li><strong>内置丰富的自研应用</strong>：深度影院、深度音乐、深度截图等超过 40 款应用</li><li><strong>友好的中文支持</strong>：对中文用户和中文输入法有极佳的原生支持</li></ul><h3 id="劣势-8">劣势</h3><ul><li><strong>资源占用较高</strong>：精美的视觉效果需要较强的硬件支持</li><li><strong>安全风险关注</strong>：openSUSE 安全团队曾指出 DDE 存在安全文化缺失的问题</li><li><strong>主流发行版支持有限</strong>：除 Deepin OS 外，其他发行版上的体验可能不够完美</li><li><strong>国际化程度较低</strong>：除中文外，其他语言的本地化质量参差不齐</li></ul><h3 id="安装方法-8">安装方法</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Ubuntu/UbuntuDDE</span></span><br><span class="line"><span class="built_in">sudo</span> add-apt-repository ppa:ubuntudde-dev/stable</span><br><span class="line"><span class="built_in">sudo</span> apt update</span><br><span class="line"><span class="built_in">sudo</span> apt install ubuntudde-dde</span><br><span class="line"></span><br><span class="line"><span class="comment"># Arch Linux</span></span><br><span class="line"><span class="built_in">sudo</span> pacman -S deepin deepin-extra deepin-kwin</span><br><span class="line"></span><br><span class="line"><span class="comment"># Fedora（需要添加第三方仓库）</span></span><br><span class="line"><span class="built_in">sudo</span> dnf install dde-control-center dde-dock dde-launcher deepin-desktop</span><br></pre></td></tr></tbody></table></figure><hr><h2 id="如何选择适合你的桌面环境？">如何选择适合你的桌面环境？</h2><table><thead><tr><th>使用场景</th><th>推荐桌面环境</th></tr></thead><tbody><tr><td>新手入门、从 Windows 迁移</td><td>Cinnamon、KDE Plasma</td></tr><tr><td>追求美观与现代化</td><td>Deepin DDE、GNOME</td></tr><tr><td>硬件较旧或资源有限</td><td>Xfce、LXQt、MATE</td></tr><tr><td>喜欢深度定制</td><td>KDE Plasma</td></tr><tr><td>偏好键盘驱动的高效工作流</td><td>GNOME（+ 扩展）</td></tr><tr><td>服务器或远程桌面</td><td>Xfce、LXQt</td></tr><tr><td>极简主义</td><td>Budgie、LXQt</td></tr></tbody></table><hr><h2 id="注意事项">注意事项</h2><ol><li><strong>虚拟机先行</strong>：如果想尝鲜新的桌面环境，建议先在虚拟机中测试，避免影响主力系统</li><li><strong>多桌面环境共存问题</strong>：在同一系统上安装多个桌面环境可能导致主题和设置冲突，建议使用不同的显示管理器来隔离</li><li><strong>卸载不彻底的风险</strong>：移除一个桌面环境时，依赖关系可能导致系统组件被意外删除，建议使用专门的元包管理工具来处理</li><li><strong>Wayland 与 X11 的选择</strong>：较新的桌面环境（GNOME、KDE Plasma 6）已全面支持 Wayland，但 X11 在某些场景下（如屏幕共享）仍有兼容性优势</li></ol><hr><h2 id="总结">总结</h2><p>Linux 桌面环境的丰富多样性是其独特魅力的重要组成部分。无论你是追求极致性能、钟情于精美视觉、还是热衷于深度定制，总有一款桌面环境适合你。这种选择的自由正是 Linux 生态无可替代的核心优势之一。</p><p>最重要的是，你不必从一而终——随时可以切换和尝试不同的桌面环境，找到最适合你工作流程和个人偏好的方案。</p><hr><p><strong>参考资料</strong>：</p><ul><li><a href="https://www.gnome.org">GNOME 官方网站</a></li><li><a href="https://kde.org/plasma-desktop">KDE Plasma 官方网站</a></li><li><a href="https://xfce.org">Xfce 官方网站</a></li><li><a href="https://linuxmint.com">Linux Mint / Cinnamon</a></li><li><a href="https://mate-desktop.org">MATE 桌面环境</a></li><li><a href="https://lxqt-project.org">LXQt 项目</a></li><li><a href="https://buddiesofbudgie.org">Buddies of Budgie</a></li><li><a href="https://www.deepin.org">Deepin 社区</a></li></ul>]]></content>
    
    
    <summary type="html">全面介绍 Linux 生态中最流行的八大桌面环境——GNOME、KDE Plasma、Xfce、Cinnamon、MATE、LXQt、Budgie 和 Deepin，涵盖各自的设计理念、优缺点、适用场景及主流发行版上的安装方法</summary>
    
    
    
    <category term="系统技术" scheme="https://www.zeroxin.xin/categories/%E7%B3%BB%E7%BB%9F%E6%8A%80%E6%9C%AF/"/>
    
    
    <category term="Linux" scheme="https://www.zeroxin.xin/tags/Linux/"/>
    
    <category term="桌面环境" scheme="https://www.zeroxin.xin/tags/%E6%A1%8C%E9%9D%A2%E7%8E%AF%E5%A2%83/"/>
    
    <category term="GNOME" scheme="https://www.zeroxin.xin/tags/GNOME/"/>
    
    <category term="KDE" scheme="https://www.zeroxin.xin/tags/KDE/"/>
    
    <category term="Xfce" scheme="https://www.zeroxin.xin/tags/Xfce/"/>
    
    <category term="Cinnamon" scheme="https://www.zeroxin.xin/tags/Cinnamon/"/>
    
    <category term="MATE" scheme="https://www.zeroxin.xin/tags/MATE/"/>
    
    <category term="LXQt" scheme="https://www.zeroxin.xin/tags/LXQt/"/>
    
    <category term="Budgie" scheme="https://www.zeroxin.xin/tags/Budgie/"/>
    
    <category term="Deepin" scheme="https://www.zeroxin.xin/tags/Deepin/"/>
    
    <category term="开源" scheme="https://www.zeroxin.xin/tags/%E5%BC%80%E6%BA%90/"/>
    
  </entry>
  
  <entry>
    <title>A Complete Guide to Linux Desktop Environments: Comparison and Installation</title>
    <link href="https://www.zeroxin.xin/en/linux-desktop-environments-guide/"/>
    <id>https://www.zeroxin.xin/en/linux-desktop-environments-guide/</id>
    <published>2026-06-26T16:00:00.000Z</published>
    <updated>2026-07-13T14:33:47.654Z</updated>
    
    <content type="html"><![CDATA[<p>The diversity of Linux desktop environments is one of its most unique strengths. Unlike Windows and macOS, Linux lets you freely choose and switch desktop environments, each representing a different design philosophy, resource footprint, and user experience. This article walks you through the eight most popular Linux desktop environments today.</p><h2 id="What-Is-a-Desktop-Environment">What Is a Desktop Environment?</h2><p>A Desktop Environment (DE) is a complete set of components that provide the graphical user interface experience, including the window manager, panels, menus, system settings, file manager, and bundled applications. Different desktop environments emphasize performance, aesthetics, and customizability to varying degrees.</p><h2 id="Quick-Comparison">Quick Comparison</h2><table><thead><tr><th>Desktop Environment</th><th>Toolkit</th><th>Resource Usage</th><th>Customizability</th><th>Target Users</th></tr></thead><tbody><tr><td>GNOME</td><td>GTK 4</td><td>High</td><td>Medium (via extensions)</td><td>Modern workflow users</td></tr><tr><td>KDE Plasma</td><td>Qt 6</td><td>Medium</td><td>Very high</td><td>Power users, customization fans</td></tr><tr><td>Xfce</td><td>GTK 3</td><td>Low</td><td>Good</td><td>Older hardware, efficiency users</td></tr><tr><td>Cinnamon</td><td>GTK 3</td><td>Medium</td><td>Good</td><td>Traditional desktop users</td></tr><tr><td>MATE</td><td>GTK 3</td><td>Low-Medium</td><td>Good</td><td>Classic desktop fans</td></tr><tr><td>LXQt</td><td>Qt 6</td><td>Very low</td><td>Limited</td><td>Resource-constrained systems</td></tr><tr><td>Budgie</td><td>GTK 3</td><td>Medium</td><td>Good</td><td>Users wanting simplicity</td></tr><tr><td>Deepin DDE</td><td>Qt 5/6</td><td>Medium</td><td>Limited</td><td>Aesthetics seekers</td></tr></tbody></table><hr><h2 id="1-GNOME">1. GNOME</h2><p><img src="https://gnome.org/img/laptop.webp" alt="GNOME"></p><p>GNOME is one of the most popular Linux desktop environments today, used by mainstream distributions such as Ubuntu, Fedora, and Debian. It is known for its clean, modern design and keyboard-driven workflow.</p><h3 id="Pros">Pros</h3><ul><li><strong>Modern interaction design</strong>: the Activities overview and multiple workspaces provide a smooth task-switching experience</li><li><strong>Powerful extension ecosystem</strong>: GNOME Shell Extensions (<a href="http://extensions.gnome.org">extensions.gnome.org</a>) can greatly expand functionality</li><li><strong>Excellent accessibility support</strong>: built-in screen reader, high-contrast themes, and more</li><li><strong>Stability and consistency</strong>: strict UI/UX design guidelines ensure a unified experience</li></ul><h3 id="Cons">Cons</h3><ul><li><strong>Higher resource usage</strong>: needs at least 4GB of RAM to run smoothly by default</li><li><strong>Limited native customization</strong>: many customizations rely on third-party extensions that may break with version updates</li><li><strong>Learning curve</strong>: differs significantly from traditional desktop layouts, so new users need time to adapt</li></ul><h3 id="Installation">Installation</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Ubuntu/Debian</span></span><br><span class="line"><span class="built_in">sudo</span> apt install gnome gnome-shell ubuntu-gnome-desktop</span><br><span class="line"></span><br><span class="line"><span class="comment"># Fedora (installed by default)</span></span><br><span class="line"><span class="built_in">sudo</span> dnf groupinstall <span class="string">"GNOME Desktop Environment"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Arch Linux</span></span><br><span class="line"><span class="built_in">sudo</span> pacman -S gnome gnome-extra</span><br></pre></td></tr></tbody></table></figure><hr><h2 id="2-KDE-Plasma">2. KDE Plasma</h2><p><img src="https://kde.org/announcements/plasma/6/6.7.0/fullscreen_with_apps.png" alt="KDE Plasma"></p><p>KDE Plasma is an extremely feature-rich and highly customizable desktop environment built on the Qt toolkit. It offers stunning visuals while achieving surprisingly lightweight performance in Plasma 6.</p><h3 id="Pros-2">Pros</h3><ul><li><strong>Unmatched customization</strong>: from panels and widgets to window decorations, almost every pixel can be customized</li><li><strong>Feature-rich</strong>: bundled with a large suite of useful KDE applications (Dolphin file manager, Konsole terminal, etc.)</li><li><strong>Lightweight performance</strong>: Plasma 6 is well optimized, with resource usage far lower than expected</li><li><strong>KDE Connect</strong>: seamless phone integration for notification sync, file transfer, remote input, and more</li><li><strong>Multi-platform support</strong>: beyond Linux, it also supports BSD and even Windows/macOS</li></ul><h3 id="Cons-2">Cons</h3><ul><li><strong>Too many options</strong>: the sheer number of settings can overwhelm new users</li><li><strong>Default configuration isn’t minimal</strong>: the out-of-the-box experience needs some tweaking to feel ideal</li><li><strong>Wayland transition</strong>: although Plasma 6 has fully moved to Wayland, some apps still have compatibility issues</li></ul><h3 id="Installation-2">Installation</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Ubuntu/Kubuntu</span></span><br><span class="line"><span class="built_in">sudo</span> apt install kde-plasma-desktop plasma-workspace</span><br><span class="line"></span><br><span class="line"><span class="comment"># Fedora</span></span><br><span class="line"><span class="built_in">sudo</span> dnf groupinstall <span class="string">"KDE Plasma Workspaces"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Arch Linux</span></span><br><span class="line"><span class="built_in">sudo</span> pacman -S plasma plasma-desktop plasma-wayland-session kde-applications</span><br></pre></td></tr></tbody></table></figure><hr><h2 id="3-Xfce">3. Xfce</h2><p><img src="https://cdn.xfce.org/about/screenshots/4.20-1.png" alt="Xfce"></p><p>Xfce is a classic lightweight desktop environment that strikes an excellent balance between performance and features. It is especially suited to older hardware or users who want maximum efficiency.</p><h3 id="Pros-3">Pros</h3><ul><li><strong>Very low resource usage</strong>: runs smoothly with just 512MB of RAM</li><li><strong>Stable and reliable</strong>: a steady development pace with each release thoroughly tested</li><li><strong>Highly configurable</strong>: not as rich as KDE, but enough for most needs</li><li><strong>Great remote experience</strong>: its lightweight nature shines in remote desktops and virtual machines</li><li><strong>Good modular design</strong>: components can be upgraded and replaced independently</li></ul><h3 id="Cons-3">Cons</h3><ul><li><strong>Traditional visual style</strong>: the default look is plain and lacks modern effects</li><li><strong>Lagging Wayland support</strong>: experimental Wayland support only started in version 4.20</li><li><strong>Fewer bundled apps</strong>: compared to GNOME and KDE, Xfce’s bundled applications are more basic</li></ul><h3 id="Installation-3">Installation</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Ubuntu/Xubuntu</span></span><br><span class="line"><span class="built_in">sudo</span> apt install xfce4 xfce4-goodies</span><br><span class="line"></span><br><span class="line"><span class="comment"># Fedora</span></span><br><span class="line"><span class="built_in">sudo</span> dnf groupinstall <span class="string">"Xfce Desktop"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Arch Linux</span></span><br><span class="line"><span class="built_in">sudo</span> pacman -S xfce4 xfce4-goodies</span><br></pre></td></tr></tbody></table></figure><hr><h2 id="4-Cinnamon">4. Cinnamon</h2><p><img src="https://linuxmint.com/web/img/screenshots/thumb_c1.jpg" alt="Cinnamon"></p><p>Cinnamon is a desktop environment developed by the Linux Mint team as a fork of GNOME 3, aiming to provide a traditional, familiar desktop with modern features. It is the default desktop environment of the Linux Mint flagship edition.</p><h3 id="Pros-4">Pros</h3><ul><li><strong>Familiar traditional layout</strong>: the bottom panel + application menu layout is very friendly to Windows users</li><li><strong>Out-of-the-box experience</strong>: Linux Mint has heavily optimized Cinnamon for immediate use</li><li><strong>Applets and Desklets</strong>: a rich ecosystem of desktop mini-programs</li><li><strong>Stable GTK theme compatibility</strong>: excellent support for themes and icon themes</li><li><strong>Spices online store</strong>: install extensions, themes, and applets directly through a GUI</li></ul><h3 id="Cons-4">Cons</h3><ul><li><strong>Relatively isolated ecosystem</strong>: developed mainly around the Linux Mint ecosystem, so the experience on other distributions may not be as polished</li><li><strong>Medium resource usage</strong>: requires more memory than Xfce and LXQt</li><li><strong>Slow Wayland progress</strong>: Cinnamon still uses X11 as its primary display server</li></ul><h3 id="Installation-4">Installation</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Ubuntu</span></span><br><span class="line"><span class="built_in">sudo</span> apt install cinnamon cinnamon-desktop-environment</span><br><span class="line"></span><br><span class="line"><span class="comment"># Fedora</span></span><br><span class="line"><span class="built_in">sudo</span> dnf install @cinnamon-desktop-environment</span><br><span class="line"></span><br><span class="line"><span class="comment"># Arch Linux</span></span><br><span class="line"><span class="built_in">sudo</span> pacman -S cinnamon cinnamon-translations</span><br></pre></td></tr></tbody></table></figure><hr><h2 id="5-MATE">5. MATE</h2><p><img src="https://mate-desktop.org/screens/screenshot.jpg" alt="MATE"></p><p>MATE is the continuation of GNOME 2, preserving the classic desktop interaction paradigm. It is both lightweight and fully featured — an excellent choice for users who want a traditional desktop experience.</p><h3 id="Pros-5">Pros</h3><ul><li><strong>A direct descendant of GNOME 2</strong>: keeps the classic bottom panel, application menu, and desktop icons</li><li><strong>Lightweight and efficient</strong>: lower resource usage than Cinnamon, close to Xfce levels</li><li><strong>Full-featured</strong>: provides a complete set of bundled apps (Caja file manager, Pluma text editor, etc.)</li><li><strong>Good compatibility</strong>: works perfectly with most GTK applications</li></ul><h3 id="Cons-5">Cons</h3><ul><li><strong>Slightly dated design language</strong>: the interface lacks a modern feel, animations, and visual effects</li><li><strong>Limited development resources</strong>: a small maintenance team means slower new-feature development</li><li><strong>Limited Wayland support</strong>: still runs mainly on X11</li></ul><h3 id="Installation-5">Installation</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Ubuntu/Ubuntu MATE</span></span><br><span class="line"><span class="built_in">sudo</span> apt install ubuntu-mate-desktop mate-desktop-environment</span><br><span class="line"></span><br><span class="line"><span class="comment"># Fedora</span></span><br><span class="line"><span class="built_in">sudo</span> dnf groupinstall <span class="string">"MATE Desktop"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Arch Linux</span></span><br><span class="line"><span class="built_in">sudo</span> pacman -S mate mate-extra</span><br></pre></td></tr></tbody></table></figure><hr><h2 id="6-LXQt">6. LXQt</h2><p><img src="https://lxqt-project.org/images/screenshots/ambiance.png" alt="LXQt"></p><p>LXQt is the next generation of LXDE, combining LXDE’s lightweight philosophy with the modern features of the Qt toolkit. It is the best choice for resource-constrained devices or users who want a minimal experience.</p><h3 id="Pros-6">Pros</h3><ul><li><strong>Extremely lightweight</strong>: runs with as little as 512MB of RAM and very low CPU usage</li><li><strong>Modern Qt stack</strong>: a more modern codebase than the GTK 2-based older LXDE</li><li><strong>Modular design</strong>: every component can be replaced independently</li><li><strong>Active Wayland support</strong>: since version 2.3.0, the Wayland session is no longer experimental</li></ul><h3 id="Cons-6">Cons</h3><ul><li><strong>Fairly basic features</strong>: bundled apps and features are far less rich than KDE or GNOME</li><li><strong>Minimal visuals</strong>: the default look is plain</li><li><strong>Limited app ecosystem</strong>: few applications are developed specifically for LXQt</li></ul><h3 id="Installation-6">Installation</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Ubuntu/Lubuntu</span></span><br><span class="line"><span class="built_in">sudo</span> apt install lxqt lxqt-core sddm</span><br><span class="line"></span><br><span class="line"><span class="comment"># Fedora</span></span><br><span class="line"><span class="built_in">sudo</span> dnf groupinstall <span class="string">"LXQt Desktop"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Arch Linux</span></span><br><span class="line"><span class="built_in">sudo</span> pacman -S lxqt xdg-utils</span><br></pre></td></tr></tbody></table></figure><hr><h2 id="7-Budgie">7. Budgie</h2><p><img src="https://raw.githubusercontent.com/BuddiesOfBudgie/budgie-desktop/main/.github/screenshots/MainDesktop.jpg" alt="Budgie"></p><p>Budgie is a standalone desktop environment emphasizing simplicity, modernity, and elegance. Originally developed for the Solus distribution, it is now available on several mainstream distributions. Its core design philosophy is to “let the desktop stay out of the user’s way.”</p><h3 id="Pros-7">Pros</h3><ul><li><strong>Clean, elegant design</strong>: a tidy interface with no clutter</li><li><strong>Raven sidebar</strong>: integrates the notification center, calendar, media controls, and system settings</li><li><strong>Multiple layout support</strong>: easily switch to macOS-, Windows-, or Unity-like layouts</li><li><strong>Built on the mature GNOME stack</strong>: stability is assured</li></ul><h3 id="Cons-7">Cons</h3><ul><li><strong>Small development team</strong>: updates are less frequent than GNOME and KDE</li><li><strong>Limited extension ecosystem</strong>: fewer applets available than GNOME and KDE</li><li><strong>Varied support across distributions</strong>: the experience and default configuration differ noticeably between distributions</li></ul><h3 id="Installation-7">Installation</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Ubuntu/Ubuntu Budgie</span></span><br><span class="line"><span class="built_in">sudo</span> apt install ubuntu-budgie-desktop budgie-desktop</span><br><span class="line"></span><br><span class="line"><span class="comment"># Fedora</span></span><br><span class="line"><span class="built_in">sudo</span> dnf install @budgie-desktop-environment</span><br><span class="line"></span><br><span class="line"><span class="comment"># Arch Linux</span></span><br><span class="line"><span class="built_in">sudo</span> pacman -S budgie-desktop budgie-desktop-view</span><br></pre></td></tr></tbody></table></figure><hr><h2 id="8-Deepin-DDE">8. Deepin DDE</h2><p><img src="https://www.deepin.org/wp-content/uploads/2017/01/deepin-screenshot1.png" alt="Deepin DDE"></p><p>Deepin DDE (Deepin Desktop Environment) is developed by Wuhan Deepin Technology, known for its refined and beautiful UI design. Its visual experience rivals macOS and Windows 11, making it an ideal choice for users who value aesthetics.</p><h3 id="Pros-8">Pros</h3><ul><li><strong>Exquisite visual design</strong>: a unified rounded-corner design language, frosted-glass effects, and smooth animations</li><li><strong>In-house DTK development framework</strong>: provides a unified application development interface</li><li><strong>Rich bundled in-house apps</strong>: over 40 apps including Deepin Movie, Deepin Music, and Deepin Screenshot</li><li><strong>Friendly Chinese support</strong>: excellent native support for Chinese users and input methods</li></ul><h3 id="Cons-8">Cons</h3><ul><li><strong>Higher resource usage</strong>: the beautiful visuals require stronger hardware</li><li><strong>Security concerns</strong>: the openSUSE security team has pointed out a lack of security culture in DDE</li><li><strong>Limited support on mainstream distributions</strong>: outside Deepin OS, the experience may not be perfect</li><li><strong>Lower level of internationalization</strong>: outside Chinese, localization quality varies</li></ul><h3 id="Installation-8">Installation</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Ubuntu/UbuntuDDE</span></span><br><span class="line"><span class="built_in">sudo</span> add-apt-repository ppa:ubuntudde-dev/stable</span><br><span class="line"><span class="built_in">sudo</span> apt update</span><br><span class="line"><span class="built_in">sudo</span> apt install ubuntudde-dde</span><br><span class="line"></span><br><span class="line"><span class="comment"># Arch Linux</span></span><br><span class="line"><span class="built_in">sudo</span> pacman -S deepin deepin-extra deepin-kwin</span><br><span class="line"></span><br><span class="line"><span class="comment"># Fedora (requires a third-party repository)</span></span><br><span class="line"><span class="built_in">sudo</span> dnf install dde-control-center dde-dock dde-launcher deepin-desktop</span><br></pre></td></tr></tbody></table></figure><hr><h2 id="How-to-Choose-the-Right-Desktop-Environment">How to Choose the Right Desktop Environment</h2><table><thead><tr><th>Use Case</th><th>Recommended DE</th></tr></thead><tbody><tr><td>Beginners, migrating from Windows</td><td>Cinnamon, KDE Plasma</td></tr><tr><td>Seeking beauty and modernity</td><td>Deepin DDE, GNOME</td></tr><tr><td>Older hardware or limited resources</td><td>Xfce, LXQt, MATE</td></tr><tr><td>Love deep customization</td><td>KDE Plasma</td></tr><tr><td>Prefer a keyboard-driven efficient workflow</td><td>GNOME (+ extensions)</td></tr><tr><td>Servers or remote desktops</td><td>Xfce, LXQt</td></tr><tr><td>Minimalism</td><td>Budgie, LXQt</td></tr></tbody></table><hr><h2 id="Things-to-Keep-in-Mind">Things to Keep in Mind</h2><ol><li><strong>Try it in a VM first</strong>: to test a new desktop environment, use a virtual machine first to avoid affecting your main system</li><li><strong>Coexistence issues</strong>: installing multiple desktop environments on one system can cause theme and setting conflicts; use different display managers to isolate them</li><li><strong>Incomplete uninstall risk</strong>: removing a desktop environment may accidentally delete system components due to dependencies; use dedicated meta-package management tools</li><li><strong>Wayland vs. X11</strong>: newer desktop environments (GNOME, KDE Plasma 6) fully support Wayland, but X11 still has compatibility advantages in some scenarios (such as screen sharing)</li></ol><hr><h2 id="Conclusion">Conclusion</h2><p>The rich diversity of Linux desktop environments is a big part of its unique appeal. Whether you chase peak performance, love beautiful visuals, or are passionate about deep customization, there is a desktop environment for you. This freedom of choice is one of the irreplaceable core strengths of the Linux ecosystem.</p><p>Most importantly, you don’t have to commit to one forever — you can switch and experiment at any time to find what best fits your workflow and personal preferences.</p><hr><p><strong>References:</strong></p><ul><li><a href="https://www.gnome.org">GNOME Official Site</a></li><li><a href="https://kde.org/plasma-desktop">KDE Plasma Official Site</a></li><li><a href="https://xfce.org">Xfce Official Site</a></li><li><a href="https://linuxmint.com">Linux Mint / Cinnamon</a></li><li><a href="https://mate-desktop.org">MATE Desktop</a></li><li><a href="https://lxqt-project.org">LXQt Project</a></li><li><a href="https://buddiesofbudgie.org">Buddies of Budgie</a></li><li><a href="https://www.deepin.org">Deepin Community</a></li></ul>]]></content>
    
    
    <summary type="html">A comprehensive overview of the eight most popular Linux desktop environments — GNOME, KDE Plasma, Xfce, Cinnamon, MATE, LXQt, Budgie, and Deepin — covering their design philosophies, pros and cons, ideal use cases, and installation on major distributions.</summary>
    
    
    
    <category term="System" scheme="https://www.zeroxin.xin/categories/System/"/>
    
    
    <category term="Linux" scheme="https://www.zeroxin.xin/tags/Linux/"/>
    
    <category term="GNOME" scheme="https://www.zeroxin.xin/tags/GNOME/"/>
    
    <category term="KDE" scheme="https://www.zeroxin.xin/tags/KDE/"/>
    
    <category term="Xfce" scheme="https://www.zeroxin.xin/tags/Xfce/"/>
    
    <category term="Cinnamon" scheme="https://www.zeroxin.xin/tags/Cinnamon/"/>
    
    <category term="MATE" scheme="https://www.zeroxin.xin/tags/MATE/"/>
    
    <category term="LXQt" scheme="https://www.zeroxin.xin/tags/LXQt/"/>
    
    <category term="Budgie" scheme="https://www.zeroxin.xin/tags/Budgie/"/>
    
    <category term="Deepin" scheme="https://www.zeroxin.xin/tags/Deepin/"/>
    
    <category term="Desktop Environment" scheme="https://www.zeroxin.xin/tags/Desktop-Environment/"/>
    
    <category term="Open Source" scheme="https://www.zeroxin.xin/tags/Open-Source/"/>
    
  </entry>
  
  <entry>
    <title>IPtools 网络工具箱：Android 开源网络诊断工具，集成 Ping/端口扫描/路由追踪等 13 项功能</title>
    <link href="https://www.zeroxin.xin/2026/06/18/IPtools-%E7%BD%91%E7%BB%9C%E5%B7%A5%E5%85%B7%E7%AE%B1/"/>
    <id>https://www.zeroxin.xin/2026/06/18/IPtools-%E7%BD%91%E7%BB%9C%E5%B7%A5%E5%85%B7%E7%AE%B1/</id>
    <published>2026-06-18T02:00:00.000Z</published>
    <updated>2026-06-18T02:32:03.891Z</updated>
    
    <content type="html"><![CDATA[<h1>IPtools 网络工具箱：Android 开源网络诊断工具，集成 Ping/端口扫描/路由追踪等 13 项功能</h1><p>在日常开发和运维工作中，网络诊断工具几乎是每个人的必备品。但手机上能用的网络工具类 App 往往功能单一——有的只能 Ping，有的只能查 IP，很难找到一个能覆盖大部分网络诊断场景的集成工具。</p><p><strong>IPtools（网络工具箱）</strong> 正是为解决这个痛点而生的开源 Android 应用。</p><p>项目地址：<a href="https://github.com/xin-521/IPtools">https://github.com/xin-521/IPtools</a></p><p><img src="/img/IPtools.png" alt="IPtools 应用截图"></p><h2 id="一、项目概览">一、项目概览</h2><p>IPtools 是一个<strong>纯 Kotlin</strong> 开发的 Android 网络工具集合应用，代码包名为 org.zeroxin.iptools，应用名称为"网络工具箱"。它把开发者/运维人员日常使用频率最高的网络诊断功能整合到一个 App 中，覆盖从基础连通性测试到高级端口扫描的完整链路。</p><p>当前版本 <strong>v1.1</strong>，目标 SDK 34（Android 14），最低支持 Android 7.0（API 24）。</p><h3 id="为什么值得关注？">为什么值得关注？</h3><p>如果你是 Android 开发者，这个项目的代码质量、架构选型和技术栈都是一份很好的 MVVM + Hilt + Room + DataStore 参考实现。如果你只是用户，它可以替代手机上多个单一功能的网络工具。</p><h2 id="二、完整功能清单">二、完整功能清单</h2><p>IPtools 内置了 <strong>13 项网络工具</strong>，分为基础工具和高级工具两大类。</p><h3 id="基础网络工具（日常诊断）">基础网络工具（日常诊断）</h3><table><thead><tr><th>工具</th><th>功能说明</th></tr></thead><tbody><tr><td><strong>我的 IP</strong></td><td>查看本机公网 IP、归属地、ISP、ASN、经纬度，支持在地图上定位</td></tr><tr><td><strong>局域网信息</strong></td><td>显示当前 WiFi 连接详情：SSID、BSSID、信号强度、频率、网关、子网掩码、DNS 服务器、DHCP 信息</td></tr><tr><td><strong>Ping 工具</strong></td><td>测试网络连通性与延迟，支持自定义包数量、超时时间和包大小，提供连续 Ping 模式</td></tr><tr><td><strong>路由追踪</strong></td><td>Traceroute，显示每一跳的 IP 和 RTT（三次探测），支持最大 30 跳</td></tr></tbody></table><h3 id="高级网络工具（深度诊断）">高级网络工具（深度诊断）</h3><table><thead><tr><th>工具</th><th>功能说明</th></tr></thead><tbody><tr><td><strong>端口扫描</strong></td><td>TCP Connect 扫描，三种模式：快速扫描（23 个常用端口）、自定义端口范围、全端口扫描（1-65535，100 端口并行分批）</td></tr><tr><td><strong>局域网扫描</strong></td><td>扫描局域网内 1-254 所有设备，检测 IP、MAC 地址、主机名、厂商信息（支持 Apple、小米、华为、Raspberry Pi、Espressif 等主流 OUI 识别）</td></tr><tr><td><strong>DNS 查询</strong></td><td>支持 A/AAAA/MX/NS/TXT/CNAME 多种记录类型查询</td></tr><tr><td><strong>DNS 基准测试</strong></td><td>对比测试多个 DNS 服务器的解析速度</td></tr><tr><td><strong>Whois 查询</strong></td><td>查询域名注册信息：注册商、创建/到期日期、域名服务器等</td></tr><tr><td><strong>SSH 工具</strong></td><td>内置 SSH 客户端（基于 JSch 库），可直接连接远程服务器</td></tr><tr><td><strong>网络测速</strong></td><td>测试网络下载和上传速度</td></tr><tr><td><strong>子网计算器</strong></td><td>输入 IP/掩码，自动计算网络地址、广播地址、可用主机范围</td></tr><tr><td><strong>MAC OUI 查询</strong></td><td>根据 MAC 地址前缀查询设备厂商</td></tr><tr><td><strong>Wake-on-LAN</strong></td><td>远程唤醒局域网设备</td></tr></tbody></table><h3 id="辅助功能">辅助功能</h3><ul><li><strong>IP 地图</strong>：在 Leaflet WebView 地图上可视化显示 IP 位置</li><li><strong>设置面板</strong>：自定义 Ping 参数、扫描并发数、测速 URL、主题模式（亮色/暗色）</li><li><strong>历史记录和收藏</strong>：使用 Room 数据库保存查询历史和收藏，方便重复使用</li></ul><h2 id="三、技术栈与架构分析">三、技术栈与架构分析</h2><p>从 Android 开发角度看，IPtools 的技术选型是现代 Android 开发的典型范本。</p><h3 id="整体架构：MVVM">整体架构：MVVM</h3><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">View (Fragment) → ViewModel → Repository → DataSource (Room/OkHttp/DataStore)</span><br></pre></td></tr></tbody></table></figure><ul><li><strong>View 层</strong>：基于 Android View System（XML 布局 + ViewBinding），使用 BottomNavigationView 构建底部导航</li><li><strong>导航</strong>：Navigation Component + nav_graph.xml 集中管理 Fragment 路由</li><li><strong>ViewModel</strong>：每个工具对应一个 ViewModel，持有协程作用域，通过 LiveData 向 UI 层暴露状态</li><li><strong>Data 层</strong>：Room 数据库（query_history + favorites 两张表）、Jetpack DataStore（用户设置持久化）、OkHttp/Retrofit（网络 API）</li></ul><h3 id="关键技术组件">关键技术组件</h3><table><thead><tr><th>类别</th><th>选型</th><th>用途</th></tr></thead><tbody><tr><td>语言</td><td><strong>Kotlin</strong></td><td>100% Kotlin，无 Java 混编</td></tr><tr><td>DI</td><td><strong>Hilt</strong>（Dagger + KSP）</td><td>3 个 Module：AppModule、NetworkModule、ToolModule</td></tr><tr><td>网络</td><td><strong>OkHttp</strong> + <strong>Retrofit</strong> + <strong>Gson</strong></td><td>调用 IP API、JSON 解析</td></tr><tr><td>数据库</td><td><strong>Room</strong> + <strong>KSP</strong></td><td>查询历史和收藏持久化</td></tr><tr><td>存储</td><td><strong>Jetpack DataStore Preferences</strong></td><td>设置项持久化</td></tr><tr><td>异步</td><td><strong>Kotlin Coroutines</strong></td><td>所有网络请求和工具执行均在 IO 调度器</td></tr><tr><td>SSH</td><td><strong>JSch</strong> (0.2.16)</td><td>SSH 客户端连接</td></tr><tr><td>地图</td><td><strong>Leaflet.js</strong>（WebView）</td><td>IP 位置可视化</td></tr></tbody></table><h3 id="值得关注的代码细节">值得关注的代码细节</h3><ol><li><p><strong>依赖注入设计的 ToolModule</strong>：所有工具类（PingTool、PortScanner、TracerouteTool 等）均注册为 @Singleton，由 Hilt 统一管理生命周期。</p></li><li><p><strong>PortScanner 的分批并行扫描</strong>：全端口扫描时按 100 端口一批分组，每组内通过 async/awaitAll 并发扫描，兼顾速度与资源控制。</p></li><li><p><strong>PingTool 的双层策略</strong>：优先使用 Java InetAddress.isReachable() 实现跨平台兼容，同时保留 pingWithSystem() 回退到系统原生 ping -c 命令获取更准确的 ICMP 结果。</p></li><li><p><strong>LanScanner 的 OUI 识别</strong>：内置了 Apple、小米、华为、三星、Raspberry Pi、Espressif（乐鑫）、TP-Link 等主流厂商的 MAC OUI 数据库，无需联网即可识别设备厂商。</p></li><li><p><strong>IP 后端 API</strong>：使用 <a href="https://my.ippure.com/v1/info">https://my.ippure.com/v1/info</a> 作为 IP 查询接口（非 <a href="http://ip-api.com">ip-api.com</a>），说明开发者拥有独立的后端能力。</p></li></ol><h3 id="项目结构">项目结构</h3><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">app/src/main/</span><br><span class="line">├── java/org/zeroxin/iptools/</span><br><span class="line">│   ├── data/               # Room 数据库（DAO、Entity）</span><br><span class="line">│   ├── di/                 # Hilt 依赖注入模块</span><br><span class="line">│   ├── model/              # 数据模型（IpInfo, PingResult, PortScanResult 等）</span><br><span class="line">│   ├── network/            # 网络 API 服务（IpApiService）</span><br><span class="line">│   ├── ui/</span><br><span class="line">│   │   └── fragment/       # 所有 Fragment 界面</span><br><span class="line">│   ├── util/               # 工具类（PingTool, PortScanner 等 14 个）</span><br><span class="line">│   ├── viewmodel/          # 各页面的 ViewModel</span><br><span class="line">│   ├── IpToolsApplication.kt</span><br><span class="line">│   └── MainActivity.kt</span><br><span class="line">├── res/</span><br><span class="line">│   ├── layout/             # XML 布局文件</span><br><span class="line">│   ├── drawable/           # 图标资源</span><br><span class="line">│   ├── values/             # 字符串、颜色、主题</span><br><span class="line">│   └── navigation/         # Navigation 导航图</span><br><span class="line">└── AndroidManifest.xml</span><br></pre></td></tr></tbody></table></figure><h2 id="四、安装与构建">四、安装与构建</h2><h3 id="直接安装">直接安装</h3><p>这是 Android 原生应用，需要下载 APK 文件安装到 Android 设备上。请在项目的 <a href="https://github.com/xin-521/IPtools/releases">GitHub Releases 页面</a> 查看是否有已构建的 APK。</p><h3 id="自行构建">自行构建</h3><p>如果你有 Android 开发环境，可以自行编译：</p><p><strong>环境要求：</strong></p><ul><li>Android Studio Arctic Fox 或更高版本</li><li>JDK 11+</li><li>Android SDK 34</li></ul><p><strong>构建步骤：</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/xin-521/IPtools.git</span><br><span class="line"><span class="comment"># 使用 Android Studio 打开项目</span></span><br><span class="line"><span class="comment"># 同步 Gradle 依赖</span></span><br><span class="line"><span class="comment"># 点击 Run 或运行：</span></span><br><span class="line">./gradlew assembleDebug</span><br></pre></td></tr></tbody></table></figure><p>构建产物为 app/build/outputs/apk/ 目录下的 NetworkTools-1.1-debug.apk。</p><h3 id="所需权限">所需权限</h3><p>App 仅申请网络相关的最基本权限：</p><ul><li>INTERNET — 网络访问</li><li>ACCESS_NETWORK_STATE — 查看网络状态</li><li>ACCESS_WIFI_STATE — 查看 WiFi 信息</li><li>CHANGE_WIFI_STATE — 修改 WiFi 状态（WOL 功能需要）</li><li>CHANGE_NETWORK_STATE — 修改网络状态</li></ul><p>未申请任何敏感权限（如位置、相机、存储），隐私保护做得比较干净。</p><h2 id="五、适用场景">五、适用场景</h2><p>IPtools 的核心用户群体很明确——<strong>开发者、运维人员、网工和 IT 爱好者</strong>。</p><p>典型使用场景包括：</p><ul><li><strong>日常网络排查</strong>：检查本机 IP、Ping 目标、路由追踪定位丢包节点</li><li><strong>内网运维</strong>：局域网扫描发现设备、端口扫描检查服务暴露情况、SSH 直连服务器</li><li><strong>域名管理</strong>：DNS 查询验证解析记录、Whois 查询域名注册信息、DNS 基准测试选最快的 DNS</li><li><strong>网络规划</strong>：子网计算器快速计算 CIDR 范围、广播地址</li><li><strong>远程管理</strong>：Wake-on-LAN 开机、SSH 远程维护</li></ul><h2 id="六、总结">六、总结</h2><p>IPtools 的价值在于"<strong>集成</strong>"二字。当手机上一个 App 就能完成 Ping、端口扫描、路由追踪、Whois、SSH 等一系列操作时，工作效率的提升是很明显的。从工程角度看，它的代码质量在线——MVVM 架构清晰，Hilt + Room + DataStore 的选型符合当前 Android 开发主流标准，工具类的设计和并发控制也有值得参考的地方。</p><p>如果你需要一款全功能的网络诊断 App，或者正在学习 Android 开发中的 MVVM + Hilt 实践，这个项目都值得看一看。</p><pre><code></code></pre>]]></content>
    
    
    <summary type="html">IPtools（网络工具箱）是一个开源的 Android 网络诊断应用，集成了 IP 查询、Ping、路由追踪、端口扫描、局域网扫描、DNS 查询、Whois、SSH、测速、子网计算等十余种网络工具，采用 Kotlin + MVVM + Hilt 架构</summary>
    
    
    
    <category term="开源项目" scheme="https://www.zeroxin.xin/categories/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE/"/>
    
    
    <category term="开源项目" scheme="https://www.zeroxin.xin/tags/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE/"/>
    
    <category term="网络工具" scheme="https://www.zeroxin.xin/tags/%E7%BD%91%E7%BB%9C%E5%B7%A5%E5%85%B7/"/>
    
    <category term="Android" scheme="https://www.zeroxin.xin/tags/Android/"/>
    
    <category term="Kotlin" scheme="https://www.zeroxin.xin/tags/Kotlin/"/>
    
    <category term="MVVM" scheme="https://www.zeroxin.xin/tags/MVVM/"/>
    
  </entry>
  
  <entry>
    <title>Arkain ：注册与首购最高可得 9,900 Credits</title>
    <link href="https://www.zeroxin.xin/2026/04/14/arkain-referral-rewards-introduction/"/>
    <id>https://www.zeroxin.xin/2026/04/14/arkain-referral-rewards-introduction/</id>
    <published>2026-04-14T04:00:00.000Z</published>
    <updated>2026-04-16T04:25:58.688Z</updated>
    
    <content type="html"><![CDATA[<h1>Arkain 邀请奖励机制介绍：注册与首购最高可得 9,900 Credits</h1><p>如果你最近在关注“AI + 开发”的新形态，Arkain 是一个值得试试的平台：它把 <strong>CDE（Cloud Development Environment，云开发环境）</strong> 与 AI 能力结合起来，目标是让你更快把想法变成可运行的应用。</p><p>本文简单介绍 Arkain 平台，并把它的邀请奖励（Referral）机制用更清晰的方式整理出来，方便你在注册前快速了解“能拿到多少 credits、什么时候发放、需要满足什么条件”。</p><h2 id="Arkain-是什么？">Arkain 是什么？</h2><p>容器平台：填写邀请码获得300Credit，想体验容器服务可以一试</p><p>官方介绍是：</p><blockquote><p>Try Arkain, an AI-powered CDE where apps come to life effortlessly.</p></blockquote><p>你可以把它理解为一个偏“产品化”的云端开发环境：无需在本地折腾环境，也更容易把“写代码—运行—迭代—部署”的链路串起来，适合做原型、做小工具、做快速验证，或者在多设备之间无缝切换开发状态。</p><h2 id="邀请奖励怎么拿？核心结论">邀请奖励怎么拿？核心结论</h2><p>Arkain 的邀请奖励会同时发放给 <strong>邀请人（Referrer）</strong> 和 <strong>被邀请人（Referred Friend）</strong>，并且分为两步：</p><h3 id="Step-1：好友通过邀请链接注册">Step 1：好友通过邀请链接注册</h3><ul><li><strong>好友</strong>：+300 credits（即时发放）</li><li><strong>你</strong>：+300 credits（即时发放）</li></ul><p>要点：</p><ul><li>通过邀请链接注册时，推荐码通常会自动填入。</li><li>如果是手动输入推荐码，需要在注册时填写；<strong>注册后无法补填（不能追溯）</strong>。</li></ul><h3 id="Step-2：好友首次购买-credits（首购奖励）">Step 2：好友首次购买 credits（首购奖励）</h3><ul><li><strong>好友</strong>：+600 credits</li><li><strong>你</strong>：+600 credits</li></ul><p>要点（来自官方规则）：</p><ul><li><strong>首购门槛</strong>：好友首次购买 credits 需 <strong>至少 $10</strong>。</li><li><strong>发放时间</strong>：首购完成后会进入 <strong>7 天确认期</strong>，奖励在 <strong>00:00 UTC</strong> 统一结算并发放。</li></ul><h2 id="“最高-9-900-credits”-是怎么来的？">“最高 9,900 credits” 是怎么来的？</h2><p>在 Arkain 的邀请页面中，会展示一个进度范围，标注为：</p><ul><li>Referral start：5,000</li><li>earned：9,900</li></ul><p>这通常表示邀请奖励存在一定的累计上限/阶段目标（页面显示最高到 <strong>9,900 credits</strong>）。不过页面里同时还有 “Expiration &amp; Limits / Refunds &amp; Exceptions / Fair play &amp; Terms” 等条款入口，具体细则可能会调整。</p><h2 id="我的专属注册链接（推荐码已自动填好）">我的专属注册链接（推荐码已自动填好）</h2><p>如果你想直接体验并领取奖励，可以用我的链接注册（推荐码会自动带上）：</p><ul><li><code>https://account.arkain.io/signup?ref=FRD-04OTNC</code></li></ul><p>也可以在注册时手动填写推荐码（如果页面提供该入口）：<strong>FRD-04OTNC</strong></p><h2 id="常见问题（按官方提示整理）">常见问题（按官方提示整理）</h2><h3 id="1）可以注册后再填推荐码吗？">1）可以注册后再填推荐码吗？</h3><p>不行。官方说明 <strong>推荐码必须在注册时填写</strong>，无法补填、无法追溯。</p><h3 id="2）好友买了-credits，为什么-600-credits-还没到账？">2）好友买了 credits，为什么 600 credits 还没到账？</h3><p>首购奖励有 <strong>7 天确认期</strong>，并且在 <strong>00:00 UTC</strong> 发放。</p><hr><p><em>本文内容基于 Arkain 官方邀请页面信息整理（以官方页面条款为准）。</em></p>]]></content>
    
    
    <summary type="html">介绍 Arkain（AI-powered CDE）平台与邀请奖励机制：通过专属链接注册双方各得 300 credits，首次购买 credits（$10 起）双方各得 600 credits，奖励含 7 天确认期，最高可达 9,900 credits。</summary>
    
    
    
    <category term="技术分享" scheme="https://www.zeroxin.xin/categories/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="AI" scheme="https://www.zeroxin.xin/tags/AI/"/>
    
    <category term="Arkain" scheme="https://www.zeroxin.xin/tags/Arkain/"/>
    
    <category term="容器平台" scheme="https://www.zeroxin.xin/tags/%E5%AE%B9%E5%99%A8%E5%B9%B3%E5%8F%B0/"/>
    
    <category term="CDE" scheme="https://www.zeroxin.xin/tags/CDE/"/>
    
    <category term="邀请奖励" scheme="https://www.zeroxin.xin/tags/%E9%82%80%E8%AF%B7%E5%A5%96%E5%8A%B1/"/>
    
    <category term="Credits" scheme="https://www.zeroxin.xin/tags/Credits/"/>
    
  </entry>
  
  <entry>
    <title>PageAgent：嵌入网页的 GUI 智能体，用自然语言控制 Web 界面</title>
    <link href="https://www.zeroxin.xin/2026/03/14/page-agent-introduction/"/>
    <id>https://www.zeroxin.xin/2026/03/14/page-agent-introduction/</id>
    <published>2026-03-14T04:00:00.000Z</published>
    <updated>2026-06-18T09:19:20.985Z</updated>
    
    <content type="html"><![CDATA[<h1>PageAgent：嵌入网页的 GUI 智能体，用自然语言控制 Web 界面</h1><h2 id="项目概述">项目概述</h2><p><a href="https://github.com/alibaba/page-agent">PageAgent</a> 是阿里巴巴开源的一个创新项目，它被称为"生活在你的网页中的 GUI 智能体"。这个项目允许开发者通过自然语言来控制 Web 界面，无需浏览器扩展、Python 环境或无头浏览器，一切都发生在网页内部的 JavaScript 环境中。</p><h3 id="核心特性">核心特性</h3><ul><li><strong>🎯 易于集成</strong>：无需浏览器扩展/Python/无头浏览器，仅需页内 JavaScript</li><li><strong>📖 基于文本的 DOM 操作</strong>：不需要截图、多模态 LLM 或特殊权限</li><li><strong>🧠 自带 LLM</strong>：支持自定义大语言模型配置</li><li><strong>🎨 精美 UI</strong>：带有人类在环路的交互式界面</li><li><strong>🐙 可选 Chrome 扩展</strong>：支持多页面任务处理</li></ul><h2 id="技术架构">技术架构</h2><h3 id="设计理念">设计理念</h3><p>PageAgent 的设计哲学是<strong>客户端 Web 增强</strong>，而非服务器端自动化。它基于优秀的 <a href="https://github.com/browser-use/browser-use">browser-use</a> 项目进行构建，继承了其在 Web 自动化和 DOM 交互模式方面的最佳实践。</p><h3 id="技术特点">技术特点</h3><ol><li><strong>纯前端实现</strong>：所有逻辑都在浏览器中运行，不需要后端服务</li><li><strong>文本化 DOM 操作</strong>：通过分析 DOM 结构而非屏幕截图来理解页面</li><li><strong>LLM 驱动</strong>：利用大语言模型理解自然语言指令并转化为 DOM 操作</li><li><strong>零权限要求</strong>：不需要特殊的浏览器权限或扩展</li></ol><h2 id="快速开始">快速开始</h2><h3 id="一行代码集成">一行代码集成</h3><p>最快的体验方式是使用官方提供的演示 CDN（使用免费的测试 LLM API）：</p><figure class="highlight html"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://cdn.jsdelivr.net/npm/page-agent@1.5.7/dist/iife/page-agent.demo.js"</span> <span class="attr">crossorigin</span>=<span class="string">"true"</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></tbody></table></figure><blockquote><p>⚠️ 注意：此演示 CDN 仅用于技术评估，使用时需同意其条款。</p></blockquote><h3 id="国内镜像">国内镜像</h3><p>为了获得更好的访问速度，可以使用国内镜像：</p><figure class="highlight html"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://registry.npmmirror.com/page-agent/1.5.7/files/dist/iife/page-agent.demo.js"</span> <span class="attr">crossorigin</span>=<span class="string">"true"</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></tbody></table></figure><h3 id="NPM-安装">NPM 安装</h3><p>对于生产环境，建议通过 NPM 安装：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install page-agent</span><br></pre></td></tr></tbody></table></figure><h3 id="编程式使用">编程式使用</h3><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> { <span class="title class_">PageAgent</span> } <span class="keyword">from</span> <span class="string">'page-agent'</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> agent = <span class="keyword">new</span> <span class="title class_">PageAgent</span>({</span><br><span class="line">    <span class="attr">model</span>: <span class="string">'qwen3.5-plus'</span>,</span><br><span class="line">    <span class="attr">baseURL</span>: <span class="string">'https://dashscope.aliyuncs.com/compatible-mode/v1'</span>,</span><br><span class="line">    <span class="attr">apiKey</span>: <span class="string">'YOUR_API_KEY'</span>,</span><br><span class="line">    <span class="attr">language</span>: <span class="string">'en-US'</span>,</span><br><span class="line">})</span><br><span class="line"></span><br><span class="line"><span class="keyword">await</span> agent.<span class="title function_">execute</span>(<span class="string">'点击登录按钮'</span>)</span><br></pre></td></tr></tbody></table></figure><h2 id="应用场景">应用场景</h2><h3 id="1-SaaS-AI-助手">1. SaaS AI 助手</h3><p>在你的产品中快速集成 AI 助手功能，无需重写后端架构。只需几行代码，就能让用户通过自然语言与你的 SaaS 应用交互。</p><p><strong>示例场景</strong>：</p><ul><li>用户说"帮我创建一个新的项目"，自动填写表单并提交</li><li>用户说"显示上周的数据报告"，自动导航到报表页面并筛选时间范围</li></ul><h3 id="2-智能表单填充">2. 智能表单填充</h3><p>将需要多次点击的复杂工作流程简化为一句话。特别适合 ERP、CRM 和管理系统。</p><p><strong>示例场景</strong>：</p><ul><li>自动填写复杂的采购申请表单</li><li>批量更新客户信息</li><li>自动化数据录入任务</li></ul><h3 id="3-无障碍访问">3. 无障碍访问</h3><p>通过自然语言让任何 Web 应用对残障人士更加友好。支持语音命令、屏幕阅读器，实现零障碍交互。</p><p><strong>示例场景</strong>：</p><ul><li>视障用户通过语音命令操作网页</li><li>行动不便用户通过简单指令完成复杂操作</li></ul><h3 id="4-跨页面智能体">4. 跨页面智能体</h3><p>通过可选的 Chrome 扩展，让你的智能体能够跨浏览器标签页工作，实现更复杂的自动化任务。</p><p><strong>示例场景</strong>：</p><ul><li>从一个页面抓取数据并填充到另一个页面</li><li>跨多个系统协调工作流程</li><li>自动化需要多步骤的业务流程</li></ul><h2 id="技术深度解析">技术深度解析</h2><h3 id="DOM-操作机制">DOM 操作机制</h3><p>PageAgent 不需要截图或使用多模态模型，它通过以下方式理解页面：</p><ol><li><strong>DOM 树分析</strong>：解析页面的 DOM 结构，提取可交互元素</li><li><strong>元素索引</strong>：为每个可操作元素分配唯一标识</li><li><strong>文本化描述</strong>：将页面结构转化为 LLM 可理解的文本格式</li><li><strong>指令映射</strong>：将自然语言指令映射到具体的 DOM 操作</li></ol><h3 id="LLM-集成">LLM 集成</h3><p>PageAgent 支持自定义 LLM 配置，这意味着：</p><ul><li>可以使用阿里云通义千问（DashScope）</li><li>可以部署自己的 LLM 服务</li><li>可以根据需求选择不同的模型</li><li>完全控制 API 调用和成本</li></ul><h3 id="安全考虑">安全考虑</h3><p>由于所有操作都在客户端进行，PageAgent 具有以下安全特性：</p><ul><li><strong>无服务器依赖</strong>：不依赖外部服务器处理敏感数据</li><li><strong>用户可控</strong>：所有操作都在用户浏览器中执行</li><li><strong>透明化</strong>：用户可以清楚看到每一步操作</li></ul><h2 id="与其他方案的对比">与其他方案的对比</h2><table><thead><tr><th>特性</th><th>PageAgent</th><th>传统 RPA</th><th>浏览器扩展</th><th>服务端自动化</th></tr></thead><tbody><tr><td>部署难度</td><td>极低（一行代码）</td><td>高</td><td>中</td><td>高</td></tr><tr><td>用户权限</td><td>无需特殊权限</td><td>需要</td><td>需要扩展权限</td><td>需要服务器</td></tr><tr><td>跨平台</td><td>✅ 所有现代浏览器</td><td>❌ 通常限平台</td><td>❌ 限特定浏览器</td><td>✅ 服务端</td></tr><tr><td>维护成本</td><td>低</td><td>高</td><td>中</td><td>高</td></tr><tr><td>用户体验</td><td>原生集成</td><td>独立应用</td><td>扩展图标</td><td>不可见</td></tr></tbody></table><h2 id="实际案例">实际案例</h2><h3 id="案例-1：电商后台管理系统">案例 1：电商后台管理系统</h3><p><strong>场景</strong>：客服需要处理大量订单，每个订单需要在系统中进行多次点击和表单填写。</p><p><strong>解决方案</strong>：</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 集成 PageAgent 后，客服只需说：</span></span><br><span class="line"><span class="string">"把订单#12345 的状态改为已发货，并发送通知邮件"</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// PageAgent 自动执行：</span></span><br><span class="line"><span class="comment">// 1. 搜索订单#12345</span></span><br><span class="line"><span class="comment">// 2. 点击进入详情页</span></span><br><span class="line"><span class="comment">// 3. 点击"发货"按钮</span></span><br><span class="line"><span class="comment">// 4. 填写物流信息</span></span><br><span class="line"><span class="comment">// 5. 点击"发送通知"</span></span><br></pre></td></tr></tbody></table></figure><p><strong>效果</strong>：原本需要 5-6 次点击的操作，现在一句话完成。</p><h3 id="案例-2：数据分析平台">案例 2：数据分析平台</h3><p><strong>场景</strong>：业务人员需要定期从多个维度查看数据报表。</p><p><strong>解决方案</strong>：</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 业务人员说：</span></span><br><span class="line"><span class="string">"显示上个月华东地区的销售数据，按产品类别排序"</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// PageAgent 自动：</span></span><br><span class="line"><span class="comment">// 1. 导航到报表页面</span></span><br><span class="line"><span class="comment">// 2. 选择时间范围为"上个月"</span></span><br><span class="line"><span class="comment">// 3. 筛选地区为"华东"</span></span><br><span class="line"><span class="comment">// 4. 设置排序为"按产品类别"</span></span><br></pre></td></tr></tbody></table></figure><h2 id="贡献与社区">贡献与社区</h2><p>PageAgent 是一个开源项目，欢迎社区贡献。项目遵循以下原则：</p><ul><li>接受人类贡献，不接受完全由机器人/AI 生成的 PR</li><li>遵循 <a href="https://github.com/alibaba/page-agent/blob/main/CONTRIBUTING.md">CONTRIBUTING.md</a> 中的指南</li><li>遵守行为准则</li></ul><h2 id="许可证">许可证</h2><ul><li><strong>开源协议</strong>：MIT License</li><li><strong>版权信息</strong>：Copyright © Alibaba</li><li><strong>衍生项目</strong>：基于 browser-use 项目构建（MIT License）</li></ul><h2 id="总结">总结</h2><p>PageAgent 代表了一种新的 Web 交互范式：将 AI 智能体直接嵌入到网页中，让用户能够用最自然的方式——语言——来操作界面。对于开发者来说，这意味着：</p><ol><li><strong>极低的集成成本</strong>：一行代码即可启用 AI 交互能力</li><li><strong>灵活的应用场景</strong>：从简单的表单填充到复杂的跨页面工作流</li><li><strong>完全的控制权</strong>：可以选择自己的 LLM，控制成本和性能</li><li><strong>更好的用户体验</strong>：为用户提供更智能、更便捷的交互方式</li></ol><p>随着大语言模型的普及和成熟，像 PageAgent 这样的工具将会成为 Web 应用的标准配置，让人机交互变得更加自然和高效。</p><h2 id="相关链接">相关链接</h2><ul><li><strong>项目仓库</strong>：<a href="https://github.com/alibaba/page-agent">https://github.com/alibaba/page-agent</a></li><li><strong>在线演示</strong>：<a href="https://github.com/alibaba/page-agent">🚀 Demo</a></li><li><strong>官方文档</strong>：<a href="https://github.com/alibaba/page-agent">📖 Documentation</a></li><li><strong>browser-use 项目</strong>：<a href="https://github.com/browser-use/browser-use">https://github.com/browser-use/browser-use</a></li></ul><hr><p><em>本文基于 PageAgent 项目官方文档编写，项目信息截至 2026 年 3 月 14 日。</em></p>]]></content>
    
    
    <summary type="html">PageAgent是阿里巴巴开源的网页内GUI智能体，无需浏览器扩展或Python环境即可通过自然语言控制Web界面。本文介绍其基于DOM文本操作的独特架构、JavaScript内嵌集成方式、LLM配置选项及多页面任务处理能力，探索AI Agent在前端领域的创新应用</summary>
    
    
    
    <category term="技术分享" scheme="https://www.zeroxin.xin/categories/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/"/>
    
    
    <category term="PageAgent" scheme="https://www.zeroxin.xin/tags/PageAgent/"/>
    
    <category term="AI Agent" scheme="https://www.zeroxin.xin/tags/AI-Agent/"/>
    
    <category term="前端工具，自动化" scheme="https://www.zeroxin.xin/tags/%E5%89%8D%E7%AB%AF%E5%B7%A5%E5%85%B7%EF%BC%8C%E8%87%AA%E5%8A%A8%E5%8C%96/"/>
    
  </entry>
  
  <entry>
    <title>Neko Master：现代化的网络流量可视化分析面板</title>
    <link href="https://www.zeroxin.xin/2026/02/17/Neko-Master-%E7%BD%91%E7%BB%9C%E6%B5%81%E9%87%8F%E5%8F%AF%E8%A7%86%E5%8C%96%E5%88%86%E6%9E%90%E9%9D%A2%E6%9D%BF/"/>
    <id>https://www.zeroxin.xin/2026/02/17/Neko-Master-%E7%BD%91%E7%BB%9C%E6%B5%81%E9%87%8F%E5%8F%AF%E8%A7%86%E5%8C%96%E5%88%86%E6%9E%90%E9%9D%A2%E6%9D%BF/</id>
    <published>2026-02-17T02:00:00.000Z</published>
    <updated>2026-06-18T09:21:44.219Z</updated>
    
    <content type="html"><![CDATA[<h1>Neko Master：让你的网络流量一目了然</h1><p>在日常的网络管理和运维工作中，了解网络流量的使用情况是一项基础但重要的需求。无论是家庭网络还是小型企业环境，能够清晰地看到流量走向、识别异常访问、审计网络使用情况，都是保障网络安全和优化网络性能的关键。Neko Master 作为一款现代化的网络流量可视化与分析工具，为这一问题提供了优雅的解决方案。</p><table>  <tbody><tr>    <td align="center" width="50%">      <img src="https://github.com/xin-521/imgbed-storage/blob/main/neko-master-regions-light.png?raw=true" alt="Neko Master Preview (Light 1)">    </td>    <td align="center" width="50%">      <img src="https://github.com/xin-521/imgbed-storage/blob/main/neko-master-overview-light.png?raw=true" alt="Neko Master Preview (Light 2)">    </td>  </tr>  <tr>    <td align="center" width="50%">      <img src="https://github.com/xin-521/imgbed-storage/blob/main/neko-master-domains-dark.png?raw=true" alt="Neko Master Preview (Dark 1)">    </td>    <td align="center" width="50%">      <img src="https://github.com/xin-521/imgbed-storage/blob/main/neko-master-rules-dark.png?raw=true" alt="Neko Master Preview (Dark 2)">    </td>  </tr></tbody></table><p>Neko Master 是一个专注于网络流量分析与可视化的开源项目，如同其名字中的 “Neko”（日语中意为"猫"）一样，它安静而敏锐，能够轻量、精确地对网络流量进行分析与可视化展示。</p><p>项目支持实时监控、流量审计、多网关管理，所有数据均来源于用户自有网络环境，不提供任何网络接入服务或代理订阅功能。</p><p>项目地址：<a href="https://github.com/foru17/neko-master">https://github.com/foru17/neko-master</a></p><p>在线演示：<a href="https://neko-master.is26.com">https://neko-master.is26.com</a>（访问密码：neko2026）</p><h1>一、功能特性介绍</h1><h2 id="核心亮点">核心亮点</h2><p>Neko Master 提供了完整的网络流量监控解决方案：</p><ul><li><strong>实时监控</strong>：通过 WebSocket 实现数据的实时推送，让流量变化一目了然</li><li><strong>流量审计</strong>：详细记录和分析网络流量数据，支持历史查询和统计</li><li><strong>多网关管理</strong>：支持同时管理多个网关的流量数据，适合复杂网络环境</li><li><strong>IP 地理位置查询</strong>：支持本地 MMDB 数据库或在线查询，了解流量来源</li><li><strong>数据可视化</strong>：现代化的仪表盘界面，图表清晰直观</li></ul><h2 id="技术架构">技术架构</h2><p>项目采用现代化的技术栈构建：</p><ul><li><strong>前端</strong>：Next.js + React，提供流畅的用户体验</li><li><strong>后端</strong>：Node.js，轻量高效</li><li><strong>数据库</strong>：SQLite，无需额外数据库服务，数据存储简单可靠</li><li><strong>容器化</strong>：完整的 Docker 支持，一键部署</li></ul><h2 id="安全与隐私">安全与隐私</h2><p>Neko Master 非常注重用户隐私和数据安全：</p><ul><li>所有数据均来源于用户自有网络环境</li><li>不提供任何网络接入服务、代理订阅或跨网络连接功能</li><li>支持本地部署，数据完全由用户掌控</li><li>提供访问认证机制，保护面板安全</li></ul><h1>二、快速上手</h1><h2 id="方式一：Docker-Compose（推荐）">方式一：Docker Compose（推荐）</h2><p>最简部署方式，仅暴露 Web UI 端口：</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="attr">neko-master:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">foru17/neko-master:latest</span></span><br><span class="line">    <span class="attr">container_name:</span> <span class="string">neko-master</span></span><br><span class="line">    <span class="attr">restart:</span> <span class="string">unless-stopped</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">"3000:3000"</span></span><br><span class="line">    <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./data:/app/data</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./geoip:/app/data/geoip:ro</span></span><br><span class="line">    <span class="attr">environment:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">NODE_ENV=production</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">DB_PATH=/app/data/stats.db</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">COOKIE_SECRET=${COOKIE_SECRET}</span></span><br></pre></td></tr></tbody></table></figure><p>建议在 <code>docker-compose.yml</code> 同目录创建 <code>.env</code> 文件配置 Cookie 密钥：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">COOKIE_SECRET=&lt;至少32字节随机字符串&gt;</span><br></pre></td></tr></tbody></table></figure><p>使用 <code>openssl rand -hex 32</code> 生成安全的随机字符串。</p><p>启动服务：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker compose up -d</span><br></pre></td></tr></tbody></table></figure><p>访问 <a href="http://localhost:3000">http://localhost:3000</a> 即可看到管理面板。</p><h2 id="方式二：实时-WebSocket-部署">方式二：实时 WebSocket 部署</h2><p>如果需要实时数据推送功能，可以额外暴露 WebSocket 端口：</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="attr">neko-master:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">foru17/neko-master:latest</span></span><br><span class="line">    <span class="attr">container_name:</span> <span class="string">neko-master</span></span><br><span class="line">    <span class="attr">restart:</span> <span class="string">unless-stopped</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">"3000:3000"</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">"3002:3002"</span></span><br><span class="line">    <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./data:/app/data</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./geoip:/app/data/geoip:ro</span></span><br><span class="line">    <span class="attr">environment:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">NODE_ENV=production</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">DB_PATH=/app/data/stats.db</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">COOKIE_SECRET=${COOKIE_SECRET}</span></span><br></pre></td></tr></tbody></table></figure><h2 id="方式三：一键脚本">方式三：一键脚本</h2><p>对于不熟悉 Docker 的用户，项目提供了自动检测端口冲突并配置的一键脚本：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -fsSL https://raw.githubusercontent.com/foru17/neko-master/main/setup.sh | bash</span><br></pre></td></tr></tbody></table></figure><p>脚本会自动完成以下工作：</p><ul><li>下载 docker-compose.yml 配置文件</li><li>检测默认端口（3000/3001/3002）是否被占用</li><li>提供可用的替代端口选项</li><li>创建配置文件并启动服务</li></ul><h2 id="方式四：源码运行">方式四：源码运行</h2><p>开发者可以选择源码方式运行：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/foru17/neko-master.git</span><br><span class="line"><span class="built_in">cd</span> neko-master</span><br><span class="line">pnpm install</span><br><span class="line"><span class="built_in">cp</span> apps/collector/.env.example apps/collector/.env</span><br><span class="line">pnpm dev</span><br></pre></td></tr></tbody></table></figure><p>访问 <a href="http://localhost:3000">http://localhost:3000</a> 即可使用。</p><h1>三、接入网关数据</h1><p>Neko Master 支持接入多种网关的流量数据，以 Clash 为例：</p><ol><li>在 Clash 配置文件中添加 RESTful API 支持：</li></ol><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">external-controller:</span> <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span><span class="string">:9090</span></span><br><span class="line"><span class="attr">secret:</span> <span class="string">"your-secret"</span></span><br></pre></td></tr></tbody></table></figure><ol start="2"><li>在 Neko Master 面板的设置页面添加网关配置：<ul><li>名称：自定义网关名称</li><li>地址：Clash API 地址（如 <code>http://192.168.1.1:9090</code>）</li><li>密钥：Clash 配置的 secret</li></ul></li></ol><p>添加完成后，面板会自动开始收集和展示该网关的流量数据。</p><h1>四、总结</h1><p>Neko Master 是一款设计优雅、功能实用的网络流量分析工具。从安装到使用，整个过程非常轻量化，通过 Docker 即可快速部署。</p><p>对于有网络流量监控需求的用户，无论是家庭网络管理还是小型企业运维，都可以尝试这个工具。它的实时监控和流量审计功能，能够帮助你更好地了解和管控网络使用情况。</p><p>项目遵循 MIT 协议开源，欢迎有开发能力的用户参与贡献。</p>]]></content>
    
    
    <summary type="html">Neko-Master是一个功能强大的网络流量可视化分析面板，支持实时流量监控、数据包捕获、协议分析和图表化展示。本文介绍其架构设计、网络数据采集引擎、可视化仪表盘定制能力以及在企业网络运维和流量分析场景中的实际应用</summary>
    
    
    
    
    <category term="开源项目" scheme="https://www.zeroxin.xin/tags/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE/"/>
    
    <category term="网络监控" scheme="https://www.zeroxin.xin/tags/%E7%BD%91%E7%BB%9C%E7%9B%91%E6%8E%A7/"/>
    
    <category term="流量分析" scheme="https://www.zeroxin.xin/tags/%E6%B5%81%E9%87%8F%E5%88%86%E6%9E%90/"/>
    
    <category term="Docker" scheme="https://www.zeroxin.xin/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>EverMsg：永久记录在比特币区块链上的永恒印记</title>
    <link href="https://www.zeroxin.xin/2026/01/18/evermsg-introduction/"/>
    <id>https://www.zeroxin.xin/2026/01/18/evermsg-introduction/</id>
    <published>2026-01-17T16:00:00.000Z</published>
    <updated>2026-06-18T09:19:20.982Z</updated>
    
    <content type="html"><![CDATA[<h1>EverMsg：探索比特币区块链上的永恒印记</h1><p>在数字化时代，信息的保存往往面临着被删除、篡改或丢失的风险。然而，区块链技术的出现为信息的永恒存储提供了可能。<strong>EverMsg</strong> 正是这样一个致力于挖掘和展示这些永恒印记的平台。</p><h2 id="什么是-EverMsg？">什么是 EverMsg？</h2><p><a href="https://www.evermsg.com/zh">EverMsg</a> 是一个现代化的比特币 <strong>OP_RETURN</strong> 数据浏览器。它的核心理念是：“每一条印记都被永久记录在区块链上，不可篡改，永不消失。”</p><p>通过 EverMsg，用户可以浏览那些被刻入比特币区块链的各种信息。这些信息与比特币共存亡，只要比特币网络还在运行，这些数据就永远存在。</p><h2 id="核心特性">核心特性</h2><h3 id="1-永久存储">1. 永久存储</h3><p>EverMsg 展示的消息并非存储在普通的中心化服务器上，而是直接刻入比特币区块链。这意味着这些消息与区块链共存亡，实现了真正意义上的永久存储。</p><h3 id="2-不可篡改">2. 不可篡改</h3><p>基于区块链的特性，一旦消息通过 OP_RETURN 写入区块并被确认，就成为不可变历史的一部分。任何人都无法修改、删除或审查这些内容，甚至连原始发送者也不行。</p><h3 id="3-全球可见">3. 全球可见</h3><p>区块链是公开透明的账本，世界上任何人都可以查阅这些永恒的印记。EverMsg 提供了一个用户友好的界面，将这些技术性的链上数据转化为易读的格式，供全球用户浏览。</p><h2 id="技术原理：OP-RETURN">技术原理：OP_RETURN</h2><p>EverMsg 的技术基础是比特币脚本中的 <strong>OP_RETURN</strong> 操作码。</p><ul><li><strong>功能</strong>：允许用户在比特币交易中嵌入最多 <strong>80 字节</strong> 的任意数据。</li><li><strong>应用</strong>：非常适合存储简短的消息、誓言、时间戳、存证或任何希望永久保存的简短文本。</li><li><strong>即时性</strong>：新的 OP_RETURN 消息通常在比特币网络确认后几分钟内即可在 EverMsg 上检索到。</li></ul><h2 id="常见问题解答">常见问题解答</h2><p><strong>Q: 使用 EverMsg 浏览消息需要付费吗？</strong><br>A: 不需要。在 EverMsg 上浏览和阅读 OP_RETURN 消息是完全免费的。</p><p><strong>Q: 如何发布自己的永恒印记？</strong><br>A: EverMsg 本身是一个浏览器。要创建 OP_RETURN 交易（即发布消息），您需要使用支持此功能的比特币钱包或通过专门的服务。发布消息时，您需要向矿工支付比特币交易费用。</p><p><strong>Q: 它可以支持哪些语言？</strong><br>A: EverMsg 支持任何语言的消息。其界面本身也支持英语、中文、日语、韩语和西班牙语，并提供自动语言检测和筛选功能。</p><h2 id="结语">结语</h2><p>EverMsg 不仅仅是一个工具，它更像是一个数字时代的"铭文墙"。在这里，你可以看到人们留下的各种讯息——可能是对爱人的誓言，可能是对某个时刻的纪念，也可能是某种思想的表达。</p><p>探索比特币区块链上的永恒消息，见证人类在数字时代留下的不可磨灭的印记。</p><p><a href="https://www.evermsg.com/zh">访问 EverMsg 官网</a></p>]]></content>
    
    
    <summary type="html">EverMsg是一个现代化的比特币OP_RETURN数据浏览器，展示被永久刻入区块链的不可篡改信息。本文介绍比特币永恒印记的原理、OP_RETURN数据结构、使用场景以及如何通过EverMsg浏览和验证这些与区块链共存亡的历史记录，感受去中心化存储的独特魅力</summary>
    
    
    
    
    <category term="EverMsg" scheme="https://www.zeroxin.xin/tags/EverMsg/"/>
    
    <category term="比特币" scheme="https://www.zeroxin.xin/tags/%E6%AF%94%E7%89%B9%E5%B8%81/"/>
    
    <category term="永恒印记" scheme="https://www.zeroxin.xin/tags/%E6%B0%B8%E6%81%92%E5%8D%B0%E8%AE%B0/"/>
    
    <category term="区块链" scheme="https://www.zeroxin.xin/tags/%E5%8C%BA%E5%9D%97%E9%93%BE/"/>
    
    <category term="OP_RETURN" scheme="https://www.zeroxin.xin/tags/OP-RETURN/"/>
    
    <category term="Web3" scheme="https://www.zeroxin.xin/tags/Web3/"/>
    
  </entry>
  
  <entry>
    <title>RaTeX：革命性的LaTeX实时渲染工具</title>
    <link href="https://www.zeroxin.xin/2025/12/28/ratex-introduction/"/>
    <id>https://www.zeroxin.xin/2025/12/28/ratex-introduction/</id>
    <published>2025-12-27T16:00:00.000Z</published>
    <updated>2026-06-18T09:21:27.938Z</updated>
    
    <content type="html"><![CDATA[<h1>RaTeX：革命性的LaTeX实时渲染工具</h1><h2 id="项目概述">项目概述</h2><p><a href="https://github.com/erweixin/RaTeX">RaTeX</a> 是一款专为LaTeX用户设计的实时渲染工具，它将传统的"编写-编译-预览"工作流程转变为流畅的实时编辑体验。通过即时渲染技术，RaTeX让用户能够在输入LaTeX代码的同时看到最终效果，极大提升了文档编写效率。</p><h3 id="核心特性">核心特性</h3><ul><li><strong>⚡ 实时渲染</strong>：输入即所见，无需等待编译</li><li><strong>🎯 智能补全</strong>：LaTeX命令和环境的智能提示</li><li><strong>📱 现代化界面</strong>：简洁直观的用户体验</li><li><strong>🔧 轻量高效</strong>：快速启动，低资源占用</li><li><strong>🌐 跨平台支持</strong>：支持主流操作系统</li></ul><h2 id="为什么选择RaTeX？">为什么选择RaTeX？</h2><h3 id="传统LaTeX编辑器的痛点">传统LaTeX编辑器的痛点</h3><p>传统的LaTeX编辑流程存在诸多不便：</p><ol><li><strong>编译等待</strong>：每次修改都需要重新编译，打断思路</li><li><strong>错误定位困难</strong>：编译错误信息不够直观</li><li><strong>预览不便</strong>：需要在编辑器和PDF查看器间切换</li><li><strong>学习曲线陡峭</strong>：新手难以快速上手</li></ol><h3 id="RaTeX的解决方案">RaTeX的解决方案</h3><p>RaTeX通过创新的实时渲染技术，完美解决了这些问题：</p><ul><li><strong>即时反馈</strong>：输入代码立即看到效果，所见即所得</li><li><strong>错误提示</strong>：实时显示语法错误，快速定位问题</li><li><strong>统一界面</strong>：编辑和预览在同一窗口，无需切换</li><li><strong>降低门槛</strong>：直观的操作方式，新手友好</li></ul><h2 id="核心功能详解">核心功能详解</h2><h3 id="1-实时渲染引擎">1. 实时渲染引擎</h3><p>RaTeX的核心是其高性能的实时渲染引擎：</p><p><strong>技术特点</strong>：</p><ul><li>增量渲染：只更新修改部分，提升性能</li><li>异步处理：不阻塞编辑操作</li><li>智能缓存：减少重复计算</li></ul><p><strong>渲染速度</strong>：</p><ul><li>简单公式：&lt; 10ms</li><li>复杂文档：&lt; 100ms</li><li>大型项目：&lt; 500ms</li></ul><h3 id="2-智能编辑辅助">2. 智能编辑辅助</h3><p><strong>命令补全</strong>：</p><ul><li>自动提示LaTeX命令</li><li>参数提示和说明</li><li>常用模板快速插入</li></ul><p><strong>语法高亮</strong>：</p><ul><li>多层次语法着色</li><li>括号匹配提示</li><li>错误标记显示</li></ul><p><strong>代码片段</strong>：</p><ul><li>内置常用模板</li><li>自定义代码片段</li><li>快捷键快速插入</li></ul><h3 id="3-数学公式支持">3. 数学公式支持</h3><p>RaTeX对数学公式提供了完善的支持：</p><p><strong>行内公式</strong>：</p><figure class="highlight latex"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">$</span>E = mc<span class="built_in">^</span>2<span class="built_in">$</span></span><br></pre></td></tr></tbody></table></figure><p><strong>独立公式</strong>：</p><figure class="highlight latex"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">$</span><span class="built_in">$</span></span><br><span class="line"><span class="keyword">\int</span><span class="built_in">_</span>{-<span class="keyword">\infty</span>}<span class="built_in">^</span>{<span class="keyword">\infty</span>} e<span class="built_in">^</span>{-x<span class="built_in">^</span>2} dx = <span class="keyword">\sqrt</span>{<span class="keyword">\pi</span>}</span><br><span class="line"><span class="built_in">$</span><span class="built_in">$</span></span><br></pre></td></tr></tbody></table></figure><p><strong>复杂环境</strong>：</p><ul><li>align环境</li><li>matrix环境</li><li>cases环境</li><li>自定义环境</li></ul><h3 id="4-文档结构管理">4. 文档结构管理</h3><p><strong>大纲视图</strong>：</p><ul><li>章节结构一目了然</li><li>快速跳转定位</li><li>拖拽调整顺序</li></ul><p><strong>引用管理</strong>：</p><ul><li>自动识别标签</li><li>智能引用补全</li><li>交叉引用检查</li></ul><p><strong>图表管理</strong>：</p><ul><li>图片预览</li><li>表格可视化编辑</li><li>浮动体位置调整</li></ul><h2 id="使用场景">使用场景</h2><h3 id="学术论文写作">学术论文写作</h3><p><strong>适用场景</strong>：</p><ul><li>期刊论文撰写</li><li>学位论文编写</li><li>会议论文投稿</li><li>技术报告制作</li></ul><p><strong>优势</strong>：</p><ul><li>实时预览公式效果</li><li>快速调整格式</li><li>高效管理参考文献</li><li>符合学术规范</li></ul><h3 id="数学教学">数学教学</h3><p><strong>教师应用</strong>：</p><ul><li>制作课件</li><li>编写习题</li><li>准备讲义</li><li>设计试卷</li></ul><p><strong>学生应用</strong>：</p><ul><li>完成作业</li><li>记录笔记</li><li>准备报告</li><li>学习LaTeX</li></ul><h3 id="技术文档">技术文档</h3><p><strong>文档类型</strong>：</p><ul><li>API文档</li><li>技术手册</li><li>用户指南</li><li>开发文档</li></ul><p><strong>特点</strong>：</p><ul><li>代码高亮</li><li>图表丰富</li><li>格式统一</li><li>易于维护</li></ul><h2 id="快速开始">快速开始</h2><h3 id="安装方法">安装方法</h3><p><strong>从源码安装</strong>：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/erweixin/RaTeX.git</span><br><span class="line"><span class="built_in">cd</span> RaTeX</span><br><span class="line"><span class="comment"># 按照README中的说明进行安装</span></span><br></pre></td></tr></tbody></table></figure><p><strong>系统要求</strong>：</p><ul><li>操作系统：Windows/macOS/Linux</li><li>内存：建议4GB以上</li><li>存储：200MB可用空间</li></ul><h3 id="基本使用">基本使用</h3><p><strong>创建新文档</strong>：</p><ol><li>启动RaTeX</li><li>选择"新建文档"</li><li>选择文档模板</li><li>开始编写</li></ol><p><strong>编辑文档</strong>：</p><ol><li>在左侧编辑器输入LaTeX代码</li><li>右侧实时显示渲染效果</li><li>使用工具栏快速插入元素</li><li>保存或导出文档</li></ol><p><strong>常用快捷键</strong>：</p><ul><li><code>Ctrl+S</code>：保存文档</li><li><code>Ctrl+B</code>：加粗文本</li><li><code>Ctrl+I</code>：斜体文本</li><li><code>Ctrl+M</code>：插入数学公式</li><li><code>Ctrl+L</code>：插入列表</li></ul><h2 id="技术架构">技术架构</h2><h3 id="前端技术">前端技术</h3><p><strong>渲染引擎</strong>：</p><ul><li>基于MathJax/KaTeX</li><li>自定义渲染优化</li><li>WebGL加速（可选）</li></ul><p><strong>编辑器</strong>：</p><ul><li>Monaco Editor集成</li><li>自定义语法解析</li><li>智能补全引擎</li></ul><p><strong>界面框架</strong>：</p><ul><li>现代化UI设计</li><li>响应式布局</li><li>主题定制支持</li></ul><h3 id="后端技术">后端技术</h3><p><strong>文档处理</strong>：</p><ul><li>LaTeX解析器</li><li>语法树生成</li><li>错误检测</li></ul><p><strong>性能优化</strong>：</p><ul><li>增量编译</li><li>并行处理</li><li>内存管理</li></ul><h2 id="与其他工具对比">与其他工具对比</h2><table><thead><tr><th>特性</th><th>RaTeX</th><th>Overleaf</th><th>TeXstudio</th></tr></thead><tbody><tr><td>实时渲染</td><td>✅ 即时</td><td>⚠️ 延迟</td><td>❌ 需编译</td></tr><tr><td>离线使用</td><td>✅ 完全支持</td><td>❌ 需联网</td><td>✅ 完全支持</td></tr><tr><td>学习曲线</td><td>✅ 平缓</td><td>⚠️ 中等</td><td>⚠️ 陡峭</td></tr><tr><td>资源占用</td><td>✅ 轻量</td><td>⚠️ 依赖网络</td><td>⚠️ 较重</td></tr><tr><td>协作功能</td><td>🔄 开发中</td><td>✅ 完善</td><td>❌ 不支持</td></tr><tr><td>开源免费</td><td>✅ 完全开源</td><td>⚠️ 部分免费</td><td>✅ 开源</td></tr></tbody></table><h2 id="实际应用案例">实际应用案例</h2><h3 id="案例1：学术论文写作">案例1：学术论文写作</h3><p><strong>场景</strong>：博士生撰写学位论文</p><p><strong>使用体验</strong>：</p><ul><li>实时预览公式，快速调整格式</li><li>大纲视图管理章节结构</li><li>引用管理简化文献引用</li><li>提高写作效率50%以上</li></ul><h3 id="案例2：数学课件制作">案例2：数学课件制作</h3><p><strong>场景</strong>：大学教师制作微积分课件</p><p><strong>使用体验</strong>：</p><ul><li>快速插入数学公式</li><li>实时调整排版效果</li><li>图表编辑直观便捷</li><li>课件制作时间减半</li></ul><h3 id="案例3：技术文档编写">案例3：技术文档编写</h3><p><strong>场景</strong>：开发团队编写API文档</p><p><strong>使用体验</strong>：</p><ul><li>代码高亮清晰</li><li>格式统一规范</li><li>易于版本控制</li><li>团队协作高效</li></ul><h2 id="社区与支持">社区与支持</h2><h3 id="开源社区">开源社区</h3><p><strong>项目信息</strong>：</p><ul><li>GitHub仓库：<a href="https://github.com/erweixin/RaTeX">erweixin/RaTeX</a></li><li>开源协议：MIT License</li><li>活跃开发：持续更新</li></ul><p><strong>参与方式</strong>：</p><ul><li>提交Issue反馈问题</li><li>贡献代码改进功能</li><li>完善文档和教程</li><li>分享使用经验</li></ul><h3 id="获取帮助">获取帮助</h3><p><strong>文档资源</strong>：</p><ul><li>官方文档</li><li>使用教程</li><li>常见问题</li><li>视频演示</li></ul><p><strong>社区支持</strong>：</p><ul><li>GitHub Discussions</li><li>用户交流群</li><li>技术博客</li><li>在线论坛</li></ul><h2 id="未来发展">未来发展</h2><h3 id="短期计划">短期计划</h3><p><strong>功能增强</strong>：</p><ul><li>协作编辑功能</li><li>云端同步支持</li><li>更多模板库</li><li>插件系统</li></ul><p><strong>性能优化</strong>：</p><ul><li>渲染速度提升</li><li>内存占用优化</li><li>启动速度改进</li><li>大文档支持</li></ul><h3 id="长期愿景">长期愿景</h3><p><strong>生态建设</strong>：</p><ul><li>插件市场</li><li>模板社区</li><li>在线服务</li><li>移动端支持</li></ul><p><strong>技术创新</strong>：</p><ul><li>AI辅助写作</li><li>智能排版</li><li>自动校对</li><li>多人协作</li></ul><h2 id="最佳实践">最佳实践</h2><h3 id="编写建议">编写建议</h3><ol><li><p><strong>合理组织结构</strong></p><ul><li>使用章节命令</li><li>保持层次清晰</li><li>适当添加注释</li></ul></li><li><p><strong>优化渲染性能</strong></p><ul><li>避免过度嵌套</li><li>合理使用宏定义</li><li>控制文档大小</li></ul></li><li><p><strong>提高可维护性</strong></p><ul><li>模块化编写</li><li>统一命名规范</li><li>版本控制管理</li></ul></li></ol><h3 id="常见问题">常见问题</h3><p><strong>Q1: RaTeX支持中文吗？</strong></p><p>A: 完全支持中文，包括中文字体和CJK环境。</p><p><strong>Q2: 如何导出PDF？</strong></p><p>A: 使用导出功能，选择PDF格式即可。</p><p><strong>Q3: 支持自定义模板吗？</strong></p><p>A: 支持，可以创建和导入自定义模板。</p><p><strong>Q4: 渲染速度慢怎么办？</strong></p><p>A: 检查文档复杂度，优化代码结构，关闭不必要的功能。</p><p><strong>Q5: 如何报告Bug？</strong></p><p>A: 在GitHub仓库提交Issue，详细描述问题和复现步骤。</p><h2 id="总结">总结</h2><p>RaTeX作为一款创新的LaTeX实时渲染工具，通过即时预览、智能补全和现代化界面，极大地改善了LaTeX文档的编写体验。无论是学术写作、教学应用还是技术文档编写，RaTeX都能提供高效、便捷的解决方案。</p><p><strong>核心优势</strong>：</p><ul><li>✅ 实时渲染，即时反馈</li><li>✅ 智能辅助，提升效率</li><li>✅ 现代界面，易于使用</li><li>✅ 开源免费，持续更新</li><li>✅ 跨平台，适用广泛</li></ul><p>对于LaTeX用户来说，RaTeX是一个值得尝试的优秀工具。它不仅保留了LaTeX的强大功能，还通过创新的实时渲染技术，让文档编写变得更加流畅和高效。</p><hr><p><strong>相关链接</strong>：</p><ul><li>GitHub仓库：<a href="https://github.com/erweixin/RaTeX">https://github.com/erweixin/RaTeX</a></li><li>项目文档：查看仓库README</li><li>问题反馈：GitHub Issues</li></ul><p><strong>标签</strong>：#LaTeX #实时渲染 #开源项目 #文档编辑 #学术写作 #数学公式</p>]]></content>
    
    
    <summary type="html">RaTeX是一款创新的LaTeX实时渲染工具，将传统的手动编译预览流程转变为即时所见即所得的编辑体验。本文介绍其核心特性包括实时渲染引擎、代码智能补全系统、现代化界面设计以及为学术写作和文档排版带来的效率提升，让论文撰写更加轻松高效</summary>
    
    
    
    <category term="开源项目" scheme="https://www.zeroxin.xin/categories/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE/"/>
    
    
    <category term="开源项目" scheme="https://www.zeroxin.xin/tags/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE/"/>
    
    <category term="LaTeX" scheme="https://www.zeroxin.xin/tags/LaTeX/"/>
    
    <category term="文档编辑" scheme="https://www.zeroxin.xin/tags/%E6%96%87%E6%A1%A3%E7%BC%96%E8%BE%91/"/>
    
    <category term="实时渲染" scheme="https://www.zeroxin.xin/tags/%E5%AE%9E%E6%97%B6%E6%B8%B2%E6%9F%93/"/>
    
    <category term="学术写作" scheme="https://www.zeroxin.xin/tags/%E5%AD%A6%E6%9C%AF%E5%86%99%E4%BD%9C/"/>
    
  </entry>
  
  <entry>
    <title>Xget 生态系统集成</title>
    <link href="https://www.zeroxin.xin/2025/12/27/xget-ecosystem-integration/"/>
    <id>https://www.zeroxin.xin/2025/12/27/xget-ecosystem-integration/</id>
    <published>2025-12-27T08:30:00.000Z</published>
    <updated>2026-06-18T09:21:22.325Z</updated>
    
    <content type="html"><![CDATA[<h1>Xget 生态系统集成</h1><h2 id="概述">概述</h2><p>本文档详细介绍了 Xget 与各种开发工具、平台和服务的集成方式。通过深度集成，Xget 能够无缝融入开发者的日常工作流程，提供统一的加速体验。</p><h2 id="IDE-集成">IDE 集成</h2><h3 id="Visual-Studio-Code">Visual Studio Code</h3><h4 id="配置-Git-加速">配置 Git 加速</h4><p>在 VS Code 中配置 Git 使用 Xget：</p><figure class="highlight json"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line">  <span class="attr">"git.enabled"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"git.path"</span><span class="punctuation">:</span> <span class="string">"git"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"git.autofetch"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"git.enableSmartCommit"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"git.postCommitCommand"</span><span class="punctuation">:</span> <span class="string">"none"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"git.confirmSync"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"git.suggestSmartCommit"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"git.useEditorAsCommitInput"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></tbody></table></figure><p><strong>配置 Git 配置文件</strong></p><p>在项目根目录创建 <code>.gitconfig</code>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[url "https://xget.xi-xu.me/gh/"]</span><br><span class="line">    insteadOf = https://github.com/</span><br></pre></td></tr></tbody></table></figure><p><strong>使用 GitLens 扩展</strong></p><p>安装 GitLens 扩展后，在设置中配置：</p><figure class="highlight json"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line">  <span class="attr">"gitlens.advanced.messages"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">    <span class="attr">"suppressCommitHasNoPreviousCommitWarning"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"suppressCommitNotFoundWarning"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"suppressFileNotUnderSourceControlWarning"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"suppressGitDisabledWarning"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"suppressLineUncommittedWarning"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"suppressNoRepositoryWarning"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"suppressResultsExplorerNotice"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"suppressShowKeyBindingsNotice"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"suppressUpdateNotice"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"suppressWelcomeNotice"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span></span><br><span class="line">  <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></tbody></table></figure><h4 id="配置-npm-加速">配置 npm 加速</h4><p>在 VS Code 中配置 npm 使用 Xget：</p><figure class="highlight json"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line">  <span class="attr">"npm.packageManager"</span><span class="punctuation">:</span> <span class="string">"npm"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"npm.enableScriptExplorer"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"npm.enableRunFromFolder"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"npm.exclude"</span><span class="punctuation">:</span> <span class="string">"**/node_modules/**"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"npm.include"</span><span class="punctuation">:</span> <span class="string">"**/package.json"</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></tbody></table></figure><p><strong>创建 .npmrc 文件</strong></p><p>在项目根目录创建 <code>.npmrc</code>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">registry=https://xget.xi-xu.me/npm</span><br></pre></td></tr></tbody></table></figure><h4 id="配置-Python-加速">配置 Python 加速</h4><p>在 VS Code 中配置 Python 使用 Xget：</p><figure class="highlight json"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line">  <span class="attr">"python.defaultInterpreterPath"</span><span class="punctuation">:</span> <span class="string">"python"</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"python.terminal.activateEnvironment"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"python.linting.enabled"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"python.linting.pylintEnabled"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"python.formatting.provider"</span><span class="punctuation">:</span> <span class="string">"black"</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></tbody></table></figure><p><strong>创建 pip.conf 文件</strong></p><p>在项目根目录创建 <code>pip.conf</code>：</p><figure class="highlight ini"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[global]</span></span><br><span class="line"><span class="attr">index-url</span> = https://xget.xi-xu.me/pypi</span><br></pre></td></tr></tbody></table></figure><h3 id="IntelliJ-IDEA">IntelliJ IDEA</h3><h4 id="配置-Git-加速-2">配置 Git 加速</h4><p>在 IDEA 中配置 Git 使用 Xget：</p><ol><li>打开 Settings → Version Control → Git</li><li>在 SSH executable 中选择 Built-in</li><li>在 Environment variables 中添加：</li></ol><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">GIT_SSH_COMMAND=ssh -o ProxyCommand="ssh -W %h:%p git@xget.xi-xu.me"</span><br></pre></td></tr></tbody></table></figure><h4 id="配置-Maven-加速">配置 Maven 加速</h4><p>在 IDEA 中配置 Maven 使用 Xget：</p><ol><li>打开 Settings → Build, Execution, Deployment → Build Tools → Maven</li><li>在 User settings file 中配置：</li></ol><figure class="highlight xml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">settings</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">mirrors</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">mirror</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">id</span>&gt;</span>xget-maven<span class="tag">&lt;/<span class="name">id</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">mirrorOf</span>&gt;</span>central<span class="tag">&lt;/<span class="name">mirrorOf</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">name</span>&gt;</span>Xget Maven Mirror<span class="tag">&lt;/<span class="name">name</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">url</span>&gt;</span>https://xget.xi-xu.me/maven2<span class="tag">&lt;/<span class="name">url</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">mirror</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">mirrors</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">settings</span>&gt;</span></span><br></pre></td></tr></tbody></table></figure><h4 id="配置-Gradle-加速">配置 Gradle 加速</h4><p>在 IDEA 中配置 Gradle 使用 Xget：</p><ol><li>打开 Settings → Build, Execution, Deployment → Build Tools → Gradle</li><li>在 Gradle JVM 中选择合适的 JDK</li><li>在 build.gradle 中配置：</li></ol><figure class="highlight groovy"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">repositories {</span><br><span class="line">    maven { url <span class="string">'https://xget.xi-xu.me/maven2'</span> }</span><br><span class="line">    mavenCentral()</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h3 id="PyCharm">PyCharm</h3><h4 id="配置-Git-加速-3">配置 Git 加速</h4><p>在 PyCharm 中配置 Git 使用 Xget：</p><ol><li>打开 Settings → Version Control → Git</li><li>在 SSH executable 中选择 Built-in</li><li>在 Environment variables 中添加：</li></ol><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">GIT_SSH_COMMAND=ssh -o ProxyCommand="ssh -W %h:%p git@xget.xi-xu.me"</span><br></pre></td></tr></tbody></table></figure><h4 id="配置-pip-加速">配置 pip 加速</h4><p>在 PyCharm 中配置 pip 使用 Xget：</p><ol><li>打开 Settings → Project → Python Interpreter</li><li>点击齿轮图标 → Show All</li><li>在 Package Manager 中配置：</li></ol><figure class="highlight ini"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[global]</span></span><br><span class="line"><span class="attr">index-url</span> = https://xget.xi-xu.me/pypi</span><br></pre></td></tr></tbody></table></figure><h3 id="WebStorm">WebStorm</h3><h4 id="配置-Git-加速-4">配置 Git 加速</h4><p>在 WebStorm 中配置 Git 使用 Xget：</p><ol><li>打开 Settings → Version Control → Git</li><li>在 SSH executable 中选择 Built-in</li><li>在 Environment variables 中添加：</li></ol><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">GIT_SSH_COMMAND=ssh -o ProxyCommand="ssh -W %h:%p git@xget.xi-xu.me"</span><br></pre></td></tr></tbody></table></figure><h4 id="配置-npm-加速-2">配置 npm 加速</h4><p>在 WebStorm 中配置 npm 使用 Xget：</p><ol><li>打开 Settings → Languages &amp; Frameworks → Node.js and NPM</li><li>在 Package manager 中选择 npm</li><li>在项目中创建 <code>.npmrc</code>：</li></ol><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">registry=https://xget.xi-xu.me/npm</span><br></pre></td></tr></tbody></table></figure><h2 id="CI-CD-集成">CI/CD 集成</h2><h3 id="GitHub-Actions">GitHub Actions</h3><h4 id="基本配置">基本配置</h4><p>在 GitHub Actions 中配置 Xget：</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">Build</span> <span class="string">and</span> <span class="string">Test</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span> [<span class="string">push</span>, <span class="string">pull_request</span>]</span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">build:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line"></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Setup</span> <span class="string">Node.js</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/setup-node@v4</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">node-version:</span> <span class="string">'20'</span></span><br><span class="line">          <span class="attr">registry-url:</span> <span class="string">'https://xget.xi-xu.me/npm'</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Install</span> <span class="string">dependencies</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">npm</span> <span class="string">ci</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Build</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">npm</span> <span class="string">run</span> <span class="string">build</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Test</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">npm</span> <span class="string">test</span></span><br></pre></td></tr></tbody></table></figure><h4 id="Git-配置">Git 配置</h4><p>在 GitHub Actions 中配置 Git 使用 Xget：</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Configure</span> <span class="string">Git</span></span><br><span class="line">  <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">    git config --global url."https://xget.xi-xu.me/gh/".insteadOf "https://github.com/"</span></span><br><span class="line"><span class="string">    git config --global url."https://xget.xi-xu.me/gl/".insteadOf "https://gitlab.com/"</span></span><br></pre></td></tr></tbody></table></figure><h4 id="Docker-配置">Docker 配置</h4><p>在 GitHub Actions 中配置 Docker 使用 Xget：</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Configure</span> <span class="string">Docker</span></span><br><span class="line">  <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">    echo '{"registry-mirrors": ["https://xget.xi-xu.me/cr/registry-1.docker.io"]}' | sudo tee /etc/docker/daemon.json</span></span><br><span class="line"><span class="string">    sudo systemctl restart docker</span></span><br></pre></td></tr></tbody></table></figure><h4 id="Python-配置">Python 配置</h4><p>在 GitHub Actions 中配置 Python 使用 Xget：</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Setup</span> <span class="string">Python</span></span><br><span class="line">  <span class="attr">uses:</span> <span class="string">actions/setup-python@v5</span></span><br><span class="line">  <span class="attr">with:</span></span><br><span class="line">    <span class="attr">python-version:</span> <span class="string">'3.11'</span></span><br><span class="line"></span><br><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Configure</span> <span class="string">pip</span></span><br><span class="line">  <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line">    <span class="string">pip</span> <span class="string">config</span> <span class="string">set</span> <span class="string">global.index-url</span> <span class="string">https://xget.xi-xu.me/pypi</span></span><br></pre></td></tr></tbody></table></figure><h3 id="GitLab-CI">GitLab CI</h3><h4 id="基本配置-2">基本配置</h4><p>在 GitLab CI 中配置 Xget：</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">image:</span> <span class="string">node:20</span></span><br><span class="line"></span><br><span class="line"><span class="attr">variables:</span></span><br><span class="line">  <span class="attr">NPM_CONFIG_REGISTRY:</span> <span class="string">"https://xget.xi-xu.me/npm"</span></span><br><span class="line">  <span class="attr">PIP_INDEX_URL:</span> <span class="string">"https://xget.xi-xu.me/pypi"</span></span><br><span class="line"></span><br><span class="line"><span class="attr">before_script:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">npm</span> <span class="string">ci</span></span><br><span class="line"></span><br><span class="line"><span class="attr">stages:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">build</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">test</span></span><br><span class="line"></span><br><span class="line"><span class="attr">build:</span></span><br><span class="line">  <span class="attr">stage:</span> <span class="string">build</span></span><br><span class="line">  <span class="attr">script:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">npm</span> <span class="string">run</span> <span class="string">build</span></span><br><span class="line"></span><br><span class="line"><span class="attr">test:</span></span><br><span class="line">  <span class="attr">stage:</span> <span class="string">test</span></span><br><span class="line">  <span class="attr">script:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">npm</span> <span class="string">test</span></span><br></pre></td></tr></tbody></table></figure><h4 id="Git-配置-2">Git 配置</h4><p>在 GitLab CI 中配置 Git 使用 Xget：</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">before_script:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">git</span> <span class="string">config</span> <span class="string">--global</span> <span class="string">url."https://xget.xi-xu.me/gh/".insteadOf</span> <span class="string">"https://github.com/"</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">git</span> <span class="string">config</span> <span class="string">--global</span> <span class="string">url."https://xget.xi-xu.me/gl/".insteadOf</span> <span class="string">"https://gitlab.com/"</span></span><br></pre></td></tr></tbody></table></figure><h4 id="Docker-配置-2">Docker 配置</h4><p>在 GitLab CI 中配置 Docker 使用 Xget：</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">docker:dind</span></span><br><span class="line"></span><br><span class="line"><span class="attr">variables:</span></span><br><span class="line">  <span class="attr">DOCKER_HOST:</span> <span class="string">tcp://docker:2375</span></span><br><span class="line">  <span class="attr">DOCKER_TLS_CERTDIR:</span> <span class="string">""</span></span><br><span class="line"></span><br><span class="line"><span class="attr">before_script:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">echo</span> <span class="string">'{"registry-mirrors": ["https://xget.xi-xu.me/cr/registry-1.docker.io"]}'</span> <span class="string">|</span> <span class="string">tee</span> <span class="string">/etc/docker/daemon.json</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">dockerd</span> <span class="string">&amp;</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">sleep</span> <span class="number">5</span></span><br></pre></td></tr></tbody></table></figure><h3 id="Jenkins">Jenkins</h3><h4 id="基本配置-3">基本配置</h4><p>在 Jenkins 中配置 Xget：</p><figure class="highlight groovy"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line">pipeline {</span><br><span class="line">    agent any</span><br><span class="line"></span><br><span class="line">    environment {</span><br><span class="line">        NPM_CONFIG_REGISTRY = <span class="string">'https://xget.xi-xu.me/npm'</span></span><br><span class="line">        PIP_INDEX_URL = <span class="string">'https://xget.xi-xu.me/pypi'</span></span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    stages {</span><br><span class="line">        stage(<span class="string">'Checkout'</span>) {</span><br><span class="line">            steps {</span><br><span class="line">                checkout scm</span><br><span class="line">            }</span><br><span class="line">        }</span><br><span class="line"></span><br><span class="line">        stage(<span class="string">'Install'</span>) {</span><br><span class="line">            steps {</span><br><span class="line">                sh <span class="string">'npm ci'</span></span><br><span class="line">            }</span><br><span class="line">        }</span><br><span class="line"></span><br><span class="line">        stage(<span class="string">'Build'</span>) {</span><br><span class="line">            steps {</span><br><span class="line">                sh <span class="string">'npm run build'</span></span><br><span class="line">            }</span><br><span class="line">        }</span><br><span class="line"></span><br><span class="line">        stage(<span class="string">'Test'</span>) {</span><br><span class="line">            steps {</span><br><span class="line">                sh <span class="string">'npm test'</span></span><br><span class="line">            }</span><br><span class="line">        }</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h4 id="Git-配置-3">Git 配置</h4><p>在 Jenkins 中配置 Git 使用 Xget：</p><figure class="highlight groovy"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">stage(<span class="string">'Configure Git'</span>) {</span><br><span class="line">    steps {</span><br><span class="line">        sh <span class="string">'''</span></span><br><span class="line"><span class="string">            git config --global url."https://xget.xi-xu.me/gh/".insteadOf "https://github.com/"</span></span><br><span class="line"><span class="string">            git config --global url."https://xget.xi-xu.me/gl/".insteadOf "https://gitlab.com/"</span></span><br><span class="line"><span class="string">        '''</span></span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h3 id="Azure-DevOps">Azure DevOps</h3><h4 id="基本配置-4">基本配置</h4><p>在 Azure DevOps 中配置 Xget：</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">trigger:</span></span><br><span class="line"><span class="bullet">-</span> <span class="string">main</span></span><br><span class="line"></span><br><span class="line"><span class="attr">pool:</span></span><br><span class="line">  <span class="attr">vmImage:</span> <span class="string">'ubuntu-latest'</span></span><br><span class="line"></span><br><span class="line"><span class="attr">variables:</span></span><br><span class="line">  <span class="attr">NPM_CONFIG_REGISTRY:</span> <span class="string">'https://xget.xi-xu.me/npm'</span></span><br><span class="line">  <span class="attr">PIP_INDEX_URL:</span> <span class="string">'https://xget.xi-xu.me/pypi'</span></span><br><span class="line"></span><br><span class="line"><span class="attr">steps:</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">task:</span> <span class="string">NodeTool@0</span></span><br><span class="line">  <span class="attr">inputs:</span></span><br><span class="line">    <span class="attr">versionSpec:</span> <span class="string">'20.x'</span></span><br><span class="line">  <span class="attr">displayName:</span> <span class="string">'Install Node.js'</span></span><br><span class="line"></span><br><span class="line"><span class="bullet">-</span> <span class="attr">script:</span> <span class="string">|</span></span><br><span class="line"><span class="string">    npm ci</span></span><br><span class="line"><span class="string"></span>  <span class="attr">displayName:</span> <span class="string">'Install dependencies'</span></span><br><span class="line"></span><br><span class="line"><span class="bullet">-</span> <span class="attr">script:</span> <span class="string">|</span></span><br><span class="line"><span class="string">    npm run build</span></span><br><span class="line"><span class="string"></span>  <span class="attr">displayName:</span> <span class="string">'Build'</span></span><br><span class="line"></span><br><span class="line"><span class="bullet">-</span> <span class="attr">script:</span> <span class="string">|</span></span><br><span class="line"><span class="string">    npm test</span></span><br><span class="line"><span class="string"></span>  <span class="attr">displayName:</span> <span class="string">'Test'</span></span><br></pre></td></tr></tbody></table></figure><h4 id="Git-配置-4">Git 配置</h4><p>在 Azure DevOps 中配置 Git 使用 Xget：</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">script:</span> <span class="string">|</span></span><br><span class="line"><span class="string">    git config --global url."https://xget.xi-xu.me/gh/".insteadOf "https://github.com/"</span></span><br><span class="line"><span class="string">    git config --global url."https://xget.xi-xu.me/gl/".insteadOf "https://gitlab.com/"</span></span><br><span class="line"><span class="string"></span>  <span class="attr">displayName:</span> <span class="string">'Configure Git'</span></span><br></pre></td></tr></tbody></table></figure><h2 id="包管理器集成">包管理器集成</h2><h3 id="npm">npm</h3><h4 id="全局配置">全局配置</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 设置 npm 注册表</span></span><br><span class="line">npm config <span class="built_in">set</span> registry https://xget.xi-xu.me/npm</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证配置</span></span><br><span class="line">npm config get registry</span><br></pre></td></tr></tbody></table></figure><h4 id="项目配置">项目配置</h4><p>在项目根目录创建 <code>.npmrc</code>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">registry=https://xget.xi-xu.me/npm</span><br></pre></td></tr></tbody></table></figure><h4 id="使用示例">使用示例</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装包</span></span><br><span class="line">npm install react</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装特定版本</span></span><br><span class="line">npm install react@18.2.0</span><br><span class="line"></span><br><span class="line"><span class="comment"># 全局安装</span></span><br><span class="line">npm install -g typescript</span><br></pre></td></tr></tbody></table></figure><h3 id="yarn">yarn</h3><h4 id="全局配置-2">全局配置</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 设置 yarn 注册表</span></span><br><span class="line">yarn config <span class="built_in">set</span> registry https://xget.xi-xu.me/npm</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证配置</span></span><br><span class="line">yarn config get registry</span><br></pre></td></tr></tbody></table></figure><h4 id="项目配置-2">项目配置</h4><p>在项目根目录创建 <code>.yarnrc</code>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">registry "https://xget.xi-xu.me/npm"</span><br></pre></td></tr></tbody></table></figure><h4 id="使用示例-2">使用示例</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装包</span></span><br><span class="line">yarn add react</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装特定版本</span></span><br><span class="line">yarn add react@18.2.0</span><br><span class="line"></span><br><span class="line"><span class="comment"># 全局安装</span></span><br><span class="line">yarn global add typescript</span><br></pre></td></tr></tbody></table></figure><h3 id="pnpm">pnpm</h3><h4 id="全局配置-3">全局配置</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 设置 pnpm 注册表</span></span><br><span class="line">pnpm config <span class="built_in">set</span> registry https://xget.xi-xu.me/npm</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证配置</span></span><br><span class="line">pnpm config get registry</span><br></pre></td></tr></tbody></table></figure><h4 id="项目配置-3">项目配置</h4><p>在项目根目录创建 <code>.npmrc</code>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">registry=https://xget.xi-xu.me/npm</span><br></pre></td></tr></tbody></table></figure><h4 id="使用示例-3">使用示例</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装包</span></span><br><span class="line">pnpm add react</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装特定版本</span></span><br><span class="line">pnpm add react@18.2.0</span><br><span class="line"></span><br><span class="line"><span class="comment"># 全局安装</span></span><br><span class="line">pnpm add -g typescript</span><br></pre></td></tr></tbody></table></figure><h3 id="pip">pip</h3><h4 id="全局配置-4">全局配置</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 创建 pip 配置目录</span></span><br><span class="line"><span class="built_in">mkdir</span> -p ~/.pip</span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建配置文件</span></span><br><span class="line"><span class="built_in">cat</span> &gt; ~/.pip/pip.conf &lt;&lt; <span class="string">EOF</span></span><br><span class="line"><span class="string">[global]</span></span><br><span class="line"><span class="string">index-url = https://xget.xi-xu.me/pypi</span></span><br><span class="line"><span class="string">EOF</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证配置</span></span><br><span class="line">pip config get global.index-url</span><br></pre></td></tr></tbody></table></figure><h4 id="项目配置-4">项目配置</h4><p>在项目根目录创建 <code>pip.conf</code>：</p><figure class="highlight ini"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[global]</span></span><br><span class="line"><span class="attr">index-url</span> = https://xget.xi-xu.me/pypi</span><br></pre></td></tr></tbody></table></figure><h4 id="使用示例-4">使用示例</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装包</span></span><br><span class="line">pip install requests</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装特定版本</span></span><br><span class="line">pip install requests==2.31.0</span><br><span class="line"></span><br><span class="line"><span class="comment"># 从 requirements.txt 安装</span></span><br><span class="line">pip install -r requirements.txt</span><br></pre></td></tr></tbody></table></figure><h3 id="Poetry">Poetry</h3><h4 id="全局配置-5">全局配置</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 设置 Poetry 源</span></span><br><span class="line">poetry <span class="built_in">source</span> add --priority=primary xget https://xget.xi-xu.me/pypi</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证配置</span></span><br><span class="line">poetry <span class="built_in">source</span> show</span><br></pre></td></tr></tbody></table></figure><h4 id="项目配置-5">项目配置</h4><p>在 <code>pyproject.toml</code> 中配置：</p><figure class="highlight toml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[tool.poetry.source]</span></span><br><span class="line"><span class="attr">name</span> = <span class="string">"xget"</span></span><br><span class="line"><span class="attr">url</span> = <span class="string">"https://xget.xi-xu.me/pypi"</span></span><br><span class="line"><span class="attr">priority</span> = <span class="string">"primary"</span></span><br></pre></td></tr></tbody></table></figure><h4 id="使用示例-5">使用示例</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装依赖</span></span><br><span class="line">poetry install</span><br><span class="line"></span><br><span class="line"><span class="comment"># 添加包</span></span><br><span class="line">poetry add requests</span><br><span class="line"></span><br><span class="line"><span class="comment"># 更新依赖</span></span><br><span class="line">poetry update</span><br></pre></td></tr></tbody></table></figure><h3 id="conda">conda</h3><h4 id="全局配置-6">全局配置</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 添加 Xget 作为频道</span></span><br><span class="line">conda config --add channels https://xget.xi-xu.me/conda/pkgs/main</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证配置</span></span><br><span class="line">conda config --show channels</span><br></pre></td></tr></tbody></table></figure><h4 id="项目配置-6">项目配置</h4><p>在项目根目录创建 <code>.condarc</code>：</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">channels:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">https://xget.xi-xu.me/conda/pkgs/main</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">defaults</span></span><br></pre></td></tr></tbody></table></figure><h4 id="使用示例-6">使用示例</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装包</span></span><br><span class="line">conda install python=3.11</span><br><span class="line"></span><br><span class="line"><span class="comment"># 从特定频道安装</span></span><br><span class="line">conda install -c https://xget.xi-xu.me/conda/community/conda-forge pytorch</span><br></pre></td></tr></tbody></table></figure><h3 id="Maven">Maven</h3><h4 id="全局配置-7">全局配置</h4><p>编辑 <code>~/.m2/settings.xml</code>：</p><figure class="highlight xml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">settings</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">mirrors</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">mirror</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">id</span>&gt;</span>xget-maven<span class="tag">&lt;/<span class="name">id</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">mirrorOf</span>&gt;</span>central<span class="tag">&lt;/<span class="name">mirrorOf</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">name</span>&gt;</span>Xget Maven Mirror<span class="tag">&lt;/<span class="name">name</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">url</span>&gt;</span>https://xget.xi-xu.me/maven2<span class="tag">&lt;/<span class="name">url</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">mirror</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">mirrors</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">settings</span>&gt;</span></span><br></pre></td></tr></tbody></table></figure><h4 id="项目配置-7">项目配置</h4><p>在 <code>pom.xml</code> 中配置：</p><figure class="highlight xml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">repositories</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">repository</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">id</span>&gt;</span>xget<span class="tag">&lt;/<span class="name">id</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">url</span>&gt;</span>https://xget.xi-xu.me/maven2<span class="tag">&lt;/<span class="name">url</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">repository</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">repositories</span>&gt;</span></span><br></pre></td></tr></tbody></table></figure><h4 id="使用示例-7">使用示例</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载依赖</span></span><br><span class="line">mvn dependency:resolve</span><br><span class="line"></span><br><span class="line"><span class="comment"># 构建项目</span></span><br><span class="line">mvn clean install</span><br></pre></td></tr></tbody></table></figure><h3 id="Gradle">Gradle</h3><h4 id="全局配置-8">全局配置</h4><p>编辑 <code>~/.gradle/init.gradle</code>：</p><figure class="highlight groovy"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">allprojects {</span><br><span class="line">    repositories {</span><br><span class="line">        maven { url <span class="string">'https://xget.xi-xu.me/maven2'</span> }</span><br><span class="line">        mavenCentral()</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h4 id="项目配置-8">项目配置</h4><p>在 <code>build.gradle</code> 中配置：</p><figure class="highlight groovy"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">repositories {</span><br><span class="line">    maven { url <span class="string">'https://xget.xi-xu.me/maven2'</span> }</span><br><span class="line">    mavenCentral()</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h4 id="使用示例-8">使用示例</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载依赖</span></span><br><span class="line">./gradlew dependencies</span><br><span class="line"></span><br><span class="line"><span class="comment"># 构建项目</span></span><br><span class="line">./gradlew build</span><br></pre></td></tr></tbody></table></figure><h2 id="容器集成">容器集成</h2><h3 id="Docker">Docker</h3><h4 id="配置-Docker-镜像">配置 Docker 镜像</h4><p>编辑 <code>/etc/docker/daemon.json</code>：</p><figure class="highlight json"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line">  <span class="attr">"registry-mirrors"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="string">"https://xget.xi-xu.me/cr/registry-1.docker.io"</span></span><br><span class="line">  <span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></tbody></table></figure><p>重启 Docker：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> systemctl restart docker</span><br></pre></td></tr></tbody></table></figure><h4 id="使用示例-9">使用示例</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 拉取镜像</span></span><br><span class="line">docker pull nginx:latest</span><br><span class="line"></span><br><span class="line"><span class="comment"># 拉取特定标签</span></span><br><span class="line">docker pull nginx:1.25</span><br><span class="line"></span><br><span class="line"><span class="comment"># 构建镜像</span></span><br><span class="line">docker build -t myapp .</span><br></pre></td></tr></tbody></table></figure><h4 id="Dockerfile-配置">Dockerfile 配置</h4><p>在 Dockerfile 中配置：</p><figure class="highlight dockerfile"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">FROM</span> node:<span class="number">20</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置 npm 使用 Xget</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> npm config <span class="built_in">set</span> registry https://xget.xi-xu.me/npm</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装依赖</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> package*.json ./</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> npm ci</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 复制源码</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> . .</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 构建应用</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> npm run build</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动应用</span></span><br><span class="line"><span class="keyword">CMD</span><span class="language-bash"> [<span class="string">"npm"</span>, <span class="string">"start"</span>]</span></span><br></pre></td></tr></tbody></table></figure><h3 id="Kubernetes">Kubernetes</h3><h4 id="配置镜像拉取">配置镜像拉取</h4><p>在 Kubernetes 中配置 Docker 镜像加速：</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">ConfigMap</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">docker-config</span></span><br><span class="line"><span class="attr">data:</span></span><br><span class="line">  <span class="attr">daemon.json:</span> <span class="string">|</span></span><br><span class="line"><span class="string">    {</span></span><br><span class="line"><span class="string">      "registry-mirrors": [</span></span><br><span class="line"><span class="string">        "https://xget.xi-xu.me/cr/registry-1.docker.io"</span></span><br><span class="line"><span class="string">      ]</span></span><br><span class="line"><span class="string">    }</span></span><br><span class="line"><span class="string"></span><span class="meta">---</span></span><br><span class="line"><span class="attr">apiVersion:</span> <span class="string">apps/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">DaemonSet</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">docker-config</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">selector:</span></span><br><span class="line">    <span class="attr">matchLabels:</span></span><br><span class="line">      <span class="attr">app:</span> <span class="string">docker-config</span></span><br><span class="line">  <span class="attr">template:</span></span><br><span class="line">    <span class="attr">metadata:</span></span><br><span class="line">      <span class="attr">labels:</span></span><br><span class="line">        <span class="attr">app:</span> <span class="string">docker-config</span></span><br><span class="line">    <span class="attr">spec:</span></span><br><span class="line">      <span class="attr">containers:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">docker-config</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">alpine</span></span><br><span class="line">        <span class="attr">command:</span> [<span class="string">"/bin/sh"</span>, <span class="string">"-c"</span>]</span><br><span class="line">        <span class="attr">args:</span></span><br><span class="line">          <span class="bullet">-</span> <span class="string">|</span></span><br><span class="line"><span class="string">            mkdir -p /etc/docker</span></span><br><span class="line"><span class="string">            echo '{"registry-mirrors": ["https://xget.xi-xu.me/cr/registry-1.docker.io"]}' &gt; /etc/docker/daemon.json</span></span><br><span class="line"><span class="string">            sleep infinity</span></span><br><span class="line"><span class="string"></span>        <span class="attr">volumeMounts:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">docker-config</span></span><br><span class="line">          <span class="attr">mountPath:</span> <span class="string">/etc/docker</span></span><br><span class="line">      <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">docker-config</span></span><br><span class="line">        <span class="attr">configMap:</span></span><br><span class="line">          <span class="attr">name:</span> <span class="string">docker-config</span></span><br></pre></td></tr></tbody></table></figure><h4 id="使用示例-10">使用示例</h4><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">apps/v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Deployment</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line">  <span class="attr">name:</span> <span class="string">myapp</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line">  <span class="attr">replicas:</span> <span class="number">3</span></span><br><span class="line">  <span class="attr">selector:</span></span><br><span class="line">    <span class="attr">matchLabels:</span></span><br><span class="line">      <span class="attr">app:</span> <span class="string">myapp</span></span><br><span class="line">  <span class="attr">template:</span></span><br><span class="line">    <span class="attr">metadata:</span></span><br><span class="line">      <span class="attr">labels:</span></span><br><span class="line">        <span class="attr">app:</span> <span class="string">myapp</span></span><br><span class="line">    <span class="attr">spec:</span></span><br><span class="line">      <span class="attr">containers:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">myapp</span></span><br><span class="line">        <span class="attr">image:</span> <span class="string">nginx:latest</span></span><br><span class="line">        <span class="attr">ports:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">containerPort:</span> <span class="number">80</span></span><br></pre></td></tr></tbody></table></figure><h3 id="Podman">Podman</h3><h4 id="配置-Podman-镜像">配置 Podman 镜像</h4><p>编辑 <code>/etc/containers/registries.conf</code>：</p><figure class="highlight ini"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">unqualified-search-registries</span> = [<span class="string">"docker.io"</span>, <span class="string">"registry.fedoraproject.org"</span>, <span class="string">"quay.io"</span>]</span><br><span class="line"></span><br><span class="line"><span class="section">[[registry]]</span></span><br><span class="line"><span class="attr">prefix</span> = <span class="string">"docker.io"</span></span><br><span class="line"><span class="attr">location</span> = <span class="string">"xget.xi-xu.me/cr/registry-1.docker.io"</span></span><br><span class="line"><span class="attr">insecure</span> = <span class="literal">false</span></span><br><span class="line"><span class="attr">blocked</span> = <span class="literal">false</span></span><br><span class="line"><span class="attr">mirror-by-digest-only</span> = <span class="literal">false</span></span><br></pre></td></tr></tbody></table></figure><h4 id="使用示例-11">使用示例</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 拉取镜像</span></span><br><span class="line">podman pull nginx:latest</span><br><span class="line"></span><br><span class="line"><span class="comment"># 拉取特定标签</span></span><br><span class="line">podman pull nginx:1.25</span><br><span class="line"></span><br><span class="line"><span class="comment"># 运行容器</span></span><br><span class="line">podman run -d -p 80:80 nginx:latest</span><br></pre></td></tr></tbody></table></figure><h2 id="云平台集成">云平台集成</h2><h3 id="AWS">AWS</h3><h4 id="配置-AWS-CodeBuild">配置 AWS CodeBuild</h4><p>在 AWS CodeBuild 中配置 Xget：</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">version:</span> <span class="number">0.2</span></span><br><span class="line"></span><br><span class="line"><span class="attr">phases:</span></span><br><span class="line">  <span class="attr">install:</span></span><br><span class="line">    <span class="attr">runtime-versions:</span></span><br><span class="line">      <span class="attr">nodejs:</span> <span class="number">20</span></span><br><span class="line">    <span class="attr">commands:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">npm</span> <span class="string">config</span> <span class="string">set</span> <span class="string">registry</span> <span class="string">https://xget.xi-xu.me/npm</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">npm</span> <span class="string">ci</span></span><br><span class="line"></span><br><span class="line">  <span class="attr">build:</span></span><br><span class="line">    <span class="attr">commands:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">npm</span> <span class="string">run</span> <span class="string">build</span></span><br><span class="line"></span><br><span class="line">  <span class="attr">post_build:</span></span><br><span class="line">    <span class="attr">commands:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">npm</span> <span class="string">test</span></span><br></pre></td></tr></tbody></table></figure><h4 id="配置-AWS-Lambda">配置 AWS Lambda</h4><p>在 AWS Lambda 中配置 Xget：</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> { execSync } = <span class="built_in">require</span>(<span class="string">'child_process'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 配置 npm 使用 Xget</span></span><br><span class="line"><span class="title function_">execSync</span>(<span class="string">'npm config set registry https://xget.xi-xu.me/npm'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 安装依赖</span></span><br><span class="line"><span class="title function_">execSync</span>(<span class="string">'npm ci'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 导出处理函数</span></span><br><span class="line"><span class="built_in">exports</span>.<span class="property">handler</span> = <span class="title function_">async</span> (event) =&gt; {</span><br><span class="line">  <span class="comment">// 处理逻辑</span></span><br><span class="line">  <span class="keyword">return</span> {</span><br><span class="line">    <span class="attr">statusCode</span>: <span class="number">200</span>,</span><br><span class="line">    <span class="attr">body</span>: <span class="title class_">JSON</span>.<span class="title function_">stringify</span>({ <span class="attr">message</span>: <span class="string">'Hello from Lambda!'</span> })</span><br><span class="line">  };</span><br><span class="line">};</span><br></pre></td></tr></tbody></table></figure><h3 id="Google-Cloud">Google Cloud</h3><h4 id="配置-Google-Cloud-Build">配置 Google Cloud Build</h4><p>在 Google Cloud Build 中配置 Xget：</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">steps:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">'node:20'</span></span><br><span class="line">    <span class="attr">entrypoint:</span> <span class="string">'npm'</span></span><br><span class="line">    <span class="attr">args:</span> [<span class="string">'config'</span>, <span class="string">'set'</span>, <span class="string">'registry'</span>, <span class="string">'https://xget.xi-xu.me/npm'</span>]</span><br><span class="line">  </span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">'node:20'</span></span><br><span class="line">    <span class="attr">entrypoint:</span> <span class="string">'npm'</span></span><br><span class="line">    <span class="attr">args:</span> [<span class="string">'ci'</span>]</span><br><span class="line">  </span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">'node:20'</span></span><br><span class="line">    <span class="attr">entrypoint:</span> <span class="string">'npm'</span></span><br><span class="line">    <span class="attr">args:</span> [<span class="string">'run'</span>, <span class="string">'build'</span>]</span><br><span class="line">  </span><br><span class="line">  <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">'node:20'</span></span><br><span class="line">    <span class="attr">entrypoint:</span> <span class="string">'npm'</span></span><br><span class="line">    <span class="attr">args:</span> [<span class="string">'test'</span>]</span><br></pre></td></tr></tbody></table></figure><h4 id="配置-Google-Cloud-Functions">配置 Google Cloud Functions</h4><p>在 Google Cloud Functions 中配置 Xget：</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> { execSync } = <span class="built_in">require</span>(<span class="string">'child_process'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 配置 npm 使用 Xget</span></span><br><span class="line"><span class="title function_">execSync</span>(<span class="string">'npm config set registry https://xget.xi-xu.me/npm'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 安装依赖</span></span><br><span class="line"><span class="title function_">execSync</span>(<span class="string">'npm ci'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 导出处理函数</span></span><br><span class="line"><span class="built_in">exports</span>.<span class="property">helloWorld</span> = <span class="function">(<span class="params">req, res</span>) =&gt;</span> {</span><br><span class="line">  res.<span class="title function_">status</span>(<span class="number">200</span>).<span class="title function_">send</span>({ <span class="attr">message</span>: <span class="string">'Hello from Cloud Functions!'</span> });</span><br><span class="line">};</span><br></pre></td></tr></tbody></table></figure><h3 id="Azure">Azure</h3><h4 id="配置-Azure-Functions">配置 Azure Functions</h4><p>在 Azure Functions 中配置 Xget：</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> { execSync } = <span class="built_in">require</span>(<span class="string">'child_process'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 配置 npm 使用 Xget</span></span><br><span class="line"><span class="title function_">execSync</span>(<span class="string">'npm config set registry https://xget.xi-xu.me/npm'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 安装依赖</span></span><br><span class="line"><span class="title function_">execSync</span>(<span class="string">'npm ci'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 导出处理函数</span></span><br><span class="line"><span class="variable language_">module</span>.<span class="property">exports</span> = <span class="keyword">async</span> <span class="keyword">function</span> (<span class="params">context, req</span>) {</span><br><span class="line">  context.<span class="property">res</span> = {</span><br><span class="line">    <span class="attr">status</span>: <span class="number">200</span>,</span><br><span class="line">    <span class="attr">body</span>: { <span class="attr">message</span>: <span class="string">'Hello from Azure Functions!'</span> }</span><br><span class="line">  };</span><br><span class="line">};</span><br></pre></td></tr></tbody></table></figure><h2 id="监控和日志集成">监控和日志集成</h2><h3 id="Prometheus">Prometheus</h3><h4 id="配置-Prometheus-监控">配置 Prometheus 监控</h4><p>在 Prometheus 中配置 Xget 监控：</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">scrape_configs:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">job_name:</span> <span class="string">'xget'</span></span><br><span class="line">    <span class="attr">static_configs:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">targets:</span> [<span class="string">'xget.xi-xu.me:9090'</span>]</span><br><span class="line">    <span class="attr">metrics_path:</span> <span class="string">'/metrics'</span></span><br><span class="line">    <span class="attr">scrape_interval:</span> <span class="string">15s</span></span><br></pre></td></tr></tbody></table></figure><h4 id="使用示例-12">使用示例</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 启动 Prometheus</span></span><br><span class="line">prometheus --config.file=prometheus.yml</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查询指标</span></span><br><span class="line">curl http://localhost:9090/api/v1/query?query=xget_request_count</span><br></pre></td></tr></tbody></table></figure><h3 id="Grafana">Grafana</h3><h4 id="配置-Grafana-仪表板">配置 Grafana 仪表板</h4><p>在 Grafana 中配置 Xget 仪表板：</p><figure class="highlight json"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line">  <span class="attr">"dashboard"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">    <span class="attr">"title"</span><span class="punctuation">:</span> <span class="string">"Xget Metrics"</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"panels"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">      <span class="punctuation">{</span></span><br><span class="line">        <span class="attr">"title"</span><span class="punctuation">:</span> <span class="string">"Request Count"</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">"targets"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">          <span class="punctuation">{</span></span><br><span class="line">            <span class="attr">"expr"</span><span class="punctuation">:</span> <span class="string">"xget_request_count"</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">"refId"</span><span class="punctuation">:</span> <span class="string">"A"</span></span><br><span class="line">          <span class="punctuation">}</span></span><br><span class="line">        <span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line">      <span class="punctuation">{</span></span><br><span class="line">        <span class="attr">"title"</span><span class="punctuation">:</span> <span class="string">"Response Time"</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">"targets"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">          <span class="punctuation">{</span></span><br><span class="line">            <span class="attr">"expr"</span><span class="punctuation">:</span> <span class="string">"xget_response_time"</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">"refId"</span><span class="punctuation">:</span> <span class="string">"A"</span></span><br><span class="line">          <span class="punctuation">}</span></span><br><span class="line">        <span class="punctuation">]</span></span><br><span class="line">      <span class="punctuation">}</span></span><br><span class="line">    <span class="punctuation">]</span></span><br><span class="line">  <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></tbody></table></figure><h3 id="ELK-Stack">ELK Stack</h3><h4 id="配置-Elasticsearch">配置 Elasticsearch</h4><p>在 Elasticsearch 中配置 Xget 日志：</p><figure class="highlight json"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line">  <span class="attr">"index_patterns"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">"xget-*"</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"settings"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">    <span class="attr">"number_of_shards"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">"number_of_replicas"</span><span class="punctuation">:</span> <span class="number">1</span></span><br><span class="line">  <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">"mappings"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">    <span class="attr">"properties"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">      <span class="attr">"timestamp"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">        <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"date"</span></span><br><span class="line">      <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"level"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">        <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"keyword"</span></span><br><span class="line">      <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"message"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">        <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"text"</span></span><br><span class="line">      <span class="punctuation">}</span></span><br><span class="line">    <span class="punctuation">}</span></span><br><span class="line">  <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></tbody></table></figure><h4 id="配置-Logstash">配置 Logstash</h4><p>在 Logstash 中配置 Xget 日志处理：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">input {</span><br><span class="line">  http {</span><br><span class="line">    port =&gt; 5044</span><br><span class="line">    codec =&gt; json</span><br><span class="line">  }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">filter {</span><br><span class="line">  if [type] == "xget" {</span><br><span class="line">    date {</span><br><span class="line">      match =&gt; ["timestamp", "ISO8601"]</span><br><span class="line">    }</span><br><span class="line">  }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">output {</span><br><span class="line">  elasticsearch {</span><br><span class="line">    hosts =&gt; ["http://localhost:9200"]</span><br><span class="line">    index =&gt; "xget-%{+YYYY.MM.dd}"</span><br><span class="line">  }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h2 id="最佳实践">最佳实践</h2><h3 id="配置管理">配置管理</h3><ol><li><p><strong>集中配置</strong></p><ul><li>使用配置文件集中管理 Xget 配置</li><li>在团队中共享配置</li></ul></li><li><p><strong>环境变量</strong></p><ul><li>使用环境变量动态配置 Xget</li><li>支持多环境配置</li></ul></li><li><p><strong>版本控制</strong></p><ul><li>将配置文件纳入版本控制</li><li>使用配置模板</li></ul></li></ol><h3 id="性能优化">性能优化</h3><ol><li><p><strong>缓存策略</strong></p><ul><li>合理设置缓存时间</li><li>使用 CDN 加速</li></ul></li><li><p><strong>并发控制</strong></p><ul><li>控制并发请求数量</li><li>使用连接池</li></ul></li><li><p><strong>监控优化</strong></p><ul><li>监控性能指标</li><li>及时发现问题</li></ul></li></ol><h3 id="安全实践">安全实践</h3><ol><li><p><strong>访问控制</strong></p><ul><li>使用 API 密钥</li><li>限制访问权限</li></ul></li><li><p><strong>数据加密</strong></p><ul><li>使用 HTTPS</li><li>加密敏感数据</li></ul></li><li><p><strong>日志审计</strong></p><ul><li>记录访问日志</li><li>定期审计</li></ul></li></ol><h2 id="总结">总结</h2><p>Xget 通过与各种开发工具、平台和服务的深度集成，为开发者提供了统一的加速体验。从 IDE 到 CI/CD，从包管理器到容器平台，Xget 都能无缝融入开发者的日常工作流程。</p><p>通过合理的配置和优化，开发者可以显著提升开发效率，享受快速、稳定的资源访问体验。</p>]]></content>
    
    
    <summary type="html">详细介绍Xget与Visual Studio Code、JetBrains等IDE、CI/CD流水线、包管理器（npm、pip、docker、maven）等开发工具的深度集成方案。本文展示如何通过简单配置让Xget无缝融入日常开发工作流，为各类开发者资源提供统一的加速体验</summary>
    
    
    
    <category term="技术文档" scheme="https://www.zeroxin.xin/categories/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/"/>
    
    
    <category term="Xget" scheme="https://www.zeroxin.xin/tags/Xget/"/>
    
    <category term="生态系统" scheme="https://www.zeroxin.xin/tags/%E7%94%9F%E6%80%81%E7%B3%BB%E7%BB%9F/"/>
    
    <category term="集成" scheme="https://www.zeroxin.xin/tags/%E9%9B%86%E6%88%90/"/>
    
  </entry>
  
  <entry>
    <title>Xget Git 协议支持详解</title>
    <link href="https://www.zeroxin.xin/2025/12/27/xget-git-protocol-support/"/>
    <id>https://www.zeroxin.xin/2025/12/27/xget-git-protocol-support/</id>
    <published>2025-12-27T08:00:00.000Z</published>
    <updated>2026-06-18T09:21:22.325Z</updated>
    
    <content type="html"><![CDATA[<h1>Xget Git 协议支持详解</h1><h2 id="概述">概述</h2><p>本文档详细介绍了 Xget 对 Git 协议的全面支持，包括 HTTP/HTTPS、SSH、Git 协议等各种 Git 传输协议的加速方案。通过 Xget，开发者可以显著提升 Git 操作的速度和稳定性。</p><h2 id="Git-协议基础">Git 协议基础</h2><h3 id="Git-传输协议">Git 传输协议</h3><p>Git 支持多种传输协议：</p><ol><li><p><strong>HTTP/HTTPS 协议</strong></p><ul><li>最常用的协议</li><li>支持代理和缓存</li><li>适合防火墙环境</li></ul></li><li><p><strong>SSH 协议</strong></p><ul><li>加密传输</li><li>支持认证</li><li>适合安全要求高的场景</li></ul></li><li><p><strong>Git 协议</strong></p><ul><li>最快的协议</li><li>无加密</li><li>适合内网环境</li></ul></li><li><p><strong>Git 协议 (SSH)</strong></p><ul><li>结合了 Git 协议和 SSH</li><li>速度快且安全</li></ul></li></ol><h3 id="Git-操作类型">Git 操作类型</h3><p>Git 操作主要分为以下类型：</p><ol><li><p><strong>Clone</strong></p><ul><li>克隆完整仓库</li><li>浅克隆（shallow clone）</li><li>单分支克隆</li></ul></li><li><p><strong>Fetch</strong></p><ul><li>获取远程更新</li><li>获取特定分支</li><li>获取特定标签</li></ul></li><li><p><strong>Pull</strong></p><ul><li>拉取并合并</li><li>拉取并变基</li></ul></li><li><p><strong>Push</strong></p><ul><li>推送提交</li><li>推送标签</li><li>强制推送</li></ul></li><li><p><strong>其他操作</strong></p><ul><li>LFS 操作</li><li>Submodule 操作</li><li>Archive 操作</li></ul></li></ol><h2 id="HTTP-HTTPS-协议支持">HTTP/HTTPS 协议支持</h2><h3 id="基本原理">基本原理</h3><p>Xget 通过 HTTP/HTTPS 协议代理 Git 操作，实现以下功能：</p><ol><li><p><strong>URL 转换</strong></p><ul><li>将原始 Git URL 转换为 Xget 加速 URL</li><li>自动识别 Git 仓库地址</li></ul></li><li><p><strong>请求代理</strong></p><ul><li>代理 Git HTTP 请求</li><li>处理 Git 特定的请求头</li></ul></li><li><p><strong>响应缓存</strong></p><ul><li>缓存 Git 对象</li><li>减少重复请求</li></ul></li></ol><h3 id="URL-转换规则">URL 转换规则</h3><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// GitHub URL 转换</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">convertGitHubUrl</span>(<span class="params">url</span>) {</span><br><span class="line">  <span class="comment">// 原始 URL: https://github.com/user/repo.git</span></span><br><span class="line">  <span class="comment">// 加速 URL: https://xget.xi-xu.me/gh/user/repo.git</span></span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> pattern = <span class="regexp">/^https?:\/\/github\.com\/(.+?)\/(.+?)(\.git)?$/</span>;</span><br><span class="line">  <span class="keyword">const</span> match = url.<span class="title function_">match</span>(pattern);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (match) {</span><br><span class="line">    <span class="keyword">const</span> [, user, repo] = match;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">`https://xget.xi-xu.me/gh/<span class="subst">${user}</span>/<span class="subst">${repo}</span>.git`</span>;</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> url;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// GitLab URL 转换</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">convertGitLabUrl</span>(<span class="params">url</span>) {</span><br><span class="line">  <span class="comment">// 原始 URL: https://gitlab.com/user/repo.git</span></span><br><span class="line">  <span class="comment">// 加速 URL: https://xget.xi-xu.me/gl/user/repo.git</span></span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> pattern = <span class="regexp">/^https?:\/\/gitlab\.com\/(.+?)\/(.+?)(\.git)?$/</span>;</span><br><span class="line">  <span class="keyword">const</span> match = url.<span class="title function_">match</span>(pattern);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (match) {</span><br><span class="line">    <span class="keyword">const</span> [, user, repo] = match;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">`https://xget.xi-xu.me/gl/<span class="subst">${user}</span>/<span class="subst">${repo}</span>.git`</span>;</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> url;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 通用 URL 转换</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">convertGitUrl</span>(<span class="params">url</span>) {</span><br><span class="line">  <span class="keyword">const</span> converters = [</span><br><span class="line">    convertGitHubUrl,</span><br><span class="line">    convertGitLabUrl,</span><br><span class="line">    <span class="comment">// 添加其他平台的转换函数</span></span><br><span class="line">  ];</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">const</span> converter <span class="keyword">of</span> converters) {</span><br><span class="line">    <span class="keyword">const</span> converted = <span class="title function_">converter</span>(url);</span><br><span class="line">    <span class="keyword">if</span> (converted !== url) {</span><br><span class="line">      <span class="keyword">return</span> converted;</span><br><span class="line">    }</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> url;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h3 id="Git-HTTP-请求处理">Git HTTP 请求处理</h3><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Git HTTP 请求处理器</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">handleGitHttpRequest</span>(<span class="params">request</span>) {</span><br><span class="line">  <span class="keyword">const</span> url = <span class="keyword">new</span> <span class="title function_">URL</span>(request.<span class="property">url</span>);</span><br><span class="line">  <span class="keyword">const</span> path = url.<span class="property">pathname</span>;</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// Git 智能协议请求</span></span><br><span class="line">  <span class="keyword">if</span> (path.<span class="title function_">endsWith</span>(<span class="string">'/info/refs'</span>)) {</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">await</span> <span class="title function_">handleInfoRefs</span>(request);</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// Git 对象请求</span></span><br><span class="line">  <span class="keyword">if</span> (path.<span class="title function_">includes</span>(<span class="string">'/objects/'</span>)) {</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">await</span> <span class="title function_">handleGitObject</span>(request);</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// Git 上传包请求</span></span><br><span class="line">  <span class="keyword">if</span> (path.<span class="title function_">includes</span>(<span class="string">'/git-upload-pack'</span>)) {</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">await</span> <span class="title function_">handleUploadPack</span>(request);</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// Git 接收包请求</span></span><br><span class="line">  <span class="keyword">if</span> (path.<span class="title function_">includes</span>(<span class="string">'/git-receive-pack'</span>)) {</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">await</span> <span class="title function_">handleReceivePack</span>(request);</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 默认处理</span></span><br><span class="line">  <span class="keyword">return</span> <span class="keyword">await</span> <span class="title function_">fetch</span>(request);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 处理 info/refs 请求</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">handleInfoRefs</span>(<span class="params">request</span>) {</span><br><span class="line">  <span class="keyword">const</span> url = <span class="keyword">new</span> <span class="title function_">URL</span>(request.<span class="property">url</span>);</span><br><span class="line">  <span class="keyword">const</span> service = url.<span class="property">searchParams</span>.<span class="title function_">get</span>(<span class="string">'service'</span>);</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 构建目标 URL</span></span><br><span class="line">  <span class="keyword">const</span> targetUrl = <span class="title function_">buildTargetUrl</span>(url);</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 添加 Git 特定的请求头</span></span><br><span class="line">  <span class="keyword">const</span> headers = <span class="keyword">new</span> <span class="title class_">Headers</span>(request.<span class="property">headers</span>);</span><br><span class="line">  headers.<span class="title function_">set</span>(<span class="string">'Git-Protocol'</span>, <span class="string">'version=2'</span>);</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 发送请求</span></span><br><span class="line">  <span class="keyword">const</span> response = <span class="keyword">await</span> <span class="title function_">fetch</span>(targetUrl, {</span><br><span class="line">    <span class="attr">method</span>: request.<span class="property">method</span>,</span><br><span class="line">    <span class="attr">headers</span>: headers</span><br><span class="line">  });</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> response;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 处理 Git 对象请求</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">handleGitObject</span>(<span class="params">request</span>) {</span><br><span class="line">  <span class="keyword">const</span> url = <span class="keyword">new</span> <span class="title function_">URL</span>(request.<span class="property">url</span>);</span><br><span class="line">  <span class="keyword">const</span> targetUrl = <span class="title function_">buildTargetUrl</span>(url);</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 检查缓存</span></span><br><span class="line">  <span class="keyword">const</span> cacheKey = <span class="string">`git-object:<span class="subst">${url.pathname}</span>`</span>;</span><br><span class="line">  <span class="keyword">const</span> cached = <span class="keyword">await</span> <span class="variable constant_">CACHE</span>.<span class="title function_">get</span>(cacheKey);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (cached) {</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(cached, {</span><br><span class="line">      <span class="attr">headers</span>: {</span><br><span class="line">        <span class="string">'X-Cache'</span>: <span class="string">'HIT'</span>,</span><br><span class="line">        <span class="string">'Content-Type'</span>: <span class="string">'application/x-git-loose-object'</span></span><br><span class="line">      }</span><br><span class="line">    });</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 发送请求</span></span><br><span class="line">  <span class="keyword">const</span> response = <span class="keyword">await</span> <span class="title function_">fetch</span>(targetUrl, {</span><br><span class="line">    <span class="attr">method</span>: request.<span class="property">method</span>,</span><br><span class="line">    <span class="attr">headers</span>: request.<span class="property">headers</span></span><br><span class="line">  });</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 缓存响应</span></span><br><span class="line">  <span class="keyword">if</span> (response.<span class="property">ok</span>) {</span><br><span class="line">    <span class="keyword">const</span> clonedResponse = response.<span class="title function_">clone</span>();</span><br><span class="line">    <span class="keyword">const</span> buffer = <span class="keyword">await</span> clonedResponse.<span class="title function_">arrayBuffer</span>();</span><br><span class="line">    <span class="keyword">await</span> <span class="variable constant_">CACHE</span>.<span class="title function_">put</span>(cacheKey, buffer, {</span><br><span class="line">      <span class="attr">expirationTtl</span>: <span class="number">86400</span> <span class="comment">// 缓存 24 小时</span></span><br><span class="line">    });</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> response;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 处理 git-upload-pack 请求</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">handleUploadPack</span>(<span class="params">request</span>) {</span><br><span class="line">  <span class="keyword">const</span> url = <span class="keyword">new</span> <span class="title function_">URL</span>(request.<span class="property">url</span>);</span><br><span class="line">  <span class="keyword">const</span> targetUrl = <span class="title function_">buildTargetUrl</span>(url);</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 处理 POST 请求体</span></span><br><span class="line">  <span class="keyword">const</span> body = <span class="keyword">await</span> request.<span class="title function_">arrayBuffer</span>();</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 发送请求</span></span><br><span class="line">  <span class="keyword">const</span> response = <span class="keyword">await</span> <span class="title function_">fetch</span>(targetUrl, {</span><br><span class="line">    <span class="attr">method</span>: <span class="string">'POST'</span>,</span><br><span class="line">    <span class="attr">headers</span>: {</span><br><span class="line">      <span class="string">'Content-Type'</span>: <span class="string">'application/x-git-upload-pack-request'</span>,</span><br><span class="line">      <span class="string">'Accept'</span>: <span class="string">'application/x-git-upload-pack-result'</span></span><br><span class="line">    },</span><br><span class="line">    <span class="attr">body</span>: body</span><br><span class="line">  });</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> response;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 处理 git-receive-pack 请求</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">handleReceivePack</span>(<span class="params">request</span>) {</span><br><span class="line">  <span class="keyword">const</span> url = <span class="keyword">new</span> <span class="title function_">URL</span>(request.<span class="property">url</span>);</span><br><span class="line">  <span class="keyword">const</span> targetUrl = <span class="title function_">buildTargetUrl</span>(url);</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 处理 POST 请求体</span></span><br><span class="line">  <span class="keyword">const</span> body = <span class="keyword">await</span> request.<span class="title function_">arrayBuffer</span>();</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 发送请求</span></span><br><span class="line">  <span class="keyword">const</span> response = <span class="keyword">await</span> <span class="title function_">fetch</span>(targetUrl, {</span><br><span class="line">    <span class="attr">method</span>: <span class="string">'POST'</span>,</span><br><span class="line">    <span class="attr">headers</span>: {</span><br><span class="line">      <span class="string">'Content-Type'</span>: <span class="string">'application/x-git-receive-pack-request'</span>,</span><br><span class="line">      <span class="string">'Accept'</span>: <span class="string">'application/x-git-receive-pack-result'</span></span><br><span class="line">    },</span><br><span class="line">    <span class="attr">body</span>: body</span><br><span class="line">  });</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 失效相关缓存</span></span><br><span class="line">  <span class="keyword">await</span> <span class="title function_">invalidateGitCache</span>(url.<span class="property">pathname</span>);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> response;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 构建目标 URL</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">buildTargetUrl</span>(<span class="params">url</span>) {</span><br><span class="line">  <span class="comment">// 移除 Xget 前缀</span></span><br><span class="line">  <span class="keyword">const</span> path = url.<span class="property">pathname</span>.<span class="title function_">replace</span>(<span class="regexp">/^\/(gh|gl|gitea)\//</span>, <span class="string">''</span>);</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 构建目标 URL</span></span><br><span class="line">  <span class="keyword">const</span> platform = url.<span class="property">pathname</span>.<span class="title function_">split</span>(<span class="string">'/'</span>)[<span class="number">1</span>];</span><br><span class="line">  <span class="keyword">const</span> baseUrl = <span class="title function_">getPlatformBaseUrl</span>(platform);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> <span class="string">`<span class="subst">${baseUrl}</span>/<span class="subst">${path}</span>`</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 获取平台基础 URL</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">getPlatformBaseUrl</span>(<span class="params">platform</span>) {</span><br><span class="line">  <span class="keyword">const</span> platforms = {</span><br><span class="line">    <span class="string">'gh'</span>: <span class="string">'https://github.com'</span>,</span><br><span class="line">    <span class="string">'gl'</span>: <span class="string">'https://gitlab.com'</span>,</span><br><span class="line">    <span class="string">'gitea'</span>: <span class="string">'https://gitea.com'</span></span><br><span class="line">  };</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> platforms[platform] || <span class="string">'https://github.com'</span>;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h3 id="Git-LFS-支持">Git LFS 支持</h3><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Git LFS 请求处理</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">handleGitLfsRequest</span>(<span class="params">request</span>) {</span><br><span class="line">  <span class="keyword">const</span> url = <span class="keyword">new</span> <span class="title function_">URL</span>(request.<span class="property">url</span>);</span><br><span class="line">  <span class="keyword">const</span> path = url.<span class="property">pathname</span>;</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// LFS 对象下载</span></span><br><span class="line">  <span class="keyword">if</span> (path.<span class="title function_">includes</span>(<span class="string">'/objects/'</span>)) {</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">await</span> <span class="title function_">handleLFSObject</span>(request);</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// LFS 批量操作</span></span><br><span class="line">  <span class="keyword">if</span> (path.<span class="title function_">includes</span>(<span class="string">'/objects/batch'</span>)) {</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">await</span> <span class="title function_">handleLFSBatch</span>(request);</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> <span class="keyword">await</span> <span class="title function_">fetch</span>(request);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 处理 LFS 对象请求</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">handleLFSObject</span>(<span class="params">request</span>) {</span><br><span class="line">  <span class="keyword">const</span> url = <span class="keyword">new</span> <span class="title function_">URL</span>(request.<span class="property">url</span>);</span><br><span class="line">  <span class="keyword">const</span> targetUrl = <span class="title function_">buildTargetUrl</span>(url);</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 检查缓存</span></span><br><span class="line">  <span class="keyword">const</span> cacheKey = <span class="string">`lfs-object:<span class="subst">${url.pathname}</span>`</span>;</span><br><span class="line">  <span class="keyword">const</span> cached = <span class="keyword">await</span> <span class="variable constant_">CACHE</span>.<span class="title function_">get</span>(cacheKey);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (cached) {</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(cached, {</span><br><span class="line">      <span class="attr">headers</span>: {</span><br><span class="line">        <span class="string">'X-Cache'</span>: <span class="string">'HIT'</span>,</span><br><span class="line">        <span class="string">'Content-Type'</span>: <span class="string">'application/vnd.git-lfs'</span></span><br><span class="line">      }</span><br><span class="line">    });</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 发送请求</span></span><br><span class="line">  <span class="keyword">const</span> response = <span class="keyword">await</span> <span class="title function_">fetch</span>(targetUrl, {</span><br><span class="line">    <span class="attr">method</span>: request.<span class="property">method</span>,</span><br><span class="line">    <span class="attr">headers</span>: request.<span class="property">headers</span></span><br><span class="line">  });</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 缓存响应</span></span><br><span class="line">  <span class="keyword">if</span> (response.<span class="property">ok</span>) {</span><br><span class="line">    <span class="keyword">const</span> clonedResponse = response.<span class="title function_">clone</span>();</span><br><span class="line">    <span class="keyword">const</span> buffer = <span class="keyword">await</span> clonedResponse.<span class="title function_">arrayBuffer</span>();</span><br><span class="line">    <span class="keyword">await</span> <span class="variable constant_">CACHE</span>.<span class="title function_">put</span>(cacheKey, buffer, {</span><br><span class="line">      <span class="attr">expirationTtl</span>: <span class="number">604800</span> <span class="comment">// 缓存 7 天</span></span><br><span class="line">    });</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> response;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 处理 LFS 批量操作</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">handleLFSBatch</span>(<span class="params">request</span>) {</span><br><span class="line">  <span class="keyword">const</span> url = <span class="keyword">new</span> <span class="title function_">URL</span>(request.<span class="property">url</span>);</span><br><span class="line">  <span class="keyword">const</span> targetUrl = <span class="title function_">buildTargetUrl</span>(url);</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 处理 POST 请求体</span></span><br><span class="line">  <span class="keyword">const</span> body = <span class="keyword">await</span> request.<span class="title function_">json</span>();</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 发送请求</span></span><br><span class="line">  <span class="keyword">const</span> response = <span class="keyword">await</span> <span class="title function_">fetch</span>(targetUrl, {</span><br><span class="line">    <span class="attr">method</span>: <span class="string">'POST'</span>,</span><br><span class="line">    <span class="attr">headers</span>: {</span><br><span class="line">      <span class="string">'Content-Type'</span>: <span class="string">'application/vnd.git-lfs+json'</span>,</span><br><span class="line">      <span class="string">'Accept'</span>: <span class="string">'application/vnd.git-lfs+json'</span></span><br><span class="line">    },</span><br><span class="line">    <span class="attr">body</span>: <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(body)</span><br><span class="line">  });</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> response;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h2 id="SSH-协议支持">SSH 协议支持</h2><h3 id="SSH-代理原理">SSH 代理原理</h3><p>Xget 通过 SSH 代理实现 Git SSH 协议的加速：</p><ol><li><p><strong>SSH 连接代理</strong></p><ul><li>代理 SSH 连接</li><li>处理 SSH 认证</li></ul></li><li><p><strong>数据传输优化</strong></p><ul><li>压缩传输数据</li><li>缓存传输内容</li></ul></li><li><p><strong>连接复用</strong></p><ul><li>复用 SSH 连接</li><li>减少连接开销</li></ul></li></ol><h3 id="SSH-URL-转换">SSH URL 转换</h3><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// SSH URL 转换</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">convertSSHUrl</span>(<span class="params">url</span>) {</span><br><span class="line">  <span class="comment">// 原始 URL: git@github.com:user/repo.git</span></span><br><span class="line">  <span class="comment">// 加速 URL: ssh://git@xget.xi-xu.me:22/gh/user/repo.git</span></span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> sshPattern = <span class="regexp">/^git@([^:]+):(.+)$/</span>;</span><br><span class="line">  <span class="keyword">const</span> match = url.<span class="title function_">match</span>(sshPattern);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (match) {</span><br><span class="line">    <span class="keyword">const</span> [, host, repoPath] = match;</span><br><span class="line">    <span class="keyword">const</span> platform = <span class="title function_">getPlatformFromHost</span>(host);</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> <span class="string">`ssh://git@xget.xi-xu.me:22/<span class="subst">${platform}</span>/<span class="subst">${repoPath}</span>`</span>;</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> url;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 从主机名获取平台</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">getPlatformFromHost</span>(<span class="params">host</span>) {</span><br><span class="line">  <span class="keyword">const</span> platforms = {</span><br><span class="line">    <span class="string">'github.com'</span>: <span class="string">'gh'</span>,</span><br><span class="line">    <span class="string">'gitlab.com'</span>: <span class="string">'gl'</span>,</span><br><span class="line">    <span class="string">'gitea.com'</span>: <span class="string">'gitea'</span></span><br><span class="line">  };</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> platforms[host] || <span class="string">'gh'</span>;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h3 id="SSH-配置">SSH 配置</h3><p>在 <code>~/.ssh/config</code> 中配置 Xget SSH 代理：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"># GitHub</span><br><span class="line">Host github.com</span><br><span class="line">    HostName xget.xi-xu.me</span><br><span class="line">    Port 22</span><br><span class="line">    User git</span><br><span class="line">    IdentityFile ~/.ssh/id_rsa</span><br><span class="line">    ProxyCommand ssh -W %h:%p git@xget.xi-xu.me</span><br><span class="line"></span><br><span class="line"># GitLab</span><br><span class="line">Host gitlab.com</span><br><span class="line">    HostName xget.xi-xu.me</span><br><span class="line">    Port 22</span><br><span class="line">    User git</span><br><span class="line">    IdentityFile ~/.ssh/id_rsa</span><br><span class="line">    ProxyCommand ssh -W %h:%p git@xget.xi-xu.me</span><br></pre></td></tr></tbody></table></figure><h3 id="SSH-密钥管理">SSH 密钥管理</h3><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// SSH 密钥验证</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">verifySSHKey</span>(<span class="params">publicKey</span>) {</span><br><span class="line">  <span class="comment">// 验证 SSH 密钥格式</span></span><br><span class="line">  <span class="keyword">const</span> keyPattern = <span class="regexp">/^(ssh-rsa|ssh-ed25519|ecdsa-sha2-nistp256|ecdsa-sha2-nistp384|ecdsa-sha2-nistp521) /</span>;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (!keyPattern.<span class="title function_">test</span>(publicKey)) {</span><br><span class="line">    <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">Error</span>(<span class="string">'Invalid SSH key format'</span>);</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 验证密钥长度</span></span><br><span class="line">  <span class="keyword">const</span> keyParts = publicKey.<span class="title function_">split</span>(<span class="string">' '</span>);</span><br><span class="line">  <span class="keyword">if</span> (keyParts.<span class="property">length</span> &lt; <span class="number">2</span>) {</span><br><span class="line">    <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">Error</span>(<span class="string">'Invalid SSH key format'</span>);</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// SSH 密钥存储</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">storeSSHKey</span>(<span class="params">userId, publicKey</span>) {</span><br><span class="line">  <span class="keyword">const</span> key = <span class="string">`ssh-key:<span class="subst">${userId}</span>`</span>;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">await</span> <span class="variable constant_">KV</span>.<span class="title function_">put</span>(key, publicKey, {</span><br><span class="line">    <span class="attr">expirationTtl</span>: <span class="number">2592000</span> <span class="comment">// 30 天</span></span><br><span class="line">  });</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// SSH 密钥获取</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">getSSHKey</span>(<span class="params">userId</span>) {</span><br><span class="line">  <span class="keyword">const</span> key = <span class="string">`ssh-key:<span class="subst">${userId}</span>`</span>;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> <span class="keyword">await</span> <span class="variable constant_">KV</span>.<span class="title function_">get</span>(key);</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h2 id="Git-协议支持">Git 协议支持</h2><h3 id="Git-协议原理">Git 协议原理</h3><p>Git 协议是 Git 专用的传输协议，特点：</p><ol><li><p><strong>高效传输</strong></p><ul><li>二进制协议</li><li>最小化数据传输</li></ul></li><li><p><strong>无加密</strong></p><ul><li>速度快</li><li>不适合公网</li></ul></li><li><p><strong>简单实现</strong></p><ul><li>协议简单</li><li>易于实现</li></ul></li></ol><h3 id="Git-协议-URL-转换">Git 协议 URL 转换</h3><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Git 协议 URL 转换</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">convertGitProtocolUrl</span>(<span class="params">url</span>) {</span><br><span class="line">  <span class="comment">// 原始 URL: git://github.com/user/repo.git</span></span><br><span class="line">  <span class="comment">// 加速 URL: git://xget.xi-xu.me/gh/user/repo.git</span></span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> gitPattern = <span class="regexp">/^git:\/\/([^\/]+)\/(.+)$/</span>;</span><br><span class="line">  <span class="keyword">const</span> match = url.<span class="title function_">match</span>(gitPattern);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (match) {</span><br><span class="line">    <span class="keyword">const</span> [, host, repoPath] = match;</span><br><span class="line">    <span class="keyword">const</span> platform = <span class="title function_">getPlatformFromHost</span>(host);</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> <span class="string">`git://xget.xi-xu.me/<span class="subst">${platform}</span>/<span class="subst">${repoPath}</span>`</span>;</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> url;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h3 id="Git-协议处理">Git 协议处理</h3><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Git 协议请求处理</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">handleGitProtocolRequest</span>(<span class="params">request</span>) {</span><br><span class="line">  <span class="keyword">const</span> url = <span class="keyword">new</span> <span class="title function_">URL</span>(request.<span class="property">url</span>);</span><br><span class="line">  <span class="keyword">const</span> path = url.<span class="property">pathname</span>;</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// Git 协议请求</span></span><br><span class="line">  <span class="keyword">if</span> (url.<span class="property">protocol</span> === <span class="string">'git:'</span>) {</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">await</span> <span class="title function_">handleGitProtocol</span>(request);</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> <span class="keyword">await</span> <span class="title function_">fetch</span>(request);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 处理 Git 协议</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">handleGitProtocol</span>(<span class="params">request</span>) {</span><br><span class="line">  <span class="keyword">const</span> url = <span class="keyword">new</span> <span class="title function_">URL</span>(request.<span class="property">url</span>);</span><br><span class="line">  <span class="keyword">const</span> targetUrl = <span class="title function_">buildTargetUrl</span>(url);</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 创建 Git 协议连接</span></span><br><span class="line">  <span class="keyword">const</span> connection = <span class="keyword">await</span> <span class="title function_">createGitConnection</span>(targetUrl);</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 处理 Git 协议握手</span></span><br><span class="line">  <span class="keyword">await</span> <span class="title function_">handleGitHandshake</span>(connection);</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 处理 Git 协议数据传输</span></span><br><span class="line">  <span class="keyword">return</span> <span class="keyword">await</span> <span class="title function_">handleGitDataTransfer</span>(connection, request);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 创建 Git 协议连接</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">createGitConnection</span>(<span class="params">url</span>) {</span><br><span class="line">  <span class="comment">// 实现 Git 协议连接</span></span><br><span class="line">  <span class="keyword">const</span> connection = {</span><br><span class="line">    <span class="attr">url</span>: url,</span><br><span class="line">    <span class="attr">socket</span>: <span class="literal">null</span>,</span><br><span class="line">    <span class="attr">state</span>: <span class="string">'connected'</span></span><br><span class="line">  };</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> connection;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 处理 Git 协议握手</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">handleGitHandshake</span>(<span class="params">connection</span>) {</span><br><span class="line">  <span class="comment">// 实现 Git 协议握手</span></span><br><span class="line">  <span class="keyword">const</span> handshake = <span class="string">`git-upload-pack <span class="subst">${connection.url.pathname}</span>\0host=<span class="subst">${connection.url.hostname}</span>\0`</span>;</span><br><span class="line">  </span><br><span class="line">  connection.<span class="property">socket</span>.<span class="title function_">send</span>(handshake);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> response = <span class="keyword">await</span> connection.<span class="property">socket</span>.<span class="title function_">receive</span>();</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> response;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 处理 Git 协议数据传输</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">handleGitDataTransfer</span>(<span class="params">connection, request</span>) {</span><br><span class="line">  <span class="comment">// 实现 Git 协议数据传输</span></span><br><span class="line">  <span class="keyword">const</span> data = <span class="keyword">await</span> request.<span class="title function_">arrayBuffer</span>();</span><br><span class="line">  </span><br><span class="line">  connection.<span class="property">socket</span>.<span class="title function_">send</span>(data);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> response = <span class="keyword">await</span> connection.<span class="property">socket</span>.<span class="title function_">receive</span>();</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(response, {</span><br><span class="line">    <span class="attr">headers</span>: {</span><br><span class="line">      <span class="string">'Content-Type'</span>: <span class="string">'application/x-git-upload-pack-result'</span></span><br><span class="line">    }</span><br><span class="line">  });</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h2 id="Git-操作优化">Git 操作优化</h2><h3 id="Clone-操作优化">Clone 操作优化</h3><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Clone 操作优化</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">optimizeClone</span>(<span class="params">url, options = {}</span>) {</span><br><span class="line">  <span class="keyword">const</span> { depth = <span class="number">0</span>, singleBranch = <span class="literal">false</span>, branch = <span class="literal">null</span> } = options;</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 构建优化后的 URL</span></span><br><span class="line">  <span class="keyword">let</span> optimizedUrl = <span class="title function_">convertGitUrl</span>(url);</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 添加查询参数</span></span><br><span class="line">  <span class="keyword">const</span> searchParams = <span class="keyword">new</span> <span class="title class_">URLSearchParams</span>();</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (depth &gt; <span class="number">0</span>) {</span><br><span class="line">    searchParams.<span class="title function_">set</span>(<span class="string">'depth'</span>, depth.<span class="title function_">toString</span>());</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (singleBranch) {</span><br><span class="line">    searchParams.<span class="title function_">set</span>(<span class="string">'single-branch'</span>, <span class="string">'true'</span>);</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (branch) {</span><br><span class="line">    searchParams.<span class="title function_">set</span>(<span class="string">'branch'</span>, branch);</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (searchParams.<span class="title function_">toString</span>()) {</span><br><span class="line">    optimizedUrl += <span class="string">`?<span class="subst">${searchParams.toString()}</span>`</span>;</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> optimizedUrl;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 使用示例</span></span><br><span class="line"><span class="keyword">const</span> optimizedUrl = <span class="keyword">await</span> <span class="title function_">optimizeClone</span>(<span class="string">'https://github.com/user/repo.git'</span>, {</span><br><span class="line">  <span class="attr">depth</span>: <span class="number">1</span>,</span><br><span class="line">  <span class="attr">singleBranch</span>: <span class="literal">true</span>,</span><br><span class="line">  <span class="attr">branch</span>: <span class="string">'main'</span></span><br><span class="line">});</span><br></pre></td></tr></tbody></table></figure><h3 id="Fetch-操作优化">Fetch 操作优化</h3><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Fetch 操作优化</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">optimizeFetch</span>(<span class="params">url, options = {}</span>) {</span><br><span class="line">  <span class="keyword">const</span> { depth = <span class="number">0</span>, prune = <span class="literal">false</span>, tags = <span class="literal">true</span> } = options;</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 构建优化后的 URL</span></span><br><span class="line">  <span class="keyword">let</span> optimizedUrl = <span class="title function_">convertGitUrl</span>(url);</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 添加查询参数</span></span><br><span class="line">  <span class="keyword">const</span> searchParams = <span class="keyword">new</span> <span class="title class_">URLSearchParams</span>();</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (depth &gt; <span class="number">0</span>) {</span><br><span class="line">    searchParams.<span class="title function_">set</span>(<span class="string">'depth'</span>, depth.<span class="title function_">toString</span>());</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (prune) {</span><br><span class="line">    searchParams.<span class="title function_">set</span>(<span class="string">'prune'</span>, <span class="string">'true'</span>);</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (!tags) {</span><br><span class="line">    searchParams.<span class="title function_">set</span>(<span class="string">'no-tags'</span>, <span class="string">'true'</span>);</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (searchParams.<span class="title function_">toString</span>()) {</span><br><span class="line">    optimizedUrl += <span class="string">`?<span class="subst">${searchParams.toString()}</span>`</span>;</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> optimizedUrl;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 使用示例</span></span><br><span class="line"><span class="keyword">const</span> optimizedUrl = <span class="keyword">await</span> <span class="title function_">optimizeFetch</span>(<span class="string">'https://github.com/user/repo.git'</span>, {</span><br><span class="line">  <span class="attr">depth</span>: <span class="number">1</span>,</span><br><span class="line">  <span class="attr">prune</span>: <span class="literal">true</span>,</span><br><span class="line">  <span class="attr">tags</span>: <span class="literal">false</span></span><br><span class="line">});</span><br></pre></td></tr></tbody></table></figure><h3 id="Push-操作优化">Push 操作优化</h3><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Push 操作优化</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">optimizePush</span>(<span class="params">url, options = {}</span>) {</span><br><span class="line">  <span class="keyword">const</span> { force = <span class="literal">false</span>, forceWithLease = <span class="literal">false</span>, tags = <span class="literal">false</span> } = options;</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 构建优化后的 URL</span></span><br><span class="line">  <span class="keyword">let</span> optimizedUrl = <span class="title function_">convertGitUrl</span>(url);</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 添加查询参数</span></span><br><span class="line">  <span class="keyword">const</span> searchParams = <span class="keyword">new</span> <span class="title class_">URLSearchParams</span>();</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (force) {</span><br><span class="line">    searchParams.<span class="title function_">set</span>(<span class="string">'force'</span>, <span class="string">'true'</span>);</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (forceWithLease) {</span><br><span class="line">    searchParams.<span class="title function_">set</span>(<span class="string">'force-with-lease'</span>, <span class="string">'true'</span>);</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (tags) {</span><br><span class="line">    searchParams.<span class="title function_">set</span>(<span class="string">'tags'</span>, <span class="string">'true'</span>);</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (searchParams.<span class="title function_">toString</span>()) {</span><br><span class="line">    optimizedUrl += <span class="string">`?<span class="subst">${searchParams.toString()}</span>`</span>;</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> optimizedUrl;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 使用示例</span></span><br><span class="line"><span class="keyword">const</span> optimizedUrl = <span class="keyword">await</span> <span class="title function_">optimizePush</span>(<span class="string">'https://github.com/user/repo.git'</span>, {</span><br><span class="line">  <span class="attr">force</span>: <span class="literal">false</span>,</span><br><span class="line">  <span class="attr">tags</span>: <span class="literal">true</span></span><br><span class="line">});</span><br></pre></td></tr></tbody></table></figure><h2 id="Git-配置优化">Git 配置优化</h2><h3 id="全局配置">全局配置</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 配置 Git 使用 Xget</span></span><br><span class="line">git config --global url.<span class="string">"https://xget.xi-xu.me/gh/"</span>.insteadOf <span class="string">"https://github.com/"</span></span><br><span class="line">git config --global url.<span class="string">"https://xget.xi-xu.me/gl/"</span>.insteadOf <span class="string">"https://gitlab.com/"</span></span><br><span class="line">git config --global url.<span class="string">"https://xget.xi-xu.me/gitea/"</span>.insteadOf <span class="string">"https://gitea.com/"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置 Git 协议</span></span><br><span class="line">git config --global http.proxy http://xget.xi-xu.me:8080</span><br><span class="line">git config --global https.proxy https://xget.xi-xu.me:8443</span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置缓存</span></span><br><span class="line">git config --global http.cache 3600</span><br><span class="line">git config --global https.cache 3600</span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置压缩</span></span><br><span class="line">git config --global core.compression 9</span><br><span class="line">git config --global http.compression 9</span><br><span class="line">git config --global https.com 9</span><br></pre></td></tr></tbody></table></figure><h3 id="仓库配置">仓库配置</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 进入仓库目录</span></span><br><span class="line"><span class="built_in">cd</span> your-repo</span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置仓库使用 Xget</span></span><br><span class="line">git config url.<span class="string">"https://xget.xi-xu.me/gh/"</span>.insteadOf <span class="string">"https://github.com/"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置 LFS</span></span><br><span class="line">git config lfs.url https://xget.xi-xu.me/gh/user/repo.git/info/lfs</span><br><span class="line">git config lfs.basictransfersonly <span class="literal">true</span></span><br><span class="line">git config lfs.concurrenttransfers 8</span><br></pre></td></tr></tbody></table></figure><h3 id="性能配置">性能配置</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 配置并发</span></span><br><span class="line">git config --global http.postBuffer 524288000</span><br><span class="line">git config --global http.lowSpeedLimit 0</span><br><span class="line">git config --global http.lowSpeedTime 999999</span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置超时</span></span><br><span class="line">git config --global http.timeout 600</span><br><span class="line">git config --global http.connectTimeout 30</span><br><span class="line">git config --global http.readTimeout 600</span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置重试</span></span><br><span class="line">git config --global http.maxRetries 3</span><br><span class="line">git config --global http.retryDelay 1000</span><br></pre></td></tr></tbody></table></figure><h2 id="常见问题">常见问题</h2><h3 id="Q1-如何验证-Git-加速是否生效？">Q1: 如何验证 Git 加速是否生效？</h3><p>A: 使用 <code>time</code> 命令测量操作时间：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 测试 clone 速度</span></span><br><span class="line"><span class="keyword">time</span> git <span class="built_in">clone</span> https://xget.xi-xu.me/gh/user/repo.git</span><br><span class="line"></span><br><span class="line"><span class="comment"># 测试 fetch 速度</span></span><br><span class="line"><span class="keyword">time</span> git fetch origin</span><br></pre></td></tr></tbody></table></figure><h3 id="Q2-Git-LFS-如何使用-Xget-加速？">Q2: Git LFS 如何使用 Xget 加速？</h3><p>A: 配置 LFS 使用 Xget：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git config lfs.url https://xget.xi-xu.me/gh/user/repo.git/info/lfs</span><br><span class="line">git lfs fetch</span><br></pre></td></tr></tbody></table></figure><h3 id="Q3-如何处理-Git-认证问题？">Q3: 如何处理 Git 认证问题？</h3><p>A: 使用 Git 凭据存储：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 配置凭据存储</span></span><br><span class="line">git config --global credential.helper store</span><br><span class="line"></span><br><span class="line"><span class="comment"># 输入凭据</span></span><br><span class="line">git push</span><br></pre></td></tr></tbody></table></figure><h3 id="Q4-Xget-支持哪些-Git-操作？">Q4: Xget 支持哪些 Git 操作？</h3><p>A: Xget 支持所有 Git 操作，包括 clone、fetch、pull、push、LFS 等。</p><h3 id="Q5-如何切换回原始-Git-URL？">Q5: 如何切换回原始 Git URL？</h3><p>A: 移除 Git 配置：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git config --global --<span class="built_in">unset</span> url.<span class="string">"https://xget.xi-xu.me/gh/"</span>.insteadOf</span><br></pre></td></tr></tbody></table></figure><h2 id="总结">总结</h2><p>Xget 提供了全面的 Git 协议支持，包括 HTTP/HTTPS、SSH、Git 协议等各种传输协议。通过 URL 转换、请求代理、响应缓存等技术，Xget 显著提升了 Git 操作的速度和稳定性。</p><p>同时，Xget 对 Git LFS、Submodule 等高级功能也提供了完善的支持，确保开发者能够享受到完整的 Git 加速体验。</p>]]></content>
    
    
    <summary type="html">深入解析Xget对Git HTTP/HTTPS、SSH、Git协议等多种传输协议的全面支持方案。本文介绍各协议的加速原理、URL转换规则、配置方法以及在防火墙环境和不同安全需求场景下的最佳实践，帮助开发者在受限网络环境中实现Git操作的全面加速和稳定运行</summary>
    
    
    
    <category term="技术文档" scheme="https://www.zeroxin.xin/categories/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/"/>
    
    
    <category term="Xget" scheme="https://www.zeroxin.xin/tags/Xget/"/>
    
    <category term="Git" scheme="https://www.zeroxin.xin/tags/Git/"/>
    
    <category term="协议" scheme="https://www.zeroxin.xin/tags/%E5%8D%8F%E8%AE%AE/"/>
    
  </entry>
  
  <entry>
    <title>Xget 安全机制与性能优化</title>
    <link href="https://www.zeroxin.xin/2025/12/27/xget-security-and-performance/"/>
    <id>https://www.zeroxin.xin/2025/12/27/xget-security-and-performance/</id>
    <published>2025-12-27T07:30:00.000Z</published>
    <updated>2026-06-18T09:21:22.324Z</updated>
    
    <content type="html"><![CDATA[<h1>Xget 安全机制与性能优化</h1><h2 id="概述">概述</h2><p>本文档详细介绍了 Xget 的安全机制和性能优化策略。通过多层安全防护和全面的性能优化，Xget 确保了服务的安全性、稳定性和高性能。</p><h2 id="安全机制">安全机制</h2><h3 id="请求验证">请求验证</h3><h4 id="User-Agent-验证">User-Agent 验证</h4><p>Xget 对 User-Agent 进行严格验证，确保请求来自合法的客户端。</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// User-Agent 白名单验证</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">USER_AGENT_WHITELIST</span> = [</span><br><span class="line">  <span class="string">'git/'</span>,</span><br><span class="line">  <span class="string">'curl/'</span>,</span><br><span class="line">  <span class="string">'wget/'</span>,</span><br><span class="line">  <span class="string">'aria2/'</span>,</span><br><span class="line">  <span class="string">'npm/'</span>,</span><br><span class="line">  <span class="string">'pip/'</span>,</span><br><span class="line">  <span class="string">'docker/'</span>,</span><br><span class="line">  <span class="string">'Mozilla/5.0'</span>,</span><br><span class="line">  <span class="string">'Go-http-client/'</span>,</span><br><span class="line">  <span class="string">'Java/'</span>,</span><br><span class="line">  <span class="string">'Python-urllib/'</span></span><br><span class="line">];</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">validateUserAgent</span>(<span class="params">userAgent</span>) {</span><br><span class="line">  <span class="keyword">if</span> (!userAgent) {</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> <span class="variable constant_">USER_AGENT_WHITELIST</span>.<span class="title function_">some</span>(<span class="function"><span class="params">pattern</span> =&gt;</span> </span><br><span class="line">    userAgent.<span class="title function_">includes</span>(pattern)</span><br><span class="line">  );</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p><strong>配置示例</strong></p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 在环境变量中配置自定义 User-Agent 白名单</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">CUSTOM_USER_AGENTS</span> = process.<span class="property">env</span>.<span class="property">CUSTOM_USER_AGENTS</span> </span><br><span class="line">  ? process.<span class="property">env</span>.<span class="property">CUSTOM_USER_AGENTS</span>.<span class="title function_">split</span>(<span class="string">','</span>) </span><br><span class="line">  : [];</span><br></pre></td></tr></tbody></table></figure><h4 id="Referer-验证">Referer 验证</h4><p>验证请求来源，防止 CSRF 攻击。</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Referer 白名单验证</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">REFERER_WHITELIST</span> = [</span><br><span class="line">  <span class="string">'https://github.com'</span>,</span><br><span class="line">  <span class="string">'https://gitlab.com'</span>,</span><br><span class="line">  <span class="string">'https://gitee.com'</span>,</span><br><span class="line">  <span class="string">'https://pypi.org'</span>,</span><br><span class="line">  <span class="string">'https://registry.npmjs.org'</span></span><br><span class="line">];</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">validateReferer</span>(<span class="params">referer</span>) {</span><br><span class="line">  <span class="keyword">if</span> (!referer) {</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">true</span>; <span class="comment">// 允许无 Referer 的请求</span></span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">try</span> {</span><br><span class="line">    <span class="keyword">const</span> refererUrl = <span class="keyword">new</span> <span class="title function_">URL</span>(referer);</span><br><span class="line">    <span class="keyword">return</span> <span class="variable constant_">REFERER_WHITELIST</span>.<span class="title function_">some</span>(<span class="function"><span class="params">allowed</span> =&gt;</span> </span><br><span class="line">      refererUrl.<span class="property">origin</span> === allowed</span><br><span class="line">    );</span><br><span class="line">  } <span class="keyword">catch</span> (error) {</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">  }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h4 id="IP-限流">IP 限流</h4><p>基于 IP 的请求限流，防止滥用。</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// IP 限流配置</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">RATE_LIMIT_CONFIG</span> = {</span><br><span class="line">  <span class="attr">windowMs</span>: <span class="number">60</span> * <span class="number">1000</span>, <span class="comment">// 1 分钟</span></span><br><span class="line">  <span class="attr">maxRequests</span>: <span class="number">100</span>,    <span class="comment">// 每分钟最多 100 次请求</span></span><br><span class="line">  <span class="attr">skipSuccessfulRequests</span>: <span class="literal">true</span> <span class="comment">// 跳过成功的请求</span></span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="comment">// 使用 Cloudflare Workers KV 实现限流</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">checkRateLimit</span>(<span class="params">ip</span>) {</span><br><span class="line">  <span class="keyword">const</span> key = <span class="string">`ratelimit:<span class="subst">${ip}</span>`</span>;</span><br><span class="line">  <span class="keyword">const</span> now = <span class="title class_">Date</span>.<span class="title function_">now</span>();</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> data = <span class="keyword">await</span> <span class="variable constant_">KV</span>.<span class="title function_">get</span>(key, { <span class="attr">type</span>: <span class="string">'json'</span> }) || { <span class="attr">count</span>: <span class="number">0</span>, <span class="attr">resetAt</span>: now + <span class="variable constant_">RATE_LIMIT_CONFIG</span>.<span class="property">windowMs</span> };</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (data.<span class="property">resetAt</span> &lt; now) {</span><br><span class="line">    data.<span class="property">count</span> = <span class="number">0</span>;</span><br><span class="line">    data.<span class="property">resetAt</span> = now + <span class="variable constant_">RATE_LIMIT_CONFIG</span>.<span class="property">windowMs</span>;</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (data.<span class="property">count</span> &gt;= <span class="variable constant_">RATE_LIMIT_CONFIG</span>.<span class="property">maxRequests</span>) {</span><br><span class="line">    <span class="keyword">return</span> { <span class="attr">allowed</span>: <span class="literal">false</span>, <span class="attr">resetAt</span>: data.<span class="property">resetAt</span> };</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  data.<span class="property">count</span>++;</span><br><span class="line">  <span class="keyword">await</span> <span class="variable constant_">KV</span>.<span class="title function_">put</span>(key, <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(data), { <span class="attr">expirationTtl</span>: <span class="variable constant_">RATE_LIMIT_CONFIG</span>.<span class="property">windowMs</span> / <span class="number">1000</span> });</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> { <span class="attr">allowed</span>: <span class="literal">true</span>, <span class="attr">remaining</span>: <span class="variable constant_">RATE_LIMIT_CONFIG</span>.<span class="property">maxRequests</span> - data.<span class="property">count</span> };</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h3 id="请求头部处理">请求头部处理</h3><h4 id="安全头部设置">安全头部设置</h4><p>设置安全相关的 HTTP 响应头部。</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 设置安全头部</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">setSecurityHeaders</span>(<span class="params">response</span>) {</span><br><span class="line">  <span class="comment">// 防止点击劫持</span></span><br><span class="line">  response.<span class="property">headers</span>.<span class="title function_">set</span>(<span class="string">'X-Frame-Options'</span>, <span class="string">'DENY'</span>);</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 防止 MIME 类型嗅探</span></span><br><span class="line">  response.<span class="property">headers</span>.<span class="title function_">set</span>(<span class="string">'X-Content-Type-Options'</span>, <span class="string">'nosniff'</span>);</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 启用 XSS 保护</span></span><br><span class="line">  response.<span class="property">headers</span>.<span class="title function_">set</span>(<span class="string">'X-XSS-Protection'</span>, <span class="string">'1; mode=block'</span>);</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 严格传输安全</span></span><br><span class="line">  response.<span class="property">headers</span>.<span class="title function_">set</span>(<span class="string">'Strict-Transport-Security'</span>, <span class="string">'max-age=31536000; includeSubDomains'</span>);</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 内容安全策略</span></span><br><span class="line">  response.<span class="property">headers</span>.<span class="title function_">set</span>(<span class="string">'Content-Security-Policy'</span>, <span class="string">"default-src 'self'"</span>);</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 引用策略</span></span><br><span class="line">  response.<span class="property">headers</span>.<span class="title function_">set</span>(<span class="string">'Referrer-Policy'</span>, <span class="string">'strict-origin-when-cross-origin'</span>);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> response;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h4 id="头部过滤">头部过滤</h4><p>过滤敏感的请求头部，防止信息泄露。</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 需要过滤的敏感头部</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">SENSITIVE_HEADERS</span> = [</span><br><span class="line">  <span class="string">'authorization'</span>,</span><br><span class="line">  <span class="string">'cookie'</span>,</span><br><span class="line">  <span class="string">'set-cookie'</span>,</span><br><span class="line">  <span class="string">'x-api-key'</span>,</span><br><span class="line">  <span class="string">'x-auth-token'</span>,</span><br><span class="line">  <span class="string">'proxy-authorization'</span></span><br><span class="line">];</span><br><span class="line"></span><br><span class="line"><span class="comment">// 过滤头部</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">filterHeaders</span>(<span class="params">headers</span>) {</span><br><span class="line">  <span class="keyword">const</span> filtered = <span class="keyword">new</span> <span class="title class_">Headers</span>();</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">const</span> [key, value] <span class="keyword">of</span> headers.<span class="title function_">entries</span>()) {</span><br><span class="line">    <span class="keyword">const</span> lowerKey = key.<span class="title function_">toLowerCase</span>();</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> (!<span class="variable constant_">SENSITIVE_HEADERS</span>.<span class="title function_">includes</span>(lowerKey)) {</span><br><span class="line">      filtered.<span class="title function_">set</span>(key, value);</span><br><span class="line">    }</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> filtered;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h4 id="头部重写">头部重写</h4><p>重写请求头部以匹配目标服务器的要求。</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 头部重写规则</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">HEADER_REWRITE_RULES</span> = {</span><br><span class="line">  <span class="string">'host'</span>: <span class="function">(<span class="params">url</span>) =&gt;</span> <span class="keyword">new</span> <span class="title function_">URL</span>(url).<span class="property">hostname</span>,</span><br><span class="line">  <span class="string">'origin'</span>: <span class="function">(<span class="params">url</span>) =&gt;</span> <span class="keyword">new</span> <span class="title function_">URL</span>(url).<span class="property">origin</span>,</span><br><span class="line">  <span class="string">'referer'</span>: <span class="function">(<span class="params">url</span>) =&gt;</span> <span class="keyword">new</span> <span class="title function_">URL</span>(url).<span class="property">origin</span></span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="comment">// 重写头部</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">rewriteHeaders</span>(<span class="params">headers, targetUrl</span>) {</span><br><span class="line">  <span class="keyword">const</span> rewritten = <span class="keyword">new</span> <span class="title class_">Headers</span>(headers);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">const</span> [header, rewriter] <span class="keyword">of</span> <span class="title class_">Object</span>.<span class="title function_">entries</span>(<span class="variable constant_">HEADER_REWRITE_RULES</span>)) {</span><br><span class="line">    <span class="keyword">if</span> (rewritten.<span class="title function_">has</span>(header)) {</span><br><span class="line">      rewritten.<span class="title function_">set</span>(header, <span class="title function_">rewriter</span>(targetUrl));</span><br><span class="line">    }</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> rewritten;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h3 id="超时保护">超时保护</h3><h4 id="请求超时">请求超时</h4><p>设置合理的请求超时时间，防止长时间挂起的请求。</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 超时配置</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">TIMEOUT_CONFIG</span> = {</span><br><span class="line">  <span class="attr">connect</span>: <span class="number">10000</span>,    <span class="comment">// 连接超时：10 秒</span></span><br><span class="line">  <span class="attr">read</span>: <span class="number">30000</span>,       <span class="comment">// 读取超时：30 秒</span></span><br><span class="line">  <span class="attr">write</span>: <span class="number">30000</span>,      <span class="comment">// 写入超时：30 秒</span></span><br><span class="line">  <span class="attr">total</span>: <span class="number">60000</span>       <span class="comment">// 总超时：60 秒</span></span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="comment">// 带超时的请求</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">fetchWithTimeout</span>(<span class="params">url, options = {}</span>) {</span><br><span class="line">  <span class="keyword">const</span> controller = <span class="keyword">new</span> <span class="title class_">AbortController</span>();</span><br><span class="line">  <span class="keyword">const</span> timeoutId = <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> controller.<span class="title function_">abort</span>(), <span class="variable constant_">TIMEOUT_CONFIG</span>.<span class="property">total</span>);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">try</span> {</span><br><span class="line">    <span class="keyword">const</span> response = <span class="keyword">await</span> <span class="title function_">fetch</span>(url, {</span><br><span class="line">      ...options,</span><br><span class="line">      <span class="attr">signal</span>: controller.<span class="property">signal</span></span><br><span class="line">    });</span><br><span class="line">    </span><br><span class="line">    <span class="built_in">clearTimeout</span>(timeoutId);</span><br><span class="line">    <span class="keyword">return</span> response;</span><br><span class="line">  } <span class="keyword">catch</span> (error) {</span><br><span class="line">    <span class="built_in">clearTimeout</span>(timeoutId);</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> (error.<span class="property">name</span> === <span class="string">'AbortError'</span>) {</span><br><span class="line">      <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">Error</span>(<span class="string">'Request timeout'</span>);</span><br><span class="line">    }</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">throw</span> error;</span><br><span class="line">  }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h4 id="连接超时">连接超时</h4><p>控制连接建立的超时时间。</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 连接超时控制</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">connectWithTimeout</span>(<span class="params">url, timeout = TIMEOUT_CONFIG.connect</span>) {</span><br><span class="line">  <span class="keyword">const</span> controller = <span class="keyword">new</span> <span class="title class_">AbortController</span>();</span><br><span class="line">  <span class="keyword">const</span> timeoutId = <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> controller.<span class="title function_">abort</span>(), timeout);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">try</span> {</span><br><span class="line">    <span class="keyword">const</span> response = <span class="keyword">await</span> <span class="title function_">fetch</span>(url, {</span><br><span class="line">      <span class="attr">method</span>: <span class="string">'HEAD'</span>,</span><br><span class="line">      <span class="attr">signal</span>: controller.<span class="property">signal</span></span><br><span class="line">    });</span><br><span class="line">    </span><br><span class="line">    <span class="built_in">clearTimeout</span>(timeoutId);</span><br><span class="line">    <span class="keyword">return</span> response;</span><br><span class="line">  } <span class="keyword">catch</span> (error) {</span><br><span class="line">    <span class="built_in">clearTimeout</span>(timeoutId);</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> (error.<span class="property">name</span> === <span class="string">'AbortError'</span>) {</span><br><span class="line">      <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">Error</span>(<span class="string">'Connection timeout'</span>);</span><br><span class="line">    }</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">throw</span> error;</span><br><span class="line">  }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h3 id="错误处理">错误处理</h3><h4 id="错误分类">错误分类</h4><p>对不同类型的错误进行分类处理。</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 错误类型</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">ERROR_TYPES</span> = {</span><br><span class="line">  <span class="attr">NETWORK_ERROR</span>: <span class="string">'NETWORK_ERROR'</span>,</span><br><span class="line">  <span class="attr">TIMEOUT_ERROR</span>: <span class="string">'TIMEOUT_ERROR'</span>,</span><br><span class="line">  <span class="attr">RATE_LIMIT_ERROR</span>: <span class="string">'RATE_LIMIT_ERROR'</span>,</span><br><span class="line">  <span class="attr">VALIDATION_ERROR</span>: <span class="string">'VALIDATION_ERROR'</span>,</span><br><span class="line">  <span class="attr">SERVER_ERROR</span>: <span class="string">'SERVER_ERROR'</span>,</span><br><span class="line">  <span class="attr">CLIENT_ERROR</span>: <span class="string">'CLIENT_ERROR'</span></span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="comment">// 错误处理函数</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">handleError</span>(<span class="params">error</span>) {</span><br><span class="line">  <span class="keyword">if</span> (error.<span class="property">name</span> === <span class="string">'AbortError'</span>) {</span><br><span class="line">    <span class="keyword">return</span> {</span><br><span class="line">      <span class="attr">type</span>: <span class="variable constant_">ERROR_TYPES</span>.<span class="property">TIMEOUT_ERROR</span>,</span><br><span class="line">      <span class="attr">message</span>: <span class="string">'Request timeout'</span>,</span><br><span class="line">      <span class="attr">status</span>: <span class="number">504</span></span><br><span class="line">    };</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (error.<span class="property">message</span>.<span class="title function_">includes</span>(<span class="string">'fetch failed'</span>)) {</span><br><span class="line">    <span class="keyword">return</span> {</span><br><span class="line">      <span class="attr">type</span>: <span class="variable constant_">ERROR_TYPES</span>.<span class="property">NETWORK_ERROR</span>,</span><br><span class="line">      <span class="attr">message</span>: <span class="string">'Network error'</span>,</span><br><span class="line">      <span class="attr">status</span>: <span class="number">502</span></span><br><span class="line">    };</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (error.<span class="property">status</span> &gt;= <span class="number">500</span>) {</span><br><span class="line">    <span class="keyword">return</span> {</span><br><span class="line">      <span class="attr">type</span>: <span class="variable constant_">ERROR_TYPES</span>.<span class="property">SERVER_ERROR</span>,</span><br><span class="line">      <span class="attr">message</span>: <span class="string">'Server error'</span>,</span><br><span class="line">      <span class="attr">status</span>: error.<span class="property">status</span></span><br><span class="line">    };</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (error.<span class="property">status</span> &gt;= <span class="number">400</span>) {</span><br><span class="line">    <span class="keyword">return</span> {</span><br><span class="line">      <span class="attr">type</span>: <span class="variable constant_">ERROR_TYPES</span>.<span class="property">CLIENT_ERROR</span>,</span><br><span class="line">      <span class="attr">message</span>: <span class="string">'Client error'</span>,</span><br><span class="line">      <span class="attr">status</span>: error.<span class="property">status</span></span><br><span class="line">    };</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> {</span><br><span class="line">    <span class="attr">type</span>: <span class="variable constant_">ERROR_TYPES</span>.<span class="property">SERVER_ERROR</span>,</span><br><span class="line">    <span class="attr">message</span>: <span class="string">'Unknown error'</span>,</span><br><span class="line">    <span class="attr">status</span>: <span class="number">500</span></span><br><span class="line">  };</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h4 id="错误响应">错误响应</h4><p>返回友好的错误响应。</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 错误响应</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">errorResponse</span>(<span class="params">error</span>) {</span><br><span class="line">  <span class="keyword">const</span> errorInfo = <span class="title function_">handleError</span>(error);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(<span class="title class_">JSON</span>.<span class="title function_">stringify</span>({</span><br><span class="line">    <span class="attr">error</span>: errorInfo.<span class="property">message</span>,</span><br><span class="line">    <span class="attr">type</span>: errorInfo.<span class="property">type</span>,</span><br><span class="line">    <span class="attr">timestamp</span>: <span class="keyword">new</span> <span class="title class_">Date</span>().<span class="title function_">toISOString</span>()</span><br><span class="line">  }), {</span><br><span class="line">    <span class="attr">status</span>: errorInfo.<span class="property">status</span>,</span><br><span class="line">    <span class="attr">headers</span>: {</span><br><span class="line">      <span class="string">'Content-Type'</span>: <span class="string">'application/json'</span></span><br><span class="line">    }</span><br><span class="line">  });</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h4 id="重试机制">重试机制</h4><p>对可重试的错误实现自动重试。</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 重试配置</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">RETRY_CONFIG</span> = {</span><br><span class="line">  <span class="attr">maxRetries</span>: <span class="number">3</span>,</span><br><span class="line">  <span class="attr">retryDelay</span>: <span class="number">1000</span>,</span><br><span class="line">  <span class="attr">retryableStatuses</span>: [<span class="number">408</span>, <span class="number">429</span>, <span class="number">500</span>, <span class="number">502</span>, <span class="number">503</span>, <span class="number">504</span>],</span><br><span class="line">  <span class="attr">retryableErrors</span>: [<span class="string">'NETWORK_ERROR'</span>, <span class="string">'TIMEOUT_ERROR'</span>]</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="comment">// 带重试的请求</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">fetchWithRetry</span>(<span class="params">url, options = {}, retries = RETRY_CONFIG.maxRetries</span>) {</span><br><span class="line">  <span class="keyword">try</span> {</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">await</span> <span class="title function_">fetchWithTimeout</span>(url, options);</span><br><span class="line">  } <span class="keyword">catch</span> (error) {</span><br><span class="line">    <span class="keyword">const</span> errorInfo = <span class="title function_">handleError</span>(error);</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> (retries &lt;= <span class="number">0</span> || </span><br><span class="line">        !<span class="variable constant_">RETRY_CONFIG</span>.<span class="property">retryableErrors</span>.<span class="title function_">includes</span>(errorInfo.<span class="property">type</span>)) {</span><br><span class="line">      <span class="keyword">throw</span> error;</span><br><span class="line">    }</span><br><span class="line">    </span><br><span class="line">    <span class="comment">// 指数退避</span></span><br><span class="line">    <span class="keyword">const</span> delay = <span class="variable constant_">RETRY_CONFIG</span>.<span class="property">retryDelay</span> * <span class="title class_">Math</span>.<span class="title function_">pow</span>(<span class="number">2</span>, <span class="variable constant_">RETRY_CONFIG</span>.<span class="property">maxRetries</span> - retries);</span><br><span class="line">    <span class="keyword">await</span> <span class="keyword">new</span> <span class="title class_">Promise</span>(<span class="function"><span class="params">resolve</span> =&gt;</span> <span class="built_in">setTimeout</span>(resolve, delay));</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> <span class="title function_">fetchWithRetry</span>(url, options, retries - <span class="number">1</span>);</span><br><span class="line">  }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h2 id="性能优化">性能优化</h2><h3 id="缓存策略">缓存策略</h3><h4 id="边缘缓存">边缘缓存</h4><p>使用 Cloudflare Cache API 实现边缘缓存。</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 缓存配置</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">CACHE_CONFIG</span> = {</span><br><span class="line">  <span class="attr">defaultTTL</span>: <span class="number">1800</span>,        <span class="comment">// 默认缓存时间：30 分钟</span></span><br><span class="line">  <span class="attr">maxTTL</span>: <span class="number">86400</span>,           <span class="comment">// 最大缓存时间：24 小时</span></span><br><span class="line">  <span class="attr">staleWhileRevalidate</span>: <span class="number">60</span> <span class="comment">// 过期后重新验证：1 分钟</span></span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="comment">// 缓存键生成</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">generateCacheKey</span>(<span class="params">url</span>) {</span><br><span class="line">  <span class="keyword">const</span> urlObj = <span class="keyword">new</span> <span class="title function_">URL</span>(url);</span><br><span class="line">  <span class="keyword">return</span> <span class="string">`cache:<span class="subst">${urlObj.hostname}</span>:<span class="subst">${urlObj.pathname}</span>`</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 获取缓存</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">getFromCache</span>(<span class="params">key</span>) {</span><br><span class="line">  <span class="keyword">try</span> {</span><br><span class="line">    <span class="keyword">const</span> cached = <span class="keyword">await</span> <span class="variable constant_">CACHE</span>.<span class="title function_">get</span>(key, { <span class="attr">type</span>: <span class="string">'arrayBuffer'</span> });</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> (cached) {</span><br><span class="line">      <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(cached, {</span><br><span class="line">        <span class="attr">headers</span>: {</span><br><span class="line">          <span class="string">'X-Cache'</span>: <span class="string">'HIT'</span>,</span><br><span class="line">          <span class="string">'X-Cache-Key'</span>: key</span><br><span class="line">        }</span><br><span class="line">      });</span><br><span class="line">    }</span><br><span class="line">  } <span class="keyword">catch</span> (error) {</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">'Cache get error:'</span>, error);</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 设置缓存</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">setCache</span>(<span class="params">key, response</span>) {</span><br><span class="line">  <span class="keyword">try</span> {</span><br><span class="line">    <span class="keyword">const</span> clonedResponse = response.<span class="title function_">clone</span>();</span><br><span class="line">    <span class="keyword">const</span> buffer = <span class="keyword">await</span> clonedResponse.<span class="title function_">arrayBuffer</span>();</span><br><span class="line">    </span><br><span class="line">    <span class="comment">// 根据 Content-Type 设置缓存时间</span></span><br><span class="line">    <span class="keyword">const</span> contentType = response.<span class="property">headers</span>.<span class="title function_">get</span>(<span class="string">'Content-Type'</span>) || <span class="string">''</span>;</span><br><span class="line">    <span class="keyword">let</span> ttl = <span class="variable constant_">CACHE_CONFIG</span>.<span class="property">defaultTTL</span>;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> (contentType.<span class="title function_">includes</span>(<span class="string">'image/'</span>) || contentType.<span class="title function_">includes</span>(<span class="string">'video/'</span>)) {</span><br><span class="line">      ttl = <span class="variable constant_">CACHE_CONFIG</span>.<span class="property">maxTTL</span>;</span><br><span class="line">    } <span class="keyword">else</span> <span class="keyword">if</span> (contentType.<span class="title function_">includes</span>(<span class="string">'text/html'</span>) || contentType.<span class="title function_">includes</span>(<span class="string">'application/json'</span>)) {</span><br><span class="line">      ttl = <span class="variable constant_">CACHE_CONFIG</span>.<span class="property">defaultTTL</span> / <span class="number">2</span>;</span><br><span class="line">    }</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">await</span> <span class="variable constant_">CACHE</span>.<span class="title function_">put</span>(key, buffer, {</span><br><span class="line">      <span class="attr">expirationTtl</span>: ttl</span><br><span class="line">    });</span><br><span class="line">  } <span class="keyword">catch</span> (error) {</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">'Cache set error:'</span>, error);</span><br><span class="line">  }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h4 id="缓存控制">缓存控制</h4><p>根据不同的资源类型设置不同的缓存策略。</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 缓存策略</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">CACHE_STRATEGIES</span> = {</span><br><span class="line">  <span class="comment">// 静态资源：长时间缓存</span></span><br><span class="line">  <span class="attr">static</span>: {</span><br><span class="line">    <span class="attr">maxAge</span>: <span class="number">86400</span>,</span><br><span class="line">    <span class="attr">staleWhileRevalidate</span>: <span class="number">3600</span></span><br><span class="line">  },</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// API 响应：短时间缓存</span></span><br><span class="line">  <span class="attr">api</span>: {</span><br><span class="line">    <span class="attr">maxAge</span>: <span class="number">300</span>,</span><br><span class="line">    <span class="attr">staleWhileRevalidate</span>: <span class="number">60</span></span><br><span class="line">  },</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 动态内容：不缓存</span></span><br><span class="line">  <span class="attr">dynamic</span>: {</span><br><span class="line">    <span class="attr">noCache</span>: <span class="literal">true</span></span><br><span class="line">  }</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="comment">// 应用缓存策略</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">applyCacheStrategy</span>(<span class="params">response, strategy</span>) {</span><br><span class="line">  <span class="keyword">const</span> config = <span class="variable constant_">CACHE_STRATEGIES</span>[strategy] || <span class="variable constant_">CACHE_STRATEGIES</span>.<span class="property">api</span>;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (config.<span class="property">noCache</span>) {</span><br><span class="line">    response.<span class="property">headers</span>.<span class="title function_">set</span>(<span class="string">'Cache-Control'</span>, <span class="string">'no-store, no-cache, must-revalidate'</span>);</span><br><span class="line">  } <span class="keyword">else</span> {</span><br><span class="line">    response.<span class="property">headers</span>.<span class="title function_">set</span>(<span class="string">'Cache-Control'</span>, </span><br><span class="line">      <span class="string">`public, max-age=<span class="subst">${config.maxAge}</span>, stale-while-revalidate=<span class="subst">${config.staleWhileRevalidate}</span>`</span>);</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> response;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h4 id="缓存失效">缓存失效</h4><p>实现缓存失效机制。</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 缓存失效</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">invalidateCache</span>(<span class="params">pattern</span>) {</span><br><span class="line">  <span class="keyword">try</span> {</span><br><span class="line">    <span class="comment">// 列出所有缓存键</span></span><br><span class="line">    <span class="keyword">const</span> keys = <span class="keyword">await</span> <span class="variable constant_">CACHE</span>.<span class="title function_">list</span>();</span><br><span class="line">    </span><br><span class="line">    <span class="comment">// 过滤匹配的键</span></span><br><span class="line">    <span class="keyword">const</span> keysToDelete = keys.<span class="property">keys</span>.<span class="title function_">filter</span>(<span class="function"><span class="params">key</span> =&gt;</span> </span><br><span class="line">      key.<span class="property">name</span>.<span class="title function_">includes</span>(pattern)</span><br><span class="line">    );</span><br><span class="line">    </span><br><span class="line">    <span class="comment">// 删除匹配的缓存</span></span><br><span class="line">    <span class="keyword">await</span> <span class="title class_">Promise</span>.<span class="title function_">all</span>(</span><br><span class="line">      keysToDelete.<span class="title function_">map</span>(<span class="function"><span class="params">key</span> =&gt;</span> <span class="variable constant_">CACHE</span>.<span class="title function_">delete</span>(key.<span class="property">name</span>))</span><br><span class="line">    );</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> { <span class="attr">deleted</span>: keysToDelete.<span class="property">length</span> };</span><br><span class="line">  } <span class="keyword">catch</span> (error) {</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">'Cache invalidate error:'</span>, error);</span><br><span class="line">    <span class="keyword">return</span> { <span class="attr">deleted</span>: <span class="number">0</span> };</span><br><span class="line">  }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 使用示例</span></span><br><span class="line"><span class="comment">// invalidateCache('github.com'); // 失效所有 GitHub 相关的缓存</span></span><br></pre></td></tr></tbody></table></figure><h3 id="压缩优化">压缩优化</h3><h4 id="响应压缩">响应压缩</h4><p>对响应内容进行压缩，减少传输数据量。</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 压缩配置</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">COMPRESSION_CONFIG</span> = {</span><br><span class="line">  <span class="attr">enabled</span>: <span class="literal">true</span>,</span><br><span class="line">  <span class="attr">minSize</span>: <span class="number">1024</span>,        <span class="comment">// 最小压缩大小：1KB</span></span><br><span class="line">  <span class="attr">level</span>: <span class="number">6</span>,             <span class="comment">// 压缩级别：0-9</span></span><br><span class="line">  <span class="attr">types</span>: [</span><br><span class="line">    <span class="string">'text/plain'</span>,</span><br><span class="line">    <span class="string">'text/html'</span>,</span><br><span class="line">    <span class="string">'text/css'</span>,</span><br><span class="line">    <span class="string">'text/javascript'</span>,</span><br><span class="line">    <span class="string">'application/json'</span>,</span><br><span class="line">    <span class="string">'application/javascript'</span>,</span><br><span class="line">    <span class="string">'application/xml'</span>,</span><br><span class="line">    <span class="string">'text/xml'</span></span><br><span class="line">  ]</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="comment">// 压缩响应</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">compressResponse</span>(<span class="params">response</span>) {</span><br><span class="line">  <span class="keyword">if</span> (!<span class="variable constant_">COMPRESSION_CONFIG</span>.<span class="property">enabled</span>) {</span><br><span class="line">    <span class="keyword">return</span> response;</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> contentType = response.<span class="property">headers</span>.<span class="title function_">get</span>(<span class="string">'Content-Type'</span>) || <span class="string">''</span>;</span><br><span class="line">  <span class="keyword">const</span> contentLength = <span class="built_in">parseInt</span>(response.<span class="property">headers</span>.<span class="title function_">get</span>(<span class="string">'Content-Length'</span>) || <span class="string">'0'</span>);</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 检查是否应该压缩</span></span><br><span class="line">  <span class="keyword">if</span> (contentLength &lt; <span class="variable constant_">COMPRESSION_CONFIG</span>.<span class="property">minSize</span>) {</span><br><span class="line">    <span class="keyword">return</span> response;</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> shouldCompress = <span class="variable constant_">COMPRESSION_CONFIG</span>.<span class="property">types</span>.<span class="title function_">some</span>(<span class="function"><span class="params">type</span> =&gt;</span> </span><br><span class="line">    contentType.<span class="title function_">includes</span>(type)</span><br><span class="line">  );</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (!shouldCompress) {</span><br><span class="line">    <span class="keyword">return</span> response;</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 检查客户端是否支持压缩</span></span><br><span class="line">  <span class="keyword">const</span> acceptEncoding = response.<span class="property">headers</span>.<span class="title function_">get</span>(<span class="string">'Accept-Encoding'</span>) || <span class="string">''</span>;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (acceptEncoding.<span class="title function_">includes</span>(<span class="string">'br'</span>)) {</span><br><span class="line">    <span class="keyword">return</span> <span class="title function_">compressWithBrotli</span>(response);</span><br><span class="line">  } <span class="keyword">else</span> <span class="keyword">if</span> (acceptEncoding.<span class="title function_">includes</span>(<span class="string">'gzip'</span>)) {</span><br><span class="line">    <span class="keyword">return</span> <span class="title function_">compressWithGzip</span>(response);</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> response;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// Brotli 压缩</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">compressWithBrotli</span>(<span class="params">response</span>) {</span><br><span class="line">  <span class="keyword">const</span> original = <span class="keyword">await</span> response.<span class="title function_">arrayBuffer</span>();</span><br><span class="line">  <span class="keyword">const</span> compressed = <span class="keyword">await</span> <span class="title function_">compress</span>(original, { <span class="attr">level</span>: <span class="variable constant_">COMPRESSION_CONFIG</span>.<span class="property">level</span> });</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(compressed, {</span><br><span class="line">    <span class="attr">status</span>: response.<span class="property">status</span>,</span><br><span class="line">    <span class="attr">headers</span>: {</span><br><span class="line">      ...response.<span class="property">headers</span>,</span><br><span class="line">      <span class="string">'Content-Encoding'</span>: <span class="string">'br'</span>,</span><br><span class="line">      <span class="string">'Content-Length'</span>: compressed.<span class="property">length</span>.<span class="title function_">toString</span>()</span><br><span class="line">    }</span><br><span class="line">  });</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// Gzip 压缩</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">compressWithGzip</span>(<span class="params">response</span>) {</span><br><span class="line">  <span class="keyword">const</span> original = <span class="keyword">await</span> response.<span class="title function_">arrayBuffer</span>();</span><br><span class="line">  <span class="keyword">const</span> compressed = <span class="keyword">await</span> <span class="title function_">gzip</span>(original, { <span class="attr">level</span>: <span class="variable constant_">COMPRESSION_CONFIG</span>.<span class="property">level</span> });</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(compressed, {</span><br><span class="line">    <span class="attr">status</span>: response.<span class="property">status</span>,</span><br><span class="line">    <span class="attr">headers</span>: {</span><br><span class="line">      ...response.<span class="property">headers</span>,</span><br><span class="line">      <span class="string">'Content-Encoding'</span>: <span class="string">'gzip'</span>,</span><br><span class="line">      <span class="string">'Content-Length'</span>: compressed.<span class="property">length</span>.<span class="title function_">toString</span>()</span><br><span class="line">    }</span><br><span class="line">  });</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h4 id="请求压缩">请求压缩</h4><p>对请求内容进行压缩。</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 压缩请求</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">compressRequest</span>(<span class="params">body, encoding</span>) {</span><br><span class="line">  <span class="keyword">if</span> (!body) {</span><br><span class="line">    <span class="keyword">return</span> body;</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (encoding === <span class="string">'br'</span>) {</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">await</span> <span class="title function_">compress</span>(body, { <span class="attr">level</span>: <span class="variable constant_">COMPRESSION_CONFIG</span>.<span class="property">level</span> });</span><br><span class="line">  } <span class="keyword">else</span> <span class="keyword">if</span> (encoding === <span class="string">'gzip'</span>) {</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">await</span> <span class="title function_">gzip</span>(body, { <span class="attr">level</span>: <span class="variable constant_">COMPRESSION_CONFIG</span>.<span class="property">level</span> });</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> body;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h3 id="连接管理">连接管理</h3><h4 id="连接池">连接池</h4><p>使用连接池复用连接。</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 连接池配置</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">CONNECTION_POOL_CONFIG</span> = {</span><br><span class="line">  <span class="attr">maxConnections</span>: <span class="number">100</span>,    <span class="comment">// 最大连接数</span></span><br><span class="line">  <span class="attr">maxIdleConnections</span>: <span class="number">10</span>, <span class="comment">// 最大空闲连接数</span></span><br><span class="line">  <span class="attr">idleTimeout</span>: <span class="number">60000</span>      <span class="comment">// 空闲超时：60 秒</span></span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="comment">// 连接池实现</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">ConnectionPool</span> {</span><br><span class="line">  <span class="title function_">constructor</span>(<span class="params">config</span>) {</span><br><span class="line">    <span class="variable language_">this</span>.<span class="property">config</span> = config;</span><br><span class="line">    <span class="variable language_">this</span>.<span class="property">connections</span> = <span class="keyword">new</span> <span class="title class_">Map</span>();</span><br><span class="line">    <span class="variable language_">this</span>.<span class="property">idleConnections</span> = <span class="keyword">new</span> <span class="title class_">Map</span>();</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">async</span> <span class="title function_">getConnection</span>(<span class="params">url</span>) {</span><br><span class="line">    <span class="keyword">const</span> key = <span class="string">`<span class="subst">${<span class="keyword">new</span> URL(url).origin}</span>`</span>;</span><br><span class="line">    </span><br><span class="line">    <span class="comment">// 检查空闲连接</span></span><br><span class="line">    <span class="keyword">if</span> (<span class="variable language_">this</span>.<span class="property">idleConnections</span>.<span class="title function_">has</span>(key)) {</span><br><span class="line">      <span class="keyword">const</span> connection = <span class="variable language_">this</span>.<span class="property">idleConnections</span>.<span class="title function_">get</span>(key);</span><br><span class="line">      <span class="variable language_">this</span>.<span class="property">idleConnections</span>.<span class="title function_">delete</span>(key);</span><br><span class="line">      <span class="keyword">return</span> connection;</span><br><span class="line">    }</span><br><span class="line">    </span><br><span class="line">    <span class="comment">// 创建新连接</span></span><br><span class="line">    <span class="keyword">const</span> connection = <span class="keyword">await</span> <span class="variable language_">this</span>.<span class="title function_">createConnection</span>(url);</span><br><span class="line">    <span class="variable language_">this</span>.<span class="property">connections</span>.<span class="title function_">set</span>(key, connection);</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> connection;</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">async</span> <span class="title function_">createConnection</span>(<span class="params">url</span>) {</span><br><span class="line">    <span class="comment">// 实现连接创建逻辑</span></span><br><span class="line">    <span class="keyword">return</span> <span class="title function_">fetch</span>(url);</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="title function_">releaseConnection</span>(<span class="params">url, connection</span>) {</span><br><span class="line">    <span class="keyword">const</span> key = <span class="string">`<span class="subst">${<span class="keyword">new</span> URL(url).origin}</span>`</span>;</span><br><span class="line">    </span><br><span class="line">    <span class="comment">// 检查空闲连接数量</span></span><br><span class="line">    <span class="keyword">if</span> (<span class="variable language_">this</span>.<span class="property">idleConnections</span>.<span class="property">size</span> &gt;= <span class="variable language_">this</span>.<span class="property">config</span>.<span class="property">maxIdleConnections</span>) {</span><br><span class="line">      <span class="variable language_">this</span>.<span class="property">connections</span>.<span class="title function_">delete</span>(key);</span><br><span class="line">      <span class="keyword">return</span>;</span><br><span class="line">    }</span><br><span class="line">    </span><br><span class="line">    <span class="comment">// 放入空闲连接池</span></span><br><span class="line">    <span class="variable language_">this</span>.<span class="property">idleConnections</span>.<span class="title function_">set</span>(key, connection);</span><br><span class="line">    </span><br><span class="line">    <span class="comment">// 设置超时清理</span></span><br><span class="line">    <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> {</span><br><span class="line">      <span class="variable language_">this</span>.<span class="property">idleConnections</span>.<span class="title function_">delete</span>(key);</span><br><span class="line">      <span class="variable language_">this</span>.<span class="property">connections</span>.<span class="title function_">delete</span>(key);</span><br><span class="line">    }, <span class="variable language_">this</span>.<span class="property">config</span>.<span class="property">idleTimeout</span>);</span><br><span class="line">  }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h4 id="连接复用">连接复用</h4><p>复用 HTTP/2 连接。</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// HTTP/2 连接复用</span></span><br><span class="line"><span class="keyword">const</span> <span class="title class_">HTTP2</span>_POOL = <span class="keyword">new</span> <span class="title class_">Map</span>();</span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">fetchWithConnectionReuse</span>(<span class="params">url, options = {}</span>) {</span><br><span class="line">  <span class="keyword">const</span> origin = <span class="keyword">new</span> <span class="title function_">URL</span>(url).<span class="property">origin</span>;</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 获取或创建连接</span></span><br><span class="line">  <span class="keyword">if</span> (!<span class="title class_">HTTP2</span>_POOL.<span class="title function_">has</span>(origin)) {</span><br><span class="line">    <span class="title class_">HTTP2</span>_POOL.<span class="title function_">set</span>(origin, <span class="keyword">new</span> <span class="title class_">ConnectionPool</span>(<span class="variable constant_">CONNECTION_POOL_CONFIG</span>));</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> pool = <span class="title class_">HTTP2</span>_POOL.<span class="title function_">get</span>(origin);</span><br><span class="line">  <span class="keyword">const</span> connection = <span class="keyword">await</span> pool.<span class="title function_">getConnection</span>(url);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">try</span> {</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">await</span> connection.<span class="title function_">fetch</span>(url, options);</span><br><span class="line">  } <span class="keyword">finally</span> {</span><br><span class="line">    pool.<span class="title function_">releaseConnection</span>(url, connection);</span><br><span class="line">  }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h3 id="内容优化">内容优化</h3><h4 id="内容转换">内容转换</h4><p>根据客户端能力转换内容格式。</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 内容转换</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">transformContent</span>(<span class="params">response, request</span>) {</span><br><span class="line">  <span class="keyword">const</span> acceptHeader = request.<span class="property">headers</span>.<span class="title function_">get</span>(<span class="string">'Accept'</span>) || <span class="string">''</span>;</span><br><span class="line">  <span class="keyword">const</span> contentType = response.<span class="property">headers</span>.<span class="title function_">get</span>(<span class="string">'Content-Type'</span>) || <span class="string">''</span>;</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// JSON 到 XML 转换</span></span><br><span class="line">  <span class="keyword">if</span> (acceptHeader.<span class="title function_">includes</span>(<span class="string">'application/xml'</span>) &amp;&amp; contentType.<span class="title function_">includes</span>(<span class="string">'application/json'</span>)) {</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">await</span> <span class="title function_">jsonToXml</span>(response);</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// JSON 到 YAML 转换</span></span><br><span class="line">  <span class="keyword">if</span> (acceptHeader.<span class="title function_">includes</span>(<span class="string">'application/x-yaml'</span>) &amp;&amp; contentType.<span class="title function_">includes</span>(<span class="string">'application/json'</span>)) {</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">await</span> <span class="title function_">jsonToYaml</span>(response);</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> response;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// JSON 到 XML 转换</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">jsonToXml</span>(<span class="params">response</span>) {</span><br><span class="line">  <span class="keyword">const</span> json = <span class="keyword">await</span> response.<span class="title function_">json</span>();</span><br><span class="line">  <span class="keyword">const</span> xml = <span class="title function_">convertJsonToXml</span>(json);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(xml, {</span><br><span class="line">    <span class="attr">status</span>: response.<span class="property">status</span>,</span><br><span class="line">    <span class="attr">headers</span>: {</span><br><span class="line">      <span class="string">'Content-Type'</span>: <span class="string">'application/xml'</span></span><br><span class="line">    }</span><br><span class="line">  });</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// JSON 到 YAML 转换</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">jsonToYaml</span>(<span class="params">response</span>) {</span><br><span class="line">  <span class="keyword">const</span> json = <span class="keyword">await</span> response.<span class="title function_">json</span>();</span><br><span class="line">  <span class="keyword">const</span> yaml = <span class="title function_">convertJsonToYaml</span>(json);</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(yaml, {</span><br><span class="line">    <span class="attr">status</span>: response.<span class="property">status</span>,</span><br><span class="line">    <span class="attr">headers</span>: {</span><br><span class="line">      <span class="string">'Content-Type'</span>: <span class="string">'application/x-yaml'</span></span><br><span class="line">    }</span><br><span class="line">  });</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h4 id="内容适配">内容适配</h4><p>根据设备类型适配内容。</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 内容适配</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">adaptContent</span>(<span class="params">response, request</span>) {</span><br><span class="line">  <span class="keyword">const</span> userAgent = request.<span class="property">headers</span>.<span class="title function_">get</span>(<span class="string">'User-Agent'</span>) || <span class="string">''</span>;</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 移动设备适配</span></span><br><span class="line">  <span class="keyword">if</span> (<span class="title function_">isMobileDevice</span>(userAgent)) {</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">await</span> <span class="title function_">adaptForMobile</span>(response);</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 桌面设备适配</span></span><br><span class="line">  <span class="keyword">if</span> (<span class="title function_">isDesktopDevice</span>(userAgent)) {</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">await</span> <span class="title function_">adaptForDesktop</span>(response);</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> response;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 移动设备适配</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">adaptForMobile</span>(<span class="params">response</span>) {</span><br><span class="line">  <span class="keyword">const</span> contentType = response.<span class="property">headers</span>.<span class="title function_">get</span>(<span class="string">'Content-Type'</span>) || <span class="string">''</span>;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (contentType.<span class="title function_">includes</span>(<span class="string">'text/html'</span>)) {</span><br><span class="line">    <span class="keyword">const</span> html = <span class="keyword">await</span> response.<span class="title function_">text</span>();</span><br><span class="line">    <span class="keyword">const</span> adapted = <span class="title function_">optimizeForMobile</span>(html);</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(adapted, {</span><br><span class="line">      <span class="attr">status</span>: response.<span class="property">status</span>,</span><br><span class="line">      <span class="attr">headers</span>: response.<span class="property">headers</span></span><br><span class="line">    });</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> response;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 桌面设备适配</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">adaptForDesktop</span>(<span class="params">response</span>) {</span><br><span class="line">  <span class="keyword">const</span> contentType = response.<span class="property">headers</span>.<span class="title function_">get</span>(<span class="string">'Content-Type'</span>) || <span class="string">''</span>;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (contentType.<span class="title function_">includes</span>(<span class="string">'text/html'</span>)) {</span><br><span class="line">    <span class="keyword">const</span> html = <span class="keyword">await</span> response.<span class="title function_">text</span>();</span><br><span class="line">    <span class="keyword">const</span> adapted = <span class="title function_">optimizeForDesktop</span>(html);</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(adapted, {</span><br><span class="line">      <span class="attr">status</span>: response.<span class="property">status</span>,</span><br><span class="line">      <span class="attr">headers</span>: response.<span class="property">headers</span></span><br><span class="line">    });</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> response;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h2 id="监控和日志">监控和日志</h2><h3 id="请求监控">请求监控</h3><h4 id="性能指标">性能指标</h4><p>收集和记录性能指标。</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 性能指标收集</span></span><br><span class="line"><span class="keyword">const</span> performanceMetrics = {</span><br><span class="line">  <span class="attr">requestCount</span>: <span class="number">0</span>,</span><br><span class="line">  <span class="attr">successCount</span>: <span class="number">0</span>,</span><br><span class="line">  <span class="attr">errorCount</span>: <span class="number">0</span>,</span><br><span class="line">  <span class="attr">totalLatency</span>: <span class="number">0</span>,</span><br><span class="line">  <span class="attr">cacheHitCount</span>: <span class="number">0</span>,</span><br><span class="line">  <span class="attr">cacheMissCount</span>: <span class="number">0</span></span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="comment">// 记录请求指标</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">recordRequestMetrics</span>(<span class="params">startTime, cacheHit, success</span>) {</span><br><span class="line">  <span class="keyword">const</span> latency = <span class="title class_">Date</span>.<span class="title function_">now</span>() - startTime;</span><br><span class="line">  </span><br><span class="line">  performanceMetrics.<span class="property">requestCount</span>++;</span><br><span class="line">  performanceMetrics.<span class="property">totalLatency</span> += latency;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (cacheHit) {</span><br><span class="line">    performanceMetrics.<span class="property">cacheHitCount</span>++;</span><br><span class="line">  } <span class="keyword">else</span> {</span><br><span class="line">    performanceMetrics.<span class="property">cacheMissCount</span>++;</span><br><span class="line">  }</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">if</span> (success) {</span><br><span class="line">    performanceMetrics.<span class="property">successCount</span>++;</span><br><span class="line">  } <span class="keyword">else</span> {</span><br><span class="line">    performanceMetrics.<span class="property">errorCount</span>++;</span><br><span class="line">  }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 获取性能指标</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">getPerformanceMetrics</span>(<span class="params"></span>) {</span><br><span class="line">  <span class="keyword">const</span> avgLatency = performanceMetrics.<span class="property">totalLatency</span> / performanceMetrics.<span class="property">requestCount</span>;</span><br><span class="line">  <span class="keyword">const</span> cacheHitRate = performanceMetrics.<span class="property">cacheHitCount</span> / </span><br><span class="line">    (performanceMetrics.<span class="property">cacheHitCount</span> + performanceMetrics.<span class="property">cacheMissCount</span>);</span><br><span class="line">  <span class="keyword">const</span> errorRate = performanceMetrics.<span class="property">errorCount</span> / performanceMetrics.<span class="property">requestCount</span>;</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">return</span> {</span><br><span class="line">    <span class="attr">requestCount</span>: performanceMetrics.<span class="property">requestCount</span>,</span><br><span class="line">    <span class="attr">successCount</span>: performanceMetrics.<span class="property">successCount</span>,</span><br><span class="line">    <span class="attr">errorCount</span>: performanceMetrics.<span class="property">errorCount</span>,</span><br><span class="line">    <span class="attr">avgLatency</span>: avgLatency,</span><br><span class="line">    <span class="attr">cacheHitRate</span>: cacheHitRate,</span><br><span class="line">    <span class="attr">errorRate</span>: errorRate</span><br><span class="line">  };</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h4 id="实时监控">实时监控</h4><p>实现实时监控功能。</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 实时监控</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">monitorRequest</span>(<span class="params">request, response</span>) {</span><br><span class="line">  <span class="keyword">const</span> startTime = <span class="title class_">Date</span>.<span class="title function_">now</span>();</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 记录请求信息</span></span><br><span class="line">  <span class="keyword">const</span> requestInfo = {</span><br><span class="line">    <span class="attr">method</span>: request.<span class="property">method</span>,</span><br><span class="line">    <span class="attr">url</span>: request.<span class="property">url</span>,</span><br><span class="line">    <span class="attr">headers</span>: <span class="title class_">Object</span>.<span class="title function_">fromEntries</span>(request.<span class="property">headers</span>.<span class="title function_">entries</span>()),</span><br><span class="line">    <span class="attr">timestamp</span>: <span class="keyword">new</span> <span class="title class_">Date</span>().<span class="title function_">toISOString</span>()</span><br><span class="line">  };</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 记录响应信息</span></span><br><span class="line">  <span class="keyword">const</span> responseInfo = {</span><br><span class="line">    <span class="attr">status</span>: response.<span class="property">status</span>,</span><br><span class="line">    <span class="attr">headers</span>: <span class="title class_">Object</span>.<span class="title function_">fromEntries</span>(response.<span class="property">headers</span>.<span class="title function_">entries</span>()),</span><br><span class="line">    <span class="attr">latency</span>: <span class="title class_">Date</span>.<span class="title function_">now</span>() - startTime,</span><br><span class="line">    <span class="attr">timestamp</span>: <span class="keyword">new</span> <span class="title class_">Date</span>().<span class="title function_">toISOString</span>()</span><br><span class="line">  };</span><br><span class="line">  </span><br><span class="line">  <span class="comment">// 发送到监控系统</span></span><br><span class="line">  <span class="keyword">await</span> <span class="title function_">sendToMonitoringSystem</span>({</span><br><span class="line">    <span class="attr">request</span>: requestInfo,</span><br><span class="line">    <span class="attr">response</span>: responseInfo</span><br><span class="line">  });</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 发送到监控系统</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">sendToMonitoringSystem</span>(<span class="params">data</span>) {</span><br><span class="line">  <span class="comment">// 实现发送逻辑，例如发送到 Cloudflare Analytics 或自定义监控服务</span></span><br><span class="line">  <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">'Monitoring data:'</span>, <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(data));</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h3 id="日志记录">日志记录</h3><h4 id="结构化日志">结构化日志</h4><p>使用结构化日志格式。</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 日志级别</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">LOG_LEVELS</span> = {</span><br><span class="line">  <span class="attr">DEBUG</span>: <span class="string">'DEBUG'</span>,</span><br><span class="line">  <span class="attr">INFO</span>: <span class="string">'INFO'</span>,</span><br><span class="line">  <span class="attr">WARN</span>: <span class="string">'WARN'</span>,</span><br><span class="line">  <span class="attr">ERROR</span>: <span class="string">'ERROR'</span></span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="comment">// 结构化日志</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">log</span>(<span class="params">level, message, context = {}</span>) {</span><br><span class="line">  <span class="keyword">const</span> logEntry = {</span><br><span class="line">    <span class="attr">timestamp</span>: <span class="keyword">new</span> <span class="title class_">Date</span>().<span class="title function_">toISOString</span>(),</span><br><span class="line">    <span class="attr">level</span>: level,</span><br><span class="line">    <span class="attr">message</span>: message,</span><br><span class="line">    <span class="attr">context</span>: context</span><br><span class="line">  };</span><br><span class="line">  </span><br><span class="line">  <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="title class_">JSON</span>.<span class="title function_">stringify</span>(logEntry));</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 使用示例</span></span><br><span class="line"><span class="title function_">log</span>(<span class="variable constant_">LOG_LEVELS</span>.<span class="property">INFO</span>, <span class="string">'Request received'</span>, {</span><br><span class="line">  <span class="attr">method</span>: <span class="string">'GET'</span>,</span><br><span class="line">  <span class="attr">url</span>: <span class="string">'https://example.com'</span>,</span><br><span class="line">  <span class="attr">ip</span>: <span class="string">'192.168.1.1'</span></span><br><span class="line">});</span><br></pre></td></tr></tbody></table></figure><h4 id="错误日志">错误日志</h4><p>记录详细的错误信息。</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 错误日志</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">logError</span>(<span class="params">error, context = {}</span>) {</span><br><span class="line">  <span class="title function_">log</span>(<span class="variable constant_">LOG_LEVELS</span>.<span class="property">ERROR</span>, error.<span class="property">message</span>, {</span><br><span class="line">    <span class="attr">stack</span>: error.<span class="property">stack</span>,</span><br><span class="line">    ...context</span><br><span class="line">  });</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 使用示例</span></span><br><span class="line"><span class="keyword">try</span> {</span><br><span class="line">  <span class="keyword">await</span> <span class="title function_">fetch</span>(url);</span><br><span class="line">} <span class="keyword">catch</span> (error) {</span><br><span class="line">  <span class="title function_">logError</span>(error, {</span><br><span class="line">    <span class="attr">url</span>: url,</span><br><span class="line">    <span class="attr">method</span>: <span class="string">'GET'</span></span><br><span class="line">  });</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h2 id="最佳实践">最佳实践</h2><h3 id="安全最佳实践">安全最佳实践</h3><ol><li><p><strong>最小权限原则</strong></p><ul><li>只授予必要的权限</li><li>使用最小权限的 API 密钥</li></ul></li><li><p><strong>定期更新</strong></p><ul><li>定期更新依赖项</li><li>及时应用安全补丁</li></ul></li><li><p><strong>输入验证</strong></p><ul><li>验证所有输入数据</li><li>防止注入攻击</li></ul></li><li><p><strong>加密传输</strong></p><ul><li>使用 HTTPS 加密传输</li><li>验证 SSL 证书</li></ul></li></ol><h3 id="性能最佳实践">性能最佳实践</h3><ol><li><p><strong>缓存优先</strong></p><ul><li>优先使用缓存</li><li>合理设置缓存时间</li></ul></li><li><p><strong>压缩内容</strong></p><ul><li>压缩大文件</li><li>选择合适的压缩算法</li></ul></li><li><p><strong>连接复用</strong></p><ul><li>复用 HTTP/2 连接</li><li>使用连接池</li></ul></li><li><p><strong>异步处理</strong></p><ul><li>使用异步操作</li><li>避免阻塞请求</li></ul></li></ol><h3 id="监控最佳实践">监控最佳实践</h3><ol><li><p><strong>关键指标</strong></p><ul><li>监控关键性能指标</li><li>设置合理的告警阈值</li></ul></li><li><p><strong>日志分析</strong></p><ul><li>定期分析日志</li><li>识别性能瓶颈</li></ul></li><li><p><strong>持续优化</strong></p><ul><li>持续优化性能</li><li>定期审查代码</li></ul></li></ol><h2 id="总结">总结</h2><p>Xget 通过多层安全机制和全面的性能优化策略，确保了服务的安全性、稳定性和高性能。通过合理的安全防护、缓存策略、压缩优化和连接管理，Xget 能够为用户提供快速、可靠的加速服务。</p><p>同时，完善的监控和日志系统帮助及时发现和解决问题，确保服务的持续稳定运行。</p>]]></content>
    
    
    <summary type="html">全面介绍Xget的多层安全防护机制和性能优化策略，包括User-Agent验证机制、请求签名认证、智能缓存策略、边缘节点调度等核心技术的实现原理。本文解析Xget如何在保证服务安全稳定的同时实现高性能的开发者资源加速，为大规模生产环境提供可靠保障</summary>
    
    
    
    <category term="技术文档" scheme="https://www.zeroxin.xin/categories/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/"/>
    
    
    <category term="Xget" scheme="https://www.zeroxin.xin/tags/Xget/"/>
    
    <category term="安全" scheme="https://www.zeroxin.xin/tags/%E5%AE%89%E5%85%A8/"/>
    
    <category term="性能优化" scheme="https://www.zeroxin.xin/tags/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/"/>
    
  </entry>
  
  <entry>
    <title>Xget 部署指南</title>
    <link href="https://www.zeroxin.xin/2025/12/27/xget-deployment-guide/"/>
    <id>https://www.zeroxin.xin/2025/12/27/xget-deployment-guide/</id>
    <published>2025-12-27T07:00:00.000Z</published>
    <updated>2026-06-18T09:17:25.417Z</updated>
    
    <content type="html"><![CDATA[<h1>Xget 部署指南</h1><h2 id="概述">概述</h2><p>Xget 支持多种部署方式，包括 Cloudflare Workers、EdgeOne Pages、Vercel、Netlify、Deno Deploy、Docker 和 Podman。本文档详细介绍了各种部署方式的步骤和配置。</p><h2 id="前置要求">前置要求</h2><h3 id="通用要求">通用要求</h3><ul><li>Node.js 18+ 或兼容的 JavaScript 运行环境</li><li>Git 客户端</li><li>基本的命令行操作能力</li></ul><h3 id="特定平台要求">特定平台要求</h3><p><strong>Cloudflare Workers</strong></p><ul><li>Cloudflare 账户（免费计划即可）</li><li>Wrangler CLI 工具</li></ul><p><strong>EdgeOne Pages</strong></p><ul><li>腾讯云账户</li><li>EdgeOne 服务</li></ul><p><strong>Vercel</strong></p><ul><li>Vercel 账户</li><li>Vercel CLI 工具</li></ul><p><strong>Netlify</strong></p><ul><li>Netlify 账户</li><li>Netlify CLI 工具</li></ul><p><strong>Deno Deploy</strong></p><ul><li>Deno 账户</li><li>Deno CLI 工具</li></ul><p><strong>Docker/Podman</strong></p><ul><li>Docker 或 Podman 运行时</li><li>服务器或本地机器</li></ul><h2 id="部署到-Cloudflare-Workers">部署到 Cloudflare Workers</h2><h3 id="方式一：使用-Wrangler-CLI">方式一：使用 Wrangler CLI</h3><h4 id="1-安装-Wrangler-CLI">1. 安装 Wrangler CLI</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install -g wrangler</span><br></pre></td></tr></tbody></table></figure><h4 id="2-登录-Cloudflare">2. 登录 Cloudflare</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wrangler login</span><br></pre></td></tr></tbody></table></figure><h4 id="3-克隆-Xget-仓库">3. 克隆 Xget 仓库</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/xixu-me/Xget.git</span><br><span class="line"><span class="built_in">cd</span> Xget</span><br></pre></td></tr></tbody></table></figure><h4 id="4-配置-Wrangler">4. 配置 Wrangler</h4><p>创建 <code>wrangler.toml</code> 文件：</p><figure class="highlight toml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name</span> = <span class="string">"xget"</span></span><br><span class="line"><span class="attr">main</span> = <span class="string">"src/index.js"</span></span><br><span class="line"><span class="attr">compatibility_date</span> = <span class="string">"2024-01-01"</span></span><br><span class="line"></span><br><span class="line"><span class="section">[vars]</span></span><br><span class="line"><span class="comment"># 自定义配置变量</span></span><br><span class="line"><span class="comment"># CUSTOM_DOMAIN = "your-domain.com"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># KV 命名空间（可选）</span></span><br><span class="line"><span class="section">[[kv_namespaces]]</span></span><br><span class="line"><span class="attr">binding</span> = <span class="string">"CACHE"</span></span><br><span class="line"><span class="attr">id</span> = <span class="string">"your-kv-namespace-id"</span></span><br></pre></td></tr></tbody></table></figure><h4 id="5-部署">5. 部署</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wrangler deploy</span><br></pre></td></tr></tbody></table></figure><h4 id="6-验证部署">6. 验证部署</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl https://xget.your-subdomain.workers.dev/gh/microsoft/vscode/archive/main.zip</span><br></pre></td></tr></tbody></table></figure><h3 id="方式二：使用-Cloudflare-Dashboard">方式二：使用 Cloudflare Dashboard</h3><h4 id="1-登录-Cloudflare-Dashboard">1. 登录 Cloudflare Dashboard</h4><p>访问 <a href="https://dash.cloudflare.com/">Cloudflare Dashboard</a></p><h4 id="2-创建-Worker">2. 创建 Worker</h4><ol><li>点击 “Workers &amp; Pages”</li><li>点击 “Create Application”</li><li>选择 “Create Worker”</li><li>输入 Worker 名称</li><li>点击 “Deploy”</li></ol><h4 id="3-上传代码">3. 上传代码</h4><ol><li>在 Worker 编辑器中粘贴 Xget 代码</li><li>点击 “Save and Deploy”</li></ol><h4 id="4-配置自定义域名（可选）">4. 配置自定义域名（可选）</h4><ol><li>在 Worker 设置中点击 “Triggers”</li><li>点击 “Custom Domains”</li><li>添加自定义域名</li></ol><h3 id="配置选项">配置选项</h3><h4 id="环境变量">环境变量</h4><p>在 <code>wrangler.toml</code> 中配置：</p><figure class="highlight toml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[vars]</span></span><br><span class="line"><span class="comment"># 缓存时长（秒）</span></span><br><span class="line"><span class="attr">CACHE_TTL</span> = <span class="string">"1800"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 最大重试次数</span></span><br><span class="line"><span class="attr">MAX_RETRIES</span> = <span class="string">"3"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 请求超时（毫秒）</span></span><br><span class="line"><span class="attr">REQUEST_TIMEOUT</span> = <span class="string">"30000"</span></span><br></pre></td></tr></tbody></table></figure><h4 id="KV-存储">KV 存储</h4><p>创建 KV 命名空间：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wrangler kv:namespace create <span class="string">"CACHE"</span></span><br></pre></td></tr></tbody></table></figure><p>将返回的 ID 添加到 <code>wrangler.toml</code>。</p><h4 id="自定义域名">自定义域名</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wrangler domains add your-domain.com</span><br></pre></td></tr></tbody></table></figure><h2 id="部署到-EdgeOne-Pages">部署到 EdgeOne Pages</h2><h3 id="1-准备代码">1. 准备代码</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/xixu-me/Xget.git</span><br><span class="line"><span class="built_in">cd</span> Xget</span><br></pre></td></tr></tbody></table></figure><h3 id="2-构建项目">2. 构建项目</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm install</span><br><span class="line">npm run build</span><br></pre></td></tr></tbody></table></figure><h3 id="3-登录腾讯云">3. 登录腾讯云</h3><p>访问 <a href="https://console.cloud.tencent.com/edgeone">腾讯云 EdgeOne 控制台</a></p><h3 id="4-创建站点">4. 创建站点</h3><ol><li>点击 “站点列表”</li><li>点击 “新建站点”</li><li>输入域名信息</li><li>选择 “静态网站” 或 “Serverless”</li></ol><h3 id="5-上传代码">5. 上传代码</h3><p><strong>方式一：Git 仓库</strong></p><ol><li>在站点设置中选择 “源站设置”</li><li>添加 Git 仓库</li><li>配置构建命令和输出目录</li></ol><p><strong>方式二：直接上传</strong></p><ol><li>将构建后的文件打包</li><li>在控制台上传文件包</li></ol><h3 id="6-配置边缘函数">6. 配置边缘函数</h3><ol><li>在站点设置中选择 “边缘函数”</li><li>创建新的边缘函数</li><li>粘贴 Xget 代码</li><li>配置路由规则</li></ol><h3 id="7-验证部署">7. 验证部署</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl https://your-domain.com/gh/microsoft/vscode/archive/main.zip</span><br></pre></td></tr></tbody></table></figure><h2 id="部署到-Vercel">部署到 Vercel</h2><h3 id="1-安装-Vercel-CLI">1. 安装 Vercel CLI</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install -g vercel</span><br></pre></td></tr></tbody></table></figure><h3 id="2-登录-Vercel">2. 登录 Vercel</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vercel login</span><br></pre></td></tr></tbody></table></figure><h3 id="3-克隆仓库">3. 克隆仓库</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/xixu-me/Xget.git</span><br><span class="line"><span class="built_in">cd</span> Xget</span><br></pre></td></tr></tbody></table></figure><h3 id="4-部署">4. 部署</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vercel</span><br></pre></td></tr></tbody></table></figure><p>按照提示选择配置选项。</p><h3 id="5-配置环境变量">5. 配置环境变量</h3><p>在 Vercel Dashboard 中添加环境变量：</p><ul><li><code>CACHE_TTL</code>: 1800</li><li><code>MAX_RETRIES</code>: 3</li><li><code>REQUEST_TIMEOUT</code>: 30000</li></ul><h3 id="6-生产部署">6. 生产部署</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vercel --prod</span><br></pre></td></tr></tbody></table></figure><h3 id="7-验证部署-2">7. 验证部署</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl https://your-project.vercel.app/gh/microsoft/vscode/archive/main.zip</span><br></pre></td></tr></tbody></table></figure><h2 id="部署到-Netlify">部署到 Netlify</h2><h3 id="1-安装-Netlify-CLI">1. 安装 Netlify CLI</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install -g netlify-cli</span><br></pre></td></tr></tbody></table></figure><h3 id="2-登录-Netlify">2. 登录 Netlify</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">netlify login</span><br></pre></td></tr></tbody></table></figure><h3 id="3-克隆仓库-2">3. 克隆仓库</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/xixu-me/Xget.git</span><br><span class="line"><span class="built_in">cd</span> Xget</span><br></pre></td></tr></tbody></table></figure><h3 id="4-初始化项目">4. 初始化项目</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">netlify init</span><br></pre></td></tr></tbody></table></figure><p>按照提示选择配置选项。</p><h3 id="5-配置-Netlify-Functions">5. 配置 Netlify Functions</h3><p>创建 <code>netlify.toml</code> 文件：</p><figure class="highlight toml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[build]</span></span><br><span class="line">  <span class="attr">functions</span> = <span class="string">"netlify/functions"</span></span><br><span class="line"></span><br><span class="line"><span class="section">[functions]</span></span><br><span class="line">  <span class="attr">node_bundler</span> = <span class="string">"esbuild"</span></span><br></pre></td></tr></tbody></table></figure><h3 id="6-部署">6. 部署</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">netlify deploy --prod</span><br></pre></td></tr></tbody></table></figure><h3 id="7-验证部署-3">7. 验证部署</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl https://your-site.netlify.app/gh/microsoft/vscode/archive/main.zip</span><br></pre></td></tr></tbody></table></figure><h2 id="部署到-Deno-Deploy">部署到 Deno Deploy</h2><h3 id="1-安装-Deno-CLI">1. 安装 Deno CLI</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 使用安装脚本（Linux/macOS）</span></span><br><span class="line">curl -fsSL https://deno.land/install.sh | sh</span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用 Homebrew（macOS）</span></span><br><span class="line">brew install deno</span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用 Chocolatey（Windows）</span></span><br><span class="line">choco install deno</span><br></pre></td></tr></tbody></table></figure><h3 id="2-克隆仓库">2. 克隆仓库</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/xixu-me/Xget.git</span><br><span class="line"><span class="built_in">cd</span> Xget</span><br></pre></td></tr></tbody></table></figure><h3 id="3-适配-Deno">3. 适配 Deno</h3><p>将代码适配为 Deno 兼容格式：</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 使用 Deno 标准库</span></span><br><span class="line"><span class="keyword">import</span> { serve } <span class="keyword">from</span> <span class="string">"https://deno.land/std@0.208.0/http/server.ts"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">handler</span>(<span class="params">req</span>) {</span><br><span class="line">  <span class="comment">// Xget 核心逻辑</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="title function_">serve</span>(handler);</span><br></pre></td></tr></tbody></table></figure><h3 id="4-登录-Deno-Deploy">4. 登录 Deno Deploy</h3><p>访问 <a href="https://dash.deno.com/">Deno Deploy</a> 并登录。</p><h3 id="5-创建新项目">5. 创建新项目</h3><ol><li>点击 “New Project”</li><li>选择 “Deploy from GitHub”</li><li>选择 Xget 仓库</li><li>配置入口文件</li><li>点击 “Deploy”</li></ol><h3 id="6-配置环境变量">6. 配置环境变量</h3><p>在项目设置中添加环境变量。</p><h3 id="7-验证部署-4">7. 验证部署</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl https://your-project.deno.dev/gh/microsoft/vscode/archive/main.zip</span><br></pre></td></tr></tbody></table></figure><h2 id="自托管部署（Docker）">自托管部署（Docker）</h2><h3 id="1-准备-Dockerfile">1. 准备 Dockerfile</h3><p>创建 <code>Dockerfile</code>：</p><figure class="highlight dockerfile"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 使用 Node.js 18 作为基础镜像</span></span><br><span class="line"><span class="keyword">FROM</span> node:<span class="number">18</span>-alpine</span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置工作目录</span></span><br><span class="line"><span class="keyword">WORKDIR</span><span class="language-bash"> /app</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 复制 package 文件</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> package*.json ./</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装依赖</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> npm ci --only=production</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 复制源代码</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> . .</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 暴露端口</span></span><br><span class="line"><span class="keyword">EXPOSE</span> <span class="number">3000</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动应用</span></span><br><span class="line"><span class="keyword">CMD</span><span class="language-bash"> [<span class="string">"node"</span>, <span class="string">"src/index.js"</span>]</span></span><br></pre></td></tr></tbody></table></figure><h3 id="2-构建-Docker-镜像">2. 构建 Docker 镜像</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker build -t xget:latest .</span><br></pre></td></tr></tbody></table></figure><h3 id="3-运行容器">3. 运行容器</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">docker run -d \</span><br><span class="line">  --name xget \</span><br><span class="line">  -p 3000:3000 \</span><br><span class="line">  -e CACHE_TTL=1800 \</span><br><span class="line">  -e MAX_RETRIES=3 \</span><br><span class="line">  -e REQUEST_TIMEOUT=30000 \</span><br><span class="line">  xget:latest</span><br></pre></td></tr></tbody></table></figure><h3 id="4-使用-Docker-Compose">4. 使用 Docker Compose</h3><p>创建 <code>docker-compose.yml</code>：</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">version:</span> <span class="string">'3.8'</span></span><br><span class="line"></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="attr">xget:</span></span><br><span class="line">    <span class="attr">build:</span> <span class="string">.</span></span><br><span class="line">    <span class="attr">container_name:</span> <span class="string">xget</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">"3000:3000"</span></span><br><span class="line">    <span class="attr">environment:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">CACHE_TTL=1800</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">MAX_RETRIES=3</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">REQUEST_TIMEOUT=30000</span></span><br><span class="line">    <span class="attr">restart:</span> <span class="string">unless-stopped</span></span><br><span class="line">    <span class="attr">networks:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">xget-network</span></span><br><span class="line"></span><br><span class="line"><span class="attr">networks:</span></span><br><span class="line">  <span class="attr">xget-network:</span></span><br><span class="line">    <span class="attr">driver:</span> <span class="string">bridge</span></span><br></pre></td></tr></tbody></table></figure><p>启动服务：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker-compose up -d</span><br></pre></td></tr></tbody></table></figure><h3 id="5-配置反向代理（Nginx）">5. 配置反向代理（Nginx）</h3><p>创建 Nginx 配置：</p><figure class="highlight nginx"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">server</span> {</span><br><span class="line">    <span class="attribute">listen</span> <span class="number">80</span>;</span><br><span class="line">    <span class="attribute">server_name</span> your-domain.com;</span><br><span class="line"></span><br><span class="line">    <span class="section">location</span> / {</span><br><span class="line">        <span class="attribute">proxy_pass</span> http://localhost:3000;</span><br><span class="line">        <span class="attribute">proxy_http_version</span> <span class="number">1</span>.<span class="number">1</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> Upgrade <span class="variable">$http_upgrade</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> Connection <span class="string">'upgrade'</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> Host <span class="variable">$host</span>;</span><br><span class="line">        <span class="attribute">proxy_cache_bypass</span> <span class="variable">$http_upgrade</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> X-Real-IP <span class="variable">$remote_addr</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> X-Forwarded-For <span class="variable">$proxy_add_x_forwarded_for</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> X-Forwarded-Proto <span class="variable">$scheme</span>;</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>重启 Nginx：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> nginx -t</span><br><span class="line"><span class="built_in">sudo</span> systemctl restart nginx</span><br></pre></td></tr></tbody></table></figure><h3 id="6-配置-SSL（Let’s-Encrypt）">6. 配置 SSL（Let’s Encrypt）</h3><p>使用 Certbot：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt install certbot python3-certbot-nginx</span><br><span class="line"><span class="built_in">sudo</span> certbot --nginx -d your-domain.com</span><br></pre></td></tr></tbody></table></figure><h3 id="7-验证部署-5">7. 验证部署</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl https://your-domain.com/gh/microsoft/vscode/archive/main.zip</span><br></pre></td></tr></tbody></table></figure><h2 id="自托管部署（Podman）">自托管部署（Podman）</h2><h3 id="1-安装-Podman">1. 安装 Podman</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Ubuntu/Debian</span></span><br><span class="line"><span class="built_in">sudo</span> apt install podman</span><br><span class="line"></span><br><span class="line"><span class="comment"># Fedora</span></span><br><span class="line"><span class="built_in">sudo</span> dnf install podman</span><br><span class="line"></span><br><span class="line"><span class="comment"># Arch Linux</span></span><br><span class="line"><span class="built_in">sudo</span> pacman -S podman</span><br></pre></td></tr></tbody></table></figure><h3 id="2-准备-Containerfile">2. 准备 Containerfile</h3><p>创建 <code>Containerfile</code>（Podman 使用 Containerfile 而非 Dockerfile）：</p><figure class="highlight dockerfile"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 使用 Node.js 18 作为基础镜像</span></span><br><span class="line"><span class="keyword">FROM</span> node:<span class="number">18</span>-alpine</span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置工作目录</span></span><br><span class="line"><span class="keyword">WORKDIR</span><span class="language-bash"> /app</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 复制 package 文件</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> package*.json ./</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装依赖</span></span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> npm ci --only=production</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 复制源代码</span></span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> . .</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 暴露端口</span></span><br><span class="line"><span class="keyword">EXPOSE</span> <span class="number">3000</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动应用</span></span><br><span class="line"><span class="keyword">CMD</span><span class="language-bash"> [<span class="string">"node"</span>, <span class="string">"src/index.js"</span>]</span></span><br></pre></td></tr></tbody></table></figure><h3 id="3-构建镜像">3. 构建镜像</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">podman build -t xget:latest .</span><br></pre></td></tr></tbody></table></figure><h3 id="4-运行容器">4. 运行容器</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">podman run -d \</span><br><span class="line">  --name xget \</span><br><span class="line">  -p 3000:3000 \</span><br><span class="line">  -e CACHE_TTL=1800 \</span><br><span class="line">  -e MAX_RETRIES=3 \</span><br><span class="line">  -e REQUEST_TIMEOUT=30000 \</span><br><span class="line">  xget:latest</span><br></pre></td></tr></tbody></table></figure><h3 id="5-使用-Podman-Compose">5. 使用 Podman Compose</h3><p>安装 Podman Compose：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install podman-compose</span><br></pre></td></tr></tbody></table></figure><p>创建 <code>docker-compose.yml</code>（与 Docker 相同）：</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">version:</span> <span class="string">'3.8'</span></span><br><span class="line"></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="attr">xget:</span></span><br><span class="line">    <span class="attr">build:</span> <span class="string">.</span></span><br><span class="line">    <span class="attr">container_name:</span> <span class="string">xget</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">"3000:3000"</span></span><br><span class="line">    <span class="attr">environment:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">CACHE_TTL=1800</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">MAX_RETRIES=3</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">REQUEST_TIMEOUT=30000</span></span><br><span class="line">    <span class="attr">restart:</span> <span class="string">unless-stopped</span></span><br><span class="line">    <span class="attr">networks:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">xget-network</span></span><br><span class="line"></span><br><span class="line"><span class="attr">networks:</span></span><br><span class="line">  <span class="attr">xget-network:</span></span><br><span class="line">    <span class="attr">driver:</span> <span class="string">bridge</span></span><br></pre></td></tr></tbody></table></figure><p>启动服务：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">podman-compose up -d</span><br></pre></td></tr></tbody></table></figure><h3 id="6-配置系统服务">6. 配置系统服务</h3><p>创建 systemd 服务文件 <code>/etc/systemd/system/xget.service</code>：</p><figure class="highlight ini"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[Unit]</span></span><br><span class="line"><span class="attr">Description</span>=Xget Service</span><br><span class="line"><span class="attr">After</span>=network.target</span><br><span class="line"></span><br><span class="line"><span class="section">[Service]</span></span><br><span class="line"><span class="attr">Type</span>=forking</span><br><span class="line"><span class="attr">User</span>=podman</span><br><span class="line"><span class="attr">Group</span>=podman</span><br><span class="line"><span class="attr">ExecStart</span>=/usr/bin/podman-compose -f /path/to/docker-compose.yml up -d</span><br><span class="line"><span class="attr">ExecStop</span>=/usr/bin/podman-compose -f /path/to/docker-compose.yml down</span><br><span class="line"><span class="attr">Restart</span>=always</span><br><span class="line"></span><br><span class="line"><span class="section">[Install]</span></span><br><span class="line"><span class="attr">WantedBy</span>=multi-user.target</span><br></pre></td></tr></tbody></table></figure><p>启用并启动服务：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> systemctl daemon-reload</span><br><span class="line"><span class="built_in">sudo</span> systemctl <span class="built_in">enable</span> xget</span><br><span class="line"><span class="built_in">sudo</span> systemctl start xget</span><br></pre></td></tr></tbody></table></figure><h3 id="7-验证部署-6">7. 验证部署</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl https://your-domain.com/gh/microsoft/vscode/archive/main.zip</span><br></pre></td></tr></tbody></table></figure><h2 id="配置优化">配置优化</h2><h3 id="性能优化">性能优化</h3><h4 id="1-缓存配置">1. 缓存配置</h4><p><strong>Cloudflare Workers</strong></p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> cache = caches.<span class="property">default</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">cachedFetch</span>(<span class="params">request</span>) {</span><br><span class="line">  <span class="keyword">const</span> cacheKey = <span class="keyword">new</span> <span class="title class_">Request</span>(request.<span class="property">url</span>, request);</span><br><span class="line">  <span class="keyword">const</span> cached = <span class="keyword">await</span> cache.<span class="title function_">match</span>(cacheKey);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> (cached) {</span><br><span class="line">    <span class="keyword">return</span> cached;</span><br><span class="line">  }</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> response = <span class="keyword">await</span> <span class="title function_">fetch</span>(request);</span><br><span class="line">  <span class="keyword">const</span> clonedResponse = response.<span class="title function_">clone</span>();</span><br><span class="line">  <span class="keyword">await</span> cache.<span class="title function_">put</span>(cacheKey, clonedResponse);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> response;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p><strong>自托管</strong></p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="title class_">NodeCache</span> = <span class="built_in">require</span>(<span class="string">'node-cache'</span>);</span><br><span class="line"><span class="keyword">const</span> cache = <span class="keyword">new</span> <span class="title class_">NodeCache</span>({ <span class="attr">stdTTL</span>: <span class="number">1800</span> });</span><br></pre></td></tr></tbody></table></figure><h4 id="2-压缩配置">2. 压缩配置</h4><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 启用压缩</span></span><br><span class="line"><span class="keyword">const</span> compression = <span class="built_in">require</span>(<span class="string">'compression'</span>);</span><br><span class="line">app.<span class="title function_">use</span>(<span class="title function_">compression</span>());</span><br></pre></td></tr></tbody></table></figure><h4 id="3-连接池配置">3. 连接池配置</h4><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> http = <span class="built_in">require</span>(<span class="string">'http'</span>);</span><br><span class="line"><span class="keyword">const</span> https = <span class="built_in">require</span>(<span class="string">'https'</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> agent = <span class="keyword">new</span> https.<span class="title class_">Agent</span>({</span><br><span class="line">  <span class="attr">keepAlive</span>: <span class="literal">true</span>,</span><br><span class="line">  <span class="attr">maxSockets</span>: <span class="number">100</span>,</span><br><span class="line">  <span class="attr">maxFreeSockets</span>: <span class="number">10</span></span><br><span class="line">});</span><br></pre></td></tr></tbody></table></figure><h3 id="安全配置">安全配置</h3><h4 id="1-CORS-配置">1. CORS 配置</h4><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">app.<span class="title function_">use</span>(<span class="function">(<span class="params">req, res, next</span>) =&gt;</span> {</span><br><span class="line">  res.<span class="title function_">header</span>(<span class="string">'Access-Control-Allow-Origin'</span>, <span class="string">'*'</span>);</span><br><span class="line">  res.<span class="title function_">header</span>(<span class="string">'Access-Control-Allow-Methods'</span>, <span class="string">'GET, HEAD, OPTIONS'</span>);</span><br><span class="line">  res.<span class="title function_">header</span>(<span class="string">'Access-Control-Allow-Headers'</span>, <span class="string">'Content-Type'</span>);</span><br><span class="line">  <span class="title function_">next</span>();</span><br><span class="line">});</span><br></pre></td></tr></tbody></table></figure><h4 id="2-速率限制">2. 速率限制</h4><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> rateLimit = <span class="built_in">require</span>(<span class="string">'express-rate-limit'</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> limiter = <span class="title function_">rateLimit</span>({</span><br><span class="line">  <span class="attr">windowMs</span>: <span class="number">15</span> * <span class="number">60</span> * <span class="number">1000</span>, <span class="comment">// 15 分钟</span></span><br><span class="line">  <span class="attr">max</span>: <span class="number">1000</span> <span class="comment">// 每个窗口期最多 1000 个请求</span></span><br><span class="line">});</span><br><span class="line"></span><br><span class="line">app.<span class="title function_">use</span>(limiter);</span><br></pre></td></tr></tbody></table></figure><h4 id="3-安全标头">3. 安全标头</h4><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> helmet = <span class="built_in">require</span>(<span class="string">'helmet'</span>);</span><br><span class="line">app.<span class="title function_">use</span>(<span class="title function_">helmet</span>());</span><br></pre></td></tr></tbody></table></figure><h3 id="监控配置">监控配置</h3><h4 id="1-日志记录">1. 日志记录</h4><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> winston = <span class="built_in">require</span>(<span class="string">'winston'</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> logger = winston.<span class="title function_">createLogger</span>({</span><br><span class="line">  <span class="attr">level</span>: <span class="string">'info'</span>,</span><br><span class="line">  <span class="attr">format</span>: winston.<span class="property">format</span>.<span class="title function_">json</span>(),</span><br><span class="line">  <span class="attr">transports</span>: [</span><br><span class="line">    <span class="keyword">new</span> winston.<span class="property">transports</span>.<span class="title class_">File</span>({ <span class="attr">filename</span>: <span class="string">'error.log'</span>, <span class="attr">level</span>: <span class="string">'error'</span> }),</span><br><span class="line">    <span class="keyword">new</span> winston.<span class="property">transports</span>.<span class="title class_">File</span>({ <span class="attr">filename</span>: <span class="string">'combined.log'</span> })</span><br><span class="line">  ]</span><br><span class="line">});</span><br></pre></td></tr></tbody></table></figure><h4 id="2-性能监控">2. 性能监控</h4><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> promClient = <span class="built_in">require</span>(<span class="string">'prom-client'</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> httpRequestDuration = <span class="keyword">new</span> promClient.<span class="title class_">Histogram</span>({</span><br><span class="line">  <span class="attr">name</span>: <span class="string">'http_request_duration_seconds'</span>,</span><br><span class="line">  <span class="attr">help</span>: <span class="string">'Duration of HTTP requests in seconds'</span>,</span><br><span class="line">  <span class="attr">labelNames</span>: [<span class="string">'method'</span>, <span class="string">'route'</span>, <span class="string">'code'</span>]</span><br><span class="line">});</span><br></pre></td></tr></tbody></table></figure><h2 id="故障排查">故障排查</h2><h3 id="常见问题">常见问题</h3><h4 id="1-部署失败">1. 部署失败</h4><p><strong>Cloudflare Workers</strong></p><ul><li>检查 <code>wrangler.toml</code> 配置</li><li>确认账户权限</li><li>查看部署日志</li></ul><p><strong>Docker</strong></p><ul><li>检查 Dockerfile 语法</li><li>确认端口映射</li><li>查看容器日志</li></ul><h4 id="2-性能问题">2. 性能问题</h4><ul><li>检查缓存配置</li><li>优化压缩设置</li><li>调整连接池大小</li></ul><h4 id="3-安全问题">3. 安全问题</h4><ul><li>检查 CORS 配置</li><li>验证速率限制</li><li>审查安全标头</li></ul><h3 id="调试技巧">调试技巧</h3><h4 id="1-启用调试日志">1. 启用调试日志</h4><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="variable constant_">DEBUG</span> = process.<span class="property">env</span>.<span class="property">DEBUG</span> === <span class="string">'true'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">debug</span>(<span class="params">message</span>) {</span><br><span class="line">  <span class="keyword">if</span> (<span class="variable constant_">DEBUG</span>) {</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`[DEBUG] <span class="subst">${message}</span>`</span>);</span><br><span class="line">  }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h4 id="2-性能分析">2. 性能分析</h4><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> start = <span class="title class_">Date</span>.<span class="title function_">now</span>();</span><br><span class="line"></span><br><span class="line"><span class="comment">// 执行操作</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> duration = <span class="title class_">Date</span>.<span class="title function_">now</span>() - start;</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`Operation took <span class="subst">${duration}</span>ms`</span>);</span><br></pre></td></tr></tbody></table></figure><h4 id="3-错误追踪">3. 错误追踪</h4><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">process.<span class="title function_">on</span>(<span class="string">'uncaughtException'</span>, <span class="function">(<span class="params">error</span>) =&gt;</span> {</span><br><span class="line">  <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">'Uncaught Exception:'</span>, error);</span><br><span class="line">  process.<span class="title function_">exit</span>(<span class="number">1</span>);</span><br><span class="line">});</span><br><span class="line"></span><br><span class="line">process.<span class="title function_">on</span>(<span class="string">'unhandledRejection'</span>, <span class="function">(<span class="params">reason, promise</span>) =&gt;</span> {</span><br><span class="line">  <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">'Unhandled Rejection at:'</span>, promise, <span class="string">'reason:'</span>, reason);</span><br><span class="line">});</span><br></pre></td></tr></tbody></table></figure><h2 id="维护指南">维护指南</h2><h3 id="更新部署">更新部署</h3><h4 id="Cloudflare-Workers">Cloudflare Workers</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git pull</span><br><span class="line">wrangler deploy</span><br></pre></td></tr></tbody></table></figure><h4 id="Docker">Docker</h4><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">git pull</span><br><span class="line">docker-compose down</span><br><span class="line">docker-compose build</span><br><span class="line">docker-compose up -d</span><br></pre></td></tr></tbody></table></figure><h3 id="备份配置">备份配置</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 备份配置文件</span></span><br><span class="line"><span class="built_in">cp</span> wrangler.toml wrangler.toml.backup</span><br><span class="line"><span class="built_in">cp</span> docker-compose.yml docker-compose.yml.backup</span><br></pre></td></tr></tbody></table></figure><h3 id="监控健康">监控健康</h3><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 检查服务状态</span></span><br><span class="line">curl https://your-domain.com/health</span><br><span class="line"></span><br><span class="line"><span class="comment"># 检查容器状态</span></span><br><span class="line">docker ps</span><br><span class="line"></span><br><span class="line"><span class="comment"># 检查 Worker 状态</span></span><br><span class="line">wrangler <span class="built_in">tail</span></span><br></pre></td></tr></tbody></table></figure><h2 id="最佳实践">最佳实践</h2><h3 id="1-使用环境变量">1. 使用环境变量</h3><p>避免硬编码配置，使用环境变量：</p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> config = {</span><br><span class="line">  <span class="attr">cacheTTL</span>: process.<span class="property">env</span>.<span class="property">CACHE_TTL</span> || <span class="number">1800</span>,</span><br><span class="line">  <span class="attr">maxRetries</span>: process.<span class="property">env</span>.<span class="property">MAX_RETRIES</span> || <span class="number">3</span>,</span><br><span class="line">  <span class="attr">requestTimeout</span>: process.<span class="property">env</span>.<span class="property">REQUEST_TIMEOUT</span> || <span class="number">30000</span></span><br><span class="line">};</span><br></pre></td></tr></tbody></table></figure><h3 id="2-实现健康检查">2. 实现健康检查</h3><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">app.<span class="title function_">get</span>(<span class="string">'/health'</span>, <span class="function">(<span class="params">req, res</span>) =&gt;</span> {</span><br><span class="line">  res.<span class="title function_">json</span>({ <span class="attr">status</span>: <span class="string">'ok'</span>, <span class="attr">timestamp</span>: <span class="title class_">Date</span>.<span class="title function_">now</span>() });</span><br><span class="line">});</span><br></pre></td></tr></tbody></table></figure><h3 id="3-优雅关闭">3. 优雅关闭</h3><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">process.<span class="title function_">on</span>(<span class="string">'SIGTERM'</span>, <span class="function">() =&gt;</span> {</span><br><span class="line">  server.<span class="title function_">close</span>(<span class="function">() =&gt;</span> {</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">'Server closed'</span>);</span><br><span class="line">    process.<span class="title function_">exit</span>(<span class="number">0</span>);</span><br><span class="line">  });</span><br><span class="line">});</span><br></pre></td></tr></tbody></table></figure><h3 id="4-版本管理">4. 版本管理</h3><p>使用语义化版本号：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">v1.0.0 - 初始版本</span><br><span class="line">v1.0.1 - 补丁更新</span><br><span class="line">v1.1.0 - 次要更新</span><br><span class="line">v2.0.0 - 主要更新</span><br></pre></td></tr></tbody></table></figure><h2 id="总结">总结</h2><p>Xget 支持多种部署方式，选择合适的部署方式取决于你的需求：</p><ul><li><strong>Cloudflare Workers</strong>：推荐用于生产环境，性能最佳</li><li><strong>EdgeOne Pages</strong>：适合国内用户，访问速度快</li><li><strong>Vercel/Netlify</strong>：易于部署，适合个人项目</li><li><strong>Deno Deploy</strong>：现代化部署，支持 TypeScript</li><li><strong>Docker/Podman</strong>：自托管，完全控制</li></ul><p>无论选择哪种部署方式，都建议：</p><ol><li>配置适当的缓存策略</li><li>启用安全防护</li><li>实施监控和日志</li><li>定期更新和维护</li></ol>]]></content>
    
    
    <summary type="html">全面介绍Xget在Cloudflare Workers、EdgeOne Pages、Vercel、Netlify、Deno Deploy、Docker和Podman等多种平台的部署方案。本文涵盖各平台的前置要求、配置步骤、环境变量设置以及常见问题排查指南</summary>
    
    
    
    <category term="技术文档" scheme="https://www.zeroxin.xin/categories/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/"/>
    
    
    <category term="Xget" scheme="https://www.zeroxin.xin/tags/Xget/"/>
    
    <category term="部署" scheme="https://www.zeroxin.xin/tags/%E9%83%A8%E7%BD%B2/"/>
    
    <category term="Cloudflare" scheme="https://www.zeroxin.xin/tags/Cloudflare/"/>
    
  </entry>
  
  <entry>
    <title>Xget 项目介绍与核心优势</title>
    <link href="https://www.zeroxin.xin/2025/12/27/xget-introduction-and-core-advantages/"/>
    <id>https://www.zeroxin.xin/2025/12/27/xget-introduction-and-core-advantages/</id>
    <published>2025-12-27T07:00:00.000Z</published>
    <updated>2026-06-18T09:19:20.987Z</updated>
    
    <content type="html"><![CDATA[<h1>Xget 项目介绍与核心优势</h1><h2 id="项目概述">项目概述</h2><p>Xget 是一个面向开发者资源的超高性能、安全、一体化加速引擎，其性能显著优于传统解决方案。它为代码存储库、模型和数据集中心、软件包注册表、容器注册表、AI 推理提供商等提供统一、高效的加速服务。</p><h3 id="技术深度解析">技术深度解析</h3><p>项目的技术深度解析文章已发布：<strong><a href="https://blog.xi-xu.me/2025/10/07/deep-dive-into-xget-technology.html">《深入剖析 Xget：一个高性能、多协议、高安全性的开发者资源加速引擎》</a></strong>。</p><h2 id="快速开始">快速开始</h2><h3 id="预部署实例">预部署实例</h3><ul><li><strong>不保证可靠性的预部署实例</strong>：<code>xget.xi-xu.me</code></li></ul><h3 id="URL-转换器">URL 转换器</h3><p><strong><a href="https://xuc.xi-xu.me">xuc.xi-xu.me</a></strong> - 一键转换任意支持平台的 URL 为 Xget 的加速格式！</p><h2 id="核心优势">核心优势</h2><h3 id="1-极速性能-突破传统加速器瓶颈">1. 极速性能 - 突破传统加速器瓶颈</h3><h4 id="毫秒级响应">毫秒级响应</h4><ul><li>Cloudflare 全球 330+ 边缘节点</li><li>平均响应时间 &lt; 50ms</li></ul><h4 id="HTTP-3-极速协议">HTTP/3 极速协议</h4><ul><li>启用最新 HTTP/3 协议</li><li>连接延迟降低 40%</li><li>传输速度提升 30%</li></ul><h4 id="智能多重压缩">智能多重压缩</h4><ul><li>支持 gzip、deflate、brotli 三重压缩算法</li><li>传输效率提升 60%</li></ul><h4 id="零延迟预连接">零延迟预连接</h4><ul><li>连接预热和保持活跃</li><li>消除握手开销</li><li>实现秒级响应</li></ul><h4 id="并行分片下载">并行分片下载</h4><ul><li>完整支持 HTTP Range 请求</li><li>多线程下载速度倍增</li></ul><h4 id="智能路由优化">智能路由优化</h4><ul><li>自动选择最优传输路径</li><li>避开网络拥堵节点</li></ul><h3 id="2-多平台深度集成">2. 多平台深度集成</h3><h4 id="一站式多平台支持">一站式多平台支持</h4><ul><li>统一支持各种开发场景中的主流平台</li><li>覆盖代码托管、包管理、容器镜像等多个领域</li></ul><h4 id="智能识别与转换">智能识别与转换</h4><ul><li>自动识别平台前缀并转换为目标平台的正确 URL 结构</li><li>无需手动记忆各平台的 URL 格式</li></ul><h4 id="一致的加速体验">一致的加速体验</h4><ul><li>无论文件类型或来源，均可享受统一且稳定的极速下载体验</li></ul><h3 id="3-企业级安全保障">3. 企业级安全保障</h3><h4 id="多层安全标头">多层安全标头</h4><p><strong>Strict-Transport-Security</strong></p><ul><li>强制 HTTPS 传输</li><li>预防中间人攻击</li></ul><p><strong>X-Frame-Options: DENY</strong></p><ul><li>防止点击劫持攻击</li></ul><p><strong>X-XSS-Protection</strong></p><ul><li>内置 XSS 防护机制</li></ul><p><strong>Content-Security-Policy</strong></p><ul><li>严格的内容安全策略</li></ul><p><strong>Referrer-Policy</strong></p><ul><li>控制引用信息泄露</li></ul><h4 id="请求验证机制">请求验证机制</h4><p><strong>HTTP 方法白名单</strong></p><ul><li>常规请求限制为 GET/HEAD</li><li>Git 操作动态允许 POST</li></ul><p><strong>路径长度限制</strong></p><ul><li>防止超长 URL 攻击（最大 2048 字符）</li></ul><p><strong>输入清理</strong></p><ul><li>防止路径遍历和注入攻击</li></ul><h4 id="超时保护">超时保护</h4><ul><li>30 秒请求超时</li><li>防止资源耗尽和恶意请求</li></ul><h3 id="4-现代架构与可靠性">4. 现代架构与可靠性</h3><h4 id="智能重试机制">智能重试机制</h4><p><strong>重试策略</strong></p><ul><li>最大 3 次重试</li><li>线性延迟策略（1000ms × 重试次数）</li><li>自动错误恢复，提高下载成功率</li><li>超时检测和中断处理</li></ul><h4 id="高效缓存策略">高效缓存策略</h4><p><strong>缓存配置</strong></p><ul><li>1800 秒（30 分钟）默认缓存时长</li><li>显著减少源站压力</li><li>Git 操作跳过缓存，确保实时性</li><li>基于 Cloudflare Cache API 的边缘缓存</li></ul><h4 id="性能监控系统">性能监控系统</h4><p><strong>监控功能</strong></p><ul><li>内置 <code>PerformanceMonitor</code> 类</li><li>实时追踪请求各阶段耗时</li><li>通过 <code>X-Performance-Metrics</code> 响应头提供详细性能数据</li><li>支持缓存命中率统计和优化建议</li></ul><h3 id="5-Git-协议完全兼容">5. Git 协议完全兼容</h3><h4 id="智能协议检测">智能协议检测</h4><p><strong>自动识别</strong></p><ul><li>自动识别 Git 特定端点（<code>/info/refs</code>、<code>/git-upload-pack</code>、<code>/git-receive-pack</code>）</li><li>检测 Git 客户端 User-Agent 模式</li><li>支持 <code>service=git-upload-pack</code> 等查询参数</li></ul><h4 id="完整操作支持">完整操作支持</h4><p><strong>支持的操作</strong></p><ul><li><code>git clone</code>：完整存储库克隆，支持浅克隆和分支指定</li><li><code>git push</code>：代码推送和分支管理</li><li><code>git pull/fetch</code>：增量更新和远程同步</li><li><code>git submodule</code>：子模块递归克隆</li></ul><h4 id="协议优化">协议优化</h4><p><strong>优化特性</strong></p><ul><li>保持 Git 专用请求头和认证信息</li><li>智能 User-Agent 处理（默认 <code>git/2.34.1</code>）</li><li>支持 Git LFS 大文件传输</li></ul><h3 id="6-生态系统集成">6. 生态系统集成</h3><h4 id="专用浏览器扩展">专用浏览器扩展</h4><p><strong>Xget Now</strong></p><ul><li>提供无缝体验</li><li>自动 URL 重定向，无需手动修改 URL</li><li>支持自定义 Xget 实例域名</li><li>多平台偏好设置和黑白名单管理</li><li>本地处理，确保隐私安全</li></ul><h4 id="下载工具兼容">下载工具兼容</h4><ul><li>完美支持 wget、cURL、aria2、IDM 等主流下载工具</li></ul><h4 id="CI-CD-集成">CI/CD 集成</h4><ul><li>可直接在 GitHub Actions、GitLab CI 等环境中使用</li></ul><h2 id="支持的平台概览">支持的平台概览</h2><p>Xget 支持以下主要平台：</p><h3 id="代码托管平台">代码托管平台</h3><ul><li>GitHub</li><li>GitHub Gist</li><li>GitLab</li><li>Gitea</li><li>Codeberg</li><li>SourceForge</li><li>AOSP (Android 开源项目)</li></ul><h3 id="AI-ML-平台">AI/ML 平台</h3><ul><li>Hugging Face (模型和数据集)</li><li>Civitai (AI 模型平台)</li><li>AI 推理提供商</li></ul><h3 id="包管理器">包管理器</h3><ul><li>npm (JavaScript)</li><li>PyPI (Python)</li><li>conda (Python)</li><li>Maven (Java)</li><li>Gradle (Java)</li><li>Homebrew (macOS)</li><li>RubyGems (Ruby)</li><li>CRAN ®</li><li>CPAN (Perl)</li><li>CTAN (TeX/LaTeX)</li><li>Go 模块</li><li>NuGet (.NET)</li><li>Rust Crates</li><li>Packagist (PHP)</li></ul><h3 id="系统包管理">系统包管理</h3><ul><li>Debian/Ubuntu apt</li><li>Fedora dnf</li><li>Rocky Linux dnf</li><li>openSUSE zypper</li><li>Arch Linux pacman</li></ul><h3 id="其他平台">其他平台</h3><ul><li>arXiv (论文下载)</li><li>F-Droid (Android 应用)</li><li>Jenkins (插件下载)</li><li>容器注册表 (Docker Hub, GHCR, GCR 等)</li><li>Apache 软件下载</li></ul><h2 id="技术亮点总结">技术亮点总结</h2><ol><li><strong>性能卓越</strong>：基于 Cloudflare 边缘网络，HTTP/3 协议，智能压缩</li><li><strong>安全可靠</strong>：多层安全防护，请求验证，超时保护</li><li><strong>架构现代</strong>：智能重试，高效缓存，性能监控</li><li><strong>协议兼容</strong>：完整支持 Git 协议，Docker 协议，AI 推理协议</li><li><strong>生态集成</strong>：浏览器扩展，下载工具兼容，CI/CD 集成</li><li><strong>多平台支持</strong>：覆盖 40+ 开发者常用平台</li></ol><p>Xget 通过其卓越的性能、全面的安全性和广泛的平台支持，为开发者提供了一个统一、高效的资源加速解决方案。</p>]]></content>
    
    
    <summary type="html">Xget是面向开发者资源的超高性能一体化加速引擎，覆盖代码仓库、模型数据集、包管理器、容器镜像和AI推理服务等场景。本文深入解析其Cloudflare边缘节点架构、HTTP/3协议优势、毫秒级响应能力以及相比传统加速器的核心优势，助力开发者提升工作效率</summary>
    
    
    
    <category term="技术文档" scheme="https://www.zeroxin.xin/categories/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/"/>
    
    
    <category term="开发工具" scheme="https://www.zeroxin.xin/tags/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/"/>
    
    <category term="Xget" scheme="https://www.zeroxin.xin/tags/Xget/"/>
    
    <category term="加速器" scheme="https://www.zeroxin.xin/tags/%E5%8A%A0%E9%80%9F%E5%99%A8/"/>
    
  </entry>
  
  <entry>
    <title>Xget 各平台使用指南</title>
    <link href="https://www.zeroxin.xin/2025/12/27/xget-platform-usage-guide/"/>
    <id>https://www.zeroxin.xin/2025/12/27/xget-platform-usage-guide/</id>
    <published>2025-12-27T07:00:00.000Z</published>
    <updated>2026-06-18T09:19:20.988Z</updated>
    
    <content type="html"><![CDATA[<h1>Xget 各平台使用指南</h1><h2 id="概述">概述</h2><p>本文档详细介绍了如何在各个支持平台上使用 Xget 进行加速。包括代码托管、包管理、容器镜像、AI 模型等各种场景的具体使用方法。</p><h2 id="代码托管平台">代码托管平台</h2><h3 id="GitHub">GitHub</h3><h4 id="基本使用">基本使用</h4><p><strong>下载文件</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 原始 URL</span></span><br><span class="line">https://github.com/microsoft/vscode/archive/refs/heads/main.zip</span><br><span class="line"></span><br><span class="line"><span class="comment"># 加速 URL</span></span><br><span class="line">wget https://xget.xi-xu.me/gh/microsoft/vscode/archive/refs/heads/main.zip</span><br></pre></td></tr></tbody></table></figure><p><strong>下载 Release</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载特定版本的 Release</span></span><br><span class="line">wget https://xget.xi-xu.me/gh/nodejs/node/releases/download/v20.10.0/node-v20.10.0-x64.msi</span><br></pre></td></tr></tbody></table></figure><h4 id="Git-操作">Git 操作</h4><p><strong>Clone 仓库</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 完整克隆</span></span><br><span class="line">git <span class="built_in">clone</span> https://xget.xi-xu.me/gh/microsoft/vscode.git</span><br><span class="line"></span><br><span class="line"><span class="comment"># 浅克隆（只克隆最新提交）</span></span><br><span class="line">git <span class="built_in">clone</span> --depth 1 https://xget.xi-xu.me/gh/microsoft/vscode.git</span><br><span class="line"></span><br><span class="line"><span class="comment"># 克隆特定分支</span></span><br><span class="line">git <span class="built_in">clone</span> -b main https://xget.xi-xu.me/gh/microsoft/vscode.git</span><br></pre></td></tr></tbody></table></figure><p><strong>Pull 和 Fetch</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 拉取最新代码</span></span><br><span class="line">git pull origin main</span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取远程更新</span></span><br><span class="line">git fetch origin</span><br></pre></td></tr></tbody></table></figure><p><strong>Push 操作</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 推送到远程仓库</span></span><br><span class="line">git push origin main</span><br><span class="line"></span><br><span class="line"><span class="comment"># 推送所有分支</span></span><br><span class="line">git push --all origin</span><br></pre></td></tr></tbody></table></figure><p><strong>Submodule 操作</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 克隆包含子模块的仓库</span></span><br><span class="line">git <span class="built_in">clone</span> --recursive https://xget.xi-xu.me/gh/microsoft/vscode.git</span><br><span class="line"></span><br><span class="line"><span class="comment"># 更新子模块</span></span><br><span class="line">git submodule update --init --recursive</span><br></pre></td></tr></tbody></table></figure><h4 id="高级用法">高级用法</h4><p><strong>Git LFS 支持</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 克隆包含 LFS 文件的仓库</span></span><br><span class="line">GIT_LFS_SKIP_SMUDGE=1 git <span class="built_in">clone</span> https://xget.xi-xu.me/gh/microsoft/vscode.git</span><br><span class="line"><span class="built_in">cd</span> vscode</span><br><span class="line">git lfs pull</span><br></pre></td></tr></tbody></table></figure><p><strong>配置 Git 使用 Xget</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 全局配置</span></span><br><span class="line">git config --global url.<span class="string">"https://xget.xi-xu.me/gh/"</span>.insteadOf <span class="string">"https://github.com/"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 仅对特定仓库配置</span></span><br><span class="line"><span class="built_in">cd</span> your-repo</span><br><span class="line">git config url.<span class="string">"https://xget.xi-xu.me/gh/"</span>.insteadOf <span class="string">"https://github.com/"</span></span><br></pre></td></tr></tbody></table></figure><h3 id="GitHub-Gist">GitHub Gist</h3><p><strong>下载 Gist</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载 Gist 文件</span></span><br><span class="line">wget https://xget.xi-xu.me/gist/xixu-me/e2ea9db6b1f143892495f796fef18631/raw/3b8807172ee492d0da3a7e370b0fb88fc97b53e6/Free-ChatGPT-Paid-Plan.md</span><br></pre></td></tr></tbody></table></figure><p><strong>克隆 Gist</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 克隆 Gist 仓库</span></span><br><span class="line">git <span class="built_in">clone</span> https://xget.xi-xu.me/gist/xixu-me/e2ea9db6b1f143892495f796fef18631.git</span><br></pre></td></tr></tbody></table></figure><h3 id="GitLab">GitLab</h3><p><strong>下载文件</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载压缩包</span></span><br><span class="line">wget https://xget.xi-xu.me/gl/gitlab-org/gitlab/-/archive/master/gitlab-master.zip</span><br></pre></td></tr></tbody></table></figure><p><strong>Git 操作</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Clone 仓库</span></span><br><span class="line">git <span class="built_in">clone</span> https://xget.xi-xu.me/gl/gitlab-org/gitlab.git</span><br><span class="line"></span><br><span class="line"><span class="comment"># Pull 更新</span></span><br><span class="line">git pull origin main</span><br></pre></td></tr></tbody></table></figure><h3 id="Gitea">Gitea</h3><p><strong>下载文件</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载压缩包</span></span><br><span class="line">wget https://xget.xi-xu.me/gitea/gitea/gitea/archive/master.zip</span><br></pre></td></tr></tbody></table></figure><p><strong>Git 操作</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Clone 仓库</span></span><br><span class="line">git <span class="built_in">clone</span> https://xget.xi-xu.me/gitea/gitea/gitea.git</span><br></pre></td></tr></tbody></table></figure><h3 id="Codeberg">Codeberg</h3><p><strong>下载文件</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载压缩包</span></span><br><span class="line">wget https://xget.xi-xu.me/codeberg/forgejo/forgejo/archive/forgejo.zip</span><br></pre></td></tr></tbody></table></figure><p><strong>Git 操作</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Clone 仓库</span></span><br><span class="line">git <span class="built_in">clone</span> https://xget.xi-xu.me/codeberg/forgejo/forgejo.git</span><br></pre></td></tr></tbody></table></figure><h3 id="SourceForge">SourceForge</h3><p><strong>下载文件</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载软件</span></span><br><span class="line">wget https://xget.xi-xu.me/sf/projects/sevenzip/files/7-Zip/23.01/7z2301-x64.exe/download</span><br></pre></td></tr></tbody></table></figure><p><strong>使用 aria2c 多线程下载</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">aria2c -x 16 -s 16 https://xget.xi-xu.me/sf/projects/sevenzip/files/7-Zip/23.01/7z2301-x64.exe/download</span><br></pre></td></tr></tbody></table></figure><h3 id="AOSP-Android-开源项目">AOSP (Android 开源项目)</h3><p><strong>Git 操作</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Clone AOSP 项目</span></span><br><span class="line">git <span class="built_in">clone</span> https://xget.xi-xu.me/aosp/platform/frameworks/base</span><br><span class="line"></span><br><span class="line"><span class="comment"># Clone 设备树</span></span><br><span class="line">git <span class="built_in">clone</span> https://xget.xi-xu.me/aosp/device/google/pixel</span><br></pre></td></tr></tbody></table></figure><p><strong>使用 repo 工具</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 配置 repo 使用 Xget</span></span><br><span class="line"><span class="built_in">export</span> REPO_URL=<span class="string">"https://xget.xi-xu.me/aosp/tools/repo"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 初始化仓库</span></span><br><span class="line">repo init -u https://xget.xi-xu.me/aosp/platform/manifest</span><br><span class="line"></span><br><span class="line"><span class="comment"># 同步代码</span></span><br><span class="line">repo <span class="built_in">sync</span></span><br></pre></td></tr></tbody></table></figure><h2 id="AI-ML-平台">AI/ML 平台</h2><h3 id="Hugging-Face">Hugging Face</h3><p><strong>下载模型文件</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载单个模型文件</span></span><br><span class="line">wget https://xget.xi-xu.me/hf/microsoft/DialoGPT-medium/resolve/main/pytorch_model.bin</span><br><span class="line"></span><br><span class="line"><span class="comment"># 下载配置文件</span></span><br><span class="line">wget https://xget.xi-xu.me/hf/microsoft/DialoGPT-medium/resolve/main/config.json</span><br></pre></td></tr></tbody></table></figure><p><strong>下载完整模型</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 使用 huggingface-cli</span></span><br><span class="line">pip install huggingface-hub</span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置使用 Xget</span></span><br><span class="line"><span class="built_in">export</span> HF_ENDPOINT=<span class="string">"https://xget.xi-xu.me/hf"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 下载模型</span></span><br><span class="line">huggingface-cli download microsoft/DialoGPT-medium</span><br></pre></td></tr></tbody></table></figure><p><strong>下载数据集</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载数据集文件</span></span><br><span class="line">wget https://xget.xi-xu.me/hf/datasets/rajpurkar/squad/resolve/main/plain_text/train-00000-of-00001.parquet</span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用 datasets 库</span></span><br><span class="line">pip install datasets</span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置使用 Xget</span></span><br><span class="line"><span class="built_in">export</span> HF_ENDPOINT=<span class="string">"https://xget.xi-xu.me/hf"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 下载数据集</span></span><br><span class="line">python -c <span class="string">"from datasets import load_dataset; ds = load_dataset('rajpurkar/squad')"</span></span><br></pre></td></tr></tbody></table></figure><p><strong>Python 代码示例</strong></p><figure class="highlight python"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> huggingface_hub <span class="keyword">import</span> snapshot_download</span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置使用 Xget</span></span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line">os.environ[<span class="string">'HF_ENDPOINT'</span>] = <span class="string">'https://xget.xi-xu.me/hf'</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 下载模型</span></span><br><span class="line">model_path = snapshot_download(repo_id=<span class="string">"microsoft/DialoGPT-medium"</span>)</span><br></pre></td></tr></tbody></table></figure><h3 id="Civitai">Civitai</h3><p><strong>下载模型</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载模型文件</span></span><br><span class="line">wget https://xget.xi-xu.me/civitai/api/download/models/128713 -O model.safetensors</span><br></pre></td></tr></tbody></table></figure><p><strong>使用 API</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 获取模型信息</span></span><br><span class="line">curl https://xget.xi-xu.me/civitai/api/v1/models/7240</span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取模型版本信息</span></span><br><span class="line">curl https://xget.xi-xu.me/civitai/api/v1/model-versions/128713</span><br></pre></td></tr></tbody></table></figure><p><strong>Python 代码示例</strong></p><figure class="highlight python"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置使用 Xget</span></span><br><span class="line">base_url = <span class="string">"https://xget.xi-xu.me/civitai/api"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取模型信息</span></span><br><span class="line">response = requests.get(<span class="string">f"<span class="subst">{base_url}</span>/v1/models/7240"</span>)</span><br><span class="line">model_info = response.json()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 下载模型</span></span><br><span class="line">download_url = model_info[<span class="string">'downloadUrl'</span>]</span><br><span class="line">response = requests.get(download_url)</span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">'model.safetensors'</span>, <span class="string">'wb'</span>) <span class="keyword">as</span> f:</span><br><span class="line">    f.write(response.content)</span><br></pre></td></tr></tbody></table></figure><h2 id="包管理平台">包管理平台</h2><h3 id="npm">npm</h3><p><strong>配置 npm 使用 Xget</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 设置 npm 注册表</span></span><br><span class="line">npm config <span class="built_in">set</span> registry https://xget.xi-xu.me/npm</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证配置</span></span><br><span class="line">npm config get registry</span><br></pre></td></tr></tbody></table></figure><p><strong>安装包</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装包</span></span><br><span class="line">npm install react</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装特定版本</span></span><br><span class="line">npm install react@18.2.0</span><br><span class="line"></span><br><span class="line"><span class="comment"># 全局安装</span></span><br><span class="line">npm install -g typescript</span><br></pre></td></tr></tbody></table></figure><p><strong>下载包文件</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 直接下载包文件</span></span><br><span class="line">wget https://xget.xi-xu.me/npm/react/-/react-18.2.0.tgz</span><br></pre></td></tr></tbody></table></figure><p><strong>使用 .npmrc</strong></p><p>在项目根目录创建 <code>.npmrc</code> 文件：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">registry=https://xget.xi-xu.me/npm</span><br></pre></td></tr></tbody></table></figure><h3 id="PyPI">PyPI</h3><p><strong>配置 pip 使用 Xget</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 使用 Xget 作为索引 URL</span></span><br><span class="line">pip install --index-url https://xget.xi-xu.me/pypi requests</span><br><span class="line"></span><br><span class="line"><span class="comment"># 额外索引 URL</span></span><br><span class="line">pip install --extra-index-url https://xget.xi-xu.me/pypi requests</span><br></pre></td></tr></tbody></table></figure><p><strong>使用 pip.conf</strong></p><p>创建或编辑 <code>~/.pip/pip.conf</code>：</p><figure class="highlight ini"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[global]</span></span><br><span class="line"><span class="attr">index-url</span> = https://xget.xi-xu.me/pypi</span><br></pre></td></tr></tbody></table></figure><p><strong>下载包文件</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载源码包</span></span><br><span class="line">wget https://xget.xi-xu.me/pypi/packages/source/r/requests/requests-2.31.0.tar.gz</span><br><span class="line"></span><br><span class="line"><span class="comment"># 下载 Wheel 文件</span></span><br><span class="line">wget https://xget.xi-xu.me/pypi/packages/py3/n/numpy/numpy-1.26.2-cp312-cp312-win_amd64.whl</span><br></pre></td></tr></tbody></table></figure><p><strong>使用 pip download</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载包及其依赖</span></span><br><span class="line">pip download --index-url https://xget.xi-xu.me/pypi requests</span><br><span class="line"></span><br><span class="line"><span class="comment"># 下载到指定目录</span></span><br><span class="line">pip download --index-url https://xget.xi-xu.me/pypi -d ./packages requests</span><br></pre></td></tr></tbody></table></figure><h3 id="conda">conda</h3><p><strong>配置 conda 使用 Xget</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 添加 Xget 作为频道</span></span><br><span class="line">conda config --add channels https://xget.xi-xu.me/conda/pkgs/main</span><br><span class="line"></span><br><span class="line"><span class="comment"># 添加社区频道</span></span><br><span class="line">conda config --add channels https://xget.xi-xu.me/conda/community/conda-forge</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证配置</span></span><br><span class="line">conda config --show channels</span><br></pre></td></tr></tbody></table></figure><p><strong>安装包</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装包</span></span><br><span class="line">conda install python=3.11</span><br><span class="line"></span><br><span class="line"><span class="comment"># 从特定频道安装</span></span><br><span class="line">conda install -c https://xget.xi-xu.me/conda/community/conda-forge pytorch</span><br></pre></td></tr></tbody></table></figure><p><strong>下载包文件</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载包文件</span></span><br><span class="line">wget https://xget.xi-xu.me/conda/pkgs/main/win-64/python-3.11.0-h955f1ad_0.conda</span><br></pre></td></tr></tbody></table></figure><p><strong>使用 .condarc</strong></p><p>创建或编辑 <code>~/.condarc</code>：</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">channels:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">https://xget.xi-xu.me/conda/pkgs/main</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">https://xget.xi-xu.me/conda/community/conda-forge</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">defaults</span></span><br></pre></td></tr></tbody></table></figure><h3 id="Maven">Maven</h3><p><strong>配置 Maven 使用 Xget</strong></p><p>编辑 <code>~/.m2/settings.xml</code>：</p><figure class="highlight xml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">settings</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">mirrors</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">mirror</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">id</span>&gt;</span>xget-maven<span class="tag">&lt;/<span class="name">id</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">mirrorOf</span>&gt;</span>central<span class="tag">&lt;/<span class="name">mirrorOf</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">name</span>&gt;</span>Xget Maven Mirror<span class="tag">&lt;/<span class="name">name</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">url</span>&gt;</span>https://xget.xi-xu.me/maven2<span class="tag">&lt;/<span class="name">url</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">mirror</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">mirrors</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">settings</span>&gt;</span></span><br></pre></td></tr></tbody></table></figure><p><strong>下载依赖</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 使用 Maven 下载依赖</span></span><br><span class="line">mvn dependency:resolve</span><br><span class="line"></span><br><span class="line"><span class="comment"># 下载源码</span></span><br><span class="line">mvn dependency:sources</span><br></pre></td></tr></tbody></table></figure><p><strong>下载 JAR 文件</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 直接下载 JAR 文件</span></span><br><span class="line">wget https://xget.xi-xu.me/maven2/org/springframework/spring-core/6.1.1/spring-core-6.1.1.jar</span><br></pre></td></tr></tbody></table></figure><h3 id="Gradle">Gradle</h3><p><strong>配置 Gradle 使用 Xget</strong></p><p>编辑 <code>build.gradle</code>：</p><figure class="highlight groovy"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">repositories {</span><br><span class="line">    maven { url <span class="string">'https://xget.xi-xu.me/maven2'</span> }</span><br><span class="line">    mavenCentral()</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>或编辑 <code>settings.gradle</code>：</p><figure class="highlight groovy"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">dependencyResolutionManagement {</span><br><span class="line">    repositories {</span><br><span class="line">        maven { url <span class="string">'https://xget.xi-xu.me/maven2'</span> }</span><br><span class="line">        mavenCentral()</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p><strong>下载依赖</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载依赖</span></span><br><span class="line">./gradlew dependencies</span><br><span class="line"></span><br><span class="line"><span class="comment"># 下载源码</span></span><br><span class="line">./gradlew downloadSources</span><br></pre></td></tr></tbody></table></figure><p><strong>下载插件</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载 Gradle 插件</span></span><br><span class="line">wget https://xget.xi-xu.me/gradle/m2/com/github/ben-manes/gradle-caches-plugin/0.9.0/gradle-caches-plugin-0.9.0.pom</span><br></pre></td></tr></tbody></table></figure><h3 id="Homebrew">Homebrew</h3><p><strong>配置 Homebrew 使用 Xget</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 设置 Homebrew 使用 Xget</span></span><br><span class="line"><span class="built_in">export</span> HOMEBREW_BREW_GIT_REMOTE=<span class="string">"https://xget.xi-xu.me/homebrew/brew"</span></span><br><span class="line"><span class="built_in">export</span> HOMEBREW_CORE_GIT_REMOTE=<span class="string">"https://xget.xi-xu.me/homebrew/homebrew-core"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 更新 Homebrew</span></span><br><span class="line">brew update</span><br></pre></td></tr></tbody></table></figure><p><strong>安装软件</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装软件</span></span><br><span class="line">brew install python</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装 Cask</span></span><br><span class="line">brew install --cask visual-studio-code</span><br></pre></td></tr></tbody></table></figure><h3 id="RubyGems">RubyGems</h3><p><strong>配置 gem 使用 Xget</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 设置 gem 源</span></span><br><span class="line">gem sources --add https://xget.xi-xu.me/rubygems</span><br><span class="line">gem sources --remove https://rubygems.org/</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证配置</span></span><br><span class="line">gem sources -l</span><br></pre></td></tr></tbody></table></figure><p><strong>安装 gem</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装 gem</span></span><br><span class="line">gem install rails</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装特定版本</span></span><br><span class="line">gem install rails -v 7.1.2</span><br></pre></td></tr></tbody></table></figure><p><strong>下载 gem 文件</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载 gem 文件</span></span><br><span class="line">wget https://xget.xi-xu.me/rubygems/gems/rails-7.1.2.gem</span><br></pre></td></tr></tbody></table></figure><h3 id="CRAN-®">CRAN ®</h3><p><strong>配置 R 使用 Xget</strong></p><p>在 R 中执行：</p><figure class="highlight r"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 设置 CRAN 镜像</span></span><br><span class="line">options<span class="punctuation">(</span>repos <span class="operator">=</span> <span class="built_in">c</span><span class="punctuation">(</span>CRAN <span class="operator">=</span> <span class="string">"https://xget.xi-xu.me/cran"</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证配置</span></span><br><span class="line">options<span class="punctuation">(</span><span class="punctuation">)</span><span class="operator">$</span>repos</span><br></pre></td></tr></tbody></table></figure><p><strong>安装包</strong></p><figure class="highlight r"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装包</span></span><br><span class="line">install.packages<span class="punctuation">(</span><span class="string">"ggplot2"</span><span class="punctuation">)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装特定版本</span></span><br><span class="line">install.packages<span class="punctuation">(</span><span class="string">"https://xget.xi-xu.me/cran/src/contrib/Archive/ggplot2/ggplot2_3.4.4.tar.gz"</span><span class="punctuation">)</span></span><br></pre></td></tr></tbody></table></figure><p><strong>下载包文件</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载源码包</span></span><br><span class="line">wget https://xget.xi-xu.me/cran/src/contrib/ggplot2_3.4.4.tar.gz</span><br></pre></td></tr></tbody></table></figure><h3 id="CPAN-Perl">CPAN (Perl)</h3><p><strong>配置 CPAN 使用 Xget</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 设置 CPAN 镜像</span></span><br><span class="line">cpanm --mirror https://xget.xi-xu.me/cpan --mirror-only Module::Name</span><br></pre></td></tr></tbody></table></figure><p><strong>安装模块</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装模块</span></span><br><span class="line">cpanm Plack</span><br><span class="line"></span><br><span class="line"><span class="comment"># 从 URL 安装</span></span><br><span class="line">cpanm https://xget.xi-xu.me/cpan/authors/id/M/MI/MIYAGAWA/Plack-1.050.tar.gz</span><br></pre></td></tr></tbody></table></figure><p><strong>下载模块文件</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载模块文件</span></span><br><span class="line">wget https://xget.xi-xu.me/cpan/authors/id/M/MI/MIYAGAWA/Plack-1.050.tar.gz</span><br></pre></td></tr></tbody></table></figure><h3 id="CTAN-TeX-LaTeX">CTAN (TeX/LaTeX)</h3><p><strong>下载 TeX 包</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载 TeX 包</span></span><br><span class="line">wget https://xget.xi-xu.me/ctan/tex-archive/macros/latex/contrib/beamer.zip</span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用 tlmgr 配置</span></span><br><span class="line">tlmgr option repository https://xget.xi-xu.me/ctan/tex-archive/tlcontrib</span><br></pre></td></tr></tbody></table></figure><h3 id="Go-模块">Go 模块</h3><p><strong>配置 Go 使用 Xget</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 设置 Go 代理</span></span><br><span class="line"><span class="built_in">export</span> GOPROXY=https://xget.xi-xu.me/golang</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证配置</span></span><br><span class="line">go <span class="built_in">env</span> GOPROXY</span><br></pre></td></tr></tbody></table></figure><p><strong>下载模块</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载模块</span></span><br><span class="line">go mod download github.com/golang/go@v1.21.5</span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取依赖</span></span><br><span class="line">go get github.com/golang/go@v1.21.5</span><br></pre></td></tr></tbody></table></figure><p><strong>下载模块文件</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载模块文件</span></span><br><span class="line">wget https://xget.xi-xu.me/golang/github.com/golang/go/@v/v1.21.5.zip</span><br></pre></td></tr></tbody></table></figure><h3 id="NuGet-NET">NuGet (.NET)</h3><p><strong>配置 NuGet 使用 Xget</strong></p><p>编辑 <code>NuGet.Config</code>：</p><figure class="highlight xml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">configuration</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">packageSources</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">add</span> <span class="attr">key</span>=<span class="string">"xget"</span> <span class="attr">value</span>=<span class="string">"https://xget.xi-xu.me/nuget"</span> <span class="attr">protocolVersion</span>=<span class="string">"3"</span> /&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">packageSources</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">configuration</span>&gt;</span></span><br></pre></td></tr></tbody></table></figure><p><strong>安装包</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 使用 dotnet 安装包</span></span><br><span class="line">dotnet add package Newtonsoft.Json --<span class="built_in">source</span> https://xget.xi-xu.me/nuget</span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用 NuGet CLI</span></span><br><span class="line">nuget install Newtonsoft.Json -Source https://xget.xi-xu.me/nuget</span><br></pre></td></tr></tbody></table></figure><p><strong>下载包文件</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载 nupkg 文件</span></span><br><span class="line">wget https://xget.xi-xu.me/nuget/v3-flatcontainer/newtonsoft.json/13.0.3/newtonsoft.json.13.0.3.nupkg</span><br></pre></td></tr></tbody></table></figure><h3 id="Rust-Crates">Rust Crates</h3><p><strong>配置 Cargo 使用 Xget</strong></p><p>编辑 <code>~/.cargo/config.toml</code>：</p><figure class="highlight toml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[source.xget]</span></span><br><span class="line"><span class="attr">registry</span> = <span class="string">"https://xget.xi-xu.me/crates"</span></span><br><span class="line"></span><br><span class="line"><span class="section">[registries.xget]</span></span><br><span class="line"><span class="attr">index</span> = <span class="string">"https://xget.xi-xu.me/crates"</span></span><br><span class="line"></span><br><span class="line"><span class="section">[crates-io]</span></span><br><span class="line"><span class="attr">replace-with</span> = <span class="string">"xget"</span></span><br></pre></td></tr></tbody></table></figure><p><strong>安装 crate</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装 crate</span></span><br><span class="line">cargo install ripgrep</span><br><span class="line"></span><br><span class="line"><span class="comment"># 添加依赖</span></span><br><span class="line">cargo add serde</span><br></pre></td></tr></tbody></table></figure><p><strong>下载 crate 文件</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载 crate 文件</span></span><br><span class="line">wget https://xget.xi-xu.me/crates/api/v1/crates/serde/1.0.195/download</span><br></pre></td></tr></tbody></table></figure><h3 id="Packagist-PHP">Packagist (PHP)</h3><p><strong>配置 Composer 使用 Xget</strong></p><p>编辑 <code>composer.json</code>：</p><figure class="highlight json"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line">  <span class="attr">"repositories"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">{</span></span><br><span class="line">      <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"composer"</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"url"</span><span class="punctuation">:</span> <span class="string">"https://xget.xi-xu.me/packagist"</span></span><br><span class="line">    <span class="punctuation">}</span></span><br><span class="line">  <span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></tbody></table></figure><p>或编辑 <code>~/.composer/config.json</code>：</p><figure class="highlight json"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line">  <span class="attr">"repositories"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">    <span class="attr">"packagist.org"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line">      <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"composer"</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">"url"</span><span class="punctuation">:</span> <span class="string">"https://xget.xi-xu.me/packagist"</span></span><br><span class="line">    <span class="punctuation">}</span></span><br><span class="line">  <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></tbody></table></figure><p><strong>安装包</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装包</span></span><br><span class="line">composer require laravel/framework</span><br><span class="line"></span><br><span class="line"><span class="comment"># 更新依赖</span></span><br><span class="line">composer update</span><br></pre></td></tr></tbody></table></figure><h2 id="系统包管理平台">系统包管理平台</h2><h3 id="Debian-Ubuntu">Debian/Ubuntu</h3><p><strong>配置 apt 使用 Xget</strong></p><p>编辑 <code>/etc/apt/sources.list</code>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">deb https://xget.xi-xu.me/debian bookworm main contrib non-free</span><br></pre></td></tr></tbody></table></figure><p>或编辑 <code>/etc/apt/sources.list.d/xget.list</code>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">deb https://xget.xi-xu.me/ubuntu jammy main restricted universe multiverse</span><br></pre></td></tr></tbody></table></figure><p><strong>更新和安装</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 更新包列表</span></span><br><span class="line"><span class="built_in">sudo</span> apt update</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装包</span></span><br><span class="line"><span class="built_in">sudo</span> apt install nginx</span><br><span class="line"></span><br><span class="line"><span class="comment"># 下载包文件</span></span><br><span class="line">apt-get download nginx</span><br></pre></td></tr></tbody></table></figure><h3 id="Fedora">Fedora</h3><p><strong>配置 dnf 使用 Xget</strong></p><p>编辑 <code>/etc/yum.repos.d/xget.repo</code>：</p><figure class="highlight ini"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[xget]</span></span><br><span class="line"><span class="attr">name</span>=Xget Fedora Mirror</span><br><span class="line"><span class="attr">baseurl</span>=https://xget.xi-xu.me/fedora/linux/releases/<span class="variable">$releasever</span>/Everything/<span class="variable">$basearch</span>/os/</span><br><span class="line"><span class="attr">enabled</span>=<span class="number">1</span></span><br><span class="line"><span class="attr">gpgcheck</span>=<span class="number">0</span></span><br></pre></td></tr></tbody></table></figure><p><strong>更新和安装</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 更新包列表</span></span><br><span class="line"><span class="built_in">sudo</span> dnf makecache</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装包</span></span><br><span class="line"><span class="built_in">sudo</span> dnf install nginx</span><br><span class="line"></span><br><span class="line"><span class="comment"># 下载包文件</span></span><br><span class="line"><span class="built_in">sudo</span> dnf download nginx</span><br></pre></td></tr></tbody></table></figure><h3 id="Rocky-Linux">Rocky Linux</h3><p><strong>配置 dnf 使用 Xget</strong></p><p>编辑 <code>/etc/yum.repos.d/xget.repo</code>：</p><figure class="highlight ini"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[xget-baseos]</span></span><br><span class="line"><span class="attr">name</span>=Xget Rocky Linux BaseOS</span><br><span class="line"><span class="attr">baseurl</span>=https://xget.xi-xu.me/rocky/<span class="variable">$releasever</span>/BaseOS/<span class="variable">$basearch</span>/os/</span><br><span class="line"><span class="attr">enabled</span>=<span class="number">1</span></span><br><span class="line"><span class="attr">gpgcheck</span>=<span class="number">0</span></span><br><span class="line"></span><br><span class="line"><span class="section">[xget-appstream]</span></span><br><span class="line"><span class="attr">name</span>=Xget Rocky Linux AppStream</span><br><span class="line"><span class="attr">baseurl</span>=https://xget.xi-xu.me/rocky/<span class="variable">$releasever</span>/AppStream/<span class="variable">$basearch</span>/os/</span><br><span class="line"><span class="attr">enabled</span>=<span class="number">1</span></span><br><span class="line"><span class="attr">gpgcheck</span>=<span class="number">0</span></span><br></pre></td></tr></tbody></table></figure><p><strong>更新和安装</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 更新包列表</span></span><br><span class="line"><span class="built_in">sudo</span> dnf makecache</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装包</span></span><br><span class="line"><span class="built_in">sudo</span> dnf install nginx</span><br></pre></td></tr></tbody></table></figure><h3 id="openSUSE">openSUSE</h3><p><strong>配置 zypper 使用 Xget</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 添加仓库</span></span><br><span class="line"><span class="built_in">sudo</span> zypper ar -f https://xget.xi-xu.me/opensuse/tumbleweed/repo/oss xget-oss</span><br><span class="line"></span><br><span class="line"><span class="comment"># 刷新仓库</span></span><br><span class="line"><span class="built_in">sudo</span> zypper refresh</span><br></pre></td></tr></tbody></table></figure><p><strong>更新和安装</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 更新包列表</span></span><br><span class="line"><span class="built_in">sudo</span> zypper refresh</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装包</span></span><br><span class="line"><span class="built_in">sudo</span> zypper install nginx</span><br><span class="line"></span><br><span class="line"><span class="comment"># 下载包文件</span></span><br><span class="line"><span class="built_in">sudo</span> zypper download nginx</span><br></pre></td></tr></tbody></table></figure><h3 id="Arch-Linux">Arch Linux</h3><p><strong>配置 pacman 使用 Xget</strong></p><p>编辑 <code>/etc/pacman.conf</code>：</p><figure class="highlight ini"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[xget]</span></span><br><span class="line"><span class="attr">Server</span> = https://xget.xi-xu.me/arch/<span class="variable">$repo</span>/os/<span class="variable">$arch</span></span><br></pre></td></tr></tbody></table></figure><p><strong>更新和安装</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 更新包列表</span></span><br><span class="line"><span class="built_in">sudo</span> pacman -Sy</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装包</span></span><br><span class="line"><span class="built_in">sudo</span> pacman -S nginx</span><br><span class="line"></span><br><span class="line"><span class="comment"># 下载包文件</span></span><br><span class="line"><span class="built_in">sudo</span> pacman -Sw nginx</span><br></pre></td></tr></tbody></table></figure><h2 id="其他平台">其他平台</h2><h3 id="arXiv">arXiv</h3><p><strong>下载论文</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载 PDF</span></span><br><span class="line">wget https://xget.xi-xu.me/arxiv/pdf/2312.12345.pdf</span><br><span class="line"></span><br><span class="line"><span class="comment"># 下载源码</span></span><br><span class="line">wget https://xget.xi-xu.me/arxiv/e-print/2312.12345</span><br></pre></td></tr></tbody></table></figure><h3 id="F-Droid">F-Droid</h3><p><strong>下载应用</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载 APK</span></span><br><span class="line">wget https://xget.xi-xu.me/fdroid/repo/com.example.app_100.apk</span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置 F-Droid 客户端</span></span><br><span class="line"><span class="comment"># 在 F-Droid 客户端中添加仓库：https://xget.xi-xu.me/fdroid/repo</span></span><br></pre></td></tr></tbody></table></figure><h3 id="Jenkins-插件">Jenkins 插件</h3><p><strong>下载插件</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载插件</span></span><br><span class="line">wget https://xget.xi-xu.me/jenkins/latest/git.hpi</span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置 Jenkins 使用 Xget</span></span><br><span class="line"><span class="comment"># 在 Jenkins 系统配置中设置更新站点：https://xget.xi-xu.me/jenkins/update-center.json</span></span><br></pre></td></tr></tbody></table></figure><h3 id="Apache-软件下载">Apache 软件下载</h3><p><strong>下载软件</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载软件</span></span><br><span class="line">wget https://xget.xi-xu.me/apache/tomcat/tomcat-10/v10.1.15/bin/apache-tomcat-10.1.15.tar.gz</span><br><span class="line"></span><br><span class="line"><span class="comment"># 使用 aria2c 多线程下载</span></span><br><span class="line">aria2c -x 16 -s 16 https://xget.xi-xu.me/apache/tomcat/tomcat-10/v10.1.15/bin/apache-tomcat-10.1.15.tar.gz</span><br></pre></td></tr></tbody></table></figure><h3 id="容器注册表">容器注册表</h3><p><strong>配置 Docker 使用 Xget</strong></p><p>编辑 <code>/etc/docker/daemon.json</code>：</p><figure class="highlight json"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line">  <span class="attr">"registry-mirrors"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="string">"https://xget.xi-xu.me/cr/registry-1.docker.io"</span></span><br><span class="line">  <span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></tbody></table></figure><p>重启 Docker：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> systemctl restart docker</span><br></pre></td></tr></tbody></table></figure><p><strong>拉取镜像</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 拉取镜像</span></span><br><span class="line">docker pull nginx:latest</span><br><span class="line"></span><br><span class="line"><span class="comment"># 拉取特定标签</span></span><br><span class="line">docker pull nginx:1.25</span><br><span class="line"></span><br><span class="line"><span class="comment"># 拉取私有镜像</span></span><br><span class="line">docker pull ghcr.io/user/image:tag</span><br></pre></td></tr></tbody></table></figure><p><strong>使用 Podman</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 配置 Podman 使用 Xget</span></span><br><span class="line">podman pull docker.io/nginx:latest</span><br><span class="line"></span><br><span class="line"><span class="comment"># 拉取镜像</span></span><br><span class="line">podman pull nginx:latest</span><br></pre></td></tr></tbody></table></figure><h3 id="AI-推理提供商">AI 推理提供商</h3><p><strong>配置 OpenAI 使用 Xget</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 使用 curl</span></span><br><span class="line">curl https://xget.xi-xu.me/ip/api.openai.com/v1/chat/completions \</span><br><span class="line">  -H <span class="string">"Authorization: Bearer YOUR_API_KEY"</span> \</span><br><span class="line">  -H <span class="string">"Content-Type: application/json"</span> \</span><br><span class="line">  -d <span class="string">'{</span></span><br><span class="line"><span class="string">    "model": "gpt-4",</span></span><br><span class="line"><span class="string">    "messages": [{"role": "user", "content": "Hello!"}]</span></span><br><span class="line"><span class="string">  }'</span></span><br></pre></td></tr></tbody></table></figure><p><strong>Python 代码示例</strong></p><figure class="highlight python"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> openai</span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置使用 Xget</span></span><br><span class="line">openai.api_base = <span class="string">"https://xget.xi-xu.me/ip/api.openai.com/v1"</span></span><br><span class="line">openai.api_key = <span class="string">"YOUR_API_KEY"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 发送请求</span></span><br><span class="line">response = openai.ChatCompletion.create(</span><br><span class="line">    model=<span class="string">"gpt-4"</span>,</span><br><span class="line">    messages=[{<span class="string">"role"</span>: <span class="string">"user"</span>, <span class="string">"content"</span>: <span class="string">"Hello!"</span>}]</span><br><span class="line">)</span><br></pre></td></tr></tbody></table></figure><p><strong>配置 Anthropic 使用 Xget</strong></p><figure class="highlight python"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> anthropic</span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置使用 Xget</span></span><br><span class="line">client = anthropic.Anthropic(</span><br><span class="line">    api_key=<span class="string">"YOUR_API_KEY"</span>,</span><br><span class="line">    base_url=<span class="string">"https://xget.xi-xu.me/ip/api.anthropic.com"</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 发送请求</span></span><br><span class="line">message = client.messages.create(</span><br><span class="line">    model=<span class="string">"claude-3-opus-20240229"</span>,</span><br><span class="line">    max_tokens=<span class="number">1024</span>,</span><br><span class="line">    messages=[{<span class="string">"role"</span>: <span class="string">"user"</span>, <span class="string">"content"</span>: <span class="string">"Hello!"</span>}]</span><br><span class="line">)</span><br></pre></td></tr></tbody></table></figure><h2 id="下载工具">下载工具</h2><h3 id="wget">wget</h3><p><strong>基本使用</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载文件</span></span><br><span class="line">wget https://xget.xi-xu.me/gh/microsoft/vscode/archive/main.zip</span><br><span class="line"></span><br><span class="line"><span class="comment"># 指定输出文件名</span></span><br><span class="line">wget -O vscode.zip https://xget.xi-xu.me/gh/microsoft/vscode/archive/main.zip</span><br><span class="line"></span><br><span class="line"><span class="comment"># 断点续传</span></span><br><span class="line">wget -c https://xget.xi-xu.me/gh/microsoft/vscode/archive/main.zip</span><br></pre></td></tr></tbody></table></figure><h3 id="cURL">cURL</h3><p><strong>基本使用</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载文件</span></span><br><span class="line">curl -o vscode.zip https://xget.xi-xu.me/gh/microsoft/vscode/archive/main.zip</span><br><span class="line"></span><br><span class="line"><span class="comment"># 显示进度条</span></span><br><span class="line">curl -# -o vscode.zip https://xget.xi-xu.me/gh/microsoft/vscode/archive/main.zip</span><br><span class="line"></span><br><span class="line"><span class="comment"># 断点续传</span></span><br><span class="line">curl -C - -o vscode.zip https://xget.xi-xu.me/gh/microsoft/vscode/archive/main.zip</span><br></pre></td></tr></tbody></table></figure><h3 id="aria2">aria2</h3><p><strong>多线程下载</strong></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 16 线程下载</span></span><br><span class="line">aria2c -x 16 -s 16 https://xget.xi-xu.me/gh/microsoft/vscode/archive/main.zip</span><br><span class="line"></span><br><span class="line"><span class="comment"># 批量下载</span></span><br><span class="line">aria2c -i urls.txt</span><br><span class="line"></span><br><span class="line"><span class="comment"># 断点续传</span></span><br><span class="line">aria2c -c https://xget.xi-xu.me/gh/microsoft/vscode/archive/main.zip</span><br></pre></td></tr></tbody></table></figure><h3 id="IDM-Internet-Download-Manager">IDM (Internet Download Manager)</h3><p><strong>使用方法</strong></p><ol><li>复制加速 URL</li><li>IDM 会自动捕获下载</li><li>或手动添加到 IDM</li></ol><p><strong>配置</strong></p><ul><li>在 IDM 设置中配置最大连接数</li><li>启用分段下载</li><li>配置下载速度限制</li></ul><h2 id="CI-CD-集成">CI/CD 集成</h2><h3 id="GitHub-Actions">GitHub Actions</h3><p><strong>配置示例</strong></p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">Build</span> <span class="string">and</span> <span class="string">Test</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span> [<span class="string">push</span>, <span class="string">pull_request</span>]</span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">build:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line"></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Setup</span> <span class="string">Node.js</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/setup-node@v4</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">node-version:</span> <span class="string">'20'</span></span><br><span class="line">          <span class="attr">registry-url:</span> <span class="string">'https://xget.xi-xu.me/npm'</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Install</span> <span class="string">dependencies</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">npm</span> <span class="string">ci</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Build</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">npm</span> <span class="string">run</span> <span class="string">build</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Test</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">npm</span> <span class="string">test</span></span><br></pre></td></tr></tbody></table></figure><h3 id="GitLab-CI">GitLab CI</h3><p><strong>配置示例</strong></p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">image:</span> <span class="string">node:20</span></span><br><span class="line"></span><br><span class="line"><span class="attr">variables:</span></span><br><span class="line">  <span class="attr">NPM_CONFIG_REGISTRY:</span> <span class="string">"https://xget.xi-xu.me/npm"</span></span><br><span class="line"></span><br><span class="line"><span class="attr">before_script:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">npm</span> <span class="string">ci</span></span><br><span class="line"></span><br><span class="line"><span class="attr">stages:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">build</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">test</span></span><br><span class="line"></span><br><span class="line"><span class="attr">build:</span></span><br><span class="line">  <span class="attr">stage:</span> <span class="string">build</span></span><br><span class="line">  <span class="attr">script:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">npm</span> <span class="string">run</span> <span class="string">build</span></span><br><span class="line"></span><br><span class="line"><span class="attr">test:</span></span><br><span class="line">  <span class="attr">stage:</span> <span class="string">test</span></span><br><span class="line">  <span class="attr">script:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">npm</span> <span class="string">test</span></span><br></pre></td></tr></tbody></table></figure><h2 id="常见问题">常见问题</h2><h3 id="Q1-如何验证-Xget-是否正常工作？">Q1: 如何验证 Xget 是否正常工作？</h3><p>A: 下载一个小文件并检查速度：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">time</span> wget https://xget.xi-xu.me/gh/microsoft/vscode/archive/main.zip</span><br></pre></td></tr></tbody></table></figure><h3 id="Q2-如何切换回原始源？">Q2: 如何切换回原始源？</h3><p>A: 恢复原始配置：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># npm</span></span><br><span class="line">npm config <span class="built_in">set</span> registry https://registry.npmjs.org</span><br><span class="line"></span><br><span class="line"><span class="comment"># pip</span></span><br><span class="line">pip install --index-url https://pypi.org requests</span><br><span class="line"></span><br><span class="line"><span class="comment"># apt</span></span><br><span class="line"><span class="built_in">sudo</span> sed -i <span class="string">'s/xget.xi-xu.me/deb.debian.org/g'</span> /etc/apt/sources.list</span><br></pre></td></tr></tbody></table></figure><h3 id="Q3-Xget-支持哪些协议？">Q3: Xget 支持哪些协议？</h3><p>A: Xget 支持 HTTP/HTTPS、Git、Docker、AI 推理等多种协议。</p><h3 id="Q4-如何提高下载速度？">Q4: 如何提高下载速度？</h3><p>A: 使用多线程下载工具：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">aria2c -x 16 -s 16 URL</span><br></pre></td></tr></tbody></table></figure><h3 id="Q5-Xget-会缓存文件吗？">Q5: Xget 会缓存文件吗？</h3><p>A: 是的，Xget 使用 Cloudflare Cache API 进行边缘缓存，默认缓存时长为 30 分钟。</p><h2 id="总结">总结</h2><p>Xget 为 40+ 开发者常用平台提供了统一的加速服务。通过简单的 URL 转换或配置更改，即可享受极速下载体验。无论是代码托管、包管理、容器镜像还是 AI 模型，Xget 都能提供稳定、高效的加速服务。</p>]]></content>
    
    
    <summary type="html">详细说明Xget在GitHub、GitLab、Docker Hub、PyPI、Hugging Face等主流平台的具体使用方法和URL转换规则。本文提供各平台的加速示例、wget/curl命令模板以及常见问题解决方案，帮助开发者快速上手并充分利用Xget的加速能力</summary>
    
    
    
    <category term="技术文档" scheme="https://www.zeroxin.xin/categories/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/"/>
    
    
    <category term="Xget" scheme="https://www.zeroxin.xin/tags/Xget/"/>
    
    <category term="使用指南" scheme="https://www.zeroxin.xin/tags/%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/"/>
    
    <category term="平台" scheme="https://www.zeroxin.xin/tags/%E5%B9%B3%E5%8F%B0/"/>
    
  </entry>
  
  <entry>
    <title>Xget 系统架构设计</title>
    <link href="https://www.zeroxin.xin/2025/12/27/xget-system-architecture/"/>
    <id>https://www.zeroxin.xin/2025/12/27/xget-system-architecture/</id>
    <published>2025-12-27T07:00:00.000Z</published>
    <updated>2026-06-18T09:19:20.988Z</updated>
    
    <content type="html"><![CDATA[<h1>Xget 系统架构设计</h1><h2 id="概述">概述</h2><p>Xget 采用现代化的边缘计算架构，基于 Cloudflare Workers 构建，实现了高性能、高可用、高安全的开发者资源加速服务。本文档详细介绍了 Xget 的系统架构设计。</p><h2 id="请求处理流程">请求处理流程</h2><h3 id="完整流程图">完整流程图</h3><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">graph TD</span><br><span class="line">    Request[用户请求 / User-Agent] --&gt; Identify{识别平台}</span><br><span class="line">    Identify --&gt;|无效| Error[返回错误]</span><br><span class="line">    Identify --&gt;|有效| Transform[转换路径]</span><br><span class="line"></span><br><span class="line">    Transform --&gt; CheckProtocol{检查协议}</span><br><span class="line"></span><br><span class="line">    CheckProtocol --&gt;|Git| GitHandler[Git 协议适配器]</span><br><span class="line">    CheckProtocol --&gt;|Docker| DockerHandler[Docker 协议适配器]</span><br><span class="line">    CheckProtocol --&gt;|AI| AIHandler[AI 推理适配器]</span><br><span class="line">    CheckProtocol --&gt;|标准| StdHandler[标准适配器]</span><br><span class="line"></span><br><span class="line">    GitHandler --&gt; Upstream[获取上游]</span><br><span class="line">    DockerHandler --&gt; Upstream</span><br><span class="line">    AIHandler --&gt; Upstream</span><br><span class="line"></span><br><span class="line">    StdHandler --&gt; CacheCheck{检查缓存}</span><br><span class="line">    CacheCheck --&gt;|命中| ReturnCache[返回缓存响应]</span><br><span class="line">    CacheCheck --&gt;|未命中| Upstream</span><br><span class="line"></span><br><span class="line">    Upstream --&gt;|成功| ProcessResponse[处理响应]</span><br><span class="line">    Upstream --&gt;|失败| Retry{重试?}</span><br><span class="line"></span><br><span class="line">    Retry --&gt;|是| Wait["等待 (退避)"] --&gt; Upstream</span><br><span class="line">    Retry --&gt;|否| Error</span><br><span class="line"></span><br><span class="line">    ProcessResponse --&gt; Finalize[添加标头并返回]</span><br><span class="line">    Finalize --&gt; Response[响应]</span><br></pre></td></tr></tbody></table></figure><h3 id="流程详解">流程详解</h3><h4 id="1-请求接收与识别">1. 请求接收与识别</h4><p><strong>输入阶段</strong></p><ul><li>接收来自客户端的 HTTP 请求</li><li>解析请求路径，提取平台前缀和资源路径</li><li>验证请求格式和参数</li></ul><p><strong>平台识别</strong></p><ul><li>根据路径前缀识别目标平台（如 <code>gh</code> 代表 GitHub）</li><li>验证平台是否在支持列表中</li><li>无效平台返回 404 错误</li></ul><h4 id="2-路径转换">2. 路径转换</h4><p><strong>转换逻辑</strong></p><ul><li>移除平台前缀</li><li>根据平台规则构建上游 URL</li><li>处理特殊路径和查询参数</li></ul><p><strong>示例</strong></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">输入: /gh/microsoft/vscode/archive/main.zip</span><br><span class="line">转换: https://github.com/microsoft/vscode/archive/main.zip</span><br></pre></td></tr></tbody></table></figure><h4 id="3-协议检测">3. 协议检测</h4><p><strong>协议类型</strong></p><ul><li><strong>Git 协议</strong>：检测 Git 特定端点和 User-Agent</li><li><strong>Docker 协议</strong>：检测容器镜像拉取请求</li><li><strong>AI 推理协议</strong>：检测 AI 模型推理请求</li><li><strong>标准协议</strong>：常规 HTTP 请求</li></ul><h4 id="4-协议适配器处理">4. 协议适配器处理</h4><p><strong>Git 协议适配器</strong></p><ul><li>配置 Git 专用请求头</li><li>处理 Git LFS 大文件传输</li><li>支持 Git 认证信息传递</li></ul><p><strong>Docker 协议适配器</strong></p><ul><li>处理 Docker Hub 认证</li><li>获取容器镜像 Token</li><li>支持多层镜像拉取</li></ul><p><strong>AI 推理适配器</strong></p><ul><li>配置 AI 服务专用请求头</li><li>处理流式响应</li><li>支持 API 密钥传递</li></ul><p><strong>标准适配器</strong></p><ul><li>处理常规 HTTP 请求</li><li>支持断点续传（Range 请求）</li></ul><h4 id="5-缓存检查（标准协议）">5. 缓存检查（标准协议）</h4><p><strong>缓存策略</strong></p><ul><li>检查 Cloudflare Cache API</li><li>验证缓存有效性</li><li>命中缓存直接返回</li></ul><p><strong>缓存规则</strong></p><ul><li>默认缓存时长：1800 秒（30 分钟）</li><li>Git 操作：跳过缓存</li><li>大文件：延长缓存时间</li></ul><h4 id="6-上游请求">6. 上游请求</h4><p><strong>请求构建</strong></p><ul><li>根据转换后的 URL 构建上游请求</li><li>添加必要的请求头</li><li>配置超时和重试参数</li></ul><p><strong>请求发送</strong></p><ul><li>使用 Cloudflare Workers 的 fetch API</li><li>支持 HTTP/3 协议</li><li>自动处理重定向</li></ul><h4 id="7-重试机制">7. 重试机制</h4><p><strong>重试条件</strong></p><ul><li>网络错误</li><li>超时错误</li><li>5xx 服务器错误</li></ul><p><strong>重试策略</strong></p><ul><li>最大重试次数：3 次</li><li>延迟策略：线性退避（1000ms × 重试次数）</li><li>指数退避备选方案</li></ul><h4 id="8-响应处理">8. 响应处理</h4><p><strong>响应头处理</strong></p><ul><li>添加安全标头</li><li>添加性能监控标头</li><li>移除敏感信息</li></ul><p><strong>响应体处理</strong></p><ul><li>支持流式传输</li><li>应用压缩算法</li><li>处理 Range 响应</li></ul><h4 id="9-性能监控">9. 性能监控</h4><p><strong>监控指标</strong></p><ul><li>请求总耗时</li><li>上游请求耗时</li><li>缓存命中率</li><li>错误率</li></ul><p><strong>监控输出</strong></p><ul><li>通过 <code>X-Performance-Metrics</code> 响应头返回</li><li>JSON 格式数据</li><li>包含详细的性能指标</li></ul><h2 id="组件架构">组件架构</h2><h3 id="类图">类图</h3><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line">classDiagram</span><br><span class="line">    class Worker {</span><br><span class="line">        +handleRequest(request)</span><br><span class="line">    }</span><br><span class="line">    class Config {</span><br><span class="line">        +PLATFORMS</span><br><span class="line">        +transformPath()</span><br><span class="line">    }</span><br><span class="line">    class Validation {</span><br><span class="line">        +validateRequest()</span><br><span class="line">        +isDockerRequest()</span><br><span class="line">    }</span><br><span class="line">    class GitProtocol {</span><br><span class="line">        +configureGitHeaders()</span><br><span class="line">        +isGitRequest()</span><br><span class="line">    }</span><br><span class="line">    class DockerProtocol {</span><br><span class="line">        +handleDockerAuth()</span><br><span class="line">        +fetchToken()</span><br><span class="line">    }</span><br><span class="line">    class AIProtocol {</span><br><span class="line">        +configureAIHeaders()</span><br><span class="line">    }</span><br><span class="line">    class Security {</span><br><span class="line">        +addSecurityHeaders()</span><br><span class="line">    }</span><br><span class="line">    class Performance {</span><br><span class="line">        +monitor()</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    Worker --&gt; Config</span><br><span class="line">    Worker --&gt; Validation</span><br><span class="line">    Worker --&gt; GitProtocol</span><br><span class="line">    Worker --&gt; DockerProtocol</span><br><span class="line">    Worker --&gt; AIProtocol</span><br><span class="line">    Worker --&gt; Security</span><br><span class="line">    Worker --&gt; Performance</span><br></pre></td></tr></tbody></table></figure><h3 id="组件详解">组件详解</h3><h4 id="1-Worker（主处理器）">1. Worker（主处理器）</h4><p><strong>职责</strong></p><ul><li>协调所有组件</li><li>管理请求生命周期</li><li>处理错误和异常</li></ul><p><strong>核心方法</strong></p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">async</span> <span class="title function_">handleRequest</span>(<span class="params">request</span>) {</span><br><span class="line">  <span class="comment">// 1. 验证请求</span></span><br><span class="line">  <span class="comment">// 2. 识别平台</span></span><br><span class="line">  <span class="comment">// 3. 转换路径</span></span><br><span class="line">  <span class="comment">// 4. 检测协议</span></span><br><span class="line">  <span class="comment">// 5. 调用适配器</span></span><br><span class="line">  <span class="comment">// 6. 处理响应</span></span><br><span class="line">  <span class="comment">// 7. 返回结果</span></span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h4 id="2-Config（配置管理）">2. Config（配置管理）</h4><p><strong>职责</strong></p><ul><li>存储平台配置</li><li>提供路径转换逻辑</li><li>管理环境变量</li></ul><p><strong>配置结构</strong></p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="variable constant_">PLATFORMS</span> = {</span><br><span class="line">  <span class="attr">gh</span>: {</span><br><span class="line">    <span class="attr">name</span>: <span class="string">'GitHub'</span>,</span><br><span class="line">    <span class="attr">baseUrl</span>: <span class="string">'https://github.com'</span>,</span><br><span class="line">    <span class="attr">supportsGit</span>: <span class="literal">true</span></span><br><span class="line">  },</span><br><span class="line">  <span class="comment">// ... 其他平台</span></span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h4 id="3-Validation（请求验证）">3. Validation（请求验证）</h4><p><strong>职责</strong></p><ul><li>验证请求合法性</li><li>检查请求方法</li><li>验证路径长度</li></ul><p><strong>验证规则</strong></p><ul><li>HTTP 方法白名单</li><li>路径长度限制（最大 2048 字符）</li><li>输入清理和过滤</li></ul><h4 id="4-GitProtocol（Git-协议适配器）">4. GitProtocol（Git 协议适配器）</h4><p><strong>职责</strong></p><ul><li>检测 Git 请求</li><li>配置 Git 请求头</li><li>处理 Git LFS</li></ul><p><strong>关键方法</strong></p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="title function_">isGitRequest</span>(<span class="params">request</span>) {</span><br><span class="line">  <span class="comment">// 检测 Git 特征</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="title function_">configureGitHeaders</span>(<span class="params">request</span>) {</span><br><span class="line">  <span class="comment">// 添加 Git 专用头</span></span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h4 id="5-DockerProtocol（Docker-协议适配器）">5. DockerProtocol（Docker 协议适配器）</h4><p><strong>职责</strong></p><ul><li>处理 Docker Hub 认证</li><li>获取镜像 Token</li><li>支持多层镜像</li></ul><p><strong>认证流程</strong></p><ol><li>检测 Docker 请求</li><li>获取认证 Token</li><li>添加认证头</li><li>转发请求</li></ol><h4 id="6-AIProtocol（AI-推理适配器）">6. AIProtocol（AI 推理适配器）</h4><p><strong>职责</strong></p><ul><li>配置 AI 服务请求头</li><li>处理流式响应</li><li>支持 API 密钥</li></ul><p><strong>支持的 AI 提供商</strong></p><ul><li>OpenAI</li><li>Anthropic</li><li>Google AI</li><li>其他兼容 OpenAI API 的服务</li></ul><h4 id="7-Security（安全组件）">7. Security（安全组件）</h4><p><strong>职责</strong></p><ul><li>添加安全标头</li><li>验证请求合法性</li><li>防止攻击</li></ul><p><strong>安全标头</strong></p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> securityHeaders = {</span><br><span class="line">  <span class="string">'Strict-Transport-Security'</span>: <span class="string">'max-age=31536000'</span>,</span><br><span class="line">  <span class="string">'X-Frame-Options'</span>: <span class="string">'DENY'</span>,</span><br><span class="line">  <span class="string">'X-XSS-Protection'</span>: <span class="string">'1; mode=block'</span>,</span><br><span class="line">  <span class="string">'Content-Security-Policy'</span>: <span class="string">'default-src \'self\''</span>,</span><br><span class="line">  <span class="string">'Referrer-Policy'</span>: <span class="string">'strict-origin-when-cross-origin'</span></span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h4 id="8-Performance（性能监控）">8. Performance（性能监控）</h4><p><strong>职责</strong></p><ul><li>追踪请求耗时</li><li>计算缓存命中率</li><li>生成性能报告</li></ul><p><strong>监控指标</strong></p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">{</span><br><span class="line">  <span class="attr">totalTime</span>: <span class="number">123</span>,        <span class="comment">// 总耗时（毫秒）</span></span><br><span class="line">  <span class="attr">upstreamTime</span>: <span class="number">98</span>,      <span class="comment">// 上游请求耗时</span></span><br><span class="line">  <span class="attr">cacheHit</span>: <span class="literal">true</span>,        <span class="comment">// 缓存是否命中</span></span><br><span class="line">  <span class="attr">retryCount</span>: <span class="number">0</span>,         <span class="comment">// 重试次数</span></span><br><span class="line">  <span class="attr">protocol</span>: <span class="string">'HTTP/3'</span>     <span class="comment">// 使用的协议</span></span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h2 id="数据流架构">数据流架构</h2><h3 id="请求流">请求流</h3><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">客户端请求</span><br><span class="line">    ↓</span><br><span class="line">Cloudflare 边缘节点</span><br><span class="line">    ↓</span><br><span class="line">Worker 请求处理</span><br><span class="line">    ↓</span><br><span class="line">协议适配器</span><br><span class="line">    ↓</span><br><span class="line">缓存检查</span><br><span class="line">    ↓</span><br><span class="line">上游请求（如需要）</span><br><span class="line">    ↓</span><br><span class="line">响应处理</span><br><span class="line">    ↓</span><br><span class="line">安全标头添加</span><br><span class="line">    ↓</span><br><span class="line">性能监控记录</span><br><span class="line">    ↓</span><br><span class="line">返回客户端</span><br></pre></td></tr></tbody></table></figure><h3 id="缓存流">缓存流</h3><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">请求到达</span><br><span class="line">    ↓</span><br><span class="line">检查 Cloudflare Cache</span><br><span class="line">    ↓</span><br><span class="line">缓存命中？</span><br><span class="line">    ├─ 是 → 返回缓存</span><br><span class="line">    └─ 否 → 请求上游</span><br><span class="line">              ↓</span><br><span class="line">          获取响应</span><br><span class="line">              ↓</span><br><span class="line">          存入缓存</span><br><span class="line">              ↓</span><br><span class="line">          返回响应</span><br></pre></td></tr></tbody></table></figure><h2 id="性能优化策略">性能优化策略</h2><h3 id="1-边缘计算">1. 边缘计算</h3><p><strong>优势</strong></p><ul><li>请求在最近的边缘节点处理</li><li>减少网络延迟</li><li>提高响应速度</li></ul><p><strong>实现</strong></p><ul><li>Cloudflare Workers 部署</li><li>全球 330+ 边缘节点</li><li>自动路由优化</li></ul><h3 id="2-协议优化">2. 协议优化</h3><p><strong>HTTP/3</strong></p><ul><li>基于 QUIC 协议</li><li>减少连接建立时间</li><li>提高传输效率</li></ul><p><strong>HTTP/2</strong></p><ul><li>多路复用</li><li>头部压缩</li><li>服务器推送</li></ul><h3 id="3-缓存策略">3. 缓存策略</h3><p><strong>多层缓存</strong></p><ul><li>Cloudflare 边缘缓存</li><li>浏览器缓存</li><li>CDN 缓存</li></ul><p><strong>缓存规则</strong></p><ul><li>静态资源：长期缓存</li><li>API 响应：短期缓存</li><li>Git 操作：不缓存</li></ul><h3 id="4-压缩算法">4. 压缩算法</h3><p><strong>支持的压缩</strong></p><ul><li>gzip</li><li>deflate</li><li>brotli</li></ul><p><strong>压缩策略</strong></p><ul><li>根据客户端 Accept 头选择</li><li>自动选择最优压缩算法</li><li>压缩级别可配置</li></ul><h2 id="可靠性设计">可靠性设计</h2><h3 id="1-故障恢复">1. 故障恢复</h3><p><strong>重试机制</strong></p><ul><li>自动重试失败请求</li><li>指数退避策略</li><li>最大重试次数限制</li></ul><p><strong>降级策略</strong></p><ul><li>缓存降级</li><li>超时降级</li><li>错误降级</li></ul><h3 id="2-监控告警">2. 监控告警</h3><p><strong>性能监控</strong></p><ul><li>实时性能指标</li><li>错误率监控</li><li>缓存命中率统计</li></ul><p><strong>告警机制</strong></p><ul><li>错误率阈值告警</li><li>响应时间告警</li><li>可用性告警</li></ul><h3 id="3-容量规划">3. 容量规划</h3><p><strong>自动扩容</strong></p><ul><li>Cloudflare 自动扩容</li><li>无需手动配置</li><li>按需分配资源</li></ul><p><strong>负载均衡</strong></p><ul><li>全局负载均衡</li><li>智能路由</li><li>故障转移</li></ul><h2 id="安全架构">安全架构</h2><h3 id="1-网络安全">1. 网络安全</h3><p><strong>HTTPS 强制</strong></p><ul><li>所有请求强制 HTTPS</li><li>HSTS 启用</li><li>证书自动更新</li></ul><p><strong>DDoS 防护</strong></p><ul><li>Cloudflare DDoS 防护</li><li>流量清洗</li><li>攻击识别</li></ul><h3 id="2-应用安全">2. 应用安全</h3><p><strong>输入验证</strong></p><ul><li>严格的输入验证</li><li>路径遍历防护</li><li>注入攻击防护</li></ul><p><strong>请求限制</strong></p><ul><li>速率限制</li><li>IP 白名单</li><li>请求大小限制</li></ul><h3 id="3-数据安全">3. 数据安全</h3><p><strong>敏感信息保护</strong></p><ul><li>不记录敏感数据</li><li>API 密钥加密存储</li><li>日志脱敏</li></ul><p><strong>访问控制</strong></p><ul><li>基于角色的访问控制</li><li>API 密钥认证</li><li>IP 限制</li></ul><h2 id="扩展性设计">扩展性设计</h2><h3 id="1-平台扩展">1. 平台扩展</h3><p><strong>添加新平台</strong></p><ul><li>在 Config 中添加平台配置</li><li>实现平台特定的转换逻辑</li><li>测试平台集成</li></ul><p><strong>示例</strong></p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="variable constant_">PLATFORMS</span> = {</span><br><span class="line">  <span class="comment">// ... 现有平台</span></span><br><span class="line">  <span class="attr">newplatform</span>: {</span><br><span class="line">    <span class="attr">name</span>: <span class="string">'New Platform'</span>,</span><br><span class="line">    <span class="attr">baseUrl</span>: <span class="string">'https://newplatform.com'</span>,</span><br><span class="line">    <span class="attr">supportsGit</span>: <span class="literal">false</span></span><br><span class="line">  }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h3 id="2-协议扩展">2. 协议扩展</h3><p><strong>添加新协议</strong></p><ul><li>创建新的协议适配器</li><li>实现协议特定的逻辑</li><li>在 Worker 中注册适配器</li></ul><p><strong>适配器接口</strong></p><figure class="highlight javascript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">NewProtocol</span> {</span><br><span class="line">  <span class="title function_">isRequest</span>(<span class="params">request</span>) { }</span><br><span class="line">  <span class="title function_">configureHeaders</span>(<span class="params">request</span>) { }</span><br><span class="line">  <span class="title function_">handleResponse</span>(<span class="params">response</span>) { }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h3 id="3-功能扩展">3. 功能扩展</h3><p><strong>插件系统</strong></p><ul><li>支持自定义插件</li><li>插件生命周期管理</li><li>插件间通信</li></ul><p><strong>中间件</strong></p><ul><li>请求中间件</li><li>响应中间件</li><li>错误处理中间件</li></ul><h2 id="总结">总结</h2><p>Xget 的系统架构设计体现了现代云原生应用的最佳实践：</p><ol><li><strong>边缘优先</strong>：利用 Cloudflare 边缘网络实现低延迟</li><li><strong>协议适配</strong>：支持多种协议的统一处理</li><li><strong>性能优化</strong>：多层缓存、智能压缩、HTTP/3</li><li><strong>安全可靠</strong>：多层安全防护、自动重试、监控告警</li><li><strong>易于扩展</strong>：模块化设计、插件系统、配置驱动</li></ol><p>这种架构设计使 Xget 能够提供高性能、高可用、高安全的开发者资源加速服务。</p>]]></content>
    
    
    <summary type="html">深入剖析Xget基于Cloudflare Workers的边缘计算系统架构，从请求识别、协议适配、缓存检查到上游获取的完整处理流程。本文展示其多协议适配器设计、Mermaid架构图解以及高可用高并发的系统设计理念，揭示现代边缘计算架构的精妙之处</summary>
    
    
    
    <category term="技术文档" scheme="https://www.zeroxin.xin/categories/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/"/>
    
    
    <category term="Xget" scheme="https://www.zeroxin.xin/tags/Xget/"/>
    
    <category term="架构设计" scheme="https://www.zeroxin.xin/tags/%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1/"/>
    
    <category term="系统设计" scheme="https://www.zeroxin.xin/tags/%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1/"/>
    
  </entry>
  
  <entry>
    <title>Xget URL 转换规则详解</title>
    <link href="https://www.zeroxin.xin/2025/12/27/xget-url-conversion-rules/"/>
    <id>https://www.zeroxin.xin/2025/12/27/xget-url-conversion-rules/</id>
    <published>2025-12-27T07:00:00.000Z</published>
    <updated>2026-06-18T09:21:44.220Z</updated>
    
    <content type="html"><![CDATA[<h1>Xget URL 转换规则详解</h1><h2 id="概述">概述</h2><p>Xget 使用简单直观的 URL 转换规则，只需替换域名并添加平台前缀即可实现加速。本文档详细介绍了所有支持平台的 URL 转换规则。</p><h2 id="基本转换格式">基本转换格式</h2><h3 id="转换公式">转换公式</h3><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始 URL: https://platform.com/path/to/resource</span><br><span class="line">加速 URL: https://xget.xi-xu.me/{platform-prefix}/path/to/resource</span><br></pre></td></tr></tbody></table></figure><h3 id="转换步骤">转换步骤</h3><ol><li><strong>识别平台</strong>：确定原始 URL 所属平台</li><li><strong>查找前缀</strong>：找到对应的平台前缀</li><li><strong>替换域名</strong>：将原始域名替换为 Xget 域名</li><li><strong>添加前缀</strong>：在路径前添加平台前缀</li></ol><h2 id="平台前缀对照表">平台前缀对照表</h2><table><thead><tr><th>平台</th><th>平台前缀</th><th>原始域名</th><th>支持类型</th></tr></thead><tbody><tr><td>GitHub</td><td><code>gh</code></td><td><code>github.com</code></td><td>代码、Git</td></tr><tr><td>GitHub Gist</td><td><code>gist</code></td><td><code>gist.github.com</code></td><td>代码片段</td></tr><tr><td>GitLab</td><td><code>gl</code></td><td><code>gitlab.com</code></td><td>代码、Git</td></tr><tr><td>Gitea</td><td><code>gitea</code></td><td><code>gitea.com</code></td><td>代码、Git</td></tr><tr><td>Codeberg</td><td><code>codeberg</code></td><td><code>codeberg.org</code></td><td>代码、Git</td></tr><tr><td>SourceForge</td><td><code>sf</code></td><td><code>sourceforge.net</code></td><td>软件</td></tr><tr><td>AOSP</td><td><code>aosp</code></td><td><code>android.googlesource.com</code></td><td>代码、Git</td></tr><tr><td>Hugging Face</td><td><code>hf</code></td><td><code>huggingface.co</code></td><td>模型、数据集</td></tr><tr><td>Civitai</td><td><code>civitai</code></td><td><code>civitai.com</code></td><td>AI 模型</td></tr><tr><td>npm</td><td><code>npm</code></td><td><code>registry.npmjs.org</code></td><td>包管理</td></tr><tr><td>PyPI</td><td><code>pypi</code></td><td><code>pypi.org</code></td><td>包管理</td></tr><tr><td>conda</td><td><code>conda</code></td><td><code>repo.anaconda.com</code></td><td>包管理</td></tr><tr><td>Maven</td><td><code>maven</code></td><td><code>repo1.maven.org</code></td><td>包管理</td></tr><tr><td>Apache</td><td><code>apache</code></td><td><code>downloads.apache.org</code></td><td>软件</td></tr><tr><td>Gradle</td><td><code>gradle</code></td><td><code>plugins.gradle.org</code></td><td>包管理</td></tr><tr><td>Homebrew</td><td><code>homebrew</code></td><td><code>github.com/Homebrew</code></td><td>包管理</td></tr><tr><td>RubyGems</td><td><code>rubygems</code></td><td><code>rubygems.org</code></td><td>包管理</td></tr><tr><td>CRAN</td><td><code>cran</code></td><td><code>cran.r-project.org</code></td><td>包管理</td></tr><tr><td>CPAN</td><td><code>cpan</code></td><td><code>www.cpan.org</code></td><td>包管理</td></tr><tr><td>CTAN</td><td><code>ctan</code></td><td><code>tug.ctan.org</code></td><td>包管理</td></tr><tr><td>Go 模块</td><td><code>golang</code></td><td><code>proxy.golang.org</code></td><td>包管理</td></tr><tr><td>NuGet</td><td><code>nuget</code></td><td><code>api.nuget.org</code></td><td>包管理</td></tr><tr><td>Rust Crates</td><td><code>crates</code></td><td><code>crates.io</code></td><td>包管理</td></tr><tr><td>Packagist</td><td><code>packagist</code></td><td><code>repo.packagist.org</code></td><td>包管理</td></tr><tr><td>Debian</td><td><code>debian</code></td><td><code>deb.debian.org</code></td><td>系统包</td></tr><tr><td>Ubuntu</td><td><code>ubuntu</code></td><td><code>archive.ubuntu.com</code></td><td>系统包</td></tr><tr><td>Fedora</td><td><code>fedora</code></td><td><code>dl.fedoraproject.org</code></td><td>系统包</td></tr><tr><td>Rocky Linux</td><td><code>rocky</code></td><td><code>download.rockylinux.org</code></td><td>系统包</td></tr><tr><td>openSUSE</td><td><code>opensuse</code></td><td><code>download.opensuse.org</code></td><td>系统包</td></tr><tr><td>Arch Linux</td><td><code>arch</code></td><td><code>geo.mirror.pkgbuild.com</code></td><td>系统包</td></tr><tr><td>arXiv</td><td><code>arxiv</code></td><td><code>arxiv.org</code></td><td>论文</td></tr><tr><td>F-Droid</td><td><code>fdroid</code></td><td><code>f-droid.org</code></td><td>应用</td></tr><tr><td>Jenkins 插件</td><td><code>jenkins</code></td><td><code>updates.jenkins.io</code></td><td>插件</td></tr><tr><td>容器注册表</td><td><code>cr</code></td><td>多个</td><td>容器镜像</td></tr><tr><td>AI 推理提供商</td><td><code>ip</code></td><td>多个</td><td>AI 推理</td></tr></tbody></table><h2 id="各平台转换详解">各平台转换详解</h2><h3 id="代码托管平台">代码托管平台</h3><h4 id="GitHub">GitHub</h4><p><strong>平台前缀</strong>：<code>gh</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://github.com/{owner}/{repo}/path/to/file</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/gh/{owner}/{repo}/path/to/file</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><ol><li><p><strong>下载压缩包</strong></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://github.com/microsoft/vscode/archive/refs/heads/main.zip</span><br><span class="line">加速: https://xget.xi-xu.me/gh/microsoft/vscode/archive/refs/heads/main.zip</span><br></pre></td></tr></tbody></table></figure></li><li><p><strong>下载 Release 文件</strong></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://github.com/nodejs/node/releases/download/v20.10.0/node-v20.10.0-x64.msi</span><br><span class="line">加速: https://xget.xi-xu.me/gh/nodejs/node/releases/download/v20.10.0/node-v20.10.0-x64.msi</span><br></pre></td></tr></tbody></table></figure></li><li><p><strong>Git Clone</strong></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://github.com/microsoft/vscode.git</span><br><span class="line">加速: https://xget.xi-xu.me/gh/microsoft/vscode.git</span><br></pre></td></tr></tbody></table></figure></li></ol><p><strong>特殊说明</strong>：</p><ul><li>支持 Git 协议完整操作（clone、push、pull、fetch）</li><li>支持 Git LFS 大文件传输</li><li>自动识别 Git 端点并配置专用请求头</li></ul><h4 id="GitHub-Gist">GitHub Gist</h4><p><strong>平台前缀</strong>：<code>gist</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://gist.github.com/{username}/{gist-id}/path/to/file</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/gist/{username}/{gist-id}/path/to/file</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://gist.github.com/xixu-me/e2ea9db6b1f143892495f796fef18631/raw/3b8807172ee492d0da3a7e370b0fb88fc97b53e6/Free-ChatGPT-Paid-Plan.md</span><br><span class="line">加速: https://xget.xi-xu.me/gist/xixu-me/e2ea9db6b1f143892495f796fef18631/raw/3b8807172ee492d0da3a7e370b0fb88fc97b53e6/Free-ChatGPT-Paid-Plan.md</span><br></pre></td></tr></tbody></table></figure><h4 id="GitLab">GitLab</h4><p><strong>平台前缀</strong>：<code>gl</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://gitlab.com/{owner}/{repo}/path/to/file</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/gl/{owner}/{repo}/path/to/file</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://gitlab.com/gitlab-org/gitlab/-/archive/master/gitlab-master.zip</span><br><span class="line">加速: https://xget.xi-xu.me/gl/gitlab-org/gitlab/-/archive/master/gitlab-master.zip</span><br></pre></td></tr></tbody></table></figure><p><strong>特殊说明</strong>：</p><ul><li>GitLab 使用 <code>/-/</code> 分隔符，保持原样</li><li>支持 Git 协议完整操作</li></ul><h4 id="Gitea">Gitea</h4><p><strong>平台前缀</strong>：<code>gitea</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://gitea.com/{owner}/{repo}/path/to/file</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/gitea/{owner}/{repo}/path/to/file</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://gitea.com/gitea/gitea/archive/master.zip</span><br><span class="line">加速: https://xget.xi-xu.me/gitea/gitea/gitea/archive/master.zip</span><br></pre></td></tr></tbody></table></figure><h4 id="Codeberg">Codeberg</h4><p><strong>平台前缀</strong>：<code>codeberg</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://codeberg.org/{owner}/{repo}/path/to/file</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/codeberg/{owner}/{repo}/path/to/file</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://codeberg.org/forgejo/forgejo/archive/forgejo.zip</span><br><span class="line">加速: https://xget.xi-xu.me/codeberg/forgejo/forgejo/archive/forgejo.zip</span><br></pre></td></tr></tbody></table></figure><h4 id="SourceForge">SourceForge</h4><p><strong>平台前缀</strong>：<code>sf</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://sourceforge.net/projects/{project}/files/{path}/download</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/sf/projects/{project}/files/{path}/download</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://sourceforge.net/projects/sevenzip/files/7-Zip/23.01/7z2301-x64.exe/download</span><br><span class="line">加速: https://xget.xi-xu.me/sf/projects/sevenzip/files/7-Zip/23.01/7z2301-x64.exe/download</span><br></pre></td></tr></tbody></table></figure><h4 id="AOSP-Android-开源项目">AOSP (Android 开源项目)</h4><p><strong>平台前缀</strong>：<code>aosp</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://android.googlesource.com/{path}</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/aosp/{path}</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><ol><li><p><strong>AOSP 项目</strong></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://android.googlesource.com/platform/frameworks/base</span><br><span class="line">加速: https://xget.xi-xu.me/aosp/platform/frameworks/base</span><br></pre></td></tr></tbody></table></figure></li><li><p><strong>AOSP 设备树</strong></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://android.googlesource.com/device/google/pixel</span><br><span class="line">加速: https://xget.xi-xu.me/aosp/device/google/pixel</span><br></pre></td></tr></tbody></table></figure></li></ol><h3 id="AI-ML-平台">AI/ML 平台</h3><h4 id="Hugging-Face">Hugging Face</h4><p><strong>平台前缀</strong>：<code>hf</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://huggingface.co/{type}/{owner}/{model}/resolve/main/{file}</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/hf/{type}/{owner}/{model}/resolve/main/{file}</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><ol><li><p><strong>模型文件</strong></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://huggingface.co/microsoft/DialoGPT-medium/resolve/main/pytorch_model.bin</span><br><span class="line">加速: https://xget.xi-xu.me/hf/microsoft/DialoGPT-medium/resolve/main/pytorch_model.bin</span><br></pre></td></tr></tbody></table></figure></li><li><p><strong>数据集文件</strong></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://huggingface.co/datasets/rajpurkar/squad/resolve/main/plain_text/train-00000-of-00001.parquet</span><br><span class="line">加速: https://xget.xi-xu.me/hf/datasets/rajpurkar/squad/resolve/main/plain_text/train-00000-of-00001.parquet</span><br></pre></td></tr></tbody></table></figure></li></ol><p><strong>特殊说明</strong>：</p><ul><li>支持 <code>models</code> 和 <code>datasets</code> 两种类型</li><li>支持大文件分片下载</li><li>自动处理 Hugging Face 的认证</li></ul><h4 id="Civitai">Civitai</h4><p><strong>平台前缀</strong>：<code>civitai</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://civitai.com/api/{version}/{endpoint}</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/civitai/api/{version}/{endpoint}</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><ol><li><p><strong>模型下载</strong></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://civitai.com/api/download/models/128713</span><br><span class="line">加速: https://xget.xi-xu.me/civitai/api/download/models/128713</span><br></pre></td></tr></tbody></table></figure></li><li><p><strong>模型 API</strong></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://civitai.com/api/v1/models/7240</span><br><span class="line">加速: https://xget.xi-xu.me/civitai/api/v1/models/7240</span><br></pre></td></tr></tbody></table></figure></li><li><p><strong>模型版本 API</strong></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://civitai.com/api/v1/model-versions/128713</span><br><span class="line">加速: https://xget.xi-xu.me/civitai/api/v1/model-versions/128713</span><br></pre></td></tr></tbody></table></figure></li></ol><h3 id="包管理平台">包管理平台</h3><h4 id="npm">npm</h4><p><strong>平台前缀</strong>：<code>npm</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://registry.npmjs.org/{package}/-/{package}-{version}.tgz</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/npm/{package}/-/{package}-{version}.tgz</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><ol><li><p><strong>包文件</strong></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://registry.npmjs.org/react/-/react-18.2.0.tgz</span><br><span class="line">加速: https://xget.xi-xu.me/npm/react/-/react-18.2.0.tgz</span><br></pre></td></tr></tbody></table></figure></li><li><p><strong>包元数据</strong></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://registry.npmjs.org/lodash</span><br><span class="line">加速: https://xget.xi-xu.me/npm/lodash</span><br></pre></td></tr></tbody></table></figure></li></ol><h4 id="PyPI">PyPI</h4><p><strong>平台前缀</strong>：<code>pypi</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://pypi.org/packages/{type}/{package[0]}/{package}/{package}-{version}.{ext}</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/pypi/packages/{type}/{package[0]}/{package}/{package}-{version}.{ext}</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><ol><li><p><strong>源码包</strong></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://pypi.org/packages/source/r/requests/requests-2.31.0.tar.gz</span><br><span class="line">加速: https://xget.xi-xu.me/pypi/packages/source/r/requests/requests-2.31.0.tar.gz</span><br></pre></td></tr></tbody></table></figure></li><li><p><strong>Wheel 文件</strong></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://pypi.org/packages/py3/n/numpy/numpy-1.26.2-cp312-cp312-win_amd64.whl</span><br><span class="line">加速: https://xget.xi-xu.me/pypi/packages/py3/n/numpy/numpy-1.26.2-cp312-cp312-win_amd64.whl</span><br></pre></td></tr></tbody></table></figure></li></ol><h4 id="conda">conda</h4><p><strong>平台前缀</strong>：<code>conda</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">https://repo.anaconda.com/pkgs/{channel}/{package}</span><br><span class="line">https://conda.anaconda.org/{channel}/{package}</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/conda/pkgs/{channel}/{package}</span><br><span class="line">https://xget.xi-xu.me/conda/community/{channel}/{package}</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><ol><li><p><strong>主仓库</strong></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://repo.anaconda.com/pkgs/main/win-64/python-3.11.0-h955f1ad_0.conda</span><br><span class="line">加速: https://xget.xi-xu.me/conda/pkgs/main/win-64/python-3.11.0-h955f1ad_0.conda</span><br></pre></td></tr></tbody></table></figure></li><li><p><strong>社区仓库</strong></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://conda.anaconda.org/conda-forge/win-64/pytorch-2.1.0-py311_cuda121_cudnn8_0.tar.bz2</span><br><span class="line">加速: https://xget.xi-xu.me/conda/community/conda-forge/win-64/pytorch-2.1.0-py311_cuda121_cudnn8_0.tar.bz2</span><br></pre></td></tr></tbody></table></figure></li></ol><h4 id="Maven">Maven</h4><p><strong>平台前缀</strong>：<code>maven</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://repo1.maven.org/maven2/{group}/{artifact}/{version}/{artifact}-{version}.{ext}</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/maven2/{group}/{artifact}/{version}/{artifact}-{version}.{ext}</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://repo1.maven.org/maven2/org/springframework/spring-core/6.1.1/spring-core-6.1.1.jar</span><br><span class="line">加速: https://xget.xi-xu.me/maven2/org/springframework/spring-core/6.1.1/spring-core-6.1.1.jar</span><br></pre></td></tr></tbody></table></figure><h4 id="Gradle">Gradle</h4><p><strong>平台前缀</strong>：<code>gradle</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://plugins.gradle.org/m2/{group}/{artifact}/{version}/{artifact}-{version}.{ext}</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/gradle/m2/{group}/{artifact}/{version}/{artifact}-{version}.{ext}</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://plugins.gradle.org/m2/com/github/ben-manes/gradle-caches-plugin/0.9.0/gradle-caches-plugin-0.9.0.pom</span><br><span class="line">加速: https://xget.xi-xu.me/gradle/m2/com/github/ben-manes/gradle-caches-plugin/0.9.0/gradle-caches-plugin-0.9.0.pom</span><br></pre></td></tr></tbody></table></figure><h4 id="Homebrew">Homebrew</h4><p><strong>平台前缀</strong>：<code>homebrew</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://github.com/Homebrew/{repo}/archive/refs/tags/{tag}.tar.gz</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/homebrew/{repo}/archive/refs/tags/{tag}.tar.gz</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://github.com/Homebrew/brew/archive/refs/tags/4.2.0.tar.gz</span><br><span class="line">加速: https://xget.xi-xu.me/homebrew/brew/archive/refs/tags/4.2.0.tar.gz</span><br></pre></td></tr></tbody></table></figure><h4 id="RubyGems">RubyGems</h4><p><strong>平台前缀</strong>：<code>rubygems</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://rubygems.org/gems/{gem}-{version}.gem</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/rubygems/gems/{gem}-{version}.gem</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://rubygems.org/gems/rails-7.1.2.gem</span><br><span class="line">加速: https://xget.xi-xu.me/rubygems/gems/rails-7.1.2.gem</span><br></pre></td></tr></tbody></table></figure><h4 id="CRAN-®">CRAN ®</h4><p><strong>平台前缀</strong>：<code>cran</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://cran.r-project.org/src/contrib/{package}_{version}.tar.gz</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/cran/src/contrib/{package}_{version}.tar.gz</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://cran.r-project.org/src/contrib/ggplot2_3.4.4.tar.gz</span><br><span class="line">加速: https://xget.xi-xu.me/cran/src/contrib/ggplot2_3.4.4.tar.gz</span><br></pre></td></tr></tbody></table></figure><h4 id="CPAN-Perl">CPAN (Perl)</h4><p><strong>平台前缀</strong>：<code>cpan</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://www.cpan.org/authors/id/{author}/{package}-{version}.tar.gz</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/cpan/authors/id/{author}/{package}-{version}.tar.gz</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://www.cpan.org/authors/id/M/MI/MIYAGAWA/Plack-1.050.tar.gz</span><br><span class="line">加速: https://xget.xi-xu.me/cpan/authors/id/M/MI/MIYAGAWA/Plack-1.050.tar.gz</span><br></pre></td></tr></tbody></table></figure><h4 id="CTAN-TeX-LaTeX">CTAN (TeX/LaTeX)</h4><p><strong>平台前缀</strong>：<code>ctan</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://tug.ctan.org/tex-archive/{path}</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/ctan/tex-archive/{path}</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://tug.ctan.org/tex-archive/macros/latex/contrib/beamer.zip</span><br><span class="line">加速: https://xget.xi-xu.me/ctan/tex-archive/macros/latex/contrib/beamer.zip</span><br></pre></td></tr></tbody></table></figure><h4 id="Go-模块">Go 模块</h4><p><strong>平台前缀</strong>：<code>golang</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://proxy.golang.org/{module}/@v/{version}.zip</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/golang/{module}/@v/{version}.zip</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://proxy.golang.org/github.com/golang/go/@v/v1.21.5.zip</span><br><span class="line">加速: https://xget.xi-xu.me/golang/github.com/golang/go/@v/v1.21.5.zip</span><br></pre></td></tr></tbody></table></figure><h4 id="NuGet-NET">NuGet (.NET)</h4><p><strong>平台前缀</strong>：<code>nuget</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://api.nuget.org/v3-flatcontainer/{package}/{version}/{package}.{version}.nupkg</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/nuget/v3-flatcontainer/{package}/{version}/{package}.{version}.nupkg</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://api.nuget.org/v3-flatcontainer/newtonsoft.json/13.0.3/newtonsoft.json.13.0.3.nupkg</span><br><span class="line">加速: https://xget.xi-xu.me/nuget/v3-flatcontainer/newtonsoft.json/13.0.3/newtonsoft.json.13.0.3.nupkg</span><br></pre></td></tr></tbody></table></figure><h4 id="Rust-Crates">Rust Crates</h4><p><strong>平台前缀</strong>：<code>crates</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://crates.io/api/v1/crates/{crate}/{version}/download</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/crates/api/v1/crates/{crate}/{version}/download</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://crates.io/api/v1/crates/serde/1.0.195/download</span><br><span class="line">加速: https://xget.xi-xu.me/crates/api/v1/crates/serde/1.0.195/download</span><br></pre></td></tr></tbody></table></figure><h4 id="Packagist-PHP">Packagist (PHP)</h4><p><strong>平台前缀</strong>：<code>packagist</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://repo.packagist.org/p/{vendor}/{package}.json</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/packagist/p/{vendor}/{package}.json</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://repo.packagist.org/p/laravel/framework.json</span><br><span class="line">加速: https://xget.xi-xu.me/packagist/p/laravel/framework.json</span><br></pre></td></tr></tbody></table></figure><h3 id="系统包管理平台">系统包管理平台</h3><h4 id="Debian">Debian</h4><p><strong>平台前缀</strong>：<code>debian</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://deb.debian.org/debian/{pool}/{path}</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/debian/{pool}/{path}</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://deb.debian.org/debian/pool/main/n/nginx/nginx_1.25.3-1_amd64.deb</span><br><span class="line">加速: https://xget.xi-xu.me/debian/pool/main/n/nginx/nginx_1.25.3-1_amd64.deb</span><br></pre></td></tr></tbody></table></figure><h4 id="Ubuntu">Ubuntu</h4><p><strong>平台前缀</strong>：<code>ubuntu</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://archive.ubuntu.com/ubuntu/{pool}/{path}</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/ubuntu/{pool}/{path}</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://archive.ubuntu.com/ubuntu/pool/main/c/curl/curl_8.4.0-2ubuntu1_amd64.deb</span><br><span class="line">加速: https://xget.xi-xu.me/ubuntu/pool/main/c/curl/curl_8.4.0-2ubuntu1_amd64.deb</span><br></pre></td></tr></tbody></table></figure><h4 id="Fedora">Fedora</h4><p><strong>平台前缀</strong>：<code>fedora</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://dl.fedoraproject.org/pub/fedora/linux/releases/{version}/Everything/{arch}/os/Packages/{path}</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/fedora/linux/releases/{version}/Everything/{arch}/os/Packages/{path}</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://dl.fedoraproject.org/pub/fedora/linux/releases/39/Everything/x86_64/os/Packages/n/nginx-1.25.3-1.fc39.x86_64.rpm</span><br><span class="line">加速: https://xget.xi-xu.me/fedora/linux/releases/39/Everything/x86_64/os/Packages/n/nginx-1.25.3-1.fc39.x86_64.rpm</span><br></pre></td></tr></tbody></table></figure><h4 id="Rocky-Linux">Rocky Linux</h4><p><strong>平台前缀</strong>：<code>rocky</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://download.rockylinux.org/pub/rocky/{version}/BaseOS/{arch}/os/Packages/{path}</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/rocky/{version}/BaseOS/{arch}/os/Packages/{path}</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://download.rockylinux.org/pub/rocky/9/BaseOS/x86_64/os/Packages/n/nginx-1.20.1-14.el9_2.1.x86_64.rpm</span><br><span class="line">加速: https://xget.xi-xu.me/rocky/9/BaseOS/x86_64/os/Packages/n/nginx-1.20.1-14.el9_2.1.x86_64.rpm</span><br></pre></td></tr></tbody></table></figure><h4 id="openSUSE">openSUSE</h4><p><strong>平台前缀</strong>：<code>opensuse</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://download.opensuse.org/{distribution}/repo/{repo}/{arch}/{package}.rpm</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/opensuse/{distribution}/repo/{repo}/{arch}/{package}.rpm</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://download.opensuse.org/tumbleweed/repo/oss/x86_64/nginx-1.25.3-1.1.x86_64.rpm</span><br><span class="line">加速: https://xget.xi-xu.me/opensuse/tumbleweed/repo/oss/x86_64/nginx-1.25.3-1.1.x86_64.rpm</span><br></pre></td></tr></tbody></table></figure><h4 id="Arch-Linux">Arch Linux</h4><p><strong>平台前缀</strong>：<code>arch</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://geo.mirror.pkgbuild.com/{repo}/os/{arch}/{package}.pkg.tar.zst</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/arch/{repo}/os/{arch}/{package}.pkg.tar.zst</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://geo.mirror.pkgbuild.com/core/os/x86_64/nginx-1.25.3-1-x86_64.pkg.tar.zst</span><br><span class="line">加速: https://xget.xi-xu.me/arch/core/os/x86_64/nginx-1.25.3-1-x86_64.pkg.tar.zst</span><br></pre></td></tr></tbody></table></figure><h3 id="其他平台">其他平台</h3><h4 id="arXiv">arXiv</h4><p><strong>平台前缀</strong>：<code>arxiv</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://arxiv.org/pdf/{paper-id}.pdf</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/arxiv/pdf/{paper-id}.pdf</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://arxiv.org/pdf/2312.12345.pdf</span><br><span class="line">加速: https://xget.xi-xu.me/arxiv/pdf/2312.12345.pdf</span><br></pre></td></tr></tbody></table></figure><h4 id="F-Droid">F-Droid</h4><p><strong>平台前缀</strong>：<code>fdroid</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://f-droid.org/repo/{path}</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/fdroid/repo/{path}</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://f-droid.org/repo/com.example.app_100.apk</span><br><span class="line">加速: https://xget.xi-xu.me/fdroid/repo/com.example.app_100.apk</span><br></pre></td></tr></tbody></table></figure><h4 id="Jenkins-插件">Jenkins 插件</h4><p><strong>平台前缀</strong>：<code>jenkins</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://updates.jenkins.io/latest/{plugin}.hpi</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/jenkins/latest/{plugin}.hpi</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://updates.jenkins.io/latest/git.hpi</span><br><span class="line">加速: https://xget.xi-xu.me/jenkins/latest/git.hpi</span><br></pre></td></tr></tbody></table></figure><h4 id="Apache-软件下载">Apache 软件下载</h4><p><strong>平台前缀</strong>：<code>apache</code></p><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://downloads.apache.org/{project}/{file}</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/apache/{project}/{file}</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://downloads.apache.org/tomcat/tomcat-10/v10.1.15/bin/apache-tomcat-10.1.15.tar.gz</span><br><span class="line">加速: https://xget.xi-xu.me/apache/tomcat/tomcat-10/v10.1.15/bin/apache-tomcat-10.1.15.tar.gz</span><br></pre></td></tr></tbody></table></figure><h3 id="容器注册表">容器注册表</h3><p><strong>平台前缀</strong>：<code>cr</code></p><p><strong>支持的注册表</strong>：</p><ul><li>Docker Hub (<code>docker.io</code>)</li><li>GitHub Container Registry (<code>ghcr.io</code>)</li><li>Google Container Registry (<code>gcr.io</code>)</li><li>Azure Container Registry (<code>azurecr.io</code>)</li><li>AWS Elastic Container Registry (<code>public.ecr.aws</code>)</li><li><a href="http://Quay.io">Quay.io</a> (<code>quay.io</code>)</li></ul><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://{registry}/v2/{image}/manifests/{tag}</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/cr/{registry}/{image}/manifests/{tag}</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><ol><li><p><strong>Docker Hub</strong></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://registry-1.docker.io/v2/library/nginx/manifests/latest</span><br><span class="line">加速: https://xget.xi-xu.me/cr/registry-1.docker.io/library/nginx/manifests/latest</span><br></pre></td></tr></tbody></table></figure></li><li><p><strong>GitHub Container Registry</strong></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://ghcr.io/v2/user/image/manifests/v1.0</span><br><span class="line">加速: https://xget.xi-xu.me/cr/ghcr.io/user/image/manifests/v1.0</span><br></pre></td></tr></tbody></table></figure></li></ol><h3 id="AI-推理提供商">AI 推理提供商</h3><p><strong>平台前缀</strong>：<code>ip</code></p><p><strong>支持的提供商</strong>：</p><ul><li>OpenAI (<code>api.openai.com</code>)</li><li>Anthropic (<code>api.anthropic.com</code>)</li><li>Google AI (<code>generativelanguage.googleapis.com</code>)</li><li>其他兼容 OpenAI API 的服务</li></ul><p><strong>原始 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://{provider}/v1/{endpoint}</span><br></pre></td></tr></tbody></table></figure><p><strong>加速 URL 格式</strong>：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https://xget.xi-xu.me/ip/{provider}/v1/{endpoint}</span><br></pre></td></tr></tbody></table></figure><p><strong>转换示例</strong>：</p><ol><li><p><strong>OpenAI</strong></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://api.openai.com/v1/chat/completions</span><br><span class="line">加速: https://xget.xi-xu.me/ip/api.openai.com/v1/chat/completions</span><br></pre></td></tr></tbody></table></figure></li><li><p><strong>Anthropic</strong></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">原始: https://api.anthropic.com/v1/messages</span><br><span class="line">加速: https://xget.xi-xu.me/ip/api.anthropic.com/v1/messages</span><br></pre></td></tr></tbody></table></figure></li></ol><h2 id="URL-转换器">URL 转换器</h2><p>为了简化 URL 转换过程，Xget 提供了在线 URL 转换器：</p><p><strong><a href="https://xuc.xi-xu.me">xuc.xi-xu.me</a></strong></p><h3 id="使用方法">使用方法</h3><ol><li>访问 <a href="https://xuc.xi-xu.me">xuc.xi-xu.me</a></li><li>粘贴原始 URL</li><li>点击转换按钮</li><li>获取加速 URL</li></ol><h3 id="功能特性">功能特性</h3><ul><li>自动识别平台</li><li>一键转换 URL</li><li>支持批量转换</li><li>复制到剪贴板</li></ul><h2 id="注意事项">注意事项</h2><h3 id="1-大小写敏感">1. 大小写敏感</h3><ul><li>平台前缀必须小写</li><li>路径保持原始大小写</li></ul><h3 id="2-特殊字符">2. 特殊字符</h3><ul><li>URL 中的特殊字符需要正确编码</li><li>查询参数保持原样</li></ul><h3 id="3-Git-操作">3. Git 操作</h3><ul><li>Git 操作使用相同的转换规则</li><li>自动识别 Git 端点</li><li>支持 <code>.git</code> 后缀</li></ul><h3 id="4-认证信息">4. 认证信息</h3><ul><li>不支持在 URL 中传递认证信息</li><li>使用环境变量或配置文件</li></ul><h3 id="5-自定义域名">5. 自定义域名</h3><ul><li>可以使用自己部署的 Xget 实例</li><li>替换 <code>xget.xi-xu.me</code> 为你的域名</li></ul><h2 id="常见问题">常见问题</h2><h3 id="Q1-如何验证转换后的-URL-是否正确？">Q1: 如何验证转换后的 URL 是否正确？</h3><p>A: 访问转换后的 URL，如果返回预期的内容，说明转换正确。</p><h3 id="Q2-转换后的-URL-可以在浏览器中直接访问吗？">Q2: 转换后的 URL 可以在浏览器中直接访问吗？</h3><p>A: 可以，但某些平台可能需要特定的请求头，建议使用对应的工具。</p><h3 id="Q3-支持自定义平台吗？">Q3: 支持自定义平台吗？</h3><p>A: 可以通过修改配置文件添加自定义平台。</p><h3 id="Q4-转换后的-URL-会失效吗？">Q4: 转换后的 URL 会失效吗？</h3><p>A: 不会，只要 Xget 实例正常运行，转换后的 URL 持续有效。</p><h3 id="Q5-如何批量转换多个-URL？">Q5: 如何批量转换多个 URL？</h3><p>A: 使用在线转换器的批量转换功能，或编写脚本进行批量转换。</p><h2 id="总结">总结</h2><p>Xget 的 URL 转换规则简单直观，只需：</p><ol><li>替换域名为 Xget 域名</li><li>在路径前添加平台前缀</li><li>保持原始路径不变</li></ol><p>通过这种简单的转换规则，Xget 为 40+ 开发者常用平台提供了统一的加速服务。</p>]]></content>
    
    
    <summary type="html">全面介绍Xget加速服务的URL转换规则和各平台语法格式，涵盖GitHub、GitLab、Docker Hub、PyPI、Hugging Face等主流平台的URL转换示例。本文提供详细的路径映射规则和参数说明，帮助开发者快速掌握将任意资源URL转换为Xget加速格式的方法</summary>
    
    
    
    <category term="技术文档" scheme="https://www.zeroxin.xin/categories/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/"/>
    
    
    <category term="Xget" scheme="https://www.zeroxin.xin/tags/Xget/"/>
    
    <category term="使用指南" scheme="https://www.zeroxin.xin/tags/%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/"/>
    
    <category term="URL转换" scheme="https://www.zeroxin.xin/tags/URL%E8%BD%AC%E6%8D%A2/"/>
    
  </entry>
  
  <entry>
    <title>COSMIC：System76 打造的下一代 Linux 桌面环境</title>
    <link href="https://www.zeroxin.xin/2025/12/22/cosmic-desktop-introduction/"/>
    <id>https://www.zeroxin.xin/2025/12/22/cosmic-desktop-introduction/</id>
    <published>2025-12-21T16:00:00.000Z</published>
    <updated>2026-06-18T09:19:20.982Z</updated>
    
    <content type="html"><![CDATA[<p>在 Linux 桌面环境的激烈竞争中，System76 公司推出了一款革命性的新产品——COSMIC 桌面环境。这个全新的桌面环境不仅代表了技术上的重大突破，更是为 Linux 用户带来了前所未有的使用体验。</p><h2 id="什么是-COSMIC？">什么是 COSMIC？</h2><p><img src="https://cdn11.bigcommerce.com/s-pywjnxrcr2/images/stencil/original/image-manager/cosmic-screensr20.png?t=1758571785" alt="COSMIC"></p><p>COSMIC 是 System76 公司自主研发的桌面环境，它标志着该公司从传统的 GNOME 桌面环境转向自主研发的里程碑。作为一个完全用 Rust 编程语言构建的桌面环境，COSMIC 展现了 System76 对创新和质量的执着追求。</p><p>COSMIC 已经在 Pop!_OS 24.04 LTS 中首次亮相，标志着 System76 在桌面环境领域的重大进展。这个全新的桌面环境不仅适用于 System76 的硬件产品，也为其他 Linux 发行版提供了一个优秀的选择。</p><h2 id="技术特色">技术特色</h2><h3 id="1-Rust-语言的力量">1. Rust 语言的力量</h3><p>COSMIC 最引人注目的特点之一就是完全采用 Rust 语言开发。Rust 以其内存安全特性著称，能够有效防止常见的编程错误，如缓冲区溢出和空指针解引用。这不仅提高了系统的稳定性，还大大增强了安全性。</p><p><strong>内存安全保障</strong>：</p><ul><li>防止缓冲区溢出攻击</li><li>消除 use-after-free 漏洞</li><li>避免空指针解引用</li><li>减少竞态条件</li></ul><h3 id="2-Wayland-原生支持">2. Wayland 原生支持</h3><p>作为 Wayland 原生桌面环境，COSMIC 充分利用了现代显示服务器的优势，提供了更好的图形性能和更流畅的用户体验。与传统的 X11 相比，Wayland 提供了更现代化的图形架构。</p><p><strong>Wayland 的优势</strong>：</p><ul><li>更好的图形性能</li><li>更低的延迟</li><li>更简洁的架构</li><li>更好的 HiDPI 支持</li><li>增强的安全性</li></ul><h3 id="3-模块化设计">3. 模块化设计</h3><p>COSMIC 采用模块化架构，使得各个组件可以独立开发和维护。这种设计不仅提高了系统的可维护性，还为用户提供了更多的自定义可能性。</p><h2 id="功能特性">功能特性</h2><h3 id="个性化定制">个性化定制</h3><h4 id="🔧-灵活的面板系统">🔧 灵活的面板系统</h4><ul><li><strong>自定义面板</strong>：用户可以根据需要自定义面板的位置和样式</li><li><strong>小程序支持</strong>：支持各种小程序来扩展桌面功能</li><li><strong>动态布局</strong>：支持水平和垂直面板配置</li></ul><h4 id="🎨-强大的主题系统">🎨 强大的主题系统</h4><ul><li><strong>自定义主题</strong>：提供强大的主题定制功能，可以根据品牌需求调整颜色方案</li><li><strong>品牌适配</strong>：轻松创建符合组织品牌形象的默认主题</li><li><strong>可读性保证</strong>：确保主题定制不影响文字可读性</li></ul><h4 id="📱-现代窗口管理">📱 现代窗口管理</h4><ul><li><strong>平铺窗口</strong>：支持高级的窗口管理功能</li><li><strong>工作区管理</strong>：支持动态和固定工作区</li><li><strong>键盘快捷键</strong>：丰富的键盘快捷键支持</li></ul><h4 id="🚀-应用启动器">🚀 应用启动器</h4><ul><li><strong>启动器</strong>：提供直观的应用程序访问方式</li><li><strong>应用库</strong>：统一的应用管理界面</li><li><strong>搜索功能</strong>：快速定位和启动应用</li></ul><h3 id="开发者友好">开发者友好</h3><p>COSMIC 为开发者提供了友好的开发环境：</p><ul><li><strong>统一开发栈</strong>：使用相同的语言和工具包构建应用程序和小程序</li><li><strong>模板支持</strong>：提供有用的模板和开发工具</li><li><strong>统一体验</strong>：从应用到桌面组件的完整开发体验</li><li><strong>模块化架构</strong>：易于扩展和维护</li></ul><h2 id="安全与性能">安全与性能</h2><h3 id="🛡️-内存安全">🛡️ 内存安全</h3><p>由于采用 Rust 语言，COSMIC 从根本上消除了许多传统桌面环境面临的安全隐患：</p><ul><li><strong>防止键盘记录器攻击</strong>：Rust 的内存安全特性有效防止恶意代码注入</li><li><strong>避免输入欺骗攻击</strong>：增强的输入处理机制</li><li><strong>减少缓冲区溢出风险</strong>：编译时的安全检查</li><li><strong>消除 use-after-free 漏洞</strong>：自动内存管理</li></ul><h3 id="⚡-性能优化">⚡ 性能优化</h3><p>COSMIC 在设计时充分考虑了性能和效率：</p><ul><li><strong>启动速度优化</strong>：快速的系统启动和应用加载</li><li><strong>资源使用效率</strong>：较低的内存和 CPU 占用</li><li><strong>流畅的动画效果</strong>：硬件加速的界面动画</li><li><strong>响应式交互</strong>：即时响应的用户操作</li></ul><h2 id="应用前景">应用前景</h2><h3 id="在-Pop-OS-中的应用">在 Pop!_OS 中的应用</h3><p>COSMIC 已经在 Pop!_OS 24.04 LTS 中正式亮相，为用户提供了全新的桌面体验：</p><ul><li><strong>默认桌面环境</strong>：成为 Pop!_OS 的默认桌面环境</li><li><strong>系统集成</strong>：与 Pop!_OS 的其他组件深度集成</li><li><strong>用户体验</strong>：提供一致性和现代化的用户界面</li></ul><h3 id="跨发行版支持">跨发行版支持</h3><p>虽然目前主要集成在 Pop!_OS 中，COSMIC 的设计也考虑到了跨发行版的兼容性：</p><ul><li><strong>独立部署</strong>：可以作为独立的桌面环境部署到其他发行版</li><li><strong>包管理器支持</strong>：通过包管理器轻松安装</li><li><strong>配置迁移</strong>：支持配置和设置的迁移</li></ul><h2 id="社区与生态">社区与生态</h2><h3 id="开源社区">开源社区</h3><p>COSMIC 得到了活跃的开源社区支持：</p><ul><li><strong>开发者参与</strong>：鼓励开发者参与项目贡献</li><li><strong>社区驱动</strong>：基于社区反馈持续改进</li><li><strong>文档完善</strong>：提供详细的开发和使用文档</li></ul><h3 id="生态系统">生态系统</h3><p>随着 COSMIC 的发展，相关的生态系统也在逐步建立：</p><ul><li><strong>应用开发</strong>：专门为 COSMIC 开发的应用程序</li><li><strong>主题生态</strong>：丰富的第三方主题资源</li><li><strong>扩展插件</strong>：各种功能扩展和插件</li></ul><h2 id="与其他桌面环境的对比">与其他桌面环境的对比</h2><h3 id="vs-GNOME">vs GNOME</h3><table><thead><tr><th>特性</th><th>COSMIC</th><th>GNOME</th></tr></thead><tbody><tr><td>开发语言</td><td>Rust</td><td>C/Vala</td></tr><tr><td>显示服务器</td><td>Wayland 原生</td><td>Wayland/X11</td></tr><tr><td>内存安全</td><td>✅ 编译时保证</td><td>❌ 运行时检查</td></tr><tr><td>模块化程度</td><td>✅ 高度模块化</td><td>⚠️ 适中</td></tr><tr><td>定制能力</td><td>✅ 强定制性</td><td>⚠️ 有限</td></tr></tbody></table><h3 id="vs-KDE-Plasma">vs KDE Plasma</h3><table><thead><tr><th>特性</th><th>COSMIC</th><th>KDE Plasma</th></tr></thead><tbody><tr><td>资源占用</td><td>✅ 轻量级</td><td>⚠️ 较重</td></tr><tr><td>现代化程度</td><td>✅ 全新设计</td><td>⚠️ 传统架构</td></tr><tr><td>开发语言</td><td>Rust</td><td>C++/QML</td></tr><tr><td>学习曲线</td><td>✅ 简洁直观</td><td>⚠️ 功能复杂</td></tr></tbody></table><h2 id="总结">总结</h2><p>COSMIC 桌面环境代表了 Linux 桌面发展的新方向。通过采用现代编程语言、模块化设计和先进的安全特性，它为用户提供了一个稳定、安全且高度可定制的桌面体验。</p><h3 id="主要优势">主要优势</h3><ul><li><strong>🔒 安全性</strong>：Rust 语言带来的内存安全保障</li><li><strong>⚡ 性能</strong>：现代化的架构和优化设计</li><li><strong>🎨 美观性</strong>：Material Design 风格的现代界面</li><li><strong>🔧 可定制性</strong>：丰富的个性化选项</li><li><strong>👥 开发者友好</strong>：统一的开发体验</li></ul><h3 id="发展前景">发展前景</h3><p>随着 Pop!_OS 24.04 的正式发布和社区的持续贡献，我们有理由相信 COSMIC 将在 Linux 桌面环境中占据重要地位。它不仅展现了技术创新的力量，更为整个 Linux 桌面生态系统的发展指明了方向。</p><p>对于寻求创新桌面体验的 Linux 用户来说，COSMIC 无疑是一个值得期待的全新选择。它将 Rust 的安全特性、Wayland 的现代架构和用户友好的设计完美结合，为 Linux 桌面环境开启了新的篇章。</p><hr><p><strong>参考资料</strong>：</p><ul><li><a href="https://system76.com/cosmic">System76 COSMIC 官方页面</a></li><li><a href="https://pop.system76.com/">Pop!_OS 24.04 发布公告</a></li><li><a href="https://github.com/pop-os/cosmic-epoch">COSMIC GitHub 仓库</a></li></ul>]]></content>
    
    
    <summary type="html">详细介绍System76公司使用Rust语言从零开发的COSMIC桌面环境，涵盖其在Pop!_OS 24.04 LTS中的首次亮相、Wayland协议支持、现代化UI设计以及为Linux桌面生态带来的技术创新与性能突破，探索Rust在系统编程中的广阔前景</summary>
    
    
    
    <category term="系统技术" scheme="https://www.zeroxin.xin/categories/%E7%B3%BB%E7%BB%9F%E6%8A%80%E6%9C%AF/"/>
    
    
    <category term="开源项目" scheme="https://www.zeroxin.xin/tags/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE/"/>
    
    <category term="Linux" scheme="https://www.zeroxin.xin/tags/Linux/"/>
    
    <category term="桌面环境" scheme="https://www.zeroxin.xin/tags/%E6%A1%8C%E9%9D%A2%E7%8E%AF%E5%A2%83/"/>
    
    <category term="System76" scheme="https://www.zeroxin.xin/tags/System76/"/>
    
    <category term="Rust" scheme="https://www.zeroxin.xin/tags/Rust/"/>
    
    <category term="Wayland" scheme="https://www.zeroxin.xin/tags/Wayland/"/>
    
  </entry>
  
</feed>
