<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Aloha~Waii</title><description>苟利国家生死以，岂因祸福避趋之。</description><link>https://blog.fuckwechat.com/</link><language>zh_CN</language><item><title>Clash Verge 进阶教程：使用正则筛选节点优化 Google Antigravity IDE 网络体验</title><link>https://blog.fuckwechat.com/posts/2026/clash-verge-proxy-antigravity-ide/</link><guid isPermaLink="true">https://blog.fuckwechat.com/posts/2026/clash-verge-proxy-antigravity-ide/</guid><description>介绍如何使用 Clash Verge Rev 的 Script（脚本）功能，通过正则表达式从你的机场订阅中筛选出特定地区（如美国、日本、台湾）的优质节点，创建一个专用的策略组，并强制 Antigravity IDE 走这个专用通道。</description><pubDate>Wed, 14 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;无论是在进行云端开发还是使用先进的 AI 辅助编程工具（如 Google Antigravity IDE），一个稳定且低延迟的网络环境都是至关重要的。很多时候，我们不仅需要“能连上”，还需要“连得快、连得稳”。&lt;/p&gt;
&lt;p&gt;本文将介绍如何利用 Clash Verge Rev 强大的 Script（脚本）功能，通过正则表达式从你的机场订阅中筛选出特定地区（如美国、日本、台湾）的优质节点，创建一个专用的策略组，并强制 Antigravity IDE 走这个专用通道。&lt;/p&gt;
&lt;h2&gt;为什么需要这样做？&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;节点筛选&lt;/strong&gt;：机场订阅通常包含大量节点，质量参差不齐。对于 AI 服务，通常美国、日本或台湾的节点支持更好。机场配置文件下发后需要二次处理，筛选出优质节点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;隔离流量&lt;/strong&gt;：创建一个独立的 &quot;Gemini&quot; 策略组，可以避免其他无关流量挤占带宽，也可以让你单独为 IDE 切换节点，而不影响浏览器看视频等其他操作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;进程级路由&lt;/strong&gt;：通过进程名（Process Name）精准分流，无需手动配置 IDE 的代理设置，实现“无感”加速。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;配置步骤&lt;/h2&gt;
&lt;h3&gt;1. 准备工作&lt;/h3&gt;
&lt;p&gt;确保你已经安装了 &lt;a href=&quot;https://github.com/clash-verge-rev/clash-verge-rev&quot;&gt;Clash Verge Rev&lt;/a&gt; 并配置好了基础的机场订阅。&lt;/p&gt;
&lt;h3&gt;2. 编辑脚本&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;打开 &lt;strong&gt;Clash Verge Rev&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;进入左侧的 &lt;strong&gt;Profiles (配置)&lt;/strong&gt; 菜单。&lt;/li&gt;
&lt;li&gt;找到你当前使用的配置文件（或者新建一个 New Script）。&lt;/li&gt;
&lt;li&gt;右键点击配置文件，选择 &lt;strong&gt;Edit Script (编辑脚本)&lt;/strong&gt;；或者点击界面右上角的 &quot;Script&quot; 按钮（确保 Enable Script 选项已开启）。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;3. 写入脚本代码&lt;/h3&gt;
&lt;p&gt;在编辑器中输入以下代码。这段代码主要做了三件事：创建带正则筛选的新策略组、定义进程分流规则、将新规则应用到配置中。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Define main function (script entry)
function main(config) {
  // ============================================
  // 1. 定义新的策略组 &quot;Gemini&quot; (带筛选功能)
  // ============================================
  const geminiGroup = {
    name: &quot;Gemini&quot;,
    type: &quot;select&quot;, // 这里使用 select 手动选择，也可以改为 &quot;url-test&quot; 让其自动选择延迟最低的节点

    // ⛔️ 注意：这里的 &quot;zhs&quot;, &quot;fczs&quot; 是示例中的 Proxy Provider 名称
    // 你需要根据你自己的订阅名称进行修改，或者删除 &quot;use&quot; 字段，改用 filter 筛选全局节点
    // 如果你的节点都在全局池里，可以不写 use，Clash 会默认在所有节点中筛选
    // 因为我合并了两个机场的配置文件，所以这里需要指定
    use: [&quot;zhs&quot;, &quot;fczs&quot;],

    // 【核心修改】在这里添加正则筛选
    // 只有名字里包含 日本、台湾、美国 (及其常见英文简写) 的节点才会出现在这个组里
    // (?i) 表示忽略大小写，| 表示或
    filter: &quot;(?i)(日本|Japan|JP|台湾|台灣|TW|美国|US|United States)&quot;,

    // 你仍然可以保留 DIRECT 作为备选，万一节点都挂了可以选直连（虽然通常连不上）
    proxies: [&quot;DIRECT&quot;],
  };

  // 确保 proxy-groups 存在，防止配置为空报错
  if (!config[&quot;proxy-groups&quot;]) {
    config[&quot;proxy-groups&quot;] = [];
  }

  // 将 Gemini 组插入到策略组列表的第一个，方便在面板最上方操作
  config[&quot;proxy-groups&quot;].unshift(geminiGroup);

  // ============================================
  // 2. 定义分流规则
  // ============================================

  // (可选) 微信等国内应用走直连，防止卡顿
  const wechatRules = [
    &quot;PROCESS-NAME,WeChat,DIRECT&quot;
  ];

  // Antigravity IDE 及相关 AI 进程强制走 Gemini 策略组
  const geminiRules = [
    &quot;PROCESS-NAME,Antigravity,Gemini&quot;, // IDE 主进程
    &quot;PROCESS-NAME,Antigravity Helper,Gemini&quot;, // 辅助进程
    &quot;PROCESS-NAME,language_server_macos_arm,Gemini&quot;, // 语言服务（Mac ARM）
    &quot;PROCESS-NAME,Google Gemini,Gemini&quot;, // Gemini 相关服务
  ];

  // ============================================
  // 3. 合并规则
  // ============================================

  // 读取原有的规则 (防止报错，如果为空则初始化为空数组)
  const oldRules = config.rules || [];

  // 将新规则合并到旧规则之前 (Prepend)，让我们的规则优先级最高
  // 顺序：微信规则 -&amp;gt; Gemini 规则 -&amp;gt; 原有规则
  config.rules = [...wechatRules, ...geminiRules, ...oldRules];

  // 4. 返回修改后的配置
  return config;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. 代码核心原理解析&lt;/h3&gt;
&lt;h4&gt;正则表达式筛选 (&lt;code&gt;filter&lt;/code&gt;)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;filter: &quot;(?i)(日本|Japan|JP|台湾|台灣|TW|美国|US|United States)&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这行代码是整个配置的灵魂。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;(?i)&lt;/code&gt;: 开启大小写不敏感模式，匹配 &lt;code&gt;Japan&lt;/code&gt; 或 &lt;code&gt;japan&lt;/code&gt; 都可以。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(A|B|C)&lt;/code&gt;: 匹配 A 或 B 或 C。&lt;/li&gt;
&lt;li&gt;通过这个设置，Clash 会自动遍历你订阅中的所有节点，把名字里带有“日本”、“美国”等关键词的节点“抓”进这个 &lt;code&gt;Gemini&lt;/code&gt; 策略组里。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;进程名匹配 (&lt;code&gt;PROCESS-NAME&lt;/code&gt;)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;&quot;PROCESS-NAME,Antigravity,Gemini&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是 Clash 的高级规则类型。它不看域名，不看 IP，只看发起网络请求的程序名字。只要是 Antigravity 发起的请求，一律扔给 &lt;code&gt;Gemini&lt;/code&gt; 策略组处理。这比配置复杂的域名列表要省心得多且不易出错。&lt;/p&gt;
&lt;h2&gt;验证是否生效&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;保存脚本并开启配置。&lt;/li&gt;
&lt;li&gt;点击 Clash Verge 侧边栏的 &lt;strong&gt;Proxies (代理)&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;你应该能看到一个新的策略组叫 &lt;strong&gt;Gemini&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;展开 &lt;strong&gt;Gemini&lt;/strong&gt;，你会发现里面只剩下了日本、美国、台湾的节点，其他地区的节点都被过滤掉了。&lt;/li&gt;
&lt;li&gt;打开 Antigravity IDE，在 &lt;strong&gt;Connections (连接)&lt;/strong&gt; 面板中观察，这时候相关的流量应该会显示 &lt;code&gt;Rule: Gemini&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;通过这段简单的脚本，我们不仅为 Antigravity IDE 打造了一条“VIP 专线”，还学会了如何利用 Clash Verge 的 Script 功能进行复杂的节点筛选和路由控制。这套逻辑同样适用于其他需要特定网络环境的应用，只需修改 &lt;code&gt;PROCESS-NAME&lt;/code&gt; 即可。&lt;/p&gt;
</content:encoded></item><item><title>Astro 博客集成 Giscus 评论系统完整指南</title><link>https://blog.fuckwechat.com/posts/2025/giscus-integration/</link><guid isPermaLink="true">https://blog.fuckwechat.com/posts/2025/giscus-integration/</guid><description>学习如何在 Astro 博客中无缝集成 Giscus 评论系统，实现基于 GitHub Discussions 的评论功能。</description><pubDate>Sun, 14 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Astro 博客集成 Giscus 评论系统完整指南&lt;/h1&gt;
&lt;p&gt;在现代静态博客平台中，添加评论功能可能会是一个挑战，因为这些平台本身并不提供动态后端支持。幸运的是，Giscus 提供了一个优雅的解决方案——利用 GitHub Discussions 作为后端来实现评论功能。本文将详细介绍如何在 Astro 博客中集成 Giscus 评论系统，让你的读者能够方便地参与讨论。&lt;/p&gt;
&lt;h2&gt;什么是 Giscus？&lt;/h2&gt;
&lt;p&gt;Giscus 是一个开源评论系统，它基于 GitHub Discussions 实现。它允许访客直接通过 GitHub 账户进行评论，同时将所有评论数据存储在你的 GitHub 仓库中。这种设计有几个显著优势：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;无需额外服务器&lt;/strong&gt;：评论数据直接存储在 GitHub 上&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;防止垃圾评论&lt;/strong&gt;：需要 GitHub 账户才能评论，有效减少垃圾信息&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;易于管理&lt;/strong&gt;：在 GitHub 上直接管理所有评论&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高度可定制&lt;/strong&gt;：支持主题集成和多种配置选项&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;::github{repo=&quot;giscus/giscus&quot;}&lt;/p&gt;
&lt;h2&gt;配置 Giscus&lt;/h2&gt;
&lt;h3&gt;启用 GitHub Discussions&lt;/h3&gt;
&lt;p&gt;首先，你需要在 GitHub 仓库中启用 Discussions 功能：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;进入你的 GitHub 仓库&lt;/li&gt;
&lt;li&gt;点击 &quot;Issues&quot; 标签页&lt;/li&gt;
&lt;li&gt;点击 &quot;Discussions&quot; 选项卡&lt;/li&gt;
&lt;li&gt;点击 &quot;Set up discussions&quot; 按钮启用该功能&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;启用 Discussions 后，你就可以开始配置 Giscus 了。&lt;/p&gt;
&lt;h3&gt;配置 Giscus 应用&lt;/h3&gt;
&lt;p&gt;访问 &lt;a href=&quot;https://giscus.app/&quot;&gt;Giscus 官网&lt;/a&gt; 进行配置：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在页面上点击 &quot;Enable Giscus&quot; 按钮&lt;/li&gt;
&lt;li&gt;授权 &quot;Giscus&quot; 应用访问你的 GitHub 仓库&lt;/li&gt;
&lt;li&gt;选择你的仓库&lt;/li&gt;
&lt;li&gt;选择 Discussion 分类（通常选择 &quot;Announcements&quot; 或创建新的分类）&lt;/li&gt;
&lt;li&gt;设置默认评论位置行为（建议选择 &quot;URL pathname&quot; 或 &quot;Specific Discussion Number&quot;）&lt;/li&gt;
&lt;li&gt;选择主题样式（与你的网站主题匹配）&lt;/li&gt;
&lt;li&gt;获取生成的代码片段，并记下所需的参数值&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;在 Astro 中配置 Giscus&lt;/h2&gt;
&lt;p&gt;在 &lt;code&gt;src/config.ts&lt;/code&gt; 文件中，更新 &lt;code&gt;giscusConfig&lt;/code&gt; 对象的值：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export const giscusConfig: GiscusConfig = {
    repo: &apos;your-username/your-repo&apos;, // 替换为你的 GitHub 仓库名
    repoId: &apos;your-repo-id&apos;,          // 从 Giscus app 获取的仓库 ID
    category: &apos;Announcements&apos;,       // GitHub Discussions 分类名
    categoryId: &apos;your-category-id&apos;,  // 从 Giscus app 获取的分类 ID
    mapping: &apos;pathname&apos;,
    theme: &apos;light&apos;,
    reactionsEnabled: &apos;1&apos;,
    emitMetadata: &apos;0&apos;,
    inputPosition: &apos;top&apos;,
    lang: &apos;zh-CN&apos;,
    loading: &apos;lazy&apos;
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意我们在这里将 &lt;code&gt;lang&lt;/code&gt; 参数设置为 &lt;code&gt;zh-CN&lt;/code&gt;，以便支持中文界面。&lt;/p&gt;
&lt;h2&gt;创建 Giscus 组件&lt;/h2&gt;
&lt;p&gt;在 Astro 中创建一个 Giscus 组件，通常放在 &lt;code&gt;src/components/&lt;/code&gt; 目录下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
// src/components/Giscus.svelte
import { onMount } from &apos;svelte&apos;;

export let repo;
export let repoId;
export let category;
export let categoryId;
export let mapping;
export let theme;
export let reactionsEnabled;
export let emitMetadata;
export let inputPosition;
export let lang;
export let loading;

onMount(() =&amp;gt; {
  // 当主题变化时重新初始化 Giscus
  const handleThemeChange = () =&amp;gt; {
    const iframe = document.querySelector(&apos;iframe.giscus-frame&apos;);
    if (iframe) {
      iframe.contentWindow.postMessage(
        { giscus: { setConfig: { theme } } },
        &apos;https://giscus.app&apos;
      );
    }
  };

  // 监听自定义主题变化事件
  window.addEventListener(&apos;themechange&apos;, handleThemeChange);

  return () =&amp;gt; {
    window.removeEventListener(&apos;themechange&apos;, handleThemeChange);
  };
});
---

&amp;lt;div class=&quot;giscus&quot;&amp;gt;
  &amp;lt;script
    src=&quot;https://giscus.app/client.js&quot;
    data-repo={repo}
    data-repo-id={repoId}
    data-category={category}
    data-category-id={categoryId}
    data-mapping={mapping}
    data-theme={theme}
    data-reactions-enabled={reactionsEnabled}
    data-emit-metadata={emitMetadata}
    data-input-position={inputPosition}
    data-lang={lang}
    data-loading={loading}
    crossorigin=&quot;anonymous&quot;
    async
  /&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：如果你使用 Svelte 以外的框架，你需要相应调整组件语法。&lt;/p&gt;
&lt;h2&gt;集成到博客模板&lt;/h2&gt;
&lt;p&gt;为了让评论系统只在需要的地方显示，你可以使用前端元数据来控制：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: &quot;我的文章标题&quot;
description: &quot;这篇文章的描述&quot;
enableComments: true  // 设置为 true 显示评论系统
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后在你的文章布局组件中：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
// src/layouts/BlogPostLayout.astro
import Giscus from &apos;../components/Giscus.svelte&apos;;
import { getCollection, getEntryBySlug } from &apos;astro:content&apos;;

export interface Props {
  frontmatter: any;
}

const { frontmatter } = Astro.props;
---

&amp;lt;html&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;article&amp;gt;
      &amp;lt;slot name=&quot;content&quot; /&amp;gt;
    &amp;lt;/article&amp;gt;

    &amp;lt;!-- 根据 enableComments 控制是否显示评论 --&amp;gt;
    {frontmatter.enableComments !== false ? (
      &amp;lt;section&amp;gt;
        &amp;lt;h2&amp;gt;评论&amp;lt;/h2&amp;gt;
        &amp;lt;Giscus
          repo={import.meta.env.PUBLIC_GISCUS_REPO || &apos;&apos;}
          repoId={import.meta.env.PUBLIC_GISCUS_REPO_ID || &apos;&apos;}
          category={import.meta.env.PUBLIC_GISCUS_CATEGORY || &apos;&apos;}
          categoryId={import.meta.env.PUBLIC_GISCUS_CATEGORY_ID || &apos;&apos;}
          mapping=&quot;pathname&quot;
          theme=&quot;light&quot;
          reactionsEnabled=&quot;1&quot;
          emitMetadata=&quot;0&quot;
          inputPosition=&quot;top&quot;
          lang=&quot;zh-CN&quot;
          loading=&quot;lazy&quot;
        /&amp;gt;
      &amp;lt;/section&amp;gt;
    ) : null}
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;主题集成&lt;/h2&gt;
&lt;p&gt;Giscus 评论系统可以自动跟随网站的主题（浅色/深色模式）。当用户切换主题时，评论系统也会相应更改。为了实现这一点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;确保在你的主布局组件中有主题切换功能&lt;/li&gt;
&lt;li&gt;使用 JavaScript 在主题变化时通知 Giscus：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;// 当主题变化时调用此函数
function updateGiscusTheme(newTheme) {
  const iframe = document.querySelector(&apos;iframe.giscus-frame&apos;);
  if (iframe) {
    iframe.contentWindow.postMessage(
      { giscus: { setConfig: { theme: newTheme } } },
      &apos;https://giscus.app&apos;
    );
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;环境变量配置&lt;/h2&gt;
&lt;p&gt;为了安全起见，建议将敏感配置存储在环境变量中：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# .env 文件
PUBLIC_GISCUS_REPO=&quot;your-username/your-repo&quot;
PUBLIC_GISCUS_REPO_ID=&quot;your-repo-id&quot;
PUBLIC_GISCUS_CATEGORY=&quot;Announcements&quot;
PUBLIC_GISCUS_CATEGORY_ID=&quot;your-category-id&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;评论显示控制&lt;/h2&gt;
&lt;p&gt;你可以在博客文章的 Frontmatter 中控制是否显示评论：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: &quot;Hello World&quot;
description: &quot;这是我的第一篇文章&quot;
enableComments: false  // 设置为 false 可隐藏评论系统
---
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;故障排除&lt;/h2&gt;
&lt;p&gt;如果在集成过程中遇到问题，请参考以下解决方案：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Giscus 评论系统无法加载&lt;/strong&gt;：检查你的配置参数是否正确，特别是 repo、repoId、category 和 categoryId。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;主题切换不生效&lt;/strong&gt;：确保你的主题切换 JavaScript 代码正确发送了消息给 Giscus iframe。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;评论区域不显示&lt;/strong&gt;：检查 &lt;code&gt;enableComments&lt;/code&gt; 前端元数据设置以及相关条件渲染逻辑。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;样式不匹配&lt;/strong&gt;：确保你选择的 Giscus 主题与网站主题协调一致。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;跨域问题&lt;/strong&gt;：确认网站域名已在 Giscus 应用中正确配置。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;安全性和隐私考虑&lt;/h2&gt;
&lt;p&gt;在使用 Giscus 评论系统时，需要注意以下安全性和隐私方面的考虑：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;所有评论数据都存储在你的 GitHub 仓库中，因此需要定期备份&lt;/li&gt;
&lt;li&gt;访客需要 GitHub 账户才能发表评论，这可能会影响一部分用户的参与度&lt;/li&gt;
&lt;li&gt;评论内容对所有人公开可见（除非你的仓库是私有的）&lt;/li&gt;
&lt;li&gt;需要定期检查和管理恶意或不当评论&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;通过以上步骤，你应该已经成功在 Astro 博客中集成了 Giscus 评论系统。这个系统不仅提供了良好的用户体验，还让你能够在熟悉的 GitHub 环境中管理所有评论。记住定期检查评论区，及时处理任何可能的问题，以确保社区的健康发展。&lt;/p&gt;
&lt;p&gt;Giscus 的集成是静态博客的一个重要补充，它使静态内容具备了动态交互的能力。随着 Astro 生态系统的不断扩展，这类集成变得越来越简单和强大。&lt;/p&gt;
&lt;p&gt;如需了解更多关于 Giscus 的信息，请访问 &lt;a href=&quot;https://github.com/giscus/giscus&quot;&gt;官方文档&lt;/a&gt;。&lt;/p&gt;
</content:encoded></item><item><title>使用 CloudFlare 部署共享剪切板</title><link>https://blog.fuckwechat.com/posts/2025/pastebin-cloudflare-worker/</link><guid isPermaLink="true">https://blog.fuckwechat.com/posts/2025/pastebin-cloudflare-worker/</guid><description>介绍如何使用 CloudFlare Workers 部署一个功能丰富的共享剪切板服务，支持文本/图片上传、语法高亮、CLI 工具、Raycast 快捷操作等功能</description><pubDate>Sat, 13 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;一直听说 CloudFlare 赛博活佛的大名，但之前没有使用需求。最近因业务需要尝试了这类 Serverless 服务，体验非常棒。&lt;/p&gt;
&lt;p&gt;这里推荐一个简易的，与世界即时分享您的代码片段和文件的服务。&lt;/p&gt;
&lt;h2&gt;功能特色&lt;/h2&gt;
&lt;p&gt;我在原版基础上做了一些增强功能，主要包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;丰富的 CLI 工具&lt;/strong&gt;：提供了便捷的命令行工具，支持多种上传方式，包括直接文本输入、文件上传、从剪贴板读取内容（甚至支持图片！）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;智能语法检测&lt;/strong&gt;：CLI 工具能自动识别代码语言类型，并应用相应的语法高亮。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多平台剪贴板支持&lt;/strong&gt;：支持 macOS 和 Linux 平台的文本和图片剪贴板内容上传。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;完整 API 支持&lt;/strong&gt;：支持自定义过期时间、命名分享内容、设置访问密码等高级功能。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全性&lt;/strong&gt;：支持客户端加密、身份验证（Basic Auth）等安全措施。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多格式支持&lt;/strong&gt;：支持代码语法高亮、Markdown 渲染、URL 缩短等功能。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;部署过程&lt;/h2&gt;
&lt;p&gt;部署过程非常简单，按照官方文档即可完成。主要步骤如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;安装 &lt;code&gt;node&lt;/code&gt; 和 &lt;code&gt;yarn&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;在 Cloudflare 仪表板中创建 KV 命名空间和 R2 存储桶，记住其 ID。&lt;/li&gt;
&lt;li&gt;克隆仓库并进入目录。&lt;/li&gt;
&lt;li&gt;修改 &lt;code&gt;wrangler.toml&lt;/code&gt; 中的相关配置项。&lt;/li&gt;
&lt;li&gt;登录 Cloudflare 并进行部署。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以下是关键的 &lt;code&gt;wrangler.toml&lt;/code&gt; 配置文件样例：&lt;/p&gt;
&lt;p&gt;:::important
虽然免费额度量大管饱，但还是建议个人使用要设置密码。
:::&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;name = &quot;pb&quot;
compatibility_date = &quot;2025-04-24&quot;

workers_dev = false
main = &quot;worker/index.ts&quot;

[[rules]]
type = &quot;Text&quot;
globs = [ &quot;**/*.html&quot;, &quot;**/*.md&quot; ]
fallthrough = true

[assets]
directory = &quot;dist/frontend&quot;
run_worker_first = true
binding = &quot;ASSETS&quot;

[triggers]
# clean r2 garbage every day
crons = [&quot;0 0 * * *&quot;]

#----------------------------------------
# lines below are what you should modify
#----------------------------------------

[[routes]]
# Refer to https://developers.cloudflare.com/workers/wrangler/configuration/#routes
pattern = &quot;paste.fuckwechat.com&quot;
custom_domain = true

[[kv_namespaces]]
binding = &quot;PB&quot;  # do not touch this
id = &quot;eca225171b584b55a388f7c447bfa948&quot;  # id of your KV namespace

[[r2_buckets]]
binding = &quot;R2&quot;  # do not touch this
bucket_name = &quot;pb-shz-al&quot;  # bucket name of your R2 bucket

[vars]
# must be consistent with your routes
DEPLOY_URL = &quot;https://paste.fuckwechat.com&quot;

# url to repo, displayed in the index page
REPO = &quot;https://github.com/wujunchuan/pastebin-worker&quot;

# the page title displayed in index page
INDEX_PAGE_TITLE = &quot;Pastebin Worker&quot;

# the name displayed in TOS
TOS_MAINTAINER = &quot;wujunchuan&quot;

# the email displayed in TOS
TOS_MAIL = &quot;admin@fuckwechat.com&quot;

# Cache-Control max-age for static pages
CACHE_STATIC_PAGE_AGE = 7200

# Cache-Control max-age for paste pages
CACHE_PASTE_AGE = 600

# Default expiration
DEFAULT_EXPIRATION = &quot;7d&quot;

# Max expiration
MAX_EXPIRATION = &quot;30d&quot;

# Files larger than this threshold will be stored in R2
R2_THRESHOLD = &quot;100K&quot;

# File larger than this will be denied
R2_MAX_ALLOWED = &quot;100M&quot;

# The following mimetypes will be converted to text/plain
DISALLOWED_MIME_FOR_PASTE = [&quot;text/html&quot;, &quot;audio/x-mpegurl&quot;]

[vars.BASIC_AUTH]
wujunchuan = &quot;$2b$08$TA4lueuSHOb9wgrmMYdISuDwlj0Q.hK0XJyaMgxM6Hh6Y2rlAa5uy&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;使用体验&lt;/h2&gt;
&lt;p&gt;经过部署后，你可以通过网站界面直接分享内容，也可以通过 API 进行程序化操作。特别值得一提的是，我还开发了一个高级的 bash 脚本 &lt;code&gt;advanced_paste.sh&lt;/code&gt;，让命令行操作更加便捷：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 上传一段文本
./advanced_paste.sh &quot;Hello World&quot;

# 设置过期时间和自定义名称
./advanced_paste.sh -e 24h -n ~myshare &quot;Hello World&quot;

# 上传文件并设置管理密码
./advanced_paste.sh -f /path/to/file.txt -s 123456

# 从剪贴板获取内容上传（支持文本和图片！）
./advanced_paste.sh -c

# 带用户认证的上传
./advanced_paste.sh -u wujunchuan -p your_setup_password &quot;Hello World&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个脚本可以自动检测操作系统，处理剪贴板内容，并且支持跨平台（macOS 和 Linux）。特别是对图片的支持，利用了各平台的剪贴板工具，使得截图分享变得异常简单。&lt;/p&gt;
&lt;p&gt;整个方案充分利用了 Cloudflare Workers 的优势：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;全球分发&lt;/strong&gt;：你的分享链接在全球范围内都能快速访问&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;按需付费&lt;/strong&gt;：免费额度对于个人使用完全够用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;易于维护&lt;/strong&gt;：无需管理任何服务器&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高可用&lt;/strong&gt;：基于 Cloudflare 的基础设施，稳定性极高&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这种轻量级的分享服务非常适合开发者之间交换代码片段、配置文件，或者临时分享一些文本内容，避免了发送邮件附件的麻烦。&lt;/p&gt;
&lt;h2&gt;使用 Raycast 脚本快速接入&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title paste clipboard to pastebin
# @raycast.author John Trump
# @raycast.mode compact

# Optional parameters:
# @raycast.icon 🤖

# 将剪贴板内容上传到pastebin
if [ &quot;$(osascript -e &apos;the clipboard&apos;)x&quot; != &quot;x&quot; ]; then
    # 如果剪贴板有内容，则从剪贴板上传
    # before use advanced_paste.sh, install it first
    # shell execute `install -Dm755 advanced_paste.sh ~/.local/bin`
    &quot;$HOME/.local/bin/advanced_paste.sh&quot; -u your_setup_username -p your_setup_password -c | jq -r &apos;.url&apos; | pbcopy
else
    # 否则提示用户输入内容
    echo &apos;{&quot;error&quot;: &quot;剪贴板为空，请复制一些内容后再试&quot;}&apos;
fi
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;致敬原版&lt;/h2&gt;
&lt;p&gt;本项目基于 SharzyL 开发的 &lt;a href=&quot;https://github.com/SharzyL/pastebin-worker&quot;&gt;pastebin-worker&lt;/a&gt; 进行二次开发，在此表示感谢！原版项目设计精巧，充分利用了 Cloudflare Workers 的能力，为用户提供了一个简洁高效的分享服务。&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;SharzyL/pastebin-worker&quot;}
::github{repo=&quot;wujunchuan/pastebin-worker&quot;}&lt;/p&gt;
</content:encoded></item><item><title>Telegram 机器人初体验</title><link>https://blog.fuckwechat.com/posts/2021/telegram-bot/</link><guid isPermaLink="true">https://blog.fuckwechat.com/posts/2021/telegram-bot/</guid><description>注册 Telegram 机器人并部署到 Vercel</description><pubDate>Sat, 17 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Telegram 机器人&lt;/h1&gt;
&lt;p&gt;本文将演示如何注册 Telegram 机器人，并将其部署到 &lt;a href=&quot;https://vercel.com/&quot;&gt;Vercel&lt;/a&gt; 上。&lt;/p&gt;
&lt;p&gt;之所以选用 Vercel 是因为它是一个 Serverless 的云服务提供商，我的 Notion 博客就是部署在上面的，四舍五入约等于白嫖。&lt;/p&gt;
&lt;h2&gt;步骤&lt;/h2&gt;
&lt;p&gt;安装 Vercel：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yarn install -g vercel
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;登录 Vercel：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vercel login
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们写个简单的 demo，来验证一下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// api/webhook.js
module.exports = (request, response) =&amp;gt; {
  response.json({
    body: request.body,
    query: request.query,
    cookies: request.cookies,
  });
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;本地预览项目：&lt;code&gt;vercel dev&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;访问 &lt;code&gt;http://localhost:3000/api/webhook?hello=world&lt;/code&gt;，这里我们会看到返回了一段 JSON。到目前为止，这个和普通的 Node 项目并没有什么区别。&lt;/p&gt;
&lt;h3&gt;注册机器人&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://t.me/botfather&quot;&gt;@BotFather&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2021/07/17/1KaLDlj3ZvsYOdG.png&quot; alt=&quot;注册机器人&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;正式编写代码&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// https://github.com/yagop/node-telegram-bot-api/issues/319#issuecomment-324963294
// Fixes an error with Promise cancellation
process.env.NTBA_FIX_319 = &apos;test&apos;;

const TelegramBot = require(&apos;node-telegram-bot-api&apos;);

module.exports = async (request, response) =&amp;gt; {
  const bot = new TelegramBot(process.env.TELEGRAM_TOKEN);
  try {
    const { body } = request;
    if (body.message) {
      const {
        chat: { id },
        text,
      } = body.message;
      const message = `✅ 感谢您的留言：*&quot;${text}&quot;*\n祝您有美好的一天！ 👋🏻`;
      await bot.sendMessage(id, message, { parse_mode: &apos;Markdown&apos; });
    }
  } catch (error) {
    // 如果发送消息时出现错误，则可以将其记录到 Vercel 控制台
    console.error(&apos;发送消息时出错&apos;);
    console.log(error.toString());
  }
  response.send(&apos;OK&apos;);
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;本地启动：&lt;code&gt;TELEGRAM_TOKEN=&amp;lt;YOUR-BOT-TOKEN&amp;gt; vercel dev&lt;/code&gt;，Vercel 默认会在 3000 端口启动服务。&lt;/p&gt;
&lt;p&gt;当您向机器人发送消息时，&lt;code&gt;telegram-bot-server&lt;/code&gt; 会向其绑定的地址发起 POST 请求。这段代码就是在接收并处理 &lt;code&gt;telegram-bot-server&lt;/code&gt; 的 POST 请求。&lt;/p&gt;
&lt;h3&gt;使用 ngrok 映射到外网&lt;/h3&gt;
&lt;p&gt;由于后续调用 Telegram API 注册 webhook 需要 &lt;code&gt;HTTPS&lt;/code&gt; 的环境，并且需要一个外网可以访问的地址，我们可以使用 &lt;a href=&quot;https://ngrok.com/&quot;&gt;ngrok&lt;/a&gt; 将本地端口映射到外网，并且会分配一个 &lt;code&gt;HTTPS&lt;/code&gt; 的公网地址。&lt;/p&gt;
&lt;p&gt;安装方法很简单：&lt;code&gt;yarn install -g ngrok&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;使用也很简单，比如我们项目的端口地址为 3000，我们想要将其暴露出去，只需要执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ngrok http 3000
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;抛砖引玉一下，这玩意很好用。假如你在工作中想要把本地跑的 Demo 给远方的朋友看，可以使用它来实现内网穿透。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2021/07/17/UiK2cTmj5xCVzRE.png&quot; alt=&quot;ngrok 界面&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;注册 webhook 到机器人&lt;/h3&gt;
&lt;p&gt;注册 webhook 到机器人：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -X POST https://api.telegram.org/bot&amp;lt;YOUR-BOT-TOKEN&amp;gt;/setWebhook \
     -H &apos;Content-Type: application/json&apos; \
     -d &apos;{&quot;url&quot;: &quot;https://8fbd312cf3d7.ngrok.io/api/webhook&quot;}&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2021/07/17/hxlW3HQRrNPT8aI.png&quot; alt=&quot;成功设置 webhook&quot; /&gt;&lt;/p&gt;
&lt;p&gt;成功收到消息并回复信息。&lt;/p&gt;
&lt;h2&gt;部署到 Vercel&lt;/h2&gt;
&lt;p&gt;部署很简单，只需要执行 &lt;code&gt;vercel&lt;/code&gt; 即可。你甚至可以关联到 GitHub 的仓库（这里需要将 vercel 机器人加入到仓库中），只要 master 分支有新的提交，就会自动部署。&lt;/p&gt;
&lt;p&gt;配置环境变量到 Vercel：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;https://vercel.com/&amp;lt;your-vercel-name&amp;gt;/&amp;lt;your-project-name&amp;gt;/settings/environment-variables&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2021/07/17/HRKf7pVXYSvswZa.png&quot; alt=&quot;配置环境变量&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;相关链接&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://t.me/botfather&quot;&gt;@BotFather&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://core.telegram.org/bots/api&quot;&gt;Telegram API 文档&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>M1 Mac 环境配置记录</title><link>https://blog.fuckwechat.com/posts/2021/mac-setup/</link><guid isPermaLink="true">https://blog.fuckwechat.com/posts/2021/mac-setup/</guid><description>新电脑环境配置过程记录，Apple silicon YES!</description><pubDate>Thu, 04 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;正常情况下我会在更换电脑时用 &lt;code&gt;Time Machine&lt;/code&gt; 直接恢复原有的环境。距离我上次搭建环境已经过去 4 年了，想要趁着这次换电脑的契机彻底重新搭建一遍。&lt;/p&gt;
&lt;p&gt;:::note
建议定期使用 &lt;code&gt;Time Machine&lt;/code&gt; 对机器进行定期备份。
:::&lt;/p&gt;
&lt;p&gt;以下是配置记录：&lt;/p&gt;
&lt;h2&gt;必备软件&lt;/h2&gt;
&lt;h3&gt;XCode&lt;/h3&gt;
&lt;p&gt;:::tip
一般也不用这个步骤，因为安装 &lt;code&gt;Homebrew&lt;/code&gt; 的时候，就会自动安装。
:::&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;简单来讲，Command Line Tools 就是一个小型独立包，为 Mac 终端用户提供了许多常用的工具、实用程序和编译器。包括 svn、git、make、GCC、clang、perl、size、strip、strings、libtool、cpp、what 以及许多能够在 Linux 默认安装中找到的有用命令。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果没有 &lt;code&gt;Xcode IDE&lt;/code&gt; 的需求，可以直接只安装 &lt;code&gt;Xcode Command Line Tools&lt;/code&gt; 版本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;xcode-select --install
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Homebrew&lt;/h3&gt;
&lt;p&gt;参考文档：&lt;a href=&quot;https://juejin.cn/post/6914139996299460615&quot;&gt;M1 芯片 Mac 上 Homebrew 安装教程&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;导出 bundle 列表&lt;/h4&gt;
&lt;p&gt;在旧电脑导出使用 &lt;code&gt;Homebrew&lt;/code&gt; 安装的软件包列表：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/usr/local/bin/brew bundle dump
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::tip
这里我选择不直接导入 &lt;code&gt;Brewfile&lt;/code&gt; 文件，而是选择缺少的包进行安装。
如果有需要导入 &lt;code&gt;Brewfile&lt;/code&gt; 文件的话，可以执行 &lt;code&gt;brew bundle --file=&quot;~/Brewfile&quot;&lt;/code&gt;，具体 API 可以查阅相关文档。
:::&lt;/p&gt;
&lt;h4&gt;多版本共存&lt;/h4&gt;
&lt;p&gt;&lt;s&gt;鉴于当前 &lt;code&gt;Homebrew&lt;/code&gt; 还没有完成对 M1 芯片的适配，因此我们需要安装两个版本的 &lt;code&gt;Homebrew&lt;/code&gt;，并通过别名 &lt;code&gt;alias&lt;/code&gt; 使两个版本共存。&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;:::warning
已经将两个版本合并，不需要单独安装两个版本了。
:::&lt;/p&gt;
&lt;h5&gt;安装不同版本的 &lt;code&gt;Homebrew&lt;/code&gt;&lt;/h5&gt;
&lt;p&gt;安装 ARM 版本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;s&gt;安装 X86 版本：&lt;code&gt;arch -x86_64 /bin/bash -c &quot;$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install.sh)&quot;&lt;/code&gt;&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;&lt;s&gt;设置别名到对应的配置文件中：&lt;/s&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~~alias abrew=&apos;arch -arm64 /opt/homebrew/bin/brew&apos;
alias ibrew=&apos;arch -x86_64 /usr/local/bin/brew&apos;~~
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;日常更新依赖&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash
brew update -v &amp;amp;&amp;amp; brew upgrade -v &amp;amp;&amp;amp; brew cleanup
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;加入环境变量&lt;/h4&gt;
&lt;p&gt;执行完安装脚本后，注意看输出信息。执行 &lt;code&gt;echo &apos;eval $(/opt/homebrew/bin/brew shellenv)&apos; &amp;gt;&amp;gt; $HOME/.zprofile&lt;/code&gt; 后重启终端，将 &lt;code&gt;Homebrew&lt;/code&gt; 加入环境变量。&lt;/p&gt;
&lt;p&gt;:::tip
zsh 配置文件的加载顺序：
&lt;code&gt;.zshenv&lt;/code&gt; → &lt;code&gt;.zprofile&lt;/code&gt; → &lt;code&gt;.zshrc&lt;/code&gt; → &lt;code&gt;.zlogin&lt;/code&gt; → &lt;code&gt;.zlogout&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;将耗时长，并且不经常变动的配置信息放到 &lt;code&gt;~/.zprofile&lt;/code&gt; 中，这样大部分的耗时只发生在打开 Terminal 时，从而提高执行 &lt;code&gt;source ~/.zshrc&lt;/code&gt; 的速度。
:::&lt;/p&gt;
&lt;h3&gt;Node.js&lt;/h3&gt;
&lt;p&gt;多版本管理工具：&lt;a href=&quot;https://github.com/nvm-sh/nvm&quot;&gt;nvm&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::warning
🚧 当前 &lt;code&gt;Node.js&lt;/code&gt; 版本为 15.3.0 以上的版本才有提供 &lt;code&gt;ARM64&lt;/code&gt; 版本。&lt;/p&gt;
&lt;p&gt;查看 &lt;code&gt;Node.js&lt;/code&gt; 运行的架构信息，执行 &lt;code&gt;node -p process.arch&lt;/code&gt;
:::&lt;/p&gt;
&lt;p&gt;参考这个 &lt;a href=&quot;https://github.com/nvm-sh/nvm/issues/2350#issuecomment-734132550&quot;&gt;issue&lt;/a&gt; 可以知道，安装 &lt;code&gt;v15&lt;/code&gt; 版本以下的版本，需要在 &lt;code&gt;Rosetta2&lt;/code&gt; 的加持下。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For anything under v15, you will need to install node using Rosetta 2. In Terminal, use &lt;code&gt;arch -x86_64 zsh&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;当前官方提供的 v15 只有源码版本，需要下载到本地编译安装，因此安装时间会比较久。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3-us-west-2.amazonaws.com/secure.notion-static.com/713c3be7-08db-466d-9871-792c612a9e00/Untitled.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;:::warning
建议管理多版本 &lt;code&gt;Node.js&lt;/code&gt; 时，全局 npm 与全局 yarn 包分别安装管理。即不要存在跨版本的任何依赖。
:::&lt;/p&gt;
&lt;p&gt;:::tip
💡 根据 &lt;code&gt;.nvmrc&lt;/code&gt; 自动切换环境
:::&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Location: ~/.zshrc
# Calling nvm use automatically in a directory with a .nvmrc file
# place this after nvm initialization!
autoload -U add-zsh-hook
load-nvmrc() {
  local node_version=&quot;$(nvm version)&quot;
  local nvmrc_path=&quot;$(nvm_find_nvmrc)&quot;

  if [ -n &quot;$nvmrc_path&quot; ]; then
    local nvmrc_node_version=$(nvm version &quot;$(cat &quot;${nvmrc_path}&quot;)&quot;)

    if [ &quot;$nvmrc_node_version&quot; = &quot;N/A&quot; ]; then
      nvm install
    elif [ &quot;$nvmrc_node_version&quot; != &quot;$node_version&quot; ]; then
      nvm use
    fi
  elif [ &quot;$node_version&quot; != &quot;$(nvm version default)&quot; ]; then
    echo &quot;Reverting to nvm default version&quot;
    nvm use default
  fi
}
add-zsh-hook chpwd load-nvmrc
load-nvmrc
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Visual Studio Code&lt;/h3&gt;
&lt;p&gt;当前（2021年02月04日）只有 &lt;a href=&quot;https://code.visualstudio.com/insiders/&quot;&gt;insider&lt;/a&gt; 版本才原生支持 M1 芯片。强烈建议使用 insider 版本，性能提升非常明显。&lt;/p&gt;
&lt;p&gt;:::tip
💡 使用官方提供的 &lt;a href=&quot;https://code.visualstudio.com/docs/editor/settings-sync&quot;&gt;Settings Sync&lt;/a&gt; 特性，同步到新电脑的时候记得选择 insider 版本，这样就能把旧配置同步到 insider 版本了。
:::&lt;/p&gt;
&lt;h2&gt;终端命令行工具&lt;/h2&gt;
&lt;h3&gt;oh-my-zsh&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://ohmyz.sh/#install&quot;&gt;oh-my-zsh&lt;/a&gt; 是一个社区驱动的框架，用于管理 zsh 配置。&lt;/p&gt;
&lt;p&gt;安装命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sh -c &quot;$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;oh-my-tmux&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/gpakosz/.tmux&quot;&gt;oh-my-tmux&lt;/a&gt; 是一个让 Tmux 更易使用的配置集合。&lt;/p&gt;
&lt;p&gt;安装步骤：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd # 进入 Home 目录
git clone https://github.com/gpakosz/.tmux.git # 克隆仓库
ln -s -f .tmux/.tmux.conf
cp .tmux/.tmux.conf.local .
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;fzf&lt;/h3&gt;
&lt;p&gt;fzf 是一个用 &lt;code&gt;golang&lt;/code&gt; 编写的通用命令行模糊搜索工具。&lt;/p&gt;
&lt;h3&gt;smartmontools&lt;/h3&gt;
&lt;p&gt;M1 电脑过度读写 SSD 问题排查（查看硬盘读写统计）&lt;/p&gt;
&lt;p&gt;:::note
一些用户表示，他们发现 M1 在读写数据时会过度使用 Mac 电脑的 SSD，这一问题可能会影响到 M1 版 Mac 中搭载的 SSD 的寿命，进而影响整个机器的寿命。
:::&lt;/p&gt;
&lt;p&gt;使用步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;安装：&lt;code&gt;brew install smartmontools&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;执行 &lt;code&gt;diskutil list&lt;/code&gt;，确定自己 SSD 所在盘符，默认一般为 &lt;code&gt;disk0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;smartctl -a disk0&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;参考：&lt;a href=&quot;https://www.macworld.com/article/3609512/how-to-m1-intel-mac-ssd-health-terminal-smartmontools.html&quot;&gt;How to check your Intel and M1 Mac&apos;s SSD health using Terminal&lt;/a&gt;&lt;/p&gt;
</content:encoded></item></channel></rss>