<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>Jake</title>
  
  <subtitle>闲看四季，静候花开。</subtitle>
    <link href="https://i.jakeyu.top/atom.xml" rel="self"/>
  
<link href="https://i.jakeyu.top/"/>
<updated>2026-05-06T17:36:23.392Z</updated>
<id>https://i.jakeyu.top/</id>
  
<author>
    <name>Jake</name>
    
</author>
  
<generator uri="https://hexo.io/">Hexo</generator>

<!-- https://github.com/RSSNext/follow -->
<follow_challenge>
    <feedId>54945423970185240</feedId>
    <userId>73817322141302784</userId>
</follow_challenge>
  
<entry>
    <title>CentOS Stream 8 安装 ClamAV</title>
    <link href="https://i.jakeyu.top/2024/10/26/CentOS-Stream-8-%E5%AE%89%E8%A3%85-ClamAV/"/>
    <id>https://i.jakeyu.top/2024/10/26/CentOS-Stream-8-%E5%AE%89%E8%A3%85-ClamAV/</id>
    <published>2024-10-26T12:45:33.000Z</published>
    <updated>2026-05-06T17:36:23.392Z</updated>
    
    <content type="html"><![CDATA[<p><img src="/images/CentOS-Stream-8-%E5%AE%89%E8%A3%85-ClamAV/ClamAV-An-open-source-anti-virus-for-your-linux-server-min.webp"></p><blockquote><p>ClamAV 是一个开源（GPLv2许可）的反病毒工具包，专为邮件网关上的电子邮件扫描而设计。它提供了多种实用工具，包括灵活且可扩展的多线程守护进程、命令行扫描器以及用于自动更新数据库的高级工具。该工具包的核心是一个作为共享库形式提供的反病毒引擎。</p></blockquote><span id="more"></span><h2 id="环境要求"><a href="#环境要求" class="headerlink" title="环境要求"></a>环境要求</h2><div class="note info"><p>ClamAV 的最低建议配置为：</p><ul><li>3 GiB 以上的 RAM</li><li>2.0 GHz 以上的单核 CPU</li><li>至少 5 GiB 的可用硬盘空间。</li></ul></div><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><h3 id="安装-EPEL-源"><a href="#安装-EPEL-源" class="headerlink" title="安装 EPEL 源"></a>安装 EPEL 源</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install -y epel-release</span><br></pre></td></tr></table></figure><h3 id="安装-ClamAV"><a href="#安装-ClamAV" class="headerlink" title="安装 ClamAV"></a>安装 ClamAV</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install clamav clamd clamav-update -y</span><br></pre></td></tr></table></figure><h3 id="修改-ClamAV-配置文件"><a href="#修改-ClamAV-配置文件" class="headerlink" title="修改 ClamAV 配置文件"></a>修改 ClamAV 配置文件</h3><figure class="highlight bash"><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">/etc/clamd.d/scan.conf 取消下面行注释</span><br><span class="line">LogFile /var/log/clamd.scan</span><br><span class="line">LogFileMaxSize 2M</span><br><span class="line">PidFile /run/clamd.scan/clamd.pid</span><br><span class="line">DatabaseDirectory /var/lib/clamav</span><br><span class="line">LocalSocket /run/clamd.scan/clamd.sock</span><br></pre></td></tr></table></figure><h3 id="修改病毒库刷新配置文件"><a href="#修改病毒库刷新配置文件" class="headerlink" title="修改病毒库刷新配置文件"></a>修改病毒库刷新配置文件</h3><figure class="highlight bash"><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">/etc/freshclam.conf 取消下面行注释</span><br><span class="line">DatabaseDirectory /var/lib/clamav</span><br><span class="line">UpdateLogFile  /var/log/freshclam.log</span><br><span class="line">PidFile  /var/run/freshclam.pid</span><br><span class="line">DatabaseMirror database.clamav.net</span><br><span class="line">Checks 12</span><br></pre></td></tr></table></figure><h2 id="启动-ClamAV-服务"><a href="#启动-ClamAV-服务" class="headerlink" title="启动 ClamAV 服务"></a>启动 ClamAV 服务</h2><figure class="highlight bash"><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">systemctl start clamd@scan.service</span><br><span class="line">systemctl start clamav-freshclam.service</span><br></pre></td></tr></table></figure><h2 id="开机自启动"><a href="#开机自启动" class="headerlink" title="开机自启动"></a>开机自启动</h2><figure class="highlight bash"><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">systemctl <span class="built_in">enable</span> clamd@scan.service</span><br><span class="line">systemctl <span class="built_in">enable</span> clamav-freshclam.service</span><br></pre></td></tr></table></figure><h2 id="查看-ClamAV-服务状态。"><a href="#查看-ClamAV-服务状态。" class="headerlink" title="查看 ClamAV 服务状态。"></a>查看 ClamAV 服务状态。</h2><figure class="highlight bash"><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">systemctl status clamd@scan.service</span><br><span class="line">systemctl status clamav-freshclam.service</span><br></pre></td></tr></table></figure><h2 id="故障排除"><a href="#故障排除" class="headerlink" title="故障排除"></a>故障排除</h2><div class="note info"><ul><li>如果 clamav 服务无法启动，请检查配置信息以及日志;</li><li>检查病毒库数据是否正常，在配置文件中会指定 <code>DatabaseDirectory</code> ，即病毒库存放位置，检查是否存在，不存在的话，手动执行一下 <code>freshclam</code> 命令。<ul><li>如果出现 <code>Failed to open log file /var/log/freshclam.log: Permission denied</code>。<ul><li>可以先执行 <code>chmod a+w /var/log/freshclam.log</code>。</li><li>然后执行 <code>freshclam</code> 更新病毒库。</li></ul></li></ul></li><li>如果手动执行 freshclam 也无法正常下载的话，可以从以下地址下载后传到该目录下。<ul><li><a href="https://database.clamav.net/daily.cvd">https://database.clamav.net/daily.cvd</a></li><li><a href="https://database.clamav.net/bytecode.cvd">https://database.clamav.net/bytecode.cvd</a></li><li><a href="https://database.clamav.net/main.cvd">https://database.clamav.net/main.cvd</a></li></ul></li></ul></div><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><ul><li><a href="https://docs.clamav.net/">ClamAV 官方文档</a></li><li><a href="https://1panel.cn/docs/user_manual/toolbox/clam/">1Panel</a></li><li><a href="https://apple.stackexchange.com/questions/475478/clamav-configuration-failed-to-open-log-file-var-log-freshclam-log">Ask Different</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;img src=&quot;/images/CentOS-Stream-8-%E5%AE%89%E8%A3%85-ClamAV/ClamAV-An-open-source-anti-virus-for-your-linux-server-min.webp&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ClamAV 是一个开源（GPLv2许可）的反病毒工具包，专为邮件网关上的电子邮件扫描而设计。它提供了多种实用工具，包括灵活且可扩展的多线程守护进程、命令行扫描器以及用于自动更新数据库的高级工具。该工具包的核心是一个作为共享库形式提供的反病毒引擎。&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="服务器" scheme="https://i.jakeyu.top/categories/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    
    <category term="服务器" scheme="https://i.jakeyu.top/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
</entry>
  
<entry>
    <title>在 Santa Clara DMV 获取 premit 流程</title>
    <link href="https://i.jakeyu.top/2024/10/22/%E5%9C%A8-Santa-Clara-DMV-%E8%8E%B7%E5%8F%96-premit-%E6%B5%81%E7%A8%8B/"/>
    <id>https://i.jakeyu.top/2024/10/22/%E5%9C%A8-Santa-Clara-DMV-%E8%8E%B7%E5%8F%96-premit-%E6%B5%81%E7%A8%8B/</id>
    <published>2024-10-22T13:52:19.000Z</published>
    <updated>2026-05-06T17:36:23.393Z</updated>
    
    <content type="html"><![CDATA[<p><img src="/images/%E5%9C%A8-Santa-Clara-DMV-%E8%8E%B7%E5%8F%96-premit-%E6%B5%81%E7%A8%8B/DMV_Logo.png"></p><p>最近想预约路考，发现怎么也约不上，提示 <code>You&#39;re not eligible to take driving test at this time</code>。重新检查发现我领取 premit 时没有走完流程。这里记录一下在 Santa Clara DMV 获取 premit 的流程。</p><span id="more"></span><h2 id="创建MyDMV帐户"><a href="#创建MyDMV帐户" class="headerlink" title="创建MyDMV帐户"></a>创建MyDMV帐户</h2><p>首先需要在 <a href="https://www.dmv.ca.gov/">MyDMV</a> 上注册一个帐户。</p><h2 id="填写表格"><a href="#填写表格" class="headerlink" title="填写表格"></a>填写表格</h2><p>如果已经成功注册 MyDMV 账户，就能在DMV官网在线填写驾照申请表格 <a href="https://www.dmv.ca.gov/portal/driver-licenses-identification-cards/dl-id-online-app-edl-44/">DL-44表格</a>。如果没有MyDMV账户，则须前往DMV办公室那天纸本填写。</p><p>下面是入口，可以一步一步点下去。注意选好好要线上笔试还是线下。最后需要缴费，我记得是 40 多刀。</p><p>最好选 Real ID，这样以后飞机上也不用带护照了。我一开始选的是普通的，在领取 premit 时，工作人员帮我改了。</p><p><img src="/images/%E5%9C%A8-Santa-Clara-DMV-%E8%8E%B7%E5%8F%96-premit-%E6%B5%81%E7%A8%8B/SCR-20241022-jr5.png"></p><h2 id="在-DMV-网上考试"><a href="#在-DMV-网上考试" class="headerlink" title="在 DMV 网上考试"></a>在 DMV 网上考试</h2><p>理论考试可以线上也可以线下，我是线上考的，所以这里记录线上流程。</p><p>我提前刷了一遍<a href="https://pass-dmv-test.com/quiz-1-zh">模拟题库</a>，并且看了一遍<a href="https://www.dmv.ca.gov/portal/file/california-driver-handbook-chinese-pdf/">驾照指南</a></p><p>觉得没问题了就可以打开 <a href="https://www.dmv.ca.gov/portal/mydmv">MyDMV</a>，找到先前的 Application，点击 <code>Start Test</code> 开始考试。</p><p>注意仔细看考试提示，需要安装插件，全称录像，并且旁边不能有其他人。</p><h2 id="笔试通过后"><a href="#笔试通过后" class="headerlink" title="笔试通过后"></a>笔试通过后</h2><p>笔试通过后，就可以预约领取 premit 了。也可以不预约，直接去 DMV 排队。最好等一两天之后再去，因为有些信息需要时间同步。</p><p>笔试通过后会收到一封 confirmation code 邮件，里面有一个链接，点击链接就能预约。同时要保留这封邮件，去领取 premit 的时候需要。</p><p>上一张 Santa Clara DMV 手画图。</p><p><img src="/images/%E5%9C%A8-Santa-Clara-DMV-%E8%8E%B7%E5%8F%96-premit-%E6%B5%81%E7%A8%8B/SCR-20241022-kld.png"></p><ol><li>携带地址证明（至少两种，我用的电费账单和银行账单）、SSN、护照、笔试通过的证明（confirmation code 邮件）去 DMV 领取 premit。</li><li>在门口等待排队进入，有三个队伍 appointment, no appointment, test。不要排错了。<br><img src="/images/%E5%9C%A8-Santa-Clara-DMV-%E8%8E%B7%E5%8F%96-premit-%E6%B5%81%E7%A8%8B/SantaClara.jpg"></li><li>进去之后排队，等待窗口人员示意，到窗口后说明来领取 premit，给窗口人员护照、地址证明。窗口会给你一张纸，上面有你的排队号码。</li><li>去等待区等待，等待号码被叫到，去窗口。<ol><li>要说明来意，此时的窗口人员并不知道你的来意。</li><li>给工作人员护照、地址证明和笔试通过的证明。</li><li>视力测试。示例测试就在窗口工作人员后方，不用担心。就是读出某一行或者某一列字母。</li><li>记录指纹（右手拇指）。</li><li>确认信息，签名。</li><li>拿到 receipt。</li></ol></li><li>带着 receipt 去 Photo(Line C) 排队拍照。拍完照后会得到一张带照片的纸，工作人员会将 receipt 等订到一起。</li><li>拍完照后去旁边的 Line D 排队，等待 window 1 窗口或者左手边的 D 窗口示意。(<em><strong>这里很重要，我就是拍完照就回家了，结果无法预约路考，今天去 DMV 重新排的这个</strong></em>)<ol><li>给工作人员订好的那一达纸。</li><li>最后得到下面的纸就是 premit 了。</li><li><img src="/images/%E5%9C%A8-Santa-Clara-DMV-%E8%8E%B7%E5%8F%96-premit-%E6%B5%81%E7%A8%8B/sample-01.webp"></li></ol></li><li>可以回家预约路考了(<strong>要 24 小时之后，这边 DMV 更新数据需要一些时间</strong>)。</li></ol>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;img src=&quot;/images/%E5%9C%A8-Santa-Clara-DMV-%E8%8E%B7%E5%8F%96-premit-%E6%B5%81%E7%A8%8B/DMV_Logo.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;最近想预约路考，发现怎么也约不上，提示 &lt;code&gt;You&amp;#39;re not eligible to take driving test at this time&lt;/code&gt;。重新检查发现我领取 premit 时没有走完流程。这里记录一下在 Santa Clara DMV 获取 premit 的流程。&lt;/p&gt;</summary>
    
    
    
    <category term="生活" scheme="https://i.jakeyu.top/categories/%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="生活" scheme="https://i.jakeyu.top/tags/%E7%94%9F%E6%B4%BB/"/>
    
</entry>
  
<entry>
    <title>nginx proxy cloudflare worker 421/403</title>
    <link href="https://i.jakeyu.top/2023/11/02/nginx-proxy-cloudflare-worker-421-403/"/>
    <id>https://i.jakeyu.top/2023/11/02/nginx-proxy-cloudflare-worker-421-403/</id>
    <published>2023-11-02T17:35:39.000Z</published>
    <updated>2026-05-06T17:36:23.392Z</updated>
    
    <content type="html"><![CDATA[<p>记一次使用 nginx 反代 cloudflare worker 时，访问 502&#x2F;403&#x2F;421 的问题。</p><span id="more"></span><p>我使用的是 <a href="https://1panel.cn/">1panel</a> 面板，它的网站管理使用的是 <a href="https://openresty.org/cn/">OpenResty</a>。</p><p>当使用 OpenResty 默认配置，设置网站反向代理到 Cloudflare Worker 时，出现 502。</p><p>解决办法，移除所有默认 proxy 配置</p><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></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">proxy_set_header Host <span class="variable">$host</span>;</span> </span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">proxy_set_header X-Forwarded-For <span class="variable">$proxy_add_x_forwarded_for</span>;</span> </span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">proxy_set_header X-Forwarded-Host <span class="variable">$server_name</span>;</span> </span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">proxy_set_header X-Real-IP <span class="variable">$remote_addr</span>;</span> </span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">proxy_http_version 1.1;</span> </span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">proxy_set_header Upgrade <span class="variable">$http_upgrade</span>;</span> </span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">proxy_set_header Connection <span class="string">&quot;upgrade&quot;</span>;</span> </span><br></pre></td></tr></table></figure><p>移除后出现 403&#x2F;421 错误。</p><p>找到社区里有出现过相关问题: <a href="https://community.cloudflare.com/t/access-cloudflare-workers-with-nginx-proxy/478073">https://community.cloudflare.com/t/access-cloudflare-workers-with-nginx-proxy/478073</a></p><p>解决办法，添加以下配置</p><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">proxy_ssl_server_name on;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;记一次使用 nginx 反代 cloudflare worker 时，访问 502&amp;#x2F;403&amp;#x2F;421 的问题。&lt;/p&gt;</summary>
    
    
    
    <category term="服务器" scheme="https://i.jakeyu.top/categories/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    
    <category term="服务器" scheme="https://i.jakeyu.top/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
</entry>
  
<entry>
    <title>docker 中 mysql 备份及恢复</title>
    <link href="https://i.jakeyu.top/2023/08/09/docker-%E4%B8%AD-mysql-%E5%A4%87%E4%BB%BD%E5%8F%8A%E6%81%A2%E5%A4%8D/"/>
    <id>https://i.jakeyu.top/2023/08/09/docker-%E4%B8%AD-mysql-%E5%A4%87%E4%BB%BD%E5%8F%8A%E6%81%A2%E5%A4%8D/</id>
    <published>2023-08-09T12:39:54.000Z</published>
    <updated>2026-05-06T17:36:23.392Z</updated>
    
    <content type="html"><![CDATA[<!-- 以上是摘要 --><span id="more"></span><h2 id="备份所有数据"><a href="#备份所有数据" class="headerlink" title="备份所有数据"></a>备份所有数据</h2><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">docker <span class="built_in">exec</span> some-mysql sh -c <span class="string">&#x27;exec mysqldump --all-databases -u root -p &quot;$MYSQL_ROOT_PASSWORD&quot;&#x27;</span> &gt; /some/path/all-databases.sql</span><br></pre></td></tr></table></figure><h2 id="恢复所有数据库"><a href="#恢复所有数据库" class="headerlink" title="恢复所有数据库"></a>恢复所有数据库</h2><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">docker <span class="built_in">exec</span> -i some-mysql sh -c <span class="string">&#x27;exec mysql -u root -p &quot;$MYSQL_ROOT_PASSWORD&quot;&#x27;</span> &lt; /some/path/all-databases.sql</span><br></pre></td></tr></table></figure><h2 id="备份指定数据库"><a href="#备份指定数据库" class="headerlink" title="备份指定数据库"></a>备份指定数据库</h2><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">docker <span class="built_in">exec</span> some-mysql sh -c <span class="string">&#x27;exec mysqldump --databases db1 -u root -p &quot;$MYSQL_ROOT_PASSWORD&quot;&#x27;</span> &gt; /some/path/db1-backup.sql</span><br></pre></td></tr></table></figure><h2 id="恢复指定数据库"><a href="#恢复指定数据库" class="headerlink" title="恢复指定数据库"></a>恢复指定数据库</h2><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">docker <span class="built_in">exec</span> -i some-mysql sh -c <span class="string">&#x27;exec mysql -u root -p &quot;$MYSQL_ROOT_PASSWORD&quot;&#x27;</span> &lt; /some/path/db1-backup.sql</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;!-- 以上是摘要 --&gt;</summary>
    
    
    
    <category term="前端" scheme="https://i.jakeyu.top/categories/%E5%89%8D%E7%AB%AF/"/>
    
    
    <category term="JS" scheme="https://i.jakeyu.top/tags/JS/"/>
    
</entry>
  
<entry>
    <title>ChatGPT镜像网站，免翻无需注册、打开即可体验</title>
    <link href="https://i.jakeyu.top/2023/05/29/ChatGPT%E9%95%9C%E5%83%8F%E7%BD%91%E7%AB%99%EF%BC%8C%E5%85%8D%E7%BF%BB%E6%97%A0%E9%9C%80%E6%B3%A8%E5%86%8C%E3%80%81%E6%89%93%E5%BC%80%E5%8D%B3%E5%8F%AF%E4%BD%93%E9%AA%8C/"/>
    <id>https://i.jakeyu.top/2023/05/29/ChatGPT%E9%95%9C%E5%83%8F%E7%BD%91%E7%AB%99%EF%BC%8C%E5%85%8D%E7%BF%BB%E6%97%A0%E9%9C%80%E6%B3%A8%E5%86%8C%E3%80%81%E6%89%93%E5%BC%80%E5%8D%B3%E5%8F%AF%E4%BD%93%E9%AA%8C/</id>
    <published>2023-05-29T15:20:27.000Z</published>
    <updated>2026-05-06T17:36:23.392Z</updated>
    
    <content type="html"><![CDATA[<p>ChatGPT是国外人工智能实验室Open AI开发的一款对话式语言模型，拥有超强的学习能力。如简单的问答、逻辑清晰的交流对话、代码编写、个人心得写作等。</p><span id="more"></span><h2 id="先上网址"><a href="#先上网址" class="headerlink" title="先上网址"></a>先上网址</h2><!-- [https://gpttalk.live/](https://gpttalk.live/)支持 GPT 3.5、GPT 4，其他模型正在开发中。## 功能和使用ChatGPT 能做的其实很多，但是功能再多能帮助我们的才是实际的，比如下面一些例子### 编程![](/images/chatgpt镜像/SCR-20230529-lik.png)### 论文![](/images/chatgpt镜像/SCR-20230529-lkp.png)### 小红书探店文案![](/images/chatgpt镜像/SCR-20230529-ll8.png)### 等等这些是基于 chatGPT 3.5 的，不能说什么事情就能解决，但是大部分的问题都能解决，至少比用搜索引擎方便快捷。 -->]]></content>
    
    
    <summary type="html">&lt;p&gt;ChatGPT是国外人工智能实验室Open AI开发的一款对话式语言模型，拥有超强的学习能力。如简单的问答、逻辑清晰的交流对话、代码编写、个人心得写作等。&lt;/p&gt;</summary>
    
    
    
    <category term="ChatGPT" scheme="https://i.jakeyu.top/categories/ChatGPT/"/>
    
    
    <category term="ChatGPT" scheme="https://i.jakeyu.top/tags/ChatGPT/"/>
    
</entry>
  
<entry>
    <title>体验ChatGPT</title>
    <link href="https://i.jakeyu.top/2023/04/07/%E4%BD%93%E9%AA%8CChatGPT/"/>
    <id>https://i.jakeyu.top/2023/04/07/%E4%BD%93%E9%AA%8CChatGPT/</id>
    <published>2023-04-07T11:27:00.000Z</published>
    <updated>2026-05-06T17:36:23.393Z</updated>
    
    <content type="html"><![CDATA[<p><img src="/images/ChatGPT-preview.jpg"></p><span id="more"></span><!-- 部署了一个 [https://gpttalk.live](https://gpttalk.live) 网站，本来想着大家随便用用看看情况，上线一天就用掉了 100 多 RMB，实在顶不住，所以就加了 10次/ip/天 限制。看着好多相似站点接连关闭，所以打算后面直接收费（也许会给一次次数，告诉你我可以用），过滤掉一些白嫖党，小范围使用就好了，不然太容易被封了。 -->]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;img src=&quot;/images/ChatGPT-preview.jpg&quot;&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="ChatGPT" scheme="https://i.jakeyu.top/categories/ChatGPT/"/>
    
    
    <category term="ChatGPT" scheme="https://i.jakeyu.top/tags/ChatGPT/"/>
    
</entry>
  
<entry>
    <title>使用 Depay 和欧易 (OKX) 订阅 ChatGPT Plus</title>
    <link href="https://i.jakeyu.top/2023/03/21/%E4%BD%BF%E7%94%A8%20Depay%20%E5%92%8C%E6%AC%A7%E6%98%93%20(OKX)%20%E8%AE%A2%E9%98%85%20ChatGPT%20Plus/"/>
    <id>https://i.jakeyu.top/2023/03/21/%E4%BD%BF%E7%94%A8%20Depay%20%E5%92%8C%E6%AC%A7%E6%98%93%20(OKX)%20%E8%AE%A2%E9%98%85%20ChatGPT%20Plus/</id>
    <published>2023-03-21T20:26:12.000Z</published>
    <updated>2026-05-06T17:36:23.393Z</updated>
    
    <content type="html"><![CDATA[<p><img src="/images/%E5%85%85%E5%80%BC-chatgpt/ChatGPT-preview.jpg"></p><p>对于国内用户充值 ChatGPT Plus 比较困难，实测下面这个方法可以成功充值。</p><span id="more"></span><h2 id="下载和注册-Depay"><a href="#下载和注册-Depay" class="headerlink" title="下载和注册 Depay"></a>下载和注册 Depay</h2><p>Depay 是一个虚拟信用卡服务提供商，可以将 USDT 转换为美元，以用于虚拟信用卡交易。您需要进行身份验证并传输您的身份证才能使用 Depay。</p><h3 id="注册-Depay-账户"><a href="#注册-Depay-账户" class="headerlink" title="注册 Depay 账户"></a>注册 Depay 账户</h3><p>使用此链接: <a href="https://depay.depay.one/web-app/register-h5?invitCode=876620&lang=zh-cn">https://depay.depay.one/web-app/register-h5?invitCode=876620&amp;lang=zh-cn</a>，填写信息并输入邀请码 <code>876620</code> 来注册 Depay 虚拟 Master 卡或 Visa 卡。</p><h3 id="完成身份认证"><a href="#完成身份认证" class="headerlink" title="完成身份认证"></a>完成身份认证</h3><p>在 iOS App Store 中下载 Depay 应用，使用已注册的账户登录，然后完成 KYC 验证。</p><p>如果您使用安卓系统，请在官网下载 Depay 应用。</p><h3 id="获取-USDT"><a href="#获取-USDT" class="headerlink" title="获取 USDT"></a>获取 USDT</h3><ul><li>如果您有朋友可以直接向您转移 USDT，则可以跳过此步骤。</li><li>Depay 只能使用 TRC20 网络。如果是币圈新手，请牢记这一点。</li></ul><h2 id="下载和注册欧易-OKX"><a href="#下载和注册欧易-OKX" class="headerlink" title="下载和注册欧易 (OKX)"></a>下载和注册欧易 (OKX)</h2><p>欧易 (OKX) 是虚拟钱包和交易平台之一，您需要在其中购买 USDT 并将其转移到 Depay 账户中。</p><h3 id="下载欧易-OKX"><a href="#下载欧易-OKX" class="headerlink" title="下载欧易 (OKX)"></a>下载欧易 (OKX)</h3><p>在美国地区的应用商店中下载 OKX 应用。注册账户时，请使用中国手机号码，如果有邀请码，请输入 <code>13041699</code>。</p><h3 id="存储资金"><a href="#存储资金" class="headerlink" title="存储资金"></a>存储资金</h3><p>在 OKX 应用程序中，依次打开“资产” -&gt; “总览” -&gt; “资金账户” -&gt; “充币”。按照指示存储 USDT ，注意选择 USDT-TRC20网络。</p><h3 id="转移资金"><a href="#转移资金" class="headerlink" title="转移资金"></a>转移资金</h3><p>使用 OKX 应用程序进行提款操作，在 Depay 应用程序中充值。在 OKX 应用程序中，依次打开“资产”-&gt;“总览”-&gt;“资金账户”-&gt;“提现”。在 TRC20 地址栏中粘贴您的 Depay 钱包地址，确保选择正确的网络(USDT-TRC20)。</p><h2 id="开通虚拟信用卡"><a href="#开通虚拟信用卡" class="headerlink" title="开通虚拟信用卡"></a>开通虚拟信用卡</h2><p>在 Depay 钱包收到 USDT 后，您需要先开通信用卡，然后兑换成美元。</p><h3 id="开卡"><a href="#开卡" class="headerlink" title="开卡"></a>开卡</h3><p>首先开通标准套餐（0美元，月费1美元，充值手续费最少1.35％），然后根据需要升级套餐。</p><h3 id="兑换-USD"><a href="#兑换-USD" class="headerlink" title="兑换 USD"></a>兑换 USD</h3><p>在 Depay 应用程序中，依次打开“钱包”-&gt;“USDT”-&gt;“兑换”，将 USDT 兑换成美元。</p><h3 id="充值"><a href="#充值" class="headerlink" title="充值"></a>充值</h3><p>在 Depay 应用程序中，依次打开“卡”-&gt;“充值”，然后输入要充值的美元数，并支付手续费1.35％。</p><p>从本方法中损失的资金包括：1 USDT（给 OKX 的手续费）+ 1.35％ Depay 充值手续费 + USDT 转换为美元所需的费用。</p><h2 id="订阅-ChatGPT-Plus"><a href="#订阅-ChatGPT-Plus" class="headerlink" title="订阅 ChatGPT Plus"></a>订阅 ChatGPT Plus</h2><p>为了订阅ChatGPT Plus，需要在全局代理下使用浏览器打开 <a href="https://chat.openai.com/">https://chat.openai.com</a>，并输入 Depay 虚拟信用卡信息。如果需要，可以使用美国地址生成器替代您的地址。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;img src=&quot;/images/%E5%85%85%E5%80%BC-chatgpt/ChatGPT-preview.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;对于国内用户充值 ChatGPT Plus 比较困难，实测下面这个方法可以成功充值。&lt;/p&gt;</summary>
    
    
    
    <category term="ChatGPT" scheme="https://i.jakeyu.top/categories/ChatGPT/"/>
    
    
    <category term="ChatGPT" scheme="https://i.jakeyu.top/tags/ChatGPT/"/>
    
</entry>
  
<entry>
    <title>使用 github action 自动部署博客和同步备份</title>
    <link href="https://i.jakeyu.top/2023/02/04/%E4%BD%BF%E7%94%A8-github-action-%E8%87%AA%E5%8A%A8%E9%83%A8%E7%BD%B2%E5%8D%9A%E5%AE%A2%E5%92%8C%E5%90%8C%E6%AD%A5%E5%A4%87%E4%BB%BD/"/>
    <id>https://i.jakeyu.top/2023/02/04/%E4%BD%BF%E7%94%A8-github-action-%E8%87%AA%E5%8A%A8%E9%83%A8%E7%BD%B2%E5%8D%9A%E5%AE%A2%E5%92%8C%E5%90%8C%E6%AD%A5%E5%A4%87%E4%BB%BD/</id>
    <published>2023-02-04T00:14:33.000Z</published>
    <updated>2026-05-06T17:36:23.393Z</updated>
    
    <content type="html"><![CDATA[<p><img src="/images/%E4%BD%BF%E7%94%A8-github-action-%E8%87%AA%E5%8A%A8%E9%83%A8%E7%BD%B2%E5%8D%9A%E5%AE%A2%E5%92%8C%E5%90%8C%E6%AD%A5%E5%A4%87%E4%BB%BD/44036562.png"></p><p>使用 github action 自动化可以让我们发布博客更加简单，只需要把代码提交到 github 仓库即可。</p><span id="more"></span><h2 id="准备"><a href="#准备" class="headerlink" title="准备"></a>准备</h2><p>关于如何使用 git 上传博客到自己的服务器可以查看我之前写的<a href="/2016/12/06/Hexo%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA%E5%88%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%B9%B6%E8%87%AA%E5%8A%A8%E9%83%A8%E7%BD%B2/">Hexo博客部署到服务器</a>。</p><h2 id="部署到-github-page"><a href="#部署到-github-page" class="headerlink" title="部署到 github page"></a>部署到 github page</h2><h3 id="action-配置"><a href="#action-配置" class="headerlink" title="action 配置"></a>action 配置</h3><p>在项目根目录下创建 <code>.github/workflows</code> 文件夹，然后在该文件夹下创建 <code>deploy-gh-page.yml</code> 文件，内容如下：</p><figure class="highlight yml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">Deploy</span> <span class="string">to</span> <span class="string">gh-page</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 根据实际情况调整分支</span></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">    <span class="attr">branches:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">master</span></span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">deploy-gh-page:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/checkout@v2</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">ref:</span> <span class="string">master</span></span><br><span class="line">          <span class="attr">fetch-depth:</span> <span class="number">0</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">pnpm/action-setup@v2</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">version:</span> <span class="number">7</span></span><br><span class="line">          <span class="attr">run_install:</span> <span class="literal">false</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">uses:</span> <span class="string">actions/setup-node@v3</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">node-version:</span> <span class="string">&quot;16&quot;</span></span><br><span class="line">          <span class="attr">cache:</span> <span class="string">&quot;pnpm&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Install</span> <span class="string">dependencies</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">pnpm</span> <span class="string">install</span> <span class="string">--frozen-lockfile</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Build</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">npm</span> <span class="string">run</span> <span class="string">build</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Deploy</span> <span class="string">to</span> <span class="string">gh-page</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">peaceiris/actions-gh-pages@v3</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="comment"># github 自带变量，无需配置</span></span><br><span class="line">          <span class="attr">github_token:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.GITHUB_TOKEN</span> <span class="string">&#125;&#125;</span></span><br><span class="line">          <span class="attr">publish_dir:</span> <span class="string">./public</span></span><br></pre></td></tr></table></figure><h2 id="部署到服务器"><a href="#部署到服务器" class="headerlink" title="部署到服务器"></a>部署到服务器</h2><h3 id="SSH-key"><a href="#SSH-key" class="headerlink" title="SSH key"></a>SSH key</h3><p>添加 SSH Private Key 到 <code>github repo -&gt; settings -&gt; Secrets and variables -&gt; Actions</code>。</p><p><img src="/images/%E4%BD%BF%E7%94%A8-github-action-%E8%87%AA%E5%8A%A8%E9%83%A8%E7%BD%B2%E5%8D%9A%E5%AE%A2%E5%92%8C%E5%90%8C%E6%AD%A5%E5%A4%87%E4%BB%BD/SCR-20230204-mh.png"></p><h3 id="action-配置-1"><a href="#action-配置-1" class="headerlink" title="action 配置"></a>action 配置</h3><p>在<a href="#action-%E9%85%8D%E7%BD%AE">上文的配置</a>基础上，增加如下配置:</p><figure class="highlight yml"><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="attr">deploy-to-server:</span></span><br><span class="line">  <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">  <span class="comment"># 依赖 deploy-gh-page job</span></span><br><span class="line">  <span class="attr">needs:</span> [<span class="string">deploy-gh-page</span>]</span><br><span class="line">  <span class="attr">steps:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Deploy</span> <span class="string">to</span> <span class="string">server</span></span><br><span class="line">      <span class="attr">uses:</span> <span class="string">wei/git-sync@v3</span></span><br><span class="line">      <span class="attr">with:</span></span><br><span class="line">        <span class="attr">source_repo:</span> <span class="string">JakeLaoyu/blog</span></span><br><span class="line">        <span class="attr">source_branch:</span> <span class="string">refs/remotes/source/gh-pages</span></span><br><span class="line">        <span class="attr">destination_repo:</span> <span class="string">root@110.40.198.64:/www/wwwroot/blog.git</span></span><br><span class="line">        <span class="attr">destination_branch:</span> <span class="string">refs/heads/master</span></span><br><span class="line">        <span class="attr">destination_ssh_private_key:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.SERVER_PRIVATE_KEY</span> <span class="string">&#125;&#125;</span></span><br></pre></td></tr></table></figure><h2 id="效果"><a href="#效果" class="headerlink" title="效果"></a>效果</h2><p><img src="/images/%E4%BD%BF%E7%94%A8-github-action-%E8%87%AA%E5%8A%A8%E9%83%A8%E7%BD%B2%E5%8D%9A%E5%AE%A2%E5%92%8C%E5%90%8C%E6%AD%A5%E5%A4%87%E4%BB%BD/SCR-20230204-s2.png"></p><h2 id="同步至-gitee-等"><a href="#同步至-gitee-等" class="headerlink" title="同步至 gitee 等"></a>同步至 gitee 等</h2><p>依赖 <a href="https://github.com/wearerequired/git-mirror-action">wearerequired&#x2F;git-mirror-action</a> 我们可以很方便实现。</p><p>在项目根目录下创建 <code>.github/workflows</code> 文件夹，然后在该文件夹下创建 <code>sync-to-gitee.yml</code> 文件，内容如下：</p><figure class="highlight yml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">Sync</span> <span class="string">to</span> <span class="string">Gitee</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">    <span class="attr">branches:</span> [<span class="string">master</span>]</span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">sync:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Sync</span> <span class="string">to</span> <span class="string">Gitee</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">wearerequired/git-mirror-action@master</span></span><br><span class="line">        <span class="attr">env:</span></span><br><span class="line">          <span class="comment"># 需要事先在 gitee 上创建 ssh key 并添加到仓库</span></span><br><span class="line">          <span class="attr">SSH_PRIVATE_KEY:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.GITEE_RSA_PRIVATE_KEY</span> <span class="string">&#125;&#125;</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="comment"># GitHub 源仓库地址</span></span><br><span class="line">          <span class="attr">source-repo:</span> <span class="string">git@github.com:JakeLaoyu/blog.git</span></span><br><span class="line">          <span class="comment"># Gitee 目标仓库地址</span></span><br><span class="line">          <span class="attr">destination-repo:</span> <span class="string">git@gitee.com:jakelaoyu/HexoBlogBackup.git</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;img src=&quot;/images/%E4%BD%BF%E7%94%A8-github-action-%E8%87%AA%E5%8A%A8%E9%83%A8%E7%BD%B2%E5%8D%9A%E5%AE%A2%E5%92%8C%E5%90%8C%E6%AD%A5%E5%A4%87%E4%BB%BD/44036562.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;使用 github action 自动化可以让我们发布博客更加简单，只需要把代码提交到 github 仓库即可。&lt;/p&gt;</summary>
    
    
    
    <category term="CI/CD" scheme="https://i.jakeyu.top/categories/CI-CD/"/>
    
    
    <category term="CI/CD" scheme="https://i.jakeyu.top/tags/CI-CD/"/>
    
</entry>
  
<entry>
    <title>注册ChatGPT详细指南</title>
    <link href="https://i.jakeyu.top/2022/12/09/%E6%B3%A8%E5%86%8CChatGPT%E8%AF%A6%E7%BB%86%E6%8C%87%E5%8D%97/"/>
    <id>https://i.jakeyu.top/2022/12/09/%E6%B3%A8%E5%86%8CChatGPT%E8%AF%A6%E7%BB%86%E6%8C%87%E5%8D%97/</id>
    <published>2022-12-09T13:46:15.000Z</published>
    <updated>2026-05-06T17:36:23.394Z</updated>
    
    <content type="html"><![CDATA[<p><img src="/images/%E6%B3%A8%E5%86%8CChatGPT%E8%AF%A6%E7%BB%86%E6%8C%87%E5%8D%97/cbsn-fusion-promise-fear-of-artificial-intelligence-bot-chatgpt-thumbnail-1528537-640x360.jpeg"></p><p>最近ChatGPT真受欢迎，但是有些人注册时会经常面临不服务它们的地区问题，现在我们给你详细问题解决。</p><span id="more"></span><blockquote><p>作者 <a href="https://twitter.com/BoxMrChen">twitter</a></p></blockquote><h1 id="准备"><a href="#准备" class="headerlink" title="准备"></a>准备</h1><ol><li>代理。要求是韩国，日本，印度，新加坡，美国这些国家的地址都合适。对其他的我们还不太清楚，反正香港或中国的代理肯定不行。<a href="https://arisaka.io/#/register?code=VqANATND">推荐机场</a></li><li>找一个国外手机号码，如果你没有用过接码平台也行，有些接码平台是无法接的，所以我们推荐一个就是 <a href="https://sms-activate.org/?ref=2862835">sms-activate.org</a></li><li>准备一个浏览器</li></ol><h1 id="开始一步一步注册"><a href="#开始一步一步注册" class="headerlink" title="开始一步一步注册"></a>开始一步一步注册</h1><h2 id="第一步是接验证码"><a href="#第一步是接验证码" class="headerlink" title="第一步是接验证码"></a>第一步是接验证码</h2><p>打开接码平台 <a href="https://sms-activate.org/?ref=2862835">sms-activate.org</a>，注册一个账号</p><p><img src="/images/%E6%B3%A8%E5%86%8CChatGPT%E8%AF%A6%E7%BB%86%E6%8C%87%E5%8D%97/pasted%20image%200.png"></p><p>然后要充值余额</p><p><img src="/images/%E6%B3%A8%E5%86%8CChatGPT%E8%AF%A6%E7%BB%86%E6%8C%87%E5%8D%97/image.png"></p><p>一次接码OpenAi的验证码费用是大概11卢布，人民币来看差不多是1块钱，不过只能充美金，就先充直个1美金钱。可以选择对你任何方便方式。支付宝也有</p><p><img src="/images/%E6%B3%A8%E5%86%8CChatGPT%E8%AF%A6%E7%BB%86%E6%8C%87%E5%8D%97/image%20(1).png"></p><p>充值完成可能需要等一会，就先放着，直接进行下一步。</p><h2 id="第二部是注册一个OpenAI账号"><a href="#第二部是注册一个OpenAI账号" class="headerlink" title="第二部是注册一个OpenAI账号"></a>第二部是注册一个OpenAI账号</h2><p>首先打开<a href="https://beta.openai.com/signup">ChatGPT的账户注册页面</a>。谷歌注册或者邮箱注册都可以，无所谓，我们这里用邮箱注册作为例子。</p><p><img src="/images/%E6%B3%A8%E5%86%8CChatGPT%E8%AF%A6%E7%BB%86%E6%8C%87%E5%8D%97/Untitled.png"></p><p>用邮箱注册后你要验证邮件。进去邮箱，查看email里的链接。</p><p><img src="/images/%E6%B3%A8%E5%86%8CChatGPT%E8%AF%A6%E7%BB%86%E6%8C%87%E5%8D%97/image-2.png"></p><p>这里你需要输入需要的信息。</p><p>当然，有一些人会在这里遇到一个问题，会出现说不能在当前国家服务的提示。</p><p><img src="/images/%E6%B3%A8%E5%86%8CChatGPT%E8%AF%A6%E7%BB%86%E6%8C%87%E5%8D%97/image-3.png"></p><p>不用怕，这个这文章就帮助你解决这个问题。</p><p>这方面那，给你一招。一般你出现这种问题，就是因为你的代理没有全局，或者位置不对。香港或中国的的代理是100%无法通过的。</p><p>这个问题是非常神奇的，只要你出现了这个提示，那么你接下来怎么切换代理，都是没用的。现在提供给你你一招解决。</p><h2 id="解决地区问题"><a href="#解决地区问题" class="headerlink" title="解决地区问题"></a>解决地区问题</h2><p>先，你要把你的代理切换到任何合适的地区，我们这里选择了韩国。</p><p>然后，先复制下面这段代码</p><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_">window</span>.<span class="property">localStorage</span>.<span class="title function_">removeItem</span>(<span class="title class_">Object</span>.<span class="title function_">keys</span>(<span class="variable language_">window</span>.<span class="property">localStorage</span>).<span class="title function_">find</span>(<span class="function"><span class="params">i</span>=&gt;</span>i.<span class="title function_">startsWith</span>(<span class="string">&#x27;@@auth0spajs&#x27;</span>)))</span><br></pre></td></tr></table></figure><p>接着在地址栏里输入</p><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="attr">javascript</span>:</span><br></pre></td></tr></table></figure><p>请注意，这里一定要输入，因为你复制的话是粘贴不了的。</p><p>然后再粘贴我们第一段复制的内容：</p><p><img src="/images/%E6%B3%A8%E5%86%8CChatGPT%E8%AF%A6%E7%BB%86%E6%8C%87%E5%8D%97/Untitled-1.png"></p><p>然后按下回车键，刷新页面。如果你的代理没问题，就可以看到正常工作的注册页面了。</p><h2 id="输入手机号码"><a href="#输入手机号码" class="headerlink" title="输入手机号码"></a>输入手机号码</h2><p><img src="/images/%E6%B3%A8%E5%86%8CChatGPT%E8%AF%A6%E7%BB%86%E6%8C%87%E5%8D%97/Untitled-2.png"></p><p>这里选的是韩国，这是因为我们使用韩国的代理，但是我们最好选择印度。然后到我们的接码网站上去。在左侧搜索OpenAi，然后点击印度。</p><p><img src="/images/%E6%B3%A8%E5%86%8CChatGPT%E8%AF%A6%E7%BB%86%E6%8C%87%E5%8D%97/sdfdskfjdls.png"></p><p>点击”小黄车”。</p><p><img src="/images/%E6%B3%A8%E5%86%8CChatGPT%E8%AF%A6%E7%BB%86%E6%8C%87%E5%8D%97/pasted%20image%200-2.png"></p><p>然后我们复制这个号码，粘贴过去。然后我们点击发送验证码就完成了。</p><p>等一会网站会提示验证码，我们复制粘贴。</p><p><img src="/images/%E6%B3%A8%E5%86%8CChatGPT%E8%AF%A6%E7%BB%86%E6%8C%87%E5%8D%97/image-4.png"></p><p>这里你要选择你打算如何使用OpenAI。随便选择吧。</p><h2 id="使用ChatGPT"><a href="#使用ChatGPT" class="headerlink" title="使用ChatGPT"></a>使用ChatGPT</h2><p>注册完后，打开<a href="https://chat.openai.com/auth/login">ChatGPT网站</a>去登陆。</p><p><img src="/images/%E6%B3%A8%E5%86%8CChatGPT%E8%AF%A6%E7%BB%86%E6%8C%87%E5%8D%97/Untitled-5.png"></p><p>在下面这个地方就可以开始写你的任何巧妙的句子了。取乐吧！</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;img src=&quot;/images/%E6%B3%A8%E5%86%8CChatGPT%E8%AF%A6%E7%BB%86%E6%8C%87%E5%8D%97/cbsn-fusion-promise-fear-of-artificial-intelligence-bot-chatgpt-thumbnail-1528537-640x360.jpeg&quot;&gt;&lt;/p&gt;
&lt;p&gt;最近ChatGPT真受欢迎，但是有些人注册时会经常面临不服务它们的地区问题，现在我们给你详细问题解决。&lt;/p&gt;</summary>
    
    
    
    <category term="ChatGPT" scheme="https://i.jakeyu.top/categories/ChatGPT/"/>
    
    
    <category term="ChatGPT" scheme="https://i.jakeyu.top/tags/ChatGPT/"/>
    
</entry>
  
<entry>
    <title>vscode 插件之代码补全提示</title>
    <link href="https://i.jakeyu.top/2021/12/04/vscode-%E6%8F%92%E4%BB%B6%E4%B9%8B%E4%BB%A3%E7%A0%81%E8%A1%A5%E5%85%A8%E6%8F%90%E7%A4%BA/"/>
    <id>https://i.jakeyu.top/2021/12/04/vscode-%E6%8F%92%E4%BB%B6%E4%B9%8B%E4%BB%A3%E7%A0%81%E8%A1%A5%E5%85%A8%E6%8F%90%E7%A4%BA/</id>
    <published>2021-12-04T16:23:58.000Z</published>
    <updated>2026-05-06T17:36:23.393Z</updated>
    
    <content type="html"><![CDATA[<p><img src="/images/vscode-%E6%8F%92%E4%BB%B6%E4%B9%8B%E4%BB%A3%E7%A0%81%E8%A1%A5%E5%85%A8%E6%8F%90%E7%A4%BA/v2-30670b252d59bcc15c040f783d79f5e9_720w.png"></p><span id="more"></span><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>vscode 插件提供了很强大个能力，借助插件可以帮助我们提升开发效率。</p><p>在写 node 项目时经常需要相对路径寻找引用 Service 文件等，写一个插件帮我们自动补全。</p><p>借助 <a href="https://code.visualstudio.com/api/references/vscode-api"><code>vscode.languages.registerCompletionItemProvider</code></a> 方法，我们可以注册相关补全提示。</p><h1 id="注册服务"><a href="#注册服务" class="headerlink" title="注册服务"></a>注册服务</h1><figure class="highlight ts"><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">export</span> <span class="keyword">function</span> <span class="title function_">activate</span>(<span class="params"><span class="attr">context</span>: vscode.<span class="title class_">ExtensionContext</span></span>) &#123;</span><br><span class="line">  context.<span class="property">subscriptions</span>.<span class="title function_">push</span>(</span><br><span class="line">    vscode.<span class="property">languages</span>.<span class="title function_">registerCompletionItemProvider</span>(<span class="string">&quot;typescript&quot;</span>, &#123;</span><br><span class="line">      provideCompletionItems,</span><br><span class="line">    &#125;)</span><br><span class="line">  );</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="provideCompletionItems"><a href="#provideCompletionItems" class="headerlink" title="provideCompletionItems"></a>provideCompletionItems</h1><figure class="highlight ts"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> <span class="title function_">provideCompletionItems</span> = <span class="keyword">async</span> (<span class="params"></span></span><br><span class="line"><span class="params">  <span class="attr">document</span>: vscode.<span class="title class_">TextDocument</span>,</span></span><br><span class="line"><span class="params">  <span class="attr">position</span>: vscode.<span class="title class_">Position</span></span></span><br><span class="line"><span class="params"></span>) =&gt; &#123;</span><br><span class="line">  <span class="keyword">const</span> serviceFiles = <span class="keyword">await</span> vscode.<span class="property">workspace</span>.<span class="title function_">findFiles</span>(<span class="string">&quot;app/services/**/*.ts&quot;</span>);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> (!serviceFiles.<span class="property">length</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span>;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> serviceFiles.<span class="title function_">map</span>(<span class="function">(<span class="params">file</span>) =&gt;</span> &#123;</span><br><span class="line">    <span class="comment">// 生成相对当前编辑文件的相对路径</span></span><br><span class="line">    <span class="keyword">const</span> relativePath = path.<span class="title function_">relative</span>(</span><br><span class="line">      path.<span class="title function_">dirname</span>(<span class="variable language_">document</span>.<span class="property">uri</span>.<span class="property">path</span>),</span><br><span class="line">      path.<span class="title function_">dirname</span>(file.<span class="property">path</span>)</span><br><span class="line">    );</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> basename = path.<span class="title function_">basename</span>(file.<span class="property">path</span>);</span><br><span class="line">    <span class="keyword">const</span> extname = path.<span class="title function_">extname</span>(file.<span class="property">path</span>);</span><br><span class="line">    <span class="keyword">const</span> filename = basename.<span class="title function_">replace</span>(extname, <span class="string">&quot;&quot;</span>);</span><br><span class="line">    <span class="keyword">const</span> insertText = <span class="string">`import <span class="subst">$&#123;filename&#125;</span> from &#x27;<span class="subst">$&#123;relativePath&#125;</span>/<span class="subst">$&#123;filename&#125;</span>&#x27;;\n<span class="subst">$&#123;filename&#125;</span>`</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> completionItem = <span class="keyword">new</span> vscode.<span class="title class_">CompletionItem</span>(</span><br><span class="line">      filename,</span><br><span class="line">      vscode.<span class="property">CompletionItemKind</span>.<span class="property">Class</span></span><br><span class="line">    );</span><br><span class="line"></span><br><span class="line">    completionItem.<span class="property">detail</span> = basename;</span><br><span class="line">    completionItem.<span class="property">insertText</span> = insertText;</span><br><span class="line">    completionItem.<span class="property">documentation</span> = <span class="string">`<span class="subst">$&#123;insertText&#125;</span>`</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> completionItem;</span><br><span class="line">  &#125;);</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h1 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h1><p>同时我们需要在 package.json 中添加相应配置</p><figure class="highlight json"><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;activationEvents&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="string">&quot;onLanguage:typescript&quot;</span></span><br><span class="line">  <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><ul><li><a href="https://code.visualstudio.com/api/references/vscode-api">VS Code API</a></li><li><a href="https://github.com/Liiked/VS-Code-Extension-Doc-ZH">VS-Code-Extension-Doc-ZH</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;img src=&quot;/images/vscode-%E6%8F%92%E4%BB%B6%E4%B9%8B%E4%BB%A3%E7%A0%81%E8%A1%A5%E5%85%A8%E6%8F%90%E7%A4%BA/v2-30670b252d59bcc15c040f783d79f5e9_720w.png&quot;&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="vscode" scheme="https://i.jakeyu.top/categories/vscode/"/>
    
    
    <category term="前端" scheme="https://i.jakeyu.top/tags/%E5%89%8D%E7%AB%AF/"/>
    
    <category term="vscode" scheme="https://i.jakeyu.top/tags/vscode/"/>
    
</entry>
  
<entry>
    <title>centos 使用 Clash 梯子</title>
    <link href="https://i.jakeyu.top/2021/11/27/centos-%E4%BD%BF%E7%94%A8-Clash-%E6%A2%AF%E5%AD%90/"/>
    <id>https://i.jakeyu.top/2021/11/27/centos-%E4%BD%BF%E7%94%A8-Clash-%E6%A2%AF%E5%AD%90/</id>
    <published>2021-11-27T21:56:23.000Z</published>
    <updated>2026-05-06T17:36:23.392Z</updated>
    
    <content type="html"><![CDATA[<p>服务器访问 npm、github 等真让人捉急，折腾一下配个 clash。</p><p><img src="/images/centos-%E4%BD%BF%E7%94%A8-Clash-%E6%A2%AF%E5%AD%90/logo.png"></p><span id="more"></span><h2 id="下载-clash"><a href="#下载-clash" class="headerlink" title="下载 clash"></a>下载 clash</h2><p>去 <a href="https://github.com/Dreamacro/clash/releases">github</a> 下载最新 linux 版本，一般使用 <code>linux-amd64</code>。</p><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">gunzip clash-linux-amd64-v1.8.0.gz</span><br><span class="line">mv clash-linux-amd64-v1.8.0 ~/clash</span><br><span class="line">chmod +x ~/clash</span><br><span class="line">./clash</span><br></pre></td></tr></table></figure><p>一套执行完后会生成默认配置文件 <code>~/.config/clash</code></p><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></pre></td><td class="code"><pre><span class="line">l ~/.config/clash</span><br><span class="line">-rw-r--r-- 1 root root 190K 11月 24 16:38 config.yaml</span><br><span class="line">-rw-r--r-- 1 root root 5.7M 11月 24 16:02 Country.mmdb</span><br></pre></td></tr></table></figure><h2 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h2><p>我是用的是 <a href="https://arisaka.io/#/register?code=VqANATND">Arisaka</a>。</p><h3 id="复制订阅地址"><a href="#复制订阅地址" class="headerlink" title="复制订阅地址"></a>复制订阅地址</h3><p><img src="/images/centos-%E4%BD%BF%E7%94%A8-Clash-%E6%A2%AF%E5%AD%90/SCR-20241119-hkq.png"></p><p>这个配置我们不能直接使用，需要使用 <a href="https://acl4ssr-sub.github.io/">https://acl4ssr-sub.github.io/</a> 服务生成订阅地址，然后打开订阅地址就可以看到明文配置。</p><p>使用这份配置覆盖 <code>~/.config/clash/config.yaml</code>。</p><h3 id="启动代理"><a href="#启动代理" class="headerlink" title="启动代理"></a>启动代理</h3><p>然后启动 clash</p><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">./clash</span><br></pre></td></tr></table></figure><p>设置终端使用 clash 代理</p><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">export ALL_PROXY=socks5://127.0.0.1:7891</span><br></pre></td></tr></table></figure><p>可以使用 <code>curl</code> 测试是否连接成功。</p><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">curl https://www.google.com</span><br></pre></td></tr></table></figure><h2 id="远程管理"><a href="#远程管理" class="headerlink" title="远程管理"></a>远程管理</h2><p>修改配置文件</p><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">vim ~/.config/clash/config.yaml</span><br></pre></td></tr></table></figure><figure class="highlight yaml"><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="attr">external-controller:</span> <span class="number">0.0</span><span class="number">.0</span><span class="number">.0</span><span class="string">:9090</span></span><br><span class="line"><span class="comment"># 一定要配置 secret，用来远程访问安全</span></span><br><span class="line"><span class="attr">secret:</span> <span class="string">xxxx</span></span><br></pre></td></tr></table></figure><p>重启 clash 服务。</p><p>打开官方 <a href="http://clash.razord.top/">http://clash.razord.top/</a>，在设置中填写相应的端口，secret 配置。配置完成就即可远程管理</p><p><img src="/images/centos-%E4%BD%BF%E7%94%A8-Clash-%E6%A2%AF%E5%AD%90/iShot2021-11-27%2023.50.06.png"></p><h2 id="推荐"><a href="#推荐" class="headerlink" title="推荐"></a>推荐</h2><div class="link-grid"><div class="link-grid-container"><object class="link-grid-image" data="/images/临时邮箱/banner.png"></object><p>临时邮箱</p><p>完全基于 CloudFlare 实现的临时邮箱，所有服务和数据均在 CloudFlare 中</p><a href="https://email-once.com/"></a></div><div class="link-grid-container"><object class="link-grid-image" data="/images/devtool/unnamed.png"></object><p>开发工具箱</p><p>开发者的便利工具</p><a href="https://devtool.club/"></a></div></div>]]></content>
    
    
    <summary type="html">&lt;p&gt;服务器访问 npm、github 等真让人捉急，折腾一下配个 clash。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/centos-%E4%BD%BF%E7%94%A8-Clash-%E6%A2%AF%E5%AD%90/logo.png&quot;&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="服务器" scheme="https://i.jakeyu.top/categories/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    
    <category term="服务器" scheme="https://i.jakeyu.top/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
</entry>
  
<entry>
    <title>跨域名存取localStorage</title>
    <link href="https://i.jakeyu.top/2020/09/20/%E8%B7%A8%E5%9F%9F%E5%90%8D%E5%AD%98%E5%8F%96localStorage/"/>
    <id>https://i.jakeyu.top/2020/09/20/%E8%B7%A8%E5%9F%9F%E5%90%8D%E5%AD%98%E5%8F%96localStorage/</id>
    <published>2020-09-20T19:15:11.000Z</published>
    <updated>2026-05-06T17:36:23.395Z</updated>
    
    <content type="html"><![CDATA[<p><img src="/images/%E8%B7%A8%E5%9F%9F%E5%90%8D%E8%AF%BB%E5%8F%96localStorage/de1cd54ffb.png"></p><span id="more"></span><blockquote><p>无论数据存储在 localStorage 还是 sessionStorage ，<strong>它们都特定于页面的协议。</strong></p></blockquote><p>由于<code>localStorage</code>是基于当前访问源(origin)的本地存储空间，所以当我们在 <code>a.jakeyu.top</code> 中存储一段数据，并想要在 <code>b.jakeyu.top</code> 中读取数据的时候是无法取到的。</p><p>最近遇到这样的需求，考虑过 cookie 方案，但是可能存储大量的数据，cookie 不可行。最终我们使用<code>iframe</code>来实现，我觉得这是一个很有趣的方法。</p><h1 id="思路"><a href="#思路" class="headerlink" title="思路"></a>思路</h1><p><code>a.jakeyu.top</code> 和 <code>b.jakeyu.top</code> 通过 <code>iframe</code> 加载同一个域名的页面，并使用 <a href="https://developer.mozilla.org/zh-CN/docs/Web/API/Window/postMessage">postMessage</a> 和 <code>iframe</code> 中的页面进行通信，这样就可以实现跨域名存取 localStorage。</p><p>缺点是 <code>postMessage</code>  是基于回调的，所以所有 api 都是异步的。不过我们有 <code>promise</code>，可以让使用方式优雅一些。</p><p><img src="/images/%E8%B7%A8%E5%9F%9F%E5%90%8D%E8%AF%BB%E5%8F%96localStorage/%E5%9B%BE%E5%83%8F2020-10-5.jpeg"></p><h1 id="实现"><a href="#实现" class="headerlink" title="实现"></a>实现</h1><h2 id="父级页面"><a href="#父级页面" class="headerlink" title="父级页面"></a>父级页面</h2><h3 id="创建-iframe"><a href="#创建-iframe" class="headerlink" title="创建 iframe"></a>创建 iframe</h3><figure class="highlight ts"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">createIframe</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> iframeInBody = <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;#iframe&#x27;</span>) <span class="keyword">as</span> <span class="title class_">HTMLIFrameElement</span>;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> (iframeInBody) &#123;</span><br><span class="line">    <span class="keyword">return</span> iframeInBody;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> iframe = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&#x27;iframe&#x27;</span>);</span><br><span class="line">  iframe.<span class="title function_">setAttribute</span>(<span class="string">&#x27;id&#x27;</span>, <span class="string">&#x27;#iframe&#x27;</span>);</span><br><span class="line">  iframe.<span class="property">src</span> = <span class="string">&#x27;https://jakeyu.top/localstorage&#x27;</span>;</span><br><span class="line">  iframe.<span class="property">style</span>.<span class="property">display</span> = <span class="string">&#x27;none&#x27;</span>;</span><br><span class="line"></span><br><span class="line">  <span class="variable language_">document</span>.<span class="property">body</span>.<span class="title function_">insertAdjacentElement</span>(<span class="string">&#x27;beforeend&#x27;</span>, iframe);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> iframe;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="核心-Class"><a href="#核心-Class" class="headerlink" title="核心 Class"></a>核心 Class</h3><figure class="highlight typescript"><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><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">localStorage</span> &#123;</span><br><span class="line">  <span class="attr">iframe</span>: <span class="title class_">HTMLIFrameElement</span>;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// iframe 是否加载完成</span></span><br><span class="line">  <span class="attr">isReady</span>: <span class="title class_">Boolean</span>;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 同时调用方法时，需要在 iframe 回调之后执行 reslove</span></span><br><span class="line">  <span class="attr">waitMap</span>: <span class="title class_">Map</span>&lt;<span class="built_in">string</span>, <span class="title class_">Function</span>&gt;;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 在 iframe ready之前调用方法，需要保存一下，ready后执行</span></span><br><span class="line">  <span class="attr">beforeReady</span>: [<span class="title class_">Function</span>?];</span><br><span class="line"></span><br><span class="line">  <span class="title function_">constructor</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="variable language_">this</span>.<span class="title function_">listenMessage</span>();</span><br><span class="line"></span><br><span class="line">    <span class="variable language_">this</span>.<span class="property">isReady</span> = <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line">    <span class="variable language_">this</span>.<span class="property">beforeReady</span> = [];</span><br><span class="line"></span><br><span class="line">    <span class="variable language_">this</span>.<span class="property">iframe</span> = <span class="title function_">createIframe</span>();</span><br><span class="line"></span><br><span class="line">    <span class="variable language_">this</span>.<span class="property">waitMap</span> = <span class="keyword">new</span> <span class="title class_">Map</span>();</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="comment">   * 设置数据</span></span><br><span class="line"><span class="comment">   * <span class="doctag">@param</span> <span class="variable">key</span></span></span><br><span class="line"><span class="comment">   * <span class="doctag">@param</span> <span class="variable">value</span></span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line">  <span class="title function_">setItem</span>(<span class="params"><span class="attr">key</span>: <span class="built_in">string</span>, <span class="attr">value</span>: <span class="built_in">any</span></span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> eventType = <span class="string">&#x27;set&#x27;</span>;</span><br><span class="line">    <span class="keyword">const</span> randomKey = <span class="variable language_">this</span>.<span class="title function_">getRandomString</span>(eventType);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Promise</span>(<span class="function">(<span class="params">resolve</span>) =&gt;</span> &#123;</span><br><span class="line">      <span class="variable language_">this</span>.<span class="property">waitMap</span>.<span class="title function_">set</span>(randomKey, resolve);</span><br><span class="line"></span><br><span class="line">      <span class="variable language_">this</span>.<span class="title function_">postMessage</span>(&#123;</span><br><span class="line">        eventType,</span><br><span class="line">        key,</span><br><span class="line">        value,</span><br><span class="line">        randomKey</span><br><span class="line">      &#125;);</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="comment">   * 监听消息</span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line">  <span class="title function_">listenMessage</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="comment">// 接收 iframe 消息</span></span><br><span class="line">    <span class="variable language_">window</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;message&#x27;</span>, <span class="variable language_">this</span>.<span class="property">receiveMessage</span>.<span class="title function_">bind</span>(<span class="variable language_">this</span>), <span class="literal">false</span>);</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="comment">   * 处理接收消息</span></span><br><span class="line"><span class="comment">   * <span class="doctag">@param</span> <span class="variable">event</span></span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line">  <span class="title function_">receiveMessage</span>(<span class="params"><span class="attr">event</span>: <span class="title class_">MessageEvent</span></span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> &#123; data = &#123;&#125; &#125; = event;</span><br><span class="line">    <span class="keyword">if</span> (<span class="keyword">typeof</span> data === <span class="string">&#x27;string&#x27;</span>) <span class="keyword">return</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> &#123; eventType, randomKey, value &#125; = data;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (eventType === <span class="string">&#x27;return&#x27;</span>) &#123;</span><br><span class="line">      <span class="keyword">const</span> handler = <span class="variable language_">this</span>.<span class="property">waitMap</span>.<span class="title function_">get</span>(randomKey);</span><br><span class="line"></span><br><span class="line">      <span class="keyword">if</span> (handler) &#123;</span><br><span class="line">        <span class="title function_">handler</span>(value);</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">waitMap</span>.<span class="title function_">delete</span>(randomKey);</span><br><span class="line">      &#125;</span><br><span class="line">    &#125; <span class="keyword">else</span> <span class="keyword">if</span> (eventType === <span class="string">&#x27;ready&#x27;</span>) &#123;</span><br><span class="line">      <span class="variable language_">this</span>.<span class="property">isReady</span> = <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line">      <span class="keyword">while</span> (<span class="variable language_">this</span>.<span class="property">beforeReady</span>.<span class="property">length</span>) &#123;</span><br><span class="line">        <span class="keyword">const</span> fun = <span class="variable language_">this</span>.<span class="property">beforeReady</span>.<span class="title function_">shift</span>() <span class="keyword">as</span> <span class="title class_">Function</span>;</span><br><span class="line">        <span class="title function_">fun</span>();</span><br><span class="line">      &#125;</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="comment">   * 获取随机字符串</span></span><br><span class="line"><span class="comment">   * <span class="doctag">@param</span> <span class="variable">eventKey</span></span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line">  <span class="title function_">getRandomString</span>(<span class="params"><span class="attr">eventKey</span>: <span class="built_in">string</span></span>) &#123;</span><br><span class="line">    <span class="keyword">let</span> randomString = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">    <span class="keyword">let</span> eventKeyRandom = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">do</span> &#123;</span><br><span class="line">      randomString = <span class="title function_">makeRandomString</span>(<span class="number">5</span>);</span><br><span class="line">      eventKeyRandom = <span class="string">`<span class="subst">$&#123;eventKey&#125;</span>_<span class="subst">$&#123;randomString&#125;</span>`</span>;</span><br><span class="line">    &#125; <span class="keyword">while</span> (<span class="variable language_">this</span>.<span class="property">waitMap</span>.<span class="title function_">has</span>(eventKeyRandom));</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> eventKeyRandom;</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="comment">   * 向iframe中发送消息</span></span><br><span class="line"><span class="comment">   * <span class="doctag">@param</span> <span class="variable">params</span></span></span><br><span class="line"><span class="comment">   */</span></span><br><span class="line">  <span class="title function_">postMessage</span>(<span class="params"><span class="attr">params</span>: <span class="title class_">Record</span>&lt;<span class="built_in">string</span>, <span class="built_in">string</span>&gt;</span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> (<span class="variable language_">this</span>.<span class="property">isReady</span>) &#123;</span><br><span class="line">      (<span class="variable language_">this</span>.<span class="property">iframe</span>.<span class="property">contentWindow</span> <span class="keyword">as</span> <span class="title class_">Window</span>).<span class="title function_">postMessage</span>(params, <span class="string">&#x27;*&#x27;</span>);</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      <span class="variable language_">this</span>.<span class="property">beforeReady</span>.<span class="title function_">push</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">        (<span class="variable language_">this</span>.<span class="property">iframe</span>.<span class="property">contentWindow</span> <span class="keyword">as</span> <span class="title class_">Window</span>).<span class="title function_">postMessage</span>(params, <span class="string">&#x27;*&#x27;</span>);</span><br><span class="line">      &#125;);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="iframe-页面"><a href="#iframe-页面" class="headerlink" title="iframe 页面"></a>iframe 页面</h2><p>iframe 页面只需要通过 postMessage 和父级页面进行通信，所以并不需要 ui。</p><h3 id="ready"><a href="#ready" class="headerlink" title="ready"></a>ready</h3><p>页面加载完成时，需要通知父页面，并执行 before 栈中的函数。</p><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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable language_">window</span>.<span class="property">parent</span>.<span class="title function_">postMessage</span>(</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="attr">eventType</span>: <span class="string">&#x27;ready&#x27;</span>,</span><br><span class="line">  &#125;,</span><br><span class="line">  <span class="string">&#x27;*&#x27;</span></span><br><span class="line">);</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><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">function</span> <span class="title function_">receiveMessage</span>(<span class="params">event</span>) &#123;</span><br><span class="line">  <span class="comment">// 用来标记当前事件是 读/取 或者其他</span></span><br><span class="line">  <span class="keyword">const</span> eventType = <span class="title function_">get</span>(event, <span class="string">&#x27;data.eventType&#x27;</span>, <span class="string">&#x27;&#x27;</span>);</span><br><span class="line">  <span class="comment">// 数据 key</span></span><br><span class="line">  <span class="keyword">const</span> key = <span class="title function_">get</span>(event, <span class="string">&#x27;data.key&#x27;</span>, <span class="string">&#x27;&#x27;</span>);</span><br><span class="line">  <span class="comment">// 数据</span></span><br><span class="line">  <span class="keyword">const</span> value = <span class="title function_">get</span>(event, <span class="string">&#x27;data.value&#x27;</span>, <span class="string">&#x27;&#x27;</span>);</span><br><span class="line">  <span class="comment">// 当前事件标识，用于父级页面区分当前消息来自哪次调用</span></span><br><span class="line">  <span class="keyword">const</span> randomKey = <span class="title function_">get</span>(event, <span class="string">&#x27;data.randomKey&#x27;</span>, <span class="string">&#x27;&#x27;</span>);</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 只以存数据为例</span></span><br><span class="line">  <span class="keyword">if</span>(eventType === <span class="string">&#x27;set&#x27;</span>) &#123;</span><br><span class="line">    <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(key, value);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 通知父级页面存储成功</span></span><br><span class="line">    <span class="variable language_">window</span>.<span class="property">parent</span>.<span class="title function_">postMessage</span>(</span><br><span class="line">      &#123;</span><br><span class="line">        <span class="attr">eventType</span>: <span class="string">&#x27;return&#x27;</span>,</span><br><span class="line">        value,</span><br><span class="line">        randomKey,</span><br><span class="line">        error,</span><br><span class="line">      &#125;,</span><br><span class="line">      <span class="string">&#x27;*&#x27;</span></span><br><span class="line">    );</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="variable language_">window</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;message&#x27;</span>, receiveMessage, <span class="literal">false</span>);</span><br></pre></td></tr></table></figure><h1 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h1><p>在 <code>a.jekeyu.top</code> 中存储数据</p><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">new</span> <span class="title function_">localStorage</span>().<span class="title function_">setItem</span>(<span class="string">&#x27;name&#x27;</span>, <span class="string">&#x27;jake&#x27;</span>)</span><br></pre></td></tr></table></figure><p>在 <code>b.jekeyu.top</code> 中存储数据</p><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> name = <span class="keyword">await</span> <span class="keyword">new</span> <span class="title function_">localStorage</span>().<span class="title function_">getItem</span>(<span class="string">&#x27;name&#x27;</span>)</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;img src=&quot;/images/%E8%B7%A8%E5%9F%9F%E5%90%8D%E8%AF%BB%E5%8F%96localStorage/de1cd54ffb.png&quot;&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="前端" scheme="https://i.jakeyu.top/categories/%E5%89%8D%E7%AB%AF/"/>
    
    
    <category term="JS" scheme="https://i.jakeyu.top/tags/JS/"/>
    
</entry>
  
<entry>
    <title>使用docker部署Hexo博客</title>
    <link href="https://i.jakeyu.top/2020/03/18/%E4%BD%BF%E7%94%A8docker%E9%83%A8%E7%BD%B2Hexo%E5%8D%9A%E5%AE%A2/"/>
    <id>https://i.jakeyu.top/2020/03/18/%E4%BD%BF%E7%94%A8docker%E9%83%A8%E7%BD%B2Hexo%E5%8D%9A%E5%AE%A2/</id>
    <published>2020-03-18T00:25:47.000Z</published>
    <updated>2026-05-06T17:36:23.393Z</updated>
    
    <content type="html"><![CDATA[<p>经常迁移博客是件头疼的事，每次都要折腾一堆文件，所以折腾了一下，使用docker部署博客。</p><p><img src="/images/%E4%BD%BF%E7%94%A8docker%E9%83%A8%E7%BD%B2Hexo%E5%8D%9A%E5%AE%A2/vertical-logo-monochromatic-1.png"></p><span id="more"></span><h1 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h1><p>Docker 是一个开源的应用容器引擎，基于 Go 语言 并遵从 Apache2.0 协议开源。</p><p>Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中，然后发布到任何流行的 Linux 机器上，也可以实现虚拟化。</p><p>容器是完全使用沙箱机制，相互之间不会有任何接口（类似 iPhone 的 app）,更重要的是容器性能开销极低。</p><h1 id="文件"><a href="#文件" class="headerlink" title="文件"></a>文件</h1><h2 id="DockerFile"><a href="#DockerFile" class="headerlink" title="DockerFile"></a>DockerFile</h2><p>创建 <code>DockerFile</code></p><blockquote><p>配置中的路径根据自己实际路径调整</p></blockquote><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><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line">FROM centos:6</span><br><span class="line">ENV container docker</span><br><span class="line"></span><br><span class="line"># 添加环境</span><br><span class="line">RUN yum -y update &amp;&amp;\</span><br><span class="line">    yum -y install epel-release &amp;&amp;\</span><br><span class="line">    yum -y install nginx &amp;&amp;\</span><br><span class="line">    yum -y install vim &amp;&amp;\</span><br><span class="line">    yum install passwd openssl openssh-server openssh-clients -y &amp;&amp;\</span><br><span class="line">    yum install initscripts -y</span><br><span class="line"></span><br><span class="line"># 更新源，用于安装 git 2.x，修复 --work-tree 不能和 --git-dir 同名问题</span><br><span class="line">RUN yum -y install wget &amp;&amp;\</span><br><span class="line">    wget http://opensource.wandisco.com/centos/6/git/x86_64/wandisco-git-release-6-1.noarch.rpm &amp;&amp;\</span><br><span class="line">    rpm -ivh wandisco-git-release-6-1.noarch.rpm &amp;&amp;\</span><br><span class="line">    yum -y install git</span><br><span class="line"></span><br><span class="line"># 安装zsh</span><br><span class="line">RUN yum install -y zsh &amp;&amp;\</span><br><span class="line">    wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh</span><br><span class="line"></span><br><span class="line"># 创建目录</span><br><span class="line">RUN mkdir -p /home/blog</span><br><span class="line">WORKDIR /home</span><br><span class="line"></span><br><span class="line"># 添加 blog git钩子</span><br><span class="line">RUN git init --bare blog.git</span><br><span class="line">RUN echo -e &#x27;#!/bin/bash\ngit --work-tree=/home/blog --git-dir=/home/blog.git checkout -f&#x27; &gt;&gt; blog.git/hooks/post-receive</span><br><span class="line">RUN chmod +x blog.git/hooks/post-receive</span><br><span class="line"></span><br><span class="line"># 创建日志文件</span><br><span class="line">RUN mkdir -p /home/log</span><br><span class="line">WORKDIR /home/log</span><br><span class="line">RUN touch blog.log</span><br><span class="line"></span><br><span class="line"># 配置 nginx</span><br><span class="line">WORKDIR /etc/nginx</span><br><span class="line">COPY ./nginx ./conf.d</span><br><span class="line"># 解决执行 nginx 报错</span><br><span class="line">RUN nginx -c /etc/nginx/nginx.conf</span><br><span class="line"></span><br><span class="line"># 导入自动执行脚本</span><br><span class="line">COPY ./start.sh /root/start.sh</span><br><span class="line">RUN chmod +x /root/start.sh</span><br><span class="line"></span><br><span class="line"># 切换工作目录</span><br><span class="line">WORKDIR /home</span><br><span class="line"></span><br><span class="line"># 启动服务</span><br><span class="line">CMD /root/start.sh</span><br><span class="line"></span><br><span class="line"># 端口，使用81 端口避免和 nginx默认端口冲突</span><br><span class="line"># 22 端口为 ssh 所用</span><br><span class="line">EXPOSE 9022:22 9081:81</span><br></pre></td></tr></table></figure><h2 id="nginx"><a href="#nginx" class="headerlink" title="nginx"></a>nginx</h2><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><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">server &#123;</span><br><span class="line">    listen 81;</span><br><span class="line">    server_name i.jakeyu.top;</span><br><span class="line">    # 处理 nginx 自动 301 加斜杠以及端口问题</span><br><span class="line">    server_name_in_redirect on;</span><br><span class="line">    port_in_redirect off;</span><br><span class="line"></span><br><span class="line">    location / &#123;</span><br><span class="line">        root /home/blog;</span><br><span class="line">        error_page   404 https://i.jakeyu.top/404.html;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    access_log  /home/log/blog.log;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="start-sh"><a href="#start-sh" class="headerlink" title="start.sh"></a>start.sh</h2><figure class="highlight sh"><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/sh</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动 sshd 服务</span></span><br><span class="line">service sshd start</span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动nginx</span></span><br><span class="line">nginx</span><br><span class="line"></span><br><span class="line"><span class="comment"># 防止容器退出</span></span><br><span class="line">/bin/sh</span><br></pre></td></tr></table></figure><h1 id="构建"><a href="#构建" class="headerlink" title="构建"></a>构建</h1><p>在 <code>DockerFile</code> 所在目录执行</p><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">docker build -t blog:v1 .</span><br></pre></td></tr></table></figure><h1 id="启动容器"><a href="#启动容器" class="headerlink" title="启动容器"></a>启动容器</h1><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">docker run -ti -d -p 9081:81 -p 9022:22 blog:v1</span><br></pre></td></tr></table></figure><h1 id="ssh配置"><a href="#ssh配置" class="headerlink" title="ssh配置"></a>ssh配置</h1><p>查看所有容器，找到想要配置的 <code>container id</code></p><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">docker ps -a</span><br></pre></td></tr></table></figure><p>进入容器</p><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">docker <span class="built_in">exec</span> -ti [container <span class="built_in">id</span>] /bin/zsh</span><br></pre></td></tr></table></figure><p>把宿主机的 <code>~/.ssh/id_rsa.pub</code> 文件 copy 到容器 <code>~/.ssh/authorized_keys</code> 中</p><p>重启ssh服务：</p><figure class="highlight zsh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">service sshd restart</span><br></pre></td></tr></table></figure><h1 id="部署博客"><a href="#部署博客" class="headerlink" title="部署博客"></a>部署博客</h1><h2 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h2><p>修改 Hexo 博客的配置文件 <code>_config.yml</code></p><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">deploy:</span><br><span class="line">  type: git</span><br><span class="line">  repo:</span><br><span class="line">    ssh: ssh://root@ip:port/home/blog.git</span><br><span class="line">  branch: master</span><br></pre></td></tr></table></figure><p>把 <code>ip</code> 和 <code>port</code> 换成和自己相对应的，比如在这里 <code>port</code> 就是 <code>9022</code>。</p><h2 id="部署"><a href="#部署" class="headerlink" title="部署"></a>部署</h2><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">hexo d</span><br></pre></td></tr></table></figure><h2 id="访问"><a href="#访问" class="headerlink" title="访问"></a>访问</h2><p>使用 <code>curl</code> 测试</p><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">curl 127.0.0.1:81</span><br></pre></td></tr></table></figure><h1 id="删除"><a href="#删除" class="headerlink" title="删除"></a>删除</h1><h2 id="批量删除容器"><a href="#批量删除容器" class="headerlink" title="批量删除容器"></a>批量删除容器</h2><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">docker container <span class="built_in">rm</span> $(docker container <span class="built_in">ls</span> -a -q)</span><br></pre></td></tr></table></figure><h2 id="批量删除镜像"><a href="#批量删除镜像" class="headerlink" title="批量删除镜像"></a>批量删除镜像</h2><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">docker image <span class="built_in">rm</span> $(docker  image  <span class="built_in">ls</span>   -a  -q)</span><br></pre></td></tr></table></figure><h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><ul><li><a href="https://i.jakeyu.top/2016/12/06/Hexo%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA%E5%88%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%B9%B6%E8%87%AA%E5%8A%A8%E9%83%A8%E7%BD%B2/">Hexo博客部署到服务器</a></li><li><a href="https://blog.52itstyle.vip/archives/2402/">Docker学习之SSH连接docker容器</a></li><li><a href="https://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html">Docker 入门教程</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;经常迁移博客是件头疼的事，每次都要折腾一堆文件，所以折腾了一下，使用docker部署博客。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/%E4%BD%BF%E7%94%A8docker%E9%83%A8%E7%BD%B2Hexo%E5%8D%9A%E5%AE%A2/vertical-logo-monochromatic-1.png&quot;&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="前端" scheme="https://i.jakeyu.top/categories/%E5%89%8D%E7%AB%AF/"/>
    
    
    <category term="JS" scheme="https://i.jakeyu.top/tags/JS/"/>
    
</entry>
  
<entry>
    <title>拖拽文件夹上传文件</title>
    <link href="https://i.jakeyu.top/2019/02/25/%E6%8B%96%E6%8B%BD%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6/"/>
    <id>https://i.jakeyu.top/2019/02/25/%E6%8B%96%E6%8B%BD%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%8A%E4%BC%A0%E6%96%87%E4%BB%B6/</id>
    <published>2019-02-25T17:07:10.000Z</published>
    <updated>2026-05-06T17:36:23.394Z</updated>
    
    <content type="html"><![CDATA[<p><img src="/images/javascript-illustration.png"></p><span id="more"></span><h1 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h1><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><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">traverseFileTree</span>(<span class="params">item, path</span>) &#123;</span><br><span class="line">  path = path || <span class="string">&quot;&quot;</span>;</span><br><span class="line">  <span class="keyword">if</span> (item.<span class="property">isFile</span>) &#123;</span><br><span class="line">    <span class="comment">// Get file</span></span><br><span class="line">    item.<span class="title function_">file</span>(<span class="keyword">function</span>(<span class="params">file</span>) &#123;</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&quot;File:&quot;</span>, path + file.<span class="property">name</span>);</span><br><span class="line">    &#125;);</span><br><span class="line">  &#125; <span class="keyword">else</span> <span class="keyword">if</span> (item.<span class="property">isDirectory</span>) &#123;</span><br><span class="line">    <span class="comment">// Get folder contents</span></span><br><span class="line">    <span class="keyword">var</span> dirReader = item.<span class="title function_">createReader</span>();</span><br><span class="line">    <span class="title function_">readerEntries</span>(dirReader, path, item)</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">// readEntries 每次最多返回100个，需要重复调用</span></span><br><span class="line"><span class="comment">// https://developer.mozilla.org/en-US/docs/Web/API/FileSystemDirectoryReader/readEntries</span></span><br><span class="line">functoin <span class="title function_">readerEntries</span> (dirReader, path, item) &#123;</span><br><span class="line">  dirReader.<span class="title function_">readEntries</span>(<span class="function"><span class="params">entries</span> =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>; i &lt; entries.<span class="property">length</span>; i++) &#123;</span><br><span class="line">      <span class="title function_">traverseFileTree</span>(entries[i], path + item.<span class="property">name</span> + <span class="string">&#x27;/&#x27;</span>)</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (entries.<span class="property">length</span>) <span class="title function_">readerEntries</span>(dirReader, path, item)</span><br><span class="line">  &#125;)</span><br><span class="line">&#125;,</span><br><span class="line"></span><br><span class="line">dropArea.<span class="title function_">addEventListener</span>(<span class="string">&quot;drop&quot;</span>, <span class="keyword">function</span>(<span class="params">event</span>) &#123;</span><br><span class="line">  event.<span class="title function_">preventDefault</span>();</span><br><span class="line"></span><br><span class="line">  <span class="keyword">var</span> items = event.<span class="property">dataTransfer</span>.<span class="property">items</span>;</span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">var</span> i=<span class="number">0</span>; i&lt;items.<span class="property">length</span>; i++) &#123;</span><br><span class="line">    <span class="comment">// webkitGetAsEntry is where the magic happens</span></span><br><span class="line">    <span class="keyword">var</span> item = items[i].<span class="title function_">webkitGetAsEntry</span>();</span><br><span class="line">    <span class="keyword">if</span> (item) &#123;</span><br><span class="line">      <span class="title function_">traverseFileTree</span>(item);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;, <span class="literal">false</span>);</span><br></pre></td></tr></table></figure><h1 id="兼容性"><a href="#兼容性" class="headerlink" title="兼容性"></a>兼容性</h1><a class="btn" href="https://caniuse.com/?search=mdn-api_datatransferitem_webkitgetasentry"><i class="fa fa-signal fa-fw fa-solid"></i>CanIUse</a><h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><ul><li><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileSystemDirectoryReader/readEntries">FileSystemDirectoryReader - MDN</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;img src=&quot;/images/javascript-illustration.png&quot;&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="前端" scheme="https://i.jakeyu.top/categories/%E5%89%8D%E7%AB%AF/"/>
    
    
    <category term="JS" scheme="https://i.jakeyu.top/tags/JS/"/>
    
</entry>
  
<entry>
    <title>Semver(npm 语义化版本号)</title>
    <link href="https://i.jakeyu.top/2019/01/10/Semver-npm-%E8%AF%AD%E4%B9%89%E5%8C%96%E7%89%88%E6%9C%AC%E5%8F%B7/"/>
    <id>https://i.jakeyu.top/2019/01/10/Semver-npm-%E8%AF%AD%E4%B9%89%E5%8C%96%E7%89%88%E6%9C%AC%E5%8F%B7/</id>
    <published>2019-01-10T09:58:01.000Z</published>
    <updated>2026-05-06T17:36:23.392Z</updated>
    
    <content type="html"><![CDATA[<p><img src="/images/semver/3649824190-5ad41542bc553_articlex.png"></p><span id="more"></span><h1 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h1><p>在软件管理的领域里存在着被称作“依赖地狱”的死亡之谷，系统规模越大，加入的包越多，你就越有可能在未来的某一天发现自己已深陷绝望之中。</p><p>在依赖高的系统中发布新版本包可能很快会成为噩梦。如果依赖关系过高，可能面临版本控制被锁死的风险（必须对每一个依赖包改版才能完成某次升级）。而如果依赖关系过于松散，又将无法避免版本的混乱（假设兼容于未来的多个版本已超出了合理数量）。当你专案的进展因为版本依赖被锁死或版本混乱变得不够简便和可靠，就意味着你正处于依赖地狱之中。</p><p>因此，Github 起草了一个具有指导意义的，统一的版本号表示规则，称为 Semantic Versioning(语义化版本表示)。该规则规定了版本号如何表示，如何增加，如何进行比较，不同的版本号意味着什么。</p><h1 id="版本格式"><a href="#版本格式" class="headerlink" title="版本格式"></a>版本格式</h1><p>版本格式：<code>主版本号.次版本号.修订号</code>，版本号递增规则如下：</p><ol><li>主版本号：当你做了不兼容的 API 修改，</li><li>次版本号：当你做了向下兼容的功能性新增，</li><li>修订号：当你做了向下兼容的问题修正。</li></ol><p>先行版本号及版本编译元数据可以加到<code>主版本号.次版本号.修订号</code>的后面，作为延伸。</p><h1 id="先行版本"><a href="#先行版本" class="headerlink" title="先行版本"></a>先行版本</h1><p>当要发布<strong>大版本</strong>或者<strong>核心的 Feature</strong> 时，但是又不能保证这个版本的功能 100% 正常。这个时候就需要通过发布先行版本。比较常见的先行版本包括：内测版、灰度版本了和 RC 版本。Semver规范中使用alpha、beta、rc (以前叫做gama)来修饰即将要发布的版本。它们的含义是：</p><ul><li>alpha: 内部版本</li><li>beta: 公测版本</li><li>rc: 即Release candiate，正式版本的候选版本</li></ul><p>比如：1.0.0-alpha.0, 1.0.0-alpha.1, 1.0.0-beta.0, 1.0.0-rc.0, 1.0.p-rc.1 等版本。alpha, beta, rc 后需要带上次数信息。</p><h1 id="版本发布准则"><a href="#版本发布准则" class="headerlink" title="版本发布准则"></a>版本发布准则</h1><p>列举出比较实用的一些规则：</p><ul><li>标准的版本号必须采用XYZ的格式，并且X、Y 和 Z 为非负的整数，禁止在数字前方补零，版本发布需要严格递增。例如：1.9.1 -&gt; 1.10.0 -&gt; 1.11.0。</li><li>某个软件版本发行后，任何修改都必须以新版本发行。</li><li>1.0.0 的版本号用于界定公共 API。当你的软件发布到了正式环境，或者有稳定的API时，就可以发布 1.0.0 版本了。</li><li>版本的优先层级指的是不同版本在排序时如何比较。判断优先层级时，必须把版本依序拆分为主版本号、次版本号、修订号及先行版本号后进行比较。</li></ul><h1 id="npm包依赖"><a href="#npm包依赖" class="headerlink" title="npm包依赖"></a>npm包依赖</h1><figure class="highlight json"><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;dependencies&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;react&quot;</span><span class="punctuation">:</span> <span class="string">&quot;^15.6.1&quot;</span><span class="punctuation">,</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><p>项目对包的依赖可以使用下面的 3 种方法来表示(假设当前版本号是 16.2.0):</p><ul><li>兼容模块新发布的补丁版本：~16.2.0、16.2.x、16.2</li><li>兼容模块新发布的小版本、补丁版本：^16.2.0、16.x、16</li><li>兼容模块新发布的大版本、小版本、补丁版本：*、x</li></ul><h2 id=""><a href="#" class="headerlink" title="^"></a>^</h2><blockquote><p>允许在不修改 [major, minor, patch] 中最左非零数字的更改（匹配大于 X、Y、Z 的更新 Y、Z 的版本号）</p></blockquote><p>在 X.Y.Z 结构的版本号中，X、Y、Z 都是非负的整数，上面定义的意思就是说从左向右，遇到第一个非零数字是不可修改的，下一个数字可以更改，比如:</p><ul><li>X、Y、Z 都不为 0，<code>^15.6.1</code>,最左的非零数字是15，所以 X 是不允许更新的，也就是说主版本号不会超过15，表示的就是版本号<code>&gt;=15.6.1 &amp;&amp; &lt;16.0.0</code></li><li>如果 X 为 0，那么第一个非零数字就是 Y，就只能对 z 做出修改，<code>^0.1.2</code>表示版本号<code>&gt;=0.1.2 &amp;&amp; &lt; 0.2.0</code></li><li>如果 X、Y 的数字都是 0 的话，第一个非零数字就是 Z，表示的就是版本号不允许更新；<code>^0.0.2</code>，主版本号和次版本号都是 0，修订号为非零，表示的就是版本号<code>&gt;=0.0.2 &amp;&amp; &lt; 0.0.3</code></li></ul><h2 id="-1"><a href="#-1" class="headerlink" title="~"></a>~</h2><blockquote><p>匹配大于 <code>X.Y.Z</code> 的更新 <code>Z</code> 的版本号</p></blockquote><ul><li>X、Y、Z 都不为 0，<code>~1.2.3</code> 表示版本号 <code>&gt;=1.2.3 &amp;&amp; &lt; 1.3.0</code></li><li>X 为 0，<code>~0.2.3</code> 表示版本号 <code>&gt;=0.2.3 &amp;&amp; &lt; 0.3.0</code>，这种情况下，~ 等价于 ^</li><li>X、Y 为0，<code>0.0.3</code> 表示版本号 <code>&gt;=0.0.3 &amp;&amp; &lt; 0.1.0</code></li></ul><h2 id="x"><a href="#x" class="headerlink" title="x"></a>x</h2><blockquote><p>可以替代 X、Y、Z 中任意一个，表示该位置可更新</p></blockquote><ul><li><strong>1.2.x</strong>: <code>&gt;=1.2.0 &amp;&amp; &lt; 1.3.0</code></li><li><strong>1.x</strong>: <code>&gt;=1.0.0 &amp;&amp; &lt; 2.0.0</code></li><li><strong>*</strong>: 任意版本都可以</li></ul><p>上面的 <code>x</code> 可以用 <code>*</code> 代替，其实，用 <code>x</code> 或 <code>*</code> 的地方可以省略不写，比如 <code>1.2.x</code> 和 <code>1.2</code> 表示的意思是一样的</p><h1 id="npm包发布"><a href="#npm包发布" class="headerlink" title="npm包发布"></a>npm包发布</h1><p>通常我们发布一个包到 npm 仓库时，我们的做法是先修改 <code>package.json</code> 为某个版本，然后执行 <code>npm publish</code> 命令。手动修改版本号的做法建立在你对 Semver 规范特别熟悉的基础之上，否则可能会造成版本混乱。npm 考虑到了这点，它提供了相关的命令来让我们更好的遵从 Semver 规范：</p><ul><li>升级补丁版本号：npm version patch</li><li>升级小版本号：npm version minor</li><li>升级大版本号：npm version major</li></ul><p>当执行 <code>npm publish</code> 时，会首先将当前版本发布到 <code>npm registry</code>，然后更新 <code>dist-tags.latest</code> 的值为新版本。<br>当执行 <code>npm publish --tag=next</code> 时，会首先将当前版本发布到 <code>npm registry</code>，并且更新 <code>dist-tags.next</code> 的值为新版本。这里的 next 可以是任意有意义的命名（比如：v1.x、v2.x 等等）</p><h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><ul><li><a href="https://semver.org/lang/zh-CN/">https://semver.org/lang/zh-CN/</a></li><li><a href="https://juejin.im/post/5ad413ba6fb9a028b5485866">Semver(语义化版本号)扫盲 - 腾讯IVWEB团队</a></li><li><a href="https://juejin.im/post/5a1ad2166fb9a044fd117874">语义化版本控制模块-Semver</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;img src=&quot;/images/semver/3649824190-5ad41542bc553_articlex.png&quot;&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="前端" scheme="https://i.jakeyu.top/categories/%E5%89%8D%E7%AB%AF/"/>
    
    
    <category term="JS" scheme="https://i.jakeyu.top/tags/JS/"/>
    
</entry>
  
<entry>
    <title>antd upload组件不能显示参数图片缩略图</title>
    <link href="https://i.jakeyu.top/2018/12/13/antd-upload%E7%BB%84%E4%BB%B6%E4%B8%8D%E8%83%BD%E6%98%BE%E7%A4%BA%E5%8F%82%E6%95%B0%E5%9B%BE%E7%89%87%E7%BC%A9%E7%95%A5%E5%9B%BE/"/>
    <id>https://i.jakeyu.top/2018/12/13/antd-upload%E7%BB%84%E4%BB%B6%E4%B8%8D%E8%83%BD%E6%98%BE%E7%A4%BA%E5%8F%82%E6%95%B0%E5%9B%BE%E7%89%87%E7%BC%A9%E7%95%A5%E5%9B%BE/</id>
    <published>2018-12-13T19:43:05.000Z</published>
    <updated>2026-05-06T17:36:23.392Z</updated>
    
    <content type="html"><![CDATA[<p>在使用<a href="https://vuecomponent.github.io/ant-design-vue/docs/vue/introduce-cn/">ant-design-vue</a>的upload组件时，无法显示加密图片，经过测试，凡是带参数的图片地址都无法显示缩略图。</p><span id="more"></span><h1 id="base64"><a href="#base64" class="headerlink" title="base64"></a>base64</h1><p>这个组件是基于<a href="https://github.com/ant-design/ant-design">ant-design</a>改写的，在issues中发现了解决办法 <a href="https://github.com/ant-design/ant-design/issues/10102#issuecomment-382748024">#10102</a></p><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><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> *  将图片转换成base64</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> &#123;<span class="type">String</span>&#125; url 图片地址</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> base64Url = <span class="keyword">function</span> (<span class="params">url</span>) &#123;</span><br><span class="line">  <span class="keyword">let</span> xhr = <span class="keyword">new</span> <span class="title class_">XMLHttpRequest</span>()</span><br><span class="line">  xhr.<span class="property">onload</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">let</span> reader = <span class="keyword">new</span> <span class="title class_">FileReader</span>()</span><br><span class="line">    reader.<span class="property">onloadend</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">      self.<span class="title function_">postMessage</span>(reader.<span class="property">result</span>) <span class="comment">//web worker 通信</span></span><br><span class="line">    &#125;</span><br><span class="line">    reader.<span class="title function_">readAsDataURL</span>(xhr.<span class="property">response</span>)</span><br><span class="line">  &#125;</span><br><span class="line">  xhr.<span class="title function_">open</span>(<span class="string">&#x27;GET&#x27;</span>, url)</span><br><span class="line">  xhr.<span class="property">responseType</span> = <span class="string">&#x27;blob&#x27;</span></span><br><span class="line">  xhr.<span class="title function_">send</span>()</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>通过<code>ajax</code>获取图片，并将图片转为<code>base64</code>。</p><h1 id="Web-Worker"><a href="#Web-Worker" class="headerlink" title="Web Worker"></a>Web Worker</h1><p>但是由于我开发的业务页面中有大量图片，如果每个图片都这样操作，页面会有些卡顿。所以需要进行优化。</p><p>我选择使用<code>Web Worker</code>，关于<code>Web Worker</code>可以查看阮一峰老师的文章： </p><ul><li><a href="http://www.ruanyifeng.com/blog/2018/07/web-worker.html">Web Worker 使用教程</a></li></ul><p>创建一个生成<code>Web Worker</code>的函数：</p><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><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 创建web worker</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> &#123;<span class="type">Function</span>&#125; f 要在worker中执行的函数</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> &#123;<span class="type">Strint</span>&#125; args 函数参数</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> <span class="title function_">createWorker</span> = (<span class="params">f, args</span>) =&gt; &#123;</span><br><span class="line">  <span class="keyword">var</span> blob = <span class="keyword">new</span> <span class="title class_">Blob</span>([<span class="string">&#x27;(&#x27;</span> + f.<span class="title function_">toString</span>() + <span class="string">&#x27;)(&quot;&#x27;</span> + args + <span class="string">&#x27;&quot;)&#x27;</span>])</span><br><span class="line">  <span class="keyword">var</span> url = <span class="variable language_">window</span>.<span class="property">URL</span>.<span class="title function_">createObjectURL</span>(blob)</span><br><span class="line">  <span class="keyword">var</span> worker = <span class="keyword">new</span> <span class="title class_">Worker</span>(url)</span><br><span class="line">  <span class="keyword">return</span> worker</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>调用</p><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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> myWorker = <span class="title function_">createWorker</span>(base64Url, url)</span><br><span class="line"><span class="comment">// 监听message事件</span></span><br><span class="line">myWorker.<span class="property">onmessage</span> = <span class="function">(<span class="params">data</span>) =&gt;</span> &#123;</span><br><span class="line">  <span class="variable language_">console</span>.<span class="title function_">log</span>(data.<span class="property">data</span>)  <span class="comment">//打印转换后的base64</span></span><br><span class="line">  myWorker.<span class="title function_">terminate</span>()  <span class="comment">//销毁 web worker</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;在使用&lt;a href=&quot;https://vuecomponent.github.io/ant-design-vue/docs/vue/introduce-cn/&quot;&gt;ant-design-vue&lt;/a&gt;的upload组件时，无法显示加密图片，经过测试，凡是带参数的图片地址都无法显示缩略图。&lt;/p&gt;</summary>
    
    
    
    <category term="前端" scheme="https://i.jakeyu.top/categories/%E5%89%8D%E7%AB%AF/"/>
    
    
    <category term="JS" scheme="https://i.jakeyu.top/tags/JS/"/>
    
</entry>
  
<entry>
    <title>Object 方法</title>
    <link href="https://i.jakeyu.top/2018/12/10/Object-preventExtensions-Object-seal-Object-freeze/"/>
    <id>https://i.jakeyu.top/2018/12/10/Object-preventExtensions-Object-seal-Object-freeze/</id>
    <published>2018-12-10T09:51:48.000Z</published>
    <updated>2026-05-06T17:36:23.392Z</updated>
    
    <content type="html"><![CDATA[<table><thead><tr><th align="left">方法</th><th align="left">描述</th><th>详情</th></tr></thead><tbody><tr><td align="left">Object.preventExtensions()</td><td align="left">让一个对象变的不可扩展，也就是永远不能再添加新的属性。</td><td><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/preventExtensions">MDN</a></td></tr><tr><td align="left">Object.isExtensible()</td><td align="left">判断一个对象是否是可扩展的（是否可以在它上面添加新的属性）。</td><td><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible">MDN</a></td></tr><tr><td align="left">Object.seal()</td><td align="left">封闭一个对象，阻止添加新属性并将所有现有属性标记为不可配置。当前属性的值只要可写就可以改变。</td><td><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/seal">MDN</a></td></tr><tr><td align="left">Object.isSealed()</td><td align="left">判断一个对象是否被密封。</td><td><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed">MDN</a></td></tr><tr><td align="left">Object.freeze()</td><td align="left">冻结一个对象，冻结指的是不能向这个对象添加新的属性，不能修改其已有属性的值，不能删除已有属性，以及不能修改该对象已有属性的可枚举性、可配置性、可写性。该方法返回被冻结的对象。</td><td><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze">MDN</a></td></tr><tr><td align="left">Object.isFrozen()</td><td align="left">判断一个对象是否被冻结。</td><td><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen">MDN</a></td></tr></tbody></table>]]></content>
    
    
      
      
    <summary type="html">&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;left&quot;&gt;方法&lt;/th&gt;
&lt;th align=&quot;left&quot;&gt;描述&lt;/th&gt;
&lt;th&gt;详情&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;Object.preven</summary>
      
    
    
    
    <category term="前端" scheme="https://i.jakeyu.top/categories/%E5%89%8D%E7%AB%AF/"/>
    
    
    <category term="JS" scheme="https://i.jakeyu.top/tags/JS/"/>
    
</entry>
  
<entry>
    <title>flex的各种值</title>
    <link href="https://i.jakeyu.top/2018/12/08/flex%E7%9A%84%E5%90%84%E7%A7%8D%E5%80%BC/"/>
    <id>https://i.jakeyu.top/2018/12/08/flex%E7%9A%84%E5%90%84%E7%A7%8D%E5%80%BC/</id>
    <published>2018-12-08T17:51:26.000Z</published>
    <updated>2026-05-06T17:36:23.392Z</updated>
    
    <content type="html"><![CDATA[<p><img src="/images/flex%E7%9A%84%E5%90%84%E7%A7%8D%E5%80%BC/bg2015071002.png"></p><span id="more"></span><h1 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h1><blockquote><p>2009年，W3C 提出了一种新的方案—-Flex 布局，可以简便、完整、响应式地实现各种页面布局。目前，它已经得到了所有浏览器的支持，这意味着，现在就能很安全地使用这项功能。</p></blockquote><p>关于详细<code>flex</code>使用，可以查看<a href="http://www.ruanyifeng.com/">阮一峰</a>的两篇文章:</p><ul><li><a href="http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html?utm_source=tuicool">Flex 布局教程：语法篇</a></li><li><a href="http://www.ruanyifeng.com/blog/2015/07/flex-examples.html">Flex 布局教程：实例篇</a></li></ul><h1 id="正文"><a href="#正文" class="headerlink" title="正文"></a>正文</h1><p>首先明确一点是， <code>flex</code> 是 <code>flex-grow</code>、<code>flex-shrink</code>、<code>flex-basis</code>的缩写。故其取值可以考虑以下情况：</p><p><code>flex</code> 的默认值是以上三个属性值的组合。假设以上三个属性同样取默认值，则 <code>flex</code> 的默认值是 <code>0 1 auto</code>。同理，如下是等同的：</p><figure class="highlight css"><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="selector-class">.item</span> &#123;<span class="attribute">flex</span>: <span class="number">2333</span> <span class="number">3222</span> <span class="number">234px</span>;&#125;</span><br><span class="line"><span class="selector-class">.item</span> &#123;</span><br><span class="line">    <span class="attribute">flex-grow</span>: <span class="number">2333</span>;</span><br><span class="line">    <span class="attribute">flex-shrink</span>: <span class="number">3222</span>;</span><br><span class="line">    <span class="attribute">flex-basis</span>: <span class="number">234px</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>当 <code>flex</code> 取值为 <code>none</code>，则计算值为 <code>0 0 auto</code>，如下是等同的：</p><figure class="highlight css"><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="selector-class">.item</span> &#123;<span class="attribute">flex</span>: none;&#125;</span><br><span class="line"><span class="selector-class">.item</span> &#123;</span><br><span class="line">    <span class="attribute">flex-grow</span>: <span class="number">0</span>;</span><br><span class="line">    <span class="attribute">flex-shrink</span>: <span class="number">0</span>;</span><br><span class="line">    <span class="attribute">flex-basis</span>: auto;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>当 <code>flex</code> 取值为 <code>auto</code>，则计算值为 <code>1 1 auto</code>，如下是等同的：</p><figure class="highlight css"><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="selector-class">.item</span> &#123;<span class="attribute">flex</span>: auto;&#125;</span><br><span class="line"><span class="selector-class">.item</span> &#123;</span><br><span class="line">    <span class="attribute">flex-grow</span>: <span class="number">1</span>;</span><br><span class="line">    <span class="attribute">flex-shrink</span>: <span class="number">1</span>;</span><br><span class="line">    <span class="attribute">flex-basis</span>: auto;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>当 <code>flex</code> 取值为一个非负数字，则该数字为 <code>flex-grow</code> 值，<code>flex-shrink</code> 取 1，<code>flex-basis</code> 取 0%，如下是等同的：</p><figure class="highlight css"><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="selector-class">.item</span> &#123;<span class="attribute">flex</span>: <span class="number">1</span>;&#125;</span><br><span class="line"><span class="selector-class">.item</span> &#123;</span><br><span class="line">    <span class="attribute">flex-grow</span>: <span class="number">1</span>;</span><br><span class="line">    <span class="attribute">flex-shrink</span>: <span class="number">1</span>;</span><br><span class="line">    <span class="attribute">flex-basis</span>: <span class="number">0%</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>当 <code>flex</code> 取值为一个长度或百分比，则视为 <code>flex-basis</code> 值，<code>flex-grow</code> 取 1，<code>flex-shrink</code> 取 1，有如下等同情况（注意 <code>0%</code> 是一个百分比而不是一个非负数字）：</p><figure class="highlight css"><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></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.item-1</span> &#123;<span class="attribute">flex</span>: <span class="number">0%</span>;&#125;</span><br><span class="line"><span class="selector-class">.item-1</span> &#123;</span><br><span class="line">    <span class="attribute">flex-grow</span>: <span class="number">1</span>;</span><br><span class="line">    <span class="attribute">flex-shrink</span>: <span class="number">1</span>;</span><br><span class="line">    <span class="attribute">flex-basis</span>: <span class="number">0%</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.item-2</span> &#123;<span class="attribute">flex</span>: <span class="number">24px</span>;&#125;</span><br><span class="line"><span class="selector-class">.item-2</span> &#123;</span><br><span class="line">    <span class="attribute">flex-grow</span>: <span class="number">1</span>;</span><br><span class="line">    <span class="attribute">flex-shrink</span>: <span class="number">1</span>;</span><br><span class="line">    <span class="attribute">flex-basis</span>: <span class="number">24px</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>当 <code>flex</code> 取值为两个非负数字，则分别视为 <code>flex-grow</code> 和 <code>flex-shrink</code> 的值，<code>flex-basis</code> 取 0%，如下是等同的：</p><figure class="highlight css"><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="selector-class">.item</span> &#123;<span class="attribute">flex</span>: <span class="number">2</span> <span class="number">3</span>;&#125;</span><br><span class="line"><span class="selector-class">.item</span> &#123;</span><br><span class="line">    <span class="attribute">flex-grow</span>: <span class="number">2</span>;</span><br><span class="line">    <span class="attribute">flex-shrink</span>: <span class="number">3</span>;</span><br><span class="line">    <span class="attribute">flex-basis</span>: <span class="number">0%</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>当 <code>flex</code> 取值为一个非负数字和一个长度或百分比，则分别视为 <code>flex-grow</code> 和 <code>flex-basis</code> 的值，<code>flex-shrink</code> 取 1，如下是等同的：</p><figure class="highlight css"><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="selector-class">.item</span> &#123;<span class="attribute">flex</span>: <span class="number">2333</span> <span class="number">3222px</span>;&#125;</span><br><span class="line"><span class="selector-class">.item</span> &#123;</span><br><span class="line">    <span class="attribute">flex-grow</span>: <span class="number">2333</span>;</span><br><span class="line">    <span class="attribute">flex-shrink</span>: <span class="number">1</span>;</span><br><span class="line">    <span class="attribute">flex-basis</span>: <span class="number">3222px</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><code>flex-basis</code> 规定的是子元素的基准值。所以是否溢出的计算与此属性息息相关。<code>flex-basis</code> 规定的范围取决于 <code>box-sizing</code>。这里主要讨论以下 <code>flex-basis</code> 的取值情况：</p><ul><li><strong>auto</strong>：首先检索该子元素的主尺寸，如果主尺寸不为 <code>auto</code>，则使用值采取主尺寸之值；如果也是 <code>auto</code>，则使用值为 <code>content</code>。</li><li><strong>content</strong>：指根据该子元素的内容自动布局。有的用户代理没有实现取 <code>content</code> 值，等效的替代方案是 <code>flex-basis</code> 和主尺寸都取 <code>auto</code>。</li><li><strong>百分比</strong>：根据其包含块（即伸缩父容器）的主尺寸计算。如果包含块的主尺寸未定义（即父容器的主尺寸取决于子元素），则计算结果和设为 <code>auto</code> 一样。</li></ul><p>举一个不同的值之间的区别：</p><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></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;parent&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;item-1&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;item-2&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;item-3&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight css"><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></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.parent</span> &#123;</span><br><span class="line">    <span class="attribute">display</span>: flex;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">600px</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.parent</span> &gt; <span class="selector-tag">div</span> &#123;</span><br><span class="line">    <span class="attribute">height</span>: <span class="number">100px</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.item-1</span> &#123;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">140px</span>;</span><br><span class="line">    <span class="attribute">flex</span>: <span class="number">2</span> <span class="number">1</span> <span class="number">0%</span>;</span><br><span class="line">    <span class="attribute">background</span>: blue;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.item-2</span> &#123;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">100px</span>;</span><br><span class="line">    <span class="attribute">flex</span>: <span class="number">2</span> <span class="number">1</span> auto;</span><br><span class="line">    <span class="attribute">background</span>: darkblue;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.item-3</span> &#123;</span><br><span class="line">    <span class="attribute">flex</span>: <span class="number">1</span> <span class="number">1</span> <span class="number">200px</span>;</span><br><span class="line">    <span class="attribute">background</span>: lightblue;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><iframe height='265' scrolling='no' title='flex 不同的值' src='//codepen.io/JakeLaoyu/embed/OrLrZP/?height=265&theme-id=light&default-tab=css,result' frameborder='no' allowtransparency='true' allowfullscreen='true' style='width: 100%;'>See the Pen <a href='https://codepen.io/JakeLaoyu/pen/OrLrZP/'>flex 不同的值</a> by Jake (<a href='https://codepen.io/JakeLaoyu'>@JakeLaoyu</a>) on <a href='https://codepen.io'>CodePen</a>.</iframe><ul><li>主轴上父容器总尺寸为 600px</li><li>子元素的总基准值是：0% + auto + 200px &#x3D; 300px，其中<ul><li>0% 即 0 宽度</li><li>auto 对应取主尺寸即 100px</li></ul></li><li>故剩余空间为 600px - 300px &#x3D; 300px</li><li>伸缩放大系数之和为： 2 + 2 + 1 &#x3D; 5</li><li>剩余空间分配如下：<ul><li>item-1 和 item-2 各分配 2&#x2F;5，各得 120px</li><li>item-3 分配 1&#x2F;5，得 60px</li></ul></li><li>各项目最终宽度为：<ul><li>item-1 &#x3D; 0% + 120px &#x3D; 120px</li><li>item-2 &#x3D; auto + 120px &#x3D; 220px</li><li>item-3 &#x3D; 200px + 60px &#x3D; 260px</li></ul></li><li>当 item-1 基准值取 0% 的时候，是把该项目视为零尺寸的，故即便声明其尺寸为 140px，也并没有什么用，形同虚设</li><li>而 item-2 基准值取 <code>auto</code> 的时候，根据规则基准值使用值是主尺寸值即 100px，故这 100px 不会纳入剩余空间</li></ul><h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><ul><li><a href="https://segmentfault.com/q/1010000004080910/a-1020000004121373">https://segmentfault.com/q/1010000004080910/a-1020000004121373</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;img src=&quot;/images/flex%E7%9A%84%E5%90%84%E7%A7%8D%E5%80%BC/bg2015071002.png&quot;&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="前端" scheme="https://i.jakeyu.top/categories/%E5%89%8D%E7%AB%AF/"/>
    
    
    <category term="JS" scheme="https://i.jakeyu.top/tags/JS/"/>
    
</entry>
  
<entry>
    <title>层叠顺序（stacking level）与堆栈上下文（stacking context）</title>
    <link href="https://i.jakeyu.top/2018/12/01/%E5%B1%82%E5%8F%A0%E9%A1%BA%E5%BA%8F%EF%BC%88stacking-level%EF%BC%89%E4%B8%8E%E5%A0%86%E6%A0%88%E4%B8%8A%E4%B8%8B%E6%96%87%EF%BC%88stacking-context%EF%BC%89/"/>
    <id>https://i.jakeyu.top/2018/12/01/%E5%B1%82%E5%8F%A0%E9%A1%BA%E5%BA%8F%EF%BC%88stacking-level%EF%BC%89%E4%B8%8E%E5%A0%86%E6%A0%88%E4%B8%8A%E4%B8%8B%E6%96%87%EF%BC%88stacking-context%EF%BC%89/</id>
    <published>2018-12-01T18:04:35.000Z</published>
    <updated>2026-05-06T17:36:23.394Z</updated>
    
    <content type="html"><![CDATA[<p><code>z-index</code> 看上去其实很简单，根据 <code>z-index</code> 的高低决定层叠的优先级，实则深入进去，会发现内有乾坤。</p><span id="more"></span><h1 id="正文"><a href="#正文" class="headerlink" title="正文"></a>正文</h1><p>看看下面这题，定义两个 <code>div</code> A 和 B，被包括在同一个父 <code>div</code> 标签下。HTML结构如下：</p><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></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;container&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;inline-block&quot;</span>&gt;</span>#divA display:inline-block<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;float&quot;</span>&gt;</span> #divB float:left<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight css"><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="selector-class">.container</span>&#123;</span><br><span class="line">    <span class="attribute">position</span>:relative;</span><br><span class="line">    <span class="attribute">background</span>:<span class="number">#ddd</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.container</span> &gt; <span class="selector-tag">div</span>&#123;</span><br><span class="line">    <span class="attribute">width</span>:<span class="number">200px</span>;</span><br><span class="line">    <span class="attribute">height</span>:<span class="number">200px</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.float</span>&#123;</span><br><span class="line">    <span class="attribute">float</span><span class="selector-pseudo">:left</span>;</span><br><span class="line">    <span class="attribute">background-color</span>:deeppink;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.inline-block</span>&#123;</span><br><span class="line">    <span class="attribute">display</span>:inline-block;</span><br><span class="line">    <span class="attribute">background-color</span>:yellowgreen;</span><br><span class="line">    <span class="attribute">margin-left</span>:-<span class="number">100px</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>大概描述起来，意思就是拥有共同父容器的两个 <code>DIV</code> 重叠在一起，是 <code>display:inline-block</code> 叠在上面，还是 <code>float:left</code> 叠在上面？</p><p>注意这里 DOM 的顺序，是先生成 display:inline-block ，再生成 float:left 。当然也可以把两个的 DOM 顺序调转如下：</p><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></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;container&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;float&quot;</span>&gt;</span> #divB float:left<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;inline-block&quot;</span>&gt;</span>#divA display:inline-block<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><p>会发现，无论顺序如何，始终是 display:inline-block 的 div 叠在上方。</p><p><a href="https://codepen.io/Chokcoco/pen/gwLYNy">DEMO戳我</a></p><p>这里其实是涉及了所谓的层叠水平（stacking level)，有一张图可以很好的诠释：</p><p><img src="/images/%E5%B1%82%E5%8F%A0%E9%A1%BA%E5%BA%8F%EF%BC%88stacking-level%EF%BC%89%E4%B8%8E%E5%A0%86%E6%A0%88%E4%B8%8A%E4%B8%8B%E6%96%87%EF%BC%88stacking-context%EF%BC%89/687474703a2f2f696d616765732e636e626c6f67732e636f6d2f636e626c6f67735f636f6d2f636f636f31732f3838313631342f6f5f737461636b696e676c6576656c2e706e67.png"></p><p>运用上图的逻辑，上面的题目就迎刃而解，<code>inline-blcok</code> 的 <code>stacking level</code> 比之 <code>float</code> 要高，所以无论 DOM 的先后顺序都堆叠在上面。</p><p>不过上面图示的说法有一些不准确，按照 <a href="https://www.w3.org/TR/CSS2/visuren.html#propdef-z-index">W3官方</a> 的说法，准确的 7 层为：</p><ol><li>the background and borders of the element forming the stacking context.</li><li>the child stacking contexts with negative stack levels (most negative first).</li><li>the in-flow, non-inline-level, non-positioned descendants.</li><li>the non-positioned floats.</li><li>the in-flow, inline-level, non-positioned descendants, including inline tables and inline blocks.</li><li>the child stacking contexts with stack level 0 and the positioned descendants with stack level 0.</li><li>the child stacking contexts with positive stack levels (least positive first).</li></ol><p>稍微翻译一下：</p><ol><li>形成堆叠上下文环境的元素的背景与边框</li><li>拥有负 <code>z-index</code> 的子堆叠上下文元素 （负的越高越堆叠层级越低）</li><li>正常流式布局，非 <code>inline-block</code>，无 <code>position</code> 定位（static除外）的子元素</li><li>无 <code>position</code> 定位（static除外）的 float 浮动元素</li><li>正常流式布局， <code>inline-block</code>元素，无 <code>position</code> 定位（static除外）的子元素（包括 display:table 和 display:inline ）</li><li>拥有 <code>z-index:0</code> 的子堆叠上下文元素</li><li>拥有正 <code>z-index:</code> 的子堆叠上下文元素（正的越低越堆叠层级越低）</li></ol><p>所以我们的两个 <code>div</code> 的比较是基于上面所列出来的 4 和 5 。5 的 <code>stacking level</code> 更高，所以叠得更高。</p><p>不过！不过！不过！重点来了，请注意，上面的比较是基于两个 div 都没有形成 堆叠上下文 这个为基础的。下面我们修改一下题目，给两个 <code>div</code> ，增加一个 <code>opacity</code>:</p><figure class="highlight css"><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></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.container</span>&#123;</span><br><span class="line">    <span class="attribute">position</span>:relative;</span><br><span class="line">    <span class="attribute">background</span>:<span class="number">#ddd</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.container</span> &gt; <span class="selector-tag">div</span>&#123;</span><br><span class="line">    <span class="attribute">width</span>:<span class="number">200px</span>;</span><br><span class="line">    <span class="attribute">height</span>:<span class="number">200px</span>;</span><br><span class="line">    <span class="attribute">opacity</span>:<span class="number">0.9</span>; // 注意这里，增加一个 <span class="attribute">opacity</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.float</span>&#123;</span><br><span class="line">    <span class="attribute">float</span><span class="selector-pseudo">:left</span>;</span><br><span class="line">    <span class="attribute">background-color</span>:deeppink;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.inline-block</span>&#123;</span><br><span class="line">    <span class="attribute">display</span>:inline-block;</span><br><span class="line">    <span class="attribute">background-color</span>:yellowgreen;</span><br><span class="line">    <span class="attribute">margin-left</span>:-<span class="number">100px</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><a href="http://codepen.io/Chokcoco/pen/qaqdqA">DEMO戳我</a></p><p>会看到，<code>inline-block</code> 的 <code>div</code> 不再一定叠在 <code>float</code> 的 <code>div</code> 之上，而是和 <code>HTML</code> 代码中 <code>DOM</code> 的堆放顺序有关，后添加的 <code>div</code> 会 叠在先添加的 <code>div</code> 之上。</p><p>这里的关键点在于，添加的 <code>opacity:0.9</code> 这个让两个 <code>div</code> 都生成了 <code>stacking context（堆叠上下文）</code> 的概念。此时，要对两者进行层叠排列，就需要 <code>z-index</code> ，<code>z-index</code> 越高的层叠层级越高。</p><p>堆叠上下文是HTML元素的三维概念，这些HTML元素在一条假想的相对于面向（电脑屏幕的）视窗或者网页的用户的 <code>z</code> 轴上延伸，<code>HTML</code> 元素依据其自身属性按照优先级顺序占用层叠上下文的空间。</p><p>那么，如何触发一个元素形成 <code>堆叠上下文</code> ？方法如下，摘自 <a href="https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Understanding_z_index/The_stacking_context">MDN</a>：</p><ul><li>根元素 (HTML),</li><li>z-index 值不为 “auto”的 绝对&#x2F;相对定位，</li><li>一个 z-index 值不为 “auto”的 flex 项目 (flex item)，即：父元素 display: flex|inline-flex，</li><li>opacity 属性值小于 1 的元素（参考 the specification for opacity），</li><li>transform 属性值不为 “none”的元素，</li><li>mix-blend-mode 属性值不为 “normal”的元素，</li><li>filter值不为“none”的元素，</li><li>perspective值不为“none”的元素，</li><li>isolation 属性被设置为 “isolate”的元素，</li><li>position: fixed</li><li>在 will-change 中指定了任意 CSS 属性，即便你没有直接指定这些属性的值</li><li>-webkit-overflow-scrolling 属性被设置 “touch”的元素</li></ul><p>所以，上面我们给两个 <code>div</code> 添加 <code>opacity</code> 属性的目的就是为了形成 <code>stacking context</code>。也就是说添加 <code>opacity</code> 替换成上面列出来这些属性都是可以达到同样的效果。</p><p>在层叠上下文中，其子元素同样也按照上面解释的规则进行层叠。 特别值得一提的是，其子元素的 <code>z-index</code> 值只在父级层叠上下文中有意义。意思就是父元素的 <code>z-index</code> 低于父元素另一个同级元素，子元素 <code>z-index</code> 再高也没用。</p><p>理解上面的 <code>stacking-level</code> 与 <code>stacking-context</code> 是理解 <code>CSS</code> 的层叠顺序的关键。</p><h1 id="参见"><a href="#参见" class="headerlink" title="参见"></a>参见</h1><ul><li><a href="https://github.com/chokcoco/iCSS/issues/1">谈谈一些有趣的CSS题目（1~5） · Issue #1 · chokcoco&#x2F;iCSS</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;code&gt;z-index&lt;/code&gt; 看上去其实很简单，根据 &lt;code&gt;z-index&lt;/code&gt; 的高低决定层叠的优先级，实则深入进去，会发现内有乾坤。&lt;/p&gt;</summary>
    
    
    
    <category term="前端" scheme="https://i.jakeyu.top/categories/%E5%89%8D%E7%AB%AF/"/>
    
    
    <category term="CSS" scheme="https://i.jakeyu.top/tags/CSS/"/>
    
</entry>
  
<entry>
    <title>获取元素样式</title>
    <link href="https://i.jakeyu.top/2018/11/29/getComputedStyle/"/>
    <id>https://i.jakeyu.top/2018/11/29/getComputedStyle/</id>
    <published>2018-11-29T21:55:35.000Z</published>
    <updated>2026-05-06T17:36:23.392Z</updated>
    
    <content type="html"><![CDATA[<p>引用<a href="https://developer.mozilla.org/zh-CN/docs/Web/API/Window/getComputedStyle">MND</a>的说明：</p><blockquote><p>Window.getComputedStyle()方法返回一个对象，该对象在应用活动样式表并解析这些值可能包含的任何基本计算后报告元素的所有CSS属性的值。 私有的CSS属性值可以通过对象提供的API或通过简单地使用CSS属性名称进行索引来访问。</p></blockquote><span id="more"></span><h1 id="语法"><a href="#语法" class="headerlink" title="语法"></a>语法</h1><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">let</span> style = <span class="variable language_">window</span>.<span class="title function_">getComputedStyle</span>(element, [pseudoElt]);</span><br></pre></td></tr></table></figure><ul><li><strong>element</strong>: 用语获取计算样式的Element</li><li><strong>pseudoElt</strong>: 指定一个要匹配的伪元素的字符串。必须对普通元素省略（或null）。</li></ul><p>例如:</p><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"><span class="keyword">var</span> dom = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;test&quot;</span>)</span><br><span class="line"><span class="keyword">var</span> style = <span class="variable language_">window</span>.<span class="title function_">getComputedStyle</span>(dom , <span class="string">&quot;:after&quot;</span>)</span><br><span class="line"><span class="keyword">var</span> style = <span class="variable language_">window</span>.<span class="title function_">getComputedStyle</span>(dom , <span class="string">&quot;:after&quot;</span>).<span class="property">content</span></span><br></pre></td></tr></table></figure><h1 id="getComputedStyle与style的区别"><a href="#getComputedStyle与style的区别" class="headerlink" title="getComputedStyle与style的区别"></a>getComputedStyle与style的区别</h1><p>我们使用<code>element.style</code>也可以获取元素的CSS样式声明对象，但是其与<code>getComputedStyle</code>方法还有有一些差异的。</p><ol><li>只读与可写</li></ol><ul><li>正如上面提到的<code>getComputedStyle</code>方法是只读的，只能获取样式，不能设置；而<code>element.style</code>能读能写，能屈能伸。</li></ul><ol start="2"><li>获取的对象范围</li></ol><ul><li><code>getComputedStyle</code>方法获取的是最终应用在元素上的所有CSS属性对象（即使没有CSS代码，也会把默认的祖宗八代都显示出来）；而<code>element.style</code>只能获取元素<code>style</code>属性中的CSS样式。因此对于一个光秃秃的元素<code>&lt;p&gt;</code>，<code>getComputedStyle</code>方法返回对象中<code>length</code>属性值（如果有）就是190+(据我测试FF:192, IE9:195, Chrome:253, 不同环境结果可能有差异), 而<code>element.style</code>就是<code>0</code>。</li></ul><h1 id="getComputedStyle与defaultView"><a href="#getComputedStyle与defaultView" class="headerlink" title="getComputedStyle与defaultView"></a>getComputedStyle与defaultView</h1><p>许多在线的演示代码中，<code>getComputedStyle</code>是通过 <code>document.defaultView</code> 对象来调用的。大部分情况下，这是不需要的，因为可以直接通过<code>window</code>对象调用。但有一种情况，你必需要使用 <code>defaultView</code>,  那是在firefox3.6上访问子框架内的样式 。</p><h1 id="getPropertyValue"><a href="#getPropertyValue" class="headerlink" title="getPropertyValue"></a>getPropertyValue</h1><p><code>getPropertyValue</code>方法可以获取CSS样式申明对象上的属性值（直接属性名称），例如：</p><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_">window</span>.<span class="title function_">getComputedStyle</span>(element, <span class="literal">null</span>).<span class="title function_">getPropertyValue</span>(<span class="string">&quot;float&quot;</span>);</span><br></pre></td></tr></table></figure><p>如果我们不使用<code>getPropertyValue</code>方法，直接使用键值访问，其实也是可以的。但是，比如这里的的<code>float</code>，如果使用键值访问，则不能直接使用<code>getComputedStyle(element, null).float</code>，而应该是<code>cssFloat</code>与<code>styleFloat</code>，自然需要浏览器判断了，比较折腾！</p><p>使用<code>getPropertyValue</code>方法不必可以驼峰书写形式（不支持驼峰写法），例如：<code>style.getPropertyValue(&quot;border-top-left-radius&quot;)</code></p><h1 id="获取变量"><a href="#获取变量" class="headerlink" title="获取变量"></a>获取变量</h1><p>例子：</p><figure class="highlight css"><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="selector-pseudo">:root</span>&#123;</span><br><span class="line">  <span class="attr">--testMargin</span>:<span class="number">75px</span>;</span><br><span class="line">&#125;</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><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//  读取</span></span><br><span class="line"><span class="keyword">var</span> root = <span class="title function_">getComputedStyle</span>(<span class="variable language_">document</span>.<span class="property">documentElement</span>);</span><br><span class="line"><span class="keyword">var</span> cssVariable = root.<span class="title function_">getPropertyValue</span>(<span class="string">&#x27;--testMargin&#x27;</span>).<span class="title function_">trim</span>();</span><br><span class="line"></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(cssVariable); <span class="comment">// &#x27;75px&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 写入</span></span><br><span class="line"><span class="variable language_">document</span>.<span class="property">documentElement</span>.<span class="property">style</span>.<span class="title function_">setProperty</span>(<span class="string">&#x27;--testMargin&#x27;</span>, <span class="string">&#x27;100px&#x27;</span>);</span><br></pre></td></tr></table></figure><h1 id="CSSStyleDeclaration"><a href="#CSSStyleDeclaration" class="headerlink" title="CSSStyleDeclaration"></a>CSSStyleDeclaration</h1><h2 id="概要"><a href="#概要" class="headerlink" title="概要"></a>概要</h2><p><code>CSSStyleDeclaration</code> 表示一个CSS属性键值对的集合。它被用于一些API中：</p><ul><li><code>HTMLElement.style</code> - 用于操作单个元素的样式(<elem style="...">)；</li><li>(TODO: reword) 作为 <a href="https://www.w3.org/TR/1998/REC-CSS2-19980512/syndata.html#block">declaration block</a> 的接口，当规则为 <a href="https://developer.mozilla.org/zh-CN/docs/Web/API/CSSRule">CSSStyleRule</a> 时，由stylesheet中的 style  属性返回 。</li><li><code>CSSStyleDeclaration</code>也是由<code>window.getComputedStyle()</code>返回的只读接口.</li></ul><h2 id="方法"><a href="#方法" class="headerlink" title="方法"></a>方法</h2><ul><li><code>CSSStyleDeclaration.getPropertyPriority()</code>: 返回可选的优先级，”Important”, 例如：</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">priString= styleObj.<span class="title function_">getPropertyPriority</span>(<span class="string">&#x27;color&#x27;</span>)</span><br></pre></td></tr></table></figure><ul><li><code>CSSStyleDeclaration.getPropertyValue()</code>: 返回属性值。例如:</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">valString= styleObj.<span class="title function_">getPropertyValue</span>(<span class="string">&#x27;color&#x27;</span>)</span><br></pre></td></tr></table></figure><ul><li><code>CSSStyleDeclaration.item()</code>: 返回属性名。 例如:</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">nameString= styleObj.<span class="title function_">item</span>(<span class="number">0</span>) <span class="title class_">Alternative</span>: nameString= styleObj[<span class="number">0</span>]</span><br></pre></td></tr></table></figure><ul><li><code>CSSStyleDeclaration.removeProperty()</code>: 返回被删除的属性。例如:</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">valString= styleObj.<span class="title function_">removeProperty</span>(<span class="string">&#x27;color&#x27;</span>)</span><br></pre></td></tr></table></figure><ul><li><code>CSSStyleDeclaration.setProperty()</code>: 没有返回值。例如:</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">styleObj.<span class="title function_">setProperty</span>(<span class="string">&#x27;color&#x27;</span>, <span class="string">&#x27;red&#x27;</span>, <span class="string">&#x27;important&#x27;</span>)</span><br></pre></td></tr></table></figure><ul><li><code>CSSStyleDeclaration.getPropertyCSSValue()</code>: 仅支持通过getComputedStyle的方式。 在Firefox (CSSPrimitiveValue中返回  ROCSSPrimitiveValue, 在其他实现 CSSValue，或为null 速记属性。</li></ul><h1 id="兼容性"><a href="#兼容性" class="headerlink" title="兼容性"></a>兼容性</h1><iframe data-feature="getcomputedstyle" src="https://caniuse.bitsofco.de/embed/index.html?feat=getcomputedstyle&periods=current&accessible-colours=false" frameborder="0" width="100%" height="400px"></iframe><h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><ul><li><a href="https://developer.mozilla.org/zh-CN/docs/Web/API/Window/getComputedStyle">MDN</a></li><li><a href="https://www.zhangxinxu.com/wordpress/2012/05/getcomputedstyle-js-getpropertyvalue-currentstyle/">获取元素CSS值之getComputedStyle方法熟悉–张鑫旭</a></li><li><a href="https://developer.mozilla.org/zh-CN/docs/Web/API/CSSStyleDeclaration">CSSStyleDeclaration–MDN</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;引用&lt;a href=&quot;https://developer.mozilla.org/zh-CN/docs/Web/API/Window/getComputedStyle&quot;&gt;MND&lt;/a&gt;的说明：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Window.getComputedStyle()方法返回一个对象，该对象在应用活动样式表并解析这些值可能包含的任何基本计算后报告元素的所有CSS属性的值。 私有的CSS属性值可以通过对象提供的API或通过简单地使用CSS属性名称进行索引来访问。&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="前端" scheme="https://i.jakeyu.top/categories/%E5%89%8D%E7%AB%AF/"/>
    
    
    <category term="JS" scheme="https://i.jakeyu.top/tags/JS/"/>
    
    <category term="CSS" scheme="https://i.jakeyu.top/tags/CSS/"/>
    
</entry>
  
</feed>