<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>57uv6Z6g</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://loli.fj.cn/</id>
  <link href="https://loli.fj.cn/" rel="alternate"/>
  <link href="https://loli.fj.cn/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, 57uv6Z6g</rights>
  <subtitle>
    <![CDATA[MS4wLjABAAAA5qMD8Gzdcgq7HXUOviKB59i0-ybJ59jJvNzyaPt5XOsVNqP6DU7WLcoAXvdxvYdp💗<br><span style="color: red">本站所有文章仅作技术研究，请勿非法破坏，请遵守相关法律法规，后果自负</span>]]>
  </subtitle>
  <title>57uv6Z6g</title>
  <updated>2026-10-11T15:02:42.667Z</updated>
  <entry>
    <author>
      <name>57uv6Z6g</name>
    </author>
    <category term="Vue" scheme="https://loli.fj.cn/tags/Vue/"/>
    <category term="Nodejs" scheme="https://loli.fj.cn/tags/Nodejs/"/>
    <category term="Express" scheme="https://loli.fj.cn/tags/Express/"/>
    <content>
      <![CDATA[<div id="toot-id" style="display: none">undefined</div><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Vue3项目实现SSR</p><span id="more"></span><h2 id="下载依赖"><a href="#下载依赖" class="headerlink" title="下载依赖"></a>下载依赖</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm install express vue @vue/server-renderer</span><br><span class="line">npm install -D webpack webpack-cli webpack-node-externals vue-loader babel-loader @babel/core @babel/preset-env</span><br></pre></td></tr></table></figure><h2 id="客户端"><a href="#客户端" class="headerlink" title="客户端"></a>客户端</h2><h3 id="定义客户端"><a href="#定义客户端" class="headerlink" title="定义客户端"></a>定义客户端</h3><figure class="highlight js"><figcaption><span>src/client/index.js</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; createSSRApp &#125; <span class="keyword">from</span> <span class="string">&quot;vue&quot;</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="title class_">App</span> <span class="keyword">from</span> <span class="string">&quot;../App.vue&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> app = <span class="title function_">createSSRApp</span>(<span class="title class_">App</span>);</span><br><span class="line">app.<span class="title function_">mount</span>(<span class="string">&quot;#app&quot;</span>);</span><br></pre></td></tr></table></figure><h3 id="定义Webpack配置"><a href="#定义Webpack配置" class="headerlink" title="定义Webpack配置"></a>定义Webpack配置</h3><figure class="highlight js"><figcaption><span>config/client/webpack.config.js</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> path = <span class="built_in">require</span>(<span class="string">&quot;path&quot;</span>);</span><br><span class="line"><span class="keyword">const</span> &#123; <span class="title class_">VueLoaderPlugin</span> &#125; = <span class="built_in">require</span>(<span class="string">&quot;vue-loader&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="variable language_">module</span>.<span class="property">exports</span> = &#123;</span><br><span class="line">  <span class="attr">target</span>: <span class="string">&quot;web&quot;</span>,</span><br><span class="line">  <span class="attr">mode</span>: <span class="string">&quot;development&quot;</span>,</span><br><span class="line">  <span class="attr">entry</span>: <span class="string">&quot;./src/client/index.js&quot;</span>,</span><br><span class="line">  <span class="attr">output</span>: &#123;</span><br><span class="line">    <span class="attr">filename</span>: <span class="string">&quot;bundle.js&quot;</span>,</span><br><span class="line">    <span class="attr">path</span>: path.<span class="title function_">resolve</span>(__dirname, <span class="string">&quot;../../build/client&quot;</span>)</span><br><span class="line">  &#125;,</span><br><span class="line">  <span class="attr">module</span>: &#123;</span><br><span class="line">    <span class="attr">rules</span>: [</span><br><span class="line">      &#123;</span><br><span class="line">        <span class="attr">test</span>: <span class="regexp">/\.js$/</span>,</span><br><span class="line">        <span class="attr">loader</span>: <span class="string">&quot;babel-loader&quot;</span>,</span><br><span class="line">        <span class="attr">options</span>: &#123;</span><br><span class="line">          <span class="attr">presets</span>: [<span class="string">&quot;@babel/preset-env&quot;</span>]</span><br><span class="line">        &#125;</span><br><span class="line">      &#125;,</span><br><span class="line">      &#123;</span><br><span class="line">        <span class="attr">test</span>: <span class="regexp">/\.vue$/</span>,</span><br><span class="line">        <span class="attr">loader</span>: <span class="string">&quot;vue-loader&quot;</span></span><br><span class="line">      &#125;</span><br><span class="line">    ]</span><br><span class="line">  &#125;,</span><br><span class="line">  <span class="attr">plugins</span>: [<span class="keyword">new</span> <span class="title class_">VueLoaderPlugin</span>()]</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="通过Webpack打包客户端"><a href="#通过Webpack打包客户端" class="headerlink" title="通过Webpack打包客户端"></a>通过Webpack打包客户端</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">webpack --config config/client/webpack.config.js</span><br></pre></td></tr></table></figure><h2 id="服务器"><a href="#服务器" class="headerlink" title="服务器"></a>服务器</h2><h3 id="定义Vue3根组件"><a href="#定义Vue3根组件" class="headerlink" title="定义Vue3根组件"></a>定义Vue3根组件</h3><figure class="highlight plaintext"><figcaption><span>src/App.vue</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;template&gt;&lt;/template&gt;</span><br></pre></td></tr></table></figure><h3 id="定义服务器"><a href="#定义服务器" class="headerlink" title="定义服务器"></a>定义服务器</h3><ul><li>渲染Vue3根组件</li><li>实现JS水合激活（Hydration）</li></ul><figure class="highlight js"><figcaption><span>src/server/app.js</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; createSSRApp &#125; <span class="keyword">from</span> <span class="string">&quot;vue&quot;</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="title class_">App</span> <span class="keyword">from</span> <span class="string">&quot;../App.vue&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="keyword">function</span> <span class="title function_">createApp</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="title function_">createSSRApp</span>(<span class="title class_">App</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight js"><figcaption><span>src/server/index.js</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> express = <span class="built_in">require</span>(<span class="string">&quot;express&quot;</span>);</span><br><span class="line"><span class="keyword">const</span> path = <span class="built_in">require</span>(<span class="string">&quot;path&quot;</span>);</span><br><span class="line"><span class="keyword">const</span> &#123; renderToString &#125; = <span class="built_in">require</span>(<span class="string">&quot;@vue/server-renderer&quot;</span>);</span><br><span class="line"><span class="keyword">const</span> createApp = <span class="built_in">require</span>(<span class="string">&quot;./app.js&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> server = <span class="title function_">express</span>();</span><br><span class="line">server.<span class="title function_">use</span>(express.<span class="title function_">static</span>(path.<span class="title function_">resolve</span>(__dirname, <span class="string">&quot;../client&quot;</span>)));</span><br><span class="line">server.<span class="title function_">get</span>(<span class="string">&quot;/&quot;</span>, <span class="keyword">async</span> <span class="keyword">function</span> (<span class="params">request, response</span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> app = <span class="title function_">createApp</span>();</span><br><span class="line">  <span class="keyword">const</span> appHTML = <span class="keyword">await</span> <span class="title function_">renderToString</span>(app);</span><br><span class="line">  response.<span class="title function_">send</span>(<span class="string">`</span></span><br><span class="line"><span class="string">    &lt;!DOCTYPE html&gt;</span></span><br><span class="line"><span class="string">    &lt;html&gt;</span></span><br><span class="line"><span class="string">    &lt;head&gt;</span></span><br><span class="line"><span class="string">      &lt;meta charset=&quot;UTF-8&quot;&gt;</span></span><br><span class="line"><span class="string">      &lt;title&gt;Title&lt;/title&gt;</span></span><br><span class="line"><span class="string">    &lt;/head&gt;</span></span><br><span class="line"><span class="string">    &lt;body&gt;</span></span><br><span class="line"><span class="string">      &lt;div id=&quot;app&quot;&gt;<span class="subst">$&#123;appHTML&#125;</span>&lt;/div&gt;</span></span><br><span class="line"><span class="string">      &lt;script src=&quot;/bundle.js&quot;&gt;&lt;/script&gt;</span></span><br><span class="line"><span class="string">    &lt;/body&gt;</span></span><br><span class="line"><span class="string">    &lt;/html&gt;</span></span><br><span class="line"><span class="string">  `</span>);</span><br><span class="line">&#125;);</span><br><span class="line">server.<span class="title function_">listen</span>(<span class="number">3000</span>);</span><br></pre></td></tr></table></figure><h3 id="定义Webpack配置-1"><a href="#定义Webpack配置-1" class="headerlink" title="定义Webpack配置"></a>定义Webpack配置</h3><figure class="highlight js"><figcaption><span>config/server/webpack.config.js</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> path = <span class="built_in">require</span>(<span class="string">&quot;path&quot;</span>);</span><br><span class="line"><span class="keyword">const</span> nodeExternals = <span class="built_in">require</span>(<span class="string">&quot;webpack-node-externals&quot;</span>);</span><br><span class="line"><span class="keyword">const</span> &#123; <span class="title class_">VueLoaderPlugin</span> &#125; = <span class="built_in">require</span>(<span class="string">&quot;vue-loader&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="variable language_">module</span>.<span class="property">exports</span> = &#123;</span><br><span class="line">  <span class="attr">target</span>: <span class="string">&quot;node&quot;</span>,</span><br><span class="line">  <span class="attr">mode</span>: <span class="string">&quot;development&quot;</span>,</span><br><span class="line">  <span class="attr">entry</span>: <span class="string">&quot;./src/server/index.js&quot;</span>,</span><br><span class="line">  <span class="attr">output</span>: &#123;</span><br><span class="line">    <span class="attr">filename</span>: <span class="string">&quot;bundle.js&quot;</span>,</span><br><span class="line">    <span class="attr">path</span>: path.<span class="title function_">resolve</span>(__dirname, <span class="string">&quot;../../build/server&quot;</span>),</span><br><span class="line">    <span class="attr">libraryTarget</span>: <span class="string">&quot;commonjs2&quot;</span></span><br><span class="line">  &#125;,</span><br><span class="line">  <span class="attr">module</span>: &#123;</span><br><span class="line">    <span class="attr">rules</span>: [</span><br><span class="line">      &#123;</span><br><span class="line">        <span class="attr">test</span>: <span class="regexp">/\.js$/</span>,</span><br><span class="line">        <span class="attr">loader</span>: <span class="string">&quot;babel-loader&quot;</span>,</span><br><span class="line">        <span class="attr">options</span>: &#123;</span><br><span class="line">          <span class="attr">presets</span>: [<span class="string">&quot;@babel/preset-env&quot;</span>]</span><br><span class="line">        &#125;</span><br><span class="line">      &#125;,</span><br><span class="line">      &#123;</span><br><span class="line">        <span class="attr">test</span>: <span class="regexp">/\.vue$/</span>,</span><br><span class="line">        <span class="attr">loader</span>: <span class="string">&quot;vue-loader&quot;</span></span><br><span class="line">      &#125;</span><br><span class="line">    ]</span><br><span class="line">  &#125;,</span><br><span class="line">  <span class="attr">plugins</span>: [<span class="keyword">new</span> <span class="title class_">VueLoaderPlugin</span>()],</span><br><span class="line">  <span class="attr">externals</span>: [</span><br><span class="line">    <span class="title function_">nodeExternals</span>(&#123;</span><br><span class="line">      <span class="attr">allowlist</span>: [<span class="string">&quot;vue&quot;</span>, <span class="string">&quot;@vue/server-renderer&quot;</span>]</span><br><span class="line">    &#125;)</span><br><span class="line">  ]</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="通过Webpack打包服务器"><a href="#通过Webpack打包服务器" class="headerlink" title="通过Webpack打包服务器"></a>通过Webpack打包服务器</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">webpack --config config/server/webpack.config.js</span><br></pre></td></tr></table></figure><h2 id="启动SSR服务器"><a href="#启动SSR服务器" class="headerlink" title="启动SSR服务器"></a>启动SSR服务器</h2><ul><li>先通过Webpack依次打包客户端和服务器，再启动打包好的服务器程序</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">webpack --config config/client/webpack.config.js</span><br><span class="line">webpack --config config/server/webpack.config.js</span><br><span class="line"></span><br><span class="line">node build/server/bundle.js</span><br></pre></td></tr></table></figure><h3 id="多组件"><a href="#多组件" class="headerlink" title="多组件"></a>多组件</h3><h4 id="下载依赖-1"><a href="#下载依赖-1" class="headerlink" title="下载依赖"></a>下载依赖</h4><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install vue-router@4</span><br></pre></td></tr></table></figure><h4 id="定义路由"><a href="#定义路由" class="headerlink" title="定义路由"></a>定义路由</h4><figure class="highlight plaintext"><figcaption><span>src/views/home.vue</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;template&gt;&lt;/template&gt;</span><br></pre></td></tr></table></figure><figure class="highlight js"><figcaption><span>src/router/index.js</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; createRouter &#125; <span class="keyword">from</span> <span class="string">&quot;vue-router&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> routes = [</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="attr">path</span>: <span class="string">&quot;/&quot;</span>,</span><br><span class="line">    <span class="attr">component</span>: <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">      <span class="keyword">return</span> <span class="keyword">import</span>(<span class="string">&quot;../views/home.vue&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">];</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="keyword">function</span> (<span class="params">history</span>) &#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="title function_">createRouter</span>(&#123;</span><br><span class="line">    <span class="attr">history</span>: history,</span><br><span class="line">    <span class="attr">routes</span>: routes</span><br><span class="line">  &#125;);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="使用路由"><a href="#使用路由" class="headerlink" title="使用路由"></a>使用路由</h4><figure class="highlight plaintext"><figcaption><span>src/App.vue</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">&lt;template&gt;</span><br><span class="line">  &lt;router-link to=&quot;/&quot;&gt;</span><br><span class="line">    &lt;button&gt;home&lt;/button&gt;</span><br><span class="line">  &lt;/router-link&gt;</span><br><span class="line">  &lt;router-view&gt;&lt;/router-view&gt;</span><br><span class="line">&lt;/template&gt;</span><br></pre></td></tr></table></figure><figure class="highlight js"><figcaption><span>src/client/index.js</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; createSSRApp &#125; <span class="keyword">from</span> <span class="string">&quot;vue&quot;</span>;</span><br><span class="line"><span class="keyword">import</span> <span class="title class_">App</span> <span class="keyword">from</span> <span class="string">&quot;../App.vue&quot;</span>;</span><br><span class="line"><span class="keyword">import</span> createRouter <span class="keyword">from</span> <span class="string">&quot;../router/index.js&quot;</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; createWebHistory &#125; <span class="keyword">from</span> <span class="string">&quot;vue-router&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> app = <span class="title function_">createSSRApp</span>(<span class="title class_">App</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> router = <span class="title function_">createRouter</span>(<span class="title function_">createWebHistory</span>());</span><br><span class="line">app.<span class="title function_">use</span>(router);</span><br><span class="line"></span><br><span class="line">router.<span class="title function_">isReady</span>().<span class="title function_">then</span>(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">  app.<span class="title function_">mount</span>(<span class="string">&quot;#app&quot;</span>);</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><figure class="highlight js"><figcaption><span>src/server/index.js</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> express = <span class="built_in">require</span>(<span class="string">&quot;express&quot;</span>);</span><br><span class="line"><span class="keyword">const</span> path = <span class="built_in">require</span>(<span class="string">&quot;path&quot;</span>);</span><br><span class="line"><span class="keyword">const</span> &#123; renderToString &#125; = <span class="built_in">require</span>(<span class="string">&quot;@vue/server-renderer&quot;</span>);</span><br><span class="line"><span class="keyword">const</span> createApp = <span class="built_in">require</span>(<span class="string">&quot;./app.js&quot;</span>);</span><br><span class="line"><span class="keyword">const</span> createRouter = <span class="built_in">require</span>(<span class="string">&quot;../router/index.js&quot;</span>);</span><br><span class="line"><span class="keyword">const</span> &#123; createMemoryHistory &#125; = <span class="built_in">require</span>(<span class="string">&quot;vue-router&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> server = <span class="title function_">express</span>();</span><br><span class="line">server.<span class="title function_">use</span>(express.<span class="title function_">static</span>(path.<span class="title function_">resolve</span>(__dirname, <span class="string">&quot;../client&quot;</span>)));</span><br><span class="line">server.<span class="title function_">get</span>(<span class="string">&quot;/*&quot;</span>, <span class="keyword">async</span> <span class="keyword">function</span> (<span class="params">request, response</span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> app = <span class="title function_">createApp</span>();</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> router = <span class="title function_">createRouter</span>(<span class="title function_">createMemoryHistory</span>());</span><br><span class="line">  app.<span class="title function_">use</span>(router);</span><br><span class="line">  <span class="keyword">await</span> router.<span class="title function_">push</span>(request.<span class="property">url</span> || <span class="string">&quot;/&quot;</span>);</span><br><span class="line">  <span class="keyword">await</span> router.<span class="title function_">isReady</span>();</span><br><span class="line">  </span><br><span class="line">  <span class="keyword">const</span> appHTML = <span class="keyword">await</span> <span class="title function_">renderToString</span>(app);</span><br><span class="line">  response.<span class="title function_">send</span>(<span class="string">`</span></span><br><span class="line"><span class="string">    &lt;!DOCTYPE html&gt;</span></span><br><span class="line"><span class="string">    &lt;html&gt;</span></span><br><span class="line"><span class="string">    &lt;head&gt;</span></span><br><span class="line"><span class="string">      &lt;meta charset=&quot;UTF-8&quot;&gt;</span></span><br><span class="line"><span class="string">      &lt;title&gt;Title&lt;/title&gt;</span></span><br><span class="line"><span class="string">    &lt;/head&gt;</span></span><br><span class="line"><span class="string">    &lt;body&gt;</span></span><br><span class="line"><span class="string">      &lt;div id=&quot;app&quot;&gt;<span class="subst">$&#123;appHTML&#125;</span>&lt;/div&gt;</span></span><br><span class="line"><span class="string">      &lt;script src=&quot;/bundle.js&quot;&gt;&lt;/script&gt;</span></span><br><span class="line"><span class="string">    &lt;/body&gt;</span></span><br><span class="line"><span class="string">    &lt;/html&gt;</span></span><br><span class="line"><span class="string">  `</span>);</span><br><span class="line">&#125;);</span><br><span class="line">server.<span class="title function_">listen</span>(<span class="number">3000</span>);</span><br></pre></td></tr></table></figure><h2 id="完成"><a href="#完成" class="headerlink" title="完成"></a>完成</h2>]]>
    </content>
    <id>https://loli.fj.cn/2026/10/11/Vue3%E9%A1%B9%E7%9B%AE%E5%AE%9E%E7%8E%B0SSR/</id>
    <link href="https://loli.fj.cn/2026/10/11/Vue3%E9%A1%B9%E7%9B%AE%E5%AE%9E%E7%8E%B0SSR/"/>
    <published>2026-10-11T08:54:17.000Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Vue3项目实现SSR</p>]]>
    </summary>
    <title>【笔记】Vue3项目实现SSR</title>
    <updated>2026-10-11T15:02:42.667Z</updated>
  </entry>
  <entry>
    <author>
      <name>57uv6Z6g</name>
    </author>
    <category term="Nodejs学习指北" scheme="https://loli.fj.cn/categories/Nodejs%E5%AD%A6%E4%B9%A0%E6%8C%87%E5%8C%97/"/>
    <category term="JavaScript" scheme="https://loli.fj.cn/tags/JavaScript/"/>
    <category term="Nodejs" scheme="https://loli.fj.cn/tags/Nodejs/"/>
    <content>
      <![CDATA[<div id="toot-id" style="display: none">undefined</div><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Nodejs使用util工具模块</p><span id="more"></span><h2 id="引入依赖"><a href="#引入依赖" class="headerlink" title="引入依赖"></a>引入依赖</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">const util = require(&quot;util&quot;);</span><br></pre></td></tr></table></figure><h2 id="将函数转换为支持Promise的函数"><a href="#将函数转换为支持Promise的函数" class="headerlink" title="将函数转换为支持Promise的函数"></a>将函数转换为支持Promise的函数</h2><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> fn = <span class="keyword">function</span> (<span class="params">fn</span>) &#123;&#125;</span><br><span class="line">fn = util.<span class="title function_">promisify</span>(fn);</span><br></pre></td></tr></table></figure><h2 id="完成"><a href="#完成" class="headerlink" title="完成"></a>完成</h2>]]>
    </content>
    <id>https://loli.fj.cn/2026/10/07/Nodejs%E7%9A%84%E5%B7%A5%E5%85%B7/</id>
    <link href="https://loli.fj.cn/2026/10/07/Nodejs%E7%9A%84%E5%B7%A5%E5%85%B7/"/>
    <published>2026-10-07T09:16:15.000Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Nodejs使用util工具模块</p>]]>
    </summary>
    <title>【笔记】Nodejs的工具</title>
    <updated>2026-10-11T15:02:42.633Z</updated>
  </entry>
  <entry>
    <author>
      <name>57uv6Z6g</name>
    </author>
    <category term="JavaScript" scheme="https://loli.fj.cn/tags/JavaScript/"/>
    <category term="Nodejs" scheme="https://loli.fj.cn/tags/Nodejs/"/>
    <content>
      <![CDATA[<div id="toot-id" style="display: none">undefined</div><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Download and extract a git repository (GitHub, GitLab, Bitbucket) from node.（<a href="/302.html?target=https://gitlab.com/flippidippi/download-git-repo">Gitlab</a>）</p><span id="more"></span><h2 id="下载依赖"><a href="#下载依赖" class="headerlink" title="下载依赖"></a>下载依赖</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install -D download-git-repo</span><br></pre></td></tr></table></figure><h2 id="引入依赖"><a href="#引入依赖" class="headerlink" title="引入依赖"></a>引入依赖</h2><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> download = <span class="built_in">require</span>(<span class="string">&quot;download-git-repo&quot;</span>);</span><br></pre></td></tr></table></figure><h2 id="克隆Git项目"><a href="#克隆Git项目" class="headerlink" title="克隆Git项目"></a>克隆Git项目</h2><blockquote><p><code>direct:</code>：Github需要进行探测<br><code>#main</code>：指定分支，缺省值为<code>master</code></p></blockquote><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="title function_">download</span>(<span class="string">&quot;direct:https://github.com/example/example.git#main&quot;</span>, <span class="string">&quot;./&quot;</span>, &#123; <span class="attr">clone</span>: <span class="literal">true</span> &#125;, <span class="keyword">function</span> (<span class="params">err</span>) &#123;&#125;);</span><br></pre></td></tr></table></figure><h2 id="完成"><a href="#完成" class="headerlink" title="完成"></a>完成</h2>]]>
    </content>
    <id>https://loli.fj.cn/2026/10/07/download-git-repo%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</id>
    <link href="https://loli.fj.cn/2026/10/07/download-git-repo%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    <published>2026-10-07T09:04:11.000Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Download and extract a git repository (GitHub, GitLab, Bitbucket) from node.（<a href="/302.html?target=https://gitlab.com/flippidippi/download-git-repo">Gitlab</a>）</p>]]>
    </summary>
    <title>【笔记】download-git-repo学习笔记</title>
    <updated>2026-10-11T15:02:42.680Z</updated>
  </entry>
  <entry>
    <author>
      <name>57uv6Z6g</name>
    </author>
    <category term="Nodejs" scheme="https://loli.fj.cn/tags/Nodejs/"/>
    <content>
      <![CDATA[<div id="toot-id" style="display: none">undefined</div><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Nodejs开发脚手架项目</p><span id="more"></span><h2 id="配置环境变量"><a href="#配置环境变量" class="headerlink" title="配置环境变量"></a>配置环境变量</h2><ul><li>修改配置文件，定义可执行文件路径</li></ul><figure class="highlight json"><figcaption><span>package.json</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;bin&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;index.js&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><ul><li>向环境变量添加软链接</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm link</span><br></pre></td></tr></table></figure><h2 id="获取命令行参数"><a href="#获取命令行参数" class="headerlink" title="获取命令行参数"></a>获取命令行参数</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">name arg1 arg2</span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(process.<span class="property">env</span>); <span class="comment">// [&quot;node&quot;, &quot;name&quot;, &quot;arg1&quot;, arg2&quot;&quot;]</span></span><br></pre></td></tr></table></figure><h2 id="通过Commander处理命令行参数"><a href="#通过Commander处理命令行参数" class="headerlink" title="通过Commander处理命令行参数"></a>通过Commander处理命令行参数</h2><ul><li>The complete solution for node.js command-line interfaces.（<a href="/302.html?target=https://github.com/tj/commander.js">Github</a>）</li></ul><h3 id="下载依赖"><a href="#下载依赖" class="headerlink" title="下载依赖"></a>下载依赖</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install commander</span><br></pre></td></tr></table></figure><h3 id="引入依赖"><a href="#引入依赖" class="headerlink" title="引入依赖"></a>引入依赖</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> &#123; program &#125; = <span class="built_in">require</span>(<span class="string">&quot;commander&quot;</span>);</span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> program = <span class="built_in">require</span>(<span class="string">&quot;commander&quot;</span>);</span><br></pre></td></tr></table></figure><h3 id="处理参数"><a href="#处理参数" class="headerlink" title="处理参数"></a>处理参数</h3><h4 id="版本"><a href="#版本" class="headerlink" title="版本"></a>版本</h4><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> version = <span class="built_in">require</span>(<span class="string">&quot;package.json&quot;</span>).<span class="property">version</span>;</span><br><span class="line">program.<span class="title function_">version</span>(version);</span><br></pre></td></tr></table></figure><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">name --version</span><br></pre></td></tr></table></figure><h5 id="包含简写"><a href="#包含简写" class="headerlink" title="包含简写"></a>包含简写</h5><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> version = <span class="built_in">require</span>(<span class="string">&quot;package.json&quot;</span>).<span class="property">version</span>;</span><br><span class="line">program.<span class="title function_">version</span>(version, <span class="string">&quot;-v --version&quot;</span>);</span><br></pre></td></tr></table></figure><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">name -v</span><br></pre></td></tr></table></figure><h4 id="说明文档"><a href="#说明文档" class="headerlink" title="说明文档"></a>说明文档</h4><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">program.<span class="title function_">on</span>(<span class="string">&quot;--help&quot;</span>, <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">  <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&quot;&quot;</span>);</span><br><span class="line">  <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&quot;Others:&quot;</span>);</span><br><span class="line">  <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&quot;  text&quot;</span>);</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">Usage: index [options]</span><br><span class="line"></span><br><span class="line">Options:</span><br><span class="line">  -v --version  output the version number</span><br><span class="line"></span><br><span class="line">Others:</span><br><span class="line">  text</span><br></pre></td></tr></table></figure><h4 id="其他参数"><a href="#其他参数" class="headerlink" title="其他参数"></a>其他参数</h4><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">name -o .</span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">program.<span class="title function_">option</span>(<span class="string">&quot;-o --out&quot;</span>);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(program.<span class="title function_">opts</span>().<span class="property">o</span>); <span class="comment">// &quot;.&quot;</span></span><br></pre></td></tr></table></figure><h5 id="包含帮助文档描述"><a href="#包含帮助文档描述" class="headerlink" title="包含帮助文档描述"></a>包含帮助文档描述</h5><blockquote><p><code>&quot;desc&quot;</code>：描述</p></blockquote><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">program.<span class="title function_">option</span>(<span class="string">&quot;-o --out&quot;</span>, <span class="string">&quot;desc&quot;</span>);</span><br></pre></td></tr></table></figure><ul><li>使用<code>--help</code>查看帮助文档时会提示描述</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">name --help</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Usage: index [options]</span><br><span class="line"></span><br><span class="line">Options:</span><br><span class="line">  -v --version  output the version number</span><br><span class="line">  -o --out      desc</span><br></pre></td></tr></table></figure><h3 id="处理命令"><a href="#处理命令" class="headerlink" title="处理命令"></a>处理命令</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">program</span><br><span class="line">  .<span class="title function_">command</span>(<span class="string">&quot;create &lt;project&gt; [---others]&quot;</span>)</span><br><span class="line">  .<span class="title function_">action</span>(<span class="keyword">function</span> (<span class="params">project</span>) &#123;&#125;);</span><br></pre></td></tr></table></figure><h4 id="包含说明文档描述"><a href="#包含说明文档描述" class="headerlink" title="包含说明文档描述"></a>包含说明文档描述</h4><blockquote><p><code>&quot;desc&quot;</code>：描述</p></blockquote><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">program</span><br><span class="line">  .<span class="title function_">command</span>(<span class="string">&quot;create &lt;project&gt; [---others]&quot;</span>)</span><br><span class="line">  .<span class="title function_">description</span>(<span class="string">&quot;desc&quot;</span>)</span><br><span class="line">  .<span class="title function_">action</span>(<span class="keyword">function</span> (<span class="params">project</span>) &#123;&#125;);</span><br></pre></td></tr></table></figure><ul><li>使用<code>--help</code>查看帮助文档时会提示描述</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">name --help</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">Usage: index [options]</span><br><span class="line"></span><br><span class="line">Options:</span><br><span class="line">  -v --version  output the version number</span><br><span class="line"></span><br><span class="line">Commands:</span><br><span class="line">  create &lt;project&gt; [...others]  desc</span><br></pre></td></tr></table></figure><h2 id="完成"><a href="#完成" class="headerlink" title="完成"></a>完成</h2>]]>
    </content>
    <id>https://loli.fj.cn/2026/10/06/Nodejs%E5%BC%80%E5%8F%91%E8%84%9A%E6%89%8B%E6%9E%B6%E9%A1%B9%E7%9B%AE/</id>
    <link href="https://loli.fj.cn/2026/10/06/Nodejs%E5%BC%80%E5%8F%91%E8%84%9A%E6%89%8B%E6%9E%B6%E9%A1%B9%E7%9B%AE/"/>
    <published>2026-10-06T13:27:33.000Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Nodejs开发脚手架项目</p>]]>
    </summary>
    <title>【笔记】Nodejs开发脚手架项目</title>
    <updated>2026-10-11T15:02:42.633Z</updated>
  </entry>
  <entry>
    <author>
      <name>57uv6Z6g</name>
    </author>
    <category term="Linux" scheme="https://loli.fj.cn/tags/Linux/"/>
    <category term="Shell" scheme="https://loli.fj.cn/tags/Shell/"/>
    <content>
      <![CDATA[<div id="toot-id" style="display: none">undefined</div><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>在计算领域中，Shebang（也称为Hashbang）是一个由井号和叹号构成的字符序列<code>#!</code>，位于脚本文件开头。类Unix系统直接执行脚本时，会根据它指定的程序启动解释器，并把脚本路径交给解释器。（<a href="/302.html?target=https://zh.wikipedia.org/wiki/Shebang">维基百科</a>）</p><span id="more"></span><h2 id="定义Shebang"><a href="#定义Shebang" class="headerlink" title="定义Shebang"></a>定义Shebang</h2><h3 id="指定解释器全局路径"><a href="#指定解释器全局路径" class="headerlink" title="指定解释器全局路径"></a>指定解释器全局路径</h3><h4 id="Shell"><a href="#Shell" class="headerlink" title="Shell"></a>Shell</h4><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/sh</span></span><br></pre></td></tr></table></figure><h3 id="通过环境变量指定解释器"><a href="#通过环境变量指定解释器" class="headerlink" title="通过环境变量指定解释器"></a>通过环境变量指定解释器</h3><h4 id="Shell-1"><a href="#Shell-1" class="headerlink" title="Shell"></a>Shell</h4><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/usr/bin/env sh</span></span><br></pre></td></tr></table></figure><h4 id="PowerShell（Linux）"><a href="#PowerShell（Linux）" class="headerlink" title="PowerShell（Linux）"></a>PowerShell（Linux）</h4><figure class="highlight ps1"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/env pwsh</span></span><br></pre></td></tr></table></figure><h4 id="Python3"><a href="#Python3" class="headerlink" title="Python3"></a>Python3</h4><figure class="highlight py"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/env python3</span></span><br></pre></td></tr></table></figure><h4 id="Ruby"><a href="#Ruby" class="headerlink" title="Ruby"></a>Ruby</h4><figure class="highlight rb"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/usr/bin/env ruby</span></span><br></pre></td></tr></table></figure><h4 id="PHP"><a href="#PHP" class="headerlink" title="PHP"></a>PHP</h4><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/env php</span></span><br><span class="line"><span class="meta">&lt;?php</span> <span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><h4 id="Nodejs"><a href="#Nodejs" class="headerlink" title="Nodejs"></a>Nodejs</h4><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/usr/bin/env node</span></span><br></pre></td></tr></table></figure><h4 id="Perl"><a href="#Perl" class="headerlink" title="Perl"></a>Perl</h4><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/env perl</span></span><br></pre></td></tr></table></figure><h4 id="Dart"><a href="#Dart" class="headerlink" title="Dart"></a>Dart</h4><figure class="highlight dart"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">#!/usr/bin/env dart</span><br><span class="line"></span><br><span class="line"><span class="keyword">void</span> <span class="title function_">main</span>(<span class="title class_">List</span>&lt;<span class="title class_">String</span>&gt; args) &#123;&#125;</span><br></pre></td></tr></table></figure><h2 id="通过Shebang中定义的解释器执行代码"><a href="#通过Shebang中定义的解释器执行代码" class="headerlink" title="通过Shebang中定义的解释器执行代码"></a>通过Shebang中定义的解释器执行代码</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">chmod +x &lt;file_name&gt;.sh</span><br><span class="line">./&lt;file_name&gt;.sh</span><br></pre></td></tr></table></figure><h2 id="完成"><a href="#完成" class="headerlink" title="完成"></a>完成</h2>]]>
    </content>
    <id>https://loli.fj.cn/2026/10/06/Shebang%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</id>
    <link href="https://loli.fj.cn/2026/10/06/Shebang%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    <published>2026-10-06T13:05:52.000Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>在计算领域中，Shebang（也称为Hashbang）是一个由井号和叹号构成的字符序列<code>#!</code>，位于脚本文件开头。类Unix系统直接执行脚本时，会根据它指定的程序启动解释器，并把脚本路径交给解释器。（<a href="/302.html?target=https://zh.wikipedia.org/wiki/Shebang">维基百科</a>）</p>]]>
    </summary>
    <title>【笔记】Shebang学习笔记</title>
    <updated>2026-10-11T15:02:42.652Z</updated>
  </entry>
  <entry>
    <author>
      <name>57uv6Z6g</name>
    </author>
    <category term="Github" scheme="https://loli.fj.cn/tags/Github/"/>
    <content>
      <![CDATA[<div id="toot-id" style="display: none">undefined</div><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>This package contains an OCR engine - libtesseract and a command line program - tesseract.（<a href="/302.html?target=https://github.com/tesseract-ocr/tesseract">Github</a>）</p><span id="more"></span><h2 id="下载依赖"><a href="#下载依赖" class="headerlink" title="下载依赖"></a>下载依赖</h2><blockquote><p><code>tesseract-lang</code>：全语言语言包</p></blockquote><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew install tesseract tesseract-lang</span><br></pre></td></tr></table></figure><h2 id="OCR识别图片"><a href="#OCR识别图片" class="headerlink" title="OCR识别图片"></a>OCR识别图片</h2><blockquote><p><code>-l &lt;language&gt;</code>：指定语言</p><blockquote><p><code>eng</code>：英语<br><code>chi_sim</code>：简体中文<br><code>chi_sim+eng</code>：简体中文和英语，简体中文是主要语言</p></blockquote></blockquote><blockquote><p><code>stdout</code>：输出到控制台</p></blockquote><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tesseract &lt;file_input&gt; stdout -l eng</span><br></pre></td></tr></table></figure><blockquote><p><code>./&lt;file_output_name&gt;</code>：输出到文件</p></blockquote><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tesseract &lt;file_input&gt; ./&lt;file_output_name&gt; -l eng</span><br></pre></td></tr></table></figure><h2 id="完成"><a href="#完成" class="headerlink" title="完成"></a>完成</h2>]]>
    </content>
    <id>https://loli.fj.cn/2026/10/06/tesseract%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</id>
    <link href="https://loli.fj.cn/2026/10/06/tesseract%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    <published>2026-10-06T04:25:59.000Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>This package contains an OCR engine - libtesseract and a command line program - tesseract.（<a href="/302.html?target=https://github.com/tesseract-ocr/tesseract">Github</a>）</p>]]>
    </summary>
    <title>【笔记】tesseract学习笔记</title>
    <updated>2026-10-11T15:02:42.686Z</updated>
  </entry>
  <entry>
    <author>
      <name>57uv6Z6g</name>
    </author>
    <category term="MacOS" scheme="https://loli.fj.cn/tags/MacOS/"/>
    <category term="SoftRouting" scheme="https://loli.fj.cn/tags/SoftRouting/"/>
    <category term="Tailscale" scheme="https://loli.fj.cn/tags/Tailscale/"/>
    <content>
      <![CDATA[<div id="toot-id" style="display: none">undefined</div><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>MacOS部署Tailscale作为网关</p><span id="more"></span><h2 id="MacOS加入到Tailscale网络"><a href="#MacOS加入到Tailscale网络" class="headerlink" title="MacOS加入到Tailscale网络"></a>MacOS加入到Tailscale网络</h2><p><a href="/2026/09/15/Tailscale%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0">传送门</a></p><h2 id="MacOS配置IP转发网路"><a href="#MacOS配置IP转发网路" class="headerlink" title="MacOS配置IP转发网路"></a>MacOS配置IP转发网路</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">tailscale set --advertise-routes=192.168.0.0/24</span><br></pre></td></tr></table></figure><h2 id="在Tailscale控制台中授权MacOS的IP转发网络"><a href="#在Tailscale控制台中授权MacOS的IP转发网络" class="headerlink" title="在Tailscale控制台中授权MacOS的IP转发网络"></a>在Tailscale控制台中授权MacOS的IP转发网络</h2><ul><li><p>访问Tailscale控制台<a href="https://console.tailscale.com/admin/machines">https://console.tailscale.com/admin/machines</a></p></li><li><p>打开MacOS设备菜单-&gt;<code>Edit route settings</code></p></li></ul><p><img src="/../images/20261004210054/01.webp"></p><ul><li>勾选配置的IP转发网络-&gt;<code>Save</code></li></ul><p><img src="/../images/20261004210054/02.webp"></p><h2 id="完成"><a href="#完成" class="headerlink" title="完成"></a>完成</h2>]]>
    </content>
    <id>https://loli.fj.cn/2026/10/04/MacOS%E9%83%A8%E7%BD%B2Tailscale%E4%BD%9C%E4%B8%BA%E7%BD%91%E5%85%B3/</id>
    <link href="https://loli.fj.cn/2026/10/04/MacOS%E9%83%A8%E7%BD%B2Tailscale%E4%BD%9C%E4%B8%BA%E7%BD%91%E5%85%B3/"/>
    <published>2026-10-04T13:00:54.000Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>MacOS部署Tailscale作为网关</p>]]>
    </summary>
    <title>【笔记】MacOS部署Tailscale作为网关</title>
    <updated>2026-10-11T15:02:42.625Z</updated>
  </entry>
  <entry>
    <author>
      <name>57uv6Z6g</name>
    </author>
    <category term="JavaScript" scheme="https://loli.fj.cn/tags/JavaScript/"/>
    <content>
      <![CDATA[<div id="toot-id" style="display: none">116298811198797842</div><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Vite是一个由尤雨溪编写的本地开发服务器。它被默认用于Vue和React的项目模板，支持TypeScript与JSX并在内部使用Rolldown进行打包构建。（<a href="/302.html?target=https://zh.wikipedia.org/wiki/Vite">维基百科</a>）</p><span id="more"></span><h2 id="下载依赖"><a href="#下载依赖" class="headerlink" title="下载依赖"></a>下载依赖</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install -D vite</span><br></pre></td></tr></table></figure><h2 id="基本命令"><a href="#基本命令" class="headerlink" title="基本命令"></a>基本命令</h2><h3 id="启动服务器"><a href="#启动服务器" class="headerlink" title="启动服务器"></a>启动服务器</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vite</span><br></pre></td></tr></table></figure><h3 id="打包"><a href="#打包" class="headerlink" title="打包"></a>打包</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vite build</span><br></pre></td></tr></table></figure><h3 id="打包并预览"><a href="#打包并预览" class="headerlink" title="打包并预览"></a>打包并预览</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vite preview</span><br></pre></td></tr></table></figure><h3 id="创建项目"><a href="#创建项目" class="headerlink" title="创建项目"></a>创建项目</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm create vite</span><br></pre></td></tr></table></figure><h2 id="配置文件"><a href="#配置文件" class="headerlink" title="配置文件"></a>配置文件</h2><figure class="highlight js"><figcaption><span>vite.config.js</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; defineConfig &#125; <span class="keyword">from</span> <span class="string">&quot;vite&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="title function_">defineConfig</span>(&#123;</span><br><span class="line">  <span class="attr">plugins</span>: []</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><ul><li>简写</li></ul><figure class="highlight js"><figcaption><span>vite.config.js</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> &#123;</span><br><span class="line">  <span class="attr">plugins</span>: []</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h2 id="打包JS文件"><a href="#打包JS文件" class="headerlink" title="打包JS文件"></a>打包JS文件</h2><ul><li>直接引入JS文件</li></ul><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> <span class="string">&quot;&lt;js_file_name&gt;&quot;</span>;</span><br></pre></td></tr></table></figure><h2 id="打包CSS文件"><a href="#打包CSS文件" class="headerlink" title="打包CSS文件"></a>打包CSS文件</h2><ul><li>直接引入CSS文件</li></ul><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> <span class="string">&quot;&lt;css_file_name&gt;&quot;</span>;</span><br></pre></td></tr></table></figure><h3 id="通过PostCSS转换CSS文件"><a href="#通过PostCSS转换CSS文件" class="headerlink" title="通过PostCSS转换CSS文件"></a>通过PostCSS转换CSS文件</h3><h4 id="下载依赖-1"><a href="#下载依赖-1" class="headerlink" title="下载依赖"></a>下载依赖</h4><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install -D postcss postcss-preset-env</span><br></pre></td></tr></table></figure><h2 id="打包Less文件"><a href="#打包Less文件" class="headerlink" title="打包Less文件"></a>打包Less文件</h2><h3 id="下载依赖-2"><a href="#下载依赖-2" class="headerlink" title="下载依赖"></a>下载依赖</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install -D less</span><br></pre></td></tr></table></figure><h3 id="引入Less"><a href="#引入Less" class="headerlink" title="引入Less"></a>引入Less</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> <span class="string">&quot;&lt;less_file_name&gt;&quot;</span>;</span><br></pre></td></tr></table></figure><h2 id="打包Vue文件"><a href="#打包Vue文件" class="headerlink" title="打包Vue文件"></a>打包Vue文件</h2><h3 id="Vue2"><a href="#Vue2" class="headerlink" title="Vue2"></a>Vue2</h3><h4 id="下载依赖-3"><a href="#下载依赖-3" class="headerlink" title="下载依赖"></a>下载依赖</h4><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install -D underfin/vue-plugin-vue2</span><br></pre></td></tr></table></figure><h4 id="修改配置文件"><a href="#修改配置文件" class="headerlink" title="修改配置文件"></a>修改配置文件</h4><figure class="highlight js"><figcaption><span>vite.config.js</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; defineConfig &#125; <span class="keyword">from</span> <span class="string">&quot;vite&quot;</span>;</span><br><span class="line"><span class="keyword">import</span> vue <span class="keyword">from</span> <span class="string">&quot;underfin/vue-plugin-vue2&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="title function_">defineConfig</span>(&#123;</span><br><span class="line">  <span class="attr">plugins</span>: [</span><br><span class="line">    <span class="title function_">vue</span>()</span><br><span class="line">  ]</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><h3 id="Vue3"><a href="#Vue3" class="headerlink" title="Vue3"></a>Vue3</h3><h4 id="下载依赖-4"><a href="#下载依赖-4" class="headerlink" title="下载依赖"></a>下载依赖</h4><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install -D @vitejs/plugin-vue</span><br></pre></td></tr></table></figure><h4 id="修改配置文件-1"><a href="#修改配置文件-1" class="headerlink" title="修改配置文件"></a>修改配置文件</h4><figure class="highlight js"><figcaption><span>vite.config.js</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; defineConfig &#125; <span class="keyword">from</span> <span class="string">&quot;vite&quot;</span>;</span><br><span class="line"><span class="keyword">import</span> vue <span class="keyword">from</span> <span class="string">&quot;@vitejs/plugin-vue&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="title function_">defineConfig</span>(&#123;</span><br><span class="line">  <span class="attr">plugins</span>: [</span><br><span class="line">    <span class="title function_">vue</span>()</span><br><span class="line">  ]</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><h3 id="Vue3-JSX"><a href="#Vue3-JSX" class="headerlink" title="Vue3 JSX"></a>Vue3 JSX</h3><h4 id="下载依赖-5"><a href="#下载依赖-5" class="headerlink" title="下载依赖"></a>下载依赖</h4><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install -D @vitejs/plugin-vue-jsx</span><br></pre></td></tr></table></figure><h4 id="修改配置文件-2"><a href="#修改配置文件-2" class="headerlink" title="修改配置文件"></a>修改配置文件</h4><figure class="highlight js"><figcaption><span>vite.config.js</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; defineConfig &#125; <span class="keyword">from</span> <span class="string">&quot;vite&quot;</span>;</span><br><span class="line"><span class="keyword">import</span> vue <span class="keyword">from</span> <span class="string">&quot;@vitejs/plugin-vue-jsx&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> <span class="title function_">defineConfig</span>(&#123;</span><br><span class="line">  <span class="attr">plugins</span>: [</span><br><span class="line">    <span class="title function_">vue</span>()</span><br><span class="line">  ]</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><h2 id="完成"><a href="#完成" class="headerlink" title="完成"></a>完成</h2>]]>
    </content>
    <id>https://loli.fj.cn/2026/09/27/Vite%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</id>
    <link href="https://loli.fj.cn/2026/09/27/Vite%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    <published>2026-09-27T23:32:36.000Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Vite是一个由尤雨溪编写的本地开发服务器。它被默认用于Vue和React的项目模板，支持TypeScript与JSX并在内部使用Rolldown进行打包构建。（<a href="/302.html?target=https://zh.wikipedia.org/wiki/Vite">维基百科</a>）</p>]]>
    </summary>
    <title>【笔记】Vite学习笔记</title>
    <updated>2026-10-11T15:02:42.666Z</updated>
  </entry>
  <entry>
    <author>
      <name>57uv6Z6g</name>
    </author>
    <category term="Github" scheme="https://loli.fj.cn/tags/Github/"/>
    <category term="Tailscale" scheme="https://loli.fj.cn/tags/Tailscale/"/>
    <content>
      <![CDATA[<div id="toot-id" style="display: none">undefined</div><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>womprat is a portable Windows (ARM64 and Intel) SSH terminal, browser, VNC viewer, and RDP viewer for your tailnet.（<a href="/302.html?target=https://github.com/rcarmo/womprat">Github</a>）</p><p>Windows上通过<a href="https://github.com/rcarmo/womprat">rcarmo&#x2F;womprat</a>实现临时加入Tailscale网络</p><span id="more"></span><h2 id="下载依赖"><a href="#下载依赖" class="headerlink" title="下载依赖"></a>下载依赖</h2><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">certutil -urlcache -split -f https://github.com/rcarmo/womprat/releases/download/v0.<span class="number">3</span>.<span class="number">2</span>/womprat-windows-amd64.exe</span><br></pre></td></tr></table></figure><h2 id="获取登录密钥"><a href="#获取登录密钥" class="headerlink" title="获取登录密钥"></a>获取登录密钥</h2><ul><li>访问<a href="https://console.tailscale.com/admin/settings/keys">Keys设置页面</a>-&gt;<code>Generate auth key</code></li></ul><p><img src="/../images/20260916054330/01.webp"></p><ul><li>填写<code>Description</code>-&gt;勾选<code>Reusable</code>允许反复使用-&gt;<code>Generate key</code></li></ul><p><img src="/../images/20260916054330/02.webp"></p><ul><li>复制密钥-&gt;<code>Done</code></li></ul><p><img src="/../images/20260916054330/03.webp"></p><h2 id="启动womprat"><a href="#启动womprat" class="headerlink" title="启动womprat"></a>启动womprat</h2><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">.\womprat-windows-amd64.exe</span><br></pre></td></tr></table></figure><h2 id="首次启动"><a href="#首次启动" class="headerlink" title="首次启动"></a>首次启动</h2><ul><li>首次进入需要输入上一步骤获取的密钥（密钥信息会存储在<code>%AppData%\womprat</code>，以后无需再次输入密钥）-&gt;<code>Connect</code></li></ul><p><img src="/../images/20260916054330/04.webp"></p><h2 id="建立SSH连接"><a href="#建立SSH连接" class="headerlink" title="建立SSH连接"></a>建立SSH连接</h2><ul><li>输入<code>ssh://&lt;username&gt;@&lt;ip&gt;:22</code>-&gt;<code>Go</code>建立远程连接</li></ul><p><img src="/../images/20260916054330/05.webp"></p><h2 id="完成"><a href="#完成" class="headerlink" title="完成"></a>完成</h2><ul><li>截图纪念</li></ul><p><img src="/../images/20260916054330/06.webp"></p>]]>
    </content>
    <id>https://loli.fj.cn/2026/09/15/womprat%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</id>
    <link href="https://loli.fj.cn/2026/09/15/womprat%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    <published>2026-09-15T21:43:30.000Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>womprat is a portable Windows (ARM64 and Intel) SSH terminal, browser, VNC viewer, and RDP viewer for your tailnet.（<a href="/302.html?target=https://github.com/rcarmo/womprat">Github</a>）</p>
<p>Windows上通过<a href="https://github.com/rcarmo/womprat">rcarmo&#x2F;womprat</a>实现临时加入Tailscale网络</p>]]>
    </summary>
    <title>【笔记】womprat学习笔记</title>
    <updated>2026-10-11T15:02:42.686Z</updated>
  </entry>
  <entry>
    <author>
      <name>57uv6Z6g</name>
    </author>
    <category term="Tailscale" scheme="https://loli.fj.cn/tags/Tailscale/"/>
    <content>
      <![CDATA[<div id="toot-id" style="display: none">undefined</div><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Tailscale Inc. is a software company based in Toronto, Ontario. Tailscale develops an open-source software-defined mesh virtual private network (VPN) and a web-based management service. The company provides a zero config VPN as a service under the same name.</p><span id="more"></span><h2 id="下载依赖"><a href="#下载依赖" class="headerlink" title="下载依赖"></a>下载依赖</h2><h3 id="MacOS"><a href="#MacOS" class="headerlink" title="MacOS"></a>MacOS</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew install tailscale</span><br></pre></td></tr></table></figure><h2 id="启动服务"><a href="#启动服务" class="headerlink" title="启动服务"></a>启动服务</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo brew services start tailscale</span><br></pre></td></tr></table></figure><h2 id="登录"><a href="#登录" class="headerlink" title="登录"></a>登录</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo tailscale up</span><br></pre></td></tr></table></figure><h2 id="完成"><a href="#完成" class="headerlink" title="完成"></a>完成</h2>]]>
    </content>
    <id>https://loli.fj.cn/2026/09/15/Tailscale%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</id>
    <link href="https://loli.fj.cn/2026/09/15/Tailscale%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    <published>2026-09-15T07:30:18.000Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Tailscale Inc. is a software company based in Toronto, Ontario. Tailscale develops an open-source software-defined mesh virtual private network (VPN) and a web-based management service. The company provides a zero config VPN as a service under the same name.</p>]]>
    </summary>
    <title>【笔记】Tailscale学习笔记</title>
    <updated>2026-10-11T15:02:42.661Z</updated>
  </entry>
  <entry>
    <author>
      <name>57uv6Z6g</name>
    </author>
    <category term="RustDesk" scheme="https://loli.fj.cn/tags/RustDesk/"/>
    <content>
      <![CDATA[<div id="toot-id" style="display: none">undefined</div><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Debian上部署RustDesk中继服务器</p><span id="more"></span><h2 id="下载依赖"><a href="#下载依赖" class="headerlink" title="下载依赖"></a>下载依赖</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wget https://github.com/rustdesk/rustdesk-server/releases/download/1.1.6-2/rustdesk-server-hbbr_1.1.6_amd64.deb https://github.com/rustdesk/rustdesk-server/releases/download/1.1.6-2/rustdesk-server-hbbs_1.1.6_amd64.deb</span><br></pre></td></tr></table></figure><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">dpkg -i rustdesk-server-hbbr_1.1.6_amd64.deb rustdesk-server-hbbs_1.1.6_amd64.deb</span><br></pre></td></tr></table></figure><h2 id="部署hbbr中继服务器"><a href="#部署hbbr中继服务器" class="headerlink" title="部署hbbr中继服务器"></a>部署hbbr中继服务器</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hbbr</span><br></pre></td></tr></table></figure><h2 id="部署hbbs信令服务器"><a href="#部署hbbs信令服务器" class="headerlink" title="部署hbbs信令服务器"></a>部署hbbs信令服务器</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hbbs -r &lt;ip&gt;:21117</span><br></pre></td></tr></table></figure><ul><li>从服务器日志中获取Key</li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">INFO [src/rendezvous_server.rs:1243] Key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</span><br></pre></td></tr></table></figure><ul><li>从服务器文件中获取Key</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat id_ed25519.pub</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</span><br></pre></td></tr></table></figure><h2 id="完成"><a href="#完成" class="headerlink" title="完成"></a>完成</h2>]]>
    </content>
    <id>https://loli.fj.cn/2026/09/14/%E9%83%A8%E7%BD%B2RustDesk%E4%B8%AD%E7%BB%A7%E6%9C%8D%E5%8A%A1%E5%99%A8/</id>
    <link href="https://loli.fj.cn/2026/09/14/%E9%83%A8%E7%BD%B2RustDesk%E4%B8%AD%E7%BB%A7%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    <published>2026-09-14T22:13:04.000Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Debian上部署RustDesk中继服务器</p>]]>
    </summary>
    <title>【笔记】部署RustDesk中继服务器</title>
    <updated>2026-10-11T15:02:42.725Z</updated>
  </entry>
  <entry>
    <author>
      <name>57uv6Z6g</name>
    </author>
    <category term="Github" scheme="https://loli.fj.cn/tags/Github/"/>
    <content>
      <![CDATA[<div id="toot-id" style="display: none">undefined</div><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Sub2API 是一个 AI API 网关平台，用于分发和管理 AI 产品订阅的 API 配额。用户通过平台生成的 API Key 调用上游 AI 服务，平台负责鉴权、计费、负载均衡和请求转发。（<a href="/302.html?target=https://github.com/Wei-Shaw/sub2api/blob/main/README_CN.md">Github</a>）</p><span id="more"></span><h2 id="部署Sub2API"><a href="#部署Sub2API" class="headerlink" title="部署Sub2API"></a>部署Sub2API</h2><h3 id="Windows"><a href="#Windows" class="headerlink" title="Windows"></a>Windows</h3><h4 id="下载项目"><a href="#下载项目" class="headerlink" title="下载项目"></a>下载项目</h4><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">certutil -urlcache -split -f https://github.com/Wei-Shaw/sub2api/releases/download/v0.<span class="number">2</span>.<span class="number">0</span>/sub2api_0.<span class="number">2</span>.<span class="number">0</span>_windows_amd64.zip</span><br><span class="line">&quot;C:\Program Files\<span class="number">7</span>-Zip\<span class="number">7</span>z.exe&quot; x sub2api_0.<span class="number">2</span>.<span class="number">0</span>_windows_amd64.zip -osub2api</span><br><span class="line"><span class="built_in">cd</span> sub2api</span><br></pre></td></tr></table></figure><h4 id="启动服务"><a href="#启动服务" class="headerlink" title="启动服务"></a>启动服务</h4><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">SET</span> TZ=UTC</span><br><span class="line">.\sub2api.exe</span><br></pre></td></tr></table></figure><h4 id="首次登录"><a href="#首次登录" class="headerlink" title="首次登录"></a>首次登录</h4><ul><li>访问<a href="http://127.0.0.1:8080/">http://127.0.0.1:8080</a>-&gt;进入初始化页面</li></ul><h3 id="Docker"><a href="#Docker" class="headerlink" title="Docker"></a>Docker</h3><h4 id="下载项目-1"><a href="#下载项目-1" class="headerlink" title="下载项目"></a>下载项目</h4><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git clone https://github.com/Wei-Shaw/sub2api.git</span><br><span class="line">cd sub2api/deploy</span><br></pre></td></tr></table></figure><h4 id="修改配置文件"><a href="#修改配置文件" class="headerlink" title="修改配置文件"></a>修改配置文件</h4><ul><li>复制默认配置文件</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cp .env.example .env</span><br></pre></td></tr></table></figure><ul><li>生成密钥</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl rand -hex 32</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</span><br></pre></td></tr></table></figure><ul><li>修改配置文件</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">PostgreSQL password (REQUIRED)</span></span><br><span class="line">POSTGRES_PASSWORD=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">JWT Secret (RECOMMENDED - keeps <span class="built_in">users</span> logged <span class="keyword">in</span> after restart)</span></span><br><span class="line">JWT_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">TOTP Encryption Key (RECOMMENDED - preserves 2FA after restart)</span></span><br><span class="line">TOTP_ENCRYPTION_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">Optional: Admin account</span></span><br><span class="line">ADMIN_EMAIL=admin@example.com</span><br><span class="line">ADMIN_PASSWORD=</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">Optional: Custom port</span></span><br><span class="line">SERVER_PORT=8080</span><br></pre></td></tr></table></figure><h4 id="创建数据目录"><a href="#创建数据目录" class="headerlink" title="创建数据目录"></a>创建数据目录</h4><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mkdir -p data postgres_data redis_data</span><br></pre></td></tr></table></figure><h4 id="启动服务-1"><a href="#启动服务-1" class="headerlink" title="启动服务"></a>启动服务</h4><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker compose -f docker-compose.local.yml up -d</span><br></pre></td></tr></table></figure><h4 id="获取初始密码"><a href="#获取初始密码" class="headerlink" title="获取初始密码"></a>获取初始密码</h4><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker compose -f docker-compose.local.yml logs sub2api | grep &quot;admin password&quot;</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</span><br></pre></td></tr></table></figure><h4 id="首次登录-1"><a href="#首次登录-1" class="headerlink" title="首次登录"></a>首次登录</h4><ul><li>访问<a href="http://127.0.0.1:8080/">http://127.0.0.1:8080</a>-&gt;使用初始密码登录</li></ul><blockquote><p>邮箱：<code>admin@example.com</code><br>密码：上一步骤获取的初始密码</p></blockquote><p><img src="/../images/20260903081356/01.webp"></p><h2 id="Sub2API账号配置"><a href="#Sub2API账号配置" class="headerlink" title="Sub2API账号配置"></a>Sub2API账号配置</h2><h3 id="订阅账号"><a href="#订阅账号" class="headerlink" title="订阅账号"></a>订阅账号</h3><h4 id="配置分组"><a href="#配置分组" class="headerlink" title="配置分组"></a>配置分组</h4><ul><li><code>分组管理</code>-&gt;<code>创建分组</code></li></ul><p><img src="/../images/20260903081356/03.webp"></p><ul><li>设置<code>名称</code>-&gt;设置<code>平台</code>-&gt;设置<code>计费类型</code>为<code>订阅（配额）</code>-&gt;<code>创建</code></li></ul><p><img src="/../images/20260903081356/04.webp"></p><h4 id="配置订阅"><a href="#配置订阅" class="headerlink" title="配置订阅"></a>配置订阅</h4><ul><li><code>订阅管理</code>-&gt;<code>分配订阅</code></li></ul><p><img src="/../images/20260903081356/05.webp"></p><ul><li>配置订阅时长</li></ul><p><img src="/../images/20260903081356/06.webp"></p><h3 id="按量计费账号"><a href="#按量计费账号" class="headerlink" title="按量计费账号"></a>按量计费账号</h3><h4 id="配置分组-1"><a href="#配置分组-1" class="headerlink" title="配置分组"></a>配置分组</h4><ul><li><code>分组管理</code>-&gt;<code>创建分组</code></li></ul><p><img src="/../images/20260903081356/03.webp"></p><ul><li>设置<code>名称</code>-&gt;设置<code>平台</code>-&gt;设置<code>计费类型</code>为<code>标准（余额）</code>-&gt;<code>创建</code></li></ul><p><img src="/../images/20260903081356/07.webp"></p><h4 id="充值余额"><a href="#充值余额" class="headerlink" title="充值余额"></a>充值余额</h4><ul><li><code>用户管理</code>-&gt;<code>更多</code>-&gt;<code>充值</code></li></ul><p><img src="/../images/20260903081356/08.webp"></p><ul><li>配置<code>充值余额</code>-&gt;<code>确认</code></li></ul><p><img src="/../images/20260903081356/09.webp"></p><h2 id="大模型平台账号配置"><a href="#大模型平台账号配置" class="headerlink" title="大模型平台账号配置"></a>大模型平台账号配置</h2><h3 id="配置代理（可选）"><a href="#配置代理（可选）" class="headerlink" title="配置代理（可选）"></a>配置代理（可选）</h3><ul><li><code>IP管理</code>-&gt;<code>添加代理</code></li></ul><p><img src="/../images/20260903081356/10.webp"></p><ul><li>配置代理-&gt;<code>创建</code></li></ul><p><img src="/../images/20260903081356/11.webp"></p><h3 id="配置账号"><a href="#配置账号" class="headerlink" title="配置账号"></a>配置账号</h3><h4 id="OpenAI"><a href="#OpenAI" class="headerlink" title="OpenAI"></a>OpenAI</h4><h5 id="Plus账号登录"><a href="#Plus账号登录" class="headerlink" title="Plus账号登录"></a>Plus账号登录</h5><ul><li><code>账号管理</code>-&gt;<code>添加账号</code></li></ul><p><img src="/../images/20260903081356/12.webp"></p><ul><li>定义账号名称</li></ul><p><img src="/../images/20260903081356/13.webp"></p><ul><li><code>平台</code>选择<code>OpenAI</code>-&gt;<code>账号类型</code>选择<code>OAuth</code></li></ul><p><img src="/../images/20260903081356/14.webp"></p><ul><li>选择代理（可选）</li></ul><p><img src="/../images/20260903081356/15.webp"></p><ul><li>选择分组-&gt;<code>下一步</code></li></ul><p><img src="/../images/20260903081356/16.webp"></p><ul><li><code>生成授权链接</code></li></ul><p><img src="/../images/20260903081356/17.webp"></p><ul><li>访问授权链接-&gt;回填授权成功的回调链接-&gt;<code>完成授权</code></li></ul><p><img src="/../images/20260903081356/18.webp"></p><h5 id="API密钥"><a href="#API密钥" class="headerlink" title="API密钥"></a>API密钥</h5><ul><li><code>账号管理</code>-&gt;<code>添加账号</code></li></ul><p><img src="/../images/20260903081356/12.webp"></p><ul><li>定义账号名称</li></ul><p><img src="/../images/20260903081356/13.webp"></p><ul><li><code>平台</code>选择<code>OpenAI</code>-&gt;<code>账号类型</code>选择<code>API Key</code></li></ul><p><img src="/../images/20260903081356/19.webp"></p><ul><li>选择分组-&gt;<code>创建</code></li></ul><p><img src="/../images/20260903081356/20.webp"></p><h2 id="生成API密钥"><a href="#生成API密钥" class="headerlink" title="生成API密钥"></a>生成API密钥</h2><ul><li><code>API密钥</code>-&gt;<code>创建密钥</code></li></ul><p><img src="/../images/20260903081356/21.webp"></p><ul><li>定义密钥名称-&gt;选择密钥分组-&gt;<code>创建</code></li></ul><p><img src="/../images/20260903081356/22.webp"></p><ul><li>在其他支持OpenAI兼容的提供商时，使用当前URL作为提供商，使用当前API密钥作为密钥</li></ul><h2 id="完成"><a href="#完成" class="headerlink" title="完成"></a>完成</h2><ul><li>截图纪念</li></ul><p><img src="/../images/20260903081356/02.webp"></p>]]>
    </content>
    <id>https://loli.fj.cn/2026/09/03/%E9%83%A8%E7%BD%B2Sub2API/</id>
    <link href="https://loli.fj.cn/2026/09/03/%E9%83%A8%E7%BD%B2Sub2API/"/>
    <published>2026-09-03T00:13:56.000Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Sub2API 是一个 AI API 网关平台，用于分发和管理 AI 产品订阅的 API 配额。用户通过平台生成的 API Key 调用上游 AI 服务，平台负责鉴权、计费、负载均衡和请求转发。（<a href="/302.html?target=https://github.com/Wei-Shaw/sub2api/blob/main/README_CN.md">Github</a>）</p>]]>
    </summary>
    <title>【笔记】Sub2API学习笔记</title>
    <updated>2026-10-11T15:02:42.725Z</updated>
  </entry>
  <entry>
    <author>
      <name>57uv6Z6g</name>
    </author>
    <content>
      <![CDATA[<div id="toot-id" style="display: none">undefined</div><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Git排除学习笔记</p><span id="more"></span><h2 id="将排除配置上传到Git仓库"><a href="#将排除配置上传到Git仓库" class="headerlink" title="将排除配置上传到Git仓库"></a>将排除配置上传到Git仓库</h2><figure class="highlight text"><figcaption><span>.gitignore</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">dist/</span><br></pre></td></tr></table></figure><h2 id="本地排除配置"><a href="#本地排除配置" class="headerlink" title="本地排除配置"></a>本地排除配置</h2><figure class="highlight text"><figcaption><span>.git/info/exclude</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">dist/</span><br></pre></td></tr></table></figure><h2 id="完成"><a href="#完成" class="headerlink" title="完成"></a>完成</h2>]]>
    </content>
    <id>https://loli.fj.cn/2026/09/02/Git%E6%8E%92%E9%99%A4/</id>
    <link href="https://loli.fj.cn/2026/09/02/Git%E6%8E%92%E9%99%A4/"/>
    <published>2026-09-02T22:18:36.000Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Git排除学习笔记</p>]]>
    </summary>
    <title>【笔记】Git排除</title>
    <updated>2026-10-11T15:02:42.586Z</updated>
  </entry>
  <entry>
    <author>
      <name>57uv6Z6g</name>
    </author>
    <category term="HTML" scheme="https://loli.fj.cn/tags/HTML/"/>
    <category term="Markdown" scheme="https://loli.fj.cn/tags/Markdown/"/>
    <content>
      <![CDATA[<div id="toot-id" style="display: none">undefined</div><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Mermaid is an open-source JavaScript-based diagramming and charting software that generates diagrams from text-based descriptions.（<a href="/302.html?target=https://en.wikipedia.org/wiki/Mermaid_(software)">维基百科</a>）</p><span id="more"></span><h2 id="在Markdown中使用Mermaid"><a href="#在Markdown中使用Mermaid" class="headerlink" title="在Markdown中使用Mermaid"></a>在Markdown中使用Mermaid</h2><h3 id="流程图"><a href="#流程图" class="headerlink" title="流程图"></a>流程图</h3><pre>&#96&#96&#96mermaidgraph TD  Collection --> List  Collection --> Set  Collection --> Map&#96&#96&#96</pre><pre class="mermaid">graph TD  Collection --> List  Collection --> Set  Collection --> Map</pre><h4 id="自定义样式"><a href="#自定义样式" class="headerlink" title="自定义样式"></a>自定义样式</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">graph TD</span><br><span class="line">  Collection --&gt; List</span><br><span class="line">  Collection --&gt; Set</span><br><span class="line">  Collection --&gt; Map</span><br><span class="line"></span><br><span class="line">  style Collection fill:#f0f8ff,stroke:#696969;</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">graph TD</span><br><span class="line">  Collection --&gt; List</span><br><span class="line">  Collection --&gt; Set</span><br><span class="line">  Collection --&gt; Map</span><br><span class="line"></span><br><span class="line">  classDef important fill:#f0f8ff,stroke:#696969;</span><br><span class="line">  class List,Set,Map important;</span><br></pre></td></tr></table></figure><h4 id="超链接"><a href="#超链接" class="headerlink" title="超链接"></a>超链接</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">graph TD</span><br><span class="line">  Collection --&gt; List</span><br><span class="line">  Collection --&gt; Set</span><br><span class="line">  Collection --&gt; Map</span><br><span class="line"></span><br><span class="line">  click Collection href &quot;https://example.com/&quot; &quot;提示&quot;;</span><br></pre></td></tr></table></figure><h2 id="在HTML中使用Mermaid"><a href="#在HTML中使用Mermaid" class="headerlink" title="在HTML中使用Mermaid"></a>在HTML中使用Mermaid</h2><ul><li>Mermaid会自动渲染<code>class=&quot;mermaid&quot;</code>的元素</li></ul><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://unpkg.com/mermaid@10/dist/mermaid.min.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;mermaid&quot;</span>&gt;</span></span><br><span class="line">  graph TD</span><br><span class="line">    Collection --&gt; List</span><br><span class="line">    Collection --&gt; Set</span><br><span class="line">    Collection --&gt; Map</span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="手动渲染元素"><a href="#手动渲染元素" class="headerlink" title="手动渲染元素"></a>手动渲染元素</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://unpkg.com/mermaid@10/dist/mermaid.min.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;app&quot;</span>&gt;</span></span><br><span class="line">  graph TD</span><br><span class="line">    Collection --&gt; List</span><br><span class="line">    Collection --&gt; Set</span><br><span class="line">    Collection --&gt; Map</span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">  mermaid.<span class="title function_">initialize</span>(&#123; <span class="attr">startOnLoad</span>: <span class="literal">false</span> &#125;);</span></span><br><span class="line"><span class="language-javascript">  mermaid.<span class="title function_">run</span>(&#123;</span></span><br><span class="line"><span class="language-javascript">    <span class="attr">nodes</span>: [<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;app&quot;</span>)],</span></span><br><span class="line"><span class="language-javascript">  &#125;).<span class="title function_">then</span>(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span></span><br><span class="line"><span class="language-javascript">    <span class="variable language_">console</span>.<span class="title function_">log</span>();</span></span><br><span class="line"><span class="language-javascript">  &#125;).<span class="title function_">catch</span>(<span class="keyword">function</span> (<span class="params">err</span>) &#123;</span></span><br><span class="line"><span class="language-javascript">    <span class="variable language_">console</span>.<span class="title function_">log</span>(err);</span></span><br><span class="line"><span class="language-javascript">  &#125;);</span></span><br><span class="line"><span class="language-javascript"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><h2 id="完成"><a href="#完成" class="headerlink" title="完成"></a>完成</h2><h2 id="参考文献"><a href="#参考文献" class="headerlink" title="参考文献"></a>参考文献</h2><p><a href="https://mermaid.js.org/intro/">Mermaid官方文档</a></p><script type="module"> import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.esm.min.mjs';mermaid.initialize({startOnLoad: true, flowchart: {curve: 'linear'}}); </script>]]>
    </content>
    <id>https://loli.fj.cn/2026/08/26/Mermaid%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</id>
    <link href="https://loli.fj.cn/2026/08/26/Mermaid%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    <published>2026-08-26T03:47:50.000Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Mermaid is an open-source JavaScript-based diagramming and charting software that generates diagrams from text-based descriptions.（<a href="/302.html?target=https://en.wikipedia.org/wiki/Mermaid_(software)">维基百科</a>）</p>]]>
    </summary>
    <title>【笔记】Mermaid学习笔记</title>
    <updated>2026-10-11T15:02:42.626Z</updated>
  </entry>
  <entry>
    <author>
      <name>57uv6Z6g</name>
    </author>
    <category term="JavaScript" scheme="https://loli.fj.cn/tags/JavaScript/"/>
    <category term="Nodejs" scheme="https://loli.fj.cn/tags/Nodejs/"/>
    <category term="Rollup" scheme="https://loli.fj.cn/tags/Rollup/"/>
    <content>
      <![CDATA[<div id="toot-id" style="display: none">undefined</div><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Rollup通过PluginReplace插件实现打包时注入环境变量</p><span id="more"></span><h2 id="下载依赖"><a href="#下载依赖" class="headerlink" title="下载依赖"></a>下载依赖</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install -D @rollup/plugin-replace</span><br></pre></td></tr></table></figure><h2 id="配置文件中使用环境变量"><a href="#配置文件中使用环境变量" class="headerlink" title="配置文件中使用环境变量"></a>配置文件中使用环境变量</h2><figure class="highlight js"><figcaption><span>rollup.config.js</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(process.<span class="property">env</span>.<span class="property">NODE_ENV</span>);</span><br></pre></td></tr></table></figure><h2 id="打包时注入环境变量"><a href="#打包时注入环境变量" class="headerlink" title="打包时注入环境变量"></a>打包时注入环境变量</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rollup -c --environment NODE_ENV:development</span><br></pre></td></tr></table></figure><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rollup -c --environment NODE_ENV:production</span><br></pre></td></tr></table></figure><h2 id="完成"><a href="#完成" class="headerlink" title="完成"></a>完成</h2>]]>
    </content>
    <id>https://loli.fj.cn/2026/08/25/Rollup%E7%9A%84PluginReplace%E6%8F%92%E4%BB%B6/</id>
    <link href="https://loli.fj.cn/2026/08/25/Rollup%E7%9A%84PluginReplace%E6%8F%92%E4%BB%B6/"/>
    <published>2026-08-25T17:35:06.000Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Rollup通过PluginReplace插件实现打包时注入环境变量</p>]]>
    </summary>
    <title>【笔记】Rollup的PluginReplace插件</title>
    <updated>2026-10-11T15:02:42.648Z</updated>
  </entry>
  <entry>
    <author>
      <name>57uv6Z6g</name>
    </author>
    <category term="JavaScript" scheme="https://loli.fj.cn/tags/JavaScript/"/>
    <category term="Nodejs" scheme="https://loli.fj.cn/tags/Nodejs/"/>
    <category term="Rollup" scheme="https://loli.fj.cn/tags/Rollup/"/>
    <content>
      <![CDATA[<div id="toot-id" style="display: none">undefined</div><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Rollup通过RollupPluginLiveReload插件实现自动打包</p><span id="more"></span><h2 id="下载依赖"><a href="#下载依赖" class="headerlink" title="下载依赖"></a>下载依赖</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install -D rollup-plugin-livereload</span><br></pre></td></tr></table></figure><h2 id="修改配置文件"><a href="#修改配置文件" class="headerlink" title="修改配置文件"></a>修改配置文件</h2><figure class="highlight js"><figcaption><span>rollup.config.js</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> liveReload = <span class="built_in">require</span>(<span class="string">&quot;rollup-plugin-livereload&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="variable language_">module</span>.<span class="property">exports</span> = &#123;</span><br><span class="line">  <span class="attr">plugins</span>: [</span><br><span class="line">    <span class="title function_">liveReload</span>()</span><br><span class="line">  ]</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h2 id="自动打包"><a href="#自动打包" class="headerlink" title="自动打包"></a>自动打包</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rollup -c -w</span><br></pre></td></tr></table></figure><h2 id="完成"><a href="#完成" class="headerlink" title="完成"></a>完成</h2>]]>
    </content>
    <id>https://loli.fj.cn/2026/08/25/Rollup%E7%9A%84RollupPluginLiveReload%E6%8F%92%E4%BB%B6/</id>
    <link href="https://loli.fj.cn/2026/08/25/Rollup%E7%9A%84RollupPluginLiveReload%E6%8F%92%E4%BB%B6/"/>
    <published>2026-08-25T17:29:46.000Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Rollup通过RollupPluginLiveReload插件实现自动打包</p>]]>
    </summary>
    <title>【笔记】Rollup的RollupPluginLiveReload插件</title>
    <updated>2026-10-11T15:02:42.648Z</updated>
  </entry>
  <entry>
    <author>
      <name>57uv6Z6g</name>
    </author>
    <category term="Windows" scheme="https://loli.fj.cn/tags/Windows/"/>
    <content>
      <![CDATA[<div id="toot-id" style="display: none">undefined</div><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>WPS更换会员图标</p><span id="more"></span><h2 id="Windows"><a href="#Windows" class="headerlink" title="Windows"></a>Windows</h2><ul><li>右键<code>WPS</code>-&gt;<code>属性</code>-&gt;<code>更改图标</code>-&gt;<code>%LocalAppData%\Kingsoft\WPS Office\版本号\office6\wpsofficeicon.dll</code>-&gt;选择会员图标-&gt;<code>确定</code>-&gt;<code>确定</code></li></ul><p><img src="/../images/20260826012315/01.webp"></p><h2 id="完成"><a href="#完成" class="headerlink" title="完成"></a>完成</h2>]]>
    </content>
    <id>https://loli.fj.cn/2026/08/25/WPS%E6%9B%B4%E6%8D%A2%E4%BC%9A%E5%91%98%E5%9B%BE%E6%A0%87/</id>
    <link href="https://loli.fj.cn/2026/08/25/WPS%E6%9B%B4%E6%8D%A2%E4%BC%9A%E5%91%98%E5%9B%BE%E6%A0%87/"/>
    <published>2026-08-25T17:23:15.000Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>WPS更换会员图标</p>]]>
    </summary>
    <title>【笔记】WPS更换会员图标</title>
    <updated>2026-10-11T15:02:42.667Z</updated>
  </entry>
  <entry>
    <author>
      <name>57uv6Z6g</name>
    </author>
    <category term="Java" scheme="https://loli.fj.cn/tags/Java/"/>
    <content>
      <![CDATA[<div id="toot-id" style="display: none">undefined</div><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Java的单例模式最佳实践</p><span id="more"></span><h2 id="getInstance"><a href="#getInstance" class="headerlink" title="getInstance()"></a>getInstance()</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Singleton</span> <span class="keyword">implements</span> <span class="title class_">Serializable</span> &#123;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">long</span> <span class="variable">serialVersionUID</span> <span class="operator">=</span> <span class="number">1L</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class</span> <span class="title class_">Holder</span> &#123;</span><br><span class="line">        <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">Singleton</span> <span class="variable">INSTANCE</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Singleton</span>();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="type">private</span> <span class="title function_">Singleton</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="comment">// 防反射攻击：第二次调用构造器时抛异常</span></span><br><span class="line">        <span class="keyword">if</span> (Holder.INSTANCE != <span class="literal">null</span>) &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">IllegalStateException</span>(<span class="string">&quot;单例已存在，禁止反射创建&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 防序列化破坏</span></span><br><span class="line">    <span class="keyword">protected</span> <span class="type">Object</span> <span class="title function_">readResolve</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> Holder.INSTANCE;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">Singleton</span> <span class="title function_">getInstance</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> Holder.INSTANCE;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="type">void</span> <span class="title function_">method</span><span class="params">()</span> &#123;</span><br><span class="line">        System.out.println();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 调用方式</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Client</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        Singleton.getInstance().method();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="INSTANCE"><a href="#INSTANCE" class="headerlink" title="INSTANCE"></a>INSTANCE</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">enum</span> <span class="title class_">Singleton</span> &#123;</span><br><span class="line">    INSTANCE;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 可选的业务字段</span></span><br><span class="line">    <span class="keyword">private</span> String config;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="type">void</span> <span class="title function_">init</span><span class="params">(String config)</span> &#123;</span><br><span class="line">        <span class="built_in">this</span>.config = config;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">Singleton</span> <span class="title function_">getInstance</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> INSTANCE;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="type">void</span> <span class="title function_">method</span><span class="params">()</span> &#123;</span><br><span class="line">        System.out.println();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 调用方式</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Client</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        Singleton.INSTANCE.init(<span class="string">&quot;production&quot;</span>);</span><br><span class="line">        Singleton.INSTANCE.method();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="完成"><a href="#完成" class="headerlink" title="完成"></a>完成</h2>]]>
    </content>
    <id>https://loli.fj.cn/2026/08/20/Java%E7%9A%84%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5/</id>
    <link href="https://loli.fj.cn/2026/08/20/Java%E7%9A%84%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5/"/>
    <published>2026-08-20T22:43:48.000Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Java的单例模式最佳实践</p>]]>
    </summary>
    <title>【笔记】Java的单例模式最佳实践</title>
    <updated>2026-10-11T15:02:42.609Z</updated>
  </entry>
  <entry>
    <author>
      <name>57uv6Z6g</name>
    </author>
    <category term="Database" scheme="https://loli.fj.cn/tags/Database/"/>
    <category term="PostgreSQL" scheme="https://loli.fj.cn/tags/PostgreSQL/"/>
    <content>
      <![CDATA[<div id="toot-id" style="display: none">undefined</div><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>PostgreSQL忘记密码</p><span id="more"></span><h2 id="修改配置文件"><a href="#修改配置文件" class="headerlink" title="修改配置文件"></a>修改配置文件</h2><ul><li>将密码校验方式改为无密码校验</li></ul><figure class="highlight plaintext"><figcaption><span>PostgreSQL/18/data/pg_hba.conf</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">#local   all             all                                     scram-sha-256</span><br><span class="line">local   all             all                                     trust</span><br><span class="line"></span><br><span class="line">#host    all             all             127.0.0.1/32            scram-sha-256</span><br><span class="line">host    all             all             127.0.0.1/32            trust</span><br><span class="line"></span><br><span class="line">#host    all             all             ::1/128                 scram-sha-256</span><br><span class="line">host    all             all             ::1/128                 trust</span><br></pre></td></tr></table></figure><h2 id="修改密码"><a href="#修改密码" class="headerlink" title="修改密码"></a>修改密码</h2><ul><li>重启服务后，无密码登录并修改密码</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">psql -U postgres</span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">postgres<span class="operator">=</span># <span class="keyword">ALTER</span> <span class="keyword">USER</span> postgres <span class="keyword">WITH</span> PASSWORD <span class="string">&#x27;&lt;password&gt;&#x27;</span>;</span><br></pre></td></tr></table></figure><h2 id="还原配置文件"><a href="#还原配置文件" class="headerlink" title="还原配置文件"></a>还原配置文件</h2><figure class="highlight plaintext"><figcaption><span>PostgreSQL/18/data/pg_hba.conf</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">local   all             all                                     scram-sha-256</span><br><span class="line"></span><br><span class="line">host    all             all             127.0.0.1/32            scram-sha-256</span><br><span class="line"></span><br><span class="line">host    all             all             ::1/128                 scram-sha-256</span><br></pre></td></tr></table></figure><h2 id="完成"><a href="#完成" class="headerlink" title="完成"></a>完成</h2>]]>
    </content>
    <id>https://loli.fj.cn/2026/08/19/PostgreSQL%E5%BF%98%E8%AE%B0%E5%AF%86%E7%A0%81/</id>
    <link href="https://loli.fj.cn/2026/08/19/PostgreSQL%E5%BF%98%E8%AE%B0%E5%AF%86%E7%A0%81/"/>
    <published>2026-08-19T22:11:27.000Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>PostgreSQL忘记密码</p>]]>
    </summary>
    <title>【笔记】PostgreSQL忘记密码</title>
    <updated>2026-10-11T15:02:42.638Z</updated>
  </entry>
  <entry>
    <author>
      <name>57uv6Z6g</name>
    </author>
    <category term="JavaScript" scheme="https://loli.fj.cn/tags/JavaScript/"/>
    <category term="Nodejs" scheme="https://loli.fj.cn/tags/Nodejs/"/>
    <category term="Rollup" scheme="https://loli.fj.cn/tags/Rollup/"/>
    <content>
      <![CDATA[<div id="toot-id" style="display: none">undefined</div><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Rollup通过RollupPluginServe插件实现Web服务器</p><span id="more"></span><h2 id="下载依赖"><a href="#下载依赖" class="headerlink" title="下载依赖"></a>下载依赖</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install -D rollup-plugin-serve</span><br></pre></td></tr></table></figure><h2 id="添加配置文件"><a href="#添加配置文件" class="headerlink" title="添加配置文件"></a>添加配置文件</h2><blockquote><p><code>port</code>：指定端口号<br><code>open</code>：是否自动打开浏览器<br><code>contentBase</code>：指定静态资源路径</p></blockquote><pre><code class="language-js">const serve = require(&quot;rollup-plugin-serve&quot;);module.exports = &#123;  plugins: [    serve(&#123;      port: 80,      open: true,      contentBase: &quot;.&quot;    &#125;)  ]&#125;## 完成</code></pre>]]>
    </content>
    <id>https://loli.fj.cn/2026/08/18/Rollup%E7%9A%84RollupPluginServe%E6%8F%92%E4%BB%B6/</id>
    <link href="https://loli.fj.cn/2026/08/18/Rollup%E7%9A%84RollupPluginServe%E6%8F%92%E4%BB%B6/"/>
    <published>2026-08-18T18:50:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Rollup通过RollupPluginServe插件实现Web服务器</p>]]>
    </summary>
    <title>【笔记】Rollup的RollupPluginServe插件</title>
    <updated>2026-10-11T15:02:42.648Z</updated>
  </entry>
</feed>
