<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="https://mo7.cc/atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-CN">
  <id>https://mo7.cc/</id>
  <title>墨七</title>
  <subtitle>墨七 - 墨染七弦月，笔耕半亩田。</subtitle>
  <icon>https://mo7.cc/pwa/512.png</icon>
  <logo>https://mo7.cc/pwa/72.png</logo>
  <updated>2025-09-16T01:29:38.860Z</updated>
  <generator>@vuepress/plugin-feed</generator>
  <link rel="self" href="https://mo7.cc/atom.xml"/>
  <link rel="alternate" href="https://mo7.cc/"/>
  <category term="关于/about"/>
  <category term="资源收藏/bookmark"/>
  <category term="编程开发/coder"/>
  <category term="杂七杂八/misc"/>
  <category term="自我管理/self_manage"/>
  <category term="理论研究/theory"/>
  <entry>
    <title type="text">go 项目结构</title>
    <id>https://mo7.cc/coder/go/%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84.html</id>
    <link href="https://mo7.cc/coder/go/%E9%A1%B9%E7%9B%AE%E7%BB%93%E6%9E%84.html"/>
    <updated>2025-07-21T08:33:13.000Z</updated>
    <summary type="html"><![CDATA[
<p>Go 语言的项目结构遵循一些约定俗成的最佳实践，这些实践有助于代码的组织、维护和复用。以下是一个标准的 Go 项目结构示例及相关说明：</p>
<h3><strong>标准项目结构</strong></h3>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">my-project/</span>
<span class="line">├── cmd/                    # 主应用程序入口</span>
<span class="line">│   └── myapp/              # 可执行文件名称</span>
<span class="line">│       └── main.go         # 程序入口点</span>
<span class="line">├── internal/               # 内部模块（不可被外部引用）</span>
<span class="line">│   ├── models/             # 数据模型</span>
<span class="line">│   ├── repositories/       # 数据访问层</span>
<span class="line">│   ├── services/           # 业务逻辑层</span>
<span class="line">│   └── utils/              # 工具函数</span>
<span class="line">├── pkg/                    # 公共模块（可被外部引用）</span>
<span class="line">│   ├── api/                # API接口定义</span>
<span class="line">│   └── client/             # 客户端库</span>
<span class="line">├── configs/                # 配置文件模板</span>
<span class="line">├── scripts/                # 脚本文件</span>
<span class="line">├── tests/                  # 集成测试</span>
<span class="line">├── docs/                   # 文档</span>
<span class="line">├── vendor/                 # 依赖包（Go 1.14+ 推荐使用go mod代替）</span>
<span class="line">├── go.mod                  # 模块依赖定义</span>
<span class="line">├── go.sum                  # 依赖校验文件</span>
<span class="line">└── Makefile                # 构建脚本</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[
<p>Go 语言的项目结构遵循一些约定俗成的最佳实践，这些实践有助于代码的组织、维护和复用。以下是一个标准的 Go 项目结构示例及相关说明：</p>
<h3><strong>标准项目结构</strong></h3>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">my-project/</span>
<span class="line">├── cmd/                    # 主应用程序入口</span>
<span class="line">│   └── myapp/              # 可执行文件名称</span>
<span class="line">│       └── main.go         # 程序入口点</span>
<span class="line">├── internal/               # 内部模块（不可被外部引用）</span>
<span class="line">│   ├── models/             # 数据模型</span>
<span class="line">│   ├── repositories/       # 数据访问层</span>
<span class="line">│   ├── services/           # 业务逻辑层</span>
<span class="line">│   └── utils/              # 工具函数</span>
<span class="line">├── pkg/                    # 公共模块（可被外部引用）</span>
<span class="line">│   ├── api/                # API接口定义</span>
<span class="line">│   └── client/             # 客户端库</span>
<span class="line">├── configs/                # 配置文件模板</span>
<span class="line">├── scripts/                # 脚本文件</span>
<span class="line">├── tests/                  # 集成测试</span>
<span class="line">├── docs/                   # 文档</span>
<span class="line">├── vendor/                 # 依赖包（Go 1.14+ 推荐使用go mod代替）</span>
<span class="line">├── go.mod                  # 模块依赖定义</span>
<span class="line">├── go.sum                  # 依赖校验文件</span>
<span class="line">└── Makefile                # 构建脚本</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3><strong>关键目录说明</strong></h3>
<h4><strong>1. <code>cmd/</code> - 应用程序入口</strong></h4>
<p>存放项目的主程序入口文件，每个子目录对应一个可执行文件。</p>
<div class="language-go line-numbers-mode" data-highlighter="prismjs" data-ext="go"><pre><code class="language-go"><span class="line"><span class="token comment">// cmd/myapp/main.go</span></span>
<span class="line"><span class="token keyword">package</span> main</span>
<span class="line"></span>
<span class="line"><span class="token keyword">import</span> <span class="token string">"my-project/internal/app"</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    app<span class="token punctuation">.</span><span class="token function">Run</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4><strong>2. <code>internal/</code> - 内部模块</strong></h4>
<p>Go 语言特有的目录，其中的包不能被外部项目导入，适合存放私有代码。</p>
<ul>
<li><strong>models/</strong>：定义数据结构和数据库模型。</li>
<li><strong>repositories/</strong>：处理数据访问（如数据库操作）。</li>
<li><strong>services/</strong>：实现业务逻辑。</li>
<li><strong>controllers/</strong>（可选）：处理 HTTP 请求（适用于 Web 应用）。</li>
</ul>
<h4><strong>3. <code>pkg/</code> - 公共模块</strong></h4>
<p>存放可被外部引用的公共代码，如工具库、客户端 API 等。</p>
<h4><strong>4. <code>configs/</code> - 配置文件</strong></h4>
<p>存放配置模板或示例文件，例如：</p>
<div class="language-yaml line-numbers-mode" data-highlighter="prismjs" data-ext="yml"><pre><code class="language-yaml"><span class="line"><span class="token comment"># configs/config.yaml</span></span>
<span class="line"><span class="token key atrule">database</span><span class="token punctuation">:</span></span>
<span class="line">  <span class="token key atrule">host</span><span class="token punctuation">:</span> localhost</span>
<span class="line">  <span class="token key atrule">port</span><span class="token punctuation">:</span> <span class="token number">5432</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4><strong>5. <code>scripts/</code> - 脚本文件</strong></h4>
<p>存放构建、部署或测试的脚本，如：</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token comment"># scripts/setup_db.sh</span></span>
<span class="line"><span class="token comment">#!/bin/bash</span></span>
<span class="line">psql <span class="token parameter variable">-U</span> postgres <span class="token parameter variable">-c</span> <span class="token string">"CREATE DATABASE mydb;"</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4><strong>6. <code>tests/</code> - 测试代码</strong></h4>
<p>存放集成测试或端到端测试，单元测试通常放在各模块的<code>*_test.go</code>文件中。</p>
<h3><strong>Go Modules 管理依赖</strong></h3>
<p>Go 1.11+ 引入了模块系统，使用<code>go.mod</code>文件管理依赖：</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line"># go.mod</span>
<span class="line">module github.com/username/my-project</span>
<span class="line"></span>
<span class="line">go 1.20</span>
<span class="line"></span>
<span class="line">require (</span>
<span class="line">    github.com/gin-gonic/gin v1.9.0</span>
<span class="line">    gorm.io/gorm v1.25.1</span>
<span class="line">)</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3><strong>工具与构建</strong></h3>
<p>推荐使用<code>Makefile</code>简化常用命令：</p>
<div class="language-makefile line-numbers-mode" data-highlighter="prismjs" data-ext="makefile"><pre><code class="language-makefile"><span class="line"><span class="token comment"># Makefile</span></span>
<span class="line"><span class="token target symbol">build</span><span class="token punctuation">:</span></span>
<span class="line">    go build -o bin/myapp cmd/myapp/main.go</span>
<span class="line"></span>
<span class="line"><span class="token target symbol">test</span><span class="token punctuation">:</span></span>
<span class="line">    go test ./...</span>
<span class="line"></span>
<span class="line"><span class="token target symbol">run</span><span class="token punctuation">:</span></span>
<span class="line">    go run cmd/myapp/main.go</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3><strong>Web 应用扩展结构</strong></h3>
<p>如果是 Web 应用，可增加以下目录：</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">my-project/</span>
<span class="line">├── web/                    # Web相关资源</span>
<span class="line">│   ├── static/             # 静态文件（CSS、JS、图片）</span>
<span class="line">│   └── templates/          # 模板文件</span>
<span class="line">├── api/                    # API接口定义</span>
<span class="line">│   ├── v1/                 # 版本1</span>
<span class="line">│   │   ├── handlers/       # HTTP处理函数</span>
<span class="line">│   │   └── routes/         # 路由定义</span>
<span class="line">│   └── docs/               # API文档</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3><strong>最佳实践</strong></h3>
<ol>
<li><strong>单一职责原则</strong>：每个包专注于单一功能。</li>
<li><strong>最小化依赖</strong>：避免包之间的循环依赖。</li>
<li><strong>测试优先</strong>：为每个功能编写单元测试。</li>
<li><strong>配置外部化</strong>：通过环境变量或配置文件管理参数。</li>
<li><strong>使用标准库</strong>：优先使用 Go 标准库，减少第三方依赖。</li>
</ol>
<p>通过遵循这些结构和原则，你的 Go 项目将更易于理解、维护和扩展。如果需要针对特定类型的项目（如微服务、CLI 工具）的结构建议，可以进一步说明！</p>
]]></content>
    <published>2025-07-21T07:23:14.000Z</published>
  </entry>
  <entry>
    <title type="text">文本数字计算器</title>
    <id>https://mo7.cc/bookmark/tools/text_num_add.html</id>
    <link href="https://mo7.cc/bookmark/tools/text_num_add.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<details class="hint-container details"><summary>使用说明</summary>
<p>自己开发的用于提取文本中的四则运算进行自动化计算的程序，方便平时记账使用。<br>
举例，当你输入：</p>
<div class="language-txt line-numbers-mode" data-highlighter="prismjs" data-ext="txt"><pre><code class="language-txt"><span class="line">早餐 -6</span>
<span class="line">奶茶 -19 -21</span>
<span class="line">兰湘子 -92 -3.7</span>
<span class="line">冰淇淋 -6</span>
<span class="line">+(</span>
<span class="line">-79 桑葚</span>
<span class="line">-75 八宝茶</span>
<span class="line">-97 牛肉干</span>
<span class="line">) * 3</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>则会自动提取计算并显示：</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">-6-19-21-92-3.7-6+(-79-75-97)*3 = -900.7</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><blockquote>
<p>tips:可以提取的计算符号为 <code>+</code>, <code>-</code>, <code>*</code>, <code>/</code> 和括号 <code>(</code>, <code>)</code>，并且支持小数点。</p>
</blockquote>
</details>]]></summary>
    <content type="html"><![CDATA[
<details class="hint-container details"><summary>使用说明</summary>
<p>自己开发的用于提取文本中的四则运算进行自动化计算的程序，方便平时记账使用。<br>
举例，当你输入：</p>
<div class="language-txt line-numbers-mode" data-highlighter="prismjs" data-ext="txt"><pre><code class="language-txt"><span class="line">早餐 -6</span>
<span class="line">奶茶 -19 -21</span>
<span class="line">兰湘子 -92 -3.7</span>
<span class="line">冰淇淋 -6</span>
<span class="line">+(</span>
<span class="line">-79 桑葚</span>
<span class="line">-75 八宝茶</span>
<span class="line">-97 牛肉干</span>
<span class="line">) * 3</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>则会自动提取计算并显示：</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">-6-19-21-92-3.7-6+(-79-75-97)*3 = -900.7</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><blockquote>
<p>tips:可以提取的计算符号为 <code>+</code>, <code>-</code>, <code>*</code>, <code>/</code> 和括号 <code>(</code>, <code>)</code>，并且支持小数点。</p>
</blockquote>
</details>
<p><textarea id="text-add-input" placeholder="请输入内容，并自动运算"></textarea></p>
<div id="text-add-output"></div>
]]></content>
    <published>2025-06-28T14:55:54.000Z</published>
  </entry>
  <entry>
    <title type="text">资源收藏</title>
    <id>https://mo7.cc/bookmark/</id>
    <link href="https://mo7.cc/bookmark/"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<ul>
<li>开发工具</li>
<li>学习资源</li>
<li>API 接口</li>
<li>读书笔记</li>
<li>实用网站<br>
影视 ，音乐 图片<br>
工具使用教程等<br>
如 VSCode，Git 等工具类</li>
</ul>
</div>
]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<ul>
<li>开发工具</li>
<li>学习资源</li>
<li>API 接口</li>
<li>读书笔记</li>
<li>实用网站<br>
影视 ，音乐 图片<br>
工具使用教程等<br>
如 VSCode，Git 等工具类</li>
</ul>
</div>
]]></content>
    <published>2025-03-29T18:13:07.000Z</published>
  </entry>
  <entry>
    <title type="text">关于</title>
    <id>https://mo7.cc/about/</id>
    <link href="https://mo7.cc/about/"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<ul>
<li>关于我</li>
<li>关于本站</li>
<li>留言板</li>
<li>友情链接</li>
<li>站点地图</li>
<li>站点更新日志</li>
<li>站点使用说明</li>
</ul>
<p>等</p>
</div>
]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<ul>
<li>关于我</li>
<li>关于本站</li>
<li>留言板</li>
<li>友情链接</li>
<li>站点地图</li>
<li>站点更新日志</li>
<li>站点使用说明</li>
</ul>
<p>等</p>
</div>
]]></content>
    <published>2025-03-29T18:13:07.000Z</published>
  </entry>
  <entry>
    <title type="text">杂七杂八</title>
    <id>https://mo7.cc/misc/</id>
    <link href="https://mo7.cc/misc/"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<ul>
<li>随笔感悟</li>
<li>学习心得</li>
<li>最近明白的道理</li>
</ul>
<p>散文、生活感悟<br>
草稿与临时记录<br>
未分类内容<br>
临时笔记<br>
草稿记录</p>
</div>
]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<ul>
<li>随笔感悟</li>
<li>学习心得</li>
<li>最近明白的道理</li>
</ul>
<p>散文、生活感悟<br>
草稿与临时记录<br>
未分类内容<br>
临时笔记<br>
草稿记录</p>
</div>
]]></content>
    <published>2025-03-29T18:13:07.000Z</published>
  </entry>
  <entry>
    <title type="text">编程开发</title>
    <id>https://mo7.cc/coder/</id>
    <link href="https://mo7.cc/coder/"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">程序员是世界上最酷的一群人。</p>
<ul>
<li>编程语言
<ul>
<li>JavaScript/TypeScript</li>
<li>Go</li>
<li>Python</li>
<li>Shell</li>
<li>Zig</li>
</ul>
</li>
<li>框架与工具
<ul>
<li>Vue/VuePress</li>
<li>Uni-app</li>
<li>Bun</li>
<li>Nginx</li>
<li>Redis</li>
<li>PostgreSQL</li>
</ul>
</li>
<li>开发教程
<ul>
<li>go-zero 教程</li>
<li>ECharts 使用指南</li>
<li>VSCode 扩展开发</li>
<li>算法学习笔记</li>
</ul>
</li>
<li>系统运维
<ul>
<li>Linux 管理</li>
<li>Shell 脚本</li>
<li>BitLocker 相关</li>
<li>服务器配置</li>
</ul>
</li>
</ul>
<p>技术研究<br>
技术研究笔记，编程语言学习笔记，语言运行环境搭建等</p>
<p>技术应用<br>
利用技术来解决实际问题<br>
比如小脚本，小程序啥的</p>
<p>业务领域<br>
和具体的业务以及工作相关的内容</p>
<p>和编程有关的一切</p>
</div>]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">程序员是世界上最酷的一群人。</p>
<ul>
<li>编程语言
<ul>
<li>JavaScript/TypeScript</li>
<li>Go</li>
<li>Python</li>
<li>Shell</li>
<li>Zig</li>
</ul>
</li>
<li>框架与工具
<ul>
<li>Vue/VuePress</li>
<li>Uni-app</li>
<li>Bun</li>
<li>Nginx</li>
<li>Redis</li>
<li>PostgreSQL</li>
</ul>
</li>
<li>开发教程
<ul>
<li>go-zero 教程</li>
<li>ECharts 使用指南</li>
<li>VSCode 扩展开发</li>
<li>算法学习笔记</li>
</ul>
</li>
<li>系统运维
<ul>
<li>Linux 管理</li>
<li>Shell 脚本</li>
<li>BitLocker 相关</li>
<li>服务器配置</li>
</ul>
</li>
</ul>
<p>技术研究<br>
技术研究笔记，编程语言学习笔记，语言运行环境搭建等</p>
<p>技术应用<br>
利用技术来解决实际问题<br>
比如小脚本，小程序啥的</p>
<p>业务领域<br>
和具体的业务以及工作相关的内容</p>
<p>和编程有关的一切</p>
</div>
]]></content>
    <published>2025-03-29T17:59:37.000Z</published>
  </entry>
  <entry>
    <title type="text">个人管理</title>
    <id>https://mo7.cc/self_manage/</id>
    <link href="https://mo7.cc/self_manage/"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<ul>
<li>健康管理
<ul>
<li>运动计划</li>
<li>饮食建议</li>
</ul>
</li>
<li>时间管理
<ul>
<li>任务清单</li>
<li>计划安排</li>
</ul>
</li>
</ul>
<p>方法论，如个人效率提升，学习方法，减肥等</p>
<p>某一个具体问题的解决方案等</p>
</div>
<hr>
]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<ul>
<li>健康管理
<ul>
<li>运动计划</li>
<li>饮食建议</li>
</ul>
</li>
<li>时间管理
<ul>
<li>任务清单</li>
<li>计划安排</li>
</ul>
</li>
</ul>
<p>方法论，如个人效率提升，学习方法，减肥等</p>
<p>某一个具体问题的解决方案等</p>
</div>
]]></content>
    <published>2025-03-29T17:59:37.000Z</published>
  </entry>
  <entry>
    <title type="text">理论研究</title>
    <id>https://mo7.cc/theory/</id>
    <link href="https://mo7.cc/theory/"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<p>学习资源整理，理论知识，基础概念等。</p>
</div>
]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<p>学习资源整理，理论知识，基础概念等。</p>
</div>
]]></content>
    <published>2025-03-29T17:59:37.000Z</published>
  </entry>
  <entry>
    <title type="text">Bun 学习笔记</title>
    <id>https://mo7.cc/coder/javascript/bun_ready.html</id>
    <link href="https://mo7.cc/coder/javascript/bun_ready.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>Bun 和 NodeJs 都是 JavaScript 运行时。Bun 支持 TypeScript 直接运行。而且具有更快的运行速度。<br>
并且官方文档声称其和 NodeJs 完全兼容，并且同时支持 <code>CommonJS</code> 和 <code>ESModule</code> 。</p>
<p>好吧，更快的执行和启动速度，完全兼容旧模组，听起来很是完美。<br>
并且， Vue 、 Vite 、 VitePress 官方文档已经出现了 Bun 命令启动示例。也就是说，Vue 生态已经全面拥抱 Bun 。</p>
<p>并且，Bun 没有历史负担，社区和 Github 非常活跃。我们没有任何理由拒绝学习这么一个全新的，可以投入生产的，优先的 JavaScript RunTime 。</p>]]></summary>
    <content type="html"><![CDATA[
<p>Bun 和 NodeJs 都是 JavaScript 运行时。Bun 支持 TypeScript 直接运行。而且具有更快的运行速度。<br>
并且官方文档声称其和 NodeJs 完全兼容，并且同时支持 <code>CommonJS</code> 和 <code>ESModule</code> 。</p>
<p>好吧，更快的执行和启动速度，完全兼容旧模组，听起来很是完美。<br>
并且， Vue 、 Vite 、 VitePress 官方文档已经出现了 Bun 命令启动示例。也就是说，Vue 生态已经全面拥抱 Bun 。</p>
<p>并且，Bun 没有历史负担，社区和 Github 非常活跃。我们没有任何理由拒绝学习这么一个全新的，可以投入生产的，优先的 JavaScript RunTime 。</p>
<p>官方文档: <a href="https://bun.sh" target="_blank" rel="noopener noreferrer">https://bun.sh</a><br>
中文文档: <a href="https://bun.dev.org.tw" target="_blank" rel="noopener noreferrer">https://bun.dev.org.tw</a></p>
<p><strong>下面是 Vue、Vite、VitePress 最新的安装文档，可以看到全部支持了 Bun，并且可用于生产</strong></p>
<p>Vue: <a href="https://cn.vuejs.org/guide/quick-start.html" target="_blank" rel="noopener noreferrer">https://cn.vuejs.org/guide/quick-start.html</a><br>
Vite: <a href="https://cn.vitejs.dev/guide" target="_blank" rel="noopener noreferrer">https://cn.vitejs.dev/guide</a><br>
VitePress: <a href="https://vitepress.dev/zh/guide/getting-started" target="_blank" rel="noopener noreferrer">https://vitepress.dev/zh/guide/getting-started</a></p>
<h2>安装</h2>
<p><strong>macOS and Linux</strong></p>
<blockquote>
<p>Linux 内核版本 &gt;= 5.6 , 并且需要 <code>unzip</code> 套件</p>
</blockquote>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">curl</span> <span class="token parameter variable">-fsSL</span> https://bun.sh/install <span class="token operator">|</span> <span class="token function">bash</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>Windows( &gt;=Win10 )</strong></p>
<div class="language-powershell line-numbers-mode" data-highlighter="prismjs" data-ext="powershell"><pre><code class="language-powershell"><span class="line">powershell <span class="token operator">-</span>c <span class="token string">"irm bun.sh/install.ps1|iex"</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><strong>npm</strong></p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">npm</span> <span class="token function">install</span> <span class="token parameter variable">-g</span> bun</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><blockquote>
<p>一般推荐使用 npm 安装，因为现阶段是无法完全脱离 NodeJs 环境的。需要学习 Bun 的人，设备上一定会有 NodeJs</p>
</blockquote>
<p>官方安装文档 <a href="https://bun.dev.org.tw/docs/installation" target="_blank" rel="noopener noreferrer">https://bun.dev.org.tw/docs/installation</a></p>
<h2>Cli 命令详解</h2>
<p>命令行输入 run 可以看到常用命令</p>
<figure><figcaption>Bun命令</figcaption></figure>
<p>我们可以发现， bun 不需要用到 npm yarn 或者是 pnpm 这些 包管理器，它直接使用<br>
<code>bun run</code>, <code>bun install</code>, <code>bun add</code> 等命令来管理项目依赖。</p>
<p>而且可以直接使用 <code>bun xxx.ts</code> 来解析和执行 Typescript 文件，不需要安装其它依赖。</p>
<p>使用 <code>bun x</code> 或者 <code>bunx</code> 来替代 <code>npx</code> 命令。 <a href="https://bun.dev.org.tw/docs/cli/bunx" target="_blank" rel="noopener noreferrer">bunx</a></p>
<p>而且内置 <code>bun test</code> 命令来执行单元测试，不需要安装<code>Jest</code>等模块 。<a href="https://bun.dev.org.tw/docs/cli/test" target="_blank" rel="noopener noreferrer">bun test</a></p>
<p>还有 <code>bun build</code> 命令，可以直接将一整个 js 项目进行离线打包，不需要安装<code>webpack</code>、<code>rollup</code> 等模块。</p>
<p>更多的 cli 命令和文档可以参照: <a href="https://juejin.cn/post/7327479054952398887" target="_blank" rel="noopener noreferrer">超越 Node.js：Bun 的创新与突破</a></p>
<blockquote>
<p>在学习 Bun 的 Cli 命令过程中，它给我一种非常熟悉的感觉，那就是 Go 语言。<br>
众所周知，Go 现在是一门非常成熟的编程语言，它的设计者更是大名鼎鼎，没有任何一门语言比 Go 语言更简单易学。<br>
之前一直在使用 NodeJs ，自它诞生以来出现了形形色色的补丁和工具以及生态，天下苦 Js 久已，于是 TypeScript 大火。<br>
但是 Bun 的问世和设计让我觉得，这才是一个真正的 Js 运行时该有的样子。</p>
</blockquote>
<h2>Bun 使用国内镜像：</h2>
<p><code>~/.bunfig.toml</code> 文件中写入如下内容：</p>
<div class="language-toml line-numbers-mode" data-highlighter="prismjs" data-ext="toml"><pre><code class="language-toml"><span class="line"><span class="token punctuation">[</span><span class="token table class-name">install</span><span class="token punctuation">]</span></span>
<span class="line"><span class="token key property">registry</span><span class="token punctuation">=</span><span class="token string">"https://registry.npmmirror.com"</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><blockquote>
<p>实测，使用翻墙工具进行代理比使用 国内镜像 要流畅很多。</p>
</blockquote>
<h2>将 Bun 用于生产环境</h2>
<p>2023 年 9 月，bun 发布 1.0<br>
2024 年 3 月发布 1.1 支持 Windows<br>
直到 2024 年 12 月 17 日，Bun 的最新版本号为 1.1.38 ，<a href="https://github.com/oven-sh/bun/releases" target="_blank" rel="noopener noreferrer">bun-releases</a>上显示它几乎是一个月发布一个新版本，每次更新都会修复大量的已知 BUG，而且会有多位开源贡献大佬参与其中，社区也非常跃度。<br>
主分支的代码几乎是每天都在提交和更新。</p>
<p>再加上 Vue 生态对 bun 的全面拥抱，以及 1.1 之后的 近一年时间的迭代与修复，我觉得当下就是使用 bun 最好的时机。</p>
<p>我自己试了一下，将手头现有的两个 Vue 项目换成了 Bun。几乎是无缝切换，目前没出现啥问题。</p>
<p>具体做法如下:</p>
<ol>
<li>删除 node_modules 和 pnpm-lock.yaml</li>
<li><code>pnpm install</code> 换成 <code>bun install</code></li>
<li><code>pnpm add &lt;package&gt;</code> 换成 <code>bun add &lt;package&gt;</code></li>
<li><code>pnpm run dev/build</code> 换成 <code>bun run dev/build</code></li>
<li><code>pnpm dlx &lt;package&gt;</code> 换成 <code>bunx &lt;package&gt;</code></li>
</ol>
<blockquote>
<p>我想吐槽一下子，这里第一次执行 <code>bun install</code> 时感觉比 <code>pnpm install</code> 慢很多，直到我开启了代理后 速度直接秒杀 <code>pnpm install</code><br>
而且 dev/build 的速度明显提升了非常多。</p>
</blockquote>
<p>如果在遇到 <code>bun install</code> 和 <code>bun add</code> 命令卡住的时候，可以加上 <code>--no-cache</code> 参数。(我觉得这是一个官方 BUG)</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">bun <span class="token function">install</span> --no-cache</span>
<span class="line">bun <span class="token function">add</span> <span class="token operator">&lt;</span>package<span class="token operator">&gt;</span> --no-cache</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 也可以选择清除缓存</span></span>
<span class="line">bun pm cache <span class="token function">rm</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><blockquote>
<p>遇到异常可以直接手动删除 <code>~/.bun/install/cache</code> 目录，这是 <code>bun install &lt;package&gt;</code> 的全局缓存目录。</p>
</blockquote>
]]></content>
    <published>2024-12-16T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">RIA 拆书阅读法</title>
    <id>https://mo7.cc/self_manage/ria_f_read.html</id>
    <link href="https://mo7.cc/self_manage/ria_f_read.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>R (Reading) -&gt; 知识的输入(分析整合信息)<br>
I (Interpretation) -&gt; 知识的内化(追问和反思经验)<br>
A (Appropriation) -&gt; 知识的应用(内化和应用知识)</p>
<h2>R-阅读</h2>
<p>阅读并摘录原文。<br>
遇到某一个启发片段，停下来，划出来。</p>
<h2>I-加深理解</h2>
<p>针对摘录的原文，用自己的话进行复述，写出自己的理解。</p>
<h2>A-致用</h2>
<p>针对自己的理解</p>
<p>A1： 写下和这个知识有关的自己的经验，回顾自己有没有过类似的经历或见闻。通过反思自己的相关经验，让这个知识真的和自己有关。<br>
A2：写下针对这个知识自己可以如何进行下一步行动今后如何应用，让知识真的在自己的生活中发挥作用。</p>]]></summary>
    <content type="html"><![CDATA[
<p>R (Reading) -&gt; 知识的输入(分析整合信息)<br>
I (Interpretation) -&gt; 知识的内化(追问和反思经验)<br>
A (Appropriation) -&gt; 知识的应用(内化和应用知识)</p>
<h2>R-阅读</h2>
<p>阅读并摘录原文。<br>
遇到某一个启发片段，停下来，划出来。</p>
<h2>I-加深理解</h2>
<p>针对摘录的原文，用自己的话进行复述，写出自己的理解。</p>
<h2>A-致用</h2>
<p>针对自己的理解</p>
<p>A1： 写下和这个知识有关的自己的经验，回顾自己有没有过类似的经历或见闻。通过反思自己的相关经验，让这个知识真的和自己有关。<br>
A2：写下针对这个知识自己可以如何进行下一步行动今后如何应用，让知识真的在自己的生活中发挥作用。</p>
<p>新学的方法与我以前的方法有何异同？<br>
结合新方法接下来我可以在哪些方面做提升？<br>
我如何应用新学到的理论方法来分析某一事件？(如热点等)</p>
<h2>结合费曼学习法</h2>
<ol>
<li>发现一个概念，并写下来；
<ul>
<li>新建一个 Markdown 写下标题和主旨</li>
<li>拿出一张纸写下标题</li>
</ul>
</li>
<li>把概念教给别人，讲出来；
<ul>
<li>找个学习搭子</li>
<li>对着小黄鸭讲(小黄鸭调试法)</li>
<li>录音，视频等</li>
</ul>
</li>
<li>回顾自己的经验，继续梳理概念；带着问题去不断推导。
<ul>
<li>口述概念的时候遇到问题了，就进行回顾</li>
<li>回顾完毕继续讲</li>
</ul>
</li>
<li>找出难以理解的地方，简化输出
<ul>
<li>比如整理成这册，写一篇文章并发表</li>
</ul>
</li>
</ol>
<p>简化一下就是： 学习 -&gt; 输出 -&gt; 回顾 -&gt; 凝练 -&gt; 存档</p>
<h2>总结</h2>
<p>阅读一本书的步骤就可以拆分为：</p>
<ol>
<li>通读并标记原文</li>
<li>问题总结(书籍本身可以帮你解决什么问题)</li>
<li>核心概念和观点提炼</li>
<li>结合每一个小概念进行费曼学习</li>
<li>输出凝练观点</li>
</ol>
]]></content>
    <published>2024-12-05T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">GoLibrary</title>
    <id>https://mo7.cc/coder/go/library/</id>
    <link href="https://mo7.cc/coder/go/library/"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>Go 语言 的 常用 Library 文档笔记。</p>
<p><a href="https://cloud.tencent.com/developer/article/2342050" target="_blank" rel="noopener noreferrer">https://cloud.tencent.com/developer/article/2342050</a></p>
<p><a href="https://pkg.go.dev/std" target="_blank" rel="noopener noreferrer">https://pkg.go.dev/std</a></p>]]></summary>
    <content type="html"><![CDATA[
<p>Go 语言 的 常用 Library 文档笔记。</p>
<p><a href="https://cloud.tencent.com/developer/article/2342050" target="_blank" rel="noopener noreferrer">https://cloud.tencent.com/developer/article/2342050</a></p>
<p><a href="https://pkg.go.dev/std" target="_blank" rel="noopener noreferrer">https://pkg.go.dev/std</a></p>
<p><a href="https://studygolang.com/pkgdoc" target="_blank" rel="noopener noreferrer">https://studygolang.com/pkgdoc</a></p>
<p><a href="https://go.p2hp.com/doc/" target="_blank" rel="noopener noreferrer">https://go.p2hp.com/doc/</a></p>
]]></content>
    <published>2024-12-03T09:56:33.000Z</published>
  </entry>
  <entry>
    <title type="text">友链</title>
    <id>https://mo7.cc/about/friend_links.html</id>
    <link href="https://mo7.cc/about/friend_links.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
]]></summary>
    <content type="html"><![CDATA[
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">关于我</title>
    <id>https://mo7.cc/about/me.html</id>
    <link href="https://mo7.cc/about/me.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<h2>墨七(<em>Mo7</em>)</h2>
<p>我叫『墨七』，一名非典型程序员。热爱编程，喜欢拥抱新技术，妄图改变世界，企图让世界因我而美好。</p>
<p>一名全站工程师，在多个开发领域都有着比较丰富的开发经验。</p>
<blockquote>
<p>墨七 , mo7 , Mo7</p>
</blockquote>
<h2>关于爱好</h2>
<p>写代码给我带来过很多快乐，也曾在我内心最悲伤的时候陪伴我走出阴影。</p>
<p>经常会突发奇想，喜欢自己设计构想，然后自己动手实现的那种成就感。写出来的东西被大家认可也会给我带来极大的满足感。</p>
<p>编码上头时，可以十几个小时不吃不睡依然精神；但也会一口气睡上十几个小时雷打不动(睡眠质量特别高，躺床上 10 分钟就没了意识，深度睡眠基本都在 4 小时往上)。</p>]]></summary>
    <content type="html"><![CDATA[
<h2>墨七(<em>Mo7</em>)</h2>
<p>我叫『墨七』，一名非典型程序员。热爱编程，喜欢拥抱新技术，妄图改变世界，企图让世界因我而美好。</p>
<p>一名全站工程师，在多个开发领域都有着比较丰富的开发经验。</p>
<blockquote>
<p>墨七 , mo7 , Mo7</p>
</blockquote>
<h2>关于爱好</h2>
<p>写代码给我带来过很多快乐，也曾在我内心最悲伤的时候陪伴我走出阴影。</p>
<p>经常会突发奇想，喜欢自己设计构想，然后自己动手实现的那种成就感。写出来的东西被大家认可也会给我带来极大的满足感。</p>
<p>编码上头时，可以十几个小时不吃不睡依然精神；但也会一口气睡上十几个小时雷打不动(睡眠质量特别高，躺床上 10 分钟就没了意识，深度睡眠基本都在 4 小时往上)。</p>
<p>喜欢篮球，曾是校队成员；喜欢电影、游戏、美食、阅读和思考。喜欢创造，喜欢看着自己亲手建立的东西一点点完善。</p>
<p>喜欢玩原神、星际争霸、在 Steam 上体验各种大作。曾经的暴雪粉。</p>
<h2>关于理想</h2>
<p>愿世界和平，愿所有的种子都能开花结果，愿有情人终成眷属，愿好人一生平安。</p>
<p>但愿望终归只是愿望，我唯一能做的事情就是在目之所及之处做到最好，在自己能力范围之内发挥自己所长帮助更多的人。</p>
<h2>关于本站</h2>
<p>关于更多信息可阅读 <a href="/about/%E5%85%B3%E4%BA%8E%E6%9C%AC%E7%AB%99.html" target="_blank">关于本站</a></p>
<p>在日常的工作和学习当中我积累了大量的经验、知识和技巧，他们被我用 md 记录了下来存储在 Github 的私人仓库之上。</p>
<figure><figcaption></figcaption></figure>
<p>并且还有一些想法，想要表达的思想和观点等。我不太愿意将这些东西公布在各种公众平台之上，因为当我的知识变成了数据，那么这些数据的安全和版权应当由我自己负责。</p>
<p>写博客，并不仅仅只是为了表达，更是一种<code>记忆</code>和<code>修身养性</code>的方式，让自己浮躁的生活跟心情沉淀下来的一种手段。我希望过个七年八年的，再回首打开这个站点的时候，它能变成一种财富和寄托。</p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">关于本站</title>
    <id>https://mo7.cc/about/website.html</id>
    <link href="https://mo7.cc/about/website.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<h2>前言</h2>
<p>我基于 <a href="https://theme-hope.vuejs.press" target="_blank" rel="noopener noreferrer">ThemeHope</a> 这款主题做了一些魔改，包括样式以及功能。每一处修改均以插件的形式进行了封装，现在已经开源并发布。<br>
Github 仓库地址: <a href="https://github.com/mo7cc/blog-source" target="_blank" rel="noopener noreferrer">https://github.com/mo7cc/blog-source</a></p>]]></summary>
    <content type="html"><![CDATA[
<h2>前言</h2>
<p>我基于 <a href="https://theme-hope.vuejs.press" target="_blank" rel="noopener noreferrer">ThemeHope</a> 这款主题做了一些魔改，包括样式以及功能。每一处修改均以插件的形式进行了封装，现在已经开源并发布。<br>
Github 仓库地址: <a href="https://github.com/mo7cc/blog-source" target="_blank" rel="noopener noreferrer">https://github.com/mo7cc/blog-source</a></p>
<blockquote>
<p>注: 本站并非开源，但是我写了一个同步脚本，会定期将博客的源码同步至上述公开仓库中。通过上述仓库中的源码可以顺畅编译出本博客的全部公开内容。</p>
</blockquote>
<blockquote>
<p>本博客搭建的技术细节可以参考: <a href="/misc/vuepress-hope/" target="_blank">本博客搭建指南</a></p>
</blockquote>
<h3>顶栏和音乐播放器</h3>
<p>这是顶部的一些下拉菜单，其中画板下拉菜单可以更改主题和全屏浏览。</p>
<p>我基于 <a href="https://aplayer.js.org" target="_blank" rel="noopener noreferrer">APlayer</a> 开发了一款全局的音乐播放器。可以通过顶部导航栏右上角的 </p>
<figure><figcaption>顶部菜单 和 播放器 </figcaption></figure>
<p>还做了一个<a href="/about/%E7%AB%99%E7%82%B9%E5%9C%B0%E5%9B%BE.html" target="_blank">站点地图页面</a>，可以直接访问本站已经发布的所有文章列表。</p>
<h3>宽屏兼容</h3>
<figure><figcaption>宽屏兼容</figcaption></figure>
<p>因为家里的屏幕是 21:9 的，但是主题的内容部分却依然是 窄窄的 一长条，空白地方留了很多，感觉很空旷，所以自己做了一个内容部分的宽屏兼容，适配更大的分辨率。</p>
<h3>夜晚模式</h3>
<p>尝试了很多很多的背景，调色，这一版的夜晚模式我非常满意。在白天模式和夜晚模式使用了不同的动态背景。第一版背景切换非常消耗性能。后来做了优化，现在切换非常流畅，内存占用非常低。</p>
<figure><figcaption>夜晚模式</figcaption></figure>
<h3>评论区</h3>
<p>评论区设置了发布频率限制，允许不登录匿名留言，支持 Markdown 语法，支持图片上传，支持预览和 Emoji 表情。</p>
<figure><figcaption>评论区截图</figcaption></figure>
<h2>缘起</h2>
<p>我最初学编程的目的就是为了能够拥有一个属于自己的网站，我觉得那会很酷，仿佛自己的心声可以被全世界所听到。我觉得程序员很酷，因为我觉得每一个程序员都拥有足以改变世界的力量。</p>
<p>时代变化如此之快，还没等我自己的第一行代码上线运行，微博，知乎，简书等各大平台如同雨后春笋一样拔地而起，互联网时代就在我身边悄然而至，这些应用也在悄然的改变我们每一个人的思考和生活方式。<br>
虽然后面也在各大互联网头部企业担任过技术骨干，回头再望发现自己只不过是沧海一粟。</p>
<h2>缘落</h2>
<p>我们细数一下，在当前时代如果你想从零搭建一个自己可以完全操控的稳定的站点，需要哪些知识和技巧:</p>
<ol>
<li>通过域名商购买符合自己心意的域名。</li>
<li>通过云计算服务商购买符合自己心意的服务器（此时你需要最基本的计算机基础知识，和 Linux 最基本的操作技巧以及处理操作系统常见问题的能力。）</li>
<li>了解基本的 HTTP 原理。</li>
<li>掌握 HTML、javascript、css 网页编辑语言，掌握常见的开发调试技巧。</li>
<li>如果你想让数据流动起来，你需要掌握一门服务器编程语言和最基本的数据库操作使用方法。</li>
</ol>
<!-- > 查看[本站用到的相关技术](../favorite/links/document.md)。 -->
<blockquote>
<p>除此之外，网站的运营还涉及到 SEO ，流量推广，PWA 等等知识。如果你在中国大陆，想让自己的站点稳定的运行，还得了解基本的法律法规和管理条例以及备案技巧。</p>
</blockquote>
<p>如果你想让它变得内容变得更加丰富，界面变得更加生动，访问速度更快，或者功能性更强。<br>
你还得深入掌握更多更加专业的知识或者技巧。如果想要让站点能够与时俱进，得保证技术的更迭和软件的维护。随着功能越来越多，所需要的各种专业知识也将更多。</p>
<blockquote>
<p>当然我们这里的讨论排除掉各种站点的速成框架以及集成化的方案，这种囫囵吞枣式的搭建方式都带有铜臭味。毕竟作为程序员，对技术还是需要一点点小资品位的。</p>
</blockquote>
<p>大到淘宝、Facebook，小到个人站点，他们所需要的最基本的技术和配置都差不多，只是所需要的深浅不太一样。随着技术大牛们的努力和开源世界的慷慨，这些事情都会越来越容易的。</p>
<h2>需求</h2>
<p>在最初，我是采用下面这种方式去记录自己的日常工作和学习的:</p>
<figure><figcaption>这是图片</figcaption></figure>
<p>后来还用过飞书、Excel、各种 ToDo 软件等。还是觉得 <code>Vscode + Markdown</code> 的方式最好(吊打一切笔记软件)。方便阅读、方便修改、简单、兼容性好。一次编写可以很轻松的在各种格式下进行转换，属于文档当中的【基本单元】。不管是 Word、还是 Excel，如果没有特定的软件读取则无法访问。并且由于商业竞争，它们对其它软件的兼容性都很差强人意，格式转换时也会出现排版混乱等情况。 Markdown 则不同，它排版简单，使用方便，长什么样子完全取决于如何解析，不同主题下可以可以拥有不同的观感，排版也不会混乱。包括我的个人资料，文件，文档，心得体会，和一些日常的小记录等我全都采用 md 去记录的。</p>
<p><a href="https://markdown.com.cn" target="_blank" rel="noopener noreferrer">Markdown</a> 中图片的处理会比较麻烦，传统的例如 word 等文件格式它会将图片一起打包到文件中，但是在 md 当中图片更像是文档的<code>依赖文件</code>，是游离于文字之外的东西，除非你使用网络图片。我研究了各种图床，但是都存在各种限制。免费的图床很多，但是想要使用方便、免费、访问速度，稳定安全等因素兼得，实在是太难了。于是我最终选择了自己开发一个图床服务。</p>
<h2>Hexo</h2>
<p><a href="https://hexo.io/" target="_blank" rel="noopener noreferrer">Hexo</a> ，这是我在经过认真对比后采用的博客构建工具，主题丰富，生态完善，采用 md 编写内容，基于 node 和 npm ，上手简单快捷。但是用起来总有不舒服的点:</p>
<blockquote>
<p>热更新速度慢，静态资源路径的识别无法跟编辑器很好的兼容，框架想要进行二次编码和修改只能使用最原始的 css 和 js 覆盖，想要集成 less 或者 ts 等现代前端工具需要自己编写和配置很多东西。</p>
</blockquote>
<p><a href="https://github.com/mo7-history/hexo-blog" target="_blank" rel="noopener noreferrer">Hexo 博客项目源码</a></p>
<h2>VuePress</h2>
<p>后来发现了 <a href="https://v2.vuepress.vuejs.org" target="_blank" rel="noopener noreferrer">VuePress</a> ，在仔细体验后，大爱！ 因为是基于 vite ，所以可以做到在编写 md 时几乎无感的热更新速度，保存之后页面无刷新渲染，使用体验媲美 VSCode 的本地预览！</p>
<p>基于 Vue 渲染引擎，Vite 的编译和打包，TypeScript，Sass 支持，包括 Vue 组件等。博客的开发体验跟 WebApp 达成了一致，比 Hexo 高出了好几个档次。虽然生态尚不成熟，但是却无法挡住其锋芒。</p>
<p>缺点是主题和插件稀少，很多东西都得自己手动开发。</p>
<h2>VuePress Theme Hope</h2>
<p>自己编写一款主题需要的细节和工作量是巨大的，我并不想投入那么多的时间和精力在这个上面。但是 VuePress 原本的默认主题又太过简陋。</p>
<p>在找寻许久后，我相中了 <a href="https://theme-hope.vuejs.press" target="_blank" rel="noopener noreferrer">ThemeHope</a> 这款主题，它的作者是 VuePress 团队的成员，其更新速度和稳定性以及扩展性从基因层面就得到了保证。</p>
<p>于是基于 Hope 主题进行了一些细微的调教，自己写了一些功能模块，才有了本站当前的模样。</p>
<p>在这里感谢 <a href="https://mister-hope.com" target="_blank" rel="noopener noreferrer">𝓜𝓻.𝓗𝓸𝓹𝓮</a> 为我们带来这么棒的主题及其配套的插件。</p>
]]></content>
    <published>2025-03-30T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">留言板</title>
    <id>https://mo7.cc/about/guestbook.html</id>
    <link href="https://mo7.cc/about/guestbook.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">™</p>
<div style="text-align:center">
<p>有什麽想説的？</p>
<p>有什麽想問的？</p>
<p>有什麽想吐槽的？</p>
<p>可以在下面留言...</p>
</div>
<div style="text-align:right">
<p><a href="https://mo7.cc" target="_blank" rel="noopener noreferrer">@墨七</a>。</p>
</div>
</div>]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">™</p>
<div style="text-align:center">
<p>有什麽想説的？</p>
<p>有什麽想問的？</p>
<p>有什麽想吐槽的？</p>
<p>可以在下面留言...</p>
</div>
<div style="text-align:right">
<p><a href="https://mo7.cc" target="_blank" rel="noopener noreferrer">@墨七</a>。</p>
</div>
</div>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">站点地图</title>
    <id>https://mo7.cc/about/catalog.html</id>
    <link href="https://mo7.cc/about/catalog.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<h2>本站全部文章索引</h2>
<hr>
<h3>关于</h3>
]]></summary>
    <content type="html"><![CDATA[
<h2>本站全部文章索引</h2>
]]></content>
    <published>2025-03-30T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">OtterTrade 文档站</title>
    <id>https://mo7.cc/misc/ot-doc_ready.html</id>
    <link href="https://mo7.cc/misc/ot-doc_ready.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p><strong>起源</strong></p>
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<p>有独立开发完成一个量化系统开发的人吗？ - 墨七的回答 - 知乎<br>
<a href="https://www.zhihu.com/question/35977425/answer/3001448431" target="_blank" rel="noopener noreferrer">https://www.zhihu.com/question/35977425/answer/3001448431</a></p>
</div>]]></summary>
    <content type="html"><![CDATA[
<p><strong>起源</strong></p>
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<p>有独立开发完成一个量化系统开发的人吗？ - 墨七的回答 - 知乎<br>
<a href="https://www.zhihu.com/question/35977425/answer/3001448431" target="_blank" rel="noopener noreferrer">https://www.zhihu.com/question/35977425/answer/3001448431</a></p>
</div>
<p>基于知乎的一篇回答建了一个群，拉起了一支团队，<br>
并成立了一个 <a href="https://github.com/otter-trade" target="_blank" rel="noopener noreferrer">Github 组织</a> ，<br>
然后大家一起研发了<a href="https://OtterTrade.com" target="_blank" rel="noopener noreferrer">OtterTrade.com</a> ，<br>
在最开始进行产品定位的时候，就要求主站必须精简、美观、大方、易使用。但是再怎么易使用，必要的文档说明是无法避免的。<br>
于是计划所有的解释说明的工作全部交给一个独立的文档站去承担。</p>
<p>文档站中包含了平台介绍，快速上手，系列教程，团队介绍，起源，愿景，规划等等等。可以说现阶段文档站的重要程度不亚于 <a href="http://OtterTrade.com" target="_blank" rel="noopener noreferrer">OtterTrade.com</a> 主站。在运营设计上，文档站有三个地址:</p>
<p>文档站(Github Pages)<br>
<a href="https://otter-trade.github.io" target="_blank" rel="noopener noreferrer">https://otter-trade.github.io</a></p>
<details class="hint-container details"><summary>宣发主站</summary>
<p><code>Github Pages</code> 的好处是完全免费，且不用担心服务器挂掉，或者出什么问题，维护简单，没有任何成本。而且 <code>github.io</code> 具有高度的辨识性，不用担心会被封禁。所以这个地址将会作为将来的宣发主站。</p>
<p>缺点是国内访问速度可能略慢。</p>
</details>
<p>文档站(新加坡备用地址)<br>
<a href="https://doc.OtterTrade.com" target="_blank" rel="noopener noreferrer">https://doc.OtterTrade.com</a></p>
<p>文档站(国内备用地址)<br>
<a href="https://ot-doc.mo7.cc" target="_blank" rel="noopener noreferrer">https://ot-doc.mo7.cc</a></p>
<p>文档站是导航，是回家的路，所以安全可靠的访问途径非常重要。</p>
<h2>文档站的构成</h2>
<p>文档站的源码存放于 <a href="https://github.com/otter-trade/doc-otter-trade" target="_blank" rel="noopener noreferrer">https://github.com/otter-trade/doc-otter-trade</a> ，是个开源仓库，主体由 <a href="https://theme-hope.vuejs.press/zh/" target="_blank" rel="noopener noreferrer">vuepress-hope</a> 搭建。</p>
<p>其编译结果存放于 <a href="https://github.com/otter-trade/otter-trade.github.io" target="_blank" rel="noopener noreferrer">https://github.com/otter-trade/otter-trade.github.io</a> 仓库，因此可以直接利用 <a href="https://pages.github.com/" target="_blank" rel="noopener noreferrer">Github Pages</a> 的特性。</p>
<p>然后通过 <a href="https://cloud.tencent.com/developer/article/2151039" target="_blank" rel="noopener noreferrer">Webhooks</a> 机制同时部署在两台不同的服务器之上。</p>
<p>所以文档站的基本工作流就是:</p>
<ol>
<li>向 <a href="https://github.com/mo7cc" target="_blank" rel="noopener noreferrer">墨七</a> 申请 <a href="https://github.com/otter-trade/doc-otter-trade" target="_blank" rel="noopener noreferrer">doc-otter-trade</a> 和 <a href="https://github.com/otter-trade/otter-trade.github.io" target="_blank" rel="noopener noreferrer">otter-trade.github.io</a> 这两个仓库的权限；</li>
<li>利用 <code>git clone</code> 命令下载文档站源码；</li>
<li>在编写完对应文档之后，编译打包并推送至 <a href="https://github.com/otter-trade/otter-trade.github.io" target="_blank" rel="noopener noreferrer">otter-trade.github.io</a> 仓库完成发布。</li>
</ol>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token comment"># 克隆 文档站 源码到本地</span></span>
<span class="line"><span class="token function">git</span> clone git@github.com:otter-trade/doc-otter-trade.git</span>
<span class="line"><span class="token comment"># 用 Vscode 打开</span></span>
<span class="line">code ./doc-otter-trade</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>然后你就获得了如下界面</p>
<!-- ![OtterTrade文档站项目目录结构](./img/OtterTrade文档站项目目录结构.png) -->
<p>除此之外你可能还需要安装如下插件</p>
<!-- ![提升编写体验的基础插件](../misc/vuepress-hope/img/vuepress需要安装的基础插件.png) -->
<p>然后你就可以愉快的开始编写文档了！</p>
<h2>命令介绍</h2>
<p>在项目目录的 <code>./package.json</code> 文件中我提前编写了如下指令</p>
<div class="language-json line-numbers-mode" data-highlighter="prismjs" data-ext="json"><pre><code class="language-json"><span class="line"><span class="token punctuation">{</span></span>
<span class="line">  <span class="token comment">// ....</span></span>
<span class="line">  <span class="token property">"scripts"</span><span class="token operator">:</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">"dev"</span><span class="token operator">:</span> <span class="token string">"vuepress-vite dev src"</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token property">"build"</span><span class="token operator">:</span> <span class="token string">"vuepress-vite build src"</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token property">"clean-dev"</span><span class="token operator">:</span> <span class="token string">"vuepress-vite dev src --clean-cache"</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token property">"update-package"</span><span class="token operator">:</span> <span class="token string">"pnpm dlx vp-update"</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token property">"sync"</span><span class="token operator">:</span> <span class="token string">"./.vscode/shell/GitSync.sh"</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token property">"deploy"</span><span class="token operator">:</span> <span class="token string">"./.vscode/shell/Deploy.sh"</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token comment">// ....</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>使用方法如下:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">pnpm</span> run dev</span>
<span class="line"><span class="token comment"># 在本地启动该项目</span></span>
<span class="line"></span>
<span class="line"><span class="token function">pnpm</span> run build</span>
<span class="line"><span class="token comment"># 编译该项目</span></span>
<span class="line"></span>
<span class="line"><span class="token function">pnpm</span> run clean-dev</span>
<span class="line"><span class="token comment"># 清除所有的编译缓存，并启动项目，如果一些配置或者编写的文章没有生效则可以使用该指令</span></span>
<span class="line"></span>
<span class="line"><span class="token function">pnpm</span> run update-package</span>
<span class="line"><span class="token comment"># 更新项目依赖</span></span>
<span class="line"></span>
<span class="line"><span class="token function">pnpm</span> run <span class="token function">sync</span></span>
<span class="line"><span class="token comment"># 拉取 Github 上的最新改动，并保存和提交当前改动 同时 推送至 Github ，需要仓库权限</span></span>
<span class="line"></span>
<span class="line"><span class="token function">pnpm</span> run  deploy</span>
<span class="line"><span class="token comment"># 编译本项目并同时推送至  otter-trade.github.io 仓库， 然后将会自动完成项目的部署与发布, 需要仓库权限</span></span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>其它</h2>
<p>如果你想编写出华丽的可交互的文档可以查看和学习如下教程<br>
<a href="https://theme-hope.vuejs.press/zh/guide/markdown/intro.html" target="_blank" rel="noopener noreferrer">https://theme-hope.vuejs.press/zh/guide/markdown/intro.html</a></p>
<p>如果你想让文档具有更多功能可以学习如下教程<br>
<a href="https://theme-hope.vuejs.press/zh/guide/component/built-in.html" target="_blank" rel="noopener noreferrer">https://theme-hope.vuejs.press/zh/guide/component/built-in.html</a></p>
<h2>另外一种更新文档的方式</h2>
<!-- ![打开文档站，并点击 编辑此页](./img/直接使用github编辑1.png) -->
<!-- ![在github中提交改动](./img/直接使用github编辑2.png) -->
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">GFM 语法 Demo 的主标题</title>
    <id>https://mo7.cc/misc/gfm_lang_demo.html</id>
    <link href="https://mo7.cc/misc/gfm_lang_demo.html"/>
    <updated>2025-07-04T14:11:31.000Z</updated>
    <summary type="html"><![CDATA[<hr>
<h1>GFM 语法 Demo 的主标题</h1>
<p>Markdown 官方标准地址:<br>
<a href="https://markdown.com.cn" target="_blank" rel="noopener noreferrer">https://markdown.com.cn</a></p>
<p>GFM 语法文档(现阶段流行最广泛的事实标准):<br>
<a href="https://gfm.docschina.org/zh-hans/" target="_blank" rel="noopener noreferrer">https://gfm.docschina.org/zh-hans/</a></p>]]></summary>
    <category term="关于/about"/>
    <category term="资源收藏/bookmark"/>
    <category term="编程开发/coder"/>
    <category term="杂七杂八/misc"/>
    <category term="自我管理/self_manage"/>
    <category term="理论研究/theory"/>
    <published>2020-12-01T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">关于拖延症和行动力</title>
    <id>https://mo7.cc/self_manage/procrastination_and_action.html</id>
    <link href="https://mo7.cc/self_manage/procrastination_and_action.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<h2>拖延症成因</h2>
<p>拖延并不在外在的行为，而是深藏内心的<strong>恐惧</strong>与<strong>焦虑</strong>。<br>
拖延实际上是一种<strong>心理防御机制</strong>用于保护自己免受<strong>失败</strong>或<strong>压力</strong>的打击。<br>
当你面对一个重要的任务迟迟不愿开始时，可能并不是因为懒惰，而是因为<strong>害怕失败</strong>，担心无法达到自己或他人的<strong>期望</strong>。<br>
这种对失败的恐惧趋驱使自己选择<strong>逃避</strong>。<br>
拖延就成了一种暂时的<strong>减轻压力的方式</strong>。</p>]]></summary>
    <content type="html"><![CDATA[
<h2>拖延症成因</h2>
<p>拖延并不在外在的行为，而是深藏内心的<strong>恐惧</strong>与<strong>焦虑</strong>。<br>
拖延实际上是一种<strong>心理防御机制</strong>用于保护自己免受<strong>失败</strong>或<strong>压力</strong>的打击。<br>
当你面对一个重要的任务迟迟不愿开始时，可能并不是因为懒惰，而是因为<strong>害怕失败</strong>，担心无法达到自己或他人的<strong>期望</strong>。<br>
这种对失败的恐惧趋驱使自己选择<strong>逃避</strong>。<br>
拖延就成了一种暂时的<strong>减轻压力的方式</strong>。</p>
<h3>完美主义者尤其容易陷入拖延的陷阱</h3>
<p>完美主义者往往对自己设定了<strong>极高的标准</strong>，害怕自己无法达到这些<strong>标准</strong>而害怕被他人<strong>否定</strong>。<br>
为了<strong>避免</strong>面对可能的失败，<strong>选择拖延</strong>甚至宁愿不做，也不愿做的<strong>不够完美</strong>。<br>
这种<strong>要么不做，要么做到最好</strong>的心态，进一步加剧了拖延行为。</p>
<h3>家庭环境</h3>
<p>父母的<strong>高压</strong>要求和<strong>批评</strong>，会导致孩子对失败产生过度的<strong>敏感</strong>。<br>
成长以<strong>成功</strong>为导向的孩子可能会感到<strong>巨大的压力</strong>，害怕自己<strong>无法达到</strong>父母的期望，从而选择通过<strong>拖延来逃避</strong>这些压力。<br>
这种<strong>心理机制</strong>，随着年龄增长<strong>逐渐内化</strong>，成为成年后拖延行为的<strong>根源之一</strong>。</p>
<h3>社会环境</h3>
<p>在这个<strong>高度重视</strong>成功的社会，人们往往被<strong>灌输</strong>成功等于个人价值的观念。<br>
当个体无法达到社会所设定的<strong>高标准</strong>时，拖延便再一次成为了<strong>逃避失败</strong> <strong>保护自尊</strong>的手段。<br>
当面对那些看似<strong>无法完成</strong>的任务时，拖延成了一种<strong>应对压力</strong>和不确定性的 <strong>本能反应</strong> 。</p>
<h3>过高的期望和目标</h3>
<p>如果你本身很勤劳，有计划有目标，但是对自己的<strong>期望</strong>过高， 或者目标定的过于<strong>宏大</strong>，也会导致你丧失行动力。</p>
<h2>如何打破拖延</h2>
<p>我们一边<strong>责备</strong>自己，一边在无尽的拖延循环中<strong>沉沦</strong>。</p>
<p>要想摆脱拖延的<strong>恶性循环</strong>，单靠意志力<strong>远远不够</strong>。</p>
<p>需要从<strong>认知</strong>和<strong>行为</strong>两个方面入手，重新构建自己的<strong>思维方式</strong>，并采取切实可行的<strong>行动策略</strong>。</p>
<ol>
<li>
<p>正视内心的<strong>恐惧</strong>与<strong>焦虑</strong></p>
<p>我们要认识到拖延背后的<strong>恐惧</strong>，要学会更加<strong>理性</strong>和<strong>积极</strong>的方式看待这些情绪。<br>
当你因<strong>害怕失败</strong>而拖延时，提醒自己 ，<strong>失败</strong>只是学习和成长的一部分，是成功的<strong>必经之路</strong>。<br>
<strong>改变</strong>对失败的认知，可以帮助自己<strong>减轻心理负担</strong>，进而更加轻松的开始<strong>行动</strong>。</p>
</li>
<li>
<p>制定明确、可操作的<strong>目标</strong></p>
<p><strong>模糊的目标</strong>往往令人无从下手，容易导致<strong>拖延</strong>，将宏大的目标<strong>分解</strong>成具体的小任务。<br>
将目标分解成具体的步骤，给每个步骤设定必须完成的<strong>时间期限</strong>。比如把 30 分钟花在<strong>做</strong>某件事上，并保证不改变这个<strong>时间</strong>。<br>
具体，合理，务实的目标不仅更<strong>容易上手</strong>，也能下逐步完成任务的过程中建立<strong>成就感</strong>。打破拖延的<strong>循环</strong>。</p>
</li>
<li>
<p>列出自己的非<strong>计划表格</strong></p>
<p>合理的<strong>时间管理</strong>对克服拖延至关重要，制定一个详细的<strong>时间表</strong>，将任务按<strong>优先级</strong>排序，并为每项任务分配具体的<strong>时间段</strong>，在表中<strong>列出</strong>接下来的一周里所有你<strong>必须</strong>做的事情。<br>
把各项活动需要占用的时长<strong>标示出来</strong>，这张飞计划表中<strong>空白</strong>的部分就是还没有被安排的<strong>时间</strong>，就知道还有多少时间<strong>可以利用</strong>。通过这个表格可以慢慢<strong>学会</strong>确的<strong>预测</strong>一件事情需要<strong>花费</strong>多少时间。</p>
</li>
<li>
<p>学会<strong>拒绝</strong>与<strong>聚焦</strong></p>
<p>学会<strong>拒绝</strong>那些<strong>不符合</strong>核心目标的任务，将精力集中在<strong>真正重要</strong>的事情上。拖延有时是因为我们试图<strong>承担太多任务</strong>，学会<strong>优先处理</strong>重要的任务将有助于你<strong>减少不必要</strong>的拖延。</p>
</li>
<li>
<p>用正念减轻压力</p>
<p>我们把<strong>注意力</strong>放在自己的呼吸上，这时我们就会主动去感受<strong>呼吸的过程</strong>，并留意呼吸的感受以及<strong>我们的反应</strong>，我们还会注意到自己是否正在<strong>专心呼吸</strong>，一旦发现自己<strong>走神</strong>，我们就要有意识的把注意力<strong>带回</strong>到呼吸的过程。若没有保持<strong>正念</strong>，表面上我们<strong>安静的呼吸</strong>。但意识已经<strong>神游天际</strong>了。</p>
</li>
</ol>
<blockquote>
<p>拖延是一种<strong>普遍的</strong>行为，尽管我们可以通过<strong>各种策略</strong>应对拖延。但也不是一朝一夕就能<strong>彻底消除</strong>的，不过也<strong>不必</strong>过于<strong>苛责自己</strong>。我们要学会<strong>接受自己</strong>，<strong>理解</strong>拖延背后的心理机制并与之<strong>和平相处</strong>，按照自己的<strong>价值观</strong>去生活而不是<strong>强迫自己</strong>追求完美，或消除一切不完美</p>
</blockquote>
<h2>当一个时间赌徒</h2>
<p>就是咋吃一段时间内，只选一件事，然后下重注，压上自己所有的时间，不顾一切地去做。<br>
比如，截止日期是下个月，那么就压上你这一个月所有的时间，孤注一掷的去完成。不需要任何花里胡哨的时间管理方法，因为最简单的时间管理就是完全不管理。<br>
花尽一切可能的时间专心做好一件事情。<br>
只有时间上压倒性的投入，才能换来结果上压倒性的胜利。<br>
太多目标太多欲望，只会造成选择模糊和动力损耗。这是阻碍一个人行动力的根源。即便我们有能力实现所有目标，但是也几乎不可能达成所有目标。<br>
因为想要得到异于常人的结果，就得拥有异于常人的专注。这种专注分为【短时专注】和【长期专注】。<br>
短时专注就是当下的专注，做一件事时专心致志，心无旁骛。<br>
长期专注是指在较长的一段时间内，将核心的时间都投入到一件事，对目标的结果和信念坚定不移。<br>
想要做成一件事，这两种专注缺一不可，必须形成合力。<br>
很多人考研失败是因为缺乏对于学习任务的短时专注。很多人创业失败，是因为缺乏对于一个赛道的长期专注。<br>
拥有专心当下的能力很重要，而具备长期专一的定力更重要，因为我们付出的行动和我们得到的结果之间是有延迟的。想要的结果越好，需要等待的时间就越久。<br>
大多数人都期望得到期望的结果，有没有耐心等待。总是一边做，一边怀疑，短时间内得不到正反馈，就立刻陷入情绪内耗。<br>
所以，你一旦开始发疯式的开始做，用焚膏继晷的决心持续做其实赛道一点都不拥挤问题一点都不难。</p>
<p>当时间赌徒意味着你要放弃一些东西。<br>
比如，你决定了要好好学英语，可以彻底放弃公司的绩效奖金，每天到点下班，通勤路上随时随地看外快刊和听 TED，在午休时间被语料，那么你的英文水准一定会突飞猛进。</p>
<p>只要你不顾一切，把自己一个时期内的时间都压在一件核心事情上，孤注一掷，买定离手，不设退路，就在这件事情上死磕到底，在过程中不断精进与历练，就一定会带来革新性的改变。</p>
<blockquote>
<p>用自己的行动去见证时间的强大力量。所谓流水不争先，争的是涛涛不绝，坚定选择一条河道，用自己最大最强的势能，汹涌澎湃地奔向大海吧。<br>
本段来源: <a href="https://www.bilibili.com/video/BV1kcSZYwE8Q" target="_blank" rel="noopener noreferrer">https://www.bilibili.com/video/BV1kcSZYwE8Q</a></p>
</blockquote>
<h2>行动</h2>
<p>人的基因有一种设定，对模糊不清、不可名状的东西感到害怕。<br>
现实生活中行动力很糟糕的人。并不是懒惰，也并不是害怕要处理的事情本身。<br>
他们的恐惧是来自于任务的模糊性。<br>
行动力不足都来源于精确性的不足。<br>
普通人生活中几乎所有的不行都是由精确性的丧失开始的。</p>
<p>如果需要一件事情的发生，就需要去集齐这件事情发生的所有要素就行了。<br>
当你提高了对客观世界评估的精准性，一切你觉得遥不可及的事情都会变的很简单。</p>
<h2>10%目标定律</h2>
<p>无论在生活中想要什么，都要做 10 次尝试。大多数人连一次都不想尝试。<br>
而 10% 目标定律的意义就在于学会面对 90%的失败。<br>
如果今后做任何事情都愿意先尝试 10 次，那么其中一个必然会成功。</p>
<p>爱具体的人</p>
<p>做具体的事</p>
<p>愿意选择乐观，哪怕是错的，也不想选择悲观，即使是对的。</p>
<p>努力成为想成为的那种人，就算不成功，至少喜欢现在努力的自己。</p>
]]></content>
    <published>2024-09-12T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">重新认识番茄工作法</title>
    <id>https://mo7.cc/self_manage/tomodoro_technique.html</id>
    <link href="https://mo7.cc/self_manage/tomodoro_technique.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<h2>什么是番茄工作法</h2>
<p><a href="https://zh.wikipedia.org/zh-sg/%E7%95%AA%E8%8C%84%E5%B7%A5%E4%BD%9C%E6%B3%95" target="_blank" rel="noopener noreferrer">番茄工作法 wiki</a></p>
<p>25 分钟专注做一件事情 ， 休息 5 分钟 为一个 <strong>番茄时间</strong> 或者称之为 一个 <strong>番茄钟</strong>。<br>
完成 4 个番茄时间 休息 15-30 分钟，被称为 <strong>一组番茄时间</strong> 或者 <strong>一组番茄钟</strong>。<br>
这就是 <strong>番茄工作法</strong> 。</p>]]></summary>
    <content type="html"><![CDATA[
<h2>什么是番茄工作法</h2>
<p><a href="https://zh.wikipedia.org/zh-sg/%E7%95%AA%E8%8C%84%E5%B7%A5%E4%BD%9C%E6%B3%95" target="_blank" rel="noopener noreferrer">番茄工作法 wiki</a></p>
<p>25 分钟专注做一件事情 ， 休息 5 分钟 为一个 <strong>番茄时间</strong> 或者称之为 一个 <strong>番茄钟</strong>。<br>
完成 4 个番茄时间 休息 15-30 分钟，被称为 <strong>一组番茄时间</strong> 或者 <strong>一组番茄钟</strong>。<br>
这就是 <strong>番茄工作法</strong> 。</p>
<p>你需要一个<strong>计时器</strong>，或者闹钟，用于记录你的<strong>番茄时间</strong>。<br>
一份随时写下待办事项的<strong>活动清单</strong>，用于记录你所有你需要要做的事情或者计划。<br>
另外再准备一份<strong>今日待办</strong>工作计划表，用于记录你今天要完成的工作。<br>
一份用于记录原始数据的<strong>记录表</strong>。</p>
<p>除此之外，一个完整的番茄工作法体系有 6 个流程或者是目标</p>
<ol>
<li>
<p>必须制定 <strong>今日待办</strong></p>
<p>在第一个番茄时间里，明确自己要完成哪些任务，任务的优先顺序，先做什么，后做什么。<br>
每个任务需要多少番茄时间。<br>
超过一个番茄时间的大任务需要拆分成许多单独的番茄时间，不满一个番茄时间的多个小任务可以合并成一个番茄时间。</p>
</li>
<li>
<p>执行 <strong>今日待办</strong></p>
<p>这个过程中要对抗各种内部或者外部的干扰，尽量完成完整的番茄时间<br>
如果被打断了，这个番茄时间就不成立，称之为一个 <strong>烂番茄</strong>。<br>
打开计时器设定一个 25 分钟的倒计时，从 <strong>今日待办</strong> 中的第一个任务开始工作。<br>
这 25 分钟内不可以做当前任务外的任何事情， 也不可以被其他人或事打断或者打扰，否则这就是一个 <strong>烂番茄</strong> ，你需要重新开始计时。<br>
一个番茄时间结束后在后面打上一个 x ，接下来的 3-5 分钟不可以做任何根当前工作相关的事情。可以喝点儿，吃点，走一走，和周围人聊聊天。<br>
休息完成后重复以上步骤，开始第二个番茄时间，直到第四个番茄结束开始进入长时间休息。休息 15-30 分钟，这期间不能给大脑增加任何负担。<br>
<strong>今日待办</strong> 中完成一项任务就划掉这个任务。<br>
如果当前番茄时间没有结束，那就回顾和检查刚才的工作。<br>
如果任务结束当前的番茄才进行了不到 5 分钟，那就把这个番茄时间作废。<br>
如此往复直到一天的工作结束。</p>
</li>
<li>
<p>需要根据任务完成情况，记录每个任务实际使用的番茄时间。</p>
<p>最好是在任务开始之前先估测将要使用的番茄数，然后再任务完成之后记录实际使用的番茄数，然后在统计出差值，包括任务的开始时间，结束时间，中间被打断了几次等。并把这些数据统计到 <strong>记录表</strong> 中 。</p>
</li>
<li>
<p>复盘</p>
<p>需要结合自己在第一步中制定的番茄工作计划，以及在第三步中实际记录的番茄时间对比、复盘、分析对改进自己的工作有用的信息。<br>
比如我在哪些地方花费了比原先计划更多的番茄时间，哪些任务超时了，超时的原因是什么。<br>
产生了多少烂番茄。 <strong>烂番茄</strong> 是内因还是外因造成的。</p>
</li>
<li>
<p>根据复盘中得出的经验，灵活的制定你的番茄时间计划表。</p>
<p>比如，你发现自己下午效率更高上午其实一般，可以把上午做的番茄时间移动两个到下午。<br>
这种调整也是可以根据具体的事情。或者实际可以利用的时间来调整，从而形成一段时间内的 <strong>番茄工作计划表</strong> 。</p>
</li>
<li>
<p>在完成了前面任务的情况下寻找到个人目标，并且利用番茄工作法节省出来的时间来实现。</p>
<p>这个是最近几年番茄工作法官方加上的一些额外内容。这个和番茄工作法本身是无关的，但是它使得<strong>番茄工作法</strong> 更加完善。</p>
</li>
</ol>
<p>整个番茄工作法可以区分为 <strong><code>计划 -&gt; 执行 -&gt; 复盘</code></strong> 三个不断循环的环节，从而形成了一个完整的番茄工作体系。<br>
这其中我认为制定计划和进行复盘对于番茄工作法来说是更加重要的。</p>
<div class="hint-container note">
<p class="hint-container-title">注</p>
<p>如果能在 25 分钟专注做一件事情并且不受打扰，这将是一个美好的开始。如果能坚持无数个这样的 25 分钟，那么你几乎可以做成所有的事情。</p>
</div>
<p>时间具有生成性和事件的连续性两个特点。我们有了具体的日期，时、分、秒的定义，才有了迟到、DeadLine 等概念，也才有了随之而来的时间流逝感、焦虑感。<br>
如果我们用一个个的具体事件去衡量，吃饭、洗澡、背一篇文章 时间的连续性带来的焦虑感就会减少。</p>
<p>番茄时钟就是利用这种基本原理来减少焦虑感。</p>
<p>还有一部分焦虑来自内外部的频繁打断。</p>
<p>内部因素主要来自于自己。神奇的大脑和身体机能有的时候会突然冒出一个奇妙的想法，比如突然饿了，或者突然想知道陈奕迅的下一场演唱会什么时候开，那么就在 <strong>活动清单</strong> 中记录一下 想法。<br>
如果这件事情今天或者待会儿就得完成，在今日待办中的 <strong>今日待办</strong> 里面添加一行，然后继续当前的工作。<br>
如果这件事不一定要今天做，那就写进 <strong>活动清单</strong> 并标注截止日期。<br>
如果是来自于外部的打断，我们需要做的就是快速记录，推迟打断你的这件事。</p>
<p>为每一个 <strong>活动清单</strong> 来进行番茄时间的估算，如果一项任务需要 5-7 个番茄数，那就拆分为小任务。<br>
如果多个任务估算值小于一个番茄数，则可以酌情整合在一个番茄时间内完成。<br>
更精确的番茄数估算，可以方便我们把 <strong>活动清单</strong> 的任务合理安排到 <strong>今日待办</strong> 中。<br>
总体任务不超过当日可用番茄数，完成一个番茄，打上一个 x，完成一项任务划掉它。<br>
如果一项任务完成后发现预估番茄数还有剩余，那么就记录一下留作复盘。</p>
<p>一天的工作结束后，记得复盘。长期坚持尽量让预估越来越准确。</p>
<h2>番茄工作法与拖延症</h2>
<p>在上一篇 <a href="/self_manage/1.%E6%8B%96%E5%BB%B6%E7%97%87%E4%B8%8E%E8%A1%8C%E5%8A%A8%E5%8A%9B.html" target="_blank">拖延症与行动力</a> 一文中，我们知道想要带打破拖延有五个行动策略：</p>
<ol>
<li>正视内心的<strong>恐惧</strong>与<strong>焦虑</strong></li>
<li>制定明确、可操作的<strong>目标</strong></li>
<li>列出自己的非<strong>计划表格</strong></li>
<li>学会<strong>拒绝</strong>与<strong>聚焦</strong></li>
<li>用正念减轻压力</li>
</ol>
<p>抛开第一条不谈，番茄工作法仿佛是专门针对 第 2~5 条 进行设计的。而且我们一旦开始按照番茄工作法开始执行了，那么第一条也会随着时间得以缓解。</p>
<p>番茄工作法需要罗列 <strong>活动清单</strong> ;<br>
番茄工作法需要划分出今天需要明确执行的任务也就是 <strong>今日待办</strong> ;<br>
番茄工作法在执行过程中需要集中注意力并且不允许被打断 ;<br>
番茄工作法在执行过程中要求你必须 <strong>专注与聚焦</strong> ，哪怕是胡思乱想也算是打断 ;<br>
番茄工作法每 25 分钟要求你休息一次，并且这期间不允许进行和思考任何与工作相关的事情。</p>
<p>这在我看来，番茄工作法简直就是专为 <strong>拖延症</strong> 而设计的。</p>
<p>制定良好的合适的 <strong>番茄计划</strong> ，把一个任务拆分成多个步骤，并且预估好合适的工作时间，可以有效的帮助我们更好的去协调自己的生活和理想。尤其是面对一大堆的琐碎的任务，一张合理的 <strong>番茄计划表</strong> 可以让我们不再焦虑，并提高工作效率。</p>
<p>按照 <strong>番茄工作法</strong> 一条条的去执行。在一个个 <strong>番茄时间</strong> 中不断的树立信心与积累 <strong>成就感</strong>，从而让我们做事越来越主动和高效。<br>
当现实的问题全部被转换成一条条 <strong>番茄计划表</strong> 的时候，我们就只需按照番茄工作法严格执行，那么现实问题自然而然也会得到解决。<br>
当你专注于手头的 <strong>今日待办</strong> 时 ，焦虑与不安自然而然也会一并消失。日积月累之下，你会感觉自己正在逐步成长。</p>
<p>如果你有一个非常远大的目标，将它拆分成一个个的 <strong>“小番茄”</strong>，然后不断的吃掉这些 <strong>“番茄”</strong> ，你离自己的目标也会越来越近。</p>
<h2>番茄工作法常见问题</h2>
<ol>
<li>
<p><strong>内部因素</strong> 和 <strong>外部因素</strong> 的打断。</p>
<p><strong>内部因素</strong>：主要是我们自己的注意力或者是情绪引起的。比如，你刚刚分手，然后让你专注的学习两个番茄时间，绝大多数人肯定都做不到的。还有突如其来的思想抛锚，想入非非，突然发生的奇思妙想等。<br>
<strong>外部因素</strong>：手机电话，同事领导时不时找你有事，快递，外卖等等。如果你所处的环境会时常会被打断，是你无法做到专注，那你就得考虑番茄工作法可能并不适合你。</p>
</li>
<li>
<p>另外一个问题是，25 分钟的番茄时间可能不太合适。</p>
<p>一个番茄钟开始了，可能刚刚找一点点状态，就要开始休息，然后又要重新找状态。 一个 25 分钟的番茄时间大部分都用来进入状态了。<br>
一个网课大多数都是 1 个小时或者更长的，好不容易跟上思路结果就因为番茄时间到了要休息 5 分钟。<br>
对于逻辑性比较强的一些工作，可能得花个十几分钟才能理清楚做题的思路，不可能做题做到一半就休息 5 分钟。</p>
</li>
<li>
<p>有的时候 5 分钟的休息时间感觉可能也不太够。</p>
<p>整个番茄法的原理认为，我们的注意力会随着时间下降的，所以每学习 25 分钟休息 5 分钟，就能让你注意力水平恢复到最高的状态。<br>
但实际的情况可能有变，比如注意力下降的比较快，休息 5 分钟注意力可能只恢复到一半。</p>
</li>
<li>
<p>刚开始使用番茄工作法时，可能会不知不觉的追求番茄工作法的数量，而不是工作的质量。</p>
<p>当工具本身变成了任务就失去了它的价值。如果只是把问题拆分成番茄时间，可能会给人一种 “达到了数量就解决了问题的错觉” ，这个就是心理学上的 “计数器陷阱” 。<br>
所以很多时候完成的往往是量的积累而不是质的改变，看不到明显的提升效果，后面就不太想要坚持了。</p>
</li>
</ol>
<h2>番茄工作法的升级建议</h2>
<ol>
<li>
<p>要个性化你的番茄时间。</p>
<p>一个番茄时钟不一定非得是工作 25 分钟 休息 5 分钟。这种可能比较适合普通人或者是搬砖的简单工作。<br>
如果工作本身逻辑性和推理性比较强，可能更加适合比较长的周期。 比如工作 50 分钟休息 10 分钟就比较适合专注类的工作。<br>
或者我们将任务进行分类，比如简单一点的重复性劳作，就 25-3 的番茄钟；学习类的任务，可以根据课时进行动态划分，比如番茄钟可以设置为 40-5；如果是研发类的，需要专注思考的，可以设置为 60-10。<br>
这个需要花上几周的时间，不断的进行番茄钟的 <strong>复盘</strong> ，来找到适合自己的节奏。<br>
可以给 自己的日常任务进行 <strong>分类</strong> ，不同类型的任务使用不同的 番茄时间 。</p>
</li>
<li>
<p><strong>计划</strong> 和 <strong>复盘</strong> 很重要</p>
<p>计划的作用是在于让我们分清楚事情的重要程度，排好优先级，否则可能 <strong>小事情忙了一天，大事一样没做</strong>。<br>
复盘的作用是让我们知道哪里做的好哪里做的不好，从而形成快速的、可执行的迭代方案，才能帮助我们快速成长。<br>
同时也可以不断的提高我们对 <strong>番茄时间</strong> 的预估精准度，更快的找到适合自己的番茄时间。<br>
同时也可以提高下次 <strong>番茄时间</strong> 的效率，让自己的番茄时间更加均匀，更加自主可控。更加合理高效的安排一天的工作和学习任务。</p>
</li>
<li>
<p>使用番茄工作法的前提，是这些时间是你能够<strong>完全自主可控</strong>的。</p>
<p>如果你是学生党，那么你的课余时间都可以是自己的。<br>
如果你是上班族，上班的时间又经常会被打断，那么番茄工作法很难起到作用。<br>
所以可以判断一下，如果接下来的几个小时自己可以全完全做主，那么就可以使用番茄工作法。<br>
如果工作中打断只是偶然发生的事件，那么就可以快速记录一下，把打断外的事件立即标记到 <strong>计划外紧急事件</strong> 中，并做好时间记录，然后立即重新投入到当前番茄时间里面去。尽量让自己的番茄钟更加完整。</p>
</li>
<li>
<p>排除环境干扰，在开始之前给自己制造一个安静的环境。</p>
<p>在开始 <strong>“吃番茄”</strong> 之前找一个尽量不会被其他人打扰的时间和地点来进行。<br>
然后给自己创造一个专注的环境，比如可以去图书馆，或者把桌面的杂物清理掉，把干扰因素提前排除。如:手机调成免打扰模式等等。</p>
</li>
<li>
<p>番茄计时器的使用</p>
<p>尽量不要使用手机，因为手机本身就是一个很大的干扰。<br>
可以买一个专门的计时器。<br>
更加推荐使用手表或者手环。<br>
我现在就用的小米手环，它本身也带有倒计时功能，时间到了就振动两下。这样休息时间我可以不带手机在公司里面到处溜达，做一做拉伸运动，倒计时结束后返回工位继续下一个番茄时间。</p>
</li>
<li>
<p>珍惜心流的状态</p>
<p>如果一旦进入心流状态，就不要再管什么番茄时间了，好好把握这种状态，专注做好自己手里面的事情，直到感觉到疲累或者心流的状态消失。再继续番茄钟。<br>
根据我以往的经验，一个心流的时间不宜太长。就比如我，一个有效的心流时长不会超过 1 个小时，一旦超过思维敏捷度就会下降，甚至会开始钻牛角尖，导致思路打不开。<br>
所以还是更加建议隔一段时间就去休息一下，休息的过程中可以四处走一走，喝一喝水，看看四周的人事物，尽量减少对工作的思考。不过在开始休息之前可以做好记录，方便休息结束后更快的回到工作当中去。<br>
如果是非常需要深度的工作，休息的时间可以稍微定短一点，比如 3 分钟，让自己可以缓一缓，同时也不至于忘了之前推理的内容。</p>
</li>
<li>
<p>学会休息</p>
<p>番茄工作法休息时间和工作时间一样重要。休息的不好可能会无法回到之前的注意力水平。<br>
所以休息的时候最好不要思考任何和任务相关的事情，也不要刷视频刷朋友圈，因为这些事情会偷偷占用你的注意力或者影响你的情绪。<br>
休息时多看看远处，或者多看看绿色的植物可以缓解视疲劳，或者深呼吸几次甚至闭上眼睛用一下 <a href="https://zhuanlan.zhihu.com/p/359464590" target="_blank" rel="noopener noreferrer">全身扫描放松法</a> 来放松身体。 或者做一点拉伸运动等等。<br>
一个番茄时间加上休息是 30 分钟，一组四个番茄钟也就是两个小时。一组番茄结束之后可以找个舒服的地方睡 10 分钟。<br>
每个小番茄之间的休息间隔也不一定非得是 5 分钟，比如你可以放下手头的工作来调整自己的状态，当你的状态调整好了之后你再进入下一个<strong>番茄时间</strong> 效果可能会更好一些。</p>
</li>
</ol>
<h2>工具推荐</h2>
<p><code>专注清单App</code>：</p>
<p><a href="https://www.focustodo.cn" target="_blank" rel="noopener noreferrer">https://www.focustodo.cn</a></p>
<p>这是我前不久发现的一款神器，它基于番茄工作法设计的。</p>
<ul>
<li>每个任务可以单独设定番茄时间的时长和番茄数，休息时长等都可以自定义。</li>
<li>任务完成后会自动归类到完成列表中。点击任务详情可以直接查看开始时间和消耗的番茄数。</li>
<li>它会在每个任务下面直接显示你的预估番茄数，和实际使用的番茄数。</li>
<li>它支持将一个大的任务拆分成多个子任务，并且单独的番茄钟计算。</li>
<li>它不会记录你的休息时间，但是会记录你每一个番茄钟的开始时间和耗时。</li>
<li>它支持给每个任务添加备注。</li>
<li>它兼容几乎所有平台，Android、ios、Mac、Windows，以及 Chrome 插件，而且完全免费，全端数据互通。</li>
<li>它提供了 <strong>番茄工作法</strong> 的所有核心功能。</li>
</ul>
<p>因为我的工作大多数都是在电脑端完成的，所以开着 <strong><code>专注清单App</code></strong> 去工作，到时间了自动弹出提醒界面，非常方便。</p>
<p>另外一个就是 带有倒计时功能的 手表 、 手环。直接开启 25 分钟倒计时，工作完了设定一个 5 分钟倒计时即可。</p>
<p>番茄清单可以理解为是一个全平台通用的带有倒计时功能的 <strong>ToDoList</strong>。 秒杀市面上的各种 <strong>ToDo</strong> 软件。</p>
<h2>结束语</h2>
<p>我们每天的第一个番茄钟必然是 <strong>整理今日待办</strong> ，每天最后一个番茄钟必然是 <strong>今日总结与分析</strong> 。<br>
总结分析的第一件事情就是统计 <strong>今日待办</strong> 。</p>
<blockquote>
<p>PS: <strong>整理今日待办</strong> 和 <strong>今日总结与分析</strong> 大概 10 分钟左右足矣。</p>
</blockquote>
<p>我根据自身情况设定的常规<strong>番茄钟</strong>是 30-5，也就是工作 30 分钟休息 5 分钟。</p>
<p>我们来大致估算一下:<br>
早上 9:00 到 11:30 一共 150 分钟，也就是 4 个番茄钟，刚好完成一组。开始午休。<br>
下午 14 - 18 点，最多容纳 6 个番茄钟，也就是刚好一组番茄钟外加一个番茄时间。<br>
如果你很勤奋，晚上回家还想学习一会儿，最多也就腾出来 一组番茄钟。</p>
<p>换句话说，如果设定番茄钟为 30-5。<br>
在没有烂番茄干扰的情况下，每天理论可以完成 <strong>3 组番茄时间</strong> 共计 <strong>12 个番茄钟</strong>。</p>
<p>如果你不上班，是个自由工作者，或者你是个独立开发者，你全程在家办公，拥有大量的无人打扰的时间。而且你还是个超人，能够长时间进行专注的学习和工作，那么你一天的有效番茄钟大概也就 16 个了，也就是 4-5 组番茄钟。如果一个人真的能持续不断的做到这一步，再加上方向正确和一点点机遇，再加上时间沉淀，你一定可以完成任何你想完成的事情 。</p>
<p>我归纳和整理这篇文章，<strong><code>专注清单App</code></strong> 显示花了大概 10 个番茄钟，也就是完完整整的一天时间都在整理和归纳这篇文章。</p>
<blockquote>
<p>包括各大视频博主自媒体博主等，他们可能第一天录制视频，第二天剪辑视频，第三天发布，充其量也就两天一个视频出炉。随着熟练度增高，可能速度会越来越快，但一天最多也就一个观感完美的视频出炉。</p>
</blockquote>
<p>所以你看，时间真的很宝贵也很不经用。当你开始专注于某一件事情的时候它一晃就过去了。<strong>所以当你真正的开始做实事的时候才会明确感觉到时间的宝贵。</strong></p>
<div class="hint-container tip">
<p class="hint-container-title">提示</p>
<p>事实上，我统计了一下，哪怕很顺利，一天有效的番茄钟也就 7-9 个。来自内因的打断比外因要多很多。</p>
</div>
<p>你可以根据自身的情况设计属于自己的 <strong>番茄列表</strong> ，甚至可以使用 <strong>Excel</strong> 设计成表格。</p>
<h2>墨七的 <strong>番茄列表</strong> 展示</h2>
<p><br>
</p>
<p>上图是就是我根据 <strong>番茄工作法</strong> 重新设计的 <strong>番茄列表</strong> 工作区的演示。通过之前的脚本可以一键生成 基础模板。然后每天第一件事情就是在里面填空，然后就是按照番茄工作法去执行和复盘就好了。<br>
最终产生的 Markdown 文件通过 VSCode 的 <strong>Markmap</strong> 插件可以很好的渲染成脑图。这样一来，远比之前的 任务列表 清晰很多。</p>
<figure><figcaption>专注清单App</figcaption></figure>
<blockquote>
<p>我们把整理好的今日待办输入到 <strong><code>专注清单App</code></strong> 中，然后按照番茄工作法去执行。执行的过程中，内因打断就记一下想法，事件打断就记一下吐槽，任务穿插就在 <strong>今日待办</strong> 中新增一个额外事项并列一下优先级 。<br>
当一天结束时，可以在 <strong>今日已完</strong> 成中回顾每天的任务，整合到 <strong>今日待办</strong> 中，可以非常方便的回顾今天一天的 <strong>“番茄情况”</strong>。 然后改进工作方式，以待下次做得更好。</p>
</blockquote>
<div class="hint-container tip">
<p class="hint-container-title">提示</p>
<p><strong>番茄工作法</strong> 使得 <strong>To Do List</strong> 的执行和制定方式得到了 <strong>精确</strong> 和指导。</p>
<p>只要足够精确，那么就会知道具体应该怎么做，怎么开始。面对一种情况应该怎么处理。<br>
那么就不会产生 <strong>模糊不清的恐惧</strong> 。</p>
<p>自然也就不会再焦虑和拖延。<strong>严格掐好一个任务的时间，也是在提醒自己，不要在一个任务上浪费太多时间。提高效率是因为还有更重要的事情在等着我们。</strong></p>
<p><strong>番茄工作法</strong> 不仅仅是一种工具，而是一种 生活和工作的 <strong>“理念与态度”</strong> 。</p>
<p>有的时候，我们进行了一件事情的深度思考，就可以把 番茄钟 抛开到一边，然后专注醉心于工作，等到结束后再把数据补全到 <strong>今日待办</strong> 中去。</p>
</div>
<details class="hint-container details"><summary>脚本源码</summary>
<!-- ```js title="weekly.js"
// <!-- @include: ../../.vscode/script/weekly.ts -->
<div class="language---> line-numbers-mode" data-highlighter="prismjs" data-ext="-->"><pre><code class="language--->"><span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></details>
<details class="hint-container details"><summary>模板文件源码</summary>
<!-- ```md title="weekly.md"
//@include: ../../.vscode/script/weekly.md -->
<div class="language---> line-numbers-mode" data-highlighter="prismjs" data-ext="-->"><pre><code class="language--->"><span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></details>
<blockquote>
<p>你可以自行修改脚本和模板来满足自身的需求。</p>
</blockquote>
<p>项目开源地址: <a href="https://github.com/mo7cc/blog-source/tree/main/_shell" target="_blank" rel="noopener noreferrer">https://github.com/mo7cc/blog-source/tree/main/_shell</a></p>
<h2><code>番茄工作法</code> 七天使用心得</h2>
<p>在开始做事情之前，点击一下<strong>开始计时</strong>按钮，意味着要开始专心干活了。保持注意力集中。<br>
计时结束，表示你该休息了，然后进入休息计时。这个时候可以处理一下聊天列表，邮件，四处走一走，闭目养神，做两个瑜伽动作。做好迎接下一个番茄钟的准备。<br>
如果工作的状态正酣但是进入休息计时了，则可以直接点击 <strong>完成休息</strong> 立马开始下一个番茄钟。直到感觉自己状态逐渐无法集中的时候，可以立即点击 <strong>暂停</strong> ，然后手环设置一个 5 分钟的倒计时，开始四处溜达直到自己状态恢复。<br>
状态恢复后，回到电脑前，点击 <strong>继续</strong> 然后继续开始工作。</p>
<p>这样使用 <strong>番茄工作法</strong> 的好处是十分灵活。</p>
<p>也就是说，干杂活的时候每 30 分钟休息一会儿，然后再继续专注 30 分钟，可以让自己持续性的高效。<br>
做需要深入思考的工作时，提醒休息的闹钟响起，立即点击结束休息，然后再次立即点击开始计时，直接跳过休息立马进入下一个番茄钟，直到自己下一次闹钟响起或者自己注意力涣散。</p>
<p><code>专注清单App</code>5 分钟的休息计时我基本上很少用到，休息计时基本上都是用 <strong>手环倒计时</strong> 功能完成的。</p>
<p>如此一来，每项任务花了多少个番茄钟，<code>专注清单App</code>都帮我做了很好的记录，方便估算自己的效率。然后看着任务列表一项项的任务被完成非常具有成就感。<br>
早上先整理一下今日待办，然后把今日待办输入到 <code>专注清单App</code> 里面去，然后定时休息。开始工作前点一下开始计时。如果状态好就跳过休息立即开始下一个番茄钟。休息的时候也不用非得严格限定时间，等到自己的状态好的时候就可以开始下一个番茄了。</p>
<p>如此使用七天，工作和生活效率得到了质的飞跃，简直就像打游戏一样: <strong>不断的完成任务获得成就，然后开始挑战下一个任务，不断的积累成就。让自身越来越高效，同时离目标也越来越近。</strong></p>
<p>然后我还把每天必须要做的事情，比如：今日总结、打扫卫生、更换床单被罩、锻炼身体等都设定了 <strong>任务循环</strong>，每天要干的事情就是清空任务列表，每天的生活非常充实且自律，而且很有成就感。</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"></div></div>]]></content>
    <published>2024-10-11T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">关于减脂</title>
    <id>https://mo7.cc/self_manage/fat_lose.html</id>
    <link href="https://mo7.cc/self_manage/fat_lose.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container tip">
<p class="hint-container-title">提示</p>
<p>肥胖是许多慢性疾病的主要风险因素，如高血压、糖尿病、冠心病等等，不利于自身健康。<br>
而减轻体重可以降低身体耗氧量，提升身体运转能力，有效地降低这些疾病的患病风险，改善身体的健康状况，并减缓衰老。<br>
<strong>减脂不是一种方法，而是一种生活方式。</strong></p>
</div>
<h2>方案总结</h2>
<p>早餐一杯牛奶咖啡，然后刷牙洗漱。做一些运动(可以是走路上下班，可以是跑步，俯卧撑，跳绳都行)。<br>
午餐正常吃，四菜一汤一饭，自己估摸着 8 分饱即可，注意营养搭配，总结一下就是要吃饱吃好。(大脑感受是存在延迟的，你觉得饱了，其实胃已经撑了)<br>
晚餐戒掉，如果感觉很饿就来一杯牛奶。如果非常想吃东西，牛奶+咖啡。<br>
一杯咖啡下肚，食欲什么的直接就没了，搭配牛奶效果很好，不仅好喝而且可以有效压制食欲。<br>
上述的饮食之外，除了纯净水，其余的一概不要进嘴。<br>
晚上可以适当加一些空腹运动，但是运动前最好一来杯牛奶补充一下。<br>
中途如果很饿想吃东西，就喝水，或者来一杯蔬菜汁(芹菜，黄瓜，大西红柿)。<br>
保持空腹入睡。</p>]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container tip">
<p class="hint-container-title">提示</p>
<p>肥胖是许多慢性疾病的主要风险因素，如高血压、糖尿病、冠心病等等，不利于自身健康。<br>
而减轻体重可以降低身体耗氧量，提升身体运转能力，有效地降低这些疾病的患病风险，改善身体的健康状况，并减缓衰老。<br>
<strong>减脂不是一种方法，而是一种生活方式。</strong></p>
</div>
<h2>方案总结</h2>
<p>早餐一杯牛奶咖啡，然后刷牙洗漱。做一些运动(可以是走路上下班，可以是跑步，俯卧撑，跳绳都行)。<br>
午餐正常吃，四菜一汤一饭，自己估摸着 8 分饱即可，注意营养搭配，总结一下就是要吃饱吃好。(大脑感受是存在延迟的，你觉得饱了，其实胃已经撑了)<br>
晚餐戒掉，如果感觉很饿就来一杯牛奶。如果非常想吃东西，牛奶+咖啡。<br>
一杯咖啡下肚，食欲什么的直接就没了，搭配牛奶效果很好，不仅好喝而且可以有效压制食欲。<br>
上述的饮食之外，除了纯净水，其余的一概不要进嘴。<br>
晚上可以适当加一些空腹运动，但是运动前最好一来杯牛奶补充一下。<br>
中途如果很饿想吃东西，就喝水，或者来一杯蔬菜汁(芹菜，黄瓜，大西红柿)。<br>
保持空腹入睡。</p>
<h2>核心理念</h2>
<div class="hint-container important">
<p class="hint-container-title">重要</p>
<p>不要惧怕饥饿。</p>
</div>
<p>我自己试了一下，在 60 小时内(两天三夜)一共只喝了一瓶牛奶，饿了就只是喝纯净水。尽量去适应空腹和饥饿的感觉。在此期间会伴随着四肢无力，双手无力发抖的情况，但是我本人并没有出现任何问题，正常的打游戏，刷剧，敲代码，看书，学习。然后从第三天早上开始，一杯牛奶下肚，然后直到 12 点午餐正常吃，然后晚餐也只是一瓶牛奶。如此的饮食习惯坚持了一个周就适应了，而且不会再出现什么无力感。</p>
<p>完全不要担心自己被饿坏了或者营养不良，也不要怕会养成胃病之类的。事实上大多数胃病都是因为吃的太多暴饮暴食，给胃的负担太大造成的。</p>
<p>坚持一段时间后，我还会担心自己会不会有厌食症的倾向，发现完全没问题，因为自己看到美食还是会很想吃，不过这个时候我会专心去做其它事情并喝一大口水。</p>
<blockquote>
<p>所以不要害怕饥饿，要学会享受和适应饥饿感。</p>
</blockquote>
<p>虽然饥饿，但是也要营养要均衡。中午那顿只要吃好一天所需能量就完全足够了。然后牛奶和纯净水(5.5L 纯净水不足 10 元人民币，够喝很多天)是作为蛋白质以及空腹时期消化物的替代品。当然，也可以用一个鸡蛋来替代牛奶，总之就是要吃得少，而且得保证足够优质蛋白的摄入。</p>
<p>也不要担心长此以往会让自己状态下降，一旦身体适应了这个饮食节奏，你的身体和精神状态不会有任何变化，甚至精神状态会更好。</p>
<p>这么做的本质上其实就是屏蔽大脑信号并按时按量的饮食，然后用优质蛋白和纯净水来充当空腹时期的消化物，并给予身体额外的养分。</p>
<p>每个人的日常生活情况可能不太一样，但是核心理念是一样的，就是饿，并且要学会享受和习惯饥饿感。然后每天规律并且定时定量的饮食，同时还要注意营养均衡。</p>
<details class="hint-container details"><summary>疑虑 1：靠饥饿来减肥，不是容易反弹么？</summary>
<p>这里有个思维误区，是不健康的饮食和生活习惯以及理念导致了你的肥胖，这种饮食方式只是让你回归了正常而已。如果你长期坚持这种饮食习惯，自然就不会反弹了。吃太多，本身就是一种非常不健康的饮食方式，尤其是晚餐吃太多。</p>
</details>
<details class="hint-container details"><summary>疑虑 2：营养不良维生素等营养物质缺乏怎么办</summary>
<p>很多担心其实完全都是多余的，维生素缺乏就补充维生素就好了。而且中午那顿饭是完全正常饮食，可以正常的摄入碳水，摄入大量的能量，牛肉，米饭，面条什么的都很随意。所以中午那顿饭必须得吃好，要荤素搭配，要营养均衡。</p>
<p>但是以上的饮食结构还会存在另一个问题，那就是水果的摄入。如果是 12 点吃的午饭，那么水果就可以放到 15 点左右吃，或者干脆不吃。</p>
<p>然后饭后可以搭配鱼肝油和维生素补充剂来进行食用，认准 OTC 标志，而不是保健品标志。</p>
<div class="ImgGroup">
<figure><figcaption>鱼肝油</figcaption></figure>
<figure><figcaption>维生素C</figcaption></figure>
<figure><figcaption>维生素E</figcaption></figure>
</div>
<blockquote>
<p>吃上一片顶得上几篮子水果了，而且价格便宜，买上一瓶能吃好几个月。维生素缺乏的病人可能得一天吃三顿。身体健康的人 1-3 天吃一片补充一下就可以了。以此类推，只要不过量任何营养物质都可以使用这种方式来补充。<br>
什么维生素 abcdefg，蛋白质，鱼肝油啥的 都可以根据自身需求去选用补充剂。比如 VC 是美白，VE 会让皮肤好，VB 提高免疫力啥的 那么就可以提高频率为一天一片而不是 2 天一片。<br>
京东大药房或者阿里大药房就有的卖，认准 OTC 价格很便宜。</p>
</blockquote>
<figure><figcaption>维生素E</figcaption></figure>
<blockquote>
<p>一定要认准 右上角的 <strong>OTC</strong> 标志。</p>
</blockquote>
<p><a href="https://www.hopebiol.com/asphtml/refere9268.htm" target="_blank" rel="noopener noreferrer">延伸阅读: 食品、药品、保健品的标志有哪些？</a></p>
<p>我分析过市面上大多数的保健食品，无一例外基本都是<strong>智商税</strong>。高昂的价格，复杂的成分，主打一个只要吃不死人就随便给你吃。</p>
</details>
<details class="hint-container details"><summary>疑虑 3：这么吃会不会导致肠胃或者排便问题？</summary>
<p>前文提到过，肥胖是因为不健康的饮食和生活习惯而来的，这么做只是在把饮食拉回正常。亲身实测，压根不会出现任何肠胃问题，正常 1-2 天排便一次。 只要多喝水就好了。</p>
</details>
<h2>循序渐进的做法，长久的坚持</h2>
<p>第一阶段：戒零食<br>
第二阶段：减小饭量<br>
第三阶段：早晚餐换成优质蛋白<br>
第四阶段：加入运动</p>
<p>每个阶段根据个人情况不同可能会持续 1-2 周甚至是几个月。<br>
比如我，第一阶段的完成花了 3 个多月的时间，第一阶段+第二阶段足足花了半年多。直到现在，我的生活中再也没出现过任何零食。每天只有 1-2 顿有主食。</p>
<p>当然优质蛋白也不仅仅是牛奶鸡蛋，<a href="https://hospital.pku.edu.cn/info/1056/1935.htm" target="_blank" rel="noopener noreferrer">优质蛋白十佳食物排行榜</a>，原理基本一样，根据自身口味需求混搭也都可以。</p>
<p>肥胖从某种角度来说本身就是不健康的生活习惯和生活理念造成的，所以一定得注重习惯的养成和理念的精确。</p>
<p>所谓的精确就是：这顿饭我不能吃，不吃就是不吃，没有中间选项；我现在饿了那么我就只能喝水，没有其它选项；我早餐就只喝牛奶，或者鸡蛋，没有其它选项。</p>
<p>一开始可以试着把零食彻底戒掉。什么奶茶，甜品，辣条，小零食之类的统统不要。<br>
适应没有零食的饮食之后，下一步试着减小饭量，饿了就喝水；<br>
每顿饭坚持 8 分饱，然后试着适应和享受饥饿感，8 分饱就是 8 分饱，多一分都不行，下午四五点会很饿，饿就对了；<br>
适应没有晚餐的生活之后，可以试着把早餐换成一个鸡蛋或者牛奶。<br>
最后再试着开始加入一些运动在你的日常生活中。</p>
<p>试着找一个拥有相同理念的健身搭子，并记录习惯养成结果。这样做的好处是，不会一口气瘦太快，而且给了身体一个很长的适应期。循序渐进也不会太过痛苦。最主要的是做法简单，容易坚持。</p>
<p>你吃进胃里的任何东西本质上都会变成身体的<strong>负担</strong>，少吃等于是在给身体 <strong>减负</strong>。</p>
<p>相信我，作为一个成年人，每天仅有的一顿 <strong>大餐</strong> 已经足够养成你的身体了。</p>
<p>不过，我是个上班族每天上班就是坐在办公室敲键盘，每天中午有安静的 2 小时午休，公司食堂的午餐非常安全丰盛且搭配合理。每个人情况不同，所以第三阶段可以自己根据自己的情况去调整，但是第一、二、四 阶段是必经之路。</p>
<blockquote>
<p>运动只能增长你的肌肉，只有减少饮食才能让你真正的减少脂肪。</p>
</blockquote>
<p>当你很饿的时候，不妨找点事情来做，比如打游戏，思考问题，看书或者是学习，当你沉浸到某一件事情之后你会完全忘记饥饿这件事情，等时间到了就按照规划好的去计划饮食就好了。</p>
<blockquote>
<p>困了就去睡，别和疲劳做对抗，不要留恋和让无聊的事情占据你的大脑，自然而然就能做到早睡了。<br>
午休很重要，一定要睡好睡足。<br>
无聊了，就去找事情干，制定自己的 To Do List，一项项的去完成。<br>
情绪不好了就去做适合自己的运动，任何运动都可以，一定要发泄出来。<br>
饿了就去喝咖啡牛奶，补充优质蛋白，而不是吃一大堆乱七八糟的东西。一天一顿的美食奖励还不够吗？莫贪心。<br>
提升和改变都是一点点的事情，一定要把这种进步当作是日常。</p>
</blockquote>
<details class="hint-container details"><summary>七宗罪</summary>
<p>人有七宗罪 傲慢、贪婪、色欲、嫉妒、暴食、愤怒、怠惰。</p>
<p>戒<strong>傲慢</strong>可以笼络人缘，傲慢的反义词是谦逊，谦逊使人进步。</p>
<p>戒<strong>贪婪</strong>可以让你时刻警醒危机和陷阱，能量和馅饼不会凭空产生。适当贪婪让人进步，过度贪婪使人毁灭。</p>
<p><strong>嫉妒</strong>只是在你的浪费时间而已，它不仅会让你心理扭曲还会打击你的信心，有时间嫉妒不如自己发奋图强。</p>
<p><strong>暴食</strong>使人肥胖，肥胖往往会伴随一大堆的不健康的身体指标和慢性病。</p>
<p><strong>愤怒</strong>的时候一定要采取合理的方式发泄出来，人有七情六欲更何况是愤怒，但是在情绪平稳之前不要做任何决定。</p>
<p><strong>怠惰</strong>会让人退化、腐朽，无论生活如何富足和闲暇也一定要找点事情做，可以是钓鱼、绘画、写小说、射击、烹饪、汽车改装。也一定要有所产出，哪怕只是写篇文章或者是拍个短视频或者是参加比赛甚至是组织比赛。如果只是光看、光玩没有任何产出，那么最终也会厌倦。</p>
</details>
<p>减脂这种事情本身就是在和自身欲望以及懒惰做对抗，不要小瞧任何原本肥胖但是靠自己减肥成功的人，他们都拥有绝对的<strong>自信</strong>和<strong>毅力</strong>以及<strong>坚定且正确的信念</strong>，还具有很强的计划和目标管理能力，同时还拥有强大的执行力。</p>
<h2>一些延伸阅读和必要的知识储备</h2>
<p><a href="https://www.mountelizabeth.com.sg/zh/health-plus/article/intermittent-fasting-benefits-risks" target="_blank" rel="noopener noreferrer">间歇性断食如何起作用？好处、风险以及如何安全地进行断食</a></p>
<blockquote>
<p>也就是说，饥饿其实并没那么恐惧，尤其是现在这个物质发达的年代，吃太多很容易，管住嘴反而更不容易。</p>
</blockquote>
<p><a href="https://www.hopebiol.com/asphtml/refere9268.htm" target="_blank" rel="noopener noreferrer">食品、药品、保健品的标志有哪些？</a></p>
<blockquote>
<p>东西千万不要乱吃。商人为了逐利什么事情都敢做，现在的各种商品都参杂着各种 <strong>科技与狠活</strong>，主打一个只要吃不死人就随便给你吃。假的鸭血，假的腐竹，假的粉丝粉条，假的牛肉等等等。一日三餐简单而纯粹，不仅省钱还健康。<br>
我目前把大多数的二次加工产品都从自己的日常饮食中剔除了:<br>
比如鸭血，我干嘛不吃鸭肉呢？ 想吃牛肉那么就一定得去好一点的店铺或者自己去菜市场买新鲜牛肉，而不是各种二次的肉制品等等。相信我，哪怕仅仅只是用原材料也能 100%满足你的味蕾。</p>
</blockquote>
<p><a href="https://www.zhihu.com/question/509745291" target="_blank" rel="noopener noreferrer">人在感到饥饿时，是因为胃里没有食物了，还是没有「热量」了?</a></p>
<p><a href="https://www.zhihu.com/question/491683365" target="_blank" rel="noopener noreferrer">一个胖子如果一直不吃饭，是会直接饿死还是会变瘦？</a></p>
<p><a href="https://www.zhihu.com/question/485420297/answer/2111674981" target="_blank" rel="noopener noreferrer">人体所需的营养物质都有哪些？</a></p>
<p><a href="https://www.zhihu.com/question/21313585/answer/3401406462" target="_blank" rel="noopener noreferrer">脂肪是人体的「战略储备」，那么胖子就一定比瘦子耐饿吗？同等情况下谁先饿死？</a></p>
<blockquote>
<p>所以不能不吃饭，得营养均衡并且依据自身情况科学的减少饭量。</p>
</blockquote>
<p><a href="https://www.zhihu.com/question/415889635/answer/3128109769" target="_blank" rel="noopener noreferrer">一天只吃一顿饭能瘦吗? - 离愁的回答</a></p>
<h2>瘦到什么样算是成功的？</h2>
<p><a href="https://www.cchrchealth.org/zh/body-mass-index-bmi-for-adults/" target="_blank" rel="noopener noreferrer">成人体重指数</a></p>
<p><a href="https://cn.onlinebmicalculator.com/" target="_blank" rel="noopener noreferrer">免费在线 BMI 计算器</a></p>
<p><a href="https://health99.hpa.gov.tw/onlineQuiz/bmi" target="_blank" rel="noopener noreferrer">BMI 測試</a></p>
<p><strong><code>BMI=体重÷身高的平方</code></strong>， 现在大多数的体重秤，体脂秤都自带 BMI 计算。<br>
一般体重处于正常范围内的人是不需要减脂的。只要保持好现在的饮食和生活节奏就好了。如果觉得体弱就适当加一点运动。</p>
]]></content>
    <published>2024-10-13T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">让 Windows 和 macOS 系统快捷键保持一致</title>
    <id>https://mo7.cc/self_manage/shortcut_key_sync.html</id>
    <link href="https://mo7.cc/self_manage/shortcut_key_sync.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<h2>常用键盘快捷方式</h2>
<p>微软爸爸真好，居然出了官方文档。<a href="https://learn.microsoft.com/zh-cn/windows/dev-environment/mac-to-windows" target="_blank" rel="noopener noreferrer">将开发环境从 Mac 改为 Windows 的指南</a></p>
<p><strong>❀ 下面是我整理的使用频率非常高的快捷键。</strong></p>
<table>
<thead>
<tr>
<th>操作</th>
<th>macOS</th>
<th>Windows</th>
</tr>
</thead>
<tbody>
<tr>
<td>全选</td>
<td>Command + A</td>
<td>Ctrl + A</td>
</tr>
<tr>
<td>复制</td>
<td>Command + C</td>
<td>Ctrl + C</td>
</tr>
<tr>
<td>粘贴</td>
<td>Command + V</td>
<td>Ctrl + V</td>
</tr>
<tr>
<td>剪切</td>
<td>Command + X</td>
<td>Ctrl + X</td>
</tr>
<tr>
<td>搜索</td>
<td>Command + F</td>
<td>Ctrl + F</td>
</tr>
<tr>
<td>保存</td>
<td>Command + S</td>
<td>Ctrl + S</td>
</tr>
<tr>
<td>撤回</td>
<td>Command + Z</td>
<td>Ctrl + Z</td>
</tr>
<tr>
<td>取消撤回</td>
<td>Command + Shift +Z</td>
<td>Ctrl + Shift + Z</td>
</tr>
</tbody>
</table>]]></summary>
    <content type="html"><![CDATA[
<h2>常用键盘快捷方式</h2>
<p>微软爸爸真好，居然出了官方文档。<a href="https://learn.microsoft.com/zh-cn/windows/dev-environment/mac-to-windows" target="_blank" rel="noopener noreferrer">将开发环境从 Mac 改为 Windows 的指南</a></p>
<p><strong>❀ 下面是我整理的使用频率非常高的快捷键。</strong></p>
<p>| 操作     | macOS              | Windows          |<br>
|</p>
]]></content>
    <published>2024-11-16T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">双拼输入法</title>
    <id>https://mo7.cc/self_manage/shuang_pin_input.html</id>
    <link href="https://mo7.cc/self_manage/shuang_pin_input.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>因为拼音的广泛普及， 拼音输入法也就成为了目前最为流行的输入法， 因为它几乎没有任何学习成本。<br>
尤其是云词库和 AI 的发展， 很多时候只需要输入拼音首字母， 输入法们就能猜到我们想要输入的内容。</p>
<p>但是拼音输入法也存在很多局限性， 因为汉语中同音字实在是太多了， 也就是拼音输入法的<strong>重码率</strong>很高， 导致输入一个拼音很多时候需要翻很久很久才能找到想输入的汉字。<br>
大多数拼音包含的字母都在 3-6 位， 也就是说为了打出一个汉字， 再加上重码率 需要敲击 3-8 次键盘才能完成一个拼音的输入(比如:<code>shuang,zhuang,rang</code>)， 短短一句话可能就得按键上百次。<br>
相反， 五笔输入法一句话可能只需要按 4-8 次就能完成， 这落差十分巨大。但是随着智能词库和云数据库的发展， 简单易学的拼音输入法也越来越高效。相比较而言， 五笔输入法上手难度太高了， 直到今天已经已经没人愿意学习五笔输入法了。</p>]]></summary>
    <content type="html"><![CDATA[
<p>因为拼音的广泛普及， 拼音输入法也就成为了目前最为流行的输入法， 因为它几乎没有任何学习成本。<br>
尤其是云词库和 AI 的发展， 很多时候只需要输入拼音首字母， 输入法们就能猜到我们想要输入的内容。</p>
<p>但是拼音输入法也存在很多局限性， 因为汉语中同音字实在是太多了， 也就是拼音输入法的<strong>重码率</strong>很高， 导致输入一个拼音很多时候需要翻很久很久才能找到想输入的汉字。<br>
大多数拼音包含的字母都在 3-6 位， 也就是说为了打出一个汉字， 再加上重码率 需要敲击 3-8 次键盘才能完成一个拼音的输入(比如:<code>shuang,zhuang,rang</code>)， 短短一句话可能就得按键上百次。<br>
相反， 五笔输入法一句话可能只需要按 4-8 次就能完成， 这落差十分巨大。但是随着智能词库和云数据库的发展， 简单易学的拼音输入法也越来越高效。相比较而言， 五笔输入法上手难度太高了， 直到今天已经已经没人愿意学习五笔输入法了。</p>
<p>拼音， 是用 26 个字母的拼读来表示汉语发音。拼音是由 <code>23个声母</code>， <code>24个韵母</code> ， <code>16个整体认读音节</code> 组成的。<br>
如果按一次 按键 表示声母， 再按一次 就表示韵母， 那么任何汉字的拼音就只需要按<strong>两次</strong>就能完成了输入了， 所以命名为 <strong>双拼</strong>输入法 。</p>
<p>而且 <strong>双拼输入法</strong> 还能和现有的拼音提示词库完美结合。</p>
]]></content>
    <published>2024-11-21T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">文档</title>
    <id>https://mo7.cc/bookmark/links/document.html</id>
    <link href="https://mo7.cc/bookmark/links/document.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container tip">
<p class="hint-container-title">常用文档</p>
</div>
<h2></h2>
]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container tip">
<p class="hint-container-title">常用文档</p>
</div>
<h2></h2>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">超链接</title>
    <id>https://mo7.cc/bookmark/links/</id>
    <link href="https://mo7.cc/bookmark/links/"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">好的东西应该共享</p>
</div>
<hr>
]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">好的东西应该共享</p>
</div>
]]></content>
    <published>1993-02-13T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">在线工具</title>
    <id>https://mo7.cc/bookmark/links/tools.html</id>
    <link href="https://mo7.cc/bookmark/links/tools.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container tip">
<p class="hint-container-title">好用的在线工具</p>
</div>
<h2></h2>
]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container tip">
<p class="hint-container-title">好用的在线工具</p>
</div>
<h2></h2>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">墨七的书单</title>
    <id>https://mo7.cc/bookmark/book_list.html</id>
    <link href="https://mo7.cc/bookmark/book_list.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<h2>《 行为科学统计 》</h2>
<figure><figcaption></figcaption></figure>
<p><a href="https://book.douban.com/subject/36140702/" target="_blank" rel="noopener noreferrer">豆瓣读书-行为科学统计</a></p>
<blockquote>
<p>这是本极佳的统计学入门书籍，不单讲理论，还会让你明白为什么要这么做，应该怎么做。</p>
</blockquote>
<h2>《 深入浅出数据分析 》</h2>
<figure><figcaption></figcaption></figure>]]></summary>
    <content type="html"><![CDATA[
<h2>《 行为科学统计 》</h2>
<figure><figcaption></figcaption></figure>
<p><a href="https://book.douban.com/subject/36140702/" target="_blank" rel="noopener noreferrer">豆瓣读书-行为科学统计</a></p>
<blockquote>
<p>这是本极佳的统计学入门书籍，不单讲理论，还会让你明白为什么要这么做，应该怎么做。</p>
</blockquote>
<h2>《 深入浅出数据分析 》</h2>
<figure><figcaption></figcaption></figure>
<p><a href="https://book.douban.com/subject/36418715/" target="_blank" rel="noopener noreferrer">豆瓣读书-深入浅出数据分析</a></p>
<blockquote>
<p>够浅白，然后还会讲一下为什么要这么做。唯一不好就是废话比较多吧，对有基础的人，不是很合适。</p>
</blockquote>
<h2>《 数据挖掘导论 》</h2>
<figure><figcaption></figcaption></figure>
<p><a href="https://book.douban.com/subject/5377669" target="_blank" rel="noopener noreferrer">豆瓣读书-数据挖掘导论</a></p>
<blockquote>
<p>这个主要用于挖掘数据之间的内在联系。和传统意义上的统计学不太一样。比起另外一本黑色的数据挖掘教材要新一点。</p>
</blockquote>
<h2>《 金融市场与金融机构基础 》</h2>
<figure><figcaption></figcaption></figure>
<p><a href="https://book.douban.com/subject/36430235" target="_blank" rel="noopener noreferrer">豆瓣读书-金融市场与金融机构基础</a></p>
<blockquote>
<p>讲金融体系的扫盲书籍</p>
<p>书不厚但是作为一个完全的金融外行来说我觉得啃掉他至少需要半年时间。<br>
刚刚看完引论觉得浅显易懂，每章节前后都有引导和总结，十分适合入门。</p>
</blockquote>
<h2>《 投资学 》</h2>
<figure><figcaption></figcaption></figure>
<p><a href="https://book.douban.com/subject/27159606" target="_blank" rel="noopener noreferrer">豆瓣读书-投资学</a></p>
<blockquote>
<p>金融领域必读书籍</p>
</blockquote>
<h2>Go 语言书单</h2>
<p><a href="https://books.studygolang.com/" target="_blank" rel="noopener noreferrer">Go 语言中文开源图书、资料或文档</a></p>
<blockquote>
<p>在线工具书，随用随查，社区翻译的最佳版本</p>
</blockquote>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">读书笔记</title>
    <id>https://mo7.cc/bookmark/books/</id>
    <link href="https://mo7.cc/bookmark/books/"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">日常读书笔记记录</p>
</div>
<hr>
]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">日常读书笔记记录</p>
</div>
]]></content>
    <published>1993-02-13T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">影视</title>
    <id>https://mo7.cc/bookmark/movies/</id>
    <link href="https://mo7.cc/bookmark/movies/"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">『 生活就像一盒巧克力 』</p>
</div>
<hr>
]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">『 生活就像一盒巧克力 』</p>
</div>
]]></content>
    <published>1993-02-13T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">阿甘正传</title>
    <id>https://mo7.cc/bookmark/movies/forrest_gump.html</id>
    <link href="https://mo7.cc/bookmark/movies/forrest_gump.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>《阿甘正传》是由罗伯特·泽米吉斯执导的电影，由汤姆·汉克斯、罗宾·怀特等人主演，于 1994 年 7 月 6 日在美国上映。</p>
<p>电影改编自美国作家温斯顿·格鲁姆于 1986 年出版的同名小说，描绘了先天智障的小镇男孩福瑞斯特·甘自强不息，最终“傻人有傻福”地得到上天眷顾，在多个领域创造奇迹的励志故事 [1] 。电影上映后，于 1995 年获得奥斯卡最佳影片奖、最佳男主角奖、最佳导演奖等 6 项大奖 。</p>
<p>2014 年 9 月 5 日，在该片上映 20 周年之际，《阿甘正传》IMAX 版本开始在全美上映</p>
<figure><figcaption>海报</figcaption></figure>]]></summary>
    <content type="html"><![CDATA[
<p>《阿甘正传》是由罗伯特·泽米吉斯执导的电影，由汤姆·汉克斯、罗宾·怀特等人主演，于 1994 年 7 月 6 日在美国上映。</p>
<p>电影改编自美国作家温斯顿·格鲁姆于 1986 年出版的同名小说，描绘了先天智障的小镇男孩福瑞斯特·甘自强不息，最终“傻人有傻福”地得到上天眷顾，在多个领域创造奇迹的励志故事 [1] 。电影上映后，于 1995 年获得奥斯卡最佳影片奖、最佳男主角奖、最佳导演奖等 6 项大奖 。</p>
<p>2014 年 9 月 5 日，在该片上映 20 周年之际，《阿甘正传》IMAX 版本开始在全美上映</p>
<figure><figcaption>海报</figcaption></figure>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">音乐</title>
    <id>https://mo7.cc/bookmark/music/</id>
    <link href="https://mo7.cc/bookmark/music/"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">单曲循环一整天</p>
</div>
<hr>
]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">单曲循环一整天</p>
</div>
]]></content>
    <published>1993-02-13T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">网易云歌单</title>
    <id>https://mo7.cc/bookmark/music/music163_favorite.html</id>
    <link href="https://mo7.cc/bookmark/music/music163_favorite.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width="100%" height="550" src="//music.163.com/outchain/player?type=0&amp;id=8056247134&amp;auto=0&amp;height=430"></iframe>
]]></summary>
    <content type="html"><![CDATA[
<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width="100%" height="550" src="//music.163.com/outchain/player?type=0&amp;id=8056247134&amp;auto=0&amp;height=430"></iframe>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">必应每日壁纸 api</title>
    <id>https://mo7.cc/bookmark/photos/bing_img_api.html</id>
    <link href="https://mo7.cc/bookmark/photos/bing_img_api.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>采用 golang 编写，每日定时爬取 <a href="https://cn.bing.com" target="_blank" rel="noopener noreferrer">https://cn.bing.com</a> 当日的 7 张壁纸，并将链接固定下来进行 302 重定向。 idx 参数分别对应 当日壁纸数组 的序号，<code>idx=1</code> 时则返回当天壁纸。</p>
<p>支持 <code>http</code> 以及 <code>https</code> 。</p>
<h2>HTML 和 Markdown 使用</h2>
<div class="language-html line-numbers-mode" data-highlighter="prismjs" data-ext="html"><pre><code class="language-html"><span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>img</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>//file.mo7.cc/api/public/bz<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line"></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>img</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>//file.mo7.cc/api/public/bz?idx=3<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[
<p>采用 golang 编写，每日定时爬取 <a href="https://cn.bing.com" target="_blank" rel="noopener noreferrer">https://cn.bing.com</a> 当日的 7 张壁纸，并将链接固定下来进行 302 重定向。 idx 参数分别对应 当日壁纸数组 的序号，<code>idx=1</code> 时则返回当天壁纸。</p>
<p>支持 <code>http</code> 以及 <code>https</code> 。</p>
<h2>HTML 和 Markdown 使用</h2>
<div class="language-html line-numbers-mode" data-highlighter="prismjs" data-ext="html"><pre><code class="language-html"><span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>img</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>//file.mo7.cc/api/public/bz<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line"></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>img</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>//file.mo7.cc/api/public/bz?idx=3<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="language-markdown line-numbers-mode" data-highlighter="prismjs" data-ext="md"><pre><code class="language-markdown"><span class="line">![](//file.mo7.cc/api/public/bz?idx=1)</span>
<span class="line">![](//file.mo7.cc/api/public/bz?idx=3)</span>
<span class="line">![](//file.mo7.cc/api/public/bz)</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><img src="//file.mo7.cc/api/public/bz?idx=1" alt="" loading="lazy"><br>
<img src="//file.mo7.cc/api/public/bz?idx=3" alt="" loading="lazy"><br>
<img src="//file.mo7.cc/api/public/bz" alt="" loading="lazy"></p>
<blockquote>
<p>当 <code>idx</code> 参数小于 1 时，则会随机返回一张壁纸</p>
</blockquote>
<h2>api 接口返回当日 json 数据</h2>
<div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line"><span class="token function">axios</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span>
<span class="line">  <span class="token literal-property property">method</span><span class="token operator">:</span> <span class="token string">'get'</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token literal-property property">url</span><span class="token operator">:</span> <span class="token string">'//file.mo7.cc/api/public/url'</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token literal-property property">params</span><span class="token operator">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">response</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">const</span> imgList <span class="token operator">=</span> response<span class="token punctuation">.</span>data<span class="token punctuation">.</span>Data<span class="token punctuation">;</span></span>
<span class="line">  console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>imgList<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>API 完整地址:<br>
<a href="https://file.mo7.cc/api/public/url" target="_blank" rel="noopener noreferrer">https://file.mo7.cc/api/public/url</a></p>
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<p>程序采用 golang 编写，采用 302 重定向返回图片，流量消耗可以忽略不计。程序定时爬取数据并缓存在内存中，因此可以支持极高的并发。欢迎食用 ~</p>
</div>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">相册</title>
    <id>https://mo7.cc/bookmark/photos/</id>
    <link href="https://mo7.cc/bookmark/photos/"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">唯愿此景与汝共</p>
</div>
<hr>
]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">唯愿此景与汝共</p>
</div>
]]></content>
    <published>1993-02-13T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">工具分享</title>
    <id>https://mo7.cc/bookmark/tools/</id>
    <link href="https://mo7.cc/bookmark/tools/"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">与高手相比，你只是缺一件趁手的兵器而已。</p>
<p>分享和就一些自己平时觉得好用的工具。</p>
</div>
<hr>
]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">与高手相比，你只是缺一件趁手的兵器而已。</p>
<p>分享和就一些自己平时觉得好用的工具。</p>
</div>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">uTools</title>
    <id>https://mo7.cc/bookmark/tools/u_tools.html</id>
    <link href="https://mo7.cc/bookmark/tools/u_tools.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">相见恨晚的 PC 端工具集</p>
<p>当我搞明白这货的使用方法和运行逻辑之后，不仅效率提升了很多，我还卸载了十几个软件。</p>
</div>
<h2>本文重点</h2>
<p><a href="https://open.u-tools.cn/445779.html" target="_blank" rel="noopener noreferrer">https://open.u-tools.cn/445779.html</a></p>
<p>基于 nodejs 开发的跨平台工具集合。<br>
横跨 Mac、Windows、Linux 三大平台，设计体验一致。它使得你的工具软件不再零碎。<br>
有了它，你的电脑只需要安装必要的核心软件就可以了。</p>]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">相见恨晚的 PC 端工具集</p>
<p>当我搞明白这货的使用方法和运行逻辑之后，不仅效率提升了很多，我还卸载了十几个软件。</p>
</div>
<h2>本文重点</h2>
<p><a href="https://open.u-tools.cn/445779.html" target="_blank" rel="noopener noreferrer">https://open.u-tools.cn/445779.html</a></p>
<p>基于 nodejs 开发的跨平台工具集合。<br>
横跨 Mac、Windows、Linux 三大平台，设计体验一致。它使得你的工具软件不再零碎。<br>
有了它，你的电脑只需要安装必要的核心软件就可以了。</p>
<h2>一个截屏翻译软件引发惨案</h2>
<p>在 windows 下有一个神器： <code>有道词典</code><br>
我少数几个允许开机启动且后台常驻的软件。我的英文阅读水平一般，但我的工作经常会用到各种英文文档，所以翻译工具基本上是必不可少的。我一般都是把文字复制下来然后丢到软件当中去翻译，习惯了之后其实也没啥。但是有些文字是无法被复制的，这个时候是非常不方便的。</p>
<p>有道词典设置快捷键，直接像截图一样去识别屏幕上的英文语句，然后直接显示翻译结果，极大地提高了我的学习和工作效率。</p>
<p>但是！Mac 下没有这个功能。。。。</p>
<p>Mac 下我用的是这个玩意儿</p>
<p></p>
<p>还特么花了我 50 大洋，现在想一想，自己真是个大怨种。</p>
<p>嗯，这货号称 Mac 下最好的截屏翻译工具，也确实好用。但是，它采用的是 Mac 系统<code>快捷指令</code>实现的截屏翻译功能。但是 Mac 的 api 是不允许代理方问的。每次使用我都得关闭代理。。天呐，烦透了，但是没办法。配置其它的访问 api 都存在一定的限制或者费用。但是将就将就又不是不行。</p>
<p>然后前段时间 B 站发现了一个 UP 主推荐了 <code>uTolls</code>，好奇心驱使下就去下载体验了一下。</p>
<p></p>
<p></p>
<p></p>
<blockquote>
<p>注：Mac 和 Windows 体验完全一致</p>
</blockquote>
<p>其内部实现了一个叫做 <code>关键字</code> 的调用逻辑，每个插件都可以使用关键字来调用其它的关键字，一个插件可以有多个关键字。所有插件之间都是可以相互进行调用的。</p>
<p>于是就出现了各种组合，比如：<br>
<code>截图插件</code> + <code>OCR 识别插件</code> + <code>翻译插件</code> = <strong>截屏翻译功能</strong><br>
<code>截图插件</code> + <code>二维码解析插件</code> = <strong>扫码功能</strong> (PC 能扫码了，喜极而泣)<br>
<code>文本提取</code> + <code>网址精灵</code> = <strong>一键收藏网址</strong><br>
<code>文件提取</code> + <code>PDF转换器</code> = <strong>一键转换 PDF 文件</strong><br>
<code>文件提取</code> + <code>图片压缩</code> = <strong>一键压缩本地图片</strong><br>
<code>文件提取</code> + <code>搜索插件</code> = <strong>一键搜索本地文件</strong><br>
.....</p>
<p>VSCode 能像如今这般如火如荼，离不开丰富的插件生态，其插件生态丰富是因为它的插件核心语言是 Javascript。<br>
uTools 的插件语言，也是 Javascript。开发一个插件快捷而迅速，而且 uTools 软件本身磨平了一些系统 API 之间的差异。你编写的插件可以很方便的进行进行系统的各项操作。<br>
目前 uTools 插件市场 400 + 各类插件，他们组合搭配起来基本上可以<code>[一键]</code>解决你 90%以上的快捷问题。</p>
<p>自从有了 uTools ，我把电脑上大部分快捷键都取消了，并且卸载了一大票工具类软件。后台只需要运行一个工具类软件，那就是 <code>uTools</code>。</p>
<p>虽然它的截图功能存在一些问题，但是够用。我们一般使用截图也只是方便标注和发送而已。遇到一些特殊情况的截图，可以搭配使用系统自带的截图使用。关键问题是，一堆 IM 软件和工具不用再相互打架了。节省时间就是延长生命。</p>
<blockquote>
<p>截图工具并非 uTools 官方开发所以体验和功能很一般。但是官方开发的录屏工具却十分好用。可以看得出，社区出品的插件跟官方出品的插件质量上还是存在着一些差距。截图是一个很常用的功能，希望 uTools 官方能出手优化一下。</p>
</blockquote>
<h2>软件的使用演示</h2>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">1.计算机和操作系统</title>
    <id>https://mo7.cc/coder/basic/computer_and_os.html</id>
    <link href="https://mo7.cc/coder/basic/computer_and_os.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>注意：本文中的一些超链接你可能会打不开，那很可能是因为需要 <a href="/coder/basic/proxy_to_net.html" target="_blank">科学上网</a>。</p>
</div>
<h2>一、计算机的基本组成和工作原理</h2>
<p>先来一段计算机导论节选：</p>
]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>注意：本文中的一些超链接你可能会打不开，那很可能是因为需要 <a href="/coder/basic/proxy_to_net.html" target="_blank">科学上网</a>。</p>
</div>
<h2>一、计算机的基本组成和工作原理</h2>
<p>先来一段计算机导论节选：</p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">10.开源的那些事</title>
    <id>https://mo7.cc/coder/basic/open_source.html</id>
    <link href="https://mo7.cc/coder/basic/open_source.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>话不多说，直接看视频</p>
<hr>
<p><a href="https://www.bilibili.com/video/BV1n44y1b7Ta/" target="_blank" rel="noopener noreferrer">当我们在伤害开源的时候，在伤害什么？【差评君】</a></p>
]]></summary>
    <content type="html"><![CDATA[
<p>话不多说，直接看视频</p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">11.一套最舒适的开发环境</title>
    <id>https://mo7.cc/coder/basic/dev_env_ready.html</id>
    <link href="https://mo7.cc/coder/basic/dev_env_ready.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>一套最舒适 最好的开发环境应该是什么样子的呢？</p>
<h2>Windows</h2>
<ol>
<li>将系统更新到最新，包括驱动等</li>
<li>将系统归属地改为香港，设定好时间日期格式(设定为香港可以访问到更多有趣的内容)</li>
<li>在系统设置中配置好 <strong>开发者选项</strong></li>
<li>配置好 <a href="/misc/proxy_wall_ready.html" target="_blank">翻墙和代理服务</a></li>
<li>安装 <a href="https://www.google.com/chrome/" target="_blank" rel="noopener noreferrer">Chrome</a></li>
<li>安装并配置 <a href="/bookmark/tools/git/" target="_blank">Git</a></li>
<li>安装并配置 <a href="/bookmark/tools/vscode/" target="_blank">VSCode</a></li>
<li>安装并配置 <a href="/misc/wsl_ready.html" target="_blank">WSL</a></li>
<li>设定好 <a href="/misc/wsl_proxy.html" target="_blank">WSL 的系统代理</a></li>
<li>然后在 WSL 中像 <a href="/coder/linux/" target="_blank">Linux</a> 一样去使用 Windows 进行开发和编码</li>
<li>安装并设置 <a href="/bookmark/tools/uTools.html" target="_blank">uTools</a></li>
</ol>]]></summary>
    <content type="html"><![CDATA[
<p>一套最舒适 最好的开发环境应该是什么样子的呢？</p>
<h2>Windows</h2>
<ol>
<li>将系统更新到最新，包括驱动等</li>
<li>将系统归属地改为香港，设定好时间日期格式(设定为香港可以访问到更多有趣的内容)</li>
<li>在系统设置中配置好 <strong>开发者选项</strong></li>
<li>配置好 <a href="/misc/proxy_wall_ready.html" target="_blank">翻墙和代理服务</a></li>
<li>安装 <a href="https://www.google.com/chrome/" target="_blank" rel="noopener noreferrer">Chrome</a></li>
<li>安装并配置 <a href="/bookmark/tools/git/" target="_blank">Git</a></li>
<li>安装并配置 <a href="/bookmark/tools/vscode/" target="_blank">VSCode</a></li>
<li>安装并配置 <a href="/misc/wsl_ready.html" target="_blank">WSL</a></li>
<li>设定好 <a href="/misc/wsl_proxy.html" target="_blank">WSL 的系统代理</a></li>
<li>然后在 WSL 中像 <a href="/coder/linux/" target="_blank">Linux</a> 一样去使用 Windows 进行开发和编码</li>
<li>安装并设置 <a href="/bookmark/tools/uTools.html" target="_blank">uTools</a></li>
</ol>
<h2>macOS</h2>
<ol>
<li>检查系统更新</li>
<li>系统常规性设置，比如 <a href="https://support.apple.com/zh-cn/guide/mac-help/mchlp2304/mac" target="_blank" rel="noopener noreferrer">在 Mac 上显示或隐藏文件扩展名</a></li>
<li>配置好 <a href="/misc/proxy_wall_ready.html" target="_blank">翻墙和代理服务</a></li>
<li>安装 <a href="https://www.google.com/chrome/" target="_blank" rel="noopener noreferrer">Chrome</a></li>
<li>检查并配置好 <a href="https://support.apple.com/zh-cn/guide/terminal/welcome/mac" target="_blank" rel="noopener noreferrer">Terminal</a>，并安装 <a href="https://sysin.org/blog/macos-zsh/" target="_blank" rel="noopener noreferrer">oh-my-zsh </a></li>
<li>安装 <a href="https://brew.sh/" target="_blank" rel="noopener noreferrer">Homebrew</a></li>
<li>检查并配置 <a href="/bookmark/tools/git/" target="_blank">Git</a> 等常用命令</li>
<li>安装并配置 <a href="/bookmark/tools/vscode/" target="_blank">VSCode</a></li>
<li>安装并设置 <a href="/bookmark/tools/uTools.html" target="_blank">uTools</a></li>
</ol>
<h2>Linux</h2>
<p><a href="/coder/linux/" target="_blank">墨七编写的 Linux 系列文档</a></p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">12.关于编程语言的那些事儿</title>
    <id>https://mo7.cc/coder/basic/coding_market.html</id>
    <link href="https://mo7.cc/coder/basic/coding_market.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<h2>编程语言的分类</h2>
<h3><strong>1.机器语言：</strong></h3>
<p>机器语言是计算机最原始的语言，是一种<code>指令集</code>的体系。这种指令集称为<code>机器码</code>。仅由 <code>0</code> 和 <code>1</code> 组成。 CPU 在工作的时候只认识机器语言。每台机器都会存在自己的指令集。<br>
最早计算机是以 <a href="https://baike.baidu.com/item/%E7%A9%BF%E5%AD%94%E7%BA%B8%E5%B8%A6/1234150" target="_blank" rel="noopener noreferrer">穿孔纸带</a> 进行编程的。带孔为 1，无孔为 0，经过光电输入到计算机当中。纸带就充当了存储介质。后面被 <code>磁带</code> 所取代。<br>
机器语言的 可读性、可移植性差，编程非常繁杂。<br>
但是直接和机器打交道，运行速度可以接近硬件的极限，资源占用少；</p>]]></summary>
    <content type="html"><![CDATA[
<h2>编程语言的分类</h2>
<h3><strong>1.机器语言：</strong></h3>
<p>机器语言是计算机最原始的语言，是一种<code>指令集</code>的体系。这种指令集称为<code>机器码</code>。仅由 <code>0</code> 和 <code>1</code> 组成。 CPU 在工作的时候只认识机器语言。每台机器都会存在自己的指令集。<br>
最早计算机是以 <a href="https://baike.baidu.com/item/%E7%A9%BF%E5%AD%94%E7%BA%B8%E5%B8%A6/1234150" target="_blank" rel="noopener noreferrer">穿孔纸带</a> 进行编程的。带孔为 1，无孔为 0，经过光电输入到计算机当中。纸带就充当了存储介质。后面被 <code>磁带</code> 所取代。<br>
机器语言的 可读性、可移植性差，编程非常繁杂。<br>
但是直接和机器打交道，运行速度可以接近硬件的极限，资源占用少；</p>
<h3><strong>2.汇编语言</strong></h3>
<p><a href="https://baike.baidu.com/item/%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80/61826" target="_blank" rel="noopener noreferrer">汇编语言</a>，即一种低级语言，他用人类容易记忆的语言和符号来表示一组 <code>0</code> 和 <code>1</code> 的代码。相当于是 0 和 1 的一种高层次封装，一组 0 和 1 用一个单词表示。</p>
<p>不同的处理器有不同的汇编语言语法和编译器，编译的程序无法在不同的处理器上执行，缺乏可移植性，难于从汇编语言代码上理解程序设计意图，可维护性差，即使是完成简单的工作也需要大量的汇编语言代码，很容易产生 bug，难于调试，使用汇编语言必须对某种处理器非常了解，而且只能针对特定的体系结构和处理器进行优化，开发效率很低，周期长且单调。<br>
能够保持机器语言的一致性，直接、简捷，并能像机器指令一样访问、控制计算机的各种硬件设备，如磁盘、存储器、CPU、I/O 端口等。使用汇编语言，可以访问所有能够被访问的软、硬件资源，目标代码简短，占用内存少，执行速度快。</p>
<p>所以汇编语言一般用来开发 CPU 指令集，驱动程序，逆向工程，破解，单片机，嵌入式开发，系统底层开发等。</p>
<h3><strong>3.高级语言</strong></h3>
<p>运行速度和执行效率低于汇编语言，程序大小与编译器有关。<br>
高级语言接近 <a href="https://baike.baidu.com/item/%E7%AE%97%E6%B3%95%E8%AF%AD%E8%A8%80/10654294" target="_blank" rel="noopener noreferrer">算法语言</a> ，易学、易掌握，提供结构化程序设计的环境和工具，使得设计出来的程序可读性好，可维护性强，可靠性高；高级语言远离机器语言，与具体的计算机硬件关系不大，可移植性好，重用率高；由于把繁杂琐碎的事务交给了编译程序去做，所以自动化程度高，开发周期短，且程序员得到解脱，可以集中时间和精力去从事对于他们来说更为重要的创造性劳动，以提高程序的质量。</p>
<p>高级语言按照执行方式又可以被分为 <a href="https://zh.wikipedia.org/wiki/%E7%B7%A8%E8%AD%AF%E8%AA%9E%E8%A8%80" target="_blank" rel="noopener noreferrer">编译型语言</a> 和 <a href="https://zh.wikipedia.org/zh-sg/%E7%9B%B4%E8%AD%AF%E8%AA%9E%E8%A8%80" target="_blank" rel="noopener noreferrer">解释型语言</a></p>
<p><strong>编译型语言：</strong><br>
编译语言，一般会通过<a href="https://zh.wikipedia.org/wiki/%E7%B7%A8%E8%AD%AF%E5%99%A8" target="_blank" rel="noopener noreferrer">编译器</a>处理，先将<strong>代码</strong>编译为<strong>机器码</strong>，再加以执行。比如 <code>exe</code> 文件，以后需要运行的时候就不用再重新编译了，运行时不需要再编译，所以执行效率很高。</p>
<p><strong>解释型语言：</strong><br>
解释型语言，一般通过 <a href="https://zh.wikipedia.org/wiki/%E7%9B%B4%E8%AD%AF%E5%99%A8" target="_blank" rel="noopener noreferrer">解释器</a> 将代码一句一句直接执行，不需要像编译语言一样先编译为机器码之后再执行。在执行期，动态将代码逐句解释并执行。典型的如脚本语言。</p>
<p><strong>脚本语言：</strong><br>
脚本语言是一种解释型语言，脚本语言是为了缩短传统的编写-编译-链接-运行（edit-compile-link-run）过程而创建的计算机编程语言。脚本语言一般都 有相应的脚本引擎来解释执行。 他们一般需要解释器才能运行。一个脚本通常是解释运行而非编译。脚本语言通常都有简单、易学、易用的特性，目的就是希望能让程序员快速完成程序的编写工作。而<a href="https://baike.baidu.com/item/%E5%AE%8F%E8%AF%AD%E8%A8%80/21500677" target="_blank" rel="noopener noreferrer">宏语言</a>则可视为脚本语言的分支，两者也有实质上的相同之处。脚本语言一般都是以文本形式存在,类似于一种命令。</p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">2.路径和文件</title>
    <id>https://mo7.cc/coder/basic/file_and_path.html</id>
    <link href="https://mo7.cc/coder/basic/file_and_path.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>注意：本文中的一些超链接你可能会打不开，那很可能是因为需要 <a href="/coder/basic/proxy_to_net.html" target="_blank">科学上网</a>。</p>
</div>
<p><a href="https://zh.wikipedia.org/wiki/%E8%B7%AF%E5%BE%84_(%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6)" target="_blank" rel="noopener noreferrer">路径-维基百科</a></p>]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>注意：本文中的一些超链接你可能会打不开，那很可能是因为需要 <a href="/coder/basic/proxy_to_net.html" target="_blank">科学上网</a>。</p>
</div>
<p><a href="https://zh.wikipedia.org/wiki/%E8%B7%AF%E5%BE%84_(%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%A7%91%E5%AD%A6)" target="_blank" rel="noopener noreferrer">路径-维基百科</a></p>
<p>文件路径是用于描述文件系统资源的一个文本标识。 文件系统是对文件存储设备的空间进行组织和分配，负责文件存储并对存入的文件进行保护和检索的系统。 文件存放在外部存储器中的某些位置上，经由文件系统管理后，被系统以文件路径标识，系统可以通过文件路径检索到对应文件。</p>
<p>放一段视频：</p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">3.文件编码</title>
    <id>https://mo7.cc/coder/basic/file_utf8.html</id>
    <link href="https://mo7.cc/coder/basic/file_utf8.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>注意：本文中的一些超链接你可能会打不开，那很可能是因为需要 <a href="/coder/basic/proxy_to_net.html" target="_blank">科学上网</a>。</p>
</div>
<p>不知道你有没有遇到过，打开一个<code>.txt</code>文件却发现文件乱码了？这种时候往往是因为使用了不一样的编码格式去打开文件导致的。</p>
<p>比如当前正在编写的这篇文章，如果采用 <a href="https://zh.wikipedia.org/wiki/%E6%B1%89%E5%AD%97%E5%86%85%E7%A0%81%E6%89%A9%E5%B1%95%E8%A7%84%E8%8C%83" target="_blank" rel="noopener noreferrer">GBK</a> 编码打开，就会变成一堆不认识的字符：</p>]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>注意：本文中的一些超链接你可能会打不开，那很可能是因为需要 <a href="/coder/basic/proxy_to_net.html" target="_blank">科学上网</a>。</p>
</div>
<p>不知道你有没有遇到过，打开一个<code>.txt</code>文件却发现文件乱码了？这种时候往往是因为使用了不一样的编码格式去打开文件导致的。</p>
<p>比如当前正在编写的这篇文章，如果采用 <a href="https://zh.wikipedia.org/wiki/%E6%B1%89%E5%AD%97%E5%86%85%E7%A0%81%E6%89%A9%E5%B1%95%E8%A7%84%E8%8C%83" target="_blank" rel="noopener noreferrer">GBK</a> 编码打开，就会变成一堆不认识的字符：</p>
<figure><figcaption></figcaption></figure>
<p>但是同样的一篇文章采用 <a href="https://zh.wikipedia.org/wiki/UTF-8" target="_blank" rel="noopener noreferrer">UTF-8</a> 打开则可以正常阅读：</p>
<figure><figcaption></figcaption></figure>
<p>因为这篇文章就是在 <code>UTF-8</code> 编码规则下编写的。 而<code>GBK</code>编码是 windows 系统早期的默认编码。</p>
<div class="hint-container tip">
<p class="hint-container-title">提示</p>
<p>如果没啥特殊需求，一般编写文件内容默认使用 <code>UTF-8</code> 是一定没错的。 <code>UTF-8</code> 现在基本是大多数操作系统的默认编码。</p>
<p>也是因为编码的问题，所以一般来说，很多国外开发的老式软件无法在 中文目录下成功运行，所以目录名一般不推荐使用中文。</p>
</div>
<p>拓展阅读 <a href="https://www.cnblogs.com/Rainingday/p/14641104.html" target="_blank" rel="noopener noreferrer">ASCII 编码、GBK 编码，Unicode 编码和 UTF-8</a></p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">4.终端与 shell</title>
    <id>https://mo7.cc/coder/basic/cmd_shell.html</id>
    <link href="https://mo7.cc/coder/basic/cmd_shell.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>注意：本文中的一些超链接你可能会打不开，那很可能是因为需要 <a href="/coder/basic/proxy_to_net.html" target="_blank">科学上网</a>。</p>
</div>
<p>我觉得这里放一个视频就足以解释清楚了。</p>
]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>注意：本文中的一些超链接你可能会打不开，那很可能是因为需要 <a href="/coder/basic/proxy_to_net.html" target="_blank">科学上网</a>。</p>
</div>
<p>我觉得这里放一个视频就足以解释清楚了。</p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">5.系统软件包管理器</title>
    <id>https://mo7.cc/coder/basic/apt_homebrew.html</id>
    <link href="https://mo7.cc/coder/basic/apt_homebrew.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>注意：本文中的一些超链接你可能会打不开，那很可能是因为需要 <a href="/coder/basic/proxy_to_net.html" target="_blank">科学上网</a>。</p>
</div>
<p>当你学会命令行的基本使用之后，那么就相当于一只脚踏入了另一个世界。<br>
除了从应用商店安装下载之外，一般情况下还可以通过 <a href="https://juejin.cn/post/6884417656699486221" target="_blank" rel="noopener noreferrer">软件包管理系统</a> 来安装各种好用的命令和工具。</p>]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>注意：本文中的一些超链接你可能会打不开，那很可能是因为需要 <a href="/coder/basic/proxy_to_net.html" target="_blank">科学上网</a>。</p>
</div>
<p>当你学会命令行的基本使用之后，那么就相当于一只脚踏入了另一个世界。<br>
除了从应用商店安装下载之外，一般情况下还可以通过 <a href="https://juejin.cn/post/6884417656699486221" target="_blank" rel="noopener noreferrer">软件包管理系统</a> 来安装各种好用的命令和工具。</p>
<h2>Linux</h2>
<p>一般 debian 系 的系统比如 <code>Ubuntu</code> 默认的包管理器都是 <a href="https://blog.csdn.net/qq_50001789/article/details/131401922" target="_blank" rel="noopener noreferrer">apt 命令</a></p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token comment"># 例如 安装git命令</span></span>
<span class="line"><span class="token function">apt</span> <span class="token function">install</span> <span class="token function">git</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 卸载 git命令</span></span>
<span class="line"><span class="token function">apt</span> remove  <span class="token function">git</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 查看一些可更新的包</span></span>
<span class="line"><span class="token function">sudo</span> <span class="token function">apt</span> update</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 升级软件</span></span>
<span class="line"><span class="token function">sudo</span> <span class="token function">apt</span> upgrade</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 安装 curl</span></span>
<span class="line"><span class="token function">sudo</span> <span class="token function">apt</span> <span class="token function">install</span> <span class="token function">curl</span></span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">6.Git 与 Github</title>
    <id>https://mo7.cc/coder/basic/git_github.html</id>
    <link href="https://mo7.cc/coder/basic/git_github.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>注意：本文中的一些超链接你可能会打不开，那很可能是因为需要 <a href="/coder/basic/proxy_to_net.html" target="_blank">科学上网</a>。</p>
</div>
<p>这个系列视频讲解的非常好<br>
<a href="https://www.bilibili.com/video/BV1HM411377j/" target="_blank" rel="noopener noreferrer">https://www.bilibili.com/video/BV1HM411377j/</a></p>]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>注意：本文中的一些超链接你可能会打不开，那很可能是因为需要 <a href="/coder/basic/proxy_to_net.html" target="_blank">科学上网</a>。</p>
</div>
<p>这个系列视频讲解的非常好<br>
<a href="https://www.bilibili.com/video/BV1HM411377j/" target="_blank" rel="noopener noreferrer">https://www.bilibili.com/video/BV1HM411377j/</a></p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">7.Visual Studio Code</title>
    <id>https://mo7.cc/coder/basic/vscode.html</id>
    <link href="https://mo7.cc/coder/basic/vscode.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>这年头什么都有教学视频</p>
<p><a href="https://www.bilibili.com/video/BV1ug4y1571s/" target="_blank" rel="noopener noreferrer">https://www.bilibili.com/video/BV1ug4y1571s/</a></p>
]]></summary>
    <content type="html"><![CDATA[
<p>这年头什么都有教学视频</p>
<p><a href="https://www.bilibili.com/video/BV1ug4y1571s/" target="_blank" rel="noopener noreferrer">https://www.bilibili.com/video/BV1ug4y1571s/</a></p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">8.如何使用搜索引擎</title>
    <id>https://mo7.cc/coder/basic/search_engine.html</id>
    <link href="https://mo7.cc/coder/basic/search_engine.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>注意：本文中的一些超链接你可能会打不开，那很可能是因为需要 <a href="/coder/basic/proxy_to_net.html" target="_blank">科学上网</a>。</p>
</div>
<p><a href="https://zh.wikipedia.org/wiki/%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E" target="_blank" rel="noopener noreferrer">搜索引擎</a> 是一个跨时代的发明，基本上我们每天都会用到。但是你真的会使用搜索引擎吗？</p>]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>注意：本文中的一些超链接你可能会打不开，那很可能是因为需要 <a href="/coder/basic/proxy_to_net.html" target="_blank">科学上网</a>。</p>
</div>
<p><a href="https://zh.wikipedia.org/wiki/%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E" target="_blank" rel="noopener noreferrer">搜索引擎</a> 是一个跨时代的发明，基本上我们每天都会用到。但是你真的会使用搜索引擎吗？</p>
<h2>搜索引擎的选择</h2>
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>在中国，虽然大部分人都知道 <a href="https://www.baidu.com/" target="_blank" rel="noopener noreferrer">百度</a> ，但是身为一个搜索引擎它并没有履行好自己的职责。</p>
<p>有兴趣吃瓜的可以查看以下链接：</p>
<p><a href="https://zh.wikipedia.org/wiki/%E5%AF%B9%E7%99%BE%E5%BA%A6%E7%9A%84%E4%BA%89%E8%AE%AE" target="_blank" rel="noopener noreferrer">https://zh.wikipedia.org/wiki/对百度的争议</a></p>
<p><a href="https://www.zhihu.com/topic/20047674/hot" target="_blank" rel="noopener noreferrer">魏则西事件</a></p>
<p><strong>以上这些都只是一小部分。也就是说，你无法信任 百度 查询出来的任何东西。</strong></p>
</div>
<p>一般情况下，我推荐的搜索引擎只有两个</p>
<ol>
<li>微软出品的 <strong>必应搜索</strong> <a href="https://www.bing.com" target="_blank" rel="noopener noreferrer">https://www.bing.com</a> 。 <a href="https://cn.bing.com" target="_blank" rel="noopener noreferrer">https://cn.bing.com</a> 在国内也可以用。</li>
</ol>
<blockquote>
<p>不过实践证明，国内的 Bing 属于特供版，内容会不太一样。</p>
</blockquote>
<ol start="2">
<li>靠搜索家的 <strong>Google</strong> <a href="https://www.google.com/" target="_blank" rel="noopener noreferrer">https://www.google.com/</a> 可能需要掌握一定的 <a href="/misc/proxy_wall_ready.html" target="_blank">科学上网</a> 小技巧。</li>
</ol>
<h2>搜索引擎使用技巧</h2>
<p>只需要认真阅读这篇文章即可：</p>
<p><a href="https://www.runoob.com/w3cnote/search-engines-usage-skills.html" target="_blank" rel="noopener noreferrer">盘点全球搜索引擎及其使用技巧</a></p>
<h2>视频讲解</h2>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">9.科学上网和国内镜像</title>
    <id>https://mo7.cc/coder/basic/proxy_to_net.html</id>
    <link href="https://mo7.cc/coder/basic/proxy_to_net.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>什么是 <a href="https://cn.bing.com/search?q=%E7%A7%91%E5%AD%A6%E4%B8%8A%E7%BD%91" target="_blank" rel="noopener noreferrer">科学上网?</a></p>
]]></summary>
    <content type="html"><![CDATA[
<p>什么是 <a href="https://cn.bing.com/search?q=%E7%A7%91%E5%AD%A6%E4%B8%8A%E7%BD%91" target="_blank" rel="noopener noreferrer">科学上网?</a></p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">基础入门</title>
    <id>https://mo7.cc/coder/basic/</id>
    <link href="https://mo7.cc/coder/basic/"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<h2>前言</h2>
<p>前段时间 <a href="https://www.douyin.com/search/%E6%B7%98%E5%AE%9Dsteam%E4%BB%A3%E5%AE%89%E8%A3%85" target="_blank" rel="noopener noreferrer">淘宝 Steam 安装教程</a> 事件在网上大火。就是在大多数人看来 <code>安装Steam</code> 这么简单的一件事情居然会难倒这么多人。大家只是想玩一个游戏而已，为什么会如此魔幻?</p>
<p>一方面是国内的大环境下所有厂商都在尽全力让人们把视线转向移动端，尽可能<code>掠夺</code>大家的时间和精力。传统 PC 相关的技能普及度正在降低。<br>
另一方面是因为一些国家政策，<a href="https://zhidao.baidu.com/question/2137758630299885628.html" target="_blank" rel="noopener noreferrer">GFW</a> 的存在也让信息闭塞了起来，间接的增加了很多<code>门槛</code>。其中也包括了国内计算机基础知识的普及与落后。</p>]]></summary>
    <content type="html"><![CDATA[
<h2>前言</h2>
<p>前段时间 <a href="https://www.douyin.com/search/%E6%B7%98%E5%AE%9Dsteam%E4%BB%A3%E5%AE%89%E8%A3%85" target="_blank" rel="noopener noreferrer">淘宝 Steam 安装教程</a> 事件在网上大火。就是在大多数人看来 <code>安装Steam</code> 这么简单的一件事情居然会难倒这么多人。大家只是想玩一个游戏而已，为什么会如此魔幻?</p>
<p>一方面是国内的大环境下所有厂商都在尽全力让人们把视线转向移动端，尽可能<code>掠夺</code>大家的时间和精力。传统 PC 相关的技能普及度正在降低。<br>
另一方面是因为一些国家政策，<a href="https://zhidao.baidu.com/question/2137758630299885628.html" target="_blank" rel="noopener noreferrer">GFW</a> 的存在也让信息闭塞了起来，间接的增加了很多<code>门槛</code>。其中也包括了国内计算机基础知识的普及与落后。</p>
<p>我自己也是从编程小白一步步走过来的，我很清楚 对于一个小白来说， 想要靠自己打破认知壁垒入门编程是多么困难的一件事情。而编程在这个时代能做的事情实在是太多了太多了。掌握一定的编程技术无论是生活还是工作方便程度都能够带来质的飞跃。所以我特意花了几天时间编写了这篇 <code>基础教程</code>，希望可以帮助更多人。</p>
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<p>这些都是基础中的基础，如果不懂得这些知识和概念，你不是 <strong>计算机零基础</strong>，而是 <strong>负基础</strong> 。</p>
</div>
<h2>本教程文章列表</h2>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">1.Nodejs 基础环境搭建</title>
    <id>https://mo7.cc/coder/javascript/nodejs_ready.html</id>
    <link href="https://mo7.cc/coder/javascript/nodejs_ready.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>严格来说 <code>nodejs</code> 属于服务端的技术，并不属于 <code>Web 前端</code> , 但是当下前端开发基本上无法离开 <code>nodejs</code> 了。</p>
<p>官网地址：<br>
<a href="https://nodejs.org/" target="_blank" rel="noopener noreferrer">https://nodejs.org/</a></p>
<h2>在 macOS 和 Windows 上安装 Node.js</h2>
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>macOS 和 Windows 官方都有发布安专门的安装包，所以安装方式基本相同，但是得注意区分硬件架构。</p>
</div>]]></summary>
    <content type="html"><![CDATA[
<p>严格来说 <code>nodejs</code> 属于服务端的技术，并不属于 <code>Web 前端</code> , 但是当下前端开发基本上无法离开 <code>nodejs</code> 了。</p>
<p>官网地址：<br>
<a href="https://nodejs.org/" target="_blank" rel="noopener noreferrer">https://nodejs.org/</a></p>
<h2>在 macOS 和 Windows 上安装 Node.js</h2>
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>macOS 和 Windows 官方都有发布安专门的安装包，所以安装方式基本相同，但是得注意区分硬件架构。</p>
</div>
<h3>第一步，查看机器硬件架构类型</h3>
<p>打开终端做如下输入并回车</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">arch</span>
<span class="line"><span class="token comment"># 会打印显示如:  arm64 或 x86_64 或其它</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><details class="hint-container details"><summary>windows 下则是使用 sysyeminfo 命令</summary>
<figure><figcaption>sysyeminfo 命令示意图</figcaption></figure>
</details>
<h3>第二步，下载安装包</h3>
<p><a href="https://nodejs.org/en/download/prebuilt-installer" target="_blank" rel="noopener noreferrer">https://nodejs.org/en/download/prebuilt-installer</a></p>
<figure><figcaption>下载NodeJS</figcaption></figure>
<p>然后双击运行无脑下一步。</p>
<h2>Linux 下安装 NodeJs</h2>
<p>Github 文档:</p>
<p><a href="https://github.com/nodesource/distributions" target="_blank" rel="noopener noreferrer">https://github.com/nodesource/distributions</a></p>
<p>总结下来就 3 行命令</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">curl</span> <span class="token parameter variable">-fsSL</span> https://deb.nodesource.com/setup_lts.x <span class="token parameter variable">-o</span> nodesource_setup.sh</span>
<span class="line"><span class="token function">bash</span> nodesource_setup.sh</span>
<span class="line"><span class="token function">apt-get</span> <span class="token function">install</span> <span class="token parameter variable">-y</span> nodejs</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Github 文档写的非常详细，这里就不再赘述了。</p>
<h2>验证安装结果</h2>
<p>重启终端做如下输入</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">node</span> <span class="token parameter variable">-v</span></span>
<span class="line"><span class="token comment"># 会打印当前 nodejs 版本如： v20.12.2</span></span>
<span class="line"></span>
<span class="line"><span class="token function">npm</span> <span class="token parameter variable">-v</span></span>
<span class="line"><span class="token comment"># 会打印当前 npm 版本如： 10.5.2</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><blockquote>
<p>至此 nodejs 安装成功</p>
</blockquote>
<h2>npm 加速设置</h2>
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>npm 是 nodejs 的默认包管理器，其官方镜像地址 <a href="https://registry.npmjs.org" target="_blank" rel="noopener noreferrer">https://registry.npmjs.org</a> 在海外，直接使用会出现各种依赖安装失败的问题。<br>
所以一般都会采用国内镜像，或者设置代理服务。</p>
</div>
<h3>1. 使用阿里云镜像</h3>
<p>阿里云镜像应该是目前国内使用最普遍的 npm 镜像站了</p>
<p>镜像官网：<br>
<a href="https://www.npmmirror.com/" target="_blank" rel="noopener noreferrer">https://www.npmmirror.com/</a></p>
<p>直接执行如下命令即可完成镜像源的替换</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">npm</span> config <span class="token builtin class-name">set</span> registry https://registry.npmmirror.com</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><details class="hint-container details"><summary>详情</summary>
<p>它会创建 <code>~/.npmrc</code> 文件，并填充如下内容</p>
<div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line">registry<span class="token operator">=</span>https<span class="token operator">:</span><span class="token operator">/</span><span class="token operator">/</span>registry<span class="token punctuation">.</span>npmmirror<span class="token punctuation">.</span>com</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>这个配置文件如果放在 <code>~/.npmrc</code> 用户目录下就是全局设置，如果放在项目目录下 <code>./.npmrc</code>，则作为项目的独立设置。</p>
<p>同理，想要换回官方镜像，手动删除 <code>~/.npmrc</code> 中对应的配置项，或者执行如下命令</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">npm</span> config delete registry</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div></details>
<h3>2. 使用全局的命令行代理</h3>
<blockquote>
<p>具体细节可参考文章 <a href="/misc/proxy_wall_ready.html" target="_blank">科学上网与本地代理</a></p>
</blockquote>
<p>如果你把代理关了，使用 npm 更新依赖时会有如下显示</p>
<figure><figcaption>npm更新依赖报错</figcaption></figure>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">2.fnm 管理 Nodejs</title>
    <id>https://mo7.cc/coder/javascript/fnm_ready.html</id>
    <link href="https://mo7.cc/coder/javascript/fnm_ready.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>当你本地存在多个项目，且依赖的 nodejs 版本不尽相同，就需要使用 nodejs 版本管理工具了，它允许同一台机器中多个 nodejs 版本共存且可以随时切换。</p>
<p>fnm 类似于 nvm，是一个 nodejs 版本管理工具， 他比 nvm 更加迅速，应该是目前已知最好的 nodejs 版本管理工具。</p>
<p>fnm 的特点是:</p>
<ul>
<li>跨平台，支持 macOS、Windows、Linux。</li>
<li>使用 Rust 编写，速度快。发布为单文件，便于安装。</li>
<li>支持按应用自动切换 Node.js 版本。</li>
</ul>
]]></summary>
    <content type="html"><![CDATA[
<p>当你本地存在多个项目，且依赖的 nodejs 版本不尽相同，就需要使用 nodejs 版本管理工具了，它允许同一台机器中多个 nodejs 版本共存且可以随时切换。</p>
<p>fnm 类似于 nvm，是一个 nodejs 版本管理工具， 他比 nvm 更加迅速，应该是目前已知最好的 nodejs 版本管理工具。</p>
<p>fnm 的特点是:</p>
<ul>
<li>跨平台，支持 macOS、Windows、Linux。</li>
<li>使用 Rust 编写，速度快。发布为单文件，便于安装。</li>
<li>支持按应用自动切换 Node.js 版本。</li>
</ul>
<p>fnm 的 Github 仓库地址：<br>
<a href="https://github.com/Schniz/fnm" target="_blank" rel="noopener noreferrer">https://github.com/Schniz/fnm</a></p>
<h2>安装 fnm</h2>
<p>macOS &amp;&amp; Linux</p>
<p>第一步， 打开命令行执行如下操作</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">curl</span> <span class="token parameter variable">-fsSL</span> https://fnm.vercel.app/install <span class="token operator">|</span> <span class="token function">bash</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>第二步， 添加如下环境变量配置国内镜像</p>
<div class="code-block-with-title">
  <div class="code-block-title-bar" data-title="~/.zshenv 或 ~/.bashrc 文件中">
    <span>~/.zshenv 或 ~/.bashrc 文件中</span>
  </div>
  <div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token comment">#  ~/.zshenv 或 ~/.bashrc 文件中:</span></span>
<span class="line"><span class="token builtin class-name">export</span> <span class="token assign-left variable">FNM_NODE_DIST_MIRROR</span><span class="token operator">=</span>https://npmmirror.com/mirrors/node/</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div>
</div><h2>fnm 的基本使用</h2>
<p>罗列远程服务器上所有的 nodejs 版本</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">fnm ls-remote</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">3.Web 前端开发入门</title>
    <id>https://mo7.cc/coder/javascript/web_develop_ready.html</id>
    <link href="https://mo7.cc/coder/javascript/web_develop_ready.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>想一想这一篇应该怎么去讲解。</p>
<p>在任意位置新建文件 <code>demo.html</code> :</p>
<div class="code-block-with-title">
  <div class="code-block-title-bar" data-title="./demo.html">
    <span>./demo.html</span>
  </div>
  <div class="language-html line-numbers-mode" data-highlighter="prismjs" data-ext="html"><pre><code class="language-html"><span class="line"><span class="token doctype"><span class="token punctuation">&lt;!</span><span class="token doctype-tag">DOCTYPE</span> <span class="token name">html</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>UTF-8<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">&gt;</span></span>Hello World<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>style</span><span class="token punctuation">&gt;</span></span><span class="token style"><span class="token language-css"></span>
<span class="line">      <span class="token selector">.content</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token property">color</span><span class="token punctuation">:</span> red<span class="token punctuation">;</span></span>
<span class="line">        <span class="token property">border</span><span class="token punctuation">:</span> 3px solid black<span class="token punctuation">;</span></span>
<span class="line">      <span class="token punctuation">}</span></span>
<span class="line">    </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>style</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">&gt;</span></span>Hello World<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>content<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>Hello World , 这里是第一个 html 网页<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>button</span> <span class="token special-attr"><span class="token attr-name">onclick</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token value javascript language-javascript"><span class="token function">SayHello</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span><span class="token punctuation">"</span></span></span><span class="token punctuation">&gt;</span></span>点我say hello<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>button</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">&gt;</span></span><span class="token script"><span class="token language-javascript"></span>
<span class="line">  <span class="token keyword">function</span> <span class="token function">SayHello</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">alert</span><span class="token punctuation">(</span><span class="token string">'Hello World'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>
</div>]]></summary>
    <content type="html"><![CDATA[
<p>想一想这一篇应该怎么去讲解。</p>
<p>在任意位置新建文件 <code>demo.html</code> :</p>
<div class="code-block-with-title">
  <div class="code-block-title-bar" data-title="./demo.html">
    <span>./demo.html</span>
  </div>
  <div class="language-html line-numbers-mode" data-highlighter="prismjs" data-ext="html"><pre><code class="language-html"><span class="line"><span class="token doctype"><span class="token punctuation">&lt;!</span><span class="token doctype-tag">DOCTYPE</span> <span class="token name">html</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>UTF-8<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">&gt;</span></span>Hello World<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>style</span><span class="token punctuation">&gt;</span></span><span class="token style"><span class="token language-css"></span>
<span class="line">      <span class="token selector">.content</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token property">color</span><span class="token punctuation">:</span> red<span class="token punctuation">;</span></span>
<span class="line">        <span class="token property">border</span><span class="token punctuation">:</span> 3px solid black<span class="token punctuation">;</span></span>
<span class="line">      <span class="token punctuation">}</span></span>
<span class="line">    </span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>style</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">&gt;</span></span>Hello World<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>content<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>Hello World , 这里是第一个 html 网页<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>button</span> <span class="token special-attr"><span class="token attr-name">onclick</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token value javascript language-javascript"><span class="token function">SayHello</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span><span class="token punctuation">"</span></span></span><span class="token punctuation">&gt;</span></span>点我say hello<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>button</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">&gt;</span></span><span class="token script"><span class="token language-javascript"></span>
<span class="line">  <span class="token keyword">function</span> <span class="token function">SayHello</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">alert</span><span class="token punctuation">(</span><span class="token string">'Hello World'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>
</div><p>保存后 浏览器打开会显示以下内容：</p>
<figure><figcaption>demo.html 内容</figcaption></figure>
<h2>html 结构说明</h2>
<figure><figcaption>demo.html 结构说明</figcaption></figure>
<p>一般来说，一个 html 文件的基本结构如下：</p>
<ol>
<li>一个基本的文档类型声明</li>
</ol>
<div class="language-html line-numbers-mode" data-highlighter="prismjs" data-ext="html"><pre><code class="language-html"><span class="line"><span class="token doctype"><span class="token punctuation">&lt;!</span><span class="token doctype-tag">DOCTYPE</span> <span class="token name">html</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><ol start="2">
<li><code>&lt;html&gt; &lt;/html&gt;</code> 标签 包裹下的 <code>&lt;body&gt; &lt;/body&gt;</code> 和 <code>&lt;head&gt; &lt;/head&gt;</code> 标签</li>
</ol>
<div class="language-html line-numbers-mode" data-highlighter="prismjs" data-ext="html"><pre><code class="language-html"><span class="line"><span class="token doctype"><span class="token punctuation">&lt;!</span><span class="token doctype-tag">DOCTYPE</span> <span class="token name">html</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">    <span class="token comment">&lt;!-- head 头声明部分， 这里一般放置一些 title 声明。引用相关的 --&gt;</span></span>
<span class="line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">    <span class="token comment">&lt;!-- 文档的内容部分，这里是文档的主体部分，主要是表明浏览器需要渲染的标签内容 --&gt;</span></span>
<span class="line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>大部分的标签全部都是 <strong>成对</strong> 存在的，把内容包裹在其中。标签之间可以相互嵌套。</p>
<ol start="3">
<li>css 部分</li>
</ol>
<div class="language-html line-numbers-mode" data-highlighter="prismjs" data-ext="html"><pre><code class="language-html"><span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>style</span><span class="token punctuation">&gt;</span></span><span class="token style"><span class="token language-css"></span>
<span class="line">  <span class="token comment">/* css 样式内容  */</span></span>
<span class="line"></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>style</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span>
<span class="line"><span class="token comment">&lt;!-- 引入外部的 css 文件: --&gt;</span></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>text/css<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>./theme.css<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>CSS 又被成为 <strong>层叠样式表</strong> ，它更像是一份声明文件，声明该以什么样的形式去绘制 标签的外观。现在大部分的过渡动画都以 CSS 的形式去进行表述。CSS 具有极高的渲染性能。</p>
<ol start="4">
<li>javascript 脚本部分</li>
</ol>
<div class="language-html line-numbers-mode" data-highlighter="prismjs" data-ext="html"><pre><code class="language-html"><span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">&gt;</span></span><span class="token script"><span class="token language-javascript"></span>
<span class="line">  <span class="token comment">/* javascript 脚本内容  */</span></span>
<span class="line"></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span>
<span class="line"><span class="token comment">&lt;!-- 引入外部的 js 文件: --&gt;</span></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>./main.js<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>javascript</code> 是一门图灵完备的脚本语言，浏览器中的一等公民。<br>
在 <code>nodejs</code> 的帮助下，它可以脱离浏览器运行在主机上面进行服务端开发。这是唯一一门 <strong>全栈</strong> 类型的编程语言。<br>
也是目前全球使用最广泛的编程语言。 也是使用人数最多的编程语言。</p>
<p>它不仅仅只用于编写网页，包括服务端开发，小程序开发，在一些技术的加持下 还包括 Android 和 ios 应用开发。嗯，除此之外它还能做很多很多的事情。<br>
虽然相比较其它编程语言它的执行效率比较低，但是它更加易于学习，用途更加广泛，上手门槛更低，开发速度更快。<br>
得益于 各大浏览器内核的内卷，它在 <code>解释型语言</code> 中也属于性能最好的那一类。</p>
<p><code>javascript</code> 是最适合小白入门的编程语言。</p>
<h2>入门教学</h2>
<p>因为实在是太过简单，基础部分的学习资料实在是太多了，这里我找到了一个夹带私货最少，废话最少的一个 B 站教学视频。</p>
<p><a href="https://www.bilibili.com/video/BV1BT4y1W7Aw" target="_blank" rel="noopener noreferrer">3 小时前端入门教程（HTML+CSS+JS）</a></p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">npm 常用命令</title>
    <id>https://mo7.cc/coder/javascript/npm.html</id>
    <link href="https://mo7.cc/coder/javascript/npm.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>该文档有待补充和完善</p>
</div>
<h2>阿里巴巴开源镜像站</h2>
<p><a href="https://developer.aliyun.com/mirror/" target="_blank" rel="noopener noreferrer">https://developer.aliyun.com/mirror/</a></p>
<h2>npm 镜像站</h2>
<p><a href="http://www.npmmirror.com/" target="_blank" rel="noopener noreferrer">http://www.npmmirror.com/</a></p>]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>该文档有待补充和完善</p>
</div>
<h2>阿里巴巴开源镜像站</h2>
<p><a href="https://developer.aliyun.com/mirror/" target="_blank" rel="noopener noreferrer">https://developer.aliyun.com/mirror/</a></p>
<h2>npm 镜像站</h2>
<p><a href="http://www.npmmirror.com/" target="_blank" rel="noopener noreferrer">http://www.npmmirror.com/</a></p>
<h2>Linux 设置本地代理</h2>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"></span>
<span class="line"><span class="token builtin class-name">export</span> <span class="token assign-left variable">ALL_PROXY</span><span class="token operator">=</span>socks5://127.0.0.1:10808</span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>一些其它指令</h2>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"></span>
<span class="line"><span class="token comment">## npm 升级</span></span>
<span class="line"><span class="token function">npm</span> <span class="token parameter variable">-g</span> <span class="token function">install</span> <span class="token function">npm</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">## 清除缓存</span></span>
<span class="line"><span class="token function">npm</span> cache clean <span class="token parameter variable">--force</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">## 卸载</span></span>
<span class="line"></span>
<span class="line"><span class="token function">npm</span> uninstall xxx <span class="token punctuation">(</span>-g<span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span class="token comment">## 查看更新</span></span>
<span class="line"><span class="token function">npm</span> <span class="token parameter variable">-g</span> outdated</span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span class="token comment">## 其它指令</span></span>
<span class="line"></span>
<span class="line"><span class="token function">npm</span> audit fix</span>
<span class="line"></span>
<span class="line"><span class="token function">npm</span> audit fix <span class="token parameter variable">--force</span></span>
<span class="line"></span>
<span class="line"><span class="token function">npm</span> audit</span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">pm2 最好用的后台守护进程</title>
    <id>https://mo7.cc/coder/javascript/pm2.html</id>
    <link href="https://mo7.cc/coder/javascript/pm2.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>该文档有待补充和完善</p>
</div>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token comment">#安装</span></span>
<span class="line"><span class="token function">npm</span> <span class="token function">install</span> pm2 <span class="token parameter variable">-g</span></span>
<span class="line"><span class="token comment">#启动进程</span></span>
<span class="line">pm2 start app.js</span>
<span class="line"><span class="token comment">#停止进程</span></span>
<span class="line">pm2 stop app.js</span>
<span class="line"><span class="token comment">#查看进程</span></span>
<span class="line">pm2 list</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>该文档有待补充和完善</p>
</div>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token comment">#安装</span></span>
<span class="line"><span class="token function">npm</span> <span class="token function">install</span> pm2 <span class="token parameter variable">-g</span></span>
<span class="line"><span class="token comment">#启动进程</span></span>
<span class="line">pm2 start app.js</span>
<span class="line"><span class="token comment">#停止进程</span></span>
<span class="line">pm2 stop app.js</span>
<span class="line"><span class="token comment">#查看进程</span></span>
<span class="line">pm2 list</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">JavaScript/TypeScript</title>
    <id>https://mo7.cc/coder/javascript/</id>
    <link href="https://mo7.cc/coder/javascript/"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">Web 前端开发</p>
</div>
<hr>
]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">Web 前端开发</p>
</div>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">url 解析</title>
    <id>https://mo7.cc/coder/javascript/url_parse.html</id>
    <link href="https://mo7.cc/coder/javascript/url_parse.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>该文档有待补充和完善</p>
</div>
<div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line">parse  解析</span>
<span class="line">url<span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span><span class="token string">"地址"</span><span class="token punctuation">,</span><span class="token string">"是否解析参数 [true/false]"</span><span class="token punctuation">,</span><span class="token string">"解析没有协议的路径 [true/false]"</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">format 格式化</span>
<span class="line">url<span class="token punctuation">.</span><span class="token function">format</span><span class="token punctuation">(</span><span class="token string">"地址对象"</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">resolve 溶解</span>
<span class="line">url<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span><span class="token string">"地址"</span><span class="token punctuation">,</span><span class="token string">"目录"</span><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>该文档有待补充和完善</p>
</div>
<div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line">parse  解析</span>
<span class="line">url<span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span><span class="token string">"地址"</span><span class="token punctuation">,</span><span class="token string">"是否解析参数 [true/false]"</span><span class="token punctuation">,</span><span class="token string">"解析没有协议的路径 [true/false]"</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">format 格式化</span>
<span class="line">url<span class="token punctuation">.</span><span class="token function">format</span><span class="token punctuation">(</span><span class="token string">"地址对象"</span><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line">resolve 溶解</span>
<span class="line">url<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span><span class="token string">"地址"</span><span class="token punctuation">,</span><span class="token string">"目录"</span><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">LeetCode</title>
    <id>https://mo7.cc/coder/leetcode/</id>
    <link href="https://mo7.cc/coder/leetcode/"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">LeetCode 每天一道脑筋急转弯，防止老年痴呆。</p>
<p>程序员版本的脑筋急转弯。</p>
<p>刷 LeetCode 防止老年痴呆。</p>
<p>个人主页：<a href="https://leetcode.cn/u/mo7cc/" target="_blank" rel="noopener noreferrer">https://leetcode.cn/u/mo7cc/</a></p>
</div>
<hr>
]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">LeetCode 每天一道脑筋急转弯，防止老年痴呆。</p>
<p>程序员版本的脑筋急转弯。</p>
<p>刷 LeetCode 防止老年痴呆。</p>
<p>个人主页：<a href="https://leetcode.cn/u/mo7cc/" target="_blank" rel="noopener noreferrer">https://leetcode.cn/u/mo7cc/</a></p>
</div>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">1.安装</title>
    <id>https://mo7.cc/coder/go/golang_install.html</id>
    <link href="https://mo7.cc/coder/go/golang_install.html"/>
    <updated>2025-08-23T08:31:10.000Z</updated>
    <summary type="html"><![CDATA[
<p>官网地址：<br>
<a href="https://golang.google.cn/" target="_blank" rel="noopener noreferrer">https://golang.google.cn/</a></p>
<p>国内 Wiki<br>
<a href="https://learnku.com/go/wikis" target="_blank" rel="noopener noreferrer">https://learnku.com/go/wikis</a></p>
<h2>Linux</h2>
<p>可以无脑的依次执行以下命令:</p>
<div class="hint-container warning">
<p class="hint-container-title">注意！</p>
<p>一定要区分系统的架构类型，尤其是常见的 amd 和 arm 架构。<br>
每次版本更新时 只需要将版本号 <code>go1.23.2</code> 换成最新版本号即可。</p>
</div>]]></summary>
    <content type="html"><![CDATA[
<p>官网地址：<br>
<a href="https://golang.google.cn/" target="_blank" rel="noopener noreferrer">https://golang.google.cn/</a></p>
<p>国内 Wiki<br>
<a href="https://learnku.com/go/wikis" target="_blank" rel="noopener noreferrer">https://learnku.com/go/wikis</a></p>
<h2>Linux</h2>
<p>可以无脑的依次执行以下命令:</p>
<div class="hint-container warning">
<p class="hint-container-title">注意！</p>
<p>一定要区分系统的架构类型，尤其是常见的 amd 和 arm 架构。<br>
每次版本更新时 只需要将版本号 <code>go1.23.2</code> 换成最新版本号即可。</p>
</div>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token shebang important">#!/bin/bash</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 查看系统类型</span></span>
<span class="line">arch</span>
<span class="line"><span class="token comment"># 下载地址(x86_64)</span></span>
<span class="line"><span class="token assign-left variable">DownloadUrl</span><span class="token operator">=</span><span class="token string">"https://dl.google.com/go/go1.23.6.linux-amd64.tar.gz"</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 下载地址(aarch64 arm64)</span></span>
<span class="line"><span class="token comment"># DownloadUrl="https://dl.google.com/go/go1.23.6.linux-arm64.tar.gz"</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 其余系统类型的下载地址可以查看 https://golang.google.cn/dl/</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 开始下载</span></span>
<span class="line"><span class="token function">curl</span> <span class="token parameter variable">-o</span> <span class="token string">"goPackage"</span> <span class="token string">"<span class="token variable">${DownloadUrl}</span>"</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 删除老版本(亲测，不删除老版本会出现各种莫名其妙的问题)</span></span>
<span class="line"><span class="token function">rm</span> <span class="token parameter variable">-rf</span> /usr/lib/go</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 解压 goPackage 到 /usr/lib/go</span></span>
<span class="line"><span class="token function">sudo</span> <span class="token function">tar</span> <span class="token parameter variable">-zxvf</span> goPackage <span class="token parameter variable">-C</span> /usr/lib</span>
<span class="line"></span>
<span class="line"><span class="token comment">#  删除 goPackage</span></span>
<span class="line"><span class="token function">rm</span> <span class="token parameter variable">-rf</span> goPackage</span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>此时 go 已经被安装到 <code>/usr/lib/go</code> 中了，接下来只需要将 go 指令添加到环境变量中。</p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">mongo - golang 操作</title>
    <id>https://mo7.cc/coder/go/go_mongo.html</id>
    <link href="https://mo7.cc/coder/go/go_mongo.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>该文档有待补充和完善</p>
</div>
<p>任务：</p>
<ol>
<li>创建一个数据库，名为：bz</li>
<li>创建一个长度为 8 的固定集合</li>
<li>获取地址数组插入</li>
</ol>
<div class="language-json line-numbers-mode" data-highlighter="prismjs" data-ext="json"><pre><code class="language-json"><span class="line"><span class="token punctuation">{</span></span>
<span class="line">  <span class="token property">"_id"</span><span class="token operator">:</span> <span class="token number">1</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"url"</span><span class="token operator">:</span> <span class="token string">"xxxx"</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>该文档有待补充和完善</p>
</div>
<p>任务：</p>
<ol>
<li>创建一个数据库，名为：bz</li>
<li>创建一个长度为 8 的固定集合</li>
<li>获取地址数组插入</li>
</ol>
<div class="language-json line-numbers-mode" data-highlighter="prismjs" data-ext="json"><pre><code class="language-json"><span class="line"><span class="token punctuation">{</span></span>
<span class="line">  <span class="token property">"_id"</span><span class="token operator">:</span> <span class="token number">1</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"url"</span><span class="token operator">:</span> <span class="token string">"xxxx"</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ol start="4">
<li>获取地址数组进行返回与填充</li>
</ol>
<div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line">db<span class="token punctuation">.</span><span class="token function">createCollection</span><span class="token punctuation">(</span><span class="token string">'bingUrl'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> <span class="token literal-property property">capped</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token literal-property property">size</span><span class="token operator">:</span> <span class="token number">8</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">db<span class="token punctuation">.</span>bingUrl<span class="token punctuation">.</span><span class="token function">isCapped</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">db<span class="token punctuation">.</span>bingUrl<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span>
<span class="line">  <span class="token literal-property property">_id</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token literal-property property">url</span><span class="token operator">:</span> <span class="token string">'https://bing.com'</span><span class="token punctuation">,</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>属性 1:对固定集合进行插入速度极快<br>
属性 2:按照插入顺序的查询输出速度极快<br>
属性 3:能够在插入最新数据时,淘汰最早的数据</p>
<h2>使用文档</h2>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">Go</title>
    <id>https://mo7.cc/coder/go/</id>
    <link href="https://mo7.cc/coder/go/"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>go 语言，Golang，go</p>
<p>是一门极其优秀且发展势头迅猛的语言，豪横的生父阵容。<br>
静态强类型，易于维护，语法简洁，特性简单。<br>
极低的上手门槛和不亚于 Python 的开发速度。<br>
然后还有位于第一梯队的编译和运行速度。<br>
go 在各个方面都达到了一种非常棒的平衡。<br>
是一门非常值得学习和用于构建的编程语言。</p>
]]></summary>
    <content type="html"><![CDATA[
<p>go 语言，Golang，go</p>
<p>是一门极其优秀且发展势头迅猛的语言，豪横的生父阵容。<br>
静态强类型，易于维护，语法简洁，特性简单。<br>
极低的上手门槛和不亚于 Python 的开发速度。<br>
然后还有位于第一梯队的编译和运行速度。<br>
go 在各个方面都达到了一种非常棒的平衡。<br>
是一门非常值得学习和用于构建的编程语言。</p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">当红开发语言 Go，真的是未来的技术主流吗？</title>
    <id>https://mo7.cc/coder/go/golang_viewpoint.html</id>
    <link href="https://mo7.cc/coder/go/golang_viewpoint.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>这个问题不能从技术角度考虑，要从【市场】角度考虑。</p>
<p>一、目前应用程序的主流是什么？</p>
<ol>
<li>桌面（Mac，Win，Linux）</li>
<li>移动 App（Android，Ios）</li>
<li>Web（浏览器以各种 App、系统内套壳页面，鸿蒙，小程序 都算这一类吧~）</li>
<li>嵌入式（各种硬件交互，传感器，硬件控制，通信）</li>
<li>工控软件（嵌入式软件、工业控制组态软件、PLC 编程软件等）</li>
<li>...等等等</li>
</ol>
<p>二、开展一个项目选用一个编程语言的标准是什么</p>
<ol>
<li>待开发系统的应用领域，即项目的应用范围。</li>
<li>应用形式（全平台，还是单平台，还是硬件集成，一体机）</li>
<li>应用规模（toB 还是 toC ，日活多少，顶峰访问量会有多少 ）</li>
<li>架构模式（分布式？事件总线？分层模式？有些语言在开发成熟的架构模式下，运维体系啥的）</li>
<li>支持平台（某些平台 SDK 只支持某一部分语言，甚至是指定语言）</li>
<li>开发周期（是可以慢工出细活，自研自控，还是说只图一个快，早上线早超生）</li>
<li>硬件要求（单片机还是服务器？是否要上集群和规模）</li>
<li>语言生态（生态丰富成熟的语言开发速度确实会比较快）</li>
<li>好不好招人（也就是所谓的用工成本）</li>
</ol>]]></summary>
    <content type="html"><![CDATA[
<p>这个问题不能从技术角度考虑，要从【市场】角度考虑。</p>
<p>一、目前应用程序的主流是什么？</p>
<ol>
<li>桌面（Mac，Win，Linux）</li>
<li>移动 App（Android，Ios）</li>
<li>Web（浏览器以各种 App、系统内套壳页面，鸿蒙，小程序 都算这一类吧~）</li>
<li>嵌入式（各种硬件交互，传感器，硬件控制，通信）</li>
<li>工控软件（嵌入式软件、工业控制组态软件、PLC 编程软件等）</li>
<li>...等等等</li>
</ol>
<p>二、开展一个项目选用一个编程语言的标准是什么</p>
<ol>
<li>待开发系统的应用领域，即项目的应用范围。</li>
<li>应用形式（全平台，还是单平台，还是硬件集成，一体机）</li>
<li>应用规模（toB 还是 toC ，日活多少，顶峰访问量会有多少 ）</li>
<li>架构模式（分布式？事件总线？分层模式？有些语言在开发成熟的架构模式下，运维体系啥的）</li>
<li>支持平台（某些平台 SDK 只支持某一部分语言，甚至是指定语言）</li>
<li>开发周期（是可以慢工出细活，自研自控，还是说只图一个快，早上线早超生）</li>
<li>硬件要求（单片机还是服务器？是否要上集群和规模）</li>
<li>语言生态（生态丰富成熟的语言开发速度确实会比较快）</li>
<li>好不好招人（也就是所谓的用工成本）</li>
</ol>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">将 golang 作为脚本语言使用</title>
    <id>https://mo7.cc/coder/go/golang_shell.html</id>
    <link href="https://mo7.cc/coder/go/golang_shell.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>该文档有待补充和完善</p>
</div>
<p>为什么？</p>
<p><a href="https://github.com/erning/gorun" target="_blank" rel="noopener noreferrer">https://github.com/erning/gorun</a></p>
<h2>使用方式</h2>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token comment"># 安装 gorun</span></span>
<span class="line">go <span class="token function">install</span> github.com/erning/gorun@latest</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 添加环境变量</span></span>
<span class="line"><span class="token function">sudo</span> <span class="token function">ln</span> <span class="token parameter variable">-s</span> ~/go/bin/gorun /usr/local/bin/gorun</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 使用方式</span></span>
<span class="line">gorun demo.go</span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>该文档有待补充和完善</p>
</div>
<p>为什么？</p>
<p><a href="https://github.com/erning/gorun" target="_blank" rel="noopener noreferrer">https://github.com/erning/gorun</a></p>
<h2>使用方式</h2>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token comment"># 安装 gorun</span></span>
<span class="line">go <span class="token function">install</span> github.com/erning/gorun@latest</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 添加环境变量</span></span>
<span class="line"><span class="token function">sudo</span> <span class="token function">ln</span> <span class="token parameter variable">-s</span> ~/go/bin/gorun /usr/local/bin/gorun</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 使用方式</span></span>
<span class="line">gorun demo.go</span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>区别</h2>
<div class="code-block-with-title">
  <div class="code-block-title-bar" data-title="file:main.go">
    <span>file:main.go</span>
  </div>
  <div class="language-go line-numbers-mode" data-highlighter="prismjs" data-ext="go"><pre><code class="language-go"><span class="line"><span class="token comment">// 2&gt;/dev/null ; gorun "$0" "$@" ; exit $?</span></span>
<span class="line"><span class="token keyword">package</span> main</span>
<span class="line"></span>
<span class="line"><span class="token keyword">import</span> <span class="token punctuation">(</span></span>
<span class="line">	<span class="token string">"fmt"</span></span>
<span class="line">	<span class="token string">"os"</span></span>
<span class="line"><span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">	fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"Hello"</span><span class="token punctuation">,</span> os<span class="token punctuation">.</span>Args<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span></span>
<span class="line">	os<span class="token punctuation">.</span><span class="token function">Exit</span><span class="token punctuation">(</span><span class="token number">42</span><span class="token punctuation">)</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>
</div><div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">go run ./main.go</span>
<span class="line"><span class="token builtin class-name">echo</span> <span class="token variable">$?</span></span>
<span class="line"><span class="token comment"># 执行的结果是 1</span></span>
<span class="line"></span>
<span class="line">go build ./main.go</span>
<span class="line">./main</span>
<span class="line"><span class="token builtin class-name">echo</span> <span class="token variable">$?</span></span>
<span class="line"><span class="token comment"># 执行的结果是 42</span></span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>gorun 将：<br>
将文件写入 <code>$TMPDIR</code> （或 <code>/tmp</code>）中的安全目录下，这样就不会触及实际脚本位置（可能是只读的）<br>
避免同一文件的并行执行之间的竞争<br>
自动清理一段时间内未使用的旧编译文件（无竞争）<br>
取代流程，而不是使用子流程<br>
正确地将参数传递给已编译的应用程序<br>
处理好 GOROOT、GOROOT_FINAL 和工具链的位置<br>
支持嵌入的 go.mod、go.sum 和用于编译的环境变量 - 可以确保可重复构建</p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">常用命令</title>
    <id>https://mo7.cc/coder/go/golang_command.html</id>
    <link href="https://mo7.cc/coder/go/golang_command.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>该文档有待补充和完善</p>
</div>
]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>该文档有待补充和完善</p>
</div>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">常用库整理</title>
    <id>https://mo7.cc/coder/go/golang_lib.html</id>
    <link href="https://mo7.cc/coder/go/golang_lib.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>该文档有待补充和完善</p>
</div>
<h2>读取并设置配置文件</h2>
<p><a href="https://www.cnblogs.com/jiujuan/p/13799976.html" target="_blank" rel="noopener noreferrer">https://www.cnblogs.com/jiujuan/p/13799976.html</a></p>
<h2>json to go</h2>
]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>该文档有待补充和完善</p>
</div>
<h2>读取并设置配置文件</h2>
<p><a href="https://www.cnblogs.com/jiujuan/p/13799976.html" target="_blank" rel="noopener noreferrer">https://www.cnblogs.com/jiujuan/p/13799976.html</a></p>
<h2>json to go</h2>
<p><a href="https://mholt.github.io/json-to-go/" target="_blank" rel="noopener noreferrer">https://mholt.github.io/json-to-go/</a></p>
<h2>go-colly 爬虫</h2>
<p><a href="https://zhuanlan.zhihu.com/p/76629605" target="_blank" rel="noopener noreferrer">https://zhuanlan.zhihu.com/p/76629605</a></p>
<p><a href="https://github.com/gocolly/colly" target="_blank" rel="noopener noreferrer">https://github.com/gocolly/colly</a><br>
可以用 xpath，goquery 这些选择器选中网页元素</p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">go 语言相关书籍</title>
    <id>https://mo7.cc/coder/go/golang_book.html</id>
    <link href="https://mo7.cc/coder/go/golang_book.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>该文档有待补充和完善</p>
</div>
<p><a href="https://books.studygolang.com/" target="_blank" rel="noopener noreferrer">https://books.studygolang.com/</a></p>
]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>该文档有待补充和完善</p>
</div>
<p><a href="https://books.studygolang.com/" target="_blank" rel="noopener noreferrer">https://books.studygolang.com/</a></p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">关于传统公司与互联网公司程序员忙碌的感悟</title>
    <id>https://mo7.cc/misc/essays/not_internet_developer.html</id>
    <link href="https://mo7.cc/misc/essays/not_internet_developer.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>现在我才明白互联网公司为啥程序员得 996 了。</p>
<p>大多数情况下，领导拍脑袋或靠调查报告产生一个需求，<br>
产品凝练需求，<br>
为了验证想法开发团队得尽快把需求落地。<br>
然后市场反馈，不对再改，不盈利再改，反响不好再改。<br>
所有的需求全部产生于【想法】以及【想象力】。<br>
因此，互联网公司的程序员面对的都是各种新东西，或者拍脑袋产生的各种新需求，<br>
所以最后试错成本大多数都在程序员头上顶着。(因为公司的最终产品形态就是程序)</p>
<p>传统公司是这样的：<br>
业务员，销售去跑市场跑业务，业务跑顺了，能盈利了，投入资源继续更进一步。<br>
与此同时反馈市场结果，然后开发团队出马，优化业务流程，凝练市场和业务需求，<br>
有针对性的设计逻辑和工具，然后程序员根据设计结果将工具落地，发布。<br>
然后业务员拿着新工具，效率提高了，负担减轻了。然后腾出来的资源继续 扩大市场，然后再去发现新的需求。<br>
试错成本大多数都在市场部业余员头上顶着。<br>
到了开发团队这里全都是真真切切的实际需求。</p>]]></summary>
    <content type="html"><![CDATA[
<p>现在我才明白互联网公司为啥程序员得 996 了。</p>
<p>大多数情况下，领导拍脑袋或靠调查报告产生一个需求，<br>
产品凝练需求，<br>
为了验证想法开发团队得尽快把需求落地。<br>
然后市场反馈，不对再改，不盈利再改，反响不好再改。<br>
所有的需求全部产生于【想法】以及【想象力】。<br>
因此，互联网公司的程序员面对的都是各种新东西，或者拍脑袋产生的各种新需求，<br>
所以最后试错成本大多数都在程序员头上顶着。(因为公司的最终产品形态就是程序)</p>
<p>传统公司是这样的：<br>
业务员，销售去跑市场跑业务，业务跑顺了，能盈利了，投入资源继续更进一步。<br>
与此同时反馈市场结果，然后开发团队出马，优化业务流程，凝练市场和业务需求，<br>
有针对性的设计逻辑和工具，然后程序员根据设计结果将工具落地，发布。<br>
然后业务员拿着新工具，效率提高了，负担减轻了。然后腾出来的资源继续 扩大市场，然后再去发现新的需求。<br>
试错成本大多数都在市场部业余员头上顶着。<br>
到了开发团队这里全都是真真切切的实际需求。</p>
<p>天才们可以靠着感觉，察觉到隐藏在市场下的需求，有针对性的一鸣惊人，不浪费一丝一毫的气力。<br>
资本靠砸钱来试错，同时投资很多个项目，成功一个就继续加大投资做成垄断，然后砍掉其余不成功的。(相当于变相的资本对冲)<br>
而对于大多数人来说，应该是明确需求并找到买方，再有针对性的去处理。</p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">伊隆·马斯克 (Elon Musk) 励志名言</title>
    <id>https://mo7.cc/misc/essays/elonmusk_saying.html</id>
    <link href="https://mo7.cc/misc/essays/elonmusk_saying.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<p>虽然不我确定这是不是 ElonMusk 的名言，但这些句子的确给了我很大的力量。</p>
</div>
<h2>关于人生低谷</h2>
<p>人生的至暗时刻<br>
大道理没用，鸡汤没用<br>
蛋糕可乐奶茶火锅都没用<br>
甚至家人和朋友们的爱<br>
也只能减缓焦虑<br>
却不能击退黑暗</p>
<p>真正把我从深渊里拉出来的<br>
是我自己<br>
没有人知道那段时光里<br>
我经历了什么<br>
分一秒熬过去之后<br>
就已经不是从前那个自己了</p>]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<p>虽然不我确定这是不是 ElonMusk 的名言，但这些句子的确给了我很大的力量。</p>
</div>
<h2>关于人生低谷</h2>
<p>人生的至暗时刻<br>
大道理没用，鸡汤没用<br>
蛋糕可乐奶茶火锅都没用<br>
甚至家人和朋友们的爱<br>
也只能减缓焦虑<br>
却不能击退黑暗</p>
<p>真正把我从深渊里拉出来的<br>
是我自己<br>
没有人知道那段时光里<br>
我经历了什么<br>
分一秒熬过去之后<br>
就已经不是从前那个自己了</p>
<p>这个世界上<br>
最困难的时候<br>
往往只有自己<br>
能把自己从泥潭中拉出来<br>
没有人能替你感受痛苦<br>
也没有人能替你幸福</p>
<details class="hint-container details"><summary>详情</summary>
<div class="ImgGroup">
<figure><figcaption>d-1</figcaption></figure>
<figure><figcaption>d-2</figcaption></figure>
<figure><figcaption>d-3</figcaption></figure>
</div>
</details>
<h2>面对不舒服的事情，一定要有一个自洽的解释</h2>
<p>我 30 岁养成了一个终生受益的习惯<br>
就是每次在我遇到了<br>
让我感觉不对劲的事情之后<br>
冲突也好，不公正的待遇也罢<br>
我都会用我自己的语言把它们捋顺<br>
并且用自洽的框架解释出来<br>
这个解释可以是对一个特定的人说出来<br>
也可以选择写出来，自己再来看</p>
<p>这么做的好处就是<br>
你会越来越有底气，智慧和勇敢<br>
因为用自己的语言去解释一个事件<br>
本质上做这个动作的底层逻辑<br>
就是在塑造自我，强化自我<br>
哥德说过:任何在积累知识的同时<br>
却不思考如何去善加利用的人<br>
最终都将毒害自己的生活和人类社会</p>
<p>如果你感觉到了不舒服却不表态<br>
那么你就一直处于没有话语权的状态<br>
更重要的是这些困扰在未来的生活工作<br>
还是会迟迟不断的找上你并无限放大<br>
每次我和我的工程师伙伴吵架的时候<br>
我有一个让彼此都非常受用的点<br>
就是我会保持冷静地对他说<br>
现在请把你的感受和观点分两边写给我</p>
<p>即便我可能最终并不能认同他的观点<br>
他也在这个过程当中把自己捋了一遍<br>
我们就能在沟通当中照见彼此的感受<br>
还原并表达底层最真实的观点和立场<br>
不做无意义的情绪内耗<br>
这个世界是极其复杂的，大家都会迷茫<br>
你只有了解自己内心真正的想法和诉求<br>
你才能抵挡住负面事物对你的侵蚀</p>
<p>不要混沌无序，不要觉得无所谓<br>
不要得过且过，不要不了了之<br>
即便你的看法是不受别人认同的<br>
也要勇敢地去表达自己<br>
最起码让你自己清楚<br>
自己内心的真实所想<br>
并且坚定地站在自己的这一边<br>
这是你真诚而热烈地活着的底气</p>
<h2>如何使自己变得强大优秀</h2>
<p>你要想变得超乎常人的强大<br>
必须在某个 3-5 年里<br>
疯狂的行动，高密度的锻炼<br>
这个锻炼可能包含了<br>
你人性上的锻炼<br>
你勇气上的锻炼<br>
你心力上的锻炼</p>
<p>你专业技能上的锻炼<br>
这些都是关系你命运最核心的锻炼<br>
总之，<br>
你就是千万不能停<br>
只要你停了，你就开始凉了<br>
能量和智商就开始下降了<br>
在这个 3-5 年<br>
你必须疯狂的在你专业领域</p>
<p>日日不断的深耕<br>
日复一日的死磕<br>
不要情绪化，努力干活<br>
去犁地，去翻土<br>
累了就变换耕作方式<br>
直行动下去<br>
就一定会有奇迹发生</p>
<details class="hint-container details"><summary>详情</summary>
<div class="ImgGroup">
<figure><figcaption>b-1</figcaption></figure>
<figure><figcaption>b-2</figcaption></figure>
<figure><figcaption>b-3</figcaption></figure>
</div>
</details>
<h2>关于行动力</h2>
<p>人类的基因有这样一种设定<br>
对模糊不清、不可名状的东西感到害怕<br>
那些现实生活中行动力很糟糕的人<br>
他们并不是懒惰、好吃懒做<br>
也并不是害怕要处理的事情本身<br>
他们的恐惧是来自于任务的模糊性</p>
<p>我从来都不相信<br>
这个世界上有什么行动力不足的事情<br>
因为所有的行动力的问题<br>
其实都来源于精确性的不足<br>
普通人生活中几乎所有的不幸<br>
都是由精确性的丧失开始的</p>
<p>如果你要一件事情发生<br>
就只需要去集齐<br>
这件事情要发生的所有的要素就行了<br>
就像造火箭，关键步骤也只有 27 个<br>
当你提高了对客观世界评估的精准性<br>
一切你觉得遥不可及的事情都会很简单</p>
<details class="hint-container details"><summary>详情</summary>
<div class="ImgGroup">
<figure><figcaption>a-1</figcaption></figure>
<figure><figcaption>a-2</figcaption></figure>
<figure><figcaption>a-3</figcaption></figure>
</div>
</details>
<h2>关于面对新事物</h2>
<p>我的成功得益于养成了一种很绝的心态<br>
它叫做 10% 目标定律<br>
这个想法就是<br>
无论你在生活中想要什么<br>
你都要做 10 次尝试<br>
但问题在于<br>
大多数人都不会尝试次 10 次</p>
<p>大多数人连一次都不想尝试<br>
让他们尝试比登天还难<br>
而 10% 目标定律的意义就在于<br>
学会积极面对 90% 的失败<br>
现在我敢向你保证<br>
如果你今后做任何事情<br>
都愿意先尝试 10 次<br>
那么，其中一个必定会成功</p>
<details class="hint-container details"><summary>详情</summary>
<div class="ImgGroup">
<figure><figcaption>c-1</figcaption></figure>
<figure><figcaption>c-2</figcaption></figure>
</div>
</details>
<h2>关于人生态度</h2>
<p>一个人在任何年龄<br>
都应提防的四大陷阱<br>
不读书爱思考<br>
不独立爱自由<br>
没经济谈真爱<br>
缺理智想发财<br>
撑下去的方法很简单</p>
<p>爱具体的人<br>
做具体的事<br>
只有这样<br>
才能抵抗那些宏大的、抽象的<br>
试图让我们变消极的人东西<br>
愿你我时刻谨记</p>
<p>我宁愿选择乐观，哪怕是错的<br>
也不想选择悲观，即使那是对的</p>
<p>努力成为你想成为的那种人<br>
就算不成功<br>
至少你喜欢现在努力的自己<br>
停止精神深处无意义的内耗<br>
你要留点精力<br>
去读书、去运动、去爱人<br>
去奔赴你想要的生活</p>
<details class="hint-container details"><summary>详情</summary>
<div class="ImgGroup">
<figure><figcaption>e-1</figcaption></figure>
<figure><figcaption>e-2</figcaption></figure>
<figure><figcaption>e-3</figcaption></figure>
</div>
</details>
<h2>最后</h2>
<figure><figcaption>f-1</figcaption></figure>
<blockquote>
<p>愿每个人最后都能成功 ~！</p>
</blockquote>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">随笔</title>
    <id>https://mo7.cc/misc/essays/</id>
    <link href="https://mo7.cc/misc/essays/"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">日常随便写一点东西</p>
</div>
<hr>
]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">日常随便写一点东西</p>
</div>
]]></content>
    <published>1993-02-13T00:00:00.000Z</published>
  </entry>
  <entry>
    <title type="text">1.环境准备与项目启动</title>
    <id>https://mo7.cc/misc/vuepress-hope/step_ready.html</id>
    <link href="https://mo7.cc/misc/vuepress-hope/step_ready.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>当前博客采用 <a href="https://theme-hope.vuejs.press/zh/" target="_blank" rel="noopener noreferrer">vuepress-hope</a> 搭建，这是一个免费开源的项目，是我用过的最强大和灵活的静态博客生成工具。</p>
<p>但是想要完全用好这款工具搭建出符合自己心意的博客，必须得具有一定的知识储备和掌握必要的工具。</p>
<h2>必要的知识储备</h2>
<p><a href="/coder/basic/" target="_blank">墨七编写的 编程基础入门</a></p>
<p>相对路径，命令行，文件编码，开发工具，Git，Github 都需要具备一定的概念才可以。</p>]]></summary>
    <content type="html"><![CDATA[
<p>当前博客采用 <a href="https://theme-hope.vuejs.press/zh/" target="_blank" rel="noopener noreferrer">vuepress-hope</a> 搭建，这是一个免费开源的项目，是我用过的最强大和灵活的静态博客生成工具。</p>
<p>但是想要完全用好这款工具搭建出符合自己心意的博客，必须得具有一定的知识储备和掌握必要的工具。</p>
<h2>必要的知识储备</h2>
<p><a href="/coder/basic/" target="_blank">墨七编写的 编程基础入门</a></p>
<p>相对路径，命令行，文件编码，开发工具，Git，Github 都需要具备一定的概念才可以。</p>
<h2>工具准备</h2>
<h3>命令行环境</h3>
<p><a href="/coder/javascript/nodejs_ready.html" target="_blank">Nodejs 基础环境搭建</a></p>
<h3>编辑器</h3>
<p><a href="/bookmark/tools/vscode/" target="_blank">Visual Studio Code 使用说明</a></p>
<p>为了良好的体验，需要安装的插件：</p>
<p><strong>Vue - Official</strong><br>
<a href="https://marketplace.visualstudio.com/items?itemName=Vue.volar" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=Vue.volar</a></p>
<p><strong>Prettier - Code formatter</strong><br>
<a href="https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode</a></p>
<h2>官方文档说明</h2>
<p>打开 <a href="https://theme-hope.vuejs.press/zh/" target="_blank" rel="noopener noreferrer">vuepress-hope 官网</a></p>
<p>它的文档结构长这样：</p>
<figure><figcaption>vuepress-hope 网站结构</figcaption></figure>
<p>一般来说，按照顺序一步步走下去就可以把项目成功启动起来。</p>
<h2>开始</h2>
<p>如果准备工作妥当，我们这里直接开始。</p>
<p>打开命令行，找一个自己心仪的目录执行以下命令：</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">pnpm</span> create vuepress-theme-hope my-docs</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><details class="hint-container details"><summary>命令解读</summary>
<p><code>pnpm</code>: 这个是 <code>Nodejs</code> 当下最流行的的包管理器，上文中有写到。<br>
<code>create</code>: 这个是 pnpm 内置的一个命令，意思是 通过 模板创建一个项目<br>
<code>vuepress-theme-hope</code>: 模板的名称<br>
<code>my-docs</code>: 这个是项目名称，你完全可以自定义这部分改成自己喜欢的名字。建议使用英文字母、下划线以及中短杠</p>
</details>
<p>执行完命令之后会有一些问题需要你回答一下:<br>
</p>
<p>完成之后当前目录就会创建一个项目目录，我们用 vscode 打开这个项目：</p>
<figure><figcaption>vuepress-hope 目录结构说明</figcaption></figure>
<p>其中 博客的程序和配置部分全部都会存放在 <code>src/.vuepress</code> 目录下。<br>
<code>src/</code> 目录下除开 <code>.vuepress</code> 目录之外的目录和文件都会被视作文档。</p>
<p><code>node_modules</code> 是依赖存放的目录，一般不需要去管它。</p>
<p><code>package.json</code> 是项目描述文件，其中</p>
<div class="language-json line-numbers-mode" data-highlighter="prismjs" data-ext="json"><pre><code class="language-json"><span class="line"><span class="token property">"scripts"</span><span class="token operator">:</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token property">"docs:build"</span><span class="token operator">:</span> <span class="token string">"vuepress-vite build src"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"docs:clean-dev"</span><span class="token operator">:</span> <span class="token string">"vuepress-vite dev src --clean-cache"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"docs:dev"</span><span class="token operator">:</span> <span class="token string">"vuepress-vite dev src"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"docs:update-package"</span><span class="token operator">:</span> <span class="token string">"pnpm dlx vp-update"</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>部分是你可用的脚本。比如这里就提供了 4 个脚本，你可以这么使用它：</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token comment"># 安装依赖 这个是 pnpm 提供的基本能力</span></span>
<span class="line"><span class="token function">pnpm</span> <span class="token function">install</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 将项目进行打包，准备发版 ， 对应 package.json scripts 里面的  docs:build  命令</span></span>
<span class="line"><span class="token function">pnpm</span> run docs:build</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 清除缓存并启动服务</span></span>
<span class="line"><span class="token function">pnpm</span> run docs:clean-dev</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 启动本地预览服务</span></span>
<span class="line"><span class="token function">pnpm</span> run docs:dev</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 升级所有的依赖</span></span>
<span class="line"><span class="token function">pnpm</span> run docs:update-package</span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>对的，其基本的语法就是 <code>pnpm run xxx</code> 。 <code>xxx</code> 就是 <code>package.json</code> 的 <code>scripts</code> 属性提供的。</p>
<p>如果没什么问题，你应该可以成功启动项目并看到你的博客雏形了。</p>
<h2>另一种方案</h2>
<p>我当前的博客源码已经在 <code>github</code> 中开源了，地址为<br>
<a href="https://github.com/mo7cc/blog-source" target="_blank" rel="noopener noreferrer">https://github.com/mo7cc/blog-source</a></p>
<p>你可以直接点击下载并解压。</p>
<figure><figcaption>直接下载源码</figcaption></figure>
<p>项目结构说明如下:</p>
<figure><figcaption>mo7-blog 的 项目结构</figcaption></figure>
<p>也就是说，我的博客项目 命令如下:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token comment"># 安装依赖</span></span>
<span class="line"><span class="token function">pnpm</span> <span class="token function">install</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 本地启动预览</span></span>
<span class="line"><span class="token function">pnpm</span> run dev</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 打包变异准备发版</span></span>
<span class="line"><span class="token function">pnpm</span> run build</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 更新依赖</span></span>
<span class="line"><span class="token function">pnpm</span> run update-package</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 一条指令同步到远程仓库</span></span>
<span class="line"><span class="token function">pnpm</span> run <span class="token function">sync</span> <span class="token operator">&lt;</span>同步说明<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 一条指令发布博客</span></span>
<span class="line"><span class="token function">pnpm</span> run deploy <span class="token operator">&lt;</span>发布说明<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 开源博客的源码部分</span></span>
<span class="line"><span class="token function">pnpm</span> run <span class="token function">open</span> <span class="token operator">&lt;</span>开源说明<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 新建一个周工作计划表</span></span>
<span class="line"><span class="token function">pnpm</span> run weekly</span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">10.图片预览插件</title>
    <id>https://mo7.cc/misc/vuepress-hope/img-preview.html</id>
    <link href="https://mo7.cc/misc/vuepress-hope/img-preview.html"/>
    <updated>2025-07-04T14:11:31.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<p>觉得官方的图片预览插件点一下放大，点一下缩小太难用了，于是自己重新开发了一个图片预览插件。<br>
【可完美适配移动端】</p>
</div>
<blockquote>
<p>注意：得先在配置文件中禁用 vuepress 的图片预览。<br>
<code>plugins.photoSwipe: false</code></p>
</blockquote>
<p>该插件在 <code>VuePress</code> 中使用的方式如下:</p>]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<p>觉得官方的图片预览插件点一下放大，点一下缩小太难用了，于是自己重新开发了一个图片预览插件。<br>
【可完美适配移动端】</p>
</div>
<blockquote>
<p>注意：得先在配置文件中禁用 vuepress 的图片预览。<br>
<code>plugins.photoSwipe: false</code></p>
</blockquote>
<p>该插件在 <code>VuePress</code> 中使用的方式如下:</p>
<h2>第一步： 导入插件源码</h2>
<details class="hint-container details"><summary>插件源码如下(可直接复制使用)</summary>
<div class="code-block-with-title">
  <div class="code-block-title-bar" data-title=".vuepress/components/PreviewImage.vue 文件内容">
    <span>.vuepress/components/PreviewImage.vue 文件内容</span>
  </div>
  <div class="language-vue line-numbers-mode" data-highlighter="prismjs" data-ext="vue"><pre><code class="language-vue"><span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">setup</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>ts<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span><span class="token script"><span class="token language-javascript"></span>
<span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> onMounted<span class="token punctuation">,</span> nextTick<span class="token punctuation">,</span> ref <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> useRouter <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue-router'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> GetDeviceInfo <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'../utils/tools'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">import</span> MyIcon <span class="token keyword">from</span> <span class="token string">'./MyIcon.vue'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token comment">// 图标需要引入 iconfont</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">let</span> <span class="token literal-property property">DeviceInfo</span><span class="token operator">:</span> any <span class="token operator">=</span> <span class="token function">ref</span><span class="token punctuation">(</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">let</span> <span class="token literal-property property">ImageArr</span><span class="token operator">:</span> any <span class="token operator">=</span> <span class="token function">ref</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">let</span> ShowPreviewBox <span class="token operator">=</span> <span class="token function">ref</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">let</span> CurrentImgIdx <span class="token operator">=</span> <span class="token function">ref</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">function</span> <span class="token function">ClosePreviewBox</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  ShowPreviewBox<span class="token punctuation">.</span>value <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span></span>
<span class="line">  document<span class="token punctuation">.</span>body<span class="token punctuation">.</span>style<span class="token punctuation">.</span>overflow <span class="token operator">=</span> <span class="token string">'auto'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">function</span> <span class="token function">zoomFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">const</span> imgElm <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'Mo7PreviewBox-img'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>imgElm<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">return</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">  <span class="token keyword">let</span> width <span class="token operator">=</span> imgElm<span class="token punctuation">.</span>clientWidth<span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">let</span> height <span class="token operator">=</span> imgElm<span class="token punctuation">.</span>clientHeight<span class="token punctuation">;</span></span>
<span class="line">  width <span class="token operator">=</span> width <span class="token operator">*</span> <span class="token number">1.1</span><span class="token punctuation">;</span></span>
<span class="line">  imgElm<span class="token punctuation">.</span>style<span class="token punctuation">.</span>width <span class="token operator">=</span> width <span class="token operator">+</span> <span class="token string">'px'</span><span class="token punctuation">;</span></span>
<span class="line">  height <span class="token operator">=</span> height <span class="token operator">*</span> <span class="token number">1.1</span><span class="token punctuation">;</span></span>
<span class="line">  imgElm<span class="token punctuation">.</span>style<span class="token punctuation">.</span>height <span class="token operator">=</span> height <span class="token operator">+</span> <span class="token string">'px'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">function</span> <span class="token function">shrinkFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">const</span> imgElm <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'Mo7PreviewBox-img'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>imgElm<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">return</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token keyword">let</span> width <span class="token operator">=</span> imgElm<span class="token punctuation">.</span>clientWidth<span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">let</span> height <span class="token operator">=</span> imgElm<span class="token punctuation">.</span>clientHeight<span class="token punctuation">;</span></span>
<span class="line">  width <span class="token operator">=</span> width <span class="token operator">*</span> <span class="token number">0.9</span><span class="token punctuation">;</span></span>
<span class="line">  imgElm<span class="token punctuation">.</span>style<span class="token punctuation">.</span>width <span class="token operator">=</span> width <span class="token operator">+</span> <span class="token string">'px'</span><span class="token punctuation">;</span></span>
<span class="line">  height <span class="token operator">=</span> height <span class="token operator">*</span> <span class="token number">0.9</span><span class="token punctuation">;</span></span>
<span class="line">  imgElm<span class="token punctuation">.</span>style<span class="token punctuation">.</span>height <span class="token operator">=</span> height <span class="token operator">+</span> <span class="token string">'px'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">function</span> <span class="token function">fullscreenFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">const</span> <span class="token literal-property property">imgElm</span><span class="token operator">:</span> any <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'Mo7PreviewBox-img'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>imgElm<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">return</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  window<span class="token punctuation">.</span><span class="token function">open</span><span class="token punctuation">(</span>imgElm<span class="token punctuation">.</span><span class="token function">getAttribute</span><span class="token punctuation">(</span><span class="token string">'src'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">function</span> <span class="token function">leftFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>CurrentImgIdx<span class="token punctuation">.</span>value <span class="token operator">&gt;</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    CurrentImgIdx<span class="token punctuation">.</span>value<span class="token operator">--</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token function">nextTick</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">ImageBoxReset</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">function</span> <span class="token function">rightFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>CurrentImgIdx<span class="token punctuation">.</span>value <span class="token operator">&lt;</span> ImageArr<span class="token punctuation">.</span>value<span class="token punctuation">.</span>length <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    CurrentImgIdx<span class="token punctuation">.</span>value<span class="token operator">++</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token function">nextTick</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">ImageBoxReset</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">function</span> <span class="token function">ImageBoxReset</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">const</span> boxElm <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'Mo7PreviewBox'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>boxElm<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">return</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token keyword">const</span> boxWidth <span class="token operator">=</span> boxElm<span class="token punctuation">.</span>clientWidth<span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">const</span> boxHeight <span class="token operator">=</span> boxElm<span class="token punctuation">.</span>clientHeight<span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">  <span class="token keyword">const</span> imgElm <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'Mo7PreviewBox-img'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>imgElm<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">return</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">  imgElm<span class="token punctuation">.</span>style<span class="token punctuation">.</span>width <span class="token operator">=</span> boxWidth <span class="token operator">*</span> <span class="token number">0.9</span> <span class="token operator">+</span> <span class="token string">'px'</span><span class="token punctuation">;</span></span>
<span class="line">  imgElm<span class="token punctuation">.</span>style<span class="token punctuation">.</span>height <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span></span>
<span class="line">  imgElm<span class="token punctuation">.</span>style<span class="token punctuation">.</span>maxWidth <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span></span>
<span class="line">  imgElm<span class="token punctuation">.</span>style<span class="token punctuation">.</span>maxHeight <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span></span>
<span class="line">  imgElm<span class="token punctuation">.</span>style<span class="token punctuation">.</span>left <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span></span>
<span class="line">  imgElm<span class="token punctuation">.</span>style<span class="token punctuation">.</span>top <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span></span>
<span class="line">  imgElm<span class="token punctuation">.</span>style<span class="token punctuation">.</span>cursor <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">  <span class="token keyword">const</span> height <span class="token operator">=</span> imgElm<span class="token punctuation">.</span>clientHeight<span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>height <span class="token operator">&gt;</span> boxHeight<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    imgElm<span class="token punctuation">.</span>style<span class="token punctuation">.</span>width <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span></span>
<span class="line">    imgElm<span class="token punctuation">.</span>style<span class="token punctuation">.</span>height <span class="token operator">=</span> boxHeight <span class="token operator">*</span> <span class="token number">0.9</span> <span class="token operator">+</span> <span class="token string">'px'</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">function</span> <span class="token function">ImageClick</span><span class="token punctuation">(</span><span class="token parameter">e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">const</span> elm <span class="token operator">=</span> e<span class="token punctuation">.</span>target<span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">const</span> src <span class="token operator">=</span> elm<span class="token punctuation">.</span><span class="token function">getAttribute</span><span class="token punctuation">(</span><span class="token string">'src'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">let</span> index <span class="token operator">=</span> CurrentImgIdx<span class="token punctuation">.</span>value<span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> ImageArr<span class="token punctuation">.</span>value<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">const</span> <span class="token literal-property property">el</span><span class="token operator">:</span> any <span class="token operator">=</span> ImageArr<span class="token punctuation">.</span>value<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token keyword">if</span> <span class="token punctuation">(</span>el<span class="token punctuation">.</span>src <span class="token operator">===</span> src<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">      index <span class="token operator">=</span> i<span class="token punctuation">;</span></span>
<span class="line">      <span class="token keyword">break</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  CurrentImgIdx<span class="token punctuation">.</span>value <span class="token operator">=</span> index<span class="token punctuation">;</span></span>
<span class="line">  ShowPreviewBox<span class="token punctuation">.</span>value <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span></span>
<span class="line">  document<span class="token punctuation">.</span>body<span class="token punctuation">.</span>style<span class="token punctuation">.</span>overflow <span class="token operator">=</span> <span class="token string">'hidden'</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">  <span class="token function">nextTick</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">ImageBoxReset</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">function</span> <span class="token function">keyUpFunc</span><span class="token punctuation">(</span><span class="token parameter">event</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>type <span class="token operator">==</span> <span class="token string">'wheel'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>deltaY <span class="token operator">&gt;</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">      <span class="token function">shrinkFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span></span>
<span class="line">      <span class="token function">zoomFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>key <span class="token operator">===</span> <span class="token string">'Enter'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">fullscreenFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>key <span class="token operator">===</span> <span class="token string">'Escape'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">ClosePreviewBox</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>key <span class="token operator">===</span> <span class="token string">'ArrowUp'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">zoomFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>key <span class="token operator">===</span> <span class="token string">'ArrowDown'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">shrinkFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>key <span class="token operator">===</span> <span class="token string">'ArrowLeft'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">leftFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token punctuation">.</span>key <span class="token operator">===</span> <span class="token string">'ArrowRight'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">rightFunc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">function</span> <span class="token function">InitPreviewImage</span><span class="token punctuation">(</span><span class="token parameter">type</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">let</span> contentElm <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'markdown-content'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token comment">// let contentElm;</span></span>
<span class="line">  <span class="token comment">// if (contentElms.length &gt; 0) {</span></span>
<span class="line">  <span class="token comment">//   contentElm = contentElms[0];</span></span>
<span class="line">  <span class="token comment">// }</span></span>
<span class="line"></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>contentElm<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">return</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">  <span class="token keyword">const</span> images <span class="token operator">=</span> contentElm<span class="token punctuation">.</span><span class="token function">getElementsByTagName</span><span class="token punctuation">(</span><span class="token string">'img'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">const</span> <span class="token literal-property property">imaArr</span><span class="token operator">:</span> any <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> images<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">const</span> elm <span class="token operator">=</span> images<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token keyword">if</span> <span class="token punctuation">(</span>type <span class="token operator">===</span> <span class="token string">'bind'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">      imaArr<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span>
<span class="line">        <span class="token literal-property property">alt</span><span class="token operator">:</span> elm<span class="token punctuation">.</span><span class="token function">getAttribute</span><span class="token punctuation">(</span><span class="token string">'alt'</span><span class="token punctuation">)</span><span class="token punctuation">,</span></span>
<span class="line">        <span class="token literal-property property">src</span><span class="token operator">:</span> elm<span class="token punctuation">.</span><span class="token function">getAttribute</span><span class="token punctuation">(</span><span class="token string">'src'</span><span class="token punctuation">)</span><span class="token punctuation">,</span></span>
<span class="line">      <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">    elm<span class="token punctuation">.</span><span class="token function">removeEventListener</span><span class="token punctuation">(</span><span class="token string">'click'</span><span class="token punctuation">,</span> ImageClick<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    document<span class="token punctuation">.</span><span class="token function">removeEventListener</span><span class="token punctuation">(</span><span class="token string">'keyup'</span><span class="token punctuation">,</span> keyUpFunc<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token keyword">if</span> <span class="token punctuation">(</span>type <span class="token operator">===</span> <span class="token string">'bind'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">      elm<span class="token punctuation">.</span><span class="token function">addEventListener</span><span class="token punctuation">(</span><span class="token string">'click'</span><span class="token punctuation">,</span> ImageClick<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">      document<span class="token punctuation">.</span><span class="token function">addEventListener</span><span class="token punctuation">(</span><span class="token string">'keyup'</span><span class="token punctuation">,</span> keyUpFunc<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  ImageArr<span class="token punctuation">.</span>value <span class="token operator">=</span> imaArr<span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">  document<span class="token punctuation">.</span><span class="token function">removeEventListener</span><span class="token punctuation">(</span><span class="token string">'keyup'</span><span class="token punctuation">,</span> keyUpFunc<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>type <span class="token operator">===</span> <span class="token string">'bind'</span> <span class="token operator">&amp;&amp;</span> DeviceInfo<span class="token punctuation">.</span>isPC<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    document<span class="token punctuation">.</span><span class="token function">addEventListener</span><span class="token punctuation">(</span><span class="token string">'keyup'</span><span class="token punctuation">,</span> keyUpFunc<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">  document<span class="token punctuation">.</span><span class="token function">removeEventListener</span><span class="token punctuation">(</span><span class="token string">'wheel'</span><span class="token punctuation">,</span> keyUpFunc<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>type <span class="token operator">===</span> <span class="token string">'bind'</span> <span class="token operator">&amp;&amp;</span> DeviceInfo<span class="token punctuation">.</span>isPC<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    document<span class="token punctuation">.</span><span class="token function">addEventListener</span><span class="token punctuation">(</span><span class="token string">'wheel'</span><span class="token punctuation">,</span> keyUpFunc<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">let</span> mouseStatus <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">let</span> mouseDownX <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">let</span> mouseDownY <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">let</span> imgElmLeft <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">let</span> imgElmTop <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">function</span> <span class="token function">Mousemove</span><span class="token punctuation">(</span><span class="token parameter">e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>mouseStatus<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">return</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">  <span class="token keyword">const</span> xDiff <span class="token operator">=</span> e<span class="token punctuation">.</span>clientX <span class="token operator">-</span> mouseDownX<span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">const</span> yDiff <span class="token operator">=</span> e<span class="token punctuation">.</span>clientY <span class="token operator">-</span> mouseDownY<span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">const</span> left <span class="token operator">=</span> imgElmLeft <span class="token operator">+</span> xDiff<span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">const</span> top <span class="token operator">=</span> imgElmTop <span class="token operator">+</span> yDiff<span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">  <span class="token comment">// 移动赋值</span></span>
<span class="line">  <span class="token keyword">const</span> imgElm <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'Mo7PreviewBox-img'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>imgElm<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    imgElm<span class="token punctuation">.</span>style<span class="token punctuation">.</span>left <span class="token operator">=</span> left <span class="token operator">+</span> <span class="token string">'px'</span><span class="token punctuation">;</span></span>
<span class="line">    imgElm<span class="token punctuation">.</span>style<span class="token punctuation">.</span>top <span class="token operator">=</span> top <span class="token operator">+</span> <span class="token string">'px'</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">function</span> <span class="token function">ImgMouseUp</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">const</span> imgElm <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'Mo7PreviewBox-img'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>imgElm<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    imgElm<span class="token punctuation">.</span>style<span class="token punctuation">.</span>cursor <span class="token operator">=</span> <span class="token string">'default'</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  mouseStatus <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">;</span></span>
<span class="line">  mouseDownX <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span></span>
<span class="line">  mouseDownY <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span></span>
<span class="line">  imgElmLeft <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span></span>
<span class="line">  imgElmTop <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">function</span> <span class="token function">ImgMouseDown</span><span class="token punctuation">(</span><span class="token parameter">e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">const</span> <span class="token literal-property property">imgElm</span><span class="token operator">:</span> any <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'Mo7PreviewBox-img'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>imgElm<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    imgElm<span class="token punctuation">.</span>style<span class="token punctuation">.</span>cursor <span class="token operator">=</span> <span class="token string">'move'</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  mouseStatus <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">  mouseDownX <span class="token operator">=</span> e<span class="token punctuation">.</span>clientX<span class="token punctuation">;</span></span>
<span class="line">  mouseDownY <span class="token operator">=</span> e<span class="token punctuation">.</span>clientY<span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">  <span class="token keyword">let</span> computedStyle<span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>window<span class="token punctuation">.</span>getComputedStyle<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    computedStyle <span class="token operator">=</span> window<span class="token punctuation">.</span><span class="token function">getComputedStyle</span><span class="token punctuation">(</span>imgElm<span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span></span>
<span class="line">    computedStyle <span class="token operator">=</span> <span class="token punctuation">(</span>imgElm <span class="token keyword">as</span> any<span class="token punctuation">)</span><span class="token punctuation">.</span>currentStyle<span class="token punctuation">;</span> <span class="token comment">//兼容IE的写法</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">  imgElmLeft <span class="token operator">=</span> <span class="token function">parseInt</span><span class="token punctuation">(</span>computedStyle<span class="token punctuation">.</span>left<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  imgElmTop <span class="token operator">=</span> <span class="token function">parseInt</span><span class="token punctuation">(</span>computedStyle<span class="token punctuation">.</span>top<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">function</span> <span class="token function">on_mousemove</span><span class="token punctuation">(</span><span class="token parameter">e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>e<span class="token punctuation">.</span>type <span class="token operator">===</span> <span class="token string">'touchmove'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">if</span> <span class="token punctuation">(</span>e<span class="token punctuation">.</span>touches<span class="token punctuation">.</span>length <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">      <span class="token function">Mousemove</span><span class="token punctuation">(</span>e<span class="token punctuation">.</span>touches<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>e<span class="token punctuation">.</span>type <span class="token operator">===</span> <span class="token string">'mousemove'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">Mousemove</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">function</span> <span class="token function">on_mouseup</span><span class="token punctuation">(</span><span class="token parameter">e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token function">ImgMouseUp</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">function</span> <span class="token function">on_mousedown</span><span class="token punctuation">(</span><span class="token parameter">e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>e<span class="token punctuation">.</span>type <span class="token operator">===</span> <span class="token string">'touchstart'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">if</span> <span class="token punctuation">(</span>e<span class="token punctuation">.</span>touches<span class="token punctuation">.</span>length <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">      <span class="token function">ImgMouseDown</span><span class="token punctuation">(</span>e<span class="token punctuation">.</span>touches<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>e<span class="token punctuation">.</span>type <span class="token operator">===</span> <span class="token string">'mousedown'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">ImgMouseDown</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token function">onMounted</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">  DeviceInfo <span class="token operator">=</span> <span class="token function">GetDeviceInfo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  console<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token string">'DeviceInfo'</span><span class="token punctuation">,</span> DeviceInfo<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">  <span class="token function">nextTick</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">InitPreviewImage</span><span class="token punctuation">(</span><span class="token string">'bind'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">  <span class="token keyword">const</span> router <span class="token operator">=</span> <span class="token function">useRouter</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  router<span class="token punctuation">.</span><span class="token function">beforeEach</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">to<span class="token punctuation">,</span> <span class="token keyword">from</span></span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">if</span> <span class="token punctuation">(</span>to<span class="token punctuation">.</span>path <span class="token operator">===</span> from<span class="token punctuation">.</span>path<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">      <span class="token keyword">return</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">    <span class="token function">InitPreviewImage</span><span class="token punctuation">(</span><span class="token string">'unbind'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">  router<span class="token punctuation">.</span><span class="token function">afterEach</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">to<span class="token punctuation">,</span> <span class="token keyword">from</span></span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">if</span> <span class="token punctuation">(</span>to<span class="token punctuation">.</span>path <span class="token operator">===</span> from<span class="token punctuation">.</span>path<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">      <span class="token keyword">return</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">    <span class="token function">nextTick</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">      <span class="token function">setTimeout</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token function">InitPreviewImage</span><span class="token punctuation">(</span><span class="token string">'bind'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">      <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token number">1000</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>template</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ClientOnly</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span></span>
<span class="line">      <span class="token attr-name">v-if</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>ShowPreviewBox<span class="token punctuation">"</span></span></span>
<span class="line">      <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Mo7PreviewBox<span class="token punctuation">"</span></span></span>
<span class="line">      <span class="token attr-name">@mousemove</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>on_mousemove<span class="token punctuation">"</span></span></span>
<span class="line">      <span class="token attr-name">@touchmove</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>on_mousemove<span class="token punctuation">"</span></span></span>
<span class="line">      <span class="token attr-name">@mouseup</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>on_mouseup<span class="token punctuation">"</span></span></span>
<span class="line">      <span class="token attr-name">@touchend</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>on_mouseup<span class="token punctuation">"</span></span></span>
<span class="line">    <span class="token punctuation">&gt;</span></span></span>
<span class="line">      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Mo7PreviewBox-topBar<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span></span>
<span class="line">        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>btn<span class="token punctuation">"</span></span> <span class="token attr-name">@click</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>leftFunc<span class="token punctuation">"</span></span> <span class="token attr-name">:class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>{ hide: CurrentImgIdx === 0 }<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span></span>
<span class="line">          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>MyIcon</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>icon<span class="token punctuation">"</span></span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>xiangzuo<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>MyIcon</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>btn<span class="token punctuation">"</span></span> <span class="token attr-name">@click</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>rightFunc<span class="token punctuation">"</span></span> <span class="token attr-name">:class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>{ hide: CurrentImgIdx === ImageArr.length - 1 }<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span></span>
<span class="line">          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>MyIcon</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>icon<span class="token punctuation">"</span></span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>xiangyou<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>MyIcon</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>btn<span class="token punctuation">"</span></span> <span class="token attr-name">@click.stop</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>zoomFunc<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span></span>
<span class="line">          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>MyIcon</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>icon<span class="token punctuation">"</span></span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>fangda<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>MyIcon</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>btn<span class="token punctuation">"</span></span> <span class="token attr-name">@click.stop</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>shrinkFunc<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span></span>
<span class="line">          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>MyIcon</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>icon<span class="token punctuation">"</span></span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>suoxiao<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>MyIcon</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>btn<span class="token punctuation">"</span></span> <span class="token attr-name">@click.stop</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>fullscreenFunc<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span></span>
<span class="line">          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>MyIcon</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>icon<span class="token punctuation">"</span></span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>quanping<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>MyIcon</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>btn<span class="token punctuation">"</span></span> <span class="token attr-name">:href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>ImageArr[CurrentImgIdx].src<span class="token punctuation">"</span></span> <span class="token attr-name">download</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>MyIcon</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>icon<span class="token punctuation">"</span></span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>xiazai<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>MyIcon</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>btn<span class="token punctuation">"</span></span> <span class="token attr-name">@click.stop</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>ClosePreviewBox<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span></span>
<span class="line">          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>MyIcon</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>icon<span class="token punctuation">"</span></span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>guanbi<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>MyIcon</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span>
<span class="line">      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>img</span></span>
<span class="line">        <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Mo7PreviewBox-img<span class="token punctuation">"</span></span></span>
<span class="line">        <span class="token attr-name">@mousedown</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>on_mousedown<span class="token punctuation">"</span></span></span>
<span class="line">        <span class="token attr-name">@touchstart</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>on_mousedown<span class="token punctuation">"</span></span></span>
<span class="line">        <span class="token attr-name">:src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>ImageArr[CurrentImgIdx].src<span class="token punctuation">"</span></span></span>
<span class="line">        <span class="token attr-name">:alt</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>ImageArr[CurrentImgIdx].alt<span class="token punctuation">"</span></span></span>
<span class="line">        <span class="token attr-name">srcset</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span></span>
<span class="line">      <span class="token punctuation">/&gt;</span></span></span>
<span class="line"></span>
<span class="line">      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Mo7PreviewBox-idxView<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span></span>
<span class="line">        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Mo7PreviewBox-idxView-box<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span></span>
<span class="line">          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Mo7PreviewBox-idxView-idx<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>{{ CurrentImgIdx + 1 }}/{{ ImageArr.length }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Mo7PreviewBox-idxView-alt<span class="token punctuation">"</span></span> <span class="token attr-name">v-if</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>ImageArr[CurrentImgIdx].alt<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span></span>
<span class="line">            {{ ImageArr[CurrentImgIdx].alt }}</span>
<span class="line">          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>Mo7PreviewBox-idxView-key<span class="token punctuation">"</span></span> <span class="token attr-name">v-if</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>DeviceInfo.isPC<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span></span>
<span class="line">            快捷键:放大↑，缩小↓，上一张←，下一张→，新页面打开↵，Esc关闭预览</span>
<span class="line">          <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">        <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>ClientOnly</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>template</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>style</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>scss<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span><span class="token style"><span class="token language-css"></span>
<span class="line"><span class="token selector">#markdown-content</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token selector">img</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">cursor</span><span class="token punctuation">:</span> pointer<span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token selector">#Mo7PreviewBox</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token property">position</span><span class="token punctuation">:</span> fixed<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">top</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">left</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">width</span><span class="token punctuation">:</span> 100vw<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">height</span><span class="token punctuation">:</span> 100vh<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">background-color</span><span class="token punctuation">:</span> <span class="token function">rgba</span><span class="token punctuation">(</span>0<span class="token punctuation">,</span> 0<span class="token punctuation">,</span> 0<span class="token punctuation">,</span> 0.7<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">display</span><span class="token punctuation">:</span> flex<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">justify-content</span><span class="token punctuation">:</span> center<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">align-items</span><span class="token punctuation">:</span> center<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">z-index</span><span class="token punctuation">:</span> 999<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">overflow</span><span class="token punctuation">:</span> hidden<span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">  <span class="token selector">.icon</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">color</span><span class="token punctuation">:</span> #fff<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">font-size</span><span class="token punctuation">:</span> 24px<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">cursor</span><span class="token punctuation">:</span> pointer<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">padding</span><span class="token punctuation">:</span> 6px<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">display</span><span class="token punctuation">:</span> block<span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">  <span class="token selector">.Mo7PreviewBox-topBar</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">position</span><span class="token punctuation">:</span> fixed<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">top</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">left</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">width</span><span class="token punctuation">:</span> 100%<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">display</span><span class="token punctuation">:</span> flex<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">align-items</span><span class="token punctuation">:</span> center<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">justify-content</span><span class="token punctuation">:</span> flex-end<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">box-sizing</span><span class="token punctuation">:</span> border-box<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">padding</span><span class="token punctuation">:</span> 10px<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">z-index</span><span class="token punctuation">:</span> 99<span class="token punctuation">;</span></span>
<span class="line">    <span class="token selector">.btn</span> <span class="token punctuation">{</span></span>
<span class="line">      <span class="token property">display</span><span class="token punctuation">:</span> block<span class="token punctuation">;</span></span>
<span class="line">      <span class="token property">margin-left</span><span class="token punctuation">:</span> 10px<span class="token punctuation">;</span></span>
<span class="line">      <span class="token property">background-color</span><span class="token punctuation">:</span> <span class="token function">rgba</span><span class="token punctuation">(</span>0<span class="token punctuation">,</span> 0<span class="token punctuation">,</span> 0<span class="token punctuation">,</span> 0.4<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">      <span class="token selector">&amp;.hide</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token property">opacity</span><span class="token punctuation">:</span> 0.4<span class="token punctuation">;</span></span>
<span class="line">      <span class="token punctuation">}</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">  <span class="token selector">.Mo7PreviewBox-idxView</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">position</span><span class="token punctuation">:</span> absolute<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">bottom</span><span class="token punctuation">:</span> 10px<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">right</span><span class="token punctuation">:</span> 10px<span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">  <span class="token selector">.Mo7PreviewBox-idxView-box</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">border-radius</span><span class="token punctuation">:</span> 10px<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">background-color</span><span class="token punctuation">:</span> <span class="token function">rgba</span><span class="token punctuation">(</span>0<span class="token punctuation">,</span> 0<span class="token punctuation">,</span> 0<span class="token punctuation">,</span> 0.4<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">padding</span><span class="token punctuation">:</span> 8px<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">color</span><span class="token punctuation">:</span> #fff<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">text-align</span><span class="token punctuation">:</span> center<span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token selector">.Mo7PreviewBox-idxView-idx</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">font-size</span><span class="token punctuation">:</span> 14px<span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token selector">.Mo7PreviewBox-idxView-alt</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">font-size</span><span class="token punctuation">:</span> 20px<span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token selector">.Mo7PreviewBox-idxView-key</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">font-size</span><span class="token punctuation">:</span> 12px<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">margin-top</span><span class="token punctuation">:</span> 10px<span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token selector">#Mo7PreviewBox-img</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token property">position</span><span class="token punctuation">:</span> relative<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">user-select</span><span class="token punctuation">:</span> none<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">-webkit-user-drag</span><span class="token punctuation">:</span> none<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">box-shadow</span><span class="token punctuation">:</span> <span class="token function">rgba</span><span class="token punctuation">(</span>0<span class="token punctuation">,</span> 0<span class="token punctuation">,</span> 0<span class="token punctuation">,</span> 0.9<span class="token punctuation">)</span> 0px 5px 15px<span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>style</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>
</div></details>
<p>Github 源码地址:<br>
<a href="https://github.com/mo7cc/blog-source/blob/main/src/.vuepress/components/PreviewImage.vue" target="_blank" rel="noopener noreferrer">https://github.com/mo7cc/blog-source/blob/main/src/.vuepress/components/PreviewImage.vue</a></p>
<h2>第二步：在 <code>.vuepress/client.ts</code> 中全局引入该插件</h2>
<div class="code-block-with-title">
  <div class="code-block-title-bar" data-title=".vuepress/client.ts 文件内容">
    <span>.vuepress/client.ts 文件内容</span>
  </div>
  <div class="language-typescript line-numbers-mode" data-highlighter="prismjs" data-ext="ts"><pre><code class="language-typescript"><span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> defineClientConfig <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vuepress/client'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> defineAsyncComponent <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue'</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">const</span> PreviewImage <span class="token operator">=</span> <span class="token function">defineAsyncComponent</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token keyword">import</span><span class="token punctuation">(</span><span class="token string">'./components/PreviewImage.vue'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token function">defineClientConfig</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span>
<span class="line">  <span class="token comment">// ....</span></span>
<span class="line">  rootComponents<span class="token operator">:</span> <span class="token punctuation">[</span></span>
<span class="line">    <span class="token comment">// ....</span></span>
<span class="line">    PreviewImage<span class="token punctuation">,</span></span>
<span class="line">    <span class="token comment">// ....</span></span>
<span class="line">  <span class="token punctuation">]</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token comment">// ....</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>
</div><h2>最终效果如下</h2>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">2.配置文件讲解</title>
    <id>https://mo7.cc/misc/vuepress-hope/step_config.html</id>
    <link href="https://mo7.cc/misc/vuepress-hope/step_config.html"/>
    <updated>2025-09-14T02:04:26.000Z</updated>
    <summary type="html"><![CDATA[
<p>vuepress 的配置文件分为两类:</p>
<h2>主配置文件：</h2>
<p><code>src/.vuepress/config.ts</code></p>
<details class="hint-container details"><summary>文件内容</summary>
<div class="code-block-with-title">
  <div class="code-block-title-bar" data-title="src/.vuepress/config.ts">
    <span>src/.vuepress/config.ts</span>
  </div>
  <div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> defineUserConfig <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vuepress'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">import</span> theme <span class="token keyword">from</span> <span class="token string">'./theme'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> getDirname<span class="token punctuation">,</span> path <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vuepress/utils'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">const</span> __dirname <span class="token operator">=</span> <span class="token function">getDirname</span><span class="token punctuation">(</span><span class="token keyword">import</span><span class="token punctuation">.</span>meta<span class="token punctuation">.</span>url<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">const</span> docsPath <span class="token operator">=</span> path<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span>__dirname<span class="token punctuation">,</span> <span class="token string">'../'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">// const urls: any = [];</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token function">defineUserConfig</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span>
<span class="line">  <span class="token comment">// onGenerated: (app) =&gt; {</span></span>
<span class="line">  <span class="token comment">//   for (let i = 0; i &lt; app.pages.length; i++) {</span></span>
<span class="line">  <span class="token comment">//     const el = app.pages[i];</span></span>
<span class="line">  <span class="token comment">//     urls.push(el.path);</span></span>
<span class="line">  <span class="token comment">//   }</span></span>
<span class="line"></span>
<span class="line">  <span class="token comment">//   console.log(JSON.stringify(urls));</span></span>
<span class="line">  <span class="token comment">// },</span></span>
<span class="line"></span>
<span class="line">  <span class="token literal-property property">base</span><span class="token operator">:</span> <span class="token string">'/'</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token literal-property property">dest</span><span class="token operator">:</span> <span class="token string">'dist'</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token literal-property property">host</span><span class="token operator">:</span> <span class="token string">'0.0.0.0'</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token literal-property property">port</span><span class="token operator">:</span> <span class="token number">9901</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token literal-property property">temp</span><span class="token operator">:</span> <span class="token string">'.cache/.vp-temp'</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token literal-property property">cache</span><span class="token operator">:</span> <span class="token string">'.cache/.vp-cache'</span><span class="token punctuation">,</span></span>
<span class="line"></span>
<span class="line">  <span class="token literal-property property">alias</span><span class="token operator">:</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token string-property property">'@components'</span><span class="token operator">:</span> path<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span>__dirname<span class="token punctuation">,</span> <span class="token string">'components'</span><span class="token punctuation">)</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token string-property property">'@docs'</span><span class="token operator">:</span> docsPath<span class="token punctuation">,</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token literal-property property">locales</span><span class="token operator">:</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token string-property property">'/'</span><span class="token operator">:</span> <span class="token punctuation">{</span></span>
<span class="line">      <span class="token literal-property property">lang</span><span class="token operator">:</span> <span class="token string">'zh-CN'</span><span class="token punctuation">,</span></span>
<span class="line">      <span class="token literal-property property">title</span><span class="token operator">:</span> <span class="token string">'墨七'</span><span class="token punctuation">,</span></span>
<span class="line">      <span class="token literal-property property">description</span><span class="token operator">:</span> <span class="token string">'墨七 - 墨染七弦月，笔耕半亩田。'</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token comment">// '/en/': {</span></span>
<span class="line">    <span class="token comment">//   lang: 'en',</span></span>
<span class="line">    <span class="token comment">//   title: 'Mo7',</span></span>
<span class="line">    <span class="token comment">//   description: 'Mo7 - Simple and happy, as it should be.',</span></span>
<span class="line">    <span class="token comment">// },</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line"></span>
<span class="line">  theme<span class="token punctuation">,</span></span>
<span class="line">  <span class="token literal-property property">shouldPrefetch</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>
</div></details>]]></summary>
    <content type="html"><![CDATA[
<p>vuepress 的配置文件分为两类:</p>
<h2>主配置文件：</h2>
<p><code>src/.vuepress/config.ts</code></p>
<details class="hint-container details"><summary>文件内容</summary>
<div class="code-block-with-title">
  <div class="code-block-title-bar" data-title="src/.vuepress/config.ts">
    <span>src/.vuepress/config.ts</span>
  </div>
  <div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> defineUserConfig <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vuepress'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">import</span> theme <span class="token keyword">from</span> <span class="token string">'./theme'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> getDirname<span class="token punctuation">,</span> path <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vuepress/utils'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">const</span> __dirname <span class="token operator">=</span> <span class="token function">getDirname</span><span class="token punctuation">(</span><span class="token keyword">import</span><span class="token punctuation">.</span>meta<span class="token punctuation">.</span>url<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">const</span> docsPath <span class="token operator">=</span> path<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span>__dirname<span class="token punctuation">,</span> <span class="token string">'../'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">// const urls: any = [];</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token function">defineUserConfig</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span>
<span class="line">  <span class="token comment">// onGenerated: (app) =&gt; {</span></span>
<span class="line">  <span class="token comment">//   for (let i = 0; i &lt; app.pages.length; i++) {</span></span>
<span class="line">  <span class="token comment">//     const el = app.pages[i];</span></span>
<span class="line">  <span class="token comment">//     urls.push(el.path);</span></span>
<span class="line">  <span class="token comment">//   }</span></span>
<span class="line"></span>
<span class="line">  <span class="token comment">//   console.log(JSON.stringify(urls));</span></span>
<span class="line">  <span class="token comment">// },</span></span>
<span class="line"></span>
<span class="line">  <span class="token literal-property property">base</span><span class="token operator">:</span> <span class="token string">'/'</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token literal-property property">dest</span><span class="token operator">:</span> <span class="token string">'dist'</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token literal-property property">host</span><span class="token operator">:</span> <span class="token string">'0.0.0.0'</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token literal-property property">port</span><span class="token operator">:</span> <span class="token number">9901</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token literal-property property">temp</span><span class="token operator">:</span> <span class="token string">'.cache/.vp-temp'</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token literal-property property">cache</span><span class="token operator">:</span> <span class="token string">'.cache/.vp-cache'</span><span class="token punctuation">,</span></span>
<span class="line"></span>
<span class="line">  <span class="token literal-property property">alias</span><span class="token operator">:</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token string-property property">'@components'</span><span class="token operator">:</span> path<span class="token punctuation">.</span><span class="token function">resolve</span><span class="token punctuation">(</span>__dirname<span class="token punctuation">,</span> <span class="token string">'components'</span><span class="token punctuation">)</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token string-property property">'@docs'</span><span class="token operator">:</span> docsPath<span class="token punctuation">,</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token literal-property property">locales</span><span class="token operator">:</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token string-property property">'/'</span><span class="token operator">:</span> <span class="token punctuation">{</span></span>
<span class="line">      <span class="token literal-property property">lang</span><span class="token operator">:</span> <span class="token string">'zh-CN'</span><span class="token punctuation">,</span></span>
<span class="line">      <span class="token literal-property property">title</span><span class="token operator">:</span> <span class="token string">'墨七'</span><span class="token punctuation">,</span></span>
<span class="line">      <span class="token literal-property property">description</span><span class="token operator">:</span> <span class="token string">'墨七 - 墨染七弦月，笔耕半亩田。'</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token comment">// '/en/': {</span></span>
<span class="line">    <span class="token comment">//   lang: 'en',</span></span>
<span class="line">    <span class="token comment">//   title: 'Mo7',</span></span>
<span class="line">    <span class="token comment">//   description: 'Mo7 - Simple and happy, as it should be.',</span></span>
<span class="line">    <span class="token comment">// },</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line"></span>
<span class="line">  theme<span class="token punctuation">,</span></span>
<span class="line">  <span class="token literal-property property">shouldPrefetch</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>
</div></details>
<p>主题配置文件则是通过如下方式植入进来的。<br>
一旦你使用了 vuepress-hope , 那么大部分的配置项都将在 <code>src/.vuepress/theme.ts</code> 中完成。<br>
如果一个插件或者功能你在 <code>config.ts</code> 和 <code>theme.ts</code> 都做了配置，那么就会导致冲突而不生效。</p>
<div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> defineUserConfig <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vuepress'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">import</span> theme <span class="token keyword">from</span> <span class="token string">'./theme.js'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token function">defineUserConfig</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span>
<span class="line">  <span class="token comment">// ...</span></span>
<span class="line">  theme<span class="token punctuation">,</span></span>
<span class="line">  <span class="token comment">// ...</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><blockquote>
<p>这其中的配置项的作用基本都可以在 <a href="https://theme-hope.vuejs.press/zh/config/intro.html" target="_blank" rel="noopener noreferrer">https://theme-hope.vuejs.press/zh/config/intro.html</a> 中搜得到。</p>
</blockquote>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">3.如何编写自定义组件</title>
    <id>https://mo7.cc/misc/vuepress-hope/step_components.html</id>
    <link href="https://mo7.cc/misc/vuepress-hope/step_components.html"/>
    <updated>2025-07-04T14:11:31.000Z</updated>
    <summary type="html"><![CDATA[
<p>如何编写自定义组件啊，这个教程是真的很难写，会就是会，不会的话要学习的知识是很多的。但我还是尽力去讲解吧。</p>
<p>我这里用一个最简单的组件来举例子:</p>
<p><code>src/.vuepress/components/CommentHideBtn.vue</code></p>
<div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line"><span class="token operator">&lt;</span>script setup lang<span class="token operator">=</span><span class="token string">"ts"</span><span class="token operator">&gt;</span></span>
<span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> ref<span class="token punctuation">,</span> onMounted<span class="token punctuation">,</span> nextTick <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> useRouter <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue-router'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> mStorage <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'../utils/tools.js'</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">const</span> <span class="token function-variable function">ShowComments</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">const</span> CommentElm <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'comment'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> HTMLElement<span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>CommentElm<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">return</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  CommentElm<span class="token punctuation">.</span>classList<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">'show'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  CommentElm<span class="token punctuation">.</span>classList<span class="token punctuation">.</span><span class="token function">remove</span><span class="token punctuation">(</span><span class="token string">'hide'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  mStorage<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token string">'CommentIsDisplay'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">const</span> <span class="token function-variable function">HideComments</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">const</span> CommentElm <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'comment'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> HTMLElement<span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>CommentElm<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">return</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  CommentElm<span class="token punctuation">.</span>classList<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">'hide'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  CommentElm<span class="token punctuation">.</span>classList<span class="token punctuation">.</span><span class="token function">remove</span><span class="token punctuation">(</span><span class="token string">'show'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  mStorage<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token string">'CommentIsDisplay'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">const</span> <span class="token function-variable function">ReadeCommentIsDisplay</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">const</span> CommentElm <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'comment'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> HTMLElement<span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>CommentElm<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">return</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">  <span class="token keyword">const</span> CommentIsDisplay <span class="token operator">=</span> mStorage<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'CommentIsDisplay'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>CommentIsDisplay<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">ShowComments</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">HideComments</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">  CommentElm<span class="token punctuation">.</span>style<span class="token punctuation">.</span>opacity <span class="token operator">=</span> <span class="token string">'1'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">const</span> <span class="token function-variable function">CreateCommentBtn</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">const</span> CommentElm <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'comment'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>CommentElm<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">return</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'ShowComment'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">const</span> BtnElm <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">createElement</span><span class="token punctuation">(</span><span class="token string">'button'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    BtnElm<span class="token punctuation">.</span>id <span class="token operator">=</span> <span class="token string">'ShowComment'</span><span class="token punctuation">;</span></span>
<span class="line">    BtnElm<span class="token punctuation">.</span>classList<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">'primary'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    BtnElm<span class="token punctuation">.</span>classList<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">'wl-btn'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    BtnElm<span class="token punctuation">.</span>innerHTML <span class="token operator">=</span> <span class="token string">'显示评论区'</span><span class="token punctuation">;</span></span>
<span class="line">    CommentElm<span class="token punctuation">.</span><span class="token function">appendChild</span><span class="token punctuation">(</span>BtnElm<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'HideComment'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">const</span> BtnElm <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">createElement</span><span class="token punctuation">(</span><span class="token string">'button'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    BtnElm<span class="token punctuation">.</span>id <span class="token operator">=</span> <span class="token string">'HideComment'</span><span class="token punctuation">;</span></span>
<span class="line">    BtnElm<span class="token punctuation">.</span>classList<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">'primary'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    BtnElm<span class="token punctuation">.</span>classList<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">'wl-btn'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    BtnElm<span class="token punctuation">.</span>innerHTML <span class="token operator">=</span> <span class="token string">'隐藏评论区'</span><span class="token punctuation">;</span></span>
<span class="line">    CommentElm<span class="token punctuation">.</span><span class="token function">appendChild</span><span class="token punctuation">(</span>BtnElm<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">  <span class="token keyword">const</span> showBtn <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'ShowComment'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">const</span> hideBtn <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'HideComment'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>showBtn <span class="token operator">&amp;&amp;</span> hideBtn<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    showBtn<span class="token punctuation">.</span>onclick <span class="token operator">=</span> ShowComments<span class="token punctuation">;</span></span>
<span class="line">    hideBtn<span class="token punctuation">.</span>onclick <span class="token operator">=</span> HideComments<span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token function">onMounted</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token function">nextTick</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">CreateCommentBtn</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token function">ReadeCommentIsDisplay</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">  <span class="token keyword">const</span> router <span class="token operator">=</span> <span class="token function">useRouter</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  router<span class="token punctuation">.</span><span class="token function">afterEach</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">to</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">nextTick</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">      <span class="token function">setTimeout</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token function">CreateCommentBtn</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">        <span class="token function">ReadeCommentIsDisplay</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">      <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token number">500</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token operator">&lt;</span><span class="token operator">/</span>script<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"><span class="token operator">&lt;</span>template<span class="token operator">&gt;</span></span>
<span class="line">  <span class="token operator">&lt;</span>ClientOnly<span class="token operator">&gt;</span></span>
<span class="line">    <span class="token operator">&lt;</span>div <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"none"</span><span class="token operator">&gt;</span>评论区隐藏按钮<span class="token operator">&lt;</span><span class="token operator">/</span>div<span class="token operator">&gt;</span></span>
<span class="line">  <span class="token operator">&lt;</span><span class="token operator">/</span>ClientOnly<span class="token operator">&gt;</span></span>
<span class="line"><span class="token operator">&lt;</span><span class="token operator">/</span>template<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"><span class="token operator">&lt;</span>style lang<span class="token operator">=</span><span class="token string">"scss"</span><span class="token operator">&gt;</span></span>
<span class="line"><span class="token comment">// 评论插件的样式修改</span></span>
<span class="line"><span class="token punctuation">.</span>wl<span class="token operator">-</span>card <span class="token punctuation">.</span>wl<span class="token operator">-</span>meta <span class="token operator">&gt;</span> span <span class="token punctuation">{</span></span>
<span class="line">  <span class="token literal-property property">background</span><span class="token operator">:</span> transparent<span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token punctuation">.</span>vp<span class="token operator">-</span>comment <span class="token punctuation">{</span></span>
<span class="line">  <span class="token literal-property property">position</span><span class="token operator">:</span> relative<span class="token punctuation">;</span></span>
<span class="line">  <span class="token literal-property property">overflow</span><span class="token operator">:</span> hidden<span class="token punctuation">;</span></span>
<span class="line">  <span class="token literal-property property">opacity</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token literal-property property">transition</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">.</span>3s<span class="token punctuation">;</span></span>
<span class="line">  margin<span class="token operator">-</span>bottom<span class="token operator">:</span> 2rem<span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">[</span>provider<span class="token operator">=</span><span class="token string">'Waline'</span><span class="token punctuation">]</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token literal-property property">opacity</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">;</span></span>
<span class="line">    margin<span class="token operator">-</span>bottom<span class="token operator">:</span> 5rem<span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token operator">&amp;</span><span class="token punctuation">.</span>hide <span class="token punctuation">{</span></span>
<span class="line">    max<span class="token operator">-</span>height<span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">[</span>provider<span class="token operator">=</span><span class="token string">'Waline'</span><span class="token punctuation">]</span> <span class="token punctuation">{</span></span>
<span class="line">      <span class="token literal-property property">opacity</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">;</span></span>
<span class="line">      <span class="token literal-property property">transition</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">.</span>3s<span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">    #ShowComment <span class="token punctuation">{</span></span>
<span class="line">      <span class="token literal-property property">display</span><span class="token operator">:</span> block<span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">    #HideComment <span class="token punctuation">{</span></span>
<span class="line">      <span class="token literal-property property">display</span><span class="token operator">:</span> none<span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token operator">&amp;</span><span class="token punctuation">.</span>show <span class="token punctuation">{</span></span>
<span class="line">    max<span class="token operator">-</span>height<span class="token operator">:</span> 9999px<span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">[</span>provider<span class="token operator">=</span><span class="token string">'Waline'</span><span class="token punctuation">]</span> <span class="token punctuation">{</span></span>
<span class="line">      <span class="token literal-property property">opacity</span><span class="token operator">:</span> <span class="token number">1</span><span class="token punctuation">;</span></span>
<span class="line">      <span class="token literal-property property">transition</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">.</span>3s<span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">    #ShowComment <span class="token punctuation">{</span></span>
<span class="line">      <span class="token literal-property property">display</span><span class="token operator">:</span> none<span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">    #HideComment <span class="token punctuation">{</span></span>
<span class="line">      <span class="token literal-property property">display</span><span class="token operator">:</span> block<span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">#ShowComment <span class="token punctuation">{</span></span>
<span class="line">  <span class="token literal-property property">top</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line">#HideComment <span class="token punctuation">{</span></span>
<span class="line">  <span class="token literal-property property">bottom</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line">#ShowComment<span class="token punctuation">,</span></span>
<span class="line">#HideComment <span class="token punctuation">{</span></span>
<span class="line">  <span class="token literal-property property">display</span><span class="token operator">:</span> none<span class="token punctuation">;</span></span>
<span class="line">  <span class="token literal-property property">position</span><span class="token operator">:</span> absolute<span class="token punctuation">;</span></span>
<span class="line">  <span class="token literal-property property">left</span><span class="token operator">:</span> <span class="token number">50</span><span class="token operator">%</span><span class="token punctuation">;</span></span>
<span class="line">  margin<span class="token operator">-</span>left<span class="token operator">:</span> <span class="token operator">-</span>4em<span class="token punctuation">;</span></span>
<span class="line">  <span class="token literal-property property">width</span><span class="token operator">:</span> 8em<span class="token punctuation">;</span></span>
<span class="line">  z<span class="token operator">-</span>index<span class="token operator">:</span> <span class="token number">5</span><span class="token punctuation">;</span></span>
<span class="line">  user<span class="token operator">-</span>select<span class="token operator">:</span> none<span class="token punctuation">;</span></span>
<span class="line">  <span class="token literal-property property">transition</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">.</span>3s<span class="token punctuation">;</span></span>
<span class="line">  font<span class="token operator">-</span>size<span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">.</span>9rem<span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"><span class="token operator">&lt;</span><span class="token operator">/</span>style<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[
<p>如何编写自定义组件啊，这个教程是真的很难写，会就是会，不会的话要学习的知识是很多的。但我还是尽力去讲解吧。</p>
<p>我这里用一个最简单的组件来举例子:</p>
<p><code>src/.vuepress/components/CommentHideBtn.vue</code></p>
<div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line"><span class="token operator">&lt;</span>script setup lang<span class="token operator">=</span><span class="token string">"ts"</span><span class="token operator">&gt;</span></span>
<span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> ref<span class="token punctuation">,</span> onMounted<span class="token punctuation">,</span> nextTick <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> useRouter <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue-router'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> mStorage <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'../utils/tools.js'</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">const</span> <span class="token function-variable function">ShowComments</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">const</span> CommentElm <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'comment'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> HTMLElement<span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>CommentElm<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">return</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  CommentElm<span class="token punctuation">.</span>classList<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">'show'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  CommentElm<span class="token punctuation">.</span>classList<span class="token punctuation">.</span><span class="token function">remove</span><span class="token punctuation">(</span><span class="token string">'hide'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  mStorage<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token string">'CommentIsDisplay'</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">const</span> <span class="token function-variable function">HideComments</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">const</span> CommentElm <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'comment'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> HTMLElement<span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>CommentElm<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">return</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  CommentElm<span class="token punctuation">.</span>classList<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">'hide'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  CommentElm<span class="token punctuation">.</span>classList<span class="token punctuation">.</span><span class="token function">remove</span><span class="token punctuation">(</span><span class="token string">'show'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  mStorage<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token string">'CommentIsDisplay'</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">const</span> <span class="token function-variable function">ReadeCommentIsDisplay</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">const</span> CommentElm <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'comment'</span><span class="token punctuation">)</span> <span class="token keyword">as</span> HTMLElement<span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>CommentElm<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">return</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">  <span class="token keyword">const</span> CommentIsDisplay <span class="token operator">=</span> mStorage<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">'CommentIsDisplay'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>CommentIsDisplay<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">ShowComments</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">HideComments</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">  CommentElm<span class="token punctuation">.</span>style<span class="token punctuation">.</span>opacity <span class="token operator">=</span> <span class="token string">'1'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">const</span> <span class="token function-variable function">CreateCommentBtn</span> <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">const</span> CommentElm <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'comment'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>CommentElm<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">return</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'ShowComment'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">const</span> BtnElm <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">createElement</span><span class="token punctuation">(</span><span class="token string">'button'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    BtnElm<span class="token punctuation">.</span>id <span class="token operator">=</span> <span class="token string">'ShowComment'</span><span class="token punctuation">;</span></span>
<span class="line">    BtnElm<span class="token punctuation">.</span>classList<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">'primary'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    BtnElm<span class="token punctuation">.</span>classList<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">'wl-btn'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    BtnElm<span class="token punctuation">.</span>innerHTML <span class="token operator">=</span> <span class="token string">'显示评论区'</span><span class="token punctuation">;</span></span>
<span class="line">    CommentElm<span class="token punctuation">.</span><span class="token function">appendChild</span><span class="token punctuation">(</span>BtnElm<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'HideComment'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">const</span> BtnElm <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">createElement</span><span class="token punctuation">(</span><span class="token string">'button'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    BtnElm<span class="token punctuation">.</span>id <span class="token operator">=</span> <span class="token string">'HideComment'</span><span class="token punctuation">;</span></span>
<span class="line">    BtnElm<span class="token punctuation">.</span>classList<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">'primary'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    BtnElm<span class="token punctuation">.</span>classList<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">'wl-btn'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    BtnElm<span class="token punctuation">.</span>innerHTML <span class="token operator">=</span> <span class="token string">'隐藏评论区'</span><span class="token punctuation">;</span></span>
<span class="line">    CommentElm<span class="token punctuation">.</span><span class="token function">appendChild</span><span class="token punctuation">(</span>BtnElm<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">  <span class="token keyword">const</span> showBtn <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'ShowComment'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">const</span> hideBtn <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'HideComment'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>showBtn <span class="token operator">&amp;&amp;</span> hideBtn<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    showBtn<span class="token punctuation">.</span>onclick <span class="token operator">=</span> ShowComments<span class="token punctuation">;</span></span>
<span class="line">    hideBtn<span class="token punctuation">.</span>onclick <span class="token operator">=</span> HideComments<span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token function">onMounted</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token function">nextTick</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">CreateCommentBtn</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token function">ReadeCommentIsDisplay</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">  <span class="token keyword">const</span> router <span class="token operator">=</span> <span class="token function">useRouter</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  router<span class="token punctuation">.</span><span class="token function">afterEach</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">to</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">nextTick</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">      <span class="token function">setTimeout</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token function">CreateCommentBtn</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">        <span class="token function">ReadeCommentIsDisplay</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">      <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token number">500</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token operator">&lt;</span><span class="token operator">/</span>script<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"><span class="token operator">&lt;</span>template<span class="token operator">&gt;</span></span>
<span class="line">  <span class="token operator">&lt;</span>ClientOnly<span class="token operator">&gt;</span></span>
<span class="line">    <span class="token operator">&lt;</span>div <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"none"</span><span class="token operator">&gt;</span>评论区隐藏按钮<span class="token operator">&lt;</span><span class="token operator">/</span>div<span class="token operator">&gt;</span></span>
<span class="line">  <span class="token operator">&lt;</span><span class="token operator">/</span>ClientOnly<span class="token operator">&gt;</span></span>
<span class="line"><span class="token operator">&lt;</span><span class="token operator">/</span>template<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"><span class="token operator">&lt;</span>style lang<span class="token operator">=</span><span class="token string">"scss"</span><span class="token operator">&gt;</span></span>
<span class="line"><span class="token comment">// 评论插件的样式修改</span></span>
<span class="line"><span class="token punctuation">.</span>wl<span class="token operator">-</span>card <span class="token punctuation">.</span>wl<span class="token operator">-</span>meta <span class="token operator">&gt;</span> span <span class="token punctuation">{</span></span>
<span class="line">  <span class="token literal-property property">background</span><span class="token operator">:</span> transparent<span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token punctuation">.</span>vp<span class="token operator">-</span>comment <span class="token punctuation">{</span></span>
<span class="line">  <span class="token literal-property property">position</span><span class="token operator">:</span> relative<span class="token punctuation">;</span></span>
<span class="line">  <span class="token literal-property property">overflow</span><span class="token operator">:</span> hidden<span class="token punctuation">;</span></span>
<span class="line">  <span class="token literal-property property">opacity</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token literal-property property">transition</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">.</span>3s<span class="token punctuation">;</span></span>
<span class="line">  margin<span class="token operator">-</span>bottom<span class="token operator">:</span> 2rem<span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">[</span>provider<span class="token operator">=</span><span class="token string">'Waline'</span><span class="token punctuation">]</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token literal-property property">opacity</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">;</span></span>
<span class="line">    margin<span class="token operator">-</span>bottom<span class="token operator">:</span> 5rem<span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token operator">&amp;</span><span class="token punctuation">.</span>hide <span class="token punctuation">{</span></span>
<span class="line">    max<span class="token operator">-</span>height<span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">[</span>provider<span class="token operator">=</span><span class="token string">'Waline'</span><span class="token punctuation">]</span> <span class="token punctuation">{</span></span>
<span class="line">      <span class="token literal-property property">opacity</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">;</span></span>
<span class="line">      <span class="token literal-property property">transition</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">.</span>3s<span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">    #ShowComment <span class="token punctuation">{</span></span>
<span class="line">      <span class="token literal-property property">display</span><span class="token operator">:</span> block<span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">    #HideComment <span class="token punctuation">{</span></span>
<span class="line">      <span class="token literal-property property">display</span><span class="token operator">:</span> none<span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token operator">&amp;</span><span class="token punctuation">.</span>show <span class="token punctuation">{</span></span>
<span class="line">    max<span class="token operator">-</span>height<span class="token operator">:</span> 9999px<span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">[</span>provider<span class="token operator">=</span><span class="token string">'Waline'</span><span class="token punctuation">]</span> <span class="token punctuation">{</span></span>
<span class="line">      <span class="token literal-property property">opacity</span><span class="token operator">:</span> <span class="token number">1</span><span class="token punctuation">;</span></span>
<span class="line">      <span class="token literal-property property">transition</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">.</span>3s<span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">    #ShowComment <span class="token punctuation">{</span></span>
<span class="line">      <span class="token literal-property property">display</span><span class="token operator">:</span> none<span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">    #HideComment <span class="token punctuation">{</span></span>
<span class="line">      <span class="token literal-property property">display</span><span class="token operator">:</span> block<span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">#ShowComment <span class="token punctuation">{</span></span>
<span class="line">  <span class="token literal-property property">top</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line">#HideComment <span class="token punctuation">{</span></span>
<span class="line">  <span class="token literal-property property">bottom</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line">#ShowComment<span class="token punctuation">,</span></span>
<span class="line">#HideComment <span class="token punctuation">{</span></span>
<span class="line">  <span class="token literal-property property">display</span><span class="token operator">:</span> none<span class="token punctuation">;</span></span>
<span class="line">  <span class="token literal-property property">position</span><span class="token operator">:</span> absolute<span class="token punctuation">;</span></span>
<span class="line">  <span class="token literal-property property">left</span><span class="token operator">:</span> <span class="token number">50</span><span class="token operator">%</span><span class="token punctuation">;</span></span>
<span class="line">  margin<span class="token operator">-</span>left<span class="token operator">:</span> <span class="token operator">-</span>4em<span class="token punctuation">;</span></span>
<span class="line">  <span class="token literal-property property">width</span><span class="token operator">:</span> 8em<span class="token punctuation">;</span></span>
<span class="line">  z<span class="token operator">-</span>index<span class="token operator">:</span> <span class="token number">5</span><span class="token punctuation">;</span></span>
<span class="line">  user<span class="token operator">-</span>select<span class="token operator">:</span> none<span class="token punctuation">;</span></span>
<span class="line">  <span class="token literal-property property">transition</span><span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">.</span>3s<span class="token punctuation">;</span></span>
<span class="line">  font<span class="token operator">-</span>size<span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">.</span>9rem<span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"><span class="token operator">&lt;</span><span class="token operator">/</span>style<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>他的引用方式如下:</p>
<p>在 <code>src/.vuepress/client.ts</code> 文件中</p>
<div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> defineClientConfig <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vuepress/client'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> defineAsyncComponent <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">const</span> PrintVersion <span class="token operator">=</span> <span class="token function">defineAsyncComponent</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token keyword">import</span><span class="token punctuation">(</span><span class="token string">'./components/PrintVersion.vue'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token function">defineClientConfig</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span>
<span class="line">  <span class="token comment">// ...</span></span>
<span class="line">  <span class="token literal-property property">rootComponents</span><span class="token operator">:</span> <span class="token punctuation">[</span>PrintVersion<span class="token punctuation">]</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token comment">// ...</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>他干的事情很简单，就是在控制栏中打印当前的版本号。</p>
<p>一般组件的结构如下：</p>
<div class="language-vue line-numbers-mode" data-highlighter="prismjs" data-ext="vue"><pre><code class="language-vue"><span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">setup</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>ts<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span><span class="token script"><span class="token language-javascript"></span>
<span class="line"><span class="token comment">// 这里是 js 部分，</span></span>
<span class="line"><span class="token comment">// setup 表示 vue 的生命周期，具体的可以查看 vue3 的文档。</span></span>
<span class="line"><span class="token comment">// lang="ts" 表示这里的代码会以 typescript 的形式进行解析和编译。</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> onMounted<span class="token punctuation">,</span> nextTick <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> useRouter <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue-router'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token function">onMounted</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token comment">// vue3 生命周期钩子，这里会等到所有同步组件全部挂载完毕之后才会调用</span></span>
<span class="line">  <span class="token comment">// 这里就可以对 DOM 树进行相关的操作了。</span></span>
<span class="line">  <span class="token function">nextTick</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token comment">//  nextTick 函数则是在DOM 更新完成之后才会触发，这里进行 DOM 操作更加安全</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">const</span> router <span class="token operator">=</span> <span class="token function">useRouter</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  router<span class="token punctuation">.</span><span class="token function">afterEach</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">to</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token comment">// 这里是 路由变化监听，每次路由变化 就会触发。</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>template</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ClientOnly</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">    <span class="token comment">&lt;!-- </span>
<span class="line">这里是 HTML 部分；</span>
<span class="line">"ClientOnly" 标签表示 这部分内容只会在客户端的时候才会被渲染。不会在编译期进行解析。</span>
<span class="line">vuepress 对 SEO 的优化很到位，所以我们的魔改基本上只需要在客户端生效即可 </span>
<span class="line">    --&gt;</span></span>
<span class="line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>ClientOnly</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>template</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>style</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>scss<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span><span class="token style"><span class="token language-css"></span>
<span class="line">// css 部分，这里的css 将会在组件加载的时候对全局生效。</span>
<span class="line">// lang=<span class="token string">"scss"</span> 表示这里的代码是以 scss 的标准去解析和编译。</span>
<span class="line"></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>style</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>如果想知道更多细节，可能得学习 vue3 相关的知识了。</p>
<p>vue3 官方文档:<br>
<a href="https://cn.vuejs.org/" target="_blank" rel="noopener noreferrer">https://cn.vuejs.org/</a></p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">4.主题魔改说明</title>
    <id>https://mo7.cc/misc/vuepress-hope/step_client.html</id>
    <link href="https://mo7.cc/misc/vuepress-hope/step_client.html"/>
    <updated>2025-07-04T14:11:31.000Z</updated>
    <summary type="html"><![CDATA[
<p>整个站站点的修改分为以下几个部分</p>
<h2>插件式美化</h2>
<p><code>src/.vuepress/client.ts</code></p>
<details class="hint-container details"><summary>文件内容</summary>
<div class="code-block-with-title">
  <div class="code-block-title-bar" data-title="src/.vuepress/client.ts">
    <span>src/.vuepress/client.ts</span>
  </div>
  <div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> defineClientConfig <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vuepress/client'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> onMounted <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> defineAsyncComponent <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue'</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">import</span><span class="token punctuation">(</span><span class="token string">'./components/PrintVersion'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">res</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">  res<span class="token punctuation">.</span><span class="token function">default</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">const</span> MyIcon <span class="token operator">=</span> <span class="token function">defineAsyncComponent</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token keyword">import</span><span class="token punctuation">(</span><span class="token string">'./components/MyIcon.vue'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">const</span> TopNavBeautify <span class="token operator">=</span> <span class="token function">defineAsyncComponent</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token keyword">import</span><span class="token punctuation">(</span><span class="token string">'./components/TopNavBeautify.vue'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">const</span> NavMusic <span class="token operator">=</span> <span class="token function">defineAsyncComponent</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token keyword">import</span><span class="token punctuation">(</span><span class="token string">'./components/NavMusic.vue'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">const</span> CommentHideBtn <span class="token operator">=</span> <span class="token function">defineAsyncComponent</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token keyword">import</span><span class="token punctuation">(</span><span class="token string">'./components/CommentHideBtn.vue'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">const</span> BlogBg <span class="token operator">=</span> <span class="token function">defineAsyncComponent</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token keyword">import</span><span class="token punctuation">(</span><span class="token string">'./components/BlogBg.vue'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">const</span> PreviewImage <span class="token operator">=</span> <span class="token function">defineAsyncComponent</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token keyword">import</span><span class="token punctuation">(</span><span class="token string">'./components/PreviewImage.vue'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">const</span> HeroContent <span class="token operator">=</span> <span class="token function">defineAsyncComponent</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token keyword">import</span><span class="token punctuation">(</span><span class="token string">'./components/HeroContent.vue'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">const</span> HeroBG <span class="token operator">=</span> <span class="token function">defineAsyncComponent</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token keyword">import</span><span class="token punctuation">(</span><span class="token string">'./components/HeroBG.vue'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">const</span> Hitokoto <span class="token operator">=</span> <span class="token function">defineAsyncComponent</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token keyword">import</span><span class="token punctuation">(</span><span class="token string">'./components/Hitokoto.vue'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token function">defineClientConfig</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span>
<span class="line">  <span class="token function">enhance</span><span class="token punctuation">(</span><span class="token parameter"><span class="token punctuation">{</span> app<span class="token punctuation">,</span> router<span class="token punctuation">,</span> siteData <span class="token punctuation">}</span></span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    app<span class="token punctuation">.</span><span class="token function">component</span><span class="token punctuation">(</span><span class="token string">'MyIcon'</span><span class="token punctuation">,</span> MyIcon<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token function">setup</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">onMounted</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token literal-property property">rootComponents</span><span class="token operator">:</span> <span class="token punctuation">[</span></span>
<span class="line">    TopNavBeautify<span class="token punctuation">,</span></span>
<span class="line">    NavMusic<span class="token punctuation">,</span></span>
<span class="line">    CommentHideBtn<span class="token punctuation">,</span></span>
<span class="line">    BlogBg<span class="token punctuation">,</span></span>
<span class="line">    PreviewImage<span class="token punctuation">,</span></span>
<span class="line">    HeroBG<span class="token punctuation">,</span></span>
<span class="line">    HeroContent<span class="token punctuation">,</span></span>
<span class="line">    Hitokoto<span class="token punctuation">,</span></span>
<span class="line">    <span class="token comment">// ...</span></span>
<span class="line">  <span class="token punctuation">]</span><span class="token punctuation">,</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>
</div></details>]]></summary>
    <content type="html"><![CDATA[
<p>整个站站点的修改分为以下几个部分</p>
<h2>插件式美化</h2>
<p><code>src/.vuepress/client.ts</code></p>
<details class="hint-container details"><summary>文件内容</summary>
<div class="code-block-with-title">
  <div class="code-block-title-bar" data-title="src/.vuepress/client.ts">
    <span>src/.vuepress/client.ts</span>
  </div>
  <div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> defineClientConfig <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vuepress/client'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> onMounted <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> defineAsyncComponent <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue'</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">import</span><span class="token punctuation">(</span><span class="token string">'./components/PrintVersion'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token parameter">res</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">  res<span class="token punctuation">.</span><span class="token function">default</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">const</span> MyIcon <span class="token operator">=</span> <span class="token function">defineAsyncComponent</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token keyword">import</span><span class="token punctuation">(</span><span class="token string">'./components/MyIcon.vue'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">const</span> TopNavBeautify <span class="token operator">=</span> <span class="token function">defineAsyncComponent</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token keyword">import</span><span class="token punctuation">(</span><span class="token string">'./components/TopNavBeautify.vue'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">const</span> NavMusic <span class="token operator">=</span> <span class="token function">defineAsyncComponent</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token keyword">import</span><span class="token punctuation">(</span><span class="token string">'./components/NavMusic.vue'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">const</span> CommentHideBtn <span class="token operator">=</span> <span class="token function">defineAsyncComponent</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token keyword">import</span><span class="token punctuation">(</span><span class="token string">'./components/CommentHideBtn.vue'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">const</span> BlogBg <span class="token operator">=</span> <span class="token function">defineAsyncComponent</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token keyword">import</span><span class="token punctuation">(</span><span class="token string">'./components/BlogBg.vue'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">const</span> PreviewImage <span class="token operator">=</span> <span class="token function">defineAsyncComponent</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token keyword">import</span><span class="token punctuation">(</span><span class="token string">'./components/PreviewImage.vue'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">const</span> HeroContent <span class="token operator">=</span> <span class="token function">defineAsyncComponent</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token keyword">import</span><span class="token punctuation">(</span><span class="token string">'./components/HeroContent.vue'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">const</span> HeroBG <span class="token operator">=</span> <span class="token function">defineAsyncComponent</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token keyword">import</span><span class="token punctuation">(</span><span class="token string">'./components/HeroBG.vue'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">const</span> Hitokoto <span class="token operator">=</span> <span class="token function">defineAsyncComponent</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token keyword">import</span><span class="token punctuation">(</span><span class="token string">'./components/Hitokoto.vue'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token function">defineClientConfig</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span>
<span class="line">  <span class="token function">enhance</span><span class="token punctuation">(</span><span class="token parameter"><span class="token punctuation">{</span> app<span class="token punctuation">,</span> router<span class="token punctuation">,</span> siteData <span class="token punctuation">}</span></span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    app<span class="token punctuation">.</span><span class="token function">component</span><span class="token punctuation">(</span><span class="token string">'MyIcon'</span><span class="token punctuation">,</span> MyIcon<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token function">setup</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">onMounted</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token literal-property property">rootComponents</span><span class="token operator">:</span> <span class="token punctuation">[</span></span>
<span class="line">    TopNavBeautify<span class="token punctuation">,</span></span>
<span class="line">    NavMusic<span class="token punctuation">,</span></span>
<span class="line">    CommentHideBtn<span class="token punctuation">,</span></span>
<span class="line">    BlogBg<span class="token punctuation">,</span></span>
<span class="line">    PreviewImage<span class="token punctuation">,</span></span>
<span class="line">    HeroBG<span class="token punctuation">,</span></span>
<span class="line">    HeroContent<span class="token punctuation">,</span></span>
<span class="line">    Hitokoto<span class="token punctuation">,</span></span>
<span class="line">    <span class="token comment">// ...</span></span>
<span class="line">  <span class="token punctuation">]</span><span class="token punctuation">,</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>
</div></details>
<p>插件源码都在 Github 上，可以自行查看：<br>
<a href="https://github.com/mo7cc/blog-source/tree/main/src/.vuepress/components" target="_blank" rel="noopener noreferrer">https://github.com/mo7cc/blog-source/tree/main/src/.vuepress/components</a></p>
<p>每个插件都代表了某一个部分的美化效果，每个插件都是可以单独使用的。</p>
<div class="hint-container info">
<p class="hint-container-title">插件功能说明</p>
<p><code>TopNavBeautify</code> : 顶部导航栏相关的美化。包括透明导航栏；侧边栏和导航栏一起上划隐藏，下划显示；简化搜索按钮；导航栏文字和图标颜色调整等。</p>
<p><code>HeroBG</code> : 博客首页的背景美化，这里是请求了自己的 bing 壁纸 api，每日自动更新。</p>
<p><code>HeroHitokoto</code> : 博客首页一言的美化，之前是会自动打字机切换，觉得挺烦的，就换成了现在的刷新更换。但是保留了打字机效果。</p>
<p><code>NavMusic</code> : 导航栏最右侧的音乐按钮，点击之后显示全局的音乐播放器，是使用 <code>APlayer</code> 音乐插件自己封装的。实现思路就是使用 js 强行在导航栏插入一片区域用于放置播放器。</p>
<p><code>CommentHideBtn</code> : 评论区的显示和隐藏按钮，默认是隐藏评论区的，当有留言需要的时候点击按钮显示评论区。</p>
<p><code>BlogBeautify</code> : 做了一些相关的主题的细节美化，包括文章分割线小汽车等，基本全是 css 效果。使用 vue 插件实现着扩展方便。</p>
<p><code>BlogBg</code> : 背景美化，让整个博客可以添加自定义的背景，让观感更加舒适。包括 sidebar 的毛玻璃效果等。还有内容部分的视觉优化。</p>
</div>
<p>每个插件都是覆盖式的，不会对主题原本造成任何影响。引入对应的组件，则效果就有，去除引用则效果消失。而且组件基本上都只在客户端生效，对原本的 SEO 以及编译过程没有任何影响，非侵入式的修改。主题无论如何更新迭代，都不会有什么影响，安全无公害，兼容性好。</p>
<p><strong>插件的实现思路：</strong> 使用 css 覆盖主题原本的 css 效果。如果需要的 dom 结构主题没有，则采用 js 进插入，创造和修改。js 部分的修改全都是在原本的页面渲染完成之后异步进行的，所以仅仅只是观感上的修改而已，不会影响编译结果。</p>
<p>比如 <strong>一言插件</strong> 和 <strong>音乐插件</strong> 以及 <strong>背景插件</strong>，就是采用 js 异步创建 dom 实现的。</p>
<h2>一些其余的效果</h2>
<p><code>src/.vuepress/styles/index.scss</code> 文件中</p>
<div class="language-scss line-numbers-mode" data-highlighter="prismjs" data-ext="scss"><pre><code class="language-scss"><span class="line"><span class="token keyword">@import</span> <span class="token string">'@docs/.vuepress/styles/bounce-icon.scss'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token comment">// place your custom styles here</span></span>
<span class="line"><span class="token selector">.none </span><span class="token punctuation">{</span></span>
<span class="line">  <span class="token property">width</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">height</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">user-select</span><span class="token punctuation">:</span> none<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">pointer-events</span><span class="token punctuation">:</span> none<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">overflow</span><span class="token punctuation">:</span> hidden<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">display</span><span class="token punctuation">:</span> none<span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">// 自定义的页脚</span></span>
<span class="line"><span class="token selector">.vp-footer-wrapper </span><span class="token punctuation">{</span></span>
<span class="line">  <span class="token selector">.vp-footer </span><span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">display</span><span class="token punctuation">:</span> flex<span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">  <span class="token selector">.mo7-footer-icp </span><span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">font-size</span><span class="token punctuation">:</span> 14px<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">display</span><span class="token punctuation">:</span> flex<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">align-items</span><span class="token punctuation">:</span> center<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">justify-content</span><span class="token punctuation">:</span> center<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">color</span><span class="token punctuation">:</span> inherit<span class="token punctuation">;</span></span>
<span class="line">    <span class="token selector"><span class="token parent important">&amp;</span> &gt; img </span><span class="token punctuation">{</span></span>
<span class="line">      <span class="token property">width</span><span class="token punctuation">:</span> 14px<span class="token punctuation">;</span></span>
<span class="line">      <span class="token property">margin-right</span><span class="token punctuation">:</span> 4px<span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token selector">.mo7-footer-about </span><span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">padding</span><span class="token punctuation">:</span> 2px 3px<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">border-radius</span><span class="token punctuation">:</span> 3px<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">position</span><span class="token punctuation">:</span> relative<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">color</span><span class="token punctuation">:</span> inherit<span class="token punctuation">;</span></span>
<span class="line">    <span class="token selector"><span class="token parent important">&amp;</span>:hover </span><span class="token punctuation">{</span></span>
<span class="line">      <span class="token property">background-color</span><span class="token punctuation">:</span> <span class="token function">rgba</span><span class="token punctuation">(</span><span class="token property"><span class="token variable">$color</span></span><span class="token punctuation">:</span> #0c7bf4<span class="token punctuation">,</span> <span class="token property"><span class="token variable">$alpha</span></span><span class="token punctuation">:</span> 0.8<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">      <span class="token property">color</span><span class="token punctuation">:</span> #fff<span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">// 让内容在更宽的屏幕上可以有更宽的显示区域，嗯，宽屏补丁。</span></span>
<span class="line"><span class="token selector">:root </span><span class="token punctuation">{</span></span>
<span class="line">  <span class="token property">--content-width</span><span class="token punctuation">:</span> 830px<span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"><span class="token atrule"><span class="token rule">@media</span> screen <span class="token operator">and</span> <span class="token punctuation">(</span><span class="token property">min-width</span><span class="token punctuation">:</span> 1770px<span class="token punctuation">)</span></span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token selector">:root </span><span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">--content-width</span><span class="token punctuation">:</span> <span class="token function">calc</span><span class="token punctuation">(</span>100vw <span class="token operator">-</span> 15rem <span class="token operator">-</span> 6rem <span class="token operator">-</span> <span class="token function">var</span><span class="token punctuation">(</span>--sidebar-width<span class="token punctuation">)</span> <span class="token operator">-</span> 20rem<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">// 图片合组</span></span>
<span class="line"><span class="token selector">.ImgGroup </span><span class="token punctuation">{</span></span>
<span class="line">  <span class="token property">display</span><span class="token punctuation">:</span> flex<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">align-items</span><span class="token punctuation">:</span> center<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">justify-content</span><span class="token punctuation">:</span> flex-start<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">align-content</span><span class="token punctuation">:</span> baseline<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">width</span><span class="token punctuation">:</span> 100%<span class="token punctuation">;</span></span>
<span class="line">  <span class="token selector">figure </span><span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">margin</span><span class="token punctuation">:</span> 2px<span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">// 字体</span></span>
<span class="line"><span class="token atrule"><span class="token rule">@font-face</span></span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token property">font-family</span><span class="token punctuation">:</span> <span class="token string">'mo7_font'</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">src</span><span class="token punctuation">:</span> <span class="token url">url</span><span class="token punctuation">(</span><span class="token string">'/font/mo7_font.ttf'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token selector">.vp-blog-hero-title,</span>
<span class="line">.vp-site-name </span><span class="token punctuation">{</span></span>
<span class="line">  <span class="token property">font-family</span><span class="token punctuation">:</span> <span class="token string">'mo7_font'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">// 回到顶部按钮半透明</span></span>
<span class="line"><span class="token selector">.vp-back-to-top-button </span><span class="token punctuation">{</span></span>
<span class="line">  <span class="token property">opacity</span><span class="token punctuation">:</span> 0.7<span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">// 项目卡片添加阴影</span></span>
<span class="line"><span class="token selector">.vp-project-card </span><span class="token punctuation">{</span></span>
<span class="line">  <span class="token property">box-shadow</span><span class="token punctuation">:</span> 0 2px 6px 2px <span class="token function">var</span><span class="token punctuation">(</span>--vp-c-shadow<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token selector"><span class="token parent important">&amp;</span>:hover </span><span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">box-shadow</span><span class="token punctuation">:</span> 0 1px 3px 1px <span class="token function">var</span><span class="token punctuation">(</span>--vp-c-shadow<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">// 文章分割线变成小汽车</span></span>
<span class="line"><span class="token selector">hr </span><span class="token punctuation">{</span></span>
<span class="line">  <span class="token property">position</span><span class="token punctuation">:</span> relative<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">margin</span><span class="token punctuation">:</span> 0.8rem auto<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">box-sizing</span><span class="token punctuation">:</span> content-box<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">overflow</span><span class="token punctuation">:</span> visible<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">height</span><span class="token punctuation">:</span> 1rem<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">border</span><span class="token punctuation">:</span> none<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">cursor</span><span class="token punctuation">:</span> pointer<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">background</span><span class="token punctuation">:</span> transparent<span class="token punctuation">;</span></span>
<span class="line">  <span class="token selector"><span class="token parent important">&amp;</span>::before </span><span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">position</span><span class="token punctuation">:</span> absolute<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">bottom</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">left</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">z-index</span><span class="token punctuation">:</span> 1<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">content</span><span class="token punctuation">:</span> <span class="token string">''</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">width</span><span class="token punctuation">:</span> <span class="token function">calc</span><span class="token punctuation">(</span>100% <span class="token operator">-</span> 0.25rem<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">height</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">border-width</span><span class="token punctuation">:</span> 0.125rem<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">border-style</span><span class="token punctuation">:</span> dashed<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">opacity</span><span class="token punctuation">:</span> 0.2<span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token selector"><span class="token parent important">&amp;</span>::after </span><span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">position</span><span class="token punctuation">:</span> absolute<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">line-height</span><span class="token punctuation">:</span> 1.6rem<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">top</span><span class="token punctuation">:</span> -0.4rem<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">left</span><span class="token punctuation">:</span> 1%<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">font-family</span><span class="token punctuation">:</span> <span class="token string">'iconfont'</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">content</span><span class="token punctuation">:</span> <span class="token string">'\e66c'</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">z-index</span><span class="token punctuation">:</span> 2<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">font-size</span><span class="token punctuation">:</span> 1.6rem<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">transition</span><span class="token punctuation">:</span> 1s<span class="token punctuation">;</span></span>
<span class="line">    <span class="token property">opacity</span><span class="token punctuation">:</span> 0.2<span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  <span class="token selector"><span class="token parent important">&amp;</span>:hover </span><span class="token punctuation">{</span></span>
<span class="line">    <span class="token selector"><span class="token parent important">&amp;</span>::after </span><span class="token punctuation">{</span></span>
<span class="line">      <span class="token property">opacity</span><span class="token punctuation">:</span> 0.8<span class="token punctuation">;</span></span>
<span class="line">      <span class="token property">left</span><span class="token punctuation">:</span> <span class="token function">calc</span><span class="token punctuation">(</span>99% <span class="token operator">-</span> 1.6rem<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">// 美化标签hover之后的小标签</span></span>
<span class="line"><span class="token selector">[aria-label][data-balloon-pos]:after </span><span class="token punctuation">{</span></span>
<span class="line">  <span class="token property">border-radius</span><span class="token punctuation">:</span> 0.6rem<span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line">[aria-label][data-balloon-pos]<span class="token punctuation">:</span><span class="token property">hover</span><span class="token punctuation">:</span>before<span class="token punctuation">,</span></span>
<span class="line">[aria-label][data-balloon-pos]<span class="token punctuation">:</span><span class="token property">hover</span><span class="token punctuation">:</span>after<span class="token punctuation">,</span></span>
<span class="line">[aria-label][data-balloon-pos][data-balloon-visible]<span class="token punctuation">:</span>before<span class="token punctuation">,</span></span>
<span class="line">[aria-label][data-balloon-pos][data-balloon-visible]<span class="token punctuation">:</span>after<span class="token punctuation">,</span></span>
<span class="line">[aria-label][data-balloon-pos]<span class="token punctuation">:</span><span class="token function">not</span><span class="token punctuation">(</span>[data-balloon-nofocus]<span class="token punctuation">)</span><span class="token punctuation">:</span><span class="token property">focus</span><span class="token punctuation">:</span>before<span class="token punctuation">,</span></span>
<span class="line">[aria-label][data-balloon-pos]<span class="token punctuation">:</span><span class="token function">not</span><span class="token punctuation">(</span>[data-balloon-nofocus]<span class="token punctuation">)</span><span class="token selector">:focus:after </span><span class="token punctuation">{</span></span>
<span class="line">  <span class="token property">opacity</span><span class="token punctuation">:</span> 0.8<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">font-family</span><span class="token punctuation">:</span> none<span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">// 卡片半透明</span></span>
<span class="line"><span class="token keyword">@mixin</span> <span class="token selector">articleLightBg </span><span class="token punctuation">{</span></span>
<span class="line">  <span class="token property"><span class="token variable">$my-alpha</span></span><span class="token punctuation">:</span> 0.6<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">background</span><span class="token punctuation">:</span> <span class="token function">rgba</span><span class="token punctuation">(</span><span class="token property"><span class="token variable">$color</span></span><span class="token punctuation">:</span> #fff<span class="token punctuation">,</span> <span class="token property"><span class="token variable">$alpha</span></span><span class="token punctuation">:</span> <span class="token variable">$my-alpha</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">background-color</span><span class="token punctuation">:</span> <span class="token function">rgba</span><span class="token punctuation">(</span><span class="token property"><span class="token variable">$color</span></span><span class="token punctuation">:</span> #fff<span class="token punctuation">,</span> <span class="token property"><span class="token variable">$alpha</span></span><span class="token punctuation">:</span> <span class="token variable">$my-alpha</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"><span class="token selector">[data-theme='light'] </span><span class="token punctuation">{</span></span>
<span class="line">  <span class="token selector">.theme-container </span><span class="token punctuation">{</span></span>
<span class="line">    <span class="token selector">.vp-page </span><span class="token punctuation">{</span></span>
<span class="line">      <span class="token selector">.vp-blogger-info </span><span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">@include</span> articleLightBg<span class="token punctuation">;</span></span>
<span class="line">      <span class="token punctuation">}</span></span>
<span class="line">      <span class="token selector">.vp-blog-infos </span><span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">@include</span> articleLightBg<span class="token punctuation">;</span></span>
<span class="line">      <span class="token punctuation">}</span></span>
<span class="line">      <span class="token selector">.vp-article-item </span><span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">@include</span> articleLightBg<span class="token punctuation">;</span></span>
<span class="line">      <span class="token punctuation">}</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">    <span class="token selector">.vp-pagination-nav input </span><span class="token punctuation">{</span></span>
<span class="line">      <span class="token keyword">@include</span> articleLightBg<span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">    <span class="token selector">.vp-pagination-button </span><span class="token punctuation">{</span></span>
<span class="line">      <span class="token keyword">@include</span> articleLightBg<span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">    <span class="token selector">.vp-pagination-number div </span><span class="token punctuation">{</span></span>
<span class="line">      <span class="token keyword">@include</span> articleLightBg<span class="token punctuation">;</span></span>
<span class="line">      <span class="token selector"><span class="token parent important">&amp;</span>.active </span><span class="token punctuation">{</span></span>
<span class="line">        <span class="token property">background-color</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--theme-color<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">      <span class="token punctuation">}</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"><span class="token keyword">@mixin</span> <span class="token selector">articleDarkBg </span><span class="token punctuation">{</span></span>
<span class="line">  <span class="token property"><span class="token variable">$my-alpha</span></span><span class="token punctuation">:</span> 0.7<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">background</span><span class="token punctuation">:</span> <span class="token function">rgba</span><span class="token punctuation">(</span><span class="token property"><span class="token variable">$color</span></span><span class="token punctuation">:</span> #000<span class="token punctuation">,</span> <span class="token property"><span class="token variable">$alpha</span></span><span class="token punctuation">:</span> <span class="token variable">$my-alpha</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">background-color</span><span class="token punctuation">:</span> <span class="token function">rgba</span><span class="token punctuation">(</span><span class="token property"><span class="token variable">$color</span></span><span class="token punctuation">:</span> #000<span class="token punctuation">,</span> <span class="token property"><span class="token variable">$alpha</span></span><span class="token punctuation">:</span> <span class="token variable">$my-alpha</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"><span class="token selector">[data-theme='dark'] </span><span class="token punctuation">{</span></span>
<span class="line">  <span class="token selector">.theme-container </span><span class="token punctuation">{</span></span>
<span class="line">    <span class="token selector">.vp-page </span><span class="token punctuation">{</span></span>
<span class="line">      <span class="token selector">.vp-blogger-info </span><span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">@include</span> articleDarkBg<span class="token punctuation">;</span></span>
<span class="line">      <span class="token punctuation">}</span></span>
<span class="line">      <span class="token selector">.vp-blog-infos </span><span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">@include</span> articleDarkBg<span class="token punctuation">;</span></span>
<span class="line">      <span class="token punctuation">}</span></span>
<span class="line">      <span class="token selector">.vp-article-item </span><span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">@include</span> articleDarkBg<span class="token punctuation">;</span></span>
<span class="line">      <span class="token punctuation">}</span></span>
<span class="line">      <span class="token selector">.vp-pagination-nav input </span><span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">@include</span> articleDarkBg<span class="token punctuation">;</span></span>
<span class="line">      <span class="token punctuation">}</span></span>
<span class="line">      <span class="token selector">.vp-pagination-button </span><span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">@include</span> articleDarkBg<span class="token punctuation">;</span></span>
<span class="line">      <span class="token punctuation">}</span></span>
<span class="line">      <span class="token selector">.vp-pagination-number div </span><span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">@include</span> articleDarkBg<span class="token punctuation">;</span></span>
<span class="line">        <span class="token selector"><span class="token parent important">&amp;</span>.active </span><span class="token punctuation">{</span></span>
<span class="line">          <span class="token property">background-color</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--theme-color<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">        <span class="token punctuation">}</span></span>
<span class="line">      <span class="token punctuation">}</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">5.在 md 中使用自定义组件</title>
    <id>https://mo7.cc/misc/vuepress-hope/step_md_components.html</id>
    <link href="https://mo7.cc/misc/vuepress-hope/step_md_components.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>上一个章节讲到的是使用全局组件来对主题和博客进行修改，其实本质上是通过 vue 组件的形式进行了全局的 js 和 css 的引入。和直接 <code>&lt;link href="xxx" /&gt;   &lt;script src="xxx"&gt;</code> 的形式没啥区别。不过使用 vue 组件看起来比较优雅而已。<br>
而且 vue 组件的代码内容一定会经过 vite 的优化，代码的执行效率会更高。</p>
<p>这里讲另外两种自定义组件的使用方式:</p>
<h2>全局注册，Markdown 调用</h2>
<div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> defineClientConfig <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vuepress/client'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token function">defineClientConfig</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span>
<span class="line">  <span class="token comment">// ...</span></span>
<span class="line">  <span class="token function">enhance</span><span class="token punctuation">(</span><span class="token parameter"><span class="token punctuation">{</span> app<span class="token punctuation">,</span> router<span class="token punctuation">,</span> siteData <span class="token punctuation">}</span></span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    app<span class="token punctuation">.</span><span class="token function">component</span><span class="token punctuation">(</span><span class="token string">'MyIcon'</span><span class="token punctuation">,</span> MyIcon<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token comment">// ...</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[
<p>上一个章节讲到的是使用全局组件来对主题和博客进行修改，其实本质上是通过 vue 组件的形式进行了全局的 js 和 css 的引入。和直接 <code>&lt;link href="xxx" /&gt;   &lt;script src="xxx"&gt;</code> 的形式没啥区别。不过使用 vue 组件看起来比较优雅而已。<br>
而且 vue 组件的代码内容一定会经过 vite 的优化，代码的执行效率会更高。</p>
<p>这里讲另外两种自定义组件的使用方式:</p>
<h2>全局注册，Markdown 调用</h2>
<div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> defineClientConfig <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vuepress/client'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token function">defineClientConfig</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span>
<span class="line">  <span class="token comment">// ...</span></span>
<span class="line">  <span class="token function">enhance</span><span class="token punctuation">(</span><span class="token parameter"><span class="token punctuation">{</span> app<span class="token punctuation">,</span> router<span class="token punctuation">,</span> siteData <span class="token punctuation">}</span></span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    app<span class="token punctuation">.</span><span class="token function">component</span><span class="token punctuation">(</span><span class="token string">'MyIcon'</span><span class="token punctuation">,</span> MyIcon<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token comment">// ...</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>然后在 Markdown 文件中直接使用该组件即可。</p>
<div class="language-markdown line-numbers-mode" data-highlighter="prismjs" data-ext="md"><pre><code class="language-markdown"><span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>MyIcon</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>zhanzhang<span class="token punctuation">"</span></span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2>Markdown 局部注册使用</h2>
<p>在 Markdown 中直接使用 vue 语法进行组件的引入和使用。</p>
<div class="language-markdown line-numbers-mode" data-highlighter="prismjs" data-ext="md"><pre><code class="language-markdown"><span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>HomePageUser</span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>HomePageDevelop</span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>HomePageBBS</span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line"></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">setup</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">import "@components/HomePage.scss";</span>
<span class="line">import HomePageUser from "@components/HomePageUser.vue";</span>
<span class="line">import HomePageDevelop from "@components/HomePageDevelop.vue";</span>
<span class="line">import HomePageBBS from "@components/HomePageBBS.vue";</span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>参考文档 ：</p>
<p><a href="https://theme-hope.vuejs.press/zh/guide/component/sfc.html" target="_blank" rel="noopener noreferrer">https://theme-hope.vuejs.press/zh/guide/component/sfc.html</a></p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">6.Klipse 插件的使用</title>
    <id>https://mo7.cc/misc/vuepress-hope/klipse.html</id>
    <link href="https://mo7.cc/misc/vuepress-hope/klipse.html"/>
    <updated>2025-07-04T14:11:31.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<p>Klipse 是一个 JavaScript 插件，用于在技术博客中嵌入交互式代码片段。从技术层面上讲，Klipse 是一小段 JavaScript 代码，用于评估浏览器中的代码片段，并且可以在任何网页上插入。</p>
<p>Github 仓库地址: <a href="https://github.com/viebel/klipse" target="_blank" rel="noopener noreferrer">https://github.com/viebel/klipse</a></p>
</div>]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<p>Klipse 是一个 JavaScript 插件，用于在技术博客中嵌入交互式代码片段。从技术层面上讲，Klipse 是一小段 JavaScript 代码，用于评估浏览器中的代码片段，并且可以在任何网页上插入。</p>
<p>Github 仓库地址: <a href="https://github.com/viebel/klipse" target="_blank" rel="noopener noreferrer">https://github.com/viebel/klipse</a></p>
</div>
<p>该插件在 <code>VuePress</code> 中使用的方式如下:</p>
<h2>第一步： 编写 VuePress 插件</h2>
<details class="hint-container details"><summary>插件源码如下(可直接复制使用)</summary>
<div class="code-block-with-title">
  <div class="code-block-title-bar" data-title=".vuepress/components/KlipseLoad.vue 文件内容">
    <span>.vuepress/components/KlipseLoad.vue 文件内容</span>
  </div>
  <div class="language-vue line-numbers-mode" data-highlighter="prismjs" data-ext="vue"><pre><code class="language-vue"><span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">setup</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>ts<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span><span class="token script"><span class="token language-javascript"></span>
<span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> onMounted<span class="token punctuation">,</span> nextTick <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vue'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">const</span> css_list <span class="token operator">=</span> <span class="token punctuation">[</span></span>
<span class="line">  <span class="token punctuation">{</span></span>
<span class="line">    <span class="token literal-property property">id</span><span class="token operator">:</span> <span class="token string">'klipse_codemirror_css'</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token literal-property property">href</span><span class="token operator">:</span> <span class="token string">'//storage.googleapis.com/app.klipse.tech/css/codemirror.css'</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token punctuation">{</span></span>
<span class="line">    <span class="token literal-property property">id</span><span class="token operator">:</span> <span class="token string">'klipse_prolog_css'</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token literal-property property">href</span><span class="token operator">:</span> <span class="token string">'//storage.googleapis.com/app.klipse.tech/css/prolog.css'</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line"><span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">// 插入 css 文件</span></span>
<span class="line"><span class="token keyword">function</span> <span class="token function">init_klipse_css</span><span class="token punctuation">(</span><span class="token parameter">cssInfo</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">const</span> linkElm <span class="token operator">=</span> window<span class="token punctuation">.</span>document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span>cssInfo<span class="token punctuation">.</span>id<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>linkElm<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">const</span> linkElm <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">createElement</span><span class="token punctuation">(</span><span class="token string">'link'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    linkElm<span class="token punctuation">.</span>type <span class="token operator">=</span> <span class="token string">'text/css'</span><span class="token punctuation">;</span></span>
<span class="line">    linkElm<span class="token punctuation">.</span>rel <span class="token operator">=</span> <span class="token string">'stylesheet'</span><span class="token punctuation">;</span></span>
<span class="line">    linkElm<span class="token punctuation">.</span>href <span class="token operator">=</span> cssInfo<span class="token punctuation">.</span>href<span class="token punctuation">;</span></span>
<span class="line">    linkElm<span class="token punctuation">.</span>id <span class="token operator">=</span> cssInfo<span class="token punctuation">.</span>id<span class="token punctuation">;</span></span>
<span class="line">    window<span class="token punctuation">.</span>document<span class="token punctuation">.</span>body<span class="token punctuation">.</span><span class="token function">appendChild</span><span class="token punctuation">(</span>linkElm<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"><span class="token comment">// 插入 js 文件</span></span>
<span class="line"><span class="token keyword">function</span> <span class="token function">init_klipse_lib</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">var</span> jsElm <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">createElement</span><span class="token punctuation">(</span><span class="token string">'script'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  jsElm<span class="token punctuation">.</span>src <span class="token operator">=</span> <span class="token string">'//storage.googleapis.com/app.klipse.tech/plugin_prod/js/klipse_plugin.min.js?the_version=7.11.2'</span><span class="token punctuation">;</span></span>
<span class="line">  window<span class="token punctuation">.</span>document<span class="token punctuation">.</span>body<span class="token punctuation">.</span><span class="token function">appendChild</span><span class="token punctuation">(</span>jsElm<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">function</span> <span class="token function">Start</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">const</span> <span class="token literal-property property">Win</span><span class="token operator">:</span> any <span class="token operator">=</span> window<span class="token punctuation">;</span></span>
<span class="line">  Win<span class="token punctuation">.</span>klipse_settings <span class="token operator">=</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token literal-property property">codemirror_options_in</span><span class="token operator">:</span> <span class="token punctuation">{</span></span>
<span class="line">      <span class="token literal-property property">lineWrapping</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span></span>
<span class="line">      <span class="token literal-property property">autoCloseBrackets</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token literal-property property">codemirror_options_out</span><span class="token operator">:</span> <span class="token punctuation">{</span></span>
<span class="line">      <span class="token literal-property property">lineWrapping</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token literal-property property">beautify_strings</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token literal-property property">selector_eval_cpp</span><span class="token operator">:</span> <span class="token string">'.language-klipse-cpp'</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token function">init_klipse_lib</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token function">init_klipse_css</span><span class="token punctuation">(</span>css_list<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token function">init_klipse_css</span><span class="token punctuation">(</span>css_list<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token function">onMounted</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token function">nextTick</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token function">Start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>template</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ClientOnly</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>none<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span>Klipse 插件支持<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>ClientOnly</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>template</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>style</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>scss<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span><span class="token style"><span class="token language-css"></span>
<span class="line"><span class="token selector">.klipse-demo pre</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token property">margin</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span></span>
<span class="line">  <span class="token property">padding</span><span class="token punctuation">:</span> 0<span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>style</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>
</div></details>
<p>Github 源码地址:<br>
<a href="https://github.com/mo7cc/blog-source/blob/main/src/.vuepress/components/KlipseLoad.vue" target="_blank" rel="noopener noreferrer">https://github.com/mo7cc/blog-source/blob/main/src/.vuepress/components/KlipseLoad.vue</a></p>
<h2>第二步：在 Markdown 中使用编写好的插件</h2>
<div class="language-markdown line-numbers-mode" data-highlighter="prismjs" data-ext="md"><pre><code class="language-markdown"><span class="line"><span class="token title important"><span class="token punctuation">#</span> Klipse 插件演示</span></span>
<span class="line"></span>
<span class="line"><span class="token title important"><span class="token punctuation">##</span> 最终效果如下</span></span>
<span class="line"></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>klipse-demo<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span></span>
<span class="line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>pre</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>code</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>language-klipse-cpp<span class="token punctuation">"</span></span><span class="token punctuation">&gt;</span></span></span>
<span class="line">      <span class="token title important"><span class="token punctuation">#</span>include &amp;lt;iostream&amp;gt;</span></span>
<span class="line">      using namespace std;</span>
<span class="line">      int main() {</span>
<span class="line">        cout <span class="token entity named-entity" title="<">&amp;lt;</span><span class="token entity named-entity" title="<">&amp;lt;</span> "Hello World!" <span class="token entity named-entity" title="<">&amp;lt;</span><span class="token entity named-entity" title="<">&amp;lt;</span> endl;</span>
<span class="line">        return 0;</span>
<span class="line">      }</span>
<span class="line">    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>code</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>pre</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>KlipseLoad</span> <span class="token punctuation">/&gt;</span></span></span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">setup</span><span class="token punctuation">&gt;</span></span></span>
<span class="line">import KlipseLoad from "@components/KlipseLoad.vue";</span>
<span class="line"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">&gt;</span></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>最终效果如下</h2>
<div class="klipse-demo">
  <pre>    <code class="language-klipse-cpp">
      #include &lt;iostream&gt;
      using namespace std;
      int main() {
        cout &lt;&lt; "Hello World!" &lt;&lt; endl;
        return 0;
      }
    </code>
  </pre>
</div>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">7.搭建评论系统</title>
    <id>https://mo7.cc/misc/vuepress-hope/step_talk.html</id>
    <link href="https://mo7.cc/misc/vuepress-hope/step_talk.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>这里的评论系统使用了</p>
<p><a href="https://waline.js.org" target="_blank" rel="noopener noreferrer">https://waline.js.org</a></p>
<p>其实搭建起来很方便也很容易。跟着文档一步步走就可以了。</p>
<p>我因为有自己的服务器，所以是在自己的服务器上进行搭建的。</p>
<p>对于小白来说，这里面的难点可能在于 <strong>数据库</strong> 和 <strong>Nginx</strong> 部分。</p>
<h2>部署流程</h2>
<h3>创建项目</h3>
]]></summary>
    <content type="html"><![CDATA[
<p>这里的评论系统使用了</p>
<p><a href="https://waline.js.org" target="_blank" rel="noopener noreferrer">https://waline.js.org</a></p>
<p>其实搭建起来很方便也很容易。跟着文档一步步走就可以了。</p>
<p>我因为有自己的服务器，所以是在自己的服务器上进行搭建的。</p>
<p>对于小白来说，这里面的难点可能在于 <strong>数据库</strong> 和 <strong>Nginx</strong> 部分。</p>
<h2>部署流程</h2>
<h3>创建项目</h3>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token comment"># 初始化一个项目</span></span>
<span class="line"><span class="token function">pnpm</span> init <span class="token string">"mo7-waline"</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 安装依赖</span></span>
<span class="line"><span class="token function">pnpm</span> <span class="token function">add</span> @waline/vercel dotenv</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 安装 pm2 进行后台程序管理</span></span>
<span class="line"><span class="token function">npm</span> <span class="token function">install</span> <span class="token parameter variable">-g</span> pm2</span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>编写入口文件</h3>
<p><code>src/main.js</code></p>
<div class="code-block-with-title">
  <div class="code-block-title-bar" data-title="src/main.js">
    <span>src/main.js</span>
  </div>
  <div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line"><span class="token comment">// 引入dotenv</span></span>
<span class="line"><span class="token keyword">const</span> dotenv <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'dotenv'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token comment">// 调用config方法合并.env环境变量</span></span>
<span class="line">dotenv<span class="token punctuation">.</span><span class="token function">config</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">// 引入并执行该文件</span></span>
<span class="line"><span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'@waline/vercel/vanilla.js'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>
</div><h3>配置命令</h3>
<div class="language-json line-numbers-mode" data-highlighter="prismjs" data-ext="json"><pre><code class="language-json"><span class="line"><span class="token punctuation">{</span></span>
<span class="line">  <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"mo7-waline"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"version"</span><span class="token operator">:</span> <span class="token string">"0.0.1"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"description"</span><span class="token operator">:</span> <span class="token string">"waline 的独立部署"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"main"</span><span class="token operator">:</span> <span class="token string">"index.js"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"scripts"</span><span class="token operator">:</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">"start"</span><span class="token operator">:</span> <span class="token string">"node ./src/main.js"</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token property">"deploy"</span><span class="token operator">:</span> <span class="token string">"pm2 start ./src/main.js --name waline"</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token property">"stop"</span><span class="token operator">:</span> <span class="token string">"pm2 delete waline"</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token property">"git"</span><span class="token operator">:</span> <span class="token string">"./.vscode/shell/gitSet.sh"</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token property">"sync"</span><span class="token operator">:</span> <span class="token string">"./.vscode/shell/sync_git.sh"</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"keywords"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"author"</span><span class="token operator">:</span> <span class="token string">"墨七"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"license"</span><span class="token operator">:</span> <span class="token string">"ISC"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"dependencies"</span><span class="token operator">:</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">"@waline/vercel"</span><span class="token operator">:</span> <span class="token string">"^1.31.13"</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token property">"dotenv"</span><span class="token operator">:</span> <span class="token string">"^16.4.5"</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>然后就可以使用如下命令进行快捷操作了。</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token comment"># 启动 服务</span></span>
<span class="line"><span class="token function">pnpm</span> run start</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 部署，用 pm2 启动后台进程</span></span>
<span class="line"><span class="token function">pnpm</span> run deploy</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 停止服务</span></span>
<span class="line"><span class="token function">pnpm</span> run stop</span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>配置环境变量</h3>
<p><code>./.env</code> 文件</p>
<p>相当于对服务的一个设置。</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line"><span class="token comment">#MongoDB 数据库名称</span></span>
<span class="line">MONGO_DB <span class="token operator">=</span> <span class="token string">"WalineTalk"</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">#	MongoDB 服务的用户名</span></span>
<span class="line">MONGO_USER <span class="token operator">=</span> <span class="token string">"mo7"</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">#	MongoDB 服务的密码</span></span>
<span class="line">MONGO_PASSWORD <span class="token operator">=</span> <span class="token string">"*****"</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">#  127.0.0.1	MongoDB 服务的地址，支持数组格式</span></span>
<span class="line">MONGO_HOST <span class="token operator">=</span> <span class="token string">"127.0.0.1"</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 27017	MongoDB 服务的端口，支持数组格式</span></span>
<span class="line">MONGO_PORT <span class="token operator">=</span> <span class="token string">"27017"</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 等级标签</span></span>
<span class="line">LEVELS <span class="token operator">=</span> true</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 基于 IP 的评论发布频率限制，单位为秒。设置为 0 不限制</span></span>
<span class="line"></span>
<span class="line">IPQPS <span class="token operator">=</span> <span class="token number">8</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 当设置为 LOGIN=force 时会要求登录才能评论</span></span>
<span class="line"><span class="token comment"># LOGIN = "force"</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">## 邮箱</span></span>
<span class="line">SMTP_HOST <span class="token operator">=</span> <span class="token string">"smtp.qq.com"</span></span>
<span class="line">SMTP_PORT <span class="token operator">=</span> <span class="token string">"587"</span></span>
<span class="line">SMTP_USER <span class="token operator">=</span> <span class="token string">"meichangliang@qq.com"</span></span>
<span class="line">SMTP_PASS <span class="token operator">=</span> <span class="token string">"iocpznrgmqagbegi"</span></span>
<span class="line">SITE_NAME <span class="token operator">=</span> <span class="token string">"mo7.cc"</span></span>
<span class="line">SITE_URL <span class="token operator">=</span> <span class="token string">"https://mo7.cc"</span></span>
<span class="line">AUTHOR_EMAIL <span class="token operator">=</span> <span class="token string">"mo7@mo7.cc"</span></span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>我这里用的数据库 MongoDB ，实际上评论服务这种的完全可以用 本地 json 来实现，没必要搞什么数据库的。只能说作者对这个插件的期望很高，考虑到了大数量的查询问题。</p>
<p>Github 也不错其实，但是国内 Github 访问会抽风。</p>
<p>如图：<br>
</p>
<h2>Nginx 配置</h2>
<p>这个时候其实服务已经没问题了，但是想要让其它网络的人都能访问，还需要进行 Nginx 的配置。</p>
<div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line">server <span class="token punctuation">{</span></span>
<span class="line">  listen <span class="token number">80</span><span class="token punctuation">;</span></span>
<span class="line">  listen <span class="token number">443</span> ssl http2<span class="token punctuation">;</span></span>
<span class="line">  server_name talk<span class="token punctuation">.</span>mo7<span class="token punctuation">.</span>cc<span class="token punctuation">;</span></span>
<span class="line">  root <span class="token operator">/</span>root<span class="token operator">/</span>talk<span class="token punctuation">.</span>mo7<span class="token punctuation">.</span>cc<span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">  <span class="token keyword">if</span> <span class="token punctuation">(</span>$server_port <span class="token operator">!</span><span class="token operator">~</span> <span class="token number">443</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    rewrite <span class="token operator">^</span><span class="token punctuation">(</span><span class="token operator">/</span><span class="token punctuation">.</span><span class="token operator">*</span><span class="token punctuation">)</span>$ https<span class="token operator">:</span><span class="token operator">/</span><span class="token operator">/</span>$host$1 permanent<span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">  # <span class="token constant">SSL</span> setting</span>
<span class="line">  ssl_certificate <span class="token operator">/</span>etc<span class="token operator">/</span>letsencrypt<span class="token operator">/</span>live<span class="token operator">/</span>talk<span class="token punctuation">.</span>mo7<span class="token punctuation">.</span>cc<span class="token operator">/</span>fullchain<span class="token punctuation">.</span>pem<span class="token punctuation">;</span></span>
<span class="line">  ssl_certificate_key <span class="token operator">/</span>etc<span class="token operator">/</span>letsencrypt<span class="token operator">/</span>live<span class="token operator">/</span>talk<span class="token punctuation">.</span>mo7<span class="token punctuation">.</span>cc<span class="token operator">/</span>privkey<span class="token punctuation">.</span>pem<span class="token punctuation">;</span></span>
<span class="line">  ssl_protocols TLSv1<span class="token punctuation">.</span><span class="token number">1</span> TLSv1<span class="token punctuation">.</span><span class="token number">2</span> TLSv1<span class="token punctuation">.</span><span class="token number">3</span><span class="token punctuation">;</span></span>
<span class="line">  ssl_ciphers <span class="token constant">EECDH</span><span class="token operator">+</span><span class="token constant">CHACHA20</span><span class="token operator">:</span><span class="token constant">EECDH</span><span class="token operator">+</span><span class="token constant">CHACHA20</span><span class="token operator">-</span>draft<span class="token operator">:</span><span class="token constant">EECDH</span><span class="token operator">+</span><span class="token constant">AES128</span><span class="token operator">:</span><span class="token constant">RSA</span><span class="token operator">+</span><span class="token constant">AES128</span><span class="token operator">:</span><span class="token constant">EECDH</span><span class="token operator">+</span><span class="token constant">AES256</span><span class="token operator">:</span><span class="token constant">RSA</span><span class="token operator">+</span><span class="token constant">AES256</span><span class="token operator">:</span><span class="token constant">EECDH</span><span class="token operator">+</span>3DES<span class="token operator">:</span><span class="token constant">RSA</span><span class="token operator">+</span>3DES<span class="token operator">:</span><span class="token operator">!</span><span class="token constant">MD5</span><span class="token punctuation">;</span></span>
<span class="line">  ssl_prefer_server_ciphers on<span class="token punctuation">;</span></span>
<span class="line">  ssl_session_cache shared<span class="token operator">:</span><span class="token constant">SSL</span><span class="token operator">:</span>10m<span class="token punctuation">;</span></span>
<span class="line">  ssl_session_timeout 10m<span class="token punctuation">;</span></span>
<span class="line">  add_header Strict<span class="token operator">-</span>Transport<span class="token operator">-</span>Security <span class="token string">"max-age=31536000"</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">  # proxy to <span class="token number">8360</span></span>
<span class="line">  location <span class="token operator">/</span> <span class="token punctuation">{</span></span>
<span class="line">    proxy_pass http<span class="token operator">:</span><span class="token operator">/</span><span class="token operator">/</span><span class="token number">127.0</span><span class="token number">.0</span><span class="token number">.1</span><span class="token operator">:</span><span class="token number">8360</span><span class="token punctuation">;</span></span>
<span class="line">    proxy_set_header Host $host<span class="token punctuation">;</span></span>
<span class="line">    proxy_set_header <span class="token constant">X</span><span class="token operator">-</span>Real<span class="token operator">-</span><span class="token constant">IP</span> $remote_addr<span class="token punctuation">;</span></span>
<span class="line">    proxy_set_header <span class="token constant">X</span><span class="token operator">-</span>Forwarded<span class="token operator">-</span>For $proxy_add_x_forwarded_for<span class="token punctuation">;</span></span>
<span class="line">    proxy_set_header <span class="token constant">X</span><span class="token operator">-</span>Forwarded<span class="token operator">-</span>Proto $scheme<span class="token punctuation">;</span></span>
<span class="line">    proxy_set_header <span class="token constant">REMOTE</span><span class="token operator">-</span><span class="token constant">HOST</span> $remote_addr<span class="token punctuation">;</span></span>
<span class="line">    add_header <span class="token constant">X</span><span class="token operator">-</span>Cache $upstream_cache_status<span class="token punctuation">;</span></span>
<span class="line">    # cache</span>
<span class="line">    add_header Cache<span class="token operator">-</span>Control no<span class="token operator">-</span>cache<span class="token punctuation">;</span></span>
<span class="line">    expires 12h<span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>我这里 专门配置了 域名 <code>talk.mo7.cc</code> 以及 ssl 证书。</p>
<h2>在 vuepress-hope 中使用</h2>
<p><code>src/.vuepress/theme.ts</code></p>
<div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> hopeTheme <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vuepress-theme-hope'</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token function">hopeTheme</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span>
<span class="line">  <span class="token comment">// ...</span></span>
<span class="line">  <span class="token literal-property property">plugins</span><span class="token operator">:</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token comment">// ...</span></span>
<span class="line">    <span class="token literal-property property">comment</span><span class="token operator">:</span> <span class="token punctuation">{</span></span>
<span class="line">      <span class="token literal-property property">provider</span><span class="token operator">:</span> <span class="token string">'Waline'</span><span class="token punctuation">,</span></span>
<span class="line">      <span class="token literal-property property">serverURL</span><span class="token operator">:</span> <span class="token string">'https://talk.mo7.cc'</span><span class="token punctuation">,</span></span>
<span class="line">      <span class="token literal-property property">copyright</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span></span>
<span class="line">      <span class="token literal-property property">reaction</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token comment">// ...</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token comment">// ...</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>你没看错！使用的时候只需要填写 <code>https://talk.mo7.cc</code> 就可以了！ 不需要任何令牌和密码！你完全不需要部署过程是什么样的！</p>
<p>也就是说，如果你信任我的话，也可以直接在自己的 博客 配置文件这么填写，评论服务一样可以生效。只不过评论时的邮件和数据全都会存放在我这里。哪天一不开心我也可以关停评论服务。</p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">8.自定义图标和导航栏</title>
    <id>https://mo7.cc/misc/vuepress-hope/step_icon_nav.html</id>
    <link href="https://mo7.cc/misc/vuepress-hope/step_icon_nav.html"/>
    <updated>2025-07-04T14:11:31.000Z</updated>
    <summary type="html"><![CDATA[
<p>这个篇章会讲解如何自定义自己的图标</p>
<p>这里我们会用到一个网站：<br>
<a href="https://www.iconfont.cn/" target="_blank" rel="noopener noreferrer">https://www.iconfont.cn/</a></p>
<p>如下图所示：</p>
<figure><figcaption>iconfont 图示</figcaption></figure>
<p>你可以挑选自己喜欢的图标并命名加入到你的项目中去，然后你可以获得 例如:<br>
<code>icon-git</code><br>
<code>icon-vscode</code><br>
<code>icon-basic</code></p>]]></summary>
    <content type="html"><![CDATA[
<p>这个篇章会讲解如何自定义自己的图标</p>
<p>这里我们会用到一个网站：<br>
<a href="https://www.iconfont.cn/" target="_blank" rel="noopener noreferrer">https://www.iconfont.cn/</a></p>
<p>如下图所示：</p>
<figure><figcaption>iconfont 图示</figcaption></figure>
<p>你可以挑选自己喜欢的图标并命名加入到你的项目中去，然后你可以获得 例如:<br>
<code>icon-git</code><br>
<code>icon-vscode</code><br>
<code>icon-basic</code></p>
<p>这样的图标名称 ，和一个 css 文件网络地址。</p>
<h2>使用方式</h2>
<p><code>src/.vuepress/theme.ts</code>文件中填入这个地址</p>
<div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line"><span class="token keyword">import</span> <span class="token punctuation">{</span> hopeTheme <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'vuepress-theme-hope'</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token function">hopeTheme</span><span class="token punctuation">(</span><span class="token punctuation">{</span></span>
<span class="line">  <span class="token comment">// ...</span></span>
<span class="line">  <span class="token literal-property property">iconAssets</span><span class="token operator">:</span> <span class="token string">'//at.alicdn.com/t/c/font_3855310_agk3ojvaptw.css'</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token comment">// ...</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>然后就可以在项目中使用它们了:<br>
</p>
<p>但是记住，没有前面的 <code>icon-</code> 部分，只有名字部分。</p>
<h2>导航栏</h2>
<p>这部分我觉得可以不用多讲，官方文档写的很清楚了。</p>
<p><a href="https://theme-hope.vuejs.press/zh/guide/layout/navbar.html" target="_blank" rel="noopener noreferrer">https://theme-hope.vuejs.press/zh/guide/layout/navbar.html</a></p>
<p><a href="https://theme-hope.vuejs.press/zh/guide/layout/sidebar.html" target="_blank" rel="noopener noreferrer">https://theme-hope.vuejs.press/zh/guide/layout/sidebar.html</a></p>
<p>这里是我的导航栏源码:</p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">9.部署和发布</title>
    <id>https://mo7.cc/misc/vuepress-hope/step_deploy.html</id>
    <link href="https://mo7.cc/misc/vuepress-hope/step_deploy.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>因为编译结果是一堆纯静态的 html 文件 和 js ，没有任何动态服务器生成的内容。</p>
<p>所以，一般的 html 文件如何部署，博客就是如何部署的。</p>
<p>官方文档<br>
<a href="https://theme-hope.vuejs.press/zh/get-started/deploy.html" target="_blank" rel="noopener noreferrer">https://theme-hope.vuejs.press/zh/get-started/deploy.html</a></p>
<p>基本原理就是：</p>
<p><code>pnpm run build</code> 之后</p>]]></summary>
    <content type="html"><![CDATA[
<p>因为编译结果是一堆纯静态的 html 文件 和 js ，没有任何动态服务器生成的内容。</p>
<p>所以，一般的 html 文件如何部署，博客就是如何部署的。</p>
<p>官方文档<br>
<a href="https://theme-hope.vuejs.press/zh/get-started/deploy.html" target="_blank" rel="noopener noreferrer">https://theme-hope.vuejs.press/zh/get-started/deploy.html</a></p>
<p>基本原理就是：</p>
<p><code>pnpm run build</code> 之后</p>
<p>会生成 <code>dist</code> ，目录。</p>
<p>然后你的域名访问 <code>dist</code> 目录的文件内容，然后浏览器加载并解析文件内容并渲染呈现。</p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">本博客搭建指南</title>
    <id>https://mo7.cc/misc/vuepress-hope/</id>
    <link href="https://mo7.cc/misc/vuepress-hope/"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">本网站搭建指南</p>
<p>记录本站搭建的全过程，适合小白阅读。</p>
</div>
<hr>
]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">本网站搭建指南</p>
<p>记录本站搭建的全过程，适合小白阅读。</p>
</div>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">1.科学上网与本地代理教程</title>
    <id>https://mo7.cc/coder/operations/proxy_v2rayn.html</id>
    <link href="https://mo7.cc/coder/operations/proxy_v2rayn.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>为了学习目的，诸如国外的一些优秀网站访问速度会很慢，甚至是无法访问，导致一些依赖的下载和软件的更新无法完成，资料都无法查阅。<br>
这个时候可能需要一些使用一些代理手段。</p>
<p>我之前使用过的方案是 <a href="https://cn.bing.com/search?q=ByWave" target="_blank" rel="noopener noreferrer">ByWave</a> ，实测还蛮好用的，一年也就一百来块挺实惠。<br>
</p>
<blockquote>
<p>点进去之后，直接注册/登录，然后购买对应的服务，然后下载安装即可。</p>
</blockquote>]]></summary>
    <content type="html"><![CDATA[
<p>为了学习目的，诸如国外的一些优秀网站访问速度会很慢，甚至是无法访问，导致一些依赖的下载和软件的更新无法完成，资料都无法查阅。<br>
这个时候可能需要一些使用一些代理手段。</p>
<p>我之前使用过的方案是 <a href="https://cn.bing.com/search?q=ByWave" target="_blank" rel="noopener noreferrer">ByWave</a> ，实测还蛮好用的，一年也就一百来块挺实惠。<br>
</p>
<blockquote>
<p>点进去之后，直接注册/登录，然后购买对应的服务，然后下载安装即可。</p>
</blockquote>
<h2>自建代理服务的方案</h2>
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>以下方案可能需要你对 <code>Linux 运维</code> 以及 <code>云服务器的采购</code> 具有一定的熟练度。</p>
</div>
<ol>
<li>
<p>准备一台 <strong>海外服务器</strong>， 假设名为:<code>服务器A</code> (假设 IP 为:<code>456.456.456.4567</code>) 并设置安全组开放 <code>10086</code> 端口。</p>
</li>
<li>
<p>然后在 <strong><code>服务器A</code></strong> 上搭建搭建 <a href="https://github.com/233boy/v2ray" target="_blank" rel="noopener noreferrer">v2ray</a> 服务，并设置端口为 <code>10086</code> 。如果步骤没问题，你会获得一些配置参数和 v2ray 协议链接。</p>
</li>
<li>
<p>然后下载一个 <a href="https://github.com/v2rayU/v2rayU" target="_blank" rel="noopener noreferrer">代理客户端</a> ，并把协议链接录入测试 <code>456.456.456.4567:10086</code> 的代理服务是否可用。</p>
</li>
</ol>
<details class="hint-container details"><summary>详情</summary>
<p>亲测，这里服务器的采购可以使用 <a href="https://www.aliyun.com/" target="_blank" rel="noopener noreferrer">阿里云</a> 等国内厂商没有问题。但是依然推荐一些国外厂商的云主机，比如 <a href="https://www.vpsor.cn" target="_blank" rel="noopener noreferrer">硅云</a>。<br>
然后服务器地点一般选择 香港、新加坡 延迟会比较低。</p>
<p>代理客户端的选择后文有相关说明。</p>
</details>
<h2>保护你的代理服务器</h2>
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>如果你已经自建代理服务并用起来了，但是别开心的太早，因为<code>456.456.456.4567</code>的 IP 可能过几天就会被<code>GFW</code>扫描并封禁。<br>
虽然你可以更换 IP ，但是这毕竟很麻烦，而且并不安全，而且更换 IP 会产生一定的费用。<br>
这个时候你需要采用如下做法来保护你的海外服务器以及 IP。</p>
<blockquote>
<p>需要对 Nginx 有一定的熟练度。</p>
</blockquote>
</div>
<ol start="4">
<li>再准备一台国内的服务器，假设名为:<strong><code>服务器B</code></strong> (假设 IP 为:<code>123.123.123.1234</code>) 并设置安全组开放 <code>10809</code> 端口。</li>
<li>在 <strong><code>服务器B</code></strong> 中安装 Nginx 并添加如下配置:</li>
</ol>
<div class="language-javascript line-numbers-mode" data-highlighter="prismjs" data-ext="js"><pre><code class="language-javascript"><span class="line">stream <span class="token punctuation">{</span></span>
<span class="line">  upstream v2ray <span class="token punctuation">{</span></span>
<span class="line">    server <span class="token number">456.456</span><span class="token number">.456</span><span class="token number">.4567</span><span class="token operator">:</span><span class="token number">10086</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line">  server <span class="token punctuation">{</span></span>
<span class="line">    listen <span class="token number">10809</span><span class="token punctuation">;</span></span>
<span class="line">    proxy_pass v2ray<span class="token punctuation">;</span></span>
<span class="line">    ssl_preread on<span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><details class="hint-container details"><summary>详情</summary>
<p>这一步的意思是: 在 <strong>国内<code>服务器B</code></strong> 中来自 <code>10809</code> 端口的请求将全部转发给 <strong>国外</strong> <code>服务器 A</code> 的<code>10086</code> 端口。</p>
</details>
<ol start="6">
<li>打开<a href="https://github.com/v2rayU/v2rayU" target="_blank" rel="noopener noreferrer">代理客户端</a>的设置界面，将 <code>456.456.456.4567:10086</code> 代理服务修改为 <code>123.123.123.1234:10809</code>。然后测试代理服务是否可用。</li>
</ol>
<details class="hint-container details"><summary>详情</summary>
<p>这一步的意思是，在其它设置不变的情况下，将原本的 <code>服务器A</code> 的 地址和端口换成 <code>服务器B</code> 的。</p>
<p>到这一步之后，你每次使用代理客户端时，实际上全都是在请求国内的服务器，这时<code>GFW</code>的扫描不会发觉任何异常，也无法封禁国内 IP。</p>
</details>
<ol start="7">
<li>修改 <strong><code>服务器A</code></strong> 的安全组，让 <code>10086</code> 端口只允许 ip 为 <code>123.123.123.1234</code> 的机器访问。</li>
</ol>
<details class="hint-container details"><summary>详情</summary>
<p>到这一步之后 <code>GFW</code> 扫描 <strong><code>服务器A</code></strong> 就不会发现任何异常，毕竟这个端口的安全组会阻拦 <code>GFW</code> 的访问，表面看它就是一个平平无奇的服务器而已。<br>
然后国内的 <strong><code>服务器B</code></strong> 本身就在国内，不受 <code>GFW</code> 约束。</p>
<p>日常的代理客户端，只会被抓到它在请求国内服务器，则 IP 地址安全。</p>
<blockquote>
<p>当然，两台服务的成本确实会有点点高，实测这种方案最为安全和稳定。</p>
</blockquote>
</details>
<h2>本地代理客户端的选择</h2>
<p><a href="https://github.com/v2rayU/v2rayU" target="_blank" rel="noopener noreferrer">https://github.com/v2rayU/v2rayU</a></p>
<p><strong>Windows:</strong><br>
<a href="https://github.com/2dust/v2rayn/releases" target="_blank" rel="noopener noreferrer">https://github.com/2dust/v2rayn/releases</a></p>
<details class="hint-container details"><summary>详情</summary>
<p>v2rayN 的使安装方法是: 下载 <code>v2rayN-With-Core.zip</code> 和 <code>v2rayN.zip</code> 并解压，然后将前者目录中的内容覆盖替换到后者目录中，然后就可以双击 <code>v2rayN.exe</code> 文件进行使用了。</p>
</details>
<p><strong>安卓:</strong><br>
<a href="https://github.com/2dust/v2rayNG/releases" target="_blank" rel="noopener noreferrer">https://github.com/2dust/v2rayNG/releases</a></p>
<details class="hint-container details"><summary>详情</summary>
<p>下载对应的 <code>apk</code> 文件然后安装即可。如果打不开或安装失败就多换几个安装包试试。</p>
</details>
<p><strong>macOS:</strong><br>
<a href="https://github.com/yanue/V2rayU/releases" target="_blank" rel="noopener noreferrer">https://github.com/yanue/V2rayU/releases</a></p>
<details class="hint-container details"><summary>详情</summary>
<p>下载对应的 <code>.dmg</code> 文件安装即可。如果打不开或安装失败就多换几个安装包试试。</p>
</details>
<h2>设置命令行代理</h2>
<p>第一步，如下图所示，打开代理软件(这里用的是 V2rayU)，设置好 http 端口，确认系统代理已生效</p>
<figure><figcaption>确认 macOS 系统代理已生效</figcaption></figure>
<p>第二步，设置如下环境变量。</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token comment">#  ~/.zshenv 或 ~/.bashrc 文件中:</span></span>
<span class="line"><span class="token builtin class-name">export</span> <span class="token assign-left variable">http_proxy</span><span class="token operator">=</span>http://127.0.0.1:10809</span>
<span class="line"><span class="token builtin class-name">export</span> <span class="token assign-left variable">https_proxy</span><span class="token operator">=</span>http://127.0.0.1:10809</span>
<span class="line"><span class="token builtin class-name">export</span> <span class="token assign-left variable">ALL_PROXY</span><span class="token operator">=</span>http://127.0.0.1:10809</span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="hint-container tip">
<p class="hint-container-title">提示</p>
<p>Windows，Linux，WSL，MacOS 基本同理</p>
</div>
<div class="language-powershell line-numbers-mode" data-highlighter="prismjs" data-ext="powershell"><pre><code class="language-powershell"><span class="line"><span class="token comment"># Powershell 是这么设置的</span></span>
<span class="line"><span class="token variable">$env</span>:ALL_PROXY=<span class="token string">"http://127.0.0.1:10809"</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">## 全局永久生效</span></span>
<span class="line"><span class="token comment">#  我的电脑-&gt;属性-&gt;更改设置-&gt;高级-&gt;环境变量，添加环境变量</span></span>
<span class="line"><span class="token comment">#  变量名  ALL_PROXY</span></span>
<span class="line"><span class="token comment">#  变量值  http://127.0.0.1:10809</span></span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><figure><figcaption>PowerShell 命令行访问 Google</figcaption></figure>
<figure><figcaption>Windows 下 v2rayN 使用截图</figcaption></figure>
<figure><figcaption>检查Windows 系统代理是否顺利开启</figcaption></figure>
<figure><figcaption>安卓系统使用 v2rayNG 访问 google play 和 <a href="http://google.com" target="_blank" rel="noopener noreferrer">google.com</a></figcaption></figure>
<h2>v2rayU 的卸载</h2>
<p>在 macOS 下，正常移入回收站是无法干净的删除 v2rayU 的，还需要使用如下命令彻底删除:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token builtin class-name">cd</span> ~/Library/LaunchAgents/</span>
<span class="line">/bin/launchctl remove yanue.v2rayu.v2ray-core</span>
<span class="line">/bin/launchctl remove yanue.v2rayu.http</span>
<span class="line"></span>
<span class="line"><span class="token function">rm</span> <span class="token parameter variable">-f</span> ~/Library/LaunchAgents/yanue.v2rayu.v2ray-core.plist</span>
<span class="line"><span class="token function">rm</span> <span class="token parameter variable">-f</span> ~/Library/Preferences/net.yanue.V2rayU.plist</span>
<span class="line"><span class="token function">rm</span> <span class="token parameter variable">-f</span> ~/Library/Logs/V2rayU.log</span>
<span class="line"></span>
<span class="line"><span class="token function">rm</span> <span class="token parameter variable">-fr</span> ~/.V2rayU/</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">2.WSL 子系统的介绍与安装</title>
    <id>https://mo7.cc/coder/operations/wsl2_ready.html</id>
    <link href="https://mo7.cc/coder/operations/wsl2_ready.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>官方说明：<br>
<a href="https://learn.microsoft.com/zh-cn/windows/wsl/about" target="_blank" rel="noopener noreferrer">https://learn.microsoft.com/zh-cn/windows/wsl/about</a></p>
<h2>为何会需要 WSL ？</h2>
<p>一般的程序员都会拥有多台电脑，一台 Mac 笔记本 ，一台 Windows，上班 Mac，下班 Windows。<br>
敲代码 Mac，打游戏 Windows，甚至可能还有一款 Windows 或 Linux 系统的笔记本。<br>
除此之外，还会有多台远程的服务器使用 Linux 系统。</p>]]></summary>
    <content type="html"><![CDATA[
<p>官方说明：<br>
<a href="https://learn.microsoft.com/zh-cn/windows/wsl/about" target="_blank" rel="noopener noreferrer">https://learn.microsoft.com/zh-cn/windows/wsl/about</a></p>
<h2>为何会需要 WSL ？</h2>
<p>一般的程序员都会拥有多台电脑，一台 Mac 笔记本 ，一台 Windows，上班 Mac，下班 Windows。<br>
敲代码 Mac，打游戏 Windows，甚至可能还有一款 Windows 或 Linux 系统的笔记本。<br>
除此之外，还会有多台远程的服务器使用 Linux 系统。</p>
<p>然后，大多数时候的工作都需要使用命令行。 macOS 和 Linux 大多数命令基本一致，编写好的一些 bash 脚本基本上也是可以通用的。唯独 Windows 比较割裂。</p>
<p>众所周知 <code>PowerShell</code> 很好用，但是没人愿意用。</p>
<p>还有另外一个原因，服务器使用的是 Linux，本地编写的软件用 Windows ，到了服务器结果发现编译失败？这个问题排查起来就很头疼了。</p>
<p>如果存在一种方案，可以在 Windows 下使用 Linux，那岂不是完美? 同一台机器，既可以打游戏，又能写代码，还能用来学习 Linux，还能和服务器拥有一模一样的开发环境！</p>
<p>于是， WSL 诞生了！</p>
<blockquote>
<p>目前已经是 WSL2 了。</p>
</blockquote>
<h2>安装 WSL 子系统</h2>
<p>微软官方安装文档：<br>
<a href="https://learn.microsoft.com/zh-cn/windows/wsl/install" target="_blank" rel="noopener noreferrer">https://learn.microsoft.com/zh-cn/windows/wsl/install</a></p>
<p>当然，官方的安装文档略显复杂，我们这里将会简化这个步骤。</p>
<blockquote>
<p>当然，以下步骤需要将 Windows 系统更新为最新版本。</p>
</blockquote>
<h3>第一步 ：启用 Linux 子系统</h3>
<figure><figcaption>打开功能 并勾选 Linux 子系统</figcaption></figure>
<h3>第二步骤：打开 <code>Microsoft Store</code> 并搜索 <code>Linux</code></h3>
<p>打开 <code>Microsoft Store</code> 并搜索 <code>Linux</code>，然后安装。</p>
<figure><figcaption>安装WSL</figcaption></figure>
<p>简单来说就是:</p>
<ol>
<li>找到并打开 <code>Microsoft Store</code></li>
<li>搜索 Linux，然后找到自己喜欢的 发行版 并安装</li>
<li>安装完成后打开该发行版，然后按照命令行提示操作就行了</li>
</ol>
<blockquote>
<p>如果是第一次安装,可能还会提示需要下载一个核心包，但也是无脑下一步就好了。<br>
然后可能还需要你设置个密码啥的</p>
</blockquote>
<p>可能还需要安装的程序:<br>
<a href="https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi" target="_blank" rel="noopener noreferrer">适用于 x64 计算机的 WSL2 Linux 内核更新包</a></p>
<h2>基本的一些设置</h2>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token comment">## 打开 Powershell 输入</span></span>
<span class="line">wsl <span class="token parameter variable">-l</span> <span class="token parameter variable">-v</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">## 会显示如下信息</span></span>
<span class="line">  NAME      STATE           VERSION</span>
<span class="line">* Debian    Running         <span class="token number">2</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">## 输入以下指令默认使用 root 身份登录 Debian</span></span>
<span class="line">Debian config --default-user root</span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span class="token comment">## 将 wsl 关机</span></span>
<span class="line">wsl <span class="token parameter variable">--shutdown</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">## 输入以下指令可以用 wsl 进入当前目录</span></span>
<span class="line">wsl</span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>效果如图:</p>
<figure><figcaption>wsl基本设置</figcaption></figure>
<blockquote>
<p>到了这一步之后，就可以当做普通的 <code>Linux Debian</code> 去使用了。</p>
</blockquote>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">3.WSL 配置系统代理</title>
    <id>https://mo7.cc/coder/operations/wsl2_proxy.html</id>
    <link href="https://mo7.cc/coder/operations/wsl2_proxy.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>一般情况下，WSL2 的 IP 地址每次启动时都会改变，如果想要在 wsl2 中使用 Windows 系统的代理来进行<code>科学上网</code>，可以使用如下代码。</p>
<p>进入 WSL 在 <code>~/.bashrc</code> 文件中添加如下指令</p>
<div class="code-block-with-title">
  <div class="code-block-title-bar" data-title="~/.bashrc">
    <span>~/.bashrc</span>
  </div>
  <div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token assign-left variable">host_ip</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span><span class="token function">cat</span> /etc/resolv.conf <span class="token operator">|</span> <span class="token function">grep</span> <span class="token string">"nameserver"</span> <span class="token operator">|</span> <span class="token function">cut</span> <span class="token parameter variable">-f</span> <span class="token number">2</span> <span class="token parameter variable">-d</span> <span class="token string">" "</span><span class="token variable">)</span></span></span>
<span class="line"><span class="token builtin class-name">export</span> <span class="token assign-left variable">ALL_PROXY</span><span class="token operator">=</span><span class="token string">"http://<span class="token variable">$host_ip</span>:10809"</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div>
</div>]]></summary>
    <content type="html"><![CDATA[
<p>一般情况下，WSL2 的 IP 地址每次启动时都会改变，如果想要在 wsl2 中使用 Windows 系统的代理来进行<code>科学上网</code>，可以使用如下代码。</p>
<p>进入 WSL 在 <code>~/.bashrc</code> 文件中添加如下指令</p>
<div class="code-block-with-title">
  <div class="code-block-title-bar" data-title="~/.bashrc">
    <span>~/.bashrc</span>
  </div>
  <div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token assign-left variable">host_ip</span><span class="token operator">=</span><span class="token variable"><span class="token variable">$(</span><span class="token function">cat</span> /etc/resolv.conf <span class="token operator">|</span> <span class="token function">grep</span> <span class="token string">"nameserver"</span> <span class="token operator">|</span> <span class="token function">cut</span> <span class="token parameter variable">-f</span> <span class="token number">2</span> <span class="token parameter variable">-d</span> <span class="token string">" "</span><span class="token variable">)</span></span></span>
<span class="line"><span class="token builtin class-name">export</span> <span class="token assign-left variable">ALL_PROXY</span><span class="token operator">=</span><span class="token string">"http://<span class="token variable">$host_ip</span>:10809"</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div>
</div><div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<p>这里的原理就是:<br>
<code>/etc/resolv.conf</code> 文件中始终会更新当前 <code>WSL2</code> 在 <code>Windows</code> 系统中的局域网 IP，所以就写一行指令动态获取该 IP。</p>
<p>这里的 <code>:10809</code> 是 windows 的系统代理端口</p>
</div>
<p>效果如下：</p>
<div class="hint-container warning">
<p class="hint-container-title">注意</p>
<p>本地代理客户端必须要勾选 <code>允许来自局域网的连接</code>，也就是说，如果关闭代理客户端，<code>WSL2</code> 就等于处在断网状态。</p>
</div>
<figure><figcaption>WSL代理设置</figcaption></figure>
<p>简单来说是以下几步</p>
<ol>
<li>打开本地的代理工具，设置好 windows 端口如 10809</li>
<li>在 wsl 中设置好动态的 ip 脚本</li>
<li>查看 Windows 的系统代理是否 OK</li>
<li>在 WSL 中测试一下是否可以访问 <a href="http://google.com" target="_blank" rel="noopener noreferrer">google.com</a></li>
<li>如果不行就试着重新安装 <code>WSL</code> 或者重启 windows 系统</li>
</ol>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">4.ssh 跳板机</title>
    <id>https://mo7.cc/coder/operations/ssh_jump_host.html</id>
    <link href="https://mo7.cc/coder/operations/ssh_jump_host.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>前面讲过 <a href="/misc/proxy_wall_ready.html" target="_blank">科学上网与本地代理</a>，但是那只是在配置 <code>http_proxy</code> ，只适用于 <code>http</code> 请求。</p>
<p><code>http</code> 请求并非网络的全部，有的时候可能还会用到 <code>ssh 协议</code>，比如 Github，但是 Github 的访问又不那么流畅，怎么办呢？</p>
<h2>什么是 <code>SSH</code></h2>
<p>什么是 SSH：<br>
<a href="https://info.support.huawei.com/info-finder/encyclopedia/zh/SSH.html" target="_blank" rel="noopener noreferrer">https://info.support.huawei.com/info-finder/encyclopedia/zh/SSH.html</a></p>]]></summary>
    <content type="html"><![CDATA[
<p>前面讲过 <a href="/misc/proxy_wall_ready.html" target="_blank">科学上网与本地代理</a>，但是那只是在配置 <code>http_proxy</code> ，只适用于 <code>http</code> 请求。</p>
<p><code>http</code> 请求并非网络的全部，有的时候可能还会用到 <code>ssh 协议</code>，比如 Github，但是 Github 的访问又不那么流畅，怎么办呢？</p>
<h2>什么是 <code>SSH</code></h2>
<p>什么是 SSH：<br>
<a href="https://info.support.huawei.com/info-finder/encyclopedia/zh/SSH.html" target="_blank" rel="noopener noreferrer">https://info.support.huawei.com/info-finder/encyclopedia/zh/SSH.html</a></p>
<h2>什么是 <code>SSH跳板机</code></h2>
<p>在公司开发中，为了安全起见，生产环境跟开发环境是相互隔离开来的。也就是说在开发环境网络中无法直接 ssh 登录到生产环境的机器， 如果需要登录生产环境的机器，通常会需要借助跳板机，先登录到跳板机，然后通过跳板机登录到生产环境。</p>
<ul>
<li>大致的过程如下面的图示：</li>
</ul>
<div class="language-txt line-numbers-mode" data-highlighter="prismjs" data-ext="txt"><pre><code class="language-txt"><span class="line">+</span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"></div></div>]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">运维</title>
    <id>https://mo7.cc/coder/operations/</id>
    <link href="https://mo7.cc/coder/operations/"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<p>服务器和电脑系统运维工作的标准英文称谓是 ​Operations。</p>
</div>
<hr>
]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<p>服务器和电脑系统运维工作的标准英文称谓是 ​Operations。</p>
</div>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">1.安装与基本设置</title>
    <id>https://mo7.cc/bookmark/tools/vscode/vscode_ready.html</id>
    <link href="https://mo7.cc/bookmark/tools/vscode/vscode_ready.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<h2>安装流程</h2>
<p>可以参考这篇文章：<br>
<a href="https://juejin.cn/post/7037449594900316173" target="_blank" rel="noopener noreferrer">Visual Studio Code 入门教程</a></p>
<h2>基本设置</h2>
<p>初次使用建议点开左下角设置浏览一下设置项都有哪些。</p>
<p>右键侧边栏可以控制显示哪些选项。勾选账户。<br>
然后登录你的 Github 或者 Microsoft 账户，这样就可以在多台设备中同步你的设置以及插件了。</p>
<figure><figcaption>显示账户选项，然后登录Github</figcaption></figure>]]></summary>
    <content type="html"><![CDATA[
<h2>安装流程</h2>
<p>可以参考这篇文章：<br>
<a href="https://juejin.cn/post/7037449594900316173" target="_blank" rel="noopener noreferrer">Visual Studio Code 入门教程</a></p>
<h2>基本设置</h2>
<p>初次使用建议点开左下角设置浏览一下设置项都有哪些。</p>
<p>右键侧边栏可以控制显示哪些选项。勾选账户。<br>
然后登录你的 Github 或者 Microsoft 账户，这样就可以在多台设备中同步你的设置以及插件了。</p>
<figure><figcaption>显示账户选项，然后登录Github</figcaption></figure>
<h2>一些基本的设置项</h2>
<figure><figcaption>打开设置界面，右上角可以打开 json 格式的配置文件 </figcaption></figure>
<figure><figcaption>鼠标移动到对应的设置项会显示说明</figcaption></figure>
<p>下面是我个人的一些设置项</p>
<div class="language-json line-numbers-mode" data-highlighter="prismjs" data-ext="json"><pre><code class="language-json"><span class="line"><span class="token punctuation">{</span></span>
<span class="line">  <span class="token property">"css.lint.duplicateProperties"</span><span class="token operator">:</span> <span class="token string">"warning"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"less.lint.duplicateProperties"</span><span class="token operator">:</span> <span class="token string">"warning"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"scss.lint.duplicateProperties"</span><span class="token operator">:</span> <span class="token string">"warning"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"editor.defaultFormatter"</span><span class="token operator">:</span> <span class="token string">"esbenp.prettier-vscode"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"editor.formatOnSave"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"editor.colorDecorators"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"editor.guides.bracketPairs"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"editor.dragAndDrop"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"editor.fontSize"</span><span class="token operator">:</span> <span class="token number">16</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"editor.tabSize"</span><span class="token operator">:</span> <span class="token number">2</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"editor.fontFamily"</span><span class="token operator">:</span> <span class="token string">"'Monaspace Argon Var','Sarasa Mono SC'"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"editor.fontLigatures"</span><span class="token operator">:</span> <span class="token string">"'calt', 'ss02'"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"security.workspace.trust.untrustedFiles"</span><span class="token operator">:</span> <span class="token string">"open"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"explorer.sortOrder"</span><span class="token operator">:</span> <span class="token string">"type"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"explorer.sortOrderLexicographicOptions"</span><span class="token operator">:</span> <span class="token string">"lower"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"explorer.autoReveal"</span><span class="token operator">:</span> <span class="token string">"focusNoScroll"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"explorer.copyRelativePathSeparator"</span><span class="token operator">:</span> <span class="token string">"/"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"explorer.incrementalNaming"</span><span class="token operator">:</span> <span class="token string">"smart"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"explorer.compactFolders"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"files.eol"</span><span class="token operator">:</span> <span class="token string">"\n"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"files.autoSave"</span><span class="token operator">:</span> <span class="token string">"onFocusChange"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"files.associations"</span><span class="token operator">:</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">"*.json"</span><span class="token operator">:</span> <span class="token string">"jsonc"</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token property">"*.nvue"</span><span class="token operator">:</span> <span class="token string">"vue"</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token property">"config"</span><span class="token operator">:</span> <span class="token string">"ssh_config"</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token property">"*.cjson"</span><span class="token operator">:</span> <span class="token string">"jsonc"</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token property">"*.wxss"</span><span class="token operator">:</span> <span class="token string">"css"</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token property">"*.wxs"</span><span class="token operator">:</span> <span class="token string">"javascript"</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token property">".wxml"</span><span class="token operator">:</span> <span class="token string">"html"</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token property">".env*"</span><span class="token operator">:</span> <span class="token string">"dotenv"</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"go.useLanguageServer"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"gopls"</span><span class="token operator">:</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">"formatting.gofumpt"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token property">"ui.semanticTokens"</span><span class="token operator">:</span> <span class="token boolean">true</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"terminal.integrated.cursorBlinking"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"terminal.integrated.defaultProfile.windows"</span><span class="token operator">:</span> <span class="token string">"Git Bash"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"terminal.integrated.cursorStyle"</span><span class="token operator">:</span> <span class="token string">"line"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"terminal.integrated.enableMultiLinePasteWarning"</span><span class="token operator">:</span> <span class="token string">"never"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"terminal.integrated.fontSize"</span><span class="token operator">:</span> <span class="token number">16</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"terminal.integrated.defaultProfile.osx"</span><span class="token operator">:</span> <span class="token string">"zsh"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"workbench.tree.enableStickyScroll"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"workbench.colorTheme"</span><span class="token operator">:</span> <span class="token string">"Default Dark+"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"remote.SSH.remotePlatform"</span><span class="token operator">:</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">"itpo.mo7.cc"</span><span class="token operator">:</span> <span class="token string">"linux"</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"remote.autoForwardPortsSource"</span><span class="token operator">:</span> <span class="token string">"hybrid"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"diffEditor.ignoreTrimWhitespace"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"px-to-rem.px-per-rem"</span><span class="token operator">:</span> <span class="token number">16</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"git.openRepositoryInParentFolders"</span><span class="token operator">:</span> <span class="token string">"always"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"colorize.languages"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">"javascript"</span><span class="token punctuation">,</span> <span class="token string">"html"</span><span class="token punctuation">,</span> <span class="token string">"vue"</span><span class="token punctuation">,</span> <span class="token string">"markdown"</span><span class="token punctuation">]</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"[shellscript]"</span><span class="token operator">:</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">"editor.defaultFormatter"</span><span class="token operator">:</span> <span class="token string">"foxundermoon.shell-format"</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"[go]"</span><span class="token operator">:</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">"editor.defaultFormatter"</span><span class="token operator">:</span> <span class="token string">"golang.go"</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"codeium.enableConfig"</span><span class="token operator">:</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">"*"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token property">"markdown"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token property">"ignore"</span><span class="token operator">:</span> <span class="token boolean">true</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"[dotenv]"</span><span class="token operator">:</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">"editor.defaultFormatter"</span><span class="token operator">:</span> <span class="token string">"foxundermoon.shell-format"</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"go.toolsManagement.autoUpdate"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"[nginx]"</span><span class="token operator">:</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">"editor.defaultFormatter"</span><span class="token operator">:</span> <span class="token string">"ahmadalli.vscode-nginx-conf"</span></span>
<span class="line">  <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"hediet.vscode-drawio.resizeImages"</span><span class="token operator">:</span> <span class="token null keyword">null</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"vsicons.dontShowNewVersionMessage"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"workbench.iconTheme"</span><span class="token operator">:</span> <span class="token string">"vscode-icons"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"shellformat.path"</span><span class="token operator">:</span> <span class="token string">"/usr/local/bin/shfmt"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"terminal.external.windowsExec"</span><span class="token operator">:</span> <span class="token string">"C:\\Program Files\\PowerShell\\7\\pwsh.exe"</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"todo-tree.tree.showCountsInTree"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"todo-tree.tree.scanAtStartup"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"todo-tree.tree.buttons.export"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"todo-tree.general.tags"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">"BUG"</span><span class="token punctuation">,</span> <span class="token string">"HACK"</span><span class="token punctuation">,</span> <span class="token string">"FIXME"</span><span class="token punctuation">,</span> <span class="token string">"TODO"</span><span class="token punctuation">,</span> <span class="token string">"XXX"</span><span class="token punctuation">,</span> <span class="token string">"- [ ]"</span><span class="token punctuation">,</span> <span class="token string">"- [x]"</span><span class="token punctuation">]</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">2.通用插件推荐</title>
    <id>https://mo7.cc/bookmark/tools/vscode/vscode_common_plug.html</id>
    <link href="https://mo7.cc/bookmark/tools/vscode/vscode_common_plug.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>以下标签直接点开链接然后安装即可</p>
<h2>VSCode 的中文支持</h2>
<p><code>Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code</code></p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-zh-hans" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-zh-hans</a></p>]]></summary>
    <content type="html"><![CDATA[
<p>以下标签直接点开链接然后安装即可</p>
<h2>VSCode 的中文支持</h2>
<p><code>Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code</code></p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-zh-hans" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-zh-hans</a></p>
<h2>vscode-icons</h2>
<p>图标增强，美化效果。这一套用习惯了，其它的图标多多少少都会觉得有点不舒服。</p>
<p>主题我一般选择 <code>Default Dark+</code> 蓝+黑+灰 的配色很好看，写点的时候代码调用层级看起来很明显</p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=vscode-icons-team.vscode-icons" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=vscode-icons-team.vscode-icons</a></p>
<h2>Bookmarks</h2>
<p>书签标记，可以十分方便的快速对任意一行进行标记和取消标记，对于一个文件上千行 的代码调试 来说来说简直不可或缺。<br>
标记的术前会统一在工作区的左边栏显示，非常有用。</p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=alefragnani.Bookmarks" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=alefragnani.Bookmarks</a></p>
<h2>Code Spell Checker</h2>
<p>英语单词的语法拼写检查，可以避免一些小错误。<br>
但是对于一些自定义的名称还是会报错，这个时候只需要把该单词添加到</p>
<p><code>.vscode/settings.json</code> 里面的 <code>cSpell.words</code> 就可以不再显示了。</p>
<p>鼠标移动到画波浪线的单词上，点击 <code>快速修复</code><br>
然后选择<br>
<code>Add: "xxx" to folder settings</code><br>
这个单词在当前工作区内就属于合法单词，不在进行警告提示了。</p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker</a></p>
<h2>Codeium</h2>
<p><code>Codeium: AI Coding Autocomplete and Chat for Python, Javascript, Typescript, Java, Go, and more</code></p>
<p>实测基本上支持常用的很多语言，在一定程度上可以精准的预测你接下来要写的逻辑，很省力。</p>
<p>个人觉得 <code>Codeium</code> 比 <code>GitHub Copilot</code> 好用，而且还免费。</p>
<p>使用的时候可能得科学上网。</p>
<p>我把 <code>Tabnine</code> 以及 <code>IntelliCode</code> 等全都卸载了。</p>
<p>国内的阿里 百度 都出了 VSCode 的 Ai 提示插件，但是被国内软件坑怕了。</p>
<blockquote>
<p><code>IntelliCode</code> 也还不错，响应速度很快，提示很强大，但是不支持 go 语言，如果写 Python 和 Js 还是很好用的。但是我的 VSCode 已经有太多插件了。</p>
</blockquote>
<p><a href="https://marketplace.visualstudio.com/items?itemName=Codeium.codeium" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=Codeium.codeium</a></p>
<blockquote>
<p>Codeium 还有一个好处，就是登录官网之后可以查看自己的写代码的统计，很 Nice。</p>
</blockquote>
<h2>GitLens — Git supercharged</h2>
<p>VSCode 本身就支持 Git 的一些基本操作，但是安装这个插件之后，我的 Git 图形客户端基本上很少打开了。这款插件和 VSCode 原本的 Git 支持能很好的集成在一起。</p>
<p>有且只需要这一款 Git 插件就够了。</p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens</a></p>
<h2>Image preview</h2>
<p>可以在当前行的左侧显示一个小小的图片预览，对于那种图标很多的文件来和项目说非常直观有效。</p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=kisstkondoros.vscode-gutter-preview" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=kisstkondoros.vscode-gutter-preview</a></p>
<h2><s>indent-rainbow</s></h2>
<p>彩虹缩进，对于很多靠缩进的语言非常有帮助，可以清晰直观的看到缩进列。</p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow</a></p>
<p>不过我觉得 VSCode 下面的设置项可以完全取代该能，所以这款插件可以卸载了。</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">{</span>
<span class="line">    "editor.guides.bracketPairs": true,</span>
<span class="line">}</span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>Markdown All in One</h2>
<p>编写 Markdown 必不可少！<br>
他具备一些快捷操作，和快捷键。<br>
当然 Markdown 写的少的可能感觉不大。</p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one</a></p>
<h2>Prettier - Code formatter</h2>
<p>支持非常多语言的格式化，包括 Markdown，这个是我 VSCode 的默认格式化程序。</p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode</a></p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">3.前端开发设置</title>
    <id>https://mo7.cc/bookmark/tools/vscode/vscode_web_front_vue.html</id>
    <link href="https://mo7.cc/bookmark/tools/vscode/vscode_web_front_vue.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<h2>colorize</h2>
<p>VSCode 系统自带的颜色选择器会导致开发卡顿，而且容易误触。但是关闭颜色选择器又无法直观的看到颜色代码所代表的颜色了，这个插件很好的弥补了这点。</p>
<p>注意，如果想要支持更多语言，则需要单独进行配置。</p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=kamikillerto.vscode-colorize" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=kamikillerto.vscode-colorize</a></p>]]></summary>
    <content type="html"><![CDATA[
<h2>colorize</h2>
<p>VSCode 系统自带的颜色选择器会导致开发卡顿，而且容易误触。但是关闭颜色选择器又无法直观的看到颜色代码所代表的颜色了，这个插件很好的弥补了这点。</p>
<p>注意，如果想要支持更多语言，则需要单独进行配置。</p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=kamikillerto.vscode-colorize" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=kamikillerto.vscode-colorize</a></p>
<div class="code-block-with-title">
  <div class="code-block-title-bar" data-title="settings.json">
    <span>settings.json</span>
  </div>
  <div class="language-json line-numbers-mode" data-highlighter="prismjs" data-ext="json"><pre><code class="language-json"><span class="line"><span class="token punctuation">{</span></span>
<span class="line">  <span class="token property">"colorize.languages"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token string">"javascript"</span><span class="token punctuation">,</span> <span class="token string">"html"</span><span class="token punctuation">,</span> <span class="token string">"vue"</span><span class="token punctuation">,</span> <span class="token string">"markdown"</span><span class="token punctuation">]</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>
</div><h2>CSS Peek</h2>
<p>可以通过类名快速跳转到定义好的 css 代码处，使用频率很高，非常方便。<br>
<a href="https://marketplace.visualstudio.com/items?itemName=pranaygp.vscode-css-peek" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=pranaygp.vscode-css-peek</a></p>
<h2>ESLint</h2>
<p>安装这个插件之后，再开启 VSCode 自动格式化，那么再保存的时候会按照提前配置好的 ESLint 帮你格式化代码，非常赏心悦目。<br>
不过需要你在当前目录或者全局安装过 eslint 的 npm 包<br>
<code>npm i eslint</code> 或 <code>npm i -g eslint</code>，<br>
然后在工作区目录有一个 <code>.eslintrc</code> 配置文件。<br>
ESLint 对于团队协作开发 js 或 ts 项目的风格统一十分有帮助。</p>
<p>插件地址：<br>
<a href="https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint</a></p>
<p>ESLint 官网：<br>
<a href="https://eslint.cn/" target="_blank" rel="noopener noreferrer">https://eslint.cn/</a></p>
<h2>Prettier - Code formatter</h2>
<p>一般来说，使用 ESLint 格式化 js 风格层面的规范，但是代码的格式化一般都采用 Prettier。</p>
<p>与 ESLint 一样，需要本地 <code>npm i prettier</code> 或 <code>npm i -g prettier</code>。然后还需要一个 配置文件。</p>
<p>插件地址:<br>
<a href="https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode</a></p>
<p>官网地址：<br>
<a href="https://prettier.io/" target="_blank" rel="noopener noreferrer">https://prettier.io/</a></p>
<h2>Live Server</h2>
<p>快速启动一个当前工作区为主的静态服务。<br>
用于预览一些文件渲染效果很方便。<br>
<a href="https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer</a></p>
<h2>px to rem</h2>
<p>快速的将 px 单位转换成 rem 单位，节省心智。<br>
可以在设置中单独配置转换比例，在编写 微信小程序时也有帮助。<br>
<a href="https://marketplace.visualstudio.com/items?itemName=sainoba.px-to-rem" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=sainoba.px-to-rem</a></p>
<h2>Version Lens</h2>
<p>显示当前 package.json 中最新的安装包版本。<br>
<a href="https://marketplace.visualstudio.com/items?itemName=pflannery.vscode-versionlens" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=pflannery.vscode-versionlens</a></p>
<h2>Vue - Official</h2>
<p>现在开发 vue 只需要这一个插件就可以了。<br>
<a href="https://marketplace.visualstudio.com/items?itemName=Vue.volar" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=Vue.volar</a></p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">4.go 开发设置</title>
    <id>https://mo7.cc/bookmark/tools/vscode/vscode_golang.html</id>
    <link href="https://mo7.cc/bookmark/tools/vscode/vscode_golang.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<h2>Go</h2>
<p>go 语言支持，由 google 语言官方开发，好用！</p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=golang.Go" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=golang.Go</a></p>
<h2>Go Template Support</h2>
<p>go 语言模板文件高亮</p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=jinliming2.vscode-go-template" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=jinliming2.vscode-go-template</a></p>]]></summary>
    <content type="html"><![CDATA[
<h2>Go</h2>
<p>go 语言支持，由 google 语言官方开发，好用！</p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=golang.Go" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=golang.Go</a></p>
<h2>Go Template Support</h2>
<p>go 语言模板文件高亮</p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=jinliming2.vscode-go-template" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=jinliming2.vscode-go-template</a></p>
<h2>goctl</h2>
<p>go-zero 是一个集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性，经受了充分的实战检验。<br>
go 语言不需要任何框架。但是是 go-zero 另辟蹊径给出了很多开发范式和快捷方法，很方便。</p>
<p>插件地址:<br>
<a href="https://marketplace.visualstudio.com/items?itemName=xiaoxin-technology.goctl" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=xiaoxin-technology.goctl</a></p>
<p>官网:<br>
<a href="https://go-zero.dev/" target="_blank" rel="noopener noreferrer">https://go-zero.dev/</a></p>
<h2>VSCode 配置</h2>
<p>按 F1 打开命令口输入</p>
<p><code>Go:Install/Update Tools</code></p>
<p>然后一次安装所有插件即可。</p>
<p>可能需要科学上网或者本地开启 go 语言代理。</p>
<h2>启用更加严格的代码风格格式化工具</h2>
<p><a href="https://github.com/mvdan/gofumpt" target="_blank" rel="noopener noreferrer">https://github.com/mvdan/gofumpt</a></p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">go <span class="token function">install</span> mvdan.cc/gofumpt@latest</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>需要做如下设置</p>
<div class="code-block-with-title">
  <div class="code-block-title-bar" data-title="settings.json">
    <span>settings.json</span>
  </div>
  <div class="language-json line-numbers-mode" data-highlighter="prismjs" data-ext="json"><pre><code class="language-json"><span class="line"><span class="token punctuation">{</span></span>
<span class="line">  <span class="token property">"go.useLanguageServer"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span></span>
<span class="line">  <span class="token property">"gopls"</span><span class="token operator">:</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token property">"formatting.gofumpt"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token property">"ui.semanticTokens"</span><span class="token operator">:</span> <span class="token boolean">true</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>
</div><p>更多的自定义配置项可以查看 <a href="https://github.com/golang/bookmark/tools/blob/master/gopls/doc/settings.md" target="_blank" rel="noopener noreferrer">https://github.com/golang/bookmark/tools/blob/master/gopls/doc/settings.md</a></p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">5.远程开发</title>
    <id>https://mo7.cc/bookmark/tools/vscode/vscode_remote.html</id>
    <link href="https://mo7.cc/bookmark/tools/vscode/vscode_remote.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<h2>远程开发套件</h2>
<p>下面这一组插件可以直接让你在 VSCode 里面进行远程开发。连接远程服务器进行操作，直接在远程服务器上面写代码。</p>
<p>但是对服务器的内存有一定要求，内存小于 2GB 的服务器可能很容易就会卡死。</p>
<p>首先是 <code>Remote Development</code></p>
<p>它其中包含 4 款插件:<br>
<code>WSL</code> ,<code>Dev Containers</code>, <code>Remote - SSH</code>, <code>Remote - Tunnels</code><br>
组合起来就是一套他远程开发套件了。</p>]]></summary>
    <content type="html"><![CDATA[
<h2>远程开发套件</h2>
<p>下面这一组插件可以直接让你在 VSCode 里面进行远程开发。连接远程服务器进行操作，直接在远程服务器上面写代码。</p>
<p>但是对服务器的内存有一定要求，内存小于 2GB 的服务器可能很容易就会卡死。</p>
<p>首先是 <code>Remote Development</code></p>
<p>它其中包含 4 款插件:<br>
<code>WSL</code> ,<code>Dev Containers</code>, <code>Remote - SSH</code>, <code>Remote - Tunnels</code><br>
组合起来就是一套他远程开发套件了。</p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack</a></p>
<p><code>Remote Explorer</code></p>
<p>远程资源管理器，让服务器的文件管理可视化，非常方便。<br>
<a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.remote-explorer" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=ms-vscode.remote-explorer</a></p>
<p><code>Dev Containers</code></p>
<p>搭配 <code>Dev Containers</code> 插件一起用可以非常方便的管理 <code>Docker</code></p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers</a></p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">6.笔记的终极形态</title>
    <id>https://mo7.cc/bookmark/tools/vscode/vscode_Draw.html</id>
    <link href="https://mo7.cc/bookmark/tools/vscode/vscode_Draw.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">个人笔记的终极形态</p>
<p>Markdown 编写，<br>
Github 存储，<br>
VSCode 插件，<br>
本地画图无缝插入。</p>
</div>
<h2>本文重点</h2>
<p>一共三个 VSCode 插件</p>
<blockquote>
<p><a href="https://marketplace.visualstudio.com/items?itemName=jock.svg" target="_blank" rel="noopener noreferrer">SVG</a><br>
可以在本地编辑 SVG ，进行画图作业。</p>
</blockquote>]]></summary>
    <content type="html"><![CDATA[
<div class="hint-container info">
<p class="hint-container-title">个人笔记的终极形态</p>
<p>Markdown 编写，<br>
Github 存储，<br>
VSCode 插件，<br>
本地画图无缝插入。</p>
</div>
<h2>本文重点</h2>
<p>一共三个 VSCode 插件</p>
<blockquote>
<p><a href="https://marketplace.visualstudio.com/items?itemName=jock.svg" target="_blank" rel="noopener noreferrer">SVG</a><br>
可以在本地编辑 SVG ，进行画图作业。</p>
</blockquote>
<blockquote>
<p><a href="https://marketplace.visualstudio.com/items?itemName=eightHundreds.vscode-mindmap" target="_blank" rel="noopener noreferrer">vscode-mindmap</a><br>
开源的思维导图工具。作者基于源码 fork 进行优化，支持直接以 <code>*.km.svg</code> 的形式进行直接编辑和保存。</p>
</blockquote>
<blockquote>
<p><a href="https://marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio" target="_blank" rel="noopener noreferrer">Draw.io Integration</a><br>
开源的流程图绘制工具，支持直接以 <code>.drawio.svg</code>的文件形式直接进行保存。</p>
</blockquote>
<p>上面这三个插件有一个非常牛逼的共同点，都可以直接基于 SVG 进行编辑和保存，不需要任何导出步骤。<br>
于是可以达到如下效果:</p>
<figure><figcaption></figcaption></figure>
<blockquote>
<p>Markdown 中直接引入 svg，而这三个插件可以直接编辑 svg<br>
接补齐了 Markdown 无法画图的 唯一的短板！解决了笔记中插入图画的问题。</p>
</blockquote>
<h2>起因</h2>
<p>之前一直采用 Markdown 来做笔记，但是奈何其表达形式有限。</p>
<blockquote>
<p>notion、语雀、飞书、印象笔记。。。</p>
</blockquote>
<p>市面上笔记软件非常多，各有特色但功能基本趋同。后来一直在用飞书，它可以在其中穿插各种表格，图表，流程图、思维导图，感觉很赞，而且可以在线共享共同编辑。不知不觉就用了两年多。<br>
但是，就在某一天，我的飞书突然被封禁！！<br>
飞书官方告知我无法解封的时候，正式宣告我的上百篇文档彻底跟我没了关系。</p>
<p>自此以后，我再也无法信任国内出品的任何工具了。<br>
然后我四处寻找可以完美替代飞书文档的工具。</p>
<h2>在线笔记</h2>
<p><strong>在线笔记的好处</strong>:</p>
<ol>
<li>
<p><strong>用完就走。</strong><br>
<em>打开一个链接就可以直接开始编写</em></p>
</li>
<li>
<p><strong>文档共享十分方便。</strong><br>
<em>一个链接发给对方就行了</em></p>
</li>
<li>
<p><strong>权限控制。</strong><br>
<em>你可以设置谁可以看，谁能看，谁拥有编辑权限等</em></p>
</li>
<li>
<p><strong>入门简单，使用方便。</strong><br>
<em>字节跳动，阿里巴巴等大国内一线大厂程序员和产品，经年累月的帮你设计和优化，贴心的功能，精美的外观，一流的体验....</em></p>
</li>
<li>
<p><strong>功能丰富</strong><br>
<em>这里不得不提一嘴 <code>语雀 </code>和 <code>金山文档</code> 的流程图和思维导图工具，体验感拉满</em></p>
</li>
</ol>
<p>但是有一个无论如何都无法避免的缺点: <strong>你的笔记并不属于你！！！！！</strong></p>
<p>凡是在线文档，你的文档全部存在于各大公司的服务器之上，包括这些文档的<strong>解释权</strong>、<strong>访问权</strong> 都不属于你。我国自有国情在，如果你在文档当中包含了一些关键性的字眼，账号被封你欲哭无泪。包括国内各种云盘相关的文件等。你的内容安全性根本无从谈起！个人隐私等同于没有！</p>
<p>公司倒闭，你的东西会跟着一块受到牵连。而且在很多地方都会有各种对个人不利的协议。个人文档根本无法得到保证。</p>
<blockquote>
<p>免费的，才是最贵的，除非它开源。</p>
</blockquote>
<p>除此之外还有各种坑: 为了留住你，所有的平台，包括知乎、简书、语雀等等等，你导入都很方便，但是导出就阻碍重重.......</p>
<p>其次我非常认可的在线笔记有: Microsoft 365 的 <a href="https://www.office.com" target="_blank" rel="noopener noreferrer">Office Online</a> 和 <a href="https://www.notion.so" target="_blank" rel="noopener noreferrer">Notion</a>。</p>
<p>包括 google 的 docs 我都觉得做的一般。</p>
<p>其中 Office 是采用 OneDrive 来进行存储的，我非常安心。</p>
<p>但是这三货的在线都需要梯子！并且都不带流程图和思维导图！完全无法忍受！</p>
<p><code>语雀</code>，国内阿里的，而且不开会员无法在线共享。体验虽好，但是就因为你是国内的在线文档，还无法免费共享。这个就直接 pass 了</p>
<p><code>腾讯文档</code>，免费，但是体验太差了。不带流程图和思维导图。pass</p>
<p><code>金山文档</code>，免费，可以直接在线共享，只是存储空间非常小，感觉不太够用。</p>
<p>然后，等到哪一天你想迁移你的文档了，那简直就是灾难！</p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">7.能力拓展</title>
    <id>https://mo7.cc/bookmark/tools/vscode/vscode_nginx.html</id>
    <link href="https://mo7.cc/bookmark/tools/vscode/vscode_nginx.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<h2>Dotenv Official +Vault</h2>
<p><code>.env</code> 插件的官方高亮和提示</p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=dotenv.dotenv-vscode" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=dotenv.dotenv-vscode</a></p>
<h2>NGINX Configuration Language Support</h2>]]></summary>
    <content type="html"><![CDATA[
<h2>Dotenv Official +Vault</h2>
<p><code>.env</code> 插件的官方高亮和提示</p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=dotenv.dotenv-vscode" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=dotenv.dotenv-vscode</a></p>
<h2>NGINX Configuration Language Support</h2>
<p>高亮和格式化 Nginx 配置文件，非常好用</p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=ahmadalli.vscode-nginx-conf" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=ahmadalli.vscode-nginx-conf</a></p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">8.Shell 脚本</title>
    <id>https://mo7.cc/bookmark/tools/vscode/vscode_edit_shell.html</id>
    <link href="https://mo7.cc/bookmark/tools/vscode/vscode_edit_shell.html"/>
    <updated>2025-09-02T07:57:02.000Z</updated>
    <summary type="html"><![CDATA[
<h2>Shell 脚本扩展</h2>
<p><code>ShellCheck</code></p>
<p>可以提前检查出一些 不标准的 Shell 错误和警告，让你写出严格的 Shell 脚本，提前避免一些兼容性问题。</p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=timonwong.shellcheck" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=timonwong.shellcheck</a></p>]]></summary>
    <content type="html"><![CDATA[
<h2>Shell 脚本扩展</h2>
<p><code>ShellCheck</code></p>
<p>可以提前检查出一些 不标准的 Shell 错误和警告，让你写出严格的 Shell 脚本，提前避免一些兼容性问题。</p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=timonwong.shellcheck" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=timonwong.shellcheck</a></p>
<p><code>shfmt</code></p>
<p>支持 <code>.sh</code> <code>.bash</code> 等脚本的高亮和格式化。</p>
<p><a href="https://marketplace.visualstudio.com/items?itemName=mkhl.shfmt" target="_blank" rel="noopener noreferrer">https://marketplace.visualstudio.com/items?itemName=mkhl.shfmt</a></p>
<p>非常好用的一款 shell 脚本格式化插件，但是安装插件后可能无法直接使用，需要如下操作。</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token comment"># 下载 shfmt</span></span>
<span class="line">go <span class="token function">install</span> mvdan.cc/sh/v3/cmd/shfmt@latest</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><blockquote>
<p>仓库地址 <a href="https://github.com/mvdan/sh" target="_blank" rel="noopener noreferrer">https://github.com/mvdan/sh</a></p>
</blockquote>
<p>然后在 vscode 配置文件中：</p>
<div class="code-block-with-title">
  <div class="code-block-title-bar" data-title="settings.json">
    <span>settings.json</span>
  </div>
  <div class="language-json line-numbers-mode" data-highlighter="prismjs" data-ext="json"><pre><code class="language-json"><span class="line"><span class="token punctuation">{</span></span>
<span class="line">  <span class="token property">"shfmt.executablePath"</span><span class="token operator">:</span> <span class="token string">"C:\\Users\\mo7cc\\go\\bin\\shfmt.exe"</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>
</div><blockquote>
<p>如果是 MacOS 或 Linux 系统，一般是 <code>~/go/bin/shfmt</code>。</p>
</blockquote>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">9.字体</title>
    <id>https://mo7.cc/bookmark/tools/vscode/vscode_font_setting.html</id>
    <link href="https://mo7.cc/bookmark/tools/vscode/vscode_font_setting.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>最开始用的是系统默认的字体来编写代码，但是有点费眼睛。但一直也没什么。后来无意中发现了 <code>Consolas</code>，瞬间感觉整个代码界面都清爽了好多好多，辨识度也高了很多。<br>
Consolas 就这样被我用了好多年。</p>
<p>然后前几天我打算好好重新给自己找一款字体。</p>
<p>然后发现了这个神级的编程字体： <code>Monaspace</code> <br>
尤其是它的 <code>Argon</code> 系列，怎么看怎么爱，比 Consolas 舒服太多了。</p>
<p><a href="https://monaspace.githubnext.com" target="_blank" rel="noopener noreferrer">https://monaspace.githubnext.com</a></p>]]></summary>
    <content type="html"><![CDATA[
<p>最开始用的是系统默认的字体来编写代码，但是有点费眼睛。但一直也没什么。后来无意中发现了 <code>Consolas</code>，瞬间感觉整个代码界面都清爽了好多好多，辨识度也高了很多。<br>
Consolas 就这样被我用了好多年。</p>
<p>然后前几天我打算好好重新给自己找一款字体。</p>
<p>然后发现了这个神级的编程字体： <code>Monaspace</code> <br>
尤其是它的 <code>Argon</code> 系列，怎么看怎么爱，比 Consolas 舒服太多了。</p>
<p><a href="https://monaspace.githubnext.com" target="_blank" rel="noopener noreferrer">https://monaspace.githubnext.com</a></p>
<p>然后我就饶有兴趣的研究了一下字体相关的知识。</p>
<h2>辨识度</h2>
<p>首先对于编程来说有一些非常硬核的需求: <br>
<code>1ilLI0oO</code> <br>
你能分得清这些都是啥嘛？</p>
<p>他们分别是，数字 <code>1</code>，小写字母 <code>i</code>，小写字母<code>l</code>，大写字母 <code>L</code>，大写字母 <code>I</code>数字 <code>0</code>，小写字母 <code>o</code>，大写字母 <code>O</code>。<br>
包括命令行。</p>
<p>所以一些字母和数字之间的区分，是非常重要的一项指标。</p>
<h2>等宽</h2>
<p>另一项重要指标是 <code>等宽</code> 也就是很多字中带有的 <code>mono</code> 标识。</p>
<p><a href="https://zh.wikipedia.org/wiki/%E7%AD%89%E5%AE%BD%E5%AD%97%E4%BD%93" target="_blank" rel="noopener noreferrer">https://zh.wikipedia.org/wiki/等宽字体</a></p>
<p>等宽字体在阅读，排版，代码对比上会非常省力，基本上是编程字体的赢需求。</p>
<h2>衬线</h2>
<p>又称为有衬线体、衬线字、曲线描边字，俗称白体字。<br>
比如 宋体 就是标准的衬线字体，他们的特点是在笔画的起始和末端设置一些装饰。</p>
<p><a href="https://zh.wikipedia.org/wiki/%E8%A1%AC%E7%BA%BF%E4%BD%93" target="_blank" rel="noopener noreferrer">https://zh.wikipedia.org/wiki/衬线体</a></p>
<p>我个人非常讨厌衬线字体，因为末端的装饰在我看来就是一种干扰。我比较喜欢黑体这种无衬线风格的，还有隶书这种近似手写风格弱衬线的。</p>
<p>所以选择字体一定必须是 <code>等宽无衬线</code> 的</p>
<h2>Consolas</h2>
<p>Consolas 是微软专门为编程设计字体，是<code>宇宙 IDE Visual Studio</code> 的默认字体。</p>
<p><a href="https://zh.wikipedia.org/wiki/Consolas" target="_blank" rel="noopener noreferrer">https://zh.wikipedia.org/wiki/Consolas</a></p>
<p>它是非常标准的 <code>等宽无衬线</code> 字体。当然，我在最初使用 Consolas 的时候并没有什么等宽衬线这些概念，仅仅是无意识之举，因为这个字体的名称很像 <code>Console</code> 我就选择了它，结果一下子感觉就像给眼睛来了一次大保健！然后就一发不可收拾，我的好几台电脑，浏览器，编辑器，命令行，所有的可以显示英文的地方我都换上了这种字体。看起来贼舒坦。</p>
<p>但是这款被我用了好几年的字体前昨天被我用 <code>Monaspace Argon</code> 取代了。</p>
<h2>字体文件格式与选择</h2>
<p>这里我就不赘述了，直接看链接</p>
<p><a href="https://ziyouziti.com/art-23.html" target="_blank" rel="noopener noreferrer">https://ziyouziti.com/art-23.html</a></p>
<p>总结一下，我们一般需要关注的几个名词：</p>
<p><code>.ttf</code> 也就是 <code>TrueType</code> 格式，Win 和 macOS 通用格式，也是主流格式，特点显示和打印一致性很好，可以随意缩放不会出现锯齿，兼容性也是最好的。</p>
<p><code>.otf</code> 也就是 <code>OpenType</code> 微软和 Adobe 共用研发的字体，macOS 也有很好的支持。致力于取代 <code>ttf</code></p>
<p><code>woff</code> 和 <code>woff2</code> <code>Web Open Font Format</code> 的缩写，前者兼容老旧浏览器，后者泽专用于现代浏览器，特点是体积小，专用于 web 网页。</p>
<p><code>.ttc</code> 是多个 <code>ttf</code> 的合成字库，多个字体糅合在一起，以减小体积。</p>
<p>其余的字体格式多多少少都会存在一些兼容性问题，建议直接忽略。</p>
<p><code>Light</code>, <code>Medium</code> 和 <code>Bold</code> 是字体的粗细版本。</p>
<p>我们一般关注 <code>Regular</code> 常规版本就好了。</p>
<p>还有一种是 <code>variable fonts</code> 一般标注 <code>variable</code> 或者 <code>VF</code></p>
<p>俗称 <code>可变字体</code>，它是一种多种字体格式的单文件版，是一种数字时代制作的字体技术，它将斜体，粗体，拉伸，变形全都存储在一个 字体文件中。</p>
<p>如果你下载的字体包里面有 VF 字样的字体，则只需要安装这个即可，无需犹豫。</p>
<blockquote>
<p>相关阅读 <a href="https://zh.wikipedia.org/wiki/%E5%8F%AF%E5%8F%98%E5%AD%97%E4%BD%93" target="_blank" rel="noopener noreferrer">https://zh.wikipedia.org/wiki/可变字体</a></p>
</blockquote>
<h2>字体的安装与卸载</h2>
<p>目前来说，在 Windows 下和 macOS 下直接双击下载好的字体文件，左上角就会出现安装按钮，直接点击安装即可。</p>
<p>Windows 下打开控制面板搜索 <code>字体 -&gt; 添加和删除字体</code> 找到对应的字体文件右键就会出现删除选项。</p>
<p>macOS 下直接打开 <code>字体册.app</code> 找到对应的字体右键移除即可。</p>
<h2>字体的选择</h2>
<p>选择字体的时候我想把中文也给换了，弄一套中英文都兼容的字体。</p>
<p>一般来说在设置 fontFamily 时，系统会按顺序使用字体，比如：</p>
<div class="language-css line-numbers-mode" data-highlighter="prismjs" data-ext="css"><pre><code class="language-css"><span class="line"><span class="token property">font-family</span><span class="token punctuation">:</span> <span class="token string">'Consolas'</span><span class="token punctuation">,</span> <span class="token string">'霞鹜文楷GB Mono SC'</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>其中 <code>Consolas</code> 只包含 英文字母，数字，以及一些英文的标点符号，大小只有几十 KB 左右。它的字体渲染并不包含中文，而 <code>霞鹜文楷GB</code> 则是包含字母，数字，英文，汉字，繁体，甚至是日文的字体渲染，大小几百 M。如果 <code>霞鹜文楷GB</code> 放前面，那么基本上你的任意一个字符都可用 <code>霞鹜文楷GB</code> 去展示，<code>Consolas</code> 字体压根就没有任何效果。<br>
所以把英文字符放在前面，中文字体放后面，字母数字就会使用英文字体，显示汉字的时候找不到，退而求其次系统会使用第二位置的字体，再找不到会使用第三位直到最后使用系统字体。</p>
<blockquote>
<p>如果系统字体也无法显示该字符，则会展示是一个 <em>方框问号</em> 表示乱码。不同的字体族显示的乱码会不太一样，有的字体甚至会用一个表情来进行占位。</p>
</blockquote>
<p>我花了一天时间亲身尝试了以下字体以及组合。</p>
<p><code>霞鹜文楷 GB Mono SC</code><br>
很优秀的字体，很全面，开源免费，中文看起来很好看，英文紧凑大气。<br>
<code>GB</code> 是作者做了一些修改，表示这个是遵循国家标准的，适合用来打印的字体。<br>
<a href="https://github.com/lxgw/LxgwWenKaiGB" target="_blank" rel="noopener noreferrer">https://github.com/lxgw/LxgwWenKaiGB</a><br>
我的推荐榜单第四名。</p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">Visual Studio Code</title>
    <id>https://mo7.cc/bookmark/tools/vscode/</id>
    <link href="https://mo7.cc/bookmark/tools/vscode/"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<h2>什么是 VSCode</h2>
<p><code>Visual Studio Code</code> 简称 <code>VSCode</code> 。<br>
是一款跨平台的免费代码编辑器，由 Microsoft 开发并维护。它支持多种编程语言，包括 JavaScript、TypeScript、Python、C# 等，并提供了丰富的插件和调试工具，可用于开发 Web 应用程序、桌面应用程序、移动应用程序等不同类型项目。</p>
<p>相比其他编辑器，VS Code 有如下优点：</p>
<p>轻量级：在保证功能强大的同时，VS Code 的文件大小和占用内存较小，启动速度快。</p>]]></summary>
    <content type="html"><![CDATA[
<h2>什么是 VSCode</h2>
<p><code>Visual Studio Code</code> 简称 <code>VSCode</code> 。<br>
是一款跨平台的免费代码编辑器，由 Microsoft 开发并维护。它支持多种编程语言，包括 JavaScript、TypeScript、Python、C# 等，并提供了丰富的插件和调试工具，可用于开发 Web 应用程序、桌面应用程序、移动应用程序等不同类型项目。</p>
<p>相比其他编辑器，VS Code 有如下优点：</p>
<p>轻量级：在保证功能强大的同时，VS Code 的文件大小和占用内存较小，启动速度快。</p>
<p>多平台支持：VS Code 支持 Windows、macOS 和 Linux 等多个操作系统。</p>
<p>全球化：VS Code 拥有活跃的全球化社区，支持多种语言和文化。</p>
<p>它的插件系统设计的非常优秀，插件生态十分丰富，通过不同的插件组合基本上可以帮助你完成任何业务的开发工作。</p>
<p>官方网站：<br>
<a href="https://code.visualstudio.com/" target="_blank" rel="noopener noreferrer">https://code.visualstudio.com/</a></p>
<h2>章节目录</h2>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">1.Git 安装与基本设置</title>
    <id>https://mo7.cc/bookmark/tools/git/git_ready.html</id>
    <link href="https://mo7.cc/bookmark/tools/git/git_ready.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>Git 是一个开源的分布式版本控制系统，用于敏捷高效地处理任何或小或大的项目。<br>
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。<br>
Git 与常用的版本控制工具 CVS, Subversion, SVN 等不同，它采用了分布式版本库的方式，不必服务器端软件支持。</p>
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<p>这个是 <a href="https://www.runoob.com/git/git-tutorial.html" target="_blank" rel="noopener noreferrer">菜鸟网络</a> 里面关于 Git 的介绍和描述，我们画一下重点，<code>Linus</code>大神为了管理 <code>Linux</code> 内核专门开发了一款工具，这个就是 <code>Git</code>。</p>
<p>包括被 微软以<a href="https://cloud.tencent.com/developer/article/2206714" target="_blank" rel="noopener noreferrer">75 亿美元</a>收购的<a href="https://github.com" target="_blank" rel="noopener noreferrer">Github</a> 。 其平台的核心就是 Git。</p>
<p>Git 是目前市场上最普遍的代码版本管理工具。</p>
</div>]]></summary>
    <content type="html"><![CDATA[
<p>Git 是一个开源的分布式版本控制系统，用于敏捷高效地处理任何或小或大的项目。<br>
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。<br>
Git 与常用的版本控制工具 CVS, Subversion, SVN 等不同，它采用了分布式版本库的方式，不必服务器端软件支持。</p>
<div class="hint-container info">
<p class="hint-container-title">相关信息</p>
<p>这个是 <a href="https://www.runoob.com/git/git-tutorial.html" target="_blank" rel="noopener noreferrer">菜鸟网络</a> 里面关于 Git 的介绍和描述，我们画一下重点，<code>Linus</code>大神为了管理 <code>Linux</code> 内核专门开发了一款工具，这个就是 <code>Git</code>。</p>
<p>包括被 微软以<a href="https://cloud.tencent.com/developer/article/2206714" target="_blank" rel="noopener noreferrer">75 亿美元</a>收购的<a href="https://github.com" target="_blank" rel="noopener noreferrer">Github</a> 。 其平台的核心就是 Git。</p>
<p>Git 是目前市场上最普遍的代码版本管理工具。</p>
</div>
<h2>安装</h2>
<p><strong>Windows</strong></p>
<p><a href="https://git-scm.com/download/win" target="_blank" rel="noopener noreferrer">https://git-scm.com/download/win</a></p>
<blockquote>
<p>直接点击选择 <code>64-bit Git for Windows Setup</code> 下载 <code>.exe</code> 文件，然后双击无脑下一步即可。</p>
</blockquote>
<p><strong>macOS</strong></p>
<p><a href="https://git-scm.com/download/mac" target="_blank" rel="noopener noreferrer">https://git-scm.com/download/mac</a></p>
<blockquote>
<p>一般来说，macOS 本地自带 git，无需折腾。</p>
</blockquote>
<p><strong>Linux</strong></p>
<p>只需要一行命令即可</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">sudo</span> <span class="token function">apt-get</span> <span class="token function">install</span> <span class="token function">git</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2>全局设置</h2>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token shebang important">#!/bin/bash</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 查看当前安装的 git 版本</span></span>
<span class="line"><span class="token function">git</span> version</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 设置用户名（把 墨七 替换成你自己的名字）</span></span>
<span class="line"><span class="token function">git</span> config <span class="token parameter variable">--global</span> user.name 墨七</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 查看设置好的用户名</span></span>
<span class="line"><span class="token function">git</span> config user.name</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 设置邮箱(替换成你自己的邮箱)</span></span>
<span class="line"><span class="token function">git</span> config <span class="token parameter variable">--global</span> user.email mo7cc@outlook.com</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 查看设置好的邮箱</span></span>
<span class="line"><span class="token function">git</span> config user.email</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 禁用 pull.rebase</span></span>
<span class="line"><span class="token function">git</span> config <span class="token parameter variable">--global</span> pull.rebase <span class="token boolean">false</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 设置大小写敏感</span></span>
<span class="line"><span class="token function">git</span> config <span class="token parameter variable">--global</span> core.ignorecase <span class="token boolean">false</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 禁用中文转码</span></span>
<span class="line"><span class="token function">git</span> config <span class="token parameter variable">--global</span> core.quotepath <span class="token boolean">false</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 提交时转换为 LF，检出时不转换</span></span>
<span class="line"><span class="token function">git</span> config <span class="token parameter variable">--global</span> core.autocrlf input</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 提交包含混合换行符的文件发出警告</span></span>
<span class="line"><span class="token function">git</span> config <span class="token parameter variable">--global</span> core.safecrlf warn</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 忽略文件权限的变更(全局)</span></span>
<span class="line"><span class="token function">git</span> config <span class="token parameter variable">--global</span> core.filemode <span class="token boolean">false</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 设置 init 时 默认分支为 main</span></span>
<span class="line"><span class="token function">git</span> config <span class="token parameter variable">--global</span> init.defaultBranch main</span>
<span class="line"></span>
<span class="line"><span class="token comment"># 关闭分支显示分页 显示</span></span>
<span class="line"><span class="token function">git</span> config <span class="token parameter variable">--global</span> pager.branch <span class="token boolean">false</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 缓冲区增加到 512MB</span></span>
<span class="line"><span class="token function">git</span> config <span class="token parameter variable">--global</span> http.postBuffer <span class="token number">524288000</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 弃用 htpp 压缩</span></span>
<span class="line"><span class="token function">git</span> config <span class="token parameter variable">--global</span> http.compression <span class="token number">0</span></span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>以上都属于最基本的配置，一般来说都是在安装完 git 之后立即要进行的设置。</p>
<p><code>git config --global</code> 的设置会保存在 <code>~/.gitconfig</code> 文件中，直接修改 <code>~/.gitconfig</code> 是一样的效果。</p>
<h2>项目本地配置</h2>
<p>项目的配置一般位于 <code>.git/config</code> 文件中。</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token shebang important">#!/bin/bash</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 设置大小写敏感</span></span>
<span class="line"><span class="token function">git</span> config core.ignorecase <span class="token boolean">false</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 忽略文件权限变更</span></span>
<span class="line"><span class="token function">git</span> config core.filemode <span class="token boolean">false</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># 禁用 pull.rebase</span></span>
<span class="line"><span class="token function">git</span> config pull.rebase <span class="token boolean">false</span></span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>项目的本地配置优先级高于全局配置。</p>
<h2>配置文件详解</h2>
<p><a href="https://git-scm.com/book/zh/v2/%E8%87%AA%E5%AE%9A%E4%B9%89-Git-%E9%85%8D%E7%BD%AE-Git" target="_blank" rel="noopener noreferrer">8.1 自定义 Git - 配置 Git</a></p>
<h2>相关文档</h2>
<p><a href="https://git-scm.com/book/zh/v2" target="_blank" rel="noopener noreferrer">git Ebook</a></p>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">2.设置代理加速</title>
    <id>https://mo7.cc/bookmark/tools/git/git_proxy.html</id>
    <link href="https://mo7.cc/bookmark/tools/git/git_proxy.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<h2>系统代理设置</h2>
<p>参考文档<br>
<a href="/misc/proxy_wall_ready.html" target="_blank">科学上网与本地代理教程</a></p>
<h2>ssh 协议代理</h2>
<p>如下面这种指令</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> clone git@github.com:handy-golang/go-tools.git</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[
<h2>系统代理设置</h2>
<p>参考文档<br>
<a href="/misc/proxy_wall_ready.html" target="_blank">科学上网与本地代理教程</a></p>
<h2>ssh 协议代理</h2>
<p>如下面这种指令</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> clone git@github.com:handy-golang/go-tools.git</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>这里是使用 ssh 协议进行 远程仓库访问的，这个时候 是不走 http 代理的</p>
<p>可以通过 ssh 跳板机 完成代理。</p>
<p>参考文档：<br>
<a href="/misc/ssh_jump.html" target="_blank">ssh 跳板机</a></p>
<h2>仅仅只是添加局部代理</h2>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> config <span class="token parameter variable">--global</span> http.proxy <span class="token string">'http://127.0.0.1:10809'</span></span>
<span class="line"><span class="token function">git</span> config <span class="token parameter variable">--global</span> https.proxy <span class="token string">'http://127.0.0.1:10809'</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">## 只代理 github</span></span>
<span class="line"><span class="token function">git</span> config <span class="token parameter variable">--global</span> <span class="token string">'http.https://github.com.proxy'</span> <span class="token string">'http://127.0.0.1:10809'</span></span>
<span class="line"><span class="token function">git</span> config <span class="token parameter variable">--global</span> <span class="token string">'https.https://github.com.proxy'</span> <span class="token string">'http://127.0.0.1:10809'</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span class="token comment">##取消代理</span></span>
<span class="line"><span class="token function">git</span> config <span class="token parameter variable">--global</span> <span class="token parameter variable">--unset</span> http.proxy</span>
<span class="line"><span class="token function">git</span> config <span class="token parameter variable">--global</span> <span class="token parameter variable">--unset</span> https.proxy</span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>git 设置 ssh 核心</h2>
<p>如果是经常拉取 github 的内容会经常使用 ssh 协议 ，可能会遇到阻塞问题，如果确认 ssh 代理没问题，使用如下命令设置 ssh 核心可以解决问题。</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> config <span class="token parameter variable">--global</span> core.sshCommand <span class="token string">"C:/Windows/System32/OpenSSH/ssh.exe"</span></span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h2>设置缓存区大小</h2>
<p>有的时候可能会遇到一些错误，如果是因为项目太大造成的，可以使用如下命令设置缓存区大小。</p>
<p>设置为 2G</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token comment"># 单位是B   2147483648 也就是  5G 的缓存区大小</span></span>
<span class="line"><span class="token function">git</span> config <span class="token parameter variable">--global</span> http.postBuffer <span class="token number">2147483648</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div>]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">3.Git 常用命令</title>
    <id>https://mo7.cc/bookmark/tools/git/git_command.html</id>
    <link href="https://mo7.cc/bookmark/tools/git/git_command.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>一般的工作流以及需要用到的命令：</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token comment">#将当前目录变成仓库</span></span>
<span class="line"><span class="token function">git</span> init</span>
<span class="line"></span>
<span class="line"><span class="token comment">#克隆远端仓库到本地</span></span>
<span class="line"><span class="token function">git</span> clone <span class="token operator">&lt;</span>远程仓库地址<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">#仅克隆某一个分支</span></span>
<span class="line"><span class="token function">git</span> clone --single-branch <span class="token parameter variable">-b</span> <span class="token operator">&lt;</span>分支名称<span class="token operator">&gt;</span> <span class="token operator">&lt;</span>远程地址<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">#查看当前工作区状态</span></span>
<span class="line"><span class="token function">git</span> status</span>
<span class="line"></span>
<span class="line"><span class="token comment">#该文件的修改添加到暂存区</span></span>
<span class="line"><span class="token function">git</span> <span class="token function">add</span> <span class="token operator">&lt;</span>filename<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">#暂存所有更改</span></span>
<span class="line"><span class="token function">git</span> <span class="token function">add</span> <span class="token builtin class-name">.</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">#将未提交的修改保存起来</span></span>
<span class="line"><span class="token function">git</span> stash</span>
<span class="line"></span>
<span class="line"><span class="token comment">#拉取远端的更改到本地</span></span>
<span class="line"><span class="token function">git</span> pull</span>
<span class="line"></span>
<span class="line"><span class="token comment">#提交当前所有暂存</span></span>
<span class="line"><span class="token function">git</span> commit –m <span class="token operator">&lt;</span>注释说明<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">#切换工作分支</span></span>
<span class="line"><span class="token function">git</span> checkout <span class="token operator">&lt;</span>分支名<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">#新建分支</span></span>
<span class="line"><span class="token function">git</span> checkout <span class="token parameter variable">-b</span> <span class="token operator">&lt;</span>分支名<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">#将新建的分支推送到远端</span></span>
<span class="line"><span class="token function">git</span> push --set-upstream origin <span class="token operator">&lt;</span>分支名<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">#将一个分支合并到当前工作分支</span></span>
<span class="line"><span class="token function">git</span> merge <span class="token operator">&lt;</span>分支名<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">#查看分支所有分支包括远程分支</span></span>
<span class="line"><span class="token function">git</span> branch <span class="token parameter variable">-a</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">#回退版本</span></span>
<span class="line"><span class="token function">git</span> reset HEAD^  回退到上个版本</span>
<span class="line"><span class="token function">git</span> reset <span class="token parameter variable">--hard</span> HEAD~3  回退到前3次提交之前，以此类推，回退到n次提交之前</span>
<span class="line"><span class="token function">git</span> reset <span class="token parameter variable">--hard</span> commit_id</span>
<span class="line"></span>
<span class="line"><span class="token comment">#删除远端分支</span></span>
<span class="line"><span class="token function">git</span> push origin :<span class="token operator">&lt;</span>分支名<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">#删除本地分支</span></span>
<span class="line"><span class="token function">git</span> branch <span class="token parameter variable">-d</span> <span class="token operator">&lt;</span>分支名<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">#将当前分支的 commit 推送到远端</span></span>
<span class="line"><span class="token function">git</span> push</span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></summary>
    <content type="html"><![CDATA[
<p>一般的工作流以及需要用到的命令：</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token comment">#将当前目录变成仓库</span></span>
<span class="line"><span class="token function">git</span> init</span>
<span class="line"></span>
<span class="line"><span class="token comment">#克隆远端仓库到本地</span></span>
<span class="line"><span class="token function">git</span> clone <span class="token operator">&lt;</span>远程仓库地址<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">#仅克隆某一个分支</span></span>
<span class="line"><span class="token function">git</span> clone --single-branch <span class="token parameter variable">-b</span> <span class="token operator">&lt;</span>分支名称<span class="token operator">&gt;</span> <span class="token operator">&lt;</span>远程地址<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">#查看当前工作区状态</span></span>
<span class="line"><span class="token function">git</span> status</span>
<span class="line"></span>
<span class="line"><span class="token comment">#该文件的修改添加到暂存区</span></span>
<span class="line"><span class="token function">git</span> <span class="token function">add</span> <span class="token operator">&lt;</span>filename<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">#暂存所有更改</span></span>
<span class="line"><span class="token function">git</span> <span class="token function">add</span> <span class="token builtin class-name">.</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">#将未提交的修改保存起来</span></span>
<span class="line"><span class="token function">git</span> stash</span>
<span class="line"></span>
<span class="line"><span class="token comment">#拉取远端的更改到本地</span></span>
<span class="line"><span class="token function">git</span> pull</span>
<span class="line"></span>
<span class="line"><span class="token comment">#提交当前所有暂存</span></span>
<span class="line"><span class="token function">git</span> commit –m <span class="token operator">&lt;</span>注释说明<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">#切换工作分支</span></span>
<span class="line"><span class="token function">git</span> checkout <span class="token operator">&lt;</span>分支名<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">#新建分支</span></span>
<span class="line"><span class="token function">git</span> checkout <span class="token parameter variable">-b</span> <span class="token operator">&lt;</span>分支名<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">#将新建的分支推送到远端</span></span>
<span class="line"><span class="token function">git</span> push --set-upstream origin <span class="token operator">&lt;</span>分支名<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">#将一个分支合并到当前工作分支</span></span>
<span class="line"><span class="token function">git</span> merge <span class="token operator">&lt;</span>分支名<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">#查看分支所有分支包括远程分支</span></span>
<span class="line"><span class="token function">git</span> branch <span class="token parameter variable">-a</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">#回退版本</span></span>
<span class="line"><span class="token function">git</span> reset HEAD^  回退到上个版本</span>
<span class="line"><span class="token function">git</span> reset <span class="token parameter variable">--hard</span> HEAD~3  回退到前3次提交之前，以此类推，回退到n次提交之前</span>
<span class="line"><span class="token function">git</span> reset <span class="token parameter variable">--hard</span> commit_id</span>
<span class="line"></span>
<span class="line"><span class="token comment">#删除远端分支</span></span>
<span class="line"><span class="token function">git</span> push origin :<span class="token operator">&lt;</span>分支名<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">#删除本地分支</span></span>
<span class="line"><span class="token function">git</span> branch <span class="token parameter variable">-d</span> <span class="token operator">&lt;</span>分支名<span class="token operator">&gt;</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">#将当前分支的 commit 推送到远端</span></span>
<span class="line"><span class="token function">git</span> push</span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">4.图像化客户端推荐</title>
    <id>https://mo7.cc/bookmark/tools/git/git_client.html</id>
    <link href="https://mo7.cc/bookmark/tools/git/git_client.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>有一些工作流比较复杂，同时涉及到多条命令，除非是自动化工作流，否则使用命令不仅难以记忆，操作效率也会很慢。<br>
而且 文件会改动对比 这种事情用 图形化展示也会比较好一点。</p>
<h3>GitHub Desktop</h3>
<p>由 GitHub 开发的完全免费且开源的可自定义的 GUI 客户端程序。提供 Windows 和 macOS 版本。界面非常简洁，功能也非常实用。</p>
<p>官网地址：<br>
<a href="https://github.com/apps/desktop" target="_blank" rel="noopener noreferrer">https://github.com/apps/desktop</a></p>]]></summary>
    <content type="html"><![CDATA[
<p>有一些工作流比较复杂，同时涉及到多条命令，除非是自动化工作流，否则使用命令不仅难以记忆，操作效率也会很慢。<br>
而且 文件会改动对比 这种事情用 图形化展示也会比较好一点。</p>
<h3>GitHub Desktop</h3>
<p>由 GitHub 开发的完全免费且开源的可自定义的 GUI 客户端程序。提供 Windows 和 macOS 版本。界面非常简洁，功能也非常实用。</p>
<p>官网地址：<br>
<a href="https://github.com/apps/desktop" target="_blank" rel="noopener noreferrer">https://github.com/apps/desktop</a></p>
<blockquote>
<p>特点是非常简洁，功能也非常实用，推荐使用</p>
</blockquote>
<h3>Sourcetree</h3>
<p>Sourcetree 是适用于 macOS 和 Windows 的免费 Git 图形化客户端。它简化了版本控制过程，让你可以专注于重要的事情 —— 编码。<br>
Sourcetree 拥有专业的 UI，可以通过直接访问 Git 流、子模块、远程 repo 管理器、本地提交搜索、支持 Git 大文件等可视化管理版本库，来执行 Git 任务和访问 Git 流。</p>
<p>官网地址：<br>
<a href="https://www.sourcetreeapp.com" target="_blank" rel="noopener noreferrer">https://www.sourcetreeapp.com</a></p>
<blockquote>
<p>特点是功能非常齐全和强大，可自定义项非常多，基本上可以通过点点点完成所有的 git 操作，这个也是我目前主要使用的客户端。</p>
</blockquote>
<h2>GitKraken</h2>
<p>支持 Linux，macOS，Windows 的图形化 Git 客户端。<br>
Pro 版本收费。</p>
<p>官网地址<br>
<a href="https://www.gitkraken.com/" target="_blank" rel="noopener noreferrer">https://www.gitkraken.com/</a></p>
<blockquote>
<p>没用过，但是它支持 Linux，也是一个老牌的 git 客户端了 ， 自从有了 WSL 之后，我基本不在 Linux 上折腾图形化的东西了。</p>
</blockquote>
<h2>腾讯 UGit</h2>
<p>支持 MacOS 和 Windows 的图形化 Git 客户端。腾讯自研，很强大。</p>
<p><a href="https://ugit.qq.com/zh/" target="_blank" rel="noopener noreferrer">https://ugit.qq.com/zh/</a></p>
<blockquote>
<p>没用过，但是看界面布局感觉还不错。不过我对国产软件抱有天然的不信任态度，因为各种幺蛾子和没底线的事件出了太多太多了.....</p>
</blockquote>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">5.常用工作流</title>
    <id>https://mo7.cc/bookmark/tools/git/git_flow.html</id>
    <link href="https://mo7.cc/bookmark/tools/git/git_flow.html"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
<p>相关文档</p>
<p><a href="https://juejin.cn/post/7031149758940971021" target="_blank" rel="noopener noreferrer">四种常见的 Git 工作流</a></p>
<p><a href="https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E5%BC%80%E5%8F%91%E5%B7%A5%E4%BD%9C%E6%B5%81" target="_blank" rel="noopener noreferrer">3.4 Git 分支 - 分支开发工作流</a></p>]]></summary>
    <content type="html"><![CDATA[
<p>相关文档</p>
<p><a href="https://juejin.cn/post/7031149758940971021" target="_blank" rel="noopener noreferrer">四种常见的 Git 工作流</a></p>
<p><a href="https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E5%BC%80%E5%8F%91%E5%B7%A5%E4%BD%9C%E6%B5%81" target="_blank" rel="noopener noreferrer">3.4 Git 分支 - 分支开发工作流</a></p>
<p><a href="https://www.git-tower.com/learn/git/ebook/cn/command-line/advanced-topics/git-flow" target="_blank" rel="noopener noreferrer">git-flow 的工作流程</a></p>
<p><a href="https://www.ruanyifeng.com/blog/2015/12/git-workflow.html" target="_blank" rel="noopener noreferrer">Git 工作流程:阮一峰</a></p>
<p>下面这个是我在带领 OtterTrade 团队时制定的 Git 工作流 和 git 提交规范。</p>
<figure><figcaption>OtterTrade 团队 Git 协作工作流</figcaption></figure>
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
  <entry>
    <title type="text">Git</title>
    <id>https://mo7.cc/bookmark/tools/git/</id>
    <link href="https://mo7.cc/bookmark/tools/git/"/>
    <updated>2025-07-04T14:04:00.000Z</updated>
    <summary type="html"><![CDATA[
]]></summary>
    <content type="html"><![CDATA[
]]></content>
    <published>2024-11-27T05:02:44.000Z</published>
  </entry>
</feed>