<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Clarity</title><link>/</link><description>Recent content on Clarity</description><generator>Hugo -- gohugo.io</generator><copyright>Copyright © 2018-2021, wencaizhang and the Hugo Authors; all rights reserved.</copyright><atom:link href="/index.xml" rel="self" type="application/rss+xml"/><item><title>用 Docker 快速架设一个 Anki 同步服务器</title><link>/2021-09-29/anki-sync-server-with-docker/</link><pubDate>Wed, 29 Sep 2021 00:00:00 +0000</pubDate><guid>/2021-09-29/anki-sync-server-with-docker/</guid><description>
&lt;p>Anki 是一个辅助记忆软件，{{ 简介}}。最近打算用它来快速记忆一些知识，但是 Anki 的服务器架设在国外，导致同步速度很慢，为了解决这个问题，我参考
&lt;a
href = "https://github.com/ankicommunity/anki-devops-services"
target="_blank" rel ="noopener"
>文档地址&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
打算自己架设一个 Anki 同步服务器。&lt;/p>
&lt;p>&lt;div class="image-container" style="text-align: center;">
&lt;style>
.image_view img {
margin: 1em auto;
}
.image-caption {
min-width: 20%;
max-width: 80%;
text-align: center;
display: inline-block;
padding: 10px;
margin: 0 auto;
border-bottom: 1px solid #eee;
font-size: 12px;
color: #999;
}
&lt;/style>
&lt;div class="image_view">
&lt;img
loading='lazy'
src="https://static.webjam.cn/images/anki-sync-server-with-docker.png"
alt=""
onerror="this.classList.add('error');"
/>
&lt;/div>
&lt;div class="image-caption">&lt;/div>
&lt;/div>
&lt;/p>
&lt;p>要求：&lt;/p>
&lt;ul>
&lt;li>技术要求：了解终端（命令行工具）、理解 IP 和域名的概念、docker 以及 docker-compose 的基本使用&lt;/li>
&lt;li>硬件要求：一台电脑或者一个虚拟机或者一个云服务器（总之要能够满足相关软件要求）&lt;/li>
&lt;li>软件要求：docker + docker-compose&lt;/li>
&lt;/ul>
&lt;h2 id="启动服务">启动服务&lt;/h2>
&lt;p>新建一个 &lt;code>docker-anki-server&lt;/code> 目录，在此目录下创建一个 &lt;code>docker-compose.yml&lt;/code> 文件，文件内容如下。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-yml" data-lang="yml">&lt;span class="ln"> 1&lt;/span>&lt;span class="nt">version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;3&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;span class="ln"> 2&lt;/span>&lt;span class="w">
&lt;/span>&lt;span class="ln"> 3&lt;/span>&lt;span class="w">&lt;/span>&lt;span class="nt">services&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;span class="ln"> 4&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nt">anki-container&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;span class="ln"> 5&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nt">image&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">kuklinistvan/anki-sync-server:latest&lt;/span>&lt;span class="w">
&lt;/span>&lt;span class="ln"> 6&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nt">container_name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">anki-container&lt;/span>&lt;span class="w">
&lt;/span>&lt;span class="ln"> 7&lt;/span>&lt;span class="w">
&lt;/span>&lt;span class="ln"> 8&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nt">restart&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">always&lt;/span>&lt;span class="w">
&lt;/span>&lt;span class="ln"> 9&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nt">ports&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;span class="ln">10&lt;/span>&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;27701:27701&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;span class="ln">11&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nt">volumes&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;span class="ln">12&lt;/span>&lt;span class="w"> &lt;/span>- &lt;span class="l">data:/app/data&lt;/span>&lt;span class="w">
&lt;/span>&lt;span class="ln">13&lt;/span>&lt;span class="w">&lt;/span>&lt;span class="nt">volumes&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;span class="ln">14&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="nt">data&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后在当前路径下的终端执行命令&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-sh" data-lang="sh">&lt;span class="ln">1&lt;/span>docker-compose up -d
&lt;/code>&lt;/pre>&lt;/div>&lt;p>执行 &lt;code>docker-compose ps&lt;/code> 命令可以看到&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span> Name Command State Ports
&lt;span class="ln">2&lt;/span>-----------------------------------------------------------------------------------------
&lt;span class="ln">3&lt;/span>anki-container /bin/sh -c /app/scripts/st ... Up &lt;span class="o">(&lt;/span>healthy&lt;span class="o">)&lt;/span> 0.0.0.0:27701-&amp;gt;27701/tcp
&lt;/code>&lt;/pre>&lt;/div>&lt;p>这就说明服务已经正常启动了，对应的服务地址是 &lt;code>http://&amp;lt;ip&amp;gt;:27701&lt;/code>，这个 &lt;code>&amp;lt;ip&amp;gt;&lt;/code> 是你物理机（宿主机）的 &lt;code>ip&lt;/code> 而非 docker 容器 ip。&lt;/p>
&lt;h2 id="域名设置">域名设置&lt;/h2>
&lt;p>启动服务之后，就可以通过链接 &lt;code>http://&amp;lt;ip&amp;gt;:27701&lt;/code> 访问了。&lt;/p>
&lt;p>但是由于安卓版 anki 要求同步地址为 &lt;code>https&lt;/code> 协议，因此我又启动了一个代理服务。&lt;/p>
&lt;p>我使用的
&lt;a
href = "https://caddyserver.com/"
target="_blank" rel ="noopener"
>Caddy&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
启动服务，这是一款使用 Go 语言开发的 web 服务器，选用 Caddy 的一个重要原因就是它使用 Let’s Encrypt 让你的站点全自动变成 HTTPS，除此之外它的配置简单很容易上手使用。&lt;/p>
&lt;p>我的配置就这么简单：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="ln">1&lt;/span>anki.example.com {
&lt;span class="ln">2&lt;/span> tls example@qq.com
&lt;span class="ln">3&lt;/span> reverse_proxy 127.0.0.1:27701
&lt;span class="ln">4&lt;/span>}
&lt;/code>&lt;/pre>&lt;/div>&lt;ol>
&lt;li>第一行声明一个二级域名 &lt;code>anki.example.com&lt;/code>&lt;/li>
&lt;li>第二行告诉 caddy 为网站开启 https 并自动申请证书，后面的 email 参数是告知 CA 申请人的邮箱，&lt;/li>
&lt;li>第三行则是反向代理，此时访问 &lt;code>anki.example.com&lt;/code>，实际访问的是 &lt;code>127.0.0.1:27701&lt;/code> 的内容&lt;/li>
&lt;/ol>
&lt;h2 id="客户端设置">客户端设置&lt;/h2>
&lt;h3 id="桌面端">桌面端&lt;/h3>
&lt;p>如果是桌面端(Windows\MacOS\Linux)，需要安装
&lt;a
href = "https://ankiweb.net/shared/info/2124817646"
target="_blank" rel ="noopener"
>SyncRedirector&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
插件。&lt;/p>
&lt;p>SyncRedirector 插件要求 Anki 版本低于 &lt;code>2.1.19&lt;/code>，推荐使用 &lt;code>2.1.0&lt;/code> 和 &lt;code>2.1.15&lt;/code> 版本。
你可以在
&lt;a
href = "https://apps.ankiweb.net/downloads/archive/"
target="_blank" rel ="noopener"
>这里&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
下载 Anki 所有版本的安装包&lt;/p>
&lt;p>插件安装之后，在其设置中填写对应的地址即可&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="ln">1&lt;/span>&lt;span class="p">{&lt;/span>
&lt;span class="ln">2&lt;/span> &lt;span class="nt">&amp;#34;msyncUrl&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;https://anki.zhangwencai.com/msync&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="ln">3&lt;/span> &lt;span class="nt">&amp;#34;syncUrl&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;https://anki.zhangwencai.com/sync&amp;#34;&lt;/span>
&lt;span class="ln">4&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="安卓端">安卓端&lt;/h3>
&lt;p>如果是安卓端 AnkiDroid 则可以直接配置，我的 AnkiDroid 版本是 &lt;code>2.13.1&lt;/code>。你可以通过「设置 -&amp;gt; 高级设置 -&amp;gt; 自定义同步服务器」找到配置页面。&lt;/p>
&lt;p>&lt;div class="image-container" style="text-align: center;">
&lt;style>
.image_view img {
margin: 1em auto;
}
.image-caption {
min-width: 20%;
max-width: 80%;
text-align: center;
display: inline-block;
padding: 10px;
margin: 0 auto;
border-bottom: 1px solid #eee;
font-size: 12px;
color: #999;
}
&lt;/style>
&lt;div class="image_view">
&lt;img
loading='lazy'
src="https://static.webjam.cn/images/ankidroid-sync-server.png"
alt=""
onerror="this.classList.add('error');"
/>
&lt;/div>
&lt;div class="image-caption">&lt;/div>
&lt;/div>
&lt;/p>
&lt;p>安卓下载地址：
&lt;a
href = "https://github.com/ankidroid/Anki-Android/releases"
target="_blank" rel ="noopener"
>Anki-Android · github&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/p>
&lt;h2 id="相关命令">相关命令&lt;/h2>
&lt;p>启动服务之后，我们需要新建用户以便在客户端登录时使用。&lt;/p>
&lt;p>首先需要进入 docker 容器的终端：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>docker &lt;span class="nb">exec&lt;/span> -it anki-container /bin/sh
&lt;/code>&lt;/pre>&lt;/div>&lt;p>命令格式：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>./ankisyncctl.py &amp;lt;command&amp;gt; &lt;span class="o">[&lt;/span>&amp;lt;args&amp;gt;&lt;span class="o">]&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>可用的命令：&lt;/p>
&lt;ul>
&lt;li>增加一个新用户：&lt;code>./ankisyncctl.py adduser &amp;lt;username&amp;gt;&lt;/code>&lt;/li>
&lt;li>删除一个用户：&lt;code>./ankisyncctl.py deluser &amp;lt;username&amp;gt;&lt;/code>&lt;/li>
&lt;li>列出所有用户：&lt;code>./ankisyncctl.py lsuser&lt;/code>&lt;/li>
&lt;li>修改密码：&lt;code>./ankisyncctl.py passwd &amp;lt;username&amp;gt;&lt;/code>&lt;/li>
&lt;li>查看帮助：&lt;code>./ankisyncctl.py --help&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>示例：增加一个用户 userA&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>./ankisyncctl.py adduser userA
&lt;span class="ln">2&lt;/span>Enter password &lt;span class="k">for&lt;/span> userA:
&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>echarts</title><link>/2021-09-24/echarts-xx/</link><pubDate>Fri, 24 Sep 2021 00:00:00 +0000</pubDate><guid>/2021-09-24/echarts-xx/</guid><description>
&lt;p>
&lt;a
href = "https://blog.csdn.net/qq_38974638/article/details/112390125"
target="_blank" rel ="noopener"
>ECharts 图例（legend）分两行显示并且初始化设置不选中状态&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/p>
&lt;p>
&lt;a
href = "https://github.com/apache/echarts/issues/2940"
target="_blank" rel ="noopener"
>请问visualMap中的手柄可否精确控制位置 #2940&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/p>
&lt;p>
&lt;a
href = "https://github.com/apache/echarts/issues/6475"
target="_blank" rel ="noopener"
>markLine没有tooltip层吗？希望鼠标经过markLine时可以把markLine信息在tooltip中显示。&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/p></description></item><item><title>Using Notices</title><link>/series/hugo/notices/</link><pubDate>Fri, 20 Aug 2021 00:00:00 +0000</pubDate><guid>/series/hugo/notices/</guid><description>
&lt;p>The &amp;quot;Notices&amp;quot; shortcode enables you to call out pieces of information - sidebars, warnings, tips, etc.&lt;/p>
&lt;p>To create a notice on a page, you can use the &lt;code>notice&lt;/code> shortcode.&lt;br>
You use the &lt;code>notice&lt;/code> shortcode, with the first parameter being one of &lt;code>note&lt;/code>, &lt;code>info&lt;/code>, &lt;code>tip&lt;/code>, and &lt;code>warning&lt;/code>. Then add a title for your
note in quotes as the second parameter. The inner body of the note can be whatever markdown you want to create.&lt;/p>
&lt;p>The following shortcode syntax within a markdown doc:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="ln">1&lt;/span>{{% notice note &amp;#34;Note&amp;#34; %}}
&lt;span class="ln">2&lt;/span>This is a standard &amp;#34;note&amp;#34; style.
&lt;span class="ln">3&lt;/span>{{% /notice %}}
&lt;/code>&lt;/pre>&lt;/div>&lt;p>will render as:&lt;/p>
&lt;div class="notices note">
&lt;div class="label">Note&lt;/div>
&lt;p>This is a standard &amp;quot;note&amp;quot; style.&lt;/p>
&lt;/div>
&lt;p>The other three variants follow.&lt;/p>
&lt;div class="notices info">
&lt;div class="label">Info&lt;/div>
&lt;p>Here is the &amp;quot;info&amp;quot; style.&lt;/p>
&lt;/div>
&lt;div class="notices tip">
&lt;div class="label">Tip&lt;/div>
&lt;p>Here is a &amp;quot;tip&amp;quot; variant of a notice.&lt;/p>
&lt;/div>
&lt;div class="notices warning">
&lt;div class="label">Warning&lt;/div>
&lt;p>Here is the &amp;quot;warning&amp;quot; flavor of a notice.&lt;/p>
&lt;/div>
&lt;p>Also note that the content of a notice can contain anything you could put on a normal page - as shown below:&lt;/p>
&lt;div class="notices tip">
&lt;div class="label">Complex Notices are Possible!&lt;/div>
&lt;p>This is a notice that has a lot of various kinds of content in it.&lt;/p>
&lt;ul>
&lt;li>Here is a bulleted list&lt;/li>
&lt;li>With more than one bullet
&lt;ul>
&lt;li>And even more than one level&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;p>Code blocks are fine here, too....&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-csharp" data-lang="csharp">&lt;span class="ln">1&lt;/span>&lt;span class="k">public&lt;/span> &lt;span class="k">void&lt;/span> &lt;span class="n">SayHello&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="ln">2&lt;/span>&lt;span class="p">{&lt;/span>
&lt;span class="ln">3&lt;/span> &lt;span class="n">Console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">WriteLine&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Hello, world!&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;span class="ln">4&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>
&lt;/div>
&lt;div class="notices tip">
&lt;div class="label">Productivity Booster!&lt;/div>
&lt;p>If you're using VS Code for your editing, copy the &lt;code>.vscode\clarity.code-snippets&lt;/code> file into a &lt;code>.vscode&lt;/code> root folder on your repo. This will enable you to type
&lt;code>note&lt;/code> then &lt;code>&amp;lt;tab&amp;gt;&lt;/code> then choose with up/down arrows which flavor notice you want, then &lt;code>&amp;lt;tab&amp;gt;&lt;/code> again to provide a title, then &lt;code>&amp;lt;tab&amp;gt;&lt;/code> to add your content!&lt;/p>
&lt;p>&lt;div class="image-container" style="text-align: center;">
&lt;style>
.image_view img {
margin: 1em auto;
}
.image-caption {
min-width: 20%;
max-width: 80%;
text-align: center;
display: inline-block;
padding: 10px;
margin: 0 auto;
border-bottom: 1px solid #eee;
font-size: 12px;
color: #999;
}
&lt;/style>
&lt;div class="image_view">
&lt;img
loading='lazy'
src="/images/Note-Snippet.gif"
alt=""
onerror="this.classList.add('error');"
/>
&lt;/div>
&lt;div class="image-caption">&lt;/div>
&lt;/div>
&lt;/p>
&lt;p>To use the snippet, you need to first &lt;strong>enable quickSuggestions for Markdown&lt;/strong> (one time only):&lt;/p>
&lt;ol>
&lt;li>Go to &lt;code>Preferences-&amp;gt;Settings&lt;/code> then search for &lt;code>quickSuggestions&lt;/code>&lt;/li>
&lt;li>Follow the link to Edit in settings.json&lt;/li>
&lt;li>Toward the bottom of the file, paste in the following JSON:&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="ln">1&lt;/span>&amp;#34;[markdown]&amp;#34;: {
&lt;span class="ln">2&lt;/span> &amp;#34;editor.quickSuggestions&amp;#34;: true
&lt;span class="ln">3&lt;/span> }
&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="4">
&lt;li>Close and save the settings.&lt;/li>
&lt;/ol>
&lt;/div></description></item><item><title>将两次 Git 提交合并为一次</title><link>/2021-08-03/%E5%B0%86%E4%B8%A4%E6%AC%A1-git-%E6%8F%90%E4%BA%A4%E5%90%88%E5%B9%B6%E4%B8%BA%E4%B8%80%E6%AC%A1/</link><pubDate>Tue, 03 Aug 2021 00:00:00 +0000</pubDate><guid>/2021-08-03/%E5%B0%86%E4%B8%A4%E6%AC%A1-git-%E6%8F%90%E4%BA%A4%E5%90%88%E5%B9%B6%E4%B8%BA%E4%B8%80%E6%AC%A1/</guid><description>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>git rebase -i HEAD~2
&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>封装日期相关函数</title><link>/2021-07-29/%E5%B0%81%E8%A3%85%E6%97%A5%E6%9C%9F%E7%9B%B8%E5%85%B3%E5%87%BD%E6%95%B0/</link><pubDate>Thu, 29 Jul 2021 00:00:00 +0000</pubDate><guid>/2021-07-29/%E5%B0%81%E8%A3%85%E6%97%A5%E6%9C%9F%E7%9B%B8%E5%85%B3%E5%87%BD%E6%95%B0/</guid><description>
&lt;h2 id="获取某年某月共有多少天">获取某年某月共有多少天&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln">1&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getDaysCountByMonth&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">year&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">month&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">2&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="k">typeof&lt;/span> &lt;span class="nx">month&lt;/span> &lt;span class="o">!==&lt;/span> &lt;span class="s1">&amp;#39;number&amp;#39;&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="nx">month&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="o">||&lt;/span> &lt;span class="nx">month&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">12&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">3&lt;/span> &lt;span class="k">throw&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nb">Error&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;请输入月份，1-12 之间的数字&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">4&lt;/span> &lt;span class="k">return&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">5&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">6&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nb">Date&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">year&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">month&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">getDate&lt;/span>&lt;span class="p">();&lt;/span>
&lt;span class="ln">7&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Vue.js 项目中二次封装一个按钮组件</title><link>/2021-07-28/%E4%BA%8C%E6%AC%A1%E5%B0%81%E8%A3%85%E4%B8%80%E4%B8%AA%E6%8C%89%E9%92%AE%E7%BB%84%E4%BB%B6/</link><pubDate>Wed, 28 Jul 2021 00:00:00 +0000</pubDate><guid>/2021-07-28/%E4%BA%8C%E6%AC%A1%E5%B0%81%E8%A3%85%E4%B8%80%E4%B8%AA%E6%8C%89%E9%92%AE%E7%BB%84%E4%BB%B6/</guid><description>
&lt;h2 id="vue2-中容易被忽略的两个重要的-api-介绍">Vue2 中容易被忽略的两个重要的 API 介绍&lt;/h2>
&lt;h2 id="vue2-中封装">Vue2 中封装&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="ln"> 1&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">template&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="ln"> 2&lt;/span> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">a-button&lt;/span>
&lt;span class="ln"> 3&lt;/span> &lt;span class="na">icon&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;sync&amp;#34;&lt;/span>
&lt;span class="ln"> 4&lt;/span> &lt;span class="na">title&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;刷新&amp;#34;&lt;/span>
&lt;span class="ln"> 5&lt;/span> &lt;span class="na">v-bind&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;$attrs&amp;#34;&lt;/span>
&lt;span class="ln"> 6&lt;/span> &lt;span class="na">v-on&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;$listeners&amp;#34;&lt;/span>
&lt;span class="ln"> 7&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;span class="ln"> 8&lt;/span>&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">template&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="ln"> 9&lt;/span>
&lt;span class="ln">10&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="ln">11&lt;/span>&lt;span class="cm">/**
&lt;/span>&lt;span class="ln">12&lt;/span>&lt;span class="cm"> * 和 a-button 外观、行为完全一致
&lt;/span>&lt;span class="ln">13&lt;/span>&lt;span class="cm"> * 区别是预设 icon 和 title 属性
&lt;/span>&lt;span class="ln">14&lt;/span>&lt;span class="cm"> */&lt;/span>
&lt;span class="ln">15&lt;/span>&lt;span class="kr">export&lt;/span> &lt;span class="k">default&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">16&lt;/span> &lt;span class="nx">inheritAttrs&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="ln">17&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">18&lt;/span>&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="vue3-中有了一些变化">Vue3 中有了一些变化&lt;/h2>
&lt;p>
&lt;a
href = "https://v3.cn.vuejs.org/guide/migration/listeners-removed.html"
target="_blank" rel ="noopener"
>移除 $listeners (非兼容)&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="ln"> 1&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">template&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="ln"> 2&lt;/span> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">a-button&lt;/span>
&lt;span class="ln"> 3&lt;/span> &lt;span class="na">icon&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;sync&amp;#34;&lt;/span>
&lt;span class="ln"> 4&lt;/span> &lt;span class="na">title&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;刷新&amp;#34;&lt;/span>
&lt;span class="ln"> 5&lt;/span> &lt;span class="na">v-bind&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;$attrs&amp;#34;&lt;/span>
&lt;span class="ln"> 6&lt;/span> &lt;span class="p">/&amp;gt;&lt;/span>
&lt;span class="ln"> 7&lt;/span>&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">template&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="ln"> 8&lt;/span>
&lt;span class="ln"> 9&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="ln">10&lt;/span>&lt;span class="cm">/**
&lt;/span>&lt;span class="ln">11&lt;/span>&lt;span class="cm"> * 和 a-button 外观、行为完全一致
&lt;/span>&lt;span class="ln">12&lt;/span>&lt;span class="cm"> * 区别是预设 icon 和 title 属性
&lt;/span>&lt;span class="ln">13&lt;/span>&lt;span class="cm"> */&lt;/span>
&lt;span class="ln">14&lt;/span>&lt;span class="kr">export&lt;/span> &lt;span class="k">default&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">15&lt;/span> &lt;span class="nx">inheritAttrs&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="ln">16&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">17&lt;/span>&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">script&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>升级到 Vue3.x 之后，&lt;code>$attrs&lt;/code> 和 &lt;code>$listeners&lt;/code> 合并到 &lt;code>$attrs&lt;/code> 中，因此直接删除 &lt;code>$listeners&lt;/code> 即可，但是要保留 &lt;code>$attrs&lt;/code>。&lt;/p>
&lt;h2 id="uniapp-中的一个坑">uniapp 中的一个坑&lt;/h2>
&lt;p>uni-app 仅在 H5 端和 App端V3 中支持 $listeners, &lt;strong>小程序不支持 $listeners&lt;/strong> ，这就导致了&lt;/p>
&lt;p>
&lt;a
href = "https://uniapp.dcloud.io/use?id=%e5%ae%9e%e4%be%8b%e5%b1%9e%e6%80%a7"
target="_blank" rel ="noopener"
>实例属性 - uni-app&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/p></description></item><item><title>Git 秘钥</title><link>/series/git/ssh/</link><pubDate>Mon, 26 Jul 2021 00:00:00 +0000</pubDate><guid>/series/git/ssh/</guid><description>
&lt;p>
&lt;a
href = "https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh"
target="_blank" rel ="noopener"
>&lt;a href="https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh">https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh&lt;/a>&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/p>
&lt;p>
&lt;a
href = "https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh/checking-for-existing-ssh-keys"
target="_blank" rel ="noopener"
>&lt;a href="https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh/checking-for-existing-ssh-keys">https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh/checking-for-existing-ssh-keys&lt;/a>&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/p>
&lt;p>
&lt;a
href = "https://git-scm.com/book/zh/v2/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84-Git-%E7%94%9F%E6%88%90-SSH-%E5%85%AC%E9%92%A5"
target="_blank" rel ="noopener"
>&lt;a href="https://git-scm.com/book/zh/v2/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84-Git-%E7%94%9F%E6%88%90-SSH-%E5%85%AC%E9%92%A5">https://git-scm.com/book/zh/v2/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84-Git-%E7%94%9F%E6%88%90-SSH-%E5%85%AC%E9%92%A5&lt;/a>&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/p></description></item><item><title>封装简易 DOM 选择器</title><link>/2021-07-21/custom-dom-selector-api/</link><pubDate>Wed, 21 Jul 2021 00:00:00 +0000</pubDate><guid>/2021-07-21/custom-dom-selector-api/</guid><description>
&lt;p>JavaScript 原生的 DOM 选择器代码写起来太长了，我们像一个简单的办法来简化一下吧。&lt;/p>
&lt;p>偶然间发现 Chrome 开发工具的 console 面板内置了两个方法 &lt;code>$&lt;/code> 和 &lt;code>$$&lt;/code>，作用和 &lt;code>document.querySelector&lt;/code> 以及 &lt;code>document.querySelectorAll&lt;/code> 这两个方法类似。&lt;/p>
&lt;p>测试后发现这两个变量只在开发工具的 console 面板中才能使用，如果想要在代码中使用，就需要我们自己来封装了。但是要注意确保不会和 jQuery 的符号 &lt;code>$&lt;/code> 冲突。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln">1&lt;/span>&lt;span class="kr">const&lt;/span> &lt;span class="nx">$&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">querySelector&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">bind&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">document&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">2&lt;/span>&lt;span class="kr">const&lt;/span> &lt;span class="nx">$$&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">querySelectorAll&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">bind&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">document&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>测试代码：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln">1&lt;/span>&lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">$&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;body&amp;#39;&lt;/span>&lt;span class="p">));&lt;/span>
&lt;span class="ln">2&lt;/span>
&lt;span class="ln">3&lt;/span>&lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">$$&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;div&amp;#39;&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="思考题">思考题&lt;/h2>
&lt;p>思考一下，为什么不能像下面这样用直接赋值的方式来封装？&lt;/p>
&lt;div class="notices tip">
&lt;div class="label">Tip&lt;/div>
&lt;p>提示：思考封装前后 &lt;code>this&lt;/code> 的分别指向谁？&lt;/p>
&lt;/div>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln">1&lt;/span>&lt;span class="c1">// 方式一
&lt;/span>&lt;span class="ln">2&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kr">const&lt;/span> &lt;span class="nx">$&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">querySelector&lt;/span>
&lt;span class="ln">3&lt;/span>&lt;span class="kr">const&lt;/span> &lt;span class="nx">$$&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">querySelectorAll&lt;/span>
&lt;span class="ln">4&lt;/span>
&lt;span class="ln">5&lt;/span>&lt;span class="c1">// 方式二
&lt;/span>&lt;span class="ln">6&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kr">const&lt;/span> &lt;span class="nx">$&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">querySelector&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">bind&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">document&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">7&lt;/span>&lt;span class="kr">const&lt;/span> &lt;span class="nx">$$&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">querySelectorAll&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">bind&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">document&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>解决 uView Parse 富文本解析器 ready 事件触发时机不准确的问题</title><link>/2021-07-15/temp/</link><pubDate>Thu, 15 Jul 2021 00:00:00 +0000</pubDate><guid>/2021-07-15/temp/</guid><description>
&lt;p>
&lt;a
href = "https://github.com/jin-yufeng/mp-html/issues/195"
target="_blank" rel ="noopener"
>监听事件bindready，获取高度有时不准确 #195&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/p>
&lt;p>
&lt;a
href = "https://github.com/jin-yufeng/mp-html/blob/master/src/miniprogram/index.js#L336"
target="_blank" rel ="noopener"
>对应的源码部分&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/p>
&lt;blockquote>
&lt;p>判断 ready 的标准是每 350ms 检查一次高度，两次高度不变化就认为加载完毕，然后返回大小，处理的地方在 这里&lt;/p>
&lt;p>这个处理方式确实可能在某些情况下不准确，如果 350ms 总高度不变化就会触发，但这个很难权衡，因为要确保一定准确的话可能这个时间间隔要更长或者多次不变化后再触发，这样的话触发的就会很慢，某些情况下会带来问题（比如进入页面后等待图片加载完要跳转到某个锚点，等待时间过长就会影响体验），所以这里如果要求很高的话可能需要自行调整一下&lt;/p>
&lt;p>ps：对于这个问题最准确的获取时机应该是所有图片都触发 load 事件的时候，但由于开启懒加载后，一些图片不会立即加载，所以无法判断是否全部加载完毕，以及另外一些原因这个方法不适用，所以只能通过高度变化判断&lt;/p>
&lt;/blockquote>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln"> 1&lt;/span>&lt;span class="kr">export&lt;/span> &lt;span class="k">default&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 2&lt;/span> &lt;span class="nx">data&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 3&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 4&lt;/span> &lt;span class="mi">_&lt;/span>&lt;span class="nx">timer&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="kc">null&lt;/span>
&lt;span class="ln"> 5&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln"> 6&lt;/span> &lt;span class="p">},&lt;/span>
&lt;span class="ln"> 7&lt;/span> &lt;span class="nx">method&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 8&lt;/span> &lt;span class="cm">/**
&lt;/span>&lt;span class="ln"> 9&lt;/span>&lt;span class="cm"> * @description 获取内容大小和位置
&lt;/span>&lt;span class="ln">10&lt;/span>&lt;span class="cm"> * @return {Promise}
&lt;/span>&lt;span class="ln">11&lt;/span>&lt;span class="cm"> */&lt;/span>
&lt;span class="ln">12&lt;/span> &lt;span class="nx">getRect&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">selector&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">13&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nb">Promise&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="nx">resolve&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">reject&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">14&lt;/span> &lt;span class="nx">uni&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">createSelectorQuery&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="ln">15&lt;/span> &lt;span class="c1">// #ifndef MP-ALIPAY
&lt;/span>&lt;span class="ln">16&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="p">.&lt;/span>&lt;span class="k">in&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">this&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">17&lt;/span> &lt;span class="c1">// #endif
&lt;/span>&lt;span class="ln">18&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="p">.&lt;/span>&lt;span class="nx">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">selector&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">boundingClientRect&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">exec&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">res&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="nx">res&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">]&lt;/span> &lt;span class="o">?&lt;/span> &lt;span class="nx">resolve&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">res&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">])&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="nx">reject&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">Error&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;Root label not found&amp;#39;&lt;/span>&lt;span class="p">)))&lt;/span>
&lt;span class="ln">19&lt;/span> &lt;span class="p">})&lt;/span>
&lt;span class="ln">20&lt;/span> &lt;span class="p">},&lt;/span>
&lt;span class="ln">21&lt;/span>
&lt;span class="ln">22&lt;/span> &lt;span class="nx">watchGoodsDetail&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">23&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">times&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// 监听次数
&lt;/span>&lt;span class="ln">24&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">maxTimes&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// 连续 10 获取高度相同视为加载完毕
&lt;/span>&lt;span class="ln">25&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">wait&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">350&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// 间隔
&lt;/span>&lt;span class="ln">26&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">height&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// 详情高度
&lt;/span>&lt;span class="ln">27&lt;/span>&lt;span class="c1">&lt;/span>
&lt;span class="ln">28&lt;/span> &lt;span class="nx">clearInterval&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="mi">_&lt;/span>&lt;span class="nx">timer&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">29&lt;/span> &lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="mi">_&lt;/span>&lt;span class="nx">timer&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">setInterval&lt;/span>&lt;span class="p">(()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">30&lt;/span> &lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">getRect&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;#tab3&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">then&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">rect&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">31&lt;/span> &lt;span class="c1">// 350ms 总高度无变化就触发 ready 事件
&lt;/span>&lt;span class="ln">32&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">rect&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">height&lt;/span> &lt;span class="o">===&lt;/span> &lt;span class="nx">height&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">33&lt;/span> &lt;span class="nx">times&lt;/span>&lt;span class="o">++&lt;/span>
&lt;span class="ln">34&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">times&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="nx">maxTimes&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">35&lt;/span> &lt;span class="nx">clearInterval&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="mi">_&lt;/span>&lt;span class="nx">timer&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">36&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">37&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">38&lt;/span> &lt;span class="nx">times&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>
&lt;span class="ln">39&lt;/span> &lt;span class="nx">height&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">rect&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">height&lt;/span>
&lt;span class="ln">40&lt;/span> &lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">onNavTargetChange&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="ln">41&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">42&lt;/span> &lt;span class="p">}).&lt;/span>&lt;span class="k">catch&lt;/span>&lt;span class="p">(()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="p">})&lt;/span>
&lt;span class="ln">43&lt;/span> &lt;span class="p">},&lt;/span> &lt;span class="nx">wait&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">44&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">45&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">46&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>git subtree 使用记录</title><link>/series/git/git-subtree/</link><pubDate>Fri, 09 Jul 2021 00:00:00 +0000</pubDate><guid>/series/git/git-subtree/</guid><description>
&lt;p>参考文章：
&lt;a
href = "https://segmentfault.com/a/1190000012002151"
target="_blank" rel ="noopener"
>git subtree教程&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>git subtree push --prefix&lt;span class="o">=&lt;/span>content/posts post master
&lt;/code>&lt;/pre>&lt;/div>&lt;p>目前主要使用这三个命令即可，分别是添加、更新和推送远程。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>git subtree add --prefix&lt;span class="o">=&lt;/span>&amp;lt;prefix&amp;gt; &amp;lt;repository&amp;gt; &amp;lt;ref&amp;gt;
&lt;span class="ln">2&lt;/span>git subtree pull --prefix&lt;span class="o">=&lt;/span>&amp;lt;prefix&amp;gt; &amp;lt;repository&amp;gt; &amp;lt;ref&amp;gt;
&lt;span class="ln">3&lt;/span>git subtree push --prefix&lt;span class="o">=&lt;/span>&amp;lt;prefix&amp;gt; &amp;lt;repository&amp;gt; &amp;lt;ref&amp;gt;
&lt;/code>&lt;/pre>&lt;/div>&lt;p>其中 &lt;code>&amp;lt;prefix&amp;gt;&lt;/code> 是子模块的路径，&lt;code>&amp;lt;repository&amp;gt;&lt;/code> 是子模块自身的 git 地址。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="ln">1&lt;/span>&lt;span class="p">{&lt;/span>
&lt;span class="ln">2&lt;/span> &lt;span class="nt">&amp;#34;scripts&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">3&lt;/span> &lt;span class="nt">&amp;#34;set:posts&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;git remote add posts git@github.com:wencaizhang/wencaizhang.github.io.git&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="ln">4&lt;/span> &lt;span class="nt">&amp;#34;add:posts&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;git subtree add --prefix=content/posts post master &amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="ln">5&lt;/span> &lt;span class="nt">&amp;#34;pull:posts&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;git subtree pull --prefix=content/posts post master &amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="ln">6&lt;/span> &lt;span class="nt">&amp;#34;push:posts&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;git subtree push --prefix=content/posts post master&amp;#34;&lt;/span>
&lt;span class="ln">7&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">8&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>一个合并分支的新姿势</title><link>/series/git/git-merge-squash/</link><pubDate>Fri, 09 Jul 2021 00:00:00 +0000</pubDate><guid>/series/git/git-merge-squash/</guid><description>
&lt;p>Git 是程序员日常开发离不开的工具，合并分支也是多人开发协作过程中必不可少的环节。&lt;/p></description></item><item><title>设置input的placeholder的字体样式</title><link>/2021-06-06/set-styles-of-input-placeholder/</link><pubDate>Sun, 06 Jun 2021 00:00:00 +0000</pubDate><guid>/2021-06-06/set-styles-of-input-placeholder/</guid><description>
&lt;p>设置input占位符的样式&lt;/p>
&lt;p>HTML 代码：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="ln">1&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">input&lt;/span> &lt;span class="na">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;text&amp;#34;&lt;/span> &lt;span class="na">placeholder&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;请设置用户名&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>CSS 代码：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-css" data-lang="css">&lt;span class="ln"> 1&lt;/span>&lt;span class="nt">input&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="nd">-webkit-input-placeholder&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="c">/* Chrome/Opera/Safari */&lt;/span>
&lt;span class="ln"> 2&lt;/span> &lt;span class="k">color&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">red&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 3&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln"> 4&lt;/span>&lt;span class="nt">input&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="nd">-moz-placeholder&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="c">/* Firefox 19+ */&lt;/span>
&lt;span class="ln"> 5&lt;/span> &lt;span class="k">color&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">red&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 6&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln"> 7&lt;/span>&lt;span class="nt">input&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="nd">-ms-input-placeholder&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="c">/* IE 10+ */&lt;/span>
&lt;span class="ln"> 8&lt;/span> &lt;span class="k">color&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">red&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 9&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">10&lt;/span>&lt;span class="nt">input&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="nd">-moz-placeholder&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="c">/* Firefox 18- */&lt;/span>
&lt;span class="ln">11&lt;/span> &lt;span class="k">color&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">red&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">12&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>示例：&lt;/p>
&lt;input type="text" placeholder="请设置用户名">
&lt;style>
input::-webkit-input-placeholder { /* Chrome/Opera/Safari */
color: red;
}
input::-moz-placeholder { /* Firefox 19+ */
color: red;
}
input:-ms-input-placeholder { /* IE 10+ */
color: red;
}
input:-moz-placeholder { /* Firefox 18- */
color: red;
}
&lt;/style></description></item><item><title>设置滚动条样式</title><link>/2021-06-06/set-styles-of-scrollbar/</link><pubDate>Sun, 06 Jun 2021 00:00:00 +0000</pubDate><guid>/2021-06-06/set-styles-of-scrollbar/</guid><description>
&lt;p>设置滚动条样式&lt;/p>
&lt;p>HTML 代码：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="ln">1&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">p&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;scroll-container&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="ln">2&lt;/span> 庭院深深，不知有多深？杨柳依依，飞扬起片片烟雾，一重重帘幕不知有多少层。豪华的车马停在贵族公子寻欢作乐的地方，她登楼向远处望去，却看不见那通向章台的大路。春已至暮，三月的雨伴随着狂风大作，再是重门将黄昏景色掩闭，也无法留住春意。泪眼汪汪问落花可知道我的心意，落花默默不语，纷乱的，零零落落一点一点飞到秋千外。庭院深深，不知有多深？杨柳依依，飞扬起片片烟雾，一重重帘幕不知有多少层。豪华的车马停在贵族公子寻欢作乐的地方，她登楼向远处望去，却看不见那通向章台的大路。春已至暮，三月的雨伴随着狂风大作，再是重门将黄昏景色掩闭，也无法留住春意。泪眼汪汪问落花可知道我的心意，落花默默不语，纷乱的，零零落落一点一点飞到秋千外。庭院深深，不知有多深？杨柳依依，飞扬起片片烟雾，一重重帘幕不知有多少层。豪华的车马停在贵族公子寻欢作乐的地方，她登楼向远处望去，却看不见那通向章台的大路。春已至暮，三月的雨伴随着狂风大作，再是重门将黄昏景色掩闭，也无法留住春意。泪眼汪汪问落花可知道我的心意，落花默默不语，纷乱的，零零落落一点一点飞到秋千外。庭院深深，不知有多深？杨柳依依，飞扬起片片烟雾，一重重帘幕不知有多少层。豪华的车马停在贵族公子寻欢作乐的地方，她登楼向远处望去，却看不见那通向章台的大路。春已至暮，三月的雨伴随着狂风大作，再是重门将黄昏景色掩闭，也无法留住春意。泪眼汪汪问落花可知道我的心意，落花默默不语，纷乱的，零零落落一点一点飞到秋千外。
&lt;span class="ln">3&lt;/span>&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">p&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>CSS 代码：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-css" data-lang="css">&lt;span class="ln">1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nc">scroll-container&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">2&lt;/span> &lt;span class="k">width&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">500&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">3&lt;/span> &lt;span class="k">height&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">150&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">4&lt;/span> &lt;span class="k">border&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="kt">px&lt;/span> &lt;span class="kc">solid&lt;/span> &lt;span class="mh">#ddd&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">5&lt;/span> &lt;span class="k">padding&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">15&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">6&lt;/span> &lt;span class="k">overflow&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">auto&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c">/*必须*/&lt;/span>
&lt;span class="ln">7&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>滚动条样式：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-css" data-lang="css">&lt;span class="ln"> 1&lt;/span> &lt;span class="p">.&lt;/span>&lt;span class="nc">scroll-container&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="nd">-webkit-scrollbar&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 2&lt;/span> &lt;span class="k">width&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">8&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 3&lt;/span> &lt;span class="k">background&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">white&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 4&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln"> 5&lt;/span>
&lt;span class="ln"> 6&lt;/span> &lt;span class="p">.&lt;/span>&lt;span class="nc">scroll-container&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="nd">-webkit-scrollbar-corner&lt;/span>&lt;span class="o">,&lt;/span>
&lt;span class="ln"> 7&lt;/span> &lt;span class="c">/* 滚动条角落 */&lt;/span>
&lt;span class="ln"> 8&lt;/span> &lt;span class="p">.&lt;/span>&lt;span class="nc">scroll-container&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="nd">-webkit-scrollbar-thumb&lt;/span>&lt;span class="o">,&lt;/span>
&lt;span class="ln"> 9&lt;/span> &lt;span class="p">.&lt;/span>&lt;span class="nc">scroll-container&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="nd">-webkit-scrollbar-track&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="c">/*滚动条的轨道*/&lt;/span>
&lt;span class="ln">10&lt;/span> &lt;span class="k">border-radius&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">11&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">12&lt;/span>
&lt;span class="ln">13&lt;/span> &lt;span class="p">.&lt;/span>&lt;span class="nc">scroll-container&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="nd">-webkit-scrollbar-corner&lt;/span>&lt;span class="o">,&lt;/span>
&lt;span class="ln">14&lt;/span> &lt;span class="p">.&lt;/span>&lt;span class="nc">scroll-container&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="nd">-webkit-scrollbar-track&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">15&lt;/span> &lt;span class="c">/* 滚动条轨道 */&lt;/span>
&lt;span class="ln">16&lt;/span> &lt;span class="k">background-color&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nb">rgba&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">180&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">160&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">120&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">0.1&lt;/span>&lt;span class="p">);&lt;/span>
&lt;span class="ln">17&lt;/span> &lt;span class="k">box-shadow&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">inset&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="kt">px&lt;/span> &lt;span class="nb">rgba&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">180&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">160&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">120&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">0.5&lt;/span>&lt;span class="p">);&lt;/span>
&lt;span class="ln">18&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">19&lt;/span>
&lt;span class="ln">20&lt;/span> &lt;span class="p">.&lt;/span>&lt;span class="nc">scroll-container&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="nd">-webkit-scrollbar-thumb&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">21&lt;/span> &lt;span class="c">/* 滚动条手柄 */&lt;/span>
&lt;span class="ln">22&lt;/span> &lt;span class="k">background-color&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mh">#00adb5&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">23&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>示例：&lt;/p>
&lt;p class="scroll-container">
庭院深深，不知有多深？杨柳依依，飞扬起片片烟雾，一重重帘幕不知有多少层。豪华的车马停在贵族公子寻欢作乐的地方，她登楼向远处望去，却看不见那通向章台的大路。春已至暮，三月的雨伴随着狂风大作，再是重门将黄昏景色掩闭，也无法留住春意。泪眼汪汪问落花可知道我的心意，落花默默不语，纷乱的，零零落落一点一点飞到秋千外。庭院深深，不知有多深？杨柳依依，飞扬起片片烟雾，一重重帘幕不知有多少层。豪华的车马停在贵族公子寻欢作乐的地方，她登楼向远处望去，却看不见那通向章台的大路。春已至暮，三月的雨伴随着狂风大作，再是重门将黄昏景色掩闭，也无法留住春意。泪眼汪汪问落花可知道我的心意，落花默默不语，纷乱的，零零落落一点一点飞到秋千外。庭院深深，不知有多深？杨柳依依，飞扬起片片烟雾，一重重帘幕不知有多少层。豪华的车马停在贵族公子寻欢作乐的地方，她登楼向远处望去，却看不见那通向章台的大路。春已至暮，三月的雨伴随着狂风大作，再是重门将黄昏景色掩闭，也无法留住春意。泪眼汪汪问落花可知道我的心意，落花默默不语，纷乱的，零零落落一点一点飞到秋千外。庭院深深，不知有多深？杨柳依依，飞扬起片片烟雾，一重重帘幕不知有多少层。豪华的车马停在贵族公子寻欢作乐的地方，她登楼向远处望去，却看不见那通向章台的大路。春已至暮，三月的雨伴随着狂风大作，再是重门将黄昏景色掩闭，也无法留住春意。泪眼汪汪问落花可知道我的心意，落花默默不语，纷乱的，零零落落一点一点飞到秋千外。
&lt;/p>
&lt;style>
.scroll-container {
width: 500px;
height: 150px;
border: 1px solid #ddd;
padding: 15px;
overflow: auto;
}
.scroll-container::-webkit-scrollbar {
width: 8px;
background: white;
}
.scroll-container::-webkit-scrollbar-corner,
/* 滚动条角落 */
.scroll-container::-webkit-scrollbar-thumb,
.scroll-container::-webkit-scrollbar-track {
border-radius: 4px;
}
.scroll-container::-webkit-scrollbar-corner,
.scroll-container::-webkit-scrollbar-track {
/* 滚动条轨道 */
background-color: rgba(180, 160, 120, 0.1);
box-shadow: inset 0 0 1px rgba(180, 160, 120, 0.5);
}
.scroll-container::-webkit-scrollbar-thumb {
/* 滚动条手柄 */
background-color: #00adb5;
}
&lt;/style></description></item><item><title>Nginx 常用配置备忘清单 | nginx-cheatsheet</title><link>/2021-05-18/nginx-cheatsheet/</link><pubDate>Tue, 18 May 2021 00:00:00 +0000</pubDate><guid>/2021-05-18/nginx-cheatsheet/</guid><description>
&lt;p>作为软件开发工程师多多少少都该懂一些 nginx 的使用和配置，下面是 nginx 的几个经典应用场景下的配置写法，记录下来以防遗忘，用到的时候也可以直接过来拷贝。&lt;/p>
&lt;h2 id="端口监听">端口监听&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-nginx" data-lang="nginx">&lt;span class="ln"> 1&lt;/span>&lt;span class="k">server&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 2&lt;/span> &lt;span class="c1"># Standard HTTP Protocol
&lt;/span>&lt;span class="ln"> 3&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="c1"># 标准的 HTTP 协议
&lt;/span>&lt;span class="ln"> 4&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="kn">listen&lt;/span> &lt;span class="mi">80&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 5&lt;/span>
&lt;span class="ln"> 6&lt;/span> &lt;span class="c1"># Standard HTTPS Protocol
&lt;/span>&lt;span class="ln"> 7&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="c1"># 标准的 HTTPS 协议
&lt;/span>&lt;span class="ln"> 8&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="kn">listen&lt;/span> &lt;span class="mi">443&lt;/span> &lt;span class="s">ssl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 9&lt;/span>
&lt;span class="ln">10&lt;/span> &lt;span class="c1"># For http2
&lt;/span>&lt;span class="ln">11&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="kn">listen&lt;/span> &lt;span class="mi">443&lt;/span> &lt;span class="s">ssl&lt;/span> &lt;span class="s">http2&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">12&lt;/span>
&lt;span class="ln">13&lt;/span> &lt;span class="c1"># Listen on 80 using IPv6
&lt;/span>&lt;span class="ln">14&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="c1"># 使用 IPv6 监听 80 端口
&lt;/span>&lt;span class="ln">15&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="kn">listen&lt;/span> &lt;span class="s">[::]:80&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">16&lt;/span>
&lt;span class="ln">17&lt;/span> &lt;span class="c1"># Listen only on using IPv6
&lt;/span>&lt;span class="ln">18&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="c1"># 仅使用 IPv6 监听 80 端口
&lt;/span>&lt;span class="ln">19&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="kn">listen&lt;/span> &lt;span class="s">[::]:80&lt;/span> &lt;span class="s">ipv6only=on&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">20&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="访问日志">访问日志&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-nginx" data-lang="nginx">&lt;span class="ln">1&lt;/span>&lt;span class="k">server&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">2&lt;/span> &lt;span class="c1"># Relative or full path to log file
&lt;/span>&lt;span class="ln">3&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="c1"># 为日志文件指定一个相对或绝对路径
&lt;/span>&lt;span class="ln">4&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="kn">access_log&lt;/span> &lt;span class="s">/path/to/file.log&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">5&lt;/span>
&lt;span class="ln">6&lt;/span> &lt;span class="c1"># Turn &amp;#39;on&amp;#39; or &amp;#39;off&amp;#39;
&lt;/span>&lt;span class="ln">7&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="c1"># 通过 &amp;#39;on&amp;#39; 或者 &amp;#39;off&amp;#39; 控制是否启用
&lt;/span>&lt;span class="ln">8&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="kn">access_log&lt;/span> &lt;span class="no">on&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">9&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="域名">域名&lt;/h2>
&lt;p>指定域名和对应的网站根目录位置，&lt;code>server_name&lt;/code> 可以是域名、二级域名，也可以是 ip 地址。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-nginx" data-lang="nginx">&lt;span class="ln"> 1&lt;/span>&lt;span class="k">server&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 2&lt;/span> &lt;span class="c1"># Listen to yourdomain.com
&lt;/span>&lt;span class="ln"> 3&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="c1"># 监听来自域名 yourdomain.com 的访问
&lt;/span>&lt;span class="ln"> 4&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="kn">server_name&lt;/span> &lt;span class="s">yourdomain.com&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 5&lt;/span>
&lt;span class="ln"> 6&lt;/span> &lt;span class="c1"># Listen to multiple domains
&lt;/span>&lt;span class="ln"> 7&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="c1"># 监听来自多个域名的访问
&lt;/span>&lt;span class="ln"> 8&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="kn">server_name&lt;/span> &lt;span class="s">yourdomain.com&lt;/span> &lt;span class="s">www.yourdomain.com&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 9&lt;/span>
&lt;span class="ln">10&lt;/span> &lt;span class="c1"># Listen to all domains
&lt;/span>&lt;span class="ln">11&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="c1"># 监听 yourdomain.com 的所有二级域名
&lt;/span>&lt;span class="ln">12&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="kn">server_name&lt;/span> &lt;span class="s">*.yourdomain.com&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">13&lt;/span>
&lt;span class="ln">14&lt;/span> &lt;span class="c1"># Listen to all top-level domains
&lt;/span>&lt;span class="ln">15&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="c1"># 监听所有 yourdomain 的顶级域名
&lt;/span>&lt;span class="ln">16&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="kn">server_name&lt;/span> &lt;span class="s">yourdomain.*&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">17&lt;/span>
&lt;span class="ln">18&lt;/span> &lt;span class="c1"># Listen to unspecified Hostnames (Listens to IP address itself)
&lt;/span>&lt;span class="ln">19&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="c1"># 不指定域名，监听自身 IP 的访问
&lt;/span>&lt;span class="ln">20&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="kn">server_name&lt;/span> &lt;span class="s">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">21&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="静态资源访问">静态资源访问&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-nginx" data-lang="nginx">&lt;span class="ln">1&lt;/span>&lt;span class="k">server&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">2&lt;/span> &lt;span class="kn">listen&lt;/span> &lt;span class="mi">80&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">3&lt;/span> &lt;span class="kn">server_name&lt;/span> &lt;span class="s">yourdomain.com&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">4&lt;/span>
&lt;span class="ln">5&lt;/span> &lt;span class="kn">location&lt;/span> &lt;span class="s">/&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">6&lt;/span> &lt;span class="kn">root&lt;/span> &lt;span class="s">/path/to/website&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">7&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">8&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="重定向">重定向&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-nginx" data-lang="nginx">&lt;span class="ln">1&lt;/span>&lt;span class="k">server&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">2&lt;/span> &lt;span class="kn">listen&lt;/span> &lt;span class="mi">80&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">3&lt;/span> &lt;span class="kn">server_name&lt;/span> &lt;span class="s">www.yourdomain.com&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">4&lt;/span> &lt;span class="kn">return&lt;/span> &lt;span class="mi">301&lt;/span> &lt;span class="s">http://yourdomain.com&lt;/span>&lt;span class="nv">$request_uri&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">5&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-nginx" data-lang="nginx">&lt;span class="ln">1&lt;/span>&lt;span class="k">server&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">2&lt;/span> &lt;span class="kn">listen&lt;/span> &lt;span class="mi">80&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">3&lt;/span> &lt;span class="kn">server_name&lt;/span> &lt;span class="s">www.yourdomain.com&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">4&lt;/span>
&lt;span class="ln">5&lt;/span> &lt;span class="kn">location&lt;/span> &lt;span class="s">/redirect-url&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">6&lt;/span> &lt;span class="kn">return&lt;/span> &lt;span class="mi">301&lt;/span> &lt;span class="s">http://otherdomain.com&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">7&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">8&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="反向代理">反向代理&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-nginx" data-lang="nginx">&lt;span class="ln"> 1&lt;/span>&lt;span class="k">server&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 2&lt;/span> &lt;span class="kn">listen&lt;/span> &lt;span class="mi">80&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 3&lt;/span> &lt;span class="kn">server_name&lt;/span> &lt;span class="s">yourdomain.com&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 4&lt;/span>
&lt;span class="ln"> 5&lt;/span> &lt;span class="kn">location&lt;/span> &lt;span class="s">/&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 6&lt;/span> &lt;span class="kn">proxy_pass&lt;/span> &lt;span class="s">http://0.0.0.0:3000&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 7&lt;/span> &lt;span class="c1"># where 0.0.0.0:3000 is your application server (Ex: node.js) bound on 0.0.0.0 listening on port 3000
&lt;/span>&lt;span class="ln"> 8&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln"> 9&lt;/span>
&lt;span class="ln">10&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="负载均衡">负载均衡&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-nginx" data-lang="nginx">&lt;span class="ln"> 1&lt;/span>&lt;span class="k">upstream&lt;/span> &lt;span class="s">node_js&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 2&lt;/span> &lt;span class="kn">server&lt;/span> &lt;span class="n">0.0.0.0&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mi">3000&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 3&lt;/span> &lt;span class="kn">server&lt;/span> &lt;span class="n">0.0.0.0&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="mi">4000&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 4&lt;/span> &lt;span class="kn">server&lt;/span> &lt;span class="mi">123&lt;/span>&lt;span class="s">.131.121.122&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 5&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln"> 6&lt;/span>
&lt;span class="ln"> 7&lt;/span>&lt;span class="k">server&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 8&lt;/span> &lt;span class="kn">listen&lt;/span> &lt;span class="mi">80&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 9&lt;/span> &lt;span class="kn">server_name&lt;/span> &lt;span class="s">yourdomain.com&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">10&lt;/span>
&lt;span class="ln">11&lt;/span> &lt;span class="kn">location&lt;/span> &lt;span class="s">/&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">12&lt;/span> &lt;span class="kn">proxy_pass&lt;/span> &lt;span class="s">http://node_js&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">13&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">14&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="ssl-证书">SSL 证书&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-nginx" data-lang="nginx">&lt;span class="ln"> 1&lt;/span>&lt;span class="k">server&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 2&lt;/span> &lt;span class="kn">listen&lt;/span> &lt;span class="mi">443&lt;/span> &lt;span class="s">ssl&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 3&lt;/span> &lt;span class="kn">server_name&lt;/span> &lt;span class="s">yourdomain.com&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 4&lt;/span>
&lt;span class="ln"> 5&lt;/span> &lt;span class="kn">ssl&lt;/span> &lt;span class="no">on&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 6&lt;/span>
&lt;span class="ln"> 7&lt;/span> &lt;span class="kn">ssl_certificate&lt;/span> &lt;span class="s">/path/to/cert.pem&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 8&lt;/span> &lt;span class="kn">ssl_certificate_key&lt;/span> &lt;span class="s">/path/to/privatekey.pem&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 9&lt;/span>
&lt;span class="ln">10&lt;/span> &lt;span class="kn">ssl_stapling&lt;/span> &lt;span class="no">on&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">11&lt;/span> &lt;span class="kn">ssl_stapling_verify&lt;/span> &lt;span class="no">on&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">12&lt;/span> &lt;span class="kn">ssl_trusted_certificate&lt;/span> &lt;span class="s">/path/to/fullchain.pem&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">13&lt;/span>
&lt;span class="ln">14&lt;/span> &lt;span class="kn">ssl_protocols&lt;/span> &lt;span class="s">TLSv1&lt;/span> &lt;span class="s">TLSv1.1&lt;/span> &lt;span class="s">TLSv1.2&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">15&lt;/span> &lt;span class="kn">ssl_session_timeout&lt;/span> &lt;span class="s">1h&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">16&lt;/span> &lt;span class="kn">ssl_session_cache&lt;/span> &lt;span class="s">shared:SSL:50m&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">17&lt;/span> &lt;span class="kn">add_header&lt;/span> &lt;span class="s">Strict-Transport-Security&lt;/span> &lt;span class="s">max-age=15768000&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">18&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">19&lt;/span>
&lt;span class="ln">20&lt;/span>&lt;span class="c1"># Permanent Redirect for HTTP to HTTPS
&lt;/span>&lt;span class="ln">21&lt;/span>&lt;span class="c1"># 将 HTTP 访问永久重定向到 HTTPS
&lt;/span>&lt;span class="ln">22&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="k">server&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">23&lt;/span> &lt;span class="kn">listen&lt;/span> &lt;span class="mi">80&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">24&lt;/span> &lt;span class="kn">server_name&lt;/span> &lt;span class="s">yourdomain.com&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">25&lt;/span> &lt;span class="kn">return&lt;/span> &lt;span class="mi">301&lt;/span> &lt;span class="s">https://&lt;/span>&lt;span class="nv">$host$request_uri&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">26&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="感谢">感谢&lt;/h2>
&lt;p>文中用到的配置几乎都出自
&lt;a
href = "https://vishnu.hashnode.dev/nginx-cheatsheet"
target="_blank" rel ="noopener"
>&lt;a href="https://vishnu.hashnode.dev/nginx-cheatsheet">https://vishnu.hashnode.dev/nginx-cheatsheet&lt;/a>&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
这篇文章，在此基础上经过个人理解添加了一些解释说明，特此说明。&lt;/p></description></item><item><title>前端创建并下载文件</title><link>/2021-01-27/download-file/</link><pubDate>Wed, 27 Jan 2021 00:00:00 +0000</pubDate><guid>/2021-01-27/download-file/</guid><description>
&lt;p>more 利用 HTML5 原生的 &lt;code>download&lt;/code> 属性来下载文本信息&lt;/p>
&lt;p>代码如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln"> 1&lt;/span>&lt;span class="cm">/**
&lt;/span>&lt;span class="ln"> 2&lt;/span>&lt;span class="cm"> * 前端创建并下载文件
&lt;/span>&lt;span class="ln"> 3&lt;/span>&lt;span class="cm"> * @param {String} content 文件内容
&lt;/span>&lt;span class="ln"> 4&lt;/span>&lt;span class="cm"> * @param {String} filename 文件名称
&lt;/span>&lt;span class="ln"> 5&lt;/span>&lt;span class="cm"> * @param {String} MIME
&lt;/span>&lt;span class="ln"> 6&lt;/span>&lt;span class="cm"> * MIME类型参考手册 http://www.w3school.com.cn/media/media_mimeref.asp
&lt;/span>&lt;span class="ln"> 7&lt;/span>&lt;span class="cm"> */&lt;/span>
&lt;span class="ln"> 8&lt;/span>&lt;span class="kr">export&lt;/span> &lt;span class="kd">function&lt;/span> &lt;span class="nx">downloadFile&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">content&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">filename&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">MIME&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;application/octet-stream&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 9&lt;/span> &lt;span class="c1">// 创建隐藏的可下载链接
&lt;/span>&lt;span class="ln">10&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">eleLink&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">createElement&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;a&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">11&lt;/span> &lt;span class="nx">eleLink&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">download&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">filename&lt;/span>
&lt;span class="ln">12&lt;/span> &lt;span class="nx">eleLink&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">style&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">display&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;none&amp;#39;&lt;/span>
&lt;span class="ln">13&lt;/span>
&lt;span class="ln">14&lt;/span> &lt;span class="c1">// 字符内容转变成blob地址
&lt;/span>&lt;span class="ln">15&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">blob&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">Blob&lt;/span>&lt;span class="p">([&lt;/span>&lt;span class="nx">content&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">type&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nx">MIME&lt;/span> &lt;span class="p">})&lt;/span>
&lt;span class="ln">16&lt;/span> &lt;span class="nx">eleLink&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">href&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">URL&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">createObjectURL&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">blob&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">17&lt;/span>
&lt;span class="ln">18&lt;/span> &lt;span class="c1">// 触发点击事件，然后移除
&lt;/span>&lt;span class="ln">19&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">body&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">appendChild&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">eleLink&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">20&lt;/span> &lt;span class="nx">eleLink&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">click&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="ln">21&lt;/span> &lt;span class="nb">document&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">body&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">removeChild&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">eleLink&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">22&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>其中，参数 &lt;code>content&lt;/code> 指需要下载的文本或字符串内容，&lt;code>filename&lt;/code> 指下载到系统中的文件名称。&lt;/p>
&lt;p>代码来源：
&lt;a
href = "https://www.zhangxinxu.com/wordpress/2017/07/js-text-string-download-as-html-json-file/"
target="_blank" rel ="noopener"
>JS前端创建html或json文件并浏览器导出下载&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/p></description></item><item><title>将正常时间格式转化为时间戳</title><link>/2021-01-27/transform-timestamp/</link><pubDate>Wed, 27 Jan 2021 00:00:00 +0000</pubDate><guid>/2021-01-27/transform-timestamp/</guid><description>
&lt;p>使用 JavaScript 内置方法将正常时间格式转化为时间戳&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln"> 1&lt;/span>&lt;span class="cm">/**
&lt;/span>&lt;span class="ln"> 2&lt;/span>&lt;span class="cm"> * 将正常时间格式转化为时间戳
&lt;/span>&lt;span class="ln"> 3&lt;/span>&lt;span class="cm"> * @param {String} time [正常时间格式，如：2019-04-01 13:10:10]
&lt;/span>&lt;span class="ln"> 4&lt;/span>&lt;span class="cm"> */&lt;/span>
&lt;span class="ln"> 5&lt;/span>&lt;span class="kr">export&lt;/span> &lt;span class="kd">function&lt;/span> &lt;span class="nx">getTimestamp&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">time&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">null&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 6&lt;/span> &lt;span class="c1">// 没有对 time 做合法性校验
&lt;/span>&lt;span class="ln"> 7&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="c1">// 假设传入的 time 都是合法的时间格式：2019-04-01 13:10:10
&lt;/span>&lt;span class="ln"> 8&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">time&lt;/span> &lt;span class="o">?&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nb">Date&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">time&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/-/g&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;/&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nb">Date&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="ln"> 9&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">timestamp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">getTime&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1">// 13 位数字，精确到毫秒
&lt;/span>&lt;span class="ln">10&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nx">timestamp&lt;/span>
&lt;span class="ln">11&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>检测设备类型</title><link>/2021-01-27/detect-device/</link><pubDate>Wed, 27 Jan 2021 00:00:00 +0000</pubDate><guid>/2021-01-27/detect-device/</guid><description>
&lt;p>在开发移动端网站时经常需要检查用户端设备类型，以便做出不同的调整。&lt;/p>
&lt;h2 id="方式一检测手机平板和pc">方式一、检测手机平板和PC&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln"> 1&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">detectDevice&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 2&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="nx">isMobile&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">isTablet&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">isLaptop&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 3&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nb">window&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">innerWidth&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">425&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 4&lt;/span> &lt;span class="nx">isMobile&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 5&lt;/span> &lt;span class="nx">isTablet&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 6&lt;/span> &lt;span class="nx">isLaptop&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 7&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nb">window&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">innerWidth&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="mi">768&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 8&lt;/span> &lt;span class="nx">isMobile&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 9&lt;/span> &lt;span class="nx">isTablet&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">10&lt;/span> &lt;span class="nx">isLaptop&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">11&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="k">else&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">12&lt;/span> &lt;span class="nx">isMobile&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">13&lt;/span> &lt;span class="nx">isTablet&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">false&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">14&lt;/span> &lt;span class="nx">isLaptop&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">15&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">16&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">17&lt;/span>&lt;span class="nx">detectDevice&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="判断是否微信浏览器">判断是否微信浏览器&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln">1&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">isWeChat&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">2&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">ua&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">navigator&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">userAgent&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">toLowerCase&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="ln">3&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nx">ua&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">match&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="sr">/MicroMessenger/i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;micromessenger&amp;#34;&lt;/span>
&lt;span class="ln">4&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>计算传入的时间戳和当前时间相差了多久</title><link>/2021-01-27/get-time-ago/</link><pubDate>Wed, 27 Jan 2021 00:00:00 +0000</pubDate><guid>/2021-01-27/get-time-ago/</guid><description>
&lt;p>某些时候我们需要展示某个时间点相差当前时刻多久，例如“一天前”，“一个月前”等。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln"> 1&lt;/span>&lt;span class="cm">/**
&lt;/span>&lt;span class="ln"> 2&lt;/span>&lt;span class="cm"> * 计算传入的时间戳和当前时间相差了多久
&lt;/span>&lt;span class="ln"> 3&lt;/span>&lt;span class="cm"> * @param {Number} timestamp [时间戳]
&lt;/span>&lt;span class="ln"> 4&lt;/span>&lt;span class="cm"> */&lt;/span>
&lt;span class="ln"> 5&lt;/span>&lt;span class="kr">export&lt;/span> &lt;span class="kd">function&lt;/span> &lt;span class="nx">getTimeDiff&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">timestamp&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 6&lt;/span> &lt;span class="c1">// 如果精确到毫秒，时间戳是 13 位数字
&lt;/span>&lt;span class="ln"> 7&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="c1">// 这里按照秒来计算，需要将毫秒转换为秒
&lt;/span>&lt;span class="ln"> 8&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">timestamp&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">10&lt;/span> &lt;span class="o">**&lt;/span> &lt;span class="mi">12&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 9&lt;/span> &lt;span class="nx">timestamp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">timestamp&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="mi">1000&lt;/span>
&lt;span class="ln">10&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">11&lt;/span>
&lt;span class="ln">12&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="nx">currentStamptime&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">Date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">parse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">new&lt;/span> &lt;span class="nb">Date&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="mi">1000&lt;/span>
&lt;span class="ln">13&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="nx">agoAt&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;刚刚&amp;#39;&lt;/span>
&lt;span class="ln">14&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="nx">diff&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">currentStamptime&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="nx">timestamp&lt;/span>
&lt;span class="ln">15&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="nx">points&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>
&lt;span class="ln">16&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">value&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="mi">365&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">24&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">60&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">60&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">suffix&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;年前&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">max&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="p">},&lt;/span>
&lt;span class="ln">17&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">value&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="mi">30&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">24&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">60&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">60&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">suffix&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;月前&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">max&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="mi">11&lt;/span> &lt;span class="p">},&lt;/span>
&lt;span class="ln">18&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">value&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="mi">7&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">24&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">60&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">60&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">suffix&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;周前&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">max&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="mi">4&lt;/span> &lt;span class="p">},&lt;/span>
&lt;span class="ln">19&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">value&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="mi">24&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">60&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">60&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">suffix&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;天前&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">max&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="mi">6&lt;/span> &lt;span class="p">},&lt;/span>
&lt;span class="ln">20&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">value&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="mi">60&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">60&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">suffix&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;小时前&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">max&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="mi">23&lt;/span> &lt;span class="p">},&lt;/span>
&lt;span class="ln">21&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">value&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="mi">10&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="mi">60&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">suffix&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;0分钟前&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">max&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="mi">5&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">22&lt;/span> &lt;span class="p">]&lt;/span>
&lt;span class="ln">23&lt;/span>
&lt;span class="ln">24&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="nx">i&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="nx">points&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">length&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="nx">i&lt;/span>&lt;span class="o">++&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">25&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="nx">item&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">points&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nx">i&lt;/span>&lt;span class="p">]&lt;/span>
&lt;span class="ln">26&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="nx">mode&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">Math&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">floor&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">diff&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="nx">item&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">27&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">mode&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">28&lt;/span> &lt;span class="nx">agoAt&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">Math&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">min&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">mode&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">item&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">max&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">item&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">suffix&lt;/span>
&lt;span class="ln">29&lt;/span> &lt;span class="k">break&lt;/span>
&lt;span class="ln">30&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">31&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">32&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nx">agoAt&lt;/span>
&lt;span class="ln">33&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>转换存储容量大小</title><link>/2021-01-27/transform-size/</link><pubDate>Wed, 27 Jan 2021 00:00:00 +0000</pubDate><guid>/2021-01-27/transform-size/</guid><description>
&lt;p>我们知道存储容量好几个不同的单位，如 KB、MB、GB 等等。&lt;/p>
&lt;p>而在反映一块硬盘的具体容量时，总是需要根据其实际大小选用合适的单位，例如我有一块 500GB 的硬盘和一根 4GB 的内存条，就不能说成 0.5GB 的硬盘和 4000MB 的内存条。&lt;/p>
&lt;p>因此，我们需要一个函数来将一个容量转换为合适的单位来表示&lt;/p>
&lt;p>转换存储容量大小&lt;/p>
&lt;p>value 应当是以 b 位单位的
小于 1 KB，则转化成 B
小于 1 MB，则转化成 KB
小于 1 GB，则转化成 MB
以此类推，目前最大单位 PB
size: 单位大小，这里是 1000&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln"> 1&lt;/span>&lt;span class="kr">export&lt;/span> &lt;span class="kd">function&lt;/span> &lt;span class="nx">formatStorageSize&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">currValue&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">unit&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;B&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">size&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1024&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 2&lt;/span>
&lt;span class="ln"> 3&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">unites&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;B&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;KB&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;MB&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;GB&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;TB&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;PB&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;span class="ln"> 4&lt;/span>
&lt;span class="ln"> 5&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="nx">unites&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">includes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">unit&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 6&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nb">Error&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;请输入标准的存储单位&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln"> 7&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln"> 8&lt;/span>
&lt;span class="ln"> 9&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">powSize&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">n&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">10&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">max&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">unites&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">length&lt;/span>
&lt;span class="ln">11&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nx">max&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="nx">n&lt;/span> &lt;span class="o">?&lt;/span> &lt;span class="nb">Math&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">pow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">size&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">n&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">:&lt;/span> &lt;span class="kc">Infinity&lt;/span>
&lt;span class="ln">12&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">13&lt;/span>
&lt;span class="ln">14&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">unitesTable&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">unites&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">map&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="nx">unit&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">index&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">15&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">16&lt;/span> &lt;span class="nx">suffix&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="nx">unit&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="ln">17&lt;/span> &lt;span class="nx">minValue&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="nx">powSize&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">index&lt;/span>&lt;span class="p">),&lt;/span>
&lt;span class="ln">18&lt;/span> &lt;span class="nx">maxValue&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="mi">1&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="nx">powSize&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">index&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">19&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">20&lt;/span> &lt;span class="p">})&lt;/span>
&lt;span class="ln">21&lt;/span>
&lt;span class="ln">22&lt;/span> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">unitesTable&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">23&lt;/span>
&lt;span class="ln">24&lt;/span> &lt;span class="c1">// 先恢复到以 B 为单位然后进行计算
&lt;/span>&lt;span class="ln">25&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">value&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">powSize&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">unites&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">indexOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">unit&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="nx">currValue&lt;/span>
&lt;span class="ln">26&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">suffix&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">minValue&lt;/span> &lt;span class="p">}&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">unitesTable&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">item&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="nx">item&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">maxValue&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="nx">value&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">27&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">ret&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">value&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="nx">minValue&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">toFixed&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="s1">&amp;#39; &amp;#39;&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="nx">suffix&lt;/span>
&lt;span class="ln">28&lt;/span>
&lt;span class="ln">29&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nx">ret&lt;/span>
&lt;span class="ln">30&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="测试代码">测试代码&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln">1&lt;/span>
&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>闪耀你的div</title><link>/2021-01-27/flash/</link><pubDate>Wed, 27 Jan 2021 00:00:00 +0000</pubDate><guid>/2021-01-27/flash/</guid><description>
&lt;p>想让你的网页可以 blingbling 地闪耀吗？&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-css" data-lang="css">&lt;span class="ln"> 1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nc">flash-wrap&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 2&lt;/span> &lt;span class="k">position&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">relative&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 3&lt;/span> &lt;span class="k">overflow&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">hidden&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 4&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln"> 5&lt;/span>
&lt;span class="ln"> 6&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nc">flash-wrap&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="nd">after&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 7&lt;/span> &lt;span class="k">content&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 8&lt;/span> &lt;span class="k">position&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">absolute&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 9&lt;/span> &lt;span class="k">left&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">-100&lt;/span>&lt;span class="kt">%&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">10&lt;/span> &lt;span class="k">top&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">11&lt;/span> &lt;span class="k">width&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">100&lt;/span>&lt;span class="kt">%&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">12&lt;/span> &lt;span class="k">height&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">100&lt;/span>&lt;span class="kt">%&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">13&lt;/span> &lt;span class="k">transform&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nf">skewx&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">-25&lt;/span>&lt;span class="kt">deg&lt;/span>&lt;span class="p">);&lt;/span>
&lt;span class="ln">14&lt;/span> &lt;span class="k">background-image&lt;/span>&lt;span class="p">:&lt;/span>
&lt;span class="ln">15&lt;/span> &lt;span class="kp">-webkit-&lt;/span>&lt;span class="nb">linear-gradient&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="kt">deg&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nb">rgba&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">255&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">255&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">255&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">),&lt;/span>
&lt;span class="ln">16&lt;/span> &lt;span class="nb">rgba&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">255&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">255&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">255&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mf">.5&lt;/span>&lt;span class="p">),&lt;/span>
&lt;span class="ln">17&lt;/span> &lt;span class="nb">rgba&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">255&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">255&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">255&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">0&lt;/span>&lt;span class="p">));&lt;/span>
&lt;span class="ln">18&lt;/span> &lt;span class="k">z-index&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">19&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">20&lt;/span>
&lt;span class="ln">21&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nc">flash-wrap&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="nd">hover&lt;/span>&lt;span class="p">::&lt;/span>&lt;span class="nd">after&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">22&lt;/span> &lt;span class="k">animation&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">flash&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="kt">s&lt;/span> &lt;span class="kc">ease&lt;/span> &lt;span class="kc">infinite&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">23&lt;/span> &lt;span class="k">animation-delay&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mf">.5&lt;/span>&lt;span class="kt">s&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">24&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">25&lt;/span>
&lt;span class="ln">26&lt;/span>&lt;span class="p">@&lt;/span>&lt;span class="k">keyframes&lt;/span> &lt;span class="nt">flash&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">27&lt;/span> &lt;span class="nt">0&lt;/span>&lt;span class="o">%&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">28&lt;/span> &lt;span class="k">left&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">-100&lt;/span>&lt;span class="kt">%&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">29&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">30&lt;/span>
&lt;span class="ln">31&lt;/span> &lt;span class="nt">100&lt;/span>&lt;span class="o">%&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">32&lt;/span> &lt;span class="k">left&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">100&lt;/span>&lt;span class="kt">%&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">33&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">34&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>推荐 JavaScript 中处理数字计算精度问题的开源库</title><link>/2021-01-10/calculate-of-number-in-js/</link><pubDate>Sun, 10 Jan 2021 00:00:00 +0000</pubDate><guid>/2021-01-10/calculate-of-number-in-js/</guid><description>
&lt;p>在 JavaScript 中彻底解决你0.1+0.2!==0.3的精度问题，还可以给小数按条件取值。是开发计算项目的必备良品&lt;/p>
&lt;p>本篇推荐三个可用于 JavaScript 中数字计算不丢失精度的开源库，均由
&lt;a
href = "https://github.com/MikeMcl"
target="_blank" rel ="noopener"
>MikeMcl&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
开源（给大佬点赞👍），三个库的 API 保持一致，但侧重点不同，下面一一解释。&lt;/p>
&lt;h2 id="一bigjs">一、big.js&lt;/h2>
&lt;p>传送门：
&lt;a
href = "https://github.com/MikeMcl/big.js"
target="_blank" rel ="noopener"
>&lt;a href="https://github.com/MikeMcl/big.js">https://github.com/MikeMcl/big.js&lt;/a>&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/p>
&lt;p>文档：
&lt;a
href = "https://mikemcl.github.io/big.js/"
target="_blank" rel ="noopener"
>&lt;a href="https://mikemcl.github.io/big.js/">https://mikemcl.github.io/big.js/&lt;/a>&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/p>
&lt;p>适合只需要简单计算的项目&lt;/p>
&lt;h2 id="二bignumberjs">二、bignumber.js&lt;/h2>
&lt;p>传送门：
&lt;a
href = "https://github.com/MikeMcl/bignumber.js"
target="_blank" rel ="noopener"
>&lt;a href="https://github.com/MikeMcl/bignumber.js">https://github.com/MikeMcl/bignumber.js&lt;/a>&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/p>
&lt;p>文档：
&lt;a
href = "https://mikemcl.github.io/bignumber.js/"
target="_blank" rel ="noopener"
>&lt;a href="https://mikemcl.github.io/bignumber.js/">https://mikemcl.github.io/bignumber.js/&lt;/a>&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/p>
&lt;p>可以对小数进行向上或向下取值，适合金融类项目&lt;/p>
&lt;h2 id="三decimaljs">三、decimal.js&lt;/h2>
&lt;p>传送门：
&lt;a
href = "https://github.com/MikeMcl/decimal.js"
target="_blank" rel ="noopener"
>&lt;a href="https://github.com/MikeMcl/decimal.js">https://github.com/MikeMcl/decimal.js&lt;/a>&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/p>
&lt;p>文档：
&lt;a
href = "%ef%bc%9ahttp://mikemcl.github.io/decimal.js"
target="_blank" rel ="noopener"
>&lt;a href="http://mikemcl.github.io/decimal.js">http://mikemcl.github.io/decimal.js&lt;/a>&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/p>
&lt;p>decimal.js 提供了很多数学计算相关的函数，例如正弦余弦对数等函数，非常适合数学计算类需要运行很多数学函数的项目。&lt;/p></description></item><item><title>给博客搭配随机图片</title><link>/2021-01-08/random-image-for-blog/</link><pubDate>Fri, 08 Jan 2021 00:00:00 +0000</pubDate><guid>/2021-01-08/random-image-for-blog/</guid><description>
&lt;p>每次写文章给博文配图是一件很麻烦的事情，一张张地找，有时候质量还不好，于是乎，我就去寻找了一波背景图api接口，这下妈妈再也不用担心我文章不会配图了，&lt;/p>
&lt;p>API 调用方式很简单，就是直接把 api 地址当做图片地址来访问，当服务器接收到访问时会自动重定向到一个随机的图片地址。&lt;/p>
&lt;p>下面列举几个&lt;/p>
&lt;h2 id="一小歪api">一、小歪API&lt;/h2>
&lt;p>网址:
&lt;a
href = "https://api.ixiaowai.cn/"
target="_blank" rel ="noopener"
>&lt;a href="https://api.ixiaowai.cn/">https://api.ixiaowai.cn/&lt;/a>&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/p>
&lt;blockquote>
&lt;p>目前系统共收录 1000+ 张图片 API最后更新时间:2020-03-25&lt;/p>
&lt;p>图片均为https，采用新浪图片，&lt;strong>高速访问&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;h3 id="11-直接使用">1.1 直接使用&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>图片API基本调用格式：&lt;/p>
&lt;ul>
&lt;li>二次元动漫:
&lt;a
href = "https://api.ixiaowai.cn/api/api.php"
target="_blank" rel ="noopener"
>&lt;a href="https://api.ixiaowai.cn/api/api.php">https://api.ixiaowai.cn/api/api.php&lt;/a>&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/li>
&lt;li>mc酱动漫:
&lt;a
href = "https://api.ixiaowai.cn/mcapi/mcapi.php"
target="_blank" rel ="noopener"
>&lt;a href="https://api.ixiaowai.cn/mcapi/mcapi.php">https://api.ixiaowai.cn/mcapi/mcapi.php&lt;/a>&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/li>
&lt;li>高清壁纸:
&lt;a
href = "https://api.ixiaowai.cn/gqapi/gqapi.php"
target="_blank" rel ="noopener"
>&lt;a href="https://api.ixiaowai.cn/gqapi/gqapi.php">https://api.ixiaowai.cn/gqapi/gqapi.php&lt;/a>&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>文字API基本调用格式：&lt;/p>
&lt;ul>
&lt;li>一言语录:
&lt;a
href = "https://api.ixiaowai.cn/api/ylapi.php"
target="_blank" rel ="noopener"
>&lt;a href="https://api.ixiaowai.cn/ylapi/index.php">https://api.ixiaowai.cn/ylapi/index.php&lt;/a>&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/li>
&lt;li>舔狗日记:
&lt;a
href = "https://api.ixiaowai.cn/tgrj/index.php"
target="_blank" rel ="noopener"
>&lt;a href="https://api.ixiaowai.cn/tgrj/index.php">https://api.ixiaowai.cn/tgrj/index.php&lt;/a>&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h3 id="12-json-格式">1.2 JSON 格式&lt;/h3>
&lt;p>访问上面的 api 会直接重定向到一个随机图片地址，你可以在 api 后面添加参数 &lt;code>type=json&lt;/code> 来得到一个 JSON 格式的结果：&lt;/p>
&lt;p>例如：&lt;/p>
&lt;ul>
&lt;li>图片列：
&lt;a
href = "https://api.ixiaowai.cn/api/api.php?return=json"
target="_blank" rel ="noopener"
>&lt;a href="https://api.ixiaowai.cn/api/api.php?return=json">https://api.ixiaowai.cn/api/api.php?return=json&lt;/a>&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/li>
&lt;li>文字列：
&lt;a
href = "https://api.ixiaowai.cn/ylapi/index.php/?code=js"
target="_blank" rel ="noopener"
>&lt;a href="https://api.ixiaowai.cn/ylapi/index.php/?code=js">https://api.ixiaowai.cn/ylapi/index.php/?code=js&lt;/a>&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/li>
&lt;/ul>
&lt;p>返回 JSON 数据示例&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="ln">1&lt;/span>&lt;span class="p">{&lt;/span>
&lt;span class="ln">2&lt;/span> &lt;span class="nt">&amp;#34;code&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;200&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="ln">3&lt;/span> &lt;span class="nt">&amp;#34;imgurl&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;https://tva3.sinaimg.cn/large/0072Vf1pgy1fodqoysytvj31hc0u0qcq.jpg&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="ln">4&lt;/span> &lt;span class="nt">&amp;#34;width&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;1920&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="ln">5&lt;/span> &lt;span class="nt">&amp;#34;height&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;1080&amp;#34;&lt;/span>
&lt;span class="ln">6&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="二动漫星空">二、动漫星空&lt;/h2>
&lt;p>目前 动漫星空 共收录 8千万+ 张4K精美图片
动漫星空随机图片API，高速，免费，无广告
注意： 目前仅提供1080P接口，2K和4K接口后续开放，更多动态请持续关注 动漫星空API官网 及 动漫星空微信公众号 ，第一时间获取官方更新信息
HTML调用格式
1080P：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="ln">1&lt;/span>https://api.dongmanxingkong.com/suijitupian/acg/1080p/index.php
&lt;/code>&lt;/pre>&lt;/div>&lt;p>参数： type=json
JSON调用格式
1080P：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="ln">1&lt;/span>https://api.dongmanxingkong.com/suijitupian/acg/1080p/index.php?return=json
&lt;/code>&lt;/pre>&lt;/div>&lt;p>JSON数据&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="ln">1&lt;/span>&lt;span class="p">{&lt;/span>
&lt;span class="ln">2&lt;/span> &lt;span class="nt">&amp;#34;code&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;200&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="ln">3&lt;/span> &lt;span class="nt">&amp;#34;imgurl&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;https://tvax2.sinaimg.cn/large/0072Vf1pgy1fodqpio0roj31kw0v47wh.jpg&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="ln">4&lt;/span> &lt;span class="nt">&amp;#34;width&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;2048&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="ln">5&lt;/span> &lt;span class="nt">&amp;#34;height&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;1120&amp;#34;&lt;/span>
&lt;span class="ln">6&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="三秋api接口站">三秋API接口站&lt;/h2>
&lt;p>目前系统共收录 3k9+ 张图片 API最后更新时间:2020-07-14&lt;/p>
&lt;p>图片均为https，采用又拍云存储，高速访问&lt;/p>
&lt;ul>
&lt;li>自判断二次元API：
&lt;a
href = "https://api.ghser.com/random/api.php"
target="_blank" rel ="noopener"
>&lt;a href="https://api.ghser.com/random/api.php">https://api.ghser.com/random/api.php&lt;/a>&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/li>
&lt;li>PC随机二次元API：
&lt;a
href = "https://api.ghser.com/random/pc.php"
target="_blank" rel ="noopener"
>&lt;a href="https://api.ghser.com/random/pc.php">https://api.ghser.com/random/pc.php&lt;/a>&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/li>
&lt;li>PE随机二次元API：
&lt;a
href = "https://api.ghser.com/random/pe.php"
target="_blank" rel ="noopener"
>&lt;a href="https://api.ghser.com/random/pe.php">https://api.ghser.com/random/pe.php&lt;/a>&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/li>
&lt;li>随机二次元风景API：
&lt;a
href = "https://api.ghser.com/random/bg.php"
target="_blank" rel ="noopener"
>&lt;a href="https://api.ghser.com/random/bg.php">https://api.ghser.com/random/bg.php&lt;/a>&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>欢迎提示语分享</title><link>/2020-12-29/welcome-message/</link><pubDate>Tue, 29 Dec 2020 00:00:00 +0000</pubDate><guid>/2020-12-29/welcome-message/</guid><description>
&lt;p>当用户登录你的系统时，如果能够给出一个友好有趣的提示语，想必更能让你的用户感受到开发者的用心。&lt;/p>
&lt;p>今天分享一个当用户登入系统的友好提示语：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln"> 1&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">timeFix&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 2&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">time&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nb">Date&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="ln"> 3&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">hour&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">time&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">getHours&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="ln"> 4&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">timeMap&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 5&lt;/span> &lt;span class="mi">9&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;早上好&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="ln"> 6&lt;/span> &lt;span class="mi">11&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;上午好&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="ln"> 7&lt;/span> &lt;span class="mi">13&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;中午好&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="ln"> 8&lt;/span> &lt;span class="mi">20&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;下午好&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="ln"> 9&lt;/span> &lt;span class="mi">24&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;晚上好&amp;#39;&lt;/span>
&lt;span class="ln">10&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">11&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">Object&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">keys&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">timeMap&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">find&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">key&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="nx">hour&lt;/span> &lt;span class="o">&amp;lt;=&lt;/span> &lt;span class="nx">key&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">12&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nx">timeMap&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nx">key&lt;/span>&lt;span class="p">]&lt;/span>
&lt;span class="ln">13&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">14&lt;/span>
&lt;span class="ln">15&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">welcome&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">16&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">arr&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s1">&amp;#39;休息一会儿吧&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;准备吃什么呢?&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;要不要打一把 DOTA&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;我猜你可能累了&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;span class="ln">17&lt;/span> &lt;span class="kr">const&lt;/span> &lt;span class="nx">index&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nb">Math&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">floor&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nb">Math&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">random&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="nx">arr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">length&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">18&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nx">arr&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nx">index&lt;/span>&lt;span class="p">]&lt;/span>
&lt;span class="ln">19&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;button id="welcome-btn" class="ui-button" data-type="success" width="100%">点我试试&lt;/button>&lt;/p>
&lt;script>
function timeFix () {
const time = new Date()
const hour = time.getHours()
const timeMap = {
9: '早上好',
11: '上午好',
13: '中午好',
20: '下午好',
24: '晚上好'
}
const key = Object.keys(timeMap).find(key => hour &lt;= key)
return timeMap[key]
}
function welcome () {
const arr = ['休息一会儿吧', '准备吃什么呢?', '要不要打一把 DOTA', '我猜你可能累了']
const index = Math.floor(Math.random() * arr.length)
return arr[index]
}
function handleClick () {
const msg = `${timeFix()}, ${welcome()}`
console.log(msg)
if (LightTip) {
new LightTip().success(msg)
};
}
// handleClick()
document.getElementById('welcome-btn').addEventListener('click', handleClick)
&lt;/script></description></item><item><title>责任链模式</title><link>/series/design-patterns/chain-of-responsibility-pattern/</link><pubDate>Sat, 12 Dec 2020 00:00:00 +0000</pubDate><guid>/series/design-patterns/chain-of-responsibility-pattern/</guid><description>
&lt;h2 id="背景交代">背景交代&lt;/h2>
&lt;p>最近负责的一个前端项目随着需求和功能的升级，代码越写越复杂，尤其是登录模块的判断逻辑，就像是那老太太的缠脚布——又臭又长!&lt;/p>
&lt;p>刚好趁着登录的需求变更，使用&lt;strong>责任链模式&lt;/strong>把相关代码重构了一番，重构之后再看代码，啧啧，代码之整洁且逻辑清晰，忍不住要给自己送一朵小红花 🌺 —— 优秀！&lt;/p>
&lt;!--
先介绍一下需求，在登录页面提交数据得到响应后需要进行多重判断，如下：
-->
&lt;h2 id="撸起袖子加油干">撸起袖子加油干&lt;/h2>
&lt;p>我们约定好，将单个判断逻辑封装成一个函数，函数接收相同的参数，返回值的统一为一个 promise。&lt;/p>
&lt;p>如果判断通过，可以进行下一步判断，返回 fulfill 状态的 promise，如果未通过需要结束后续判断，则返回 rejected 状态的 promise。&lt;/p>
&lt;p>这里的代码均为示意代码，其中的判断逻辑都进行了简化。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln"> 1&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">handlePwdExpired&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">resp&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 2&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">resp&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">expired&lt;/span> &lt;span class="o">===&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 3&lt;/span> &lt;span class="c1">// 密码过期处理逻辑
&lt;/span>&lt;span class="ln"> 4&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;密码过期，请修改密码后重新登录&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln"> 5&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">Promise&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">rejected&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;密码过期&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln"> 6&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln"> 7&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">Promise&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">resolve&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">resp&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln"> 8&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln"> 9&lt;/span>
&lt;span class="ln">10&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">handleAuthStatus&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">resp&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">11&lt;/span> &lt;span class="k">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">resp&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">status&lt;/span> &lt;span class="o">===&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">12&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">Promise&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">resolve&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">resp&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">13&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">14&lt;/span> &lt;span class="c1">// 实名认证未通过处理逻辑
&lt;/span>&lt;span class="ln">15&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;实名认证未通过，请耐心等待&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">16&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nb">Promise&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">rejected&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;实名认证未通过&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">17&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">18&lt;/span>
&lt;span class="ln">19&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">handleDefault&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">resp&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">20&lt;/span> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;逻辑判断结束，进入系统&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">21&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>定义好上面处理策略之后，我们来调用&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln"> 1&lt;/span>&lt;span class="c1">// 假定我们已经拿到了响应
&lt;/span>&lt;span class="ln"> 2&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kr">const&lt;/span> &lt;span class="nx">resp&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 3&lt;/span> &lt;span class="nx">status&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="ln"> 4&lt;/span> &lt;span class="nx">expired&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="ln"> 5&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln"> 6&lt;/span>
&lt;span class="ln"> 7&lt;/span>&lt;span class="nb">Promise&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">resolve&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">resp&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln"> 8&lt;/span> &lt;span class="p">.&lt;/span>&lt;span class="nx">then&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">resp&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 9&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nx">handlePwdExpired&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">resp&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">10&lt;/span> &lt;span class="p">})&lt;/span>
&lt;span class="ln">11&lt;/span> &lt;span class="p">.&lt;/span>&lt;span class="nx">then&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">resp&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">12&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nx">handleAuthStatus&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">resp&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">13&lt;/span> &lt;span class="p">})&lt;/span>
&lt;span class="ln">14&lt;/span> &lt;span class="p">.&lt;/span>&lt;span class="nx">then&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">resp&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">15&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nx">handleDefault&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">resp&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">16&lt;/span> &lt;span class="p">})&lt;/span>
&lt;span class="ln">17&lt;/span> &lt;span class="p">.&lt;/span>&lt;span class="k">catch&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">err&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">18&lt;/span> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">err&lt;/span>&lt;span class="p">);&lt;/span>
&lt;span class="ln">19&lt;/span> &lt;span class="p">})&lt;/span>
&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>适配器模式</title><link>/series/design-patterns/adapter-pattern/</link><pubDate>Sat, 12 Dec 2020 00:00:00 +0000</pubDate><guid>/series/design-patterns/adapter-pattern/</guid><description>
&lt;h2 id="背景交代">背景交代&lt;/h2>
&lt;h2 id="场景一转换数据格式">场景一：转换数据格式&lt;/h2>
&lt;p>Vue 中的 computed 属性就是现成的一个适配器：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln"> 1&lt;/span>&lt;span class="kr">const&lt;/span> &lt;span class="nx">vm&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">Vue&lt;/span>&lt;span class="p">({&lt;/span>
&lt;span class="ln"> 2&lt;/span> &lt;span class="nx">data&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 3&lt;/span> &lt;span class="nx">authors&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">[&lt;/span> &lt;span class="s1">&amp;#39;张教授&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;王教授&amp;#39;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;span class="ln"> 4&lt;/span> &lt;span class="p">},&lt;/span>
&lt;span class="ln"> 5&lt;/span> &lt;span class="nx">computed&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 6&lt;/span> &lt;span class="nx">authorsText&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 7&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">authors&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;、&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln"> 8&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln"> 9&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">10&lt;/span>&lt;span class="p">})&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>又比如&lt;/p>
&lt;h2 id="撸起袖子加油干">撸起袖子加油干&lt;/h2></description></item><item><title>CSS多行文本溢出显示省略号显示点点点...</title><link>/2020-06-28/css-text-overflow-ellipsis/</link><pubDate>Sun, 28 Jun 2020 00:00:00 +0000</pubDate><guid>/2020-06-28/css-text-overflow-ellipsis/</guid><description>
&lt;h2 id="一单行省略">一、单行省略&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="ln">1&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">div&lt;/span> &lt;span class="na">class&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;elip w100&amp;#34;&lt;/span> &lt;span class="na">style&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;border: 1px solid #5184f6;&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="ln">2&lt;/span> 两个黄鹂鸣翠柳，一行白鹭上青天。窗含西岭千秋雪，门泊东吴万里船。
&lt;span class="ln">3&lt;/span>&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">div&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-css" data-lang="css">&lt;span class="ln"> 1&lt;/span>&lt;span class="c">/* 单行文本溢出省略 */&lt;/span>
&lt;span class="ln"> 2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nc">elip&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 3&lt;/span> &lt;span class="k">overflow&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">hidden&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c">/* 隐藏溢出内容 */&lt;/span>
&lt;span class="ln"> 4&lt;/span> &lt;span class="k">white-space&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">nowrap&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c">/* 不换行，强制文本在一行显示 */&lt;/span>
&lt;span class="ln"> 5&lt;/span> &lt;span class="k">text-overflow&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">ellipsis&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c">/* 溢出的部分进行省略 */&lt;/span>
&lt;span class="ln"> 6&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln"> 7&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nc">w100&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 8&lt;/span> &lt;span class="c">/* 设置宽度，一定不要忘了 */&lt;/span>
&lt;span class="ln"> 9&lt;/span> &lt;span class="k">width&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">100&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">10&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>效果如下：&lt;/p>
&lt;style>
.elip {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.w100 {
width: 100px;
}
&lt;/style>
&lt;div class="elip w100" style="border: 1px solid #5184f6; margin: 1rem 0">
两个黄鹂鸣翠柳，一行白鹭上青天。窗含西岭千秋雪，门泊东吴万里船。
&lt;/div>
&lt;p>要想实现单行文本超出宽度省略，需要满足以下几点&lt;/p>
&lt;p>只要满足了上面 4 点，单行文本的溢出省略就很容易实现。但现实情况中，除了单行文本外还有很多场景是需要实现多行文本溢出省略的，接下来我们一起来看如何实现这个需求。&lt;/p>
&lt;h2 id="二多行文本溢出省略">二、多行文本溢出省略&lt;/h2>
&lt;p>之所以说多行文本溢出省略不容易实现，是因为在 CSS 规范中 &lt;code>text-overflow: ellipsis&lt;/code> 只适用于单行文本，同时并没有适用于多行文本溢出省略的规则。因此我们只能另辟蹊径来实现这个需求。&lt;/p>
&lt;h3 id="使用浏览器私有属性来实现">使用浏览器私有属性来实现&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-css" data-lang="css">&lt;span class="ln">1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nc">box&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">2&lt;/span> &lt;span class="k">width&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">200&lt;/span>&lt;span class="kt">px&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">3&lt;/span> &lt;span class="k">padding&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="cp">!important&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c">/* padding 必须为 0 */&lt;/span>
&lt;span class="ln">4&lt;/span> &lt;span class="k">overflow&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">hidden&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">5&lt;/span> &lt;span class="k">display&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kp">-webkit-&lt;/span>&lt;span class="n">box&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c">/* 类似于 flexbox 的自适应布局 */&lt;/span>
&lt;span class="ln">6&lt;/span> &lt;span class="kp">-webkit-&lt;/span>&lt;span class="n">box-orient&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">vertical&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c">/* 元素排列方向：从上到下 */&lt;/span>
&lt;span class="ln">7&lt;/span> &lt;span class="kp">-webkit-&lt;/span>&lt;span class="n">line-clamp&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c">/* 第四行后开始省略 */&lt;/span>
&lt;span class="ln">8&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;style>
.box {
width: 200px;
overflow: hidden;
display: -webkit-box; /* 类似于 flexbox 的自适应布局 */
-webkit-box-orient: vertical; /* 元素排列方向：从上到下 */
-webkit-line-clamp: 4; /* 第四行后开始省略 */
}
.border {
border: 1px solid #ccc;
}
.p-0 {
padding: 0 !important;
}
.p-4 {
padding: 1rem;
}
&lt;/style>
&lt;p>padding 为 0&lt;/p>
&lt;div class="box border p-0">
有一天，螃蟹撞到了田螺。田螺说:“蟹蟹，你撞到我了”，螃蟹说:“不用谢”。田螺回道:“谢你妹啊，我是说你撞到我了，你是不是瞎啊”，螃蟹一脸委屈地说:“我不是虾啊，我是螃蟹”
&lt;p>有一天，螃蟹撞到了田螺。田螺说:“蟹蟹，你撞到我了”，螃蟹说:“不用谢”。田螺回道:“谢你妹啊，我是说你撞到我了，你是不是瞎啊”，螃蟹一脸委屈地说:“我不是虾啊，我是螃蟹”&lt;/p>
&lt;/div>
&lt;p>padding 为 1rem&lt;/p>
&lt;div class="box border p-4">
有一天，螃蟹撞到了田螺。田螺说:“蟹蟹，你撞到我了”，螃蟹说:“不用谢”。田螺回道:“谢你妹啊，我是说你撞到我了，你是不是瞎啊”，螃蟹一脸委屈地说:“我不是虾啊，我是螃蟹”
&lt;p>有一天，螃蟹撞到了田螺。田螺说:“蟹蟹，你撞到我了”，螃蟹说:“不用谢”。田螺回道:“谢你妹啊，我是说你撞到我了，你是不是瞎啊”，螃蟹一脸委屈地说:“我不是虾啊，我是螃蟹”&lt;/p>
&lt;/div>
&lt;p>其中 &lt;strong>padding 必须保证为 0&lt;/strong>，否则立马破功，这一点很容易被忽略掉，有兴趣的可以测试一下。&lt;/p>
&lt;p>这种方法的优点是写法简洁明了（相对于使用 js 截取文本），但缺点就是通过私有属性实现，不过经测试在 chrome、firefox、safari 以及移动端和小程序都能生效，所以大部分场景还是可以使用这个方法的。&lt;/p>
&lt;!--
### 方法二：双重伪元素
&lt;p>
有一天，螃蟹撞到了田螺。田螺说:“蟹蟹，你撞到我了”，螃蟹说:“不用谢”。田螺回道:“谢你妹啊，我是说你撞到我了，你是不是瞎啊”，螃蟹一脸委屈地说:“我不是虾啊，我是螃蟹”
&lt;/p>
&lt;style>
p {
height: 210px;
overflow: hidden;
position: relate
}
p::before {
content: "...";
}
&lt;/style>
https://wencaizhang.github.io/study/p/elip.html
###
-->
&lt;h2 id="三代码总结">三、代码总结&lt;/h2>
&lt;p>原理搞明白之后，为了更方便地在项目中使用，我整理出来了这段 CSS 代码，其中预设了 5 个 class 样式，类名都是 &lt;code>elip-line-x&lt;/code> 的格式，其中 &lt;code>x&lt;/code> 代表最多可以展示 &lt;code>x&lt;/code> 行文字，超出部分显示省略号点点点，&lt;code>x&lt;/code> 的取值范围是 &lt;code>1-5&lt;/code>。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-css" data-lang="css">&lt;span class="ln"> 1&lt;/span>&lt;span class="c">/* start--文本行数限制--start */&lt;/span>
&lt;span class="ln"> 2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nc">elip-line-1&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 3&lt;/span> &lt;span class="k">overflow&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">hidden&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 4&lt;/span> &lt;span class="k">white-space&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">nowrap&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 5&lt;/span> &lt;span class="k">text-overflow&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">ellipsis&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln"> 6&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln"> 7&lt;/span>
&lt;span class="ln"> 8&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nc">elip-line-2&lt;/span>&lt;span class="o">,&lt;/span>
&lt;span class="ln"> 9&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nc">elip-line-3&lt;/span>&lt;span class="o">,&lt;/span>
&lt;span class="ln">10&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nc">elip-line-4&lt;/span>&lt;span class="o">,&lt;/span>
&lt;span class="ln">11&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nc">elip-line-5&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">12&lt;/span> &lt;span class="k">padding&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">0&lt;/span> &lt;span class="cp">!important&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">13&lt;/span> &lt;span class="k">overflow&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">hidden&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">14&lt;/span> &lt;span class="k">word-break&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">break-all&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">15&lt;/span> &lt;span class="k">text-overflow&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">ellipsis&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">16&lt;/span> &lt;span class="k">display&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kp">-webkit-&lt;/span>&lt;span class="n">box&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">17&lt;/span> &lt;span class="kp">-webkit-&lt;/span>&lt;span class="n">box-orient&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">vertical&lt;/span>&lt;span class="p">;&lt;/span>
&lt;span class="ln">18&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">19&lt;/span>
&lt;span class="ln">20&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nc">elip-line-2&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="kp">-webkit-&lt;/span>&lt;span class="n">line-clamp&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">21&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nc">elip-line-3&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="kp">-webkit-&lt;/span>&lt;span class="n">line-clamp&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">22&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nc">elip-line-4&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="kp">-webkit-&lt;/span>&lt;span class="n">line-clamp&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">4&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">23&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nc">elip-line-5&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="kp">-webkit-&lt;/span>&lt;span class="n">line-clamp&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">5&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">24&lt;/span>&lt;span class="c">/* end--文本行数限制--end */&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>有了上面这段代码，直接给任意元素加上 &lt;code>elip-line-x&lt;/code> 类即可轻松实现最多 &lt;code>x&lt;/code> 行文字显示省略号点点点效果。如果最多显示 5 行不满足你的需求，你也可以根据代码扩展到任意行数。&lt;/p></description></item><item><title>Get the Beginning and Ending in a Unit of Time via Momentjs</title><link>/2019-11-19/get-the-beginning-and-ending-in-a-unit-of-time-via-momentjs/</link><pubDate>Tue, 19 Nov 2019 00:00:00 +0000</pubDate><guid>/2019-11-19/get-the-beginning-and-ending-in-a-unit-of-time-via-momentjs/</guid><description>
&lt;blockquote>
&lt;p>根据 &lt;code>moment.js&lt;/code> 得到一个单位时间或者时间段（如本周，上周，本月，上月，当前季度，上个季度）的开始结束时间&lt;/p>
&lt;/blockquote>
&lt;ul>
&lt;li>
&lt;a
href = "https://momentjs.com/"
target="_blank" rel ="noopener"
>momentjs 文档&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/li>
&lt;/ul>
&lt;p>主要利用以下几项 API：&lt;/p>
&lt;ul>
&lt;li>&lt;code>format()&lt;/code>: 得到格式化的时间&lt;/li>
&lt;li>&lt;code>startOf()&lt;/code>: 得到一个单位时间的开始时间点，
&lt;a
href = "https://momentjs.com/docs/#/manipulating/start-of/"
target="_blank" rel ="noopener"
>文档&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/li>
&lt;li>&lt;code>endOf()&lt;/code>: 得到一个单位时间的结束时间点&lt;/li>
&lt;li>&lt;code>add()&lt;/code>: 在指定时间点的基础上，加上一个时间段&lt;/li>
&lt;li>&lt;code>subtract()&lt;/code>: 在指定时间点的基础上，减去一个时间段&lt;/li>
&lt;li>&lt;code>week()&lt;/code>: 获取或设置一个时间对象的周数（第几周）&lt;/li>
&lt;li>&lt;code>month()&lt;/code>: 获取或设置一个时间对象的月份&lt;/li>
&lt;li>&lt;code>quarter()&lt;/code>: 获取或设置一个时间对象的季度&lt;/li>
&lt;/ul>
&lt;h2 id="天">天&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln"> 1&lt;/span>&lt;span class="c1">// 获取当天开始结束时间
&lt;/span>&lt;span class="ln"> 2&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getCurrDays&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 3&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">moment&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="ln"> 4&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">start&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">startOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;days&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;YYYY-MM-DD HH:mm:ss&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln"> 5&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">endOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;days&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;YYYY-MM-DD HH:mm:ss&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln"> 6&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="p">[&lt;/span> &lt;span class="nx">start&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="p">]&lt;/span>
&lt;span class="ln"> 7&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln"> 8&lt;/span>
&lt;span class="ln"> 9&lt;/span>&lt;span class="c1">// 获取昨天的开始结束时间
&lt;/span>&lt;span class="ln">10&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getYesterday&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">11&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">subtract&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;days&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">);&lt;/span>
&lt;span class="ln">12&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">start&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">startOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;days&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;YYYY-MM-DD HH:mm:ss&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">13&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">endOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;days&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;YYYY-MM-DD HH:mm:ss&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">14&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="p">[&lt;/span> &lt;span class="nx">start&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="p">]&lt;/span>
&lt;span class="ln">15&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">16&lt;/span>
&lt;span class="ln">17&lt;/span>&lt;span class="c1">// 获取明天的开始结束时间
&lt;/span>&lt;span class="ln">18&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getTomorrow&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">19&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;days&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">);&lt;/span>
&lt;span class="ln">20&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">start&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">startOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;days&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;YYYY-MM-DD HH:mm:ss&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">21&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">endOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;days&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;YYYY-MM-DD HH:mm:ss&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">22&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="p">[&lt;/span> &lt;span class="nx">start&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="p">]&lt;/span>
&lt;span class="ln">23&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="周">周&lt;/h2>
&lt;p>获取某一周（本周，上周，下周）的开始结束时间，一周从周日开始到周六结束。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln"> 1&lt;/span>&lt;span class="c1">// 本周
&lt;/span>&lt;span class="ln"> 2&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getCurrWeekDays&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 3&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">moment&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="ln"> 4&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">start&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">startOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;week&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;YYYY-MM-DD HH:mm:ss&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln"> 5&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">endOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;week&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;YYYY-MM-DD HH:mm:ss&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln"> 6&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="p">[&lt;/span> &lt;span class="nx">start&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="p">]&lt;/span>
&lt;span class="ln"> 7&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln"> 8&lt;/span>&lt;span class="c1">// 上一周
&lt;/span>&lt;span class="ln"> 9&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getLastWeekDays&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">10&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">week&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">week&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">11&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">start&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">startOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;week&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;YYYY-MM-DD HH:mm:ss&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">12&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">endOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;week&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;YYYY-MM-DD HH:mm:ss&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">13&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="p">[&lt;/span> &lt;span class="nx">start&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="p">]&lt;/span>
&lt;span class="ln">14&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">15&lt;/span>&lt;span class="c1">// 下一周
&lt;/span>&lt;span class="ln">16&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getNextWeekDays&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">17&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">week&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">week&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">18&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">start&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">startOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;week&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;YYYY-MM-DD HH:mm:ss&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">19&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">endOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;week&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;YYYY-MM-DD HH:mm:ss&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">20&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="p">[&lt;/span> &lt;span class="nx">start&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="p">]&lt;/span>
&lt;span class="ln">21&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="月">月&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln"> 1&lt;/span>&lt;span class="c1">// 本月
&lt;/span>&lt;span class="ln"> 2&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getCurrMonthDays&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 3&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">moment&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="ln"> 4&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">start&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">startOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;month&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;YYYY-MM-DD&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln"> 5&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">endOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;month&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;YYYY-MM-DD&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln"> 6&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="p">[&lt;/span> &lt;span class="nx">start&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="p">];&lt;/span>
&lt;span class="ln"> 7&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln"> 8&lt;/span>&lt;span class="c1">// 上个月
&lt;/span>&lt;span class="ln"> 9&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getLastMonthDays&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">10&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">month&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">month&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">11&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">start&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">startOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;month&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;YYYY-MM-DD&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">12&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">endOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;month&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;YYYY-MM-DD&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">13&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="p">[&lt;/span> &lt;span class="nx">start&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="p">];&lt;/span>
&lt;span class="ln">14&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">15&lt;/span>&lt;span class="c1">// 下个月
&lt;/span>&lt;span class="ln">16&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getNextMonthDays&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">17&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">month&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">month&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">18&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">start&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">startOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;month&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;YYYY-MM-DD&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">19&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">endOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;month&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;YYYY-MM-DD&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">20&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="p">[&lt;/span> &lt;span class="nx">start&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="p">];&lt;/span>
&lt;span class="ln">21&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="季度">季度&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln"> 1&lt;/span>&lt;span class="c1">// 当前季度
&lt;/span>&lt;span class="ln"> 2&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getCurrQuarter&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 3&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">moment&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="ln"> 4&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">start&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">startOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;quarter&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;YYYY-MM-DD&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln"> 5&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">endOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;quarter&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;YYYY-MM-DD&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln"> 6&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="p">[&lt;/span> &lt;span class="nx">start&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="p">];&lt;/span>
&lt;span class="ln"> 7&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln"> 8&lt;/span>&lt;span class="c1">// 上个季度
&lt;/span>&lt;span class="ln"> 9&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getLastQuarter&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">10&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">quarter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">quarter&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">11&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">start&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">startOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;quarter&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;YYYY-MM-DD&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">12&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">endOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;quarter&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;YYYY-MM-DD&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">13&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="p">[&lt;/span> &lt;span class="nx">start&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="p">];&lt;/span>
&lt;span class="ln">14&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">15&lt;/span>&lt;span class="c1">// 下个季度
&lt;/span>&lt;span class="ln">16&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getLastQuarter&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">17&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">quarter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">quarter&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">18&lt;/span>
&lt;span class="ln">19&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="dry--">DRY -&lt;/h2>
&lt;blockquote>
&lt;p>Don't repeat yourself.&lt;/p>
&lt;/blockquote>
&lt;p>上面代码中可以看到有一个固定结构重复了好多次：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln">1&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getX&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">2&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">x&lt;/span>
&lt;span class="ln">3&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">start&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">startOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;时间单位类型&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;格式化&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">4&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">endOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;时间单位类型&amp;#39;&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;格式化&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">5&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="p">[&lt;/span> &lt;span class="nx">start&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="p">];&lt;/span>
&lt;span class="ln">6&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>所以我们可以专门封装一个函数，接收三个参数（时间，时间单位，格式化），返回开始和结束时间。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln">1&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getDuringTime&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">date&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">type&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">format&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">2&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">start&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">startOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">type&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">3&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">endOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">type&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">4&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="p">[&lt;/span> &lt;span class="nx">start&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="p">];&lt;/span>
&lt;span class="ln">5&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>有了此工具函数，将上面代码汇总如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln"> 1&lt;/span>&lt;span class="cm">/**
&lt;/span>&lt;span class="ln"> 2&lt;/span>&lt;span class="cm"> * @param {date} date [momentjs 时间对象]
&lt;/span>&lt;span class="ln"> 3&lt;/span>&lt;span class="cm"> * @param {String} type [单位时间类型]
&lt;/span>&lt;span class="ln"> 4&lt;/span>&lt;span class="cm"> * @param {String} format [时间格式]
&lt;/span>&lt;span class="ln"> 5&lt;/span>&lt;span class="cm"> * type 可以接收的值： year, month, quarter, week, isoWeek, day, date, hour, minute, second
&lt;/span>&lt;span class="ln"> 6&lt;/span>&lt;span class="cm"> */&lt;/span>
&lt;span class="ln"> 7&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getDuringTime&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">date&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nx">moment&lt;/span>&lt;span class="p">(),&lt;/span> &lt;span class="nx">type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;days&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">format&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;YYYY-MM-DD HH:mm:ss&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 8&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">start&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">startOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">type&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln"> 9&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">date&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">endOf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">type&lt;/span>&lt;span class="p">).&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">format&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">10&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="p">[&lt;/span> &lt;span class="nx">start&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">end&lt;/span> &lt;span class="p">];&lt;/span>
&lt;span class="ln">11&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">12&lt;/span>
&lt;span class="ln">13&lt;/span>&lt;span class="c1">// 获取当天开始结束时间
&lt;/span>&lt;span class="ln">14&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getCurrDays&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">15&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">moment&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="ln">16&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nx">getDuringTime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">date&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;days&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;YYYY-MM-DD&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">17&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">18&lt;/span>
&lt;span class="ln">19&lt;/span>&lt;span class="c1">// 获取昨天的开始结束时间
&lt;/span>&lt;span class="ln">20&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getYesterday&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">21&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">subtract&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;days&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">22&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nx">getDuringTime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">date&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;days&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;YYYY-MM-DD&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">23&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">24&lt;/span>
&lt;span class="ln">25&lt;/span>&lt;span class="c1">// 获取明天的开始结束时间
&lt;/span>&lt;span class="ln">26&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getTomorrow&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">27&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">add&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;days&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">28&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nx">getDuringTime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">date&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;days&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;YYYY-MM-DD&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">29&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">30&lt;/span>
&lt;span class="ln">31&lt;/span>&lt;span class="c1">// 获取某一周（本周，上周，下周）的开始结束时间，一周从周日开始到周六结束。
&lt;/span>&lt;span class="ln">32&lt;/span>&lt;span class="c1">// 本周
&lt;/span>&lt;span class="ln">33&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getCurrWeekDays&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">34&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">moment&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="ln">35&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nx">getDuringTime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">date&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;week&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;YYYY-MM-DD&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">36&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">37&lt;/span>&lt;span class="c1">// 上一周
&lt;/span>&lt;span class="ln">38&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getLastWeekDays&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">39&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">week&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">week&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">40&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nx">getDuringTime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">date&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;week&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;YYYY-MM-DD&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">41&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">42&lt;/span>&lt;span class="c1">// 下一周
&lt;/span>&lt;span class="ln">43&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getNextWeekDays&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">44&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">week&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">week&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">45&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nx">getDuringTime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">date&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;week&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;YYYY-MM-DD&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">46&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">47&lt;/span>
&lt;span class="ln">48&lt;/span>&lt;span class="c1">// 本月
&lt;/span>&lt;span class="ln">49&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getCurrMonthDays&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">50&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">moment&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="ln">51&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nx">getDuringTime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">date&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;month&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;YYYY-MM-DD&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">52&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">53&lt;/span>&lt;span class="c1">// 上个月
&lt;/span>&lt;span class="ln">54&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getLastMonthDays&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">55&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">month&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">month&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">56&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nx">getDuringTime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">date&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;month&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;YYYY-MM-DD&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">57&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">58&lt;/span>&lt;span class="c1">// 下个月
&lt;/span>&lt;span class="ln">59&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getNextMonthDays&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">60&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">month&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">month&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">61&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nx">getDuringTime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">date&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;month&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;YYYY-MM-DD&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">62&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">63&lt;/span>
&lt;span class="ln">64&lt;/span>&lt;span class="c1">// 当前季度
&lt;/span>&lt;span class="ln">65&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getCurrQuarter&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">66&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">moment&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="ln">67&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nx">getDuringTime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">date&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;quarter&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;YYYY-MM-DD&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">68&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">69&lt;/span>&lt;span class="c1">// 上个季度
&lt;/span>&lt;span class="ln">70&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getLastQuarter&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">71&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">quarter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">quarter&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">72&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nx">getDuringTime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">date&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;quarter&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;YYYY-MM-DD&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">73&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">74&lt;/span>&lt;span class="c1">// 下个季度
&lt;/span>&lt;span class="ln">75&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">getLastQuarter&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">76&lt;/span> &lt;span class="kd">let&lt;/span> &lt;span class="nx">date&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">quarter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">moment&lt;/span>&lt;span class="p">().&lt;/span>&lt;span class="nx">quarter&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">77&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nx">getDuringTime&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">date&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;quarter&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;YYYY-MM-DD&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">78&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;p>本文完，感谢阅读。:stuck_out_tongue_winking_eye:&lt;/p></description></item><item><title>Basic Setup for Ubuntu</title><link>/2019-11-17/basic-setup-for-ubuntu/</link><pubDate>Sun, 17 Nov 2019 00:00:00 +0000</pubDate><guid>/2019-11-17/basic-setup-for-ubuntu/</guid><description>
&lt;blockquote>
&lt;p>Ubuntu 基础设置，包含一些常用软件安装，配置文件修改等等。&lt;/p>
&lt;/blockquote>
&lt;p>这篇文章的意义在于，当你拿到一个新的 Ubuntu 系统之后，直接按照本文的步骤进行设置，就可以得到一个顺手的开发/部署环境。不再需要逐项搜索每个软件的安装步骤了。&lt;/p>
&lt;ul>
&lt;li>设置国内软件镜像源&lt;/li>
&lt;li>node&lt;/li>
&lt;li>git&lt;/li>
&lt;li>docker&lt;/li>
&lt;li>nginx&lt;/li>
&lt;li>oh-my-zsh&lt;/li>
&lt;li>alias&lt;/li>
&lt;li>vim&lt;/li>
&lt;/ul>
&lt;h2 id="设置系统软件镜像源">设置系统软件镜像源&lt;/h2>
&lt;p>配置系统源第一件事是修改镜像源，这样方便后续其他软件的安装。在国内可以选择阿里云的源。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>&lt;span class="c1"># 编辑源文件&lt;/span>
&lt;span class="ln">2&lt;/span>sudo vim /etc/apt/sources.list
&lt;span class="ln">3&lt;/span>&lt;span class="c1"># 在VIM编辑器内替换默认源为阿里云&lt;/span>
&lt;span class="ln">4&lt;/span>:0,$ s/archive.ubuntu.com/mirrors.aliyun.com/
&lt;span class="ln">5&lt;/span>&lt;span class="c1"># 保存源文件并退出&lt;/span>
&lt;span class="ln">6&lt;/span>:wq
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="包管理工具安装">包管理工具安装&lt;/h2>
&lt;p>&lt;strong>先更新&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>sudo apt update -y &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> sudo apt upgrade -y
&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>
&lt;a
href = "https://www.sysgeek.cn/apt-vs-apt-get/"
target="_blank" rel ="noopener"
>Linux中apt与apt-get命令的区别与解释&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/li>
&lt;li>
&lt;a
href = "https://www.cnblogs.com/fenglongyu/p/8654991.html"
target="_blank" rel ="noopener"
>linux命令系列 sudo apt-get update和upgrade的区别&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>安装常用软件&lt;/strong>&lt;/p>
&lt;p>通常会有一些是默认安装的，比如 git vim wget curl vim，如果没有，用下面方式安装即可。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>sudo apt install zsh nginx tree -y
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="oh-my-zsh">oh-my-zsh&lt;/h2>
&lt;p>关于 zsh 和 oh-my-zsh 可以参考：
&lt;a
href = "https://zhuanlan.zhihu.com/p/19556676"
target="_blank" rel ="noopener"
>终极 Shell——ZSH&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/p>
&lt;h3 id="安装">安装&lt;/h3>
&lt;p>脚本安装：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - &lt;span class="p">|&lt;/span> sh
&lt;/code>&lt;/pre>&lt;/div>&lt;p>或者手动安装:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>git clone https://github.com/ohmyzsh/ohmyzsh.git ~/.oh-my-zsh
&lt;span class="ln">2&lt;/span>cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc
&lt;/code>&lt;/pre>&lt;/div>&lt;p>安装完成之后退出当前会话重新打开一个终端窗口即可。&lt;/p>
&lt;h3 id="插件">插件&lt;/h3>
&lt;p>&lt;strong>(1) autojump&lt;/strong>
github 地址
&lt;a
href = "https://github.com/wting/autojump"
target="_blank" rel ="noopener"
>autojump&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/p>
&lt;p>下载并执行&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>wget https://github.com/downloads/joelthelion/autojump/autojump_v21.1.2.tar.gz
&lt;span class="ln">2&lt;/span>./install.sh
&lt;/code>&lt;/pre>&lt;/div>&lt;p>最后把以下代码加入.zshrc:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>&lt;span class="o">[[&lt;/span> -s ~/.autojump/etc/profile.d/autojump.sh &lt;span class="o">]]&lt;/span> &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> . ~/.autojump/etc/profile.d/autojump.sh
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="nodenvm">node(nvm)&lt;/h2>
&lt;p>nvm github 地址：
&lt;a
href = "https://github.com/nvm-sh/nvm"
target="_blank" rel ="noopener"
>nvm-sh/nvm&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/p>
&lt;h3 id="方法一脚本安装">方法一：脚本安装&lt;/h3>
&lt;p>执行脚本&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.1/install.sh &lt;span class="p">|&lt;/span> bash
&lt;span class="ln">2&lt;/span>&lt;span class="c1"># 或者&lt;/span>
&lt;span class="ln">3&lt;/span>wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.1/install.sh &lt;span class="p">|&lt;/span> bash
&lt;/code>&lt;/pre>&lt;/div>&lt;p>最后，将下面内容分别添加到 &lt;code>~/.bashrc&lt;/code>, &lt;code>~/.profile&lt;/code>, 和 &lt;code>~/.zshrc&lt;/code> 文件中。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="ln">1&lt;/span>export NVM_DIR=&amp;#34;$([ -z &amp;#34;${XDG_CONFIG_HOME-}&amp;#34; ]
&lt;span class="ln">2&lt;/span>&amp;amp;&amp;amp; printf %s &amp;#34;${HOME}/.nvm&amp;#34;
&lt;span class="ln">3&lt;/span>|| printf %s &amp;#34;${XDG_CONFIG_HOME}/nvm&amp;#34;)&amp;#34;
&lt;span class="ln">4&lt;/span>
&lt;span class="ln">5&lt;/span>[ -s &amp;#34;$NVM_DIR/nvm.sh&amp;#34; ] &amp;amp;&amp;amp; \. &amp;#34;$NVM_DIR/nvm.sh&amp;#34; # This loads nvm
&lt;/code>&lt;/pre>&lt;/div>&lt;p>加载配置文件：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>&lt;span class="nb">source&lt;/span> ~/.bashrc
&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="方法二git-安装">方法二：git 安装&lt;/h3>
&lt;p>将代码克隆到用户目录下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>&lt;span class="nb">cd&lt;/span> ~/
&lt;span class="ln">2&lt;/span>git clone https://github.com/nvm-sh/nvm.git .nvm
&lt;/code>&lt;/pre>&lt;/div>&lt;p>切换到最新版本&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>&lt;span class="nb">cd&lt;/span> ~/.nvm
&lt;span class="ln">2&lt;/span>git checkout v0.35.1
&lt;/code>&lt;/pre>&lt;/div>&lt;p>激活 nvm，在命令行执行：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>. nvm.sh
&lt;/code>&lt;/pre>&lt;/div>&lt;p>最后，将下面内容分别添加到 &lt;code>~/.bashrc&lt;/code>, &lt;code>~/.profile&lt;/code>, 和 &lt;code>~/.zshrc&lt;/code> 文件中。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="ln">1&lt;/span>export NVM_DIR=&amp;#34;$HOME/.nvm&amp;#34;
&lt;span class="ln">2&lt;/span>[ -s &amp;#34;$NVM_DIR/nvm.sh&amp;#34; ] &amp;amp;&amp;amp; \. &amp;#34;$NVM_DIR/nvm.sh&amp;#34; # This loads nvm
&lt;span class="ln">3&lt;/span>[ -s &amp;#34;$NVM_DIR/bash_completion&amp;#34; ] &amp;amp;&amp;amp; \. &amp;#34;$NVM_DIR/bash_completion&amp;#34; # This loads nvm bash_completion
&lt;/code>&lt;/pre>&lt;/div>&lt;p>完成之后，通过 &lt;code>nvm -v&lt;/code> 查看版本来验证是否安装成功。&lt;/p>
&lt;h2 id="docker">docker&lt;/h2>
&lt;h3 id="安装-docker">安装 Docker&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>curl -fsSL https://get.docker.com -o get-docker.sh &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> sudo sh get-docker.sh
&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="安装-compose">安装 Compose&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>sudo curl -L &lt;span class="s2">&amp;#34;https://github.com/docker/compose/releases/download/1.22.0/docke-compose-&lt;/span>&lt;span class="k">$(&lt;/span>uname -s&lt;span class="k">)&lt;/span>&lt;span class="s2">-&lt;/span>&lt;span class="k">$(&lt;/span>uname -m&lt;span class="k">)&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> -o /usr/local/bin/docker-compose
&lt;span class="ln">2&lt;/span>&lt;span class="c1"># 给Docker Compose 执行权限&lt;/span>
&lt;span class="ln">3&lt;/span>sudo chmod +x /usr/local/bin/docker-compose
&lt;span class="ln">4&lt;/span>
&lt;span class="ln">5&lt;/span>&lt;span class="c1">#查看Docker和Docker Compose的版本&lt;/span>
&lt;span class="ln">6&lt;/span>sudo docker version
&lt;span class="ln">7&lt;/span>sudo docker-compose version
&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="设置镜像源">设置镜像源&lt;/h3>
&lt;p>执行下面命令进行设置&lt;/p>
&lt;p>&lt;em>ps: 阿里云镜像源是个人注册阿里云账号之后分配的个人专属镜像源。&lt;/em>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>sudo mkdir -p /etc/docker
&lt;span class="ln">2&lt;/span>sudo tee /etc/docker/daemon.json &lt;span class="s">&amp;lt;&amp;lt;-&amp;#39;EOF&amp;#39;
&lt;/span>&lt;span class="ln">3&lt;/span>&lt;span class="s">{
&lt;/span>&lt;span class="ln">4&lt;/span>&lt;span class="s"> &amp;#34;registry-mirrors&amp;#34;: [&amp;#34;https://oojjt1xs.mirror.aliyuncs.com&amp;#34;]
&lt;/span>&lt;span class="ln">5&lt;/span>&lt;span class="s">}
&lt;/span>&lt;span class="ln">6&lt;/span>&lt;span class="s">EOF&lt;/span>
&lt;span class="ln">7&lt;/span>sudo systemctl daemon-reload
&lt;span class="ln">8&lt;/span>sudo systemctl restart docker
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="vim-配置">vim 配置&lt;/h2>
&lt;p>有些系统默认没有安装&lt;/p>
&lt;p>配置文件路径：&lt;/p>
&lt;ul>
&lt;li>全局配置文件：&lt;code>/etc/vim/vimrc&lt;/code>&lt;/li>
&lt;li>当前用户配置文件：&lt;code>~/.vimrc&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>将下面内容粘贴到配置文件中：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="ln">1&lt;/span>&amp;#34; 左单引号表示单行注释
&lt;span class="ln">2&lt;/span>&amp;#34; 编码指定 UTF-8
&lt;span class="ln">3&lt;/span>set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
&lt;span class="ln">4&lt;/span>set termencoding=utf-8
&lt;span class="ln">5&lt;/span>set encoding=utf-8
&lt;span class="ln">6&lt;/span>
&lt;span class="ln">7&lt;/span>set number &amp;#34; 显示行号
&lt;span class="ln">8&lt;/span>set cursorline &amp;#34; 突出显示当前行
&lt;span class="ln">9&lt;/span>set ruler &amp;#34; 打开状态栏标尺
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="设置别名alias">设置别名(alias)&lt;/h2>
&lt;p>将所有的别名放在单独一个文件 &lt;code>.bash_aliases&lt;/code> 中，这样更加方便管理，ubuntu 也推荐这种做法。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>&lt;span class="k">if&lt;/span> &lt;span class="o">[&lt;/span> -f ~/.bash_aliases &lt;span class="o">]&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">then&lt;/span>
&lt;span class="ln">2&lt;/span> . ~/.bash_aliases
&lt;span class="ln">3&lt;/span>&lt;span class="k">fi&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>注意：等号两侧不能有空格!&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln"> 1&lt;/span>&lt;span class="c1"># 代替键盘上难以触及的 ~ 键&lt;/span>
&lt;span class="ln"> 2&lt;/span>&lt;span class="nb">alias&lt;/span> &lt;span class="nv">home&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;cd ~&amp;#34;&lt;/span>
&lt;span class="ln"> 3&lt;/span>
&lt;span class="ln"> 4&lt;/span>&lt;span class="c1"># 同样也可以为一些深层却很常用的目录设置别名&lt;/span>
&lt;span class="ln"> 5&lt;/span>&lt;span class="c1"># 如：宝塔面包的 nginx 配置目录&lt;/span>
&lt;span class="ln"> 6&lt;/span>&lt;span class="nb">alias&lt;/span> &lt;span class="nv">ng&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;cd /www/server/panel/vhost/nginx&amp;#34;&lt;/span>
&lt;span class="ln"> 7&lt;/span>
&lt;span class="ln"> 8&lt;/span>&lt;span class="c1"># 回退多级目录&lt;/span>
&lt;span class="ln"> 9&lt;/span>&lt;span class="nb">alias&lt;/span> &lt;span class="nv">bk1&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;cd ..&amp;#34;&lt;/span>
&lt;span class="ln">10&lt;/span>&lt;span class="nb">alias&lt;/span> &lt;span class="nv">bk2&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;cd ../..&amp;#34;&lt;/span>
&lt;span class="ln">11&lt;/span>&lt;span class="nb">alias&lt;/span> &lt;span class="nv">bk3&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;cd ../../..&amp;#34;&lt;/span>
&lt;span class="ln">12&lt;/span>&lt;span class="nb">alias&lt;/span> &lt;span class="nv">bk4&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;cd ../../../..&amp;#34;&lt;/span>
&lt;span class="ln">13&lt;/span>&lt;span class="nb">alias&lt;/span> &lt;span class="nv">bk5&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;cd ../../../../..&amp;#34;&lt;/span>
&lt;span class="ln">14&lt;/span>
&lt;span class="ln">15&lt;/span>&lt;span class="c1"># ls 相关&lt;/span>
&lt;span class="ln">16&lt;/span>&lt;span class="nb">alias&lt;/span> &lt;span class="nv">cls&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;clear&amp;#39;&lt;/span>
&lt;span class="ln">17&lt;/span>&lt;span class="nb">alias&lt;/span> &lt;span class="nv">ll&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;ls -l&amp;#39;&lt;/span>
&lt;span class="ln">18&lt;/span>&lt;span class="nb">alias&lt;/span> &lt;span class="nv">la&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;ls -a&amp;#39;&lt;/span>
&lt;span class="ln">19&lt;/span>
&lt;span class="ln">20&lt;/span>&lt;span class="c1"># git 相关&lt;/span>
&lt;span class="ln">21&lt;/span>&lt;span class="nb">alias&lt;/span> &lt;span class="nv">gs&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;git status&amp;#39;&lt;/span>
&lt;span class="ln">22&lt;/span>&lt;span class="nb">alias&lt;/span> &lt;span class="nv">glog&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;git log --graph --pretty=format:&amp;#39;%Cred%h%Creset -%C(yellow)%d%Cr eset %s %Cgreen(%cr) %C(bold blue)&amp;lt;%an&amp;gt;%Creset&amp;#39; --abbrev-commit&amp;#34;&lt;/span>
&lt;span class="ln">23&lt;/span>
&lt;span class="ln">24&lt;/span>&lt;span class="c1"># 解压&lt;/span>
&lt;span class="ln">25&lt;/span>&lt;span class="nb">alias&lt;/span> -s &lt;span class="nv">gz&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;tar -xzvf&amp;#39;&lt;/span>
&lt;span class="ln">26&lt;/span>&lt;span class="nb">alias&lt;/span> -s &lt;span class="nv">tgz&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;tar -xzvf&amp;#39;&lt;/span>
&lt;span class="ln">27&lt;/span>&lt;span class="nb">alias&lt;/span> -s &lt;span class="nv">zip&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;unzip&amp;#39;&lt;/span>
&lt;span class="ln">28&lt;/span>&lt;span class="nb">alias&lt;/span> -s &lt;span class="nv">bz2&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;tar -xjvf&amp;#39;&lt;/span>
&lt;span class="ln">29&lt;/span>
&lt;span class="ln">30&lt;/span>&lt;span class="c1"># other&lt;/span>
&lt;span class="ln">31&lt;/span>&lt;span class="nb">alias&lt;/span> &lt;span class="nv">vi&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;vim&amp;#39;&lt;/span>
&lt;span class="ln">32&lt;/span>&lt;span class="nb">alias&lt;/span> &lt;span class="nv">grep&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;grep --color=auto&amp;#34;&lt;/span>
&lt;span class="ln">33&lt;/span>&lt;span class="nb">alias&lt;/span> &lt;span class="nv">tree&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;tree -I &amp;#39;*svn|*node_module*&amp;#39;&amp;#34;&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="python3">Python3&lt;/h2>
&lt;p>系统升级到 ubuntu 20.04 之后，移除了 Python 2，只保留了 Python 3。&lt;/p>
&lt;p>因此默认不能执行 Python 命令，但可以执行 python3。&lt;/p>
&lt;p>因此我们可以在 &lt;code>/usr/bin&lt;/code> 下创建一个软链接，指向 python3。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>sudo ln -s /usr/bin/python3 /usr/bin/python
&lt;/code>&lt;/pre>&lt;/div>&lt;p>注意：避免某些软件需要用的 python3，所以不建议把 python3 的软连接删除&lt;/p>
&lt;hr>
&lt;p>本文完，感谢阅读。:stuck_out_tongue_winking_eye:&lt;/p></description></item><item><title>Basic Usage of Docker</title><link>/2019-11-16/basic-usage-of-docker/</link><pubDate>Sat, 16 Nov 2019 00:00:00 +0000</pubDate><guid>/2019-11-16/basic-usage-of-docker/</guid><description>
&lt;h2 id="使用脚本快速安装">使用脚本快速安装&lt;/h2>
&lt;p>&lt;strong>安装 Docker:&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>curl -fsSL https://get.docker.com -o get-docker.sh &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> sudo sh get-docker.sh
&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>安装 docker-compose&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>sudo curl -L &lt;span class="s2">&amp;#34;https://github.com/docker/compose/releases/download/1.22.0/docker-compose-&lt;/span>&lt;span class="k">$(&lt;/span>uname -s&lt;span class="k">)&lt;/span>&lt;span class="s2">-&lt;/span>&lt;span class="k">$(&lt;/span>uname -m&lt;span class="k">)&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span> &lt;span class="se">\
&lt;/span>&lt;span class="ln">2&lt;/span>&lt;span class="se">&lt;/span>-o /usr/local/bin/docker-compose
&lt;span class="ln">3&lt;/span>
&lt;span class="ln">4&lt;/span>&lt;span class="c1"># 给Docker Compose 执行权限&lt;/span>
&lt;span class="ln">5&lt;/span>sudo chmod +x /usr/local/bin/docker-compose
&lt;span class="ln">6&lt;/span>
&lt;span class="ln">7&lt;/span>&lt;span class="c1"># 查看Docker和Docker Compose的版本&lt;/span>
&lt;span class="ln">8&lt;/span>sudo docker version
&lt;span class="ln">9&lt;/span>sudo docker-compose version
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="设置阿里云镜像">设置阿里云镜像&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>sudo mkdir -p /etc/docker
&lt;span class="ln">2&lt;/span>sudo tee /etc/docker/daemon.json &lt;span class="s">&amp;lt;&amp;lt;-&amp;#39;EOF&amp;#39;
&lt;/span>&lt;span class="ln">3&lt;/span>&lt;span class="s">{
&lt;/span>&lt;span class="ln">4&lt;/span>&lt;span class="s"> &amp;#34;registry-mirrors&amp;#34;: [&amp;#34;https://oojjt1xs.mirror.aliyuncs.com&amp;#34;]
&lt;/span>&lt;span class="ln">5&lt;/span>&lt;span class="s">}
&lt;/span>&lt;span class="ln">6&lt;/span>&lt;span class="s">EOF&lt;/span>
&lt;span class="ln">7&lt;/span>sudo systemctl daemon-reload
&lt;span class="ln">8&lt;/span>sudo systemctl restart docker
&lt;/code>&lt;/pre>&lt;/div>&lt;p>阿里云镜像源需要个人注册阿里云账号之后才能使用，这里我已经注册过了。&lt;/p>
&lt;h3 id="三个概念">三个概念&lt;/h3>
&lt;blockquote>
&lt;p>Docker三个基本概念：Registry注册中心，Image镜像，Container容器&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Registry包含多个Repo（仓库）和Tag(标签)，从Registry下载Image的方式是pull &amp;lt;仓库名&amp;gt;:&amp;lt;标签名&amp;gt;，如pull ubuntu:16.04&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Image是一个静态概念，相当于面向对象中的类，类不能直接使用，需要实例化。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Container是一个动态概念，相当于面向对象中的实例化，启动镜像生成容器就是实例化类的过程。只有容器才能被用户使用。&lt;/p>
&lt;/li>
&lt;/ul>
&lt;/blockquote>
&lt;h3 id="查看命令">查看命令&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>命令&lt;/th>
&lt;th>描述&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>docker images&lt;/code>&lt;/td>
&lt;td>列出本地镜像&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>docker ps&lt;/code>&lt;/td>
&lt;td>列出容器&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="创建容器">创建容器&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>创建一个新的容器，并进入交互模式的终端&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>docker run -it centos:latest /bin/bash
&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>后台运行容器，并设置端口映射&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span> docker run -d -p 3000:80 centos:latest
&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>进入一个正在后台运行的容器&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>docker attach &lt;span class="o">[&lt;/span>container-id&lt;span class="o">]&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;h3 id="退出容器">退出容器&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>退出容器&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>&lt;span class="nb">exit&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>退出容器并保持容器后台运行&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="ln">1&lt;/span>Ctrl + p + q
&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;h3 id="从容器创建新的镜像">从容器创建新的镜像&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>首先拿到容器 ID ，然后使用如下命令创建镜像：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>docker commit -a &lt;span class="s2">&amp;#34;镜像作者名字&amp;#34;&lt;/span> -m &lt;span class="s2">&amp;#34;提交时的说明文字&amp;#34;&lt;/span> &lt;span class="o">[&lt;/span>container-id&lt;span class="o">]&lt;/span> &lt;span class="o">[&lt;/span>image-name&lt;span class="o">]&lt;/span>:&lt;span class="o">[&lt;/span>tag&lt;span class="o">]&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;h3 id="wordpress-启动方式">WordPress 启动方式&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>创建容器&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span> docker run -it -p 3000:80 -p 4000:8888 my_wp:v1 /bin/bash
&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>软件启动&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>/etc/init.d/nginx start
&lt;span class="ln">2&lt;/span>
&lt;span class="ln">3&lt;/span>/etc/init.d/mysqld start
&lt;span class="ln">4&lt;/span>
&lt;span class="ln">5&lt;/span>/etc/init.d/memcached start
&lt;span class="ln">6&lt;/span>
&lt;span class="ln">7&lt;/span>/etc/init.d/php-fpm-72 start
&lt;span class="ln">8&lt;/span>
&lt;span class="ln">9&lt;/span>/etc/init.d/bt start
&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>退出容器，并保持容器在后台运行&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span> Ctrl + p + q
&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul>
&lt;h2 id="相关文档">相关文档&lt;/h2>
&lt;ul>
&lt;li>
&lt;a
href = "http://www.runoob.com/docker/docker-command-manual.html"
target="_blank" rel ="noopener"
>Docker命令大全 - 菜鸟教程&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/li>
&lt;li>
&lt;a
href = "https://www.daocloud.io/mirror"
target="_blank" rel ="noopener"
>daocloud 镜像站&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/li>
&lt;li>
&lt;a
href = "https://www.yuque.com/grasilife/docker"
target="_blank" rel ="noopener"
>Docker — 从入门到实践(语雀)&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/li>
&lt;/ul></description></item><item><title>Nginx 的安装和基本命令 | Basic Usage of Nginx</title><link>/2019-11-16/basic-usage-of-nginx/</link><pubDate>Sat, 16 Nov 2019 00:00:00 +0000</pubDate><guid>/2019-11-16/basic-usage-of-nginx/</guid><description>
&lt;h2 id="安装">安装&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>&lt;span class="c1"># ubuntu&lt;/span>
&lt;span class="ln">2&lt;/span>sudo apt install nginx -y
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="命令">命令&lt;/h2>
&lt;h3 id="nginx命令">nginx 命令&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">描述&lt;/th>
&lt;th style="text-align:left">命令&lt;/th>
&lt;th style="text-align:left">命令二&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">启动&lt;/td>
&lt;td style="text-align:left">&lt;code>sudo nginx&lt;/code>&lt;/td>
&lt;td style="text-align:left">&lt;code>sudo /usr/sbin/nginx&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">停止&lt;/td>
&lt;td style="text-align:left">&lt;code>sudo nginx -s stop&lt;/code>&lt;/td>
&lt;td style="text-align:left">&lt;code>sudo /usr/sbin/nginx -s stop&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">重启&lt;/td>
&lt;td style="text-align:left">&lt;code>sudo nginx -s restart&lt;/code>&lt;/td>
&lt;td style="text-align:left">&lt;code>sudo /usr/sbin/nginx -s restart&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">重载配置文件&lt;/td>
&lt;td style="text-align:left">&lt;code>sudo nginx -s reload&lt;/code>&lt;/td>
&lt;td style="text-align:left">&lt;code>sudo /usr/sbin/nginx -s reload&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="nginx目录">nginx 目录&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">描述&lt;/th>
&lt;th style="text-align:left">命令&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">nginx 安装目录&lt;/td>
&lt;td style="text-align:left">&lt;code>/usr/sbin/nginx&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">默认网站根目录&lt;/td>
&lt;td style="text-align:left">&lt;code>/usr/share/nginx/html&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">配置文件&lt;/td>
&lt;td style="text-align:left">&lt;code>/etc/nginx/nginx.conf &lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="查找nginx安装目录的命令">查找 nginx 安装目录的命令&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th style="text-align:left">描述&lt;/th>
&lt;th style="text-align:left">命令&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="text-align:left">查找 nginx 安装目录&lt;/td>
&lt;td style="text-align:left">&lt;code>which nginx&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">查找 nginx 配置文件&lt;/td>
&lt;td style="text-align:left">&lt;code>sudo find / -name nginx.conf&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="text-align:left">检测配置文件语法是否正确：&lt;/td>
&lt;td style="text-align:left">&lt;code>sudo /usr/sbin/nginx -t&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="常见使用场景">常见使用场景&lt;/h2>
&lt;h3 id="一-静态网站">(一) 静态网站&lt;/h3>
&lt;p>指定域名和对应的网站根目录位置，&lt;code>server_name&lt;/code> 可以是域名、二级域名，也可以是 ip 地址。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="ln">1&lt;/span>server {
&lt;span class="ln">2&lt;/span> listen 80;
&lt;span class="ln">3&lt;/span> server_name demo.example.com;
&lt;span class="ln">4&lt;/span> location / {
&lt;span class="ln">5&lt;/span> root /www/demo/;
&lt;span class="ln">6&lt;/span> index index.html index.htm;
&lt;span class="ln">7&lt;/span> }
&lt;span class="ln">8&lt;/span>}
&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="二-反向代理">(二) 反向代理&lt;/h3>
&lt;p>场景：&lt;/p>
&lt;ul>
&lt;li>解决跨域问题，利用 nginx 来访问其他域名下的接口&lt;/li>
&lt;li>当 docker 服务的端口映射到宿主机上某个端口（如 8080）时，可以设置二级域名代理 8080 端口。&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="ln"> 1&lt;/span>server {
&lt;span class="ln"> 2&lt;/span> server_name docker.example.com;
&lt;span class="ln"> 3&lt;/span> listen 80;
&lt;span class="ln"> 4&lt;/span>
&lt;span class="ln"> 5&lt;/span> location / {
&lt;span class="ln"> 6&lt;/span> proxy_pass http://localhost:8000;
&lt;span class="ln"> 7&lt;/span> proxy_set_header Host $host;
&lt;span class="ln"> 8&lt;/span> proxy_set_header X-Forward-For $remote_addr;
&lt;span class="ln"> 9&lt;/span> }
&lt;span class="ln">10&lt;/span>}
&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="三-负载均衡">(三) 负载均衡&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="ln"> 1&lt;/span>upstream backend {
&lt;span class="ln"> 2&lt;/span> server backend1.example.com weight=5;
&lt;span class="ln"> 3&lt;/span> server backend2.example.com:8080;
&lt;span class="ln"> 4&lt;/span> server unix:/tmp/backend3;
&lt;span class="ln"> 5&lt;/span>}
&lt;span class="ln"> 6&lt;/span>
&lt;span class="ln"> 7&lt;/span>server {
&lt;span class="ln"> 8&lt;/span> location / {
&lt;span class="ln"> 9&lt;/span> proxy_pass http://backend;
&lt;span class="ln">10&lt;/span> }
&lt;span class="ln">11&lt;/span>}
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="一些学习资源">一些学习资源&lt;/h2>
&lt;p>
&lt;a
href = "http://www.nginx.cn/doc/"
target="_blank" rel ="noopener"
>Nginx中文文档&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/p></description></item><item><title>总结 JavaScript 中的 this 指向问题</title><link>/2019-09-29/this-in-javascript/</link><pubDate>Sun, 29 Sep 2019 00:00:00 +0000</pubDate><guid>/2019-09-29/this-in-javascript/</guid><description>
&lt;p>初学 JavaScript 的时候，时常对于代码中 &lt;code>this&lt;/code> 的值感到困惑，因为 JavaScript 中的 &lt;code>this&lt;/code> 的值总是不确定的，每次都要将 &lt;code>this&lt;/code> 的值打印出来才能放心。&lt;/p>
&lt;p>实际上 &lt;code>this&lt;/code> 具体指向哪个对象是在函数运行时的环境动态绑定的，而非函数被声明时的环境。&lt;/p>
&lt;p>尽管如此，总还是有规律可循的，我们可以将 &lt;code>this&lt;/code> 的场景大致分为下面 5 种：&lt;/p>
&lt;ul>
&lt;li>作为普通函数调用&lt;/li>
&lt;li>作为对象的方法调用&lt;/li>
&lt;li>作为构造器调用&lt;/li>
&lt;li>通过 &lt;code>call&lt;/code> 和 &lt;code>apply&lt;/code> 调用&lt;/li>
&lt;li>箭头函数&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>在 ES6 标准新增的箭头函数中的 &lt;code>this&lt;/code> 是由被声明的环境即上下文来确定的。&lt;/p>
&lt;/blockquote>
&lt;h2 id="情况一作为普通函数调用">情况一：作为普通函数调用&lt;/h2>
&lt;p>这可能是我们学习过程中最先接触到的一种函数类型。&lt;/p>
&lt;p>&lt;strong>1) 普通函数：&lt;/strong>&lt;/p>
&lt;p>当函数作为普通函数或者匿名函数调用时，&lt;code>this&lt;/code> 总是指向全局对象，在浏览器中这个全局对象是 &lt;code>window&lt;/code>，而在 nodejs 中全局对象是 &lt;code>global&lt;/code>，这里讨论的是浏览器端，所有代码都可以在 chrome 开发者工具的 console 面板中执行。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln">1&lt;/span>&lt;span class="nb">window&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">name&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;globalName&amp;#39;&lt;/span>
&lt;span class="ln">2&lt;/span>
&lt;span class="ln">3&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">printName1&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">4&lt;/span> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">this&lt;/span> &lt;span class="o">===&lt;/span> &lt;span class="nb">window&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">5&lt;/span> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">name&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">6&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">7&lt;/span>&lt;span class="nx">printName1&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="ln">8&lt;/span>&lt;span class="c1">// true
&lt;/span>&lt;span class="ln">9&lt;/span>&lt;span class="c1">// &amp;#34;globalName&amp;#34;
&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>ES5 规范提出了「严格模式」，启用方式是在整个脚本文件第一行或者函数内第一行添加一条语句 &lt;code>'use strict'&lt;/code> 即可开启严格模式。&lt;/p>
&lt;p>如果启用「严格模式」，那么 &lt;code>this&lt;/code> 就不再是指向全局对象，而是 &lt;code>undefined&lt;/code> 。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln">1&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">printName2&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">2&lt;/span> &lt;span class="s2">&amp;#34;use strict&amp;#34;&lt;/span> &lt;span class="c1">// 启用严格模式
&lt;/span>&lt;span class="ln">3&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">this&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">// undefined
&lt;/span>&lt;span class="ln">4&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">5&lt;/span>
&lt;span class="ln">6&lt;/span>&lt;span class="nx">printName2&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>2) 匿名函数：&lt;/strong>&lt;/p>
&lt;p>匿名函数自执行，这种形式封装公用库的时候最常见：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln">1&lt;/span>&lt;span class="nb">window&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">name&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;globalName&amp;#39;&lt;/span>
&lt;span class="ln">2&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">3&lt;/span> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">this&lt;/span> &lt;span class="o">===&lt;/span> &lt;span class="nb">window&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">// true
&lt;/span>&lt;span class="ln">4&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">name&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">// &amp;#34;globalName&amp;#34;
&lt;/span>&lt;span class="ln">5&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="p">})()&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>和普通函数一样，匿名函数中的 &lt;code>this&lt;/code> 也是指向全局对象。&lt;/p>
&lt;p>作为参数的匿名函数：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln"> 1&lt;/span>&lt;span class="nb">window&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">name&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;globalName&amp;#39;&lt;/span>
&lt;span class="ln"> 2&lt;/span>
&lt;span class="ln"> 3&lt;/span>&lt;span class="nx">setTimeout&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 4&lt;/span> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">this&lt;/span> &lt;span class="o">===&lt;/span> &lt;span class="nb">window&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">// true
&lt;/span>&lt;span class="ln"> 5&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">name&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">// &amp;#34;globalName&amp;#34;
&lt;/span>&lt;span class="ln"> 6&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="p">},&lt;/span> &lt;span class="mi">100&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln"> 7&lt;/span>
&lt;span class="ln"> 8&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">3&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">forEach&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">item&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 9&lt;/span> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">item&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">name&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">10&lt;/span> &lt;span class="c1">// 1 &amp;#34;globalName&amp;#34;
&lt;/span>&lt;span class="ln">11&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="c1">// 2 &amp;#34;globalName&amp;#34;
&lt;/span>&lt;span class="ln">12&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="c1">// 3 &amp;#34;globalName&amp;#34;
&lt;/span>&lt;span class="ln">13&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="p">})&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="情况二作为对象的方法调用">情况二：作为对象的方法调用&lt;/h2>
&lt;p>当函数作为对象当属性方法调用时，&lt;code>this&lt;/code> 总指向这个对象。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln">1&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">obj&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">2&lt;/span> &lt;span class="nx">name&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;obj&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="ln">3&lt;/span> &lt;span class="nx">printName&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="kd">function&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">4&lt;/span> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">this&lt;/span> &lt;span class="o">===&lt;/span> &lt;span class="nx">obj&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">// true
&lt;/span>&lt;span class="ln">5&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">name&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">// &amp;#34;obj&amp;#34;
&lt;/span>&lt;span class="ln">6&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">7&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">8&lt;/span>
&lt;span class="ln">9&lt;/span>&lt;span class="nx">obj&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">printName&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>但是如果一个对象的属性方法又赋值给了其他变量，那么 &lt;code>this&lt;/code> 将发生变化，其指向只有在函数执行那一刻才能确定。例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln"> 1&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">obj&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 2&lt;/span> &lt;span class="nx">name&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;obj&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="ln"> 3&lt;/span> &lt;span class="nx">printName&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="kd">function&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 4&lt;/span> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">this&lt;/span> &lt;span class="o">===&lt;/span> &lt;span class="nx">obj&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">// true
&lt;/span>&lt;span class="ln"> 5&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">name&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">// &amp;#34;obj&amp;#34;
&lt;/span>&lt;span class="ln"> 6&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln"> 7&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln"> 8&lt;/span>
&lt;span class="ln"> 9&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">myPrintName&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">obj&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">printName&lt;/span>
&lt;span class="ln">10&lt;/span>&lt;span class="nb">window&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">name&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;globalName&amp;#39;&lt;/span>
&lt;span class="ln">11&lt;/span>
&lt;span class="ln">12&lt;/span>&lt;span class="nx">myPrintName&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="ln">13&lt;/span>&lt;span class="c1">// false
&lt;/span>&lt;span class="ln">14&lt;/span>&lt;span class="c1">// &amp;#34;globalName&amp;#34;
&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>当 &lt;code>myPrintName&lt;/code> 执行时，就要按照普通函数来判断 &lt;code>this&lt;/code> 指向了。&lt;/p>
&lt;p>再来一个例子：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln"> 1&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">obj&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 2&lt;/span> &lt;span class="nx">name&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;obj&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="ln"> 3&lt;/span> &lt;span class="nx">printName&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="kd">function&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 4&lt;/span> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">this&lt;/span> &lt;span class="o">===&lt;/span> &lt;span class="nx">obj&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">// true
&lt;/span>&lt;span class="ln"> 5&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">name&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">// &amp;#34;obj&amp;#34;
&lt;/span>&lt;span class="ln"> 6&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln"> 7&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln"> 8&lt;/span>
&lt;span class="ln"> 9&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">obj2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">10&lt;/span> &lt;span class="nx">name&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;obj2&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;span class="ln">11&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">12&lt;/span>&lt;span class="nx">obj2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">printName&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">obj&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">printName&lt;/span>
&lt;span class="ln">13&lt;/span>
&lt;span class="ln">14&lt;/span>&lt;span class="nx">obj2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">printName&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="ln">15&lt;/span>&lt;span class="c1">// false
&lt;/span>&lt;span class="ln">16&lt;/span>&lt;span class="c1">// &amp;#34;obj2&amp;#34;
&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>当 &lt;code>obj2.printName&lt;/code> 执行时，&lt;code>printName&lt;/code> 是作为 &lt;code>obj2&lt;/code> 的属性方法来调用的，因此 &lt;code>this&lt;/code> 指向 &lt;code>obj2&lt;/code> 这个对象。&lt;/p>
&lt;p>所以说，JavaScript 中的 this 指向无法在定义时判断，只有在其执行时才能判断。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln">1&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">printName&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">2&lt;/span> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">this&lt;/span> &lt;span class="o">===&lt;/span> &lt;span class="nb">window&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">3&lt;/span> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">name&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">4&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="情况三作为构造器调用">情况三：作为构造器调用&lt;/h2>
&lt;p>在 JavaScript 中没有「类」的概念（直到 ES6 才有类的出现），而是把函数作为构造器，通过 new 操作符来生成实例。&lt;/p>
&lt;p>那么在构造函数中 &lt;code>this&lt;/code> 就指向新生成的实例。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln">1&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">MyClass&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kd">function&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">2&lt;/span> &lt;span class="c1">// 给实例添加 name 属性
&lt;/span>&lt;span class="ln">3&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">name&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;myclass&amp;#39;&lt;/span>
&lt;span class="ln">4&lt;/span> &lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">printName&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kd">function&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">5&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">name&lt;/span>
&lt;span class="ln">6&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">7&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">8&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">obj&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">MyClass&lt;/span>&lt;span class="p">()&lt;/span>
&lt;span class="ln">9&lt;/span>&lt;span class="nx">obj&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">printName&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1">// &amp;#34;myclass&amp;#34;
&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="情况四显式指定-this">情况四：显式指定 this&lt;/h2>
&lt;p>前面的几种方法都是被动地根据代码执行时的环境来判断 &lt;code>this&lt;/code> 具体指向哪里，那么有没有办法主动指定 &lt;code>this&lt;/code> 指向呢。&lt;/p>
&lt;p>答案当然是有的，甚至它们的出场率还相当高。&lt;/p>
&lt;p>常见的显式指定 &lt;code>this&lt;/code> 的方法主要是 &lt;code>call&lt;/code>，&lt;code>apply&lt;/code> 和 &lt;code>bind&lt;/code> 来，在函数式编程中几乎离不开这三个方法。&lt;/p>
&lt;p>先定义如下变量：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln">1&lt;/span>&lt;span class="nb">window&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">name&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s1">&amp;#39;globalName&amp;#39;&lt;/span>
&lt;span class="ln">2&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">printName&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">3&lt;/span> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">name&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">4&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">5&lt;/span>
&lt;span class="ln">6&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">obj1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">name&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;obj1&amp;#39;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">7&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">obj2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">name&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;obj2&amp;#39;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">8&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">obj3&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">name&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;obj3&amp;#39;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>默认情况 this 指向全局对象 window&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln">1&lt;/span>&lt;span class="nx">printName&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1">// &amp;#34;globalName&amp;#34;
&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>使用 &lt;code>call&lt;/code> 来改变 &lt;code>this&lt;/code> 指向：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln">1&lt;/span>&lt;span class="nx">printName&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">call&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">obj1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">// &amp;#34;obj1&amp;#34;
&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>使用 &lt;code>apply&lt;/code> 来改变 &lt;code>this&lt;/code> 指向：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln">1&lt;/span>&lt;span class="nx">printName&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">apply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">obj2&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">// &amp;#34;obj2&amp;#34;
&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>使用 &lt;code>bind&lt;/code> 来改变 &lt;code>this&lt;/code> 指向：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln">1&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">printName2&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">printName&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">bind&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">obj3&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">2&lt;/span>&lt;span class="nx">printName2&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1">// &amp;#34;obj3&amp;#34;
&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>除此之外，还有一些函数也可以修改 this 指向，例如：forEach, map, filter, some, every 等。以 &lt;code>forEach&lt;/code> 为例：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln"> 1&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">obj&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">name&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;zwc&amp;#39;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln"> 2&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">arr&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span> &lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="mi">2&lt;/span> &lt;span class="p">]&lt;/span>
&lt;span class="ln"> 3&lt;/span>
&lt;span class="ln"> 4&lt;/span>&lt;span class="nx">arr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">forEach&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">item&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">index&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 5&lt;/span> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">item&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">this&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln"> 6&lt;/span>&lt;span class="p">})&lt;/span>
&lt;span class="ln"> 7&lt;/span>&lt;span class="c1">// 1 Window
&lt;/span>&lt;span class="ln"> 8&lt;/span>&lt;span class="c1">// 2 Window
&lt;/span>&lt;span class="ln"> 9&lt;/span>&lt;span class="c1">&lt;/span>
&lt;span class="ln">10&lt;/span>&lt;span class="nx">arr&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">forEach&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">item&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">index&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">11&lt;/span> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">item&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="k">this&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">12&lt;/span>&lt;span class="p">},&lt;/span> &lt;span class="nx">obj&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">13&lt;/span>&lt;span class="c1">// 1 {name: &amp;#34;zwc&amp;#34;}
&lt;/span>&lt;span class="ln">14&lt;/span>&lt;span class="c1">// 2 {name: &amp;#34;zwc&amp;#34;}
&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>forEach&lt;/code> 第一个参数接收一个函数作为迭代器，用来处理数组中每一项元素，这个函数通常是一个匿名函数，函数内部的 &lt;code>this&lt;/code> 指向全局对象。&lt;/p>
&lt;p>&lt;code>forEach&lt;/code> 第二个参数可以接收一个对象，这个对象就是参数函数中的 &lt;code>this&lt;/code> 指向。&lt;/p>
&lt;p>根据打印结果可以看到，在 &lt;code>forEach&lt;/code> 的迭代器函数中的 &lt;code>this&lt;/code> 已经指向了 &lt;code>obj&lt;/code> 。&lt;/p>
&lt;h2 id="情况五es6箭头函数">情况五：ES6箭头函数&lt;/h2>
&lt;h3 id="箭头函数简介">箭头函数简介&lt;/h3>
&lt;p>ES6 允许使用「箭头」（&lt;code>=&amp;gt;&lt;/code>）定义函数。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln">1&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">f&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nx">v&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="nx">v&lt;/span>
&lt;span class="ln">2&lt;/span>
&lt;span class="ln">3&lt;/span>&lt;span class="c1">// 等同于
&lt;/span>&lt;span class="ln">4&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">f&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kd">function&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">v&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">5&lt;/span> &lt;span class="k">return&lt;/span> &lt;span class="nx">v&lt;/span>
&lt;span class="ln">6&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>除了形式更简洁之外，箭头函数没有自己的 &lt;code>this&lt;/code>，而是&lt;strong>从自己作用域链的上一层继承 &lt;code>this&lt;/code>&lt;/strong>。&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>箭头函数总是从自己作用域链的上一层继承 &lt;code>this&lt;/code>。&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>神马意思呢？我的理解就是箭头函数内部的 &lt;code>this&lt;/code> 指向永远是箭头函数被定义时所在的作用域的 &lt;code>this&lt;/code>，并且无法修改。&lt;/p>
&lt;h3 id="无法绑定-this">无法绑定 this&lt;/h3>
&lt;p>使用 call 来调用箭头函数时，第一个参数会被忽略，也就是说无法修改 this 指向。apply 和 bind 也是同样现象。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln">1&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">printName&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">2&lt;/span> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">this&lt;/span> &lt;span class="o">===&lt;/span> &lt;span class="nb">window&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">// true
&lt;/span>&lt;span class="ln">3&lt;/span>&lt;span class="c1">&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">4&lt;/span>
&lt;span class="ln">5&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">obj&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="nx">name&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="s1">&amp;#39;obj&amp;#39;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">6&lt;/span>
&lt;span class="ln">7&lt;/span>&lt;span class="nx">printName&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">call&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">obj&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="例子一">例子一&lt;/h3>
&lt;p>来看一个例子，在不使用箭头函数的情况下，我们知道构造器函数内部 this 指向对象实例，而匿名函数的 this 是指向全局对象的，因此想要通过定时器打印对象实例的 &lt;code>age&lt;/code> 属性，只能用一个变量 &lt;code>self&lt;/code> 保存 &lt;code>this&lt;/code> 的引用（即闭包）&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln"> 1&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">Person&lt;/span>&lt;span class="p">(){&lt;/span>
&lt;span class="ln"> 2&lt;/span> &lt;span class="c1">// 构造器函数内部 this 指向对象实例
&lt;/span>&lt;span class="ln"> 3&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">age&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>
&lt;span class="ln"> 4&lt;/span> &lt;span class="kd">var&lt;/span> &lt;span class="nx">self&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">this&lt;/span>
&lt;span class="ln"> 5&lt;/span> &lt;span class="nx">setInterval&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 6&lt;/span> &lt;span class="c1">// 匿名函数中 this 指向全局对象
&lt;/span>&lt;span class="ln"> 7&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">self&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">age&lt;/span>&lt;span class="o">++&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln"> 8&lt;/span> &lt;span class="p">},&lt;/span> &lt;span class="mi">1000&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln"> 9&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln">10&lt;/span>
&lt;span class="ln">11&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">p&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">Person&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>使用箭头函数之后，因为箭头函数的 &lt;code>this&lt;/code> 继承自其被定义时所在环境的 &lt;code>this&lt;/code>，在本例中这个 this 就是实例对象：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln"> 1&lt;/span>&lt;span class="kd">function&lt;/span> &lt;span class="nx">Person&lt;/span>&lt;span class="p">(){&lt;/span>
&lt;span class="ln"> 2&lt;/span> &lt;span class="c1">// 构造器函数内部 this 指向对象实例
&lt;/span>&lt;span class="ln"> 3&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">age&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">0&lt;/span>
&lt;span class="ln"> 4&lt;/span> &lt;span class="nx">setInterval&lt;/span>&lt;span class="p">(()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 5&lt;/span> &lt;span class="c1">// 这里的 this 也指向构造函数的 this
&lt;/span>&lt;span class="ln"> 6&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="nx">console&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">log&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">age&lt;/span>&lt;span class="o">++&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln"> 7&lt;/span> &lt;span class="p">},&lt;/span> &lt;span class="mi">1000&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln"> 8&lt;/span>&lt;span class="p">}&lt;/span>
&lt;span class="ln"> 9&lt;/span>
&lt;span class="ln">10&lt;/span>&lt;span class="kd">var&lt;/span> &lt;span class="nx">p&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="nx">Person&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="例子二">例子二&lt;/h3>
&lt;p>再说一个更实用的例子：在 Vue.js 中使用箭头函数&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-js" data-lang="js">&lt;span class="ln"> 1&lt;/span>&lt;span class="kr">import&lt;/span> &lt;span class="nx">axios&lt;/span> &lt;span class="nx">from&lt;/span> &lt;span class="s1">&amp;#39;axios&amp;#39;&lt;/span>
&lt;span class="ln"> 2&lt;/span>&lt;span class="kr">export&lt;/span> &lt;span class="k">default&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 3&lt;/span> &lt;span class="nx">methods&lt;/span>&lt;span class="o">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 4&lt;/span> &lt;span class="nx">fetch&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 5&lt;/span> &lt;span class="nx">axios&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s1">&amp;#39;/userinfo&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln"> 6&lt;/span> &lt;span class="p">.&lt;/span>&lt;span class="nx">then&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">resp&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln"> 7&lt;/span> &lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">sayHi&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1">// this 指向 vue 实例
&lt;/span>&lt;span class="ln"> 8&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="p">})&lt;/span>
&lt;span class="ln"> 9&lt;/span> &lt;span class="p">.&lt;/span>&lt;span class="k">catch&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">err&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">10&lt;/span> &lt;span class="k">this&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">sayHi&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="c1">// this 指向 vue 实例
&lt;/span>&lt;span class="ln">11&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="p">})&lt;/span>
&lt;span class="ln">12&lt;/span> &lt;span class="p">},&lt;/span>
&lt;span class="ln">13&lt;/span> &lt;span class="nx">sayHi&lt;/span> &lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">14&lt;/span> &lt;span class="nx">setTimeout&lt;/span>&lt;span class="p">(()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="p">{&lt;/span>
&lt;span class="ln">15&lt;/span> &lt;span class="c1">// this 指向 vue 实例
&lt;/span>&lt;span class="ln">16&lt;/span>&lt;span class="c1">&lt;/span> &lt;span class="p">},&lt;/span> &lt;span class="mi">1000&lt;/span>&lt;span class="p">)&lt;/span>
&lt;span class="ln">17&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">18&lt;/span> &lt;span class="p">}&lt;/span>
&lt;span class="ln">19&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;p>使用箭头函数之后，再也无需缓存 vue 实例，像是 &lt;code>var vm = this&lt;/code> 这种代码统统可以消灭掉，嗯，清爽！&lt;/p>
&lt;h2 id="相关链接">相关链接&lt;/h2>
&lt;ul>
&lt;li>
&lt;a
href = "https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Strict_mode"
target="_blank" rel ="noopener"
>严格模式 - MDN&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/li>
&lt;li>
&lt;a
href = "https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/arrow_functions"
target="_blank" rel ="noopener"
>箭头函数 - MDN&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/li>
&lt;li>
&lt;a
href = "http://es6.ruanyifeng.com/#docs/function#%E7%AE%AD%E5%A4%B4%E5%87%BD%E6%95%B0"
target="_blank" rel ="noopener"
>箭头函数 - ES6 入门&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/li>
&lt;/ul>
&lt;h2 id="总结">总结&lt;/h2>
&lt;p>在箭头函数出现之前，每一个新函数根据&lt;strong>它是被如何调用的&lt;/strong>来定义这个函数的 &lt;code>this&lt;/code> 值：&lt;/p>
&lt;ul>
&lt;li>如果是该函数是一个普通函数或者匿名函数
&lt;ul>
&lt;li>在严格模式下的函数调用下，&lt;code>this&lt;/code> 指向 &lt;code>undefined&lt;/code>，&lt;/li>
&lt;li>在非严格模式的函数调用中，&lt;code>this&lt;/code> 指向全局对象，浏览器中全局对象是 &lt;code>window&lt;/code> ，在 nodejs 中全局对象是 &lt;code>global&lt;/code>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>如果是该函数是一个构造函数，&lt;code>this&lt;/code> 指针指向一个新的对象（实例）&lt;/li>
&lt;li>如果是该函数是一个对象的方法，则它的&lt;code>this&lt;/code> 指针指向这个对象&lt;/li>
&lt;li>或者使用 &lt;code>call&lt;/code> &lt;code>apply&lt;/code> 等方法显式指定 &lt;code>this&lt;/code> 的指向&lt;/li>
&lt;/ul>
&lt;p>在箭头函数中，则是根据箭头函数上下文决定其 this 指向，且无法修改 &lt;code>this&lt;/code> 指向。&lt;/p>
&lt;hr>
&lt;p>本文完，感谢阅读。:stuck_out_tongue_winking_eye:&lt;/p></description></item><item><title>Markdown Syntax Guide</title><link>/2019-03-11/markdown-syntax-guide/</link><pubDate>Mon, 11 Mar 2019 00:00:00 +0000</pubDate><guid>/2019-03-11/markdown-syntax-guide/</guid><description>
&lt;p>This article offers a sample of basic Markdown syntax that can be used in Hugo content files, also it shows whether basic HTML elements are decorated with CSS in a Hugo theme.&lt;/p>
&lt;h2 id="headings">Headings&lt;/h2>
&lt;p>The following HTML &lt;code>&amp;lt;h1&amp;gt;&lt;/code>—&lt;code>&amp;lt;h6&amp;gt;&lt;/code> elements represent six levels of section headings. &lt;code>&amp;lt;h1&amp;gt;&lt;/code> is the highest section level while &lt;code>&amp;lt;h6&amp;gt;&lt;/code> is the lowest.&lt;/p>
&lt;h1 id="h1">H1&lt;/h1>
&lt;h2 id="h2">H2&lt;/h2>
&lt;h3 id="h3">H3&lt;/h3>
&lt;h4 id="h4">H4&lt;/h4>
&lt;h5 id="h5">H5&lt;/h5>
&lt;h6 id="h6">H6&lt;/h6>
&lt;h2 id="paragraph">Paragraph&lt;/h2>
&lt;p>Xerum, quo qui aut unt expliquam qui dolut labo. Aque venitatiusda cum, voluptionse latur sitiae dolessi aut parist aut dollo enim qui voluptate ma dolestendit peritin re plis aut quas inctum laceat est volestemque commosa as cus endigna tectur, offic to cor sequas etum rerum idem sintibus eiur? Quianimin porecus evelectur, cum que nis nust voloribus ratem aut omnimi, sitatur? Quiatem. Nam, omnis sum am facea corem alique molestrunt et eos evelece arcillit ut aut eos eos nus, sin conecerem erum fuga. Ri oditatquam, ad quibus unda veliamenimin cusam et facea ipsamus es exerum sitate dolores editium rerore eost, temped molorro ratiae volorro te reribus dolorer sperchicium faceata tiustia prat.&lt;/p>
&lt;p>Itatur? Quiatae cullecum rem ent aut odis in re eossequodi nonsequ idebis ne sapicia is sinveli squiatum, core et que aut hariosam ex eat.&lt;/p>
&lt;h2 id="blockquotes">Blockquotes&lt;/h2>
&lt;p>The blockquote element represents content that is quoted from another source, optionally with a citation which must be within a &lt;code>footer&lt;/code> or &lt;code>cite&lt;/code> element, and optionally with in-line changes such as annotations and abbreviations.&lt;/p>
&lt;h4 id="blockquote-without-attribution">Blockquote without attribution&lt;/h4>
&lt;blockquote>
&lt;p>Tiam, ad mint andaepu dandae nostion secatur sequo quae.
&lt;strong>Note&lt;/strong> that you can use &lt;em>Markdown syntax&lt;/em> within a blockquote.&lt;/p>
&lt;/blockquote>
&lt;h4 id="blockquote-with-attribution">Blockquote with attribution&lt;/h4>
&lt;blockquote>
&lt;p>Don't communicate by sharing memory, share memory by communicating.&lt;br>
— &lt;cite>Rob Pike&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>&lt;/cite>&lt;/p>
&lt;/blockquote>
&lt;h2 id="tables">Tables&lt;/h2>
&lt;p>Tables aren't part of the core Markdown spec, but Hugo supports supports them out-of-the-box.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Name&lt;/th>
&lt;th>Age&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Bob&lt;/td>
&lt;td>27&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Alice&lt;/td>
&lt;td>23&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h4 id="inline-markdown-within-tables">Inline Markdown within tables&lt;/h4>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Italics&lt;/th>
&lt;th>Bold&lt;/th>
&lt;th>Code&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;em>italics&lt;/em>&lt;/td>
&lt;td>&lt;strong>bold&lt;/strong>&lt;/td>
&lt;td>&lt;code>code&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="code-blocks">Code Blocks&lt;/h2>
&lt;h4 id="code-block-with-backticks">Code block with backticks&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="ln"> 1&lt;/span>&lt;span class="cp">&amp;lt;!doctype html&amp;gt;&lt;/span>
&lt;span class="ln"> 2&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">html&lt;/span> &lt;span class="na">lang&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;en&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="ln"> 3&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">head&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="ln"> 4&lt;/span> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">charset&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;utf-8&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="ln"> 5&lt;/span> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">title&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>Example HTML5 Document&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">title&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="ln"> 6&lt;/span>&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">head&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="ln"> 7&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">body&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="ln"> 8&lt;/span> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">p&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>Test&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">p&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="ln"> 9&lt;/span>&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">body&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="ln">10&lt;/span>&lt;span class="c">&amp;lt;!-- this line is extraneous 2Error from server (Forbidden): deployments.apps is forbidden: User &amp;#34;chiptest&amp;#34; cannot create resource &amp;#34;deployments&amp;#34; in API group &amp;#34;apps&amp;#34; in the namespace &amp;#34;default&amp;#34; --&amp;gt;&lt;/span>
&lt;span class="ln">11&lt;/span>&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">html&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="code-block-indented-with-four-spaces">Code block indented with four spaces&lt;/h4>
&lt;pre>&lt;code>&amp;lt;!doctype html&amp;gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;
&amp;lt;title&amp;gt;Example HTML5 Document&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;p&amp;gt;Test&amp;lt;/p&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code>&lt;/pre>
&lt;h4 id="code-block-with-hugos-internal-highlight-shortcode">Code block with Hugo's internal highlight shortcode&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="ln"> 1&lt;/span>&lt;span class="cp">&amp;lt;!doctype html&amp;gt;&lt;/span>
&lt;span class="ln"> 2&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">html&lt;/span> &lt;span class="na">lang&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;en&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="ln"> 3&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">head&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="ln"> 4&lt;/span> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">meta&lt;/span> &lt;span class="na">charset&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;utf-8&amp;#34;&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="ln"> 5&lt;/span> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">title&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>Example HTML5 Document&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">title&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="ln"> 6&lt;/span>&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">head&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="ln"> 7&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">body&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="ln"> 8&lt;/span> &lt;span class="p">&amp;lt;&lt;/span>&lt;span class="nt">p&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>Test&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">p&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="ln"> 9&lt;/span>&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">body&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>
&lt;span class="ln">10&lt;/span>&lt;span class="p">&amp;lt;/&lt;/span>&lt;span class="nt">html&lt;/span>&lt;span class="p">&amp;gt;&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h2 id="list-types">List Types&lt;/h2>
&lt;h4 id="ordered-list">Ordered List&lt;/h4>
&lt;ol>
&lt;li>First item&lt;/li>
&lt;li>Second item&lt;/li>
&lt;li>Third item&lt;/li>
&lt;/ol>
&lt;h4 id="unordered-list">Unordered List&lt;/h4>
&lt;ul>
&lt;li>List item&lt;/li>
&lt;li>Another item&lt;/li>
&lt;li>And another item&lt;/li>
&lt;/ul>
&lt;h4 id="nested-list">Nested list&lt;/h4>
&lt;ul>
&lt;li>Fruit
&lt;ul>
&lt;li>Apple&lt;/li>
&lt;li>Orange&lt;/li>
&lt;li>Banana&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Dairy
&lt;ul>
&lt;li>Milk&lt;/li>
&lt;li>Cheese&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="other-elements--abbr-sub-sup-kbd-mark">Other Elements — abbr, sub, sup, kbd, mark&lt;/h2>
&lt;p>&lt;abbr title="Graphics Interchange Format">GIF&lt;/abbr> is a bitmap image format.&lt;/p>
&lt;p>H&lt;sub>2&lt;/sub>O&lt;/p>
&lt;p>X&lt;sup>n&lt;/sup> + Y&lt;sup>n&lt;/sup> = Z&lt;sup>n&lt;/sup>&lt;/p>
&lt;p>Press &lt;kbd>&lt;kbd>CTRL&lt;/kbd>+&lt;kbd>ALT&lt;/kbd>+&lt;kbd>Delete&lt;/kbd>&lt;/kbd> to end the session.&lt;/p>
&lt;p>Most &lt;mark>salamanders&lt;/mark> are nocturnal, and hunt for insects, worms, and other small creatures.&lt;/p>
&lt;section class="footnotes" role="doc-endnotes">
&lt;hr>
&lt;ol>
&lt;li id="fn:1" role="doc-endnote">
&lt;p>The above quote is excerpted from Rob Pike's
&lt;a
href = "https://www.youtube.com/watch?v=PAAkCSZUG1c"
target="_blank" rel ="noopener"
>talk&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
during Gopherfest, November 18, 2015.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink">&amp;#x21a9;&amp;#xfe0e;&lt;/a>&lt;/p>
&lt;/li>
&lt;/ol>
&lt;/section></description></item><item><title>Rich Content</title><link>/2019-03-10/rich-content/</link><pubDate>Sun, 10 Mar 2019 00:00:00 +0000</pubDate><guid>/2019-03-10/rich-content/</guid><description>
&lt;p>Hugo ships with several
&lt;a
href = "https://gohugo.io/content-management/shortcodes/#use-hugo-s-built-in-shortcodes"
target="_blank" rel ="noopener"
>Built-in Shortcodes&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
for rich content, along with a
&lt;a
href = "https://gohugo.io/about/hugo-and-gdpr/"
target="_blank" rel ="noopener"
>Privacy Config&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
and a set of Simple Shortcodes that enable static and no-JS versions of various social media embeds.&lt;/p>
&lt;hr>
&lt;h2 id="instagram-simple-shortcode">Instagram Simple Shortcode&lt;/h2>
&lt;br>
&lt;hr>
&lt;h2 id="youtube-privacy-enhanced-shortcode">YouTube Privacy Enhanced Shortcode&lt;/h2>
&lt;br>
&lt;hr>
&lt;h2 id="twitter-simple-shortcode">Twitter Simple Shortcode&lt;/h2>
&lt;br>
&lt;hr>
&lt;h2 id="vimeo-simple-shortcode">Vimeo Simple Shortcode&lt;/h2></description></item><item><title>Placeholder Text</title><link>/2019-03-09/placeholder-text/</link><pubDate>Sat, 09 Mar 2019 00:00:00 +0000</pubDate><guid>/2019-03-09/placeholder-text/</guid><description>
&lt;p>Lorem est tota propiore conpellat pectoribus de pectora summo.&lt;/p>
&lt;p>Redit teque digerit hominumque toris verebor lumina non cervice subde tollit usus habet Arctonque, furores quas nec ferunt. Quoque montibus nunc caluere tempus inhospita parcite confusaque translucet patri vestro qui optatis lumine cognoscere flos nubis! Fronde ipsamque patulos Dryopen deorum.&lt;/p>
&lt;ol>
&lt;li>Exierant elisi ambit vivere dedere&lt;/li>
&lt;li>Duce pollice&lt;/li>
&lt;li>Eris modo&lt;/li>
&lt;li>Spargitque ferrea quos palude&lt;/li>
&lt;/ol>
&lt;p>Rursus nulli murmur; hastile inridet ut ab gravi sententia! Nomine potitus silentia flumen, sustinet placuit petis in dilapsa erat sunt. Atria tractus malis.&lt;/p>
&lt;ol>
&lt;li>Comas hunc haec pietate fetum procerum dixit&lt;/li>
&lt;li>Post torum vates letum Tiresia&lt;/li>
&lt;li>Flumen querellas&lt;/li>
&lt;li>Arcanaque montibus omnes&lt;/li>
&lt;li>Quidem et&lt;/li>
&lt;/ol>
&lt;h1 id="vagus-elidunt">Vagus elidunt&lt;/h1>
&lt;p>&lt;svg class="canon" xmlns="http://www.w3.org/2000/svg" overflow="visible" viewBox="0 0 496 373" height="373" width="496">&lt;g fill="none">&lt;path stroke="#000" stroke-width=".75" d="M.599 372.348L495.263 1.206M.312.633l494.95 370.853M.312 372.633L247.643.92M248.502.92l246.76 370.566M330.828 123.869V1.134M330.396 1.134L165.104 124.515">&lt;/path>&lt;path stroke="#ED1C24" stroke-width=".75" d="M275.73 41.616h166.224v249.05H275.73zM54.478 41.616h166.225v249.052H54.478z">&lt;/path>&lt;path stroke="#000" stroke-width=".75" d="M.479.375h495v372h-495zM247.979.875v372">&lt;/path>&lt;ellipse cx="498.729" cy="177.625" rx=".75" ry="1.25">&lt;/ellipse>&lt;ellipse cx="247.229" cy="377.375" rx=".75" ry="1.25">&lt;/ellipse>&lt;/g>&lt;/svg>&lt;/p>
&lt;p>
&lt;a
href = "https://en.wikipedia.org/wiki/Canons_of_page_construction#Van_de_Graaf_canon"
target="_blank" rel ="noopener"
>The Van de Graaf Canon&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/p>
&lt;h2 id="mane-refeci-capiebant-unda-mulcebat">Mane refeci capiebant unda mulcebat&lt;/h2>
&lt;p>Victa caducifer, malo vulnere contra dicere aurato, ludit regale, voca! Retorsit colit est profanae esse virescere furit nec; iaculi matertera et visa est, viribus. Divesque creatis, tecta novat collumque vulnus est, parvas. &lt;strong>Faces illo pepulere&lt;/strong> tempus adest. Tendit flamma, ab opes virum sustinet, sidus sequendo urbis.&lt;/p>
&lt;p>Iubar proles corpore raptos vero auctor imperium; sed et huic: manus caeli Lelegas tu lux. Verbis obstitit intus oblectamina fixis linguisque ausus sperare Echionides cornuaque tenent clausit possit. Omnia putatur. Praeteritae refert ausus; ferebant e primus lora nutat, vici quae mea ipse. Et iter nil spectatae vulnus haerentia iuste et exercebat, sui et.&lt;/p>
&lt;p>Eurytus Hector, materna ipsumque ut Politen, nec, nate, ignari, vernum cohaesit sequitur. Vel &lt;strong>mitis temploque&lt;/strong> vocatus, inque alis, &lt;em>oculos nomen&lt;/em> non silvis corpore coniunx ne displicet illa. Crescunt non unus, vidit visa quantum inmiti flumina mortis facto sic: undique a alios vincula sunt iactata abdita! Suspenderat ego fuit tendit: luna, ante urbem Propoetides &lt;strong>parte&lt;/strong>.&lt;/p></description></item><item><title>Math Typesetting</title><link>/2019-03-08/math-typesetting/</link><pubDate>Fri, 08 Mar 2019 00:00:00 +0000</pubDate><guid>/2019-03-08/math-typesetting/</guid><description>
&lt;p>Mathematical notation in a Hugo project can be enabled by using third party JavaScript libraries.&lt;/p>
&lt;p>In this example we will be using
&lt;a
href = "https://katex.org/"
target="_blank" rel ="noopener"
>KaTeX&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/p>
&lt;ul>
&lt;li>Create a partial under &lt;code>/layouts/partials/math.html&lt;/code>&lt;/li>
&lt;li>Within this partial reference the
&lt;a
href = "https://katex.org/docs/autorender.html"
target="_blank" rel ="noopener"
>Auto-render Extension&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
or host these scripts locally.&lt;/li>
&lt;li>Include the partial in your templates like so:&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="ln">1&lt;/span>&lt;span class="o">{{&lt;/span> &lt;span class="k">if&lt;/span> or .Params.math .Site.Params.math &lt;span class="o">}}&lt;/span>
&lt;span class="ln">2&lt;/span>&lt;span class="o">{{&lt;/span> partial &lt;span class="s2">&amp;#34;math.html&amp;#34;&lt;/span> . &lt;span class="o">}}&lt;/span>
&lt;span class="ln">3&lt;/span>&lt;span class="o">{{&lt;/span> end &lt;span class="o">}}&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>To enable KaTex globally set the parameter &lt;code>math&lt;/code> to &lt;code>true&lt;/code> in a project's configuration&lt;/li>
&lt;li>To enable KaTex on a per page basis include the parameter &lt;code>math: true&lt;/code> in content files&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Note:&lt;/strong> Use the online reference of
&lt;a
href = "https://katex.org/docs/supported.html"
target="_blank" rel ="noopener"
>Supported TeX Functions&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
&lt;/p>
&lt;h3 id="examples">Examples&lt;/h3>
&lt;p>Block math:
$$
\varphi = 1+\frac{1} {1+\frac{1} {1+\frac{1} {1+\cdots} } }
$$&lt;/p></description></item><item><title>Emoji Support</title><link>/2019-03-05/emoji-support/</link><pubDate>Tue, 05 Mar 2019 00:00:00 +0000</pubDate><guid>/2019-03-05/emoji-support/</guid><description>
&lt;p>Emoji can be enabled in a Hugo project in a number of ways.&lt;/p>
&lt;p>The
&lt;a
href = "https://gohugo.io/functions/emojify/"
target="_blank" rel ="noopener"
>&lt;code>emojify&lt;/code>&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
function can be called directly in templates or
&lt;a
href = "https://gohugo.io/templates/shortcode-templates/#inline-shortcodes"
target="_blank" rel ="noopener"
>Inline Shortcodes&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
.&lt;/p>
&lt;p>To enable emoji globally, set &lt;code>enableEmoji&lt;/code> to &lt;code>true&lt;/code> in your site's
&lt;a
href = "https://gohugo.io/getting-started/configuration/"
target="_blank" rel ="noopener"
>configuration&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
and then you can type emoji shorthand codes directly in content files; e.g.&lt;/p>
&lt;p>&lt;span class="nowrap">&lt;span class="emojify">🙈&lt;/span> &lt;code>:see_no_evil:&lt;/code>&lt;/span> &lt;span class="nowrap">&lt;span class="emojify">🙉&lt;/span> &lt;code>:hear_no_evil:&lt;/code>&lt;/span> &lt;span class="nowrap">&lt;span class="emojify">🙊&lt;/span> &lt;code>:speak_no_evil:&lt;/code>&lt;/span>&lt;/p>
&lt;br>
&lt;p>The
&lt;a
href = "http://www.emoji-cheat-sheet.com/"
target="_blank" rel ="noopener"
>Emoji cheat sheet&lt;span>&lt;svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound" style="margin: 0; width: .85em;">&lt;path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z">&lt;/path> &lt;polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9">&lt;/polygon>&lt;/svg>&lt;/span>
&lt;/a>
is a useful reference for emoji shorthand codes.&lt;/p>
&lt;hr>
&lt;p>&lt;strong>N.B.&lt;/strong> The above steps enable Unicode Standard emoji characters and sequences in Hugo, however the rendering of these glyphs depends on the browser and the platform. To style the emoji you can either use a third party emoji font or a font stack; e.g.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-html" data-lang="html">&lt;span class="ln">1&lt;/span>.emoji {
&lt;span class="ln">2&lt;/span> font-family: Apple Color Emoji, Segoe UI Emoji, NotoColorEmoji, Segoe UI Symbol, Android Emoji, EmojiSymbols;
&lt;span class="ln">3&lt;/span>}&lt;/code>&lt;/pre>&lt;/div></description></item></channel></rss>