<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Raincal's Blog]]></title><description><![CDATA[Web Developer]]></description><link>https://raincal.com</link><generator>GatsbyJS</generator><lastBuildDate>Tue, 18 Aug 2020 13:16:10 GMT</lastBuildDate><item><title><![CDATA[Gogs 与主机共享 22 端口]]></title><description><![CDATA[在使用 Docker 安装 Gogs 时，一般会把容器的 22 端口映射到主机的其它端口(比如 10022)
在以 SSH 方式 clone 项目时，URL 长这样 ssh:// git@git.example.com :10022:username/project.git…]]></description><link>https://raincal.com/post/gogs-share-22-port</link><guid isPermaLink="false">https://raincal.com/post/gogs-share-22-port</guid><pubDate>Sat, 10 Mar 2018 00:00:00 GMT</pubDate><content:encoded>&lt;style data-emotion-css=&quot;afj4f8&quot;&gt;body{--theme-ui-colors-prism-token:var(--theme-ui-colors-prism-token,#fff);--theme-ui-colors-prism-languageJavascript:var(--theme-ui-colors-prism-languageJavascript,#e8696b);--theme-ui-colors-prism-javascript:var(--theme-ui-colors-prism-javascript,#e8696b);--theme-ui-colors-prism-background:var(--theme-ui-colors-prism-background,#292c34);--theme-ui-colors-prism-comment:var(--theme-ui-colors-prism-comment,#999999);--theme-ui-colors-prism-string:var(--theme-ui-colors-prism-string,#8dc891);--theme-ui-colors-prism-var:var(--theme-ui-colors-prism-var,#b3bac5);--theme-ui-colors-prism-number:var(--theme-ui-colors-prism-number,#e4854d);--theme-ui-colors-prism-constant:var(--theme-ui-colors-prism-constant,#b3bac5);--theme-ui-colors-prism-plain:var(--theme-ui-colors-prism-plain,#fff);--theme-ui-colors-prism-doctype:var(--theme-ui-colors-prism-doctype,#e8696b);--theme-ui-colors-prism-tag:var(--theme-ui-colors-prism-tag,#fc929e);--theme-ui-colors-prism-keyword:var(--theme-ui-colors-prism-keyword,#c5a5c5);--theme-ui-colors-prism-boolean:var(--theme-ui-colors-prism-boolean,#ff8b50);--theme-ui-colors-prism-function:var(--theme-ui-colors-prism-function,#79b6f2);--theme-ui-colors-prism-parameter:var(--theme-ui-colors-prism-parameter,#F9965D);--theme-ui-colors-prism-className:var(--theme-ui-colors-prism-className,#FAC863);--theme-ui-colors-prism-attrName:var(--theme-ui-colors-prism-attrName,#bf87ba);--theme-ui-colors-prism-attrValue:var(--theme-ui-colors-prism-attrValue,#a8e2a8);--theme-ui-colors-prism-interpolation:var(--theme-ui-colors-prism-interpolation,#fff);--theme-ui-colors-prism-punctuation:var(--theme-ui-colors-prism-punctuation,#5FB3B3);--theme-ui-colors-prism-maybe-class-name:var(--theme-ui-colors-prism-maybe-class-name,#fff);--theme-ui-colors-prism-property:var(--theme-ui-colors-prism-property,#80cbc4);--theme-ui-colors-prism-namespace:var(--theme-ui-colors-prism-namespace,#b2ccd6);--theme-ui-colors-prism-highlight:var(--theme-ui-colors-prism-highlight,rgba(255,255,255,0.07));--theme-ui-colors-prism-highlightBorder:var(--theme-ui-colors-prism-highlightBorder,#e1bde2);--theme-ui-colors-prism-dom:var(--theme-ui-colors-prism-dom,#5F8DC3);--theme-ui-colors-prism-operator:var(--theme-ui-colors-prism-operator,#fc929e);--theme-ui-colors-text:var(--theme-ui-colors-text,#555);--theme-ui-colors-background:var(--theme-ui-colors-background,#eee);--theme-ui-colors-primary:var(--theme-ui-colors-primary,#667eea);--theme-ui-colors-muted:var(--theme-ui-colors-muted,#999);--theme-ui-colors-header:var(--theme-ui-colors-header,#222);--theme-ui-colors-headerDark:var(--theme-ui-colors-headerDark,#131d27);--theme-ui-colors-card:var(--theme-ui-colors-card,#fff);--theme-ui-colors-table:var(--theme-ui-colors-table,#f9f9f9);--theme-ui-colors-whitesmoke:var(--theme-ui-colors-whitesmoke,#f5f5f5);--theme-ui-colors-gainsboro:var(--theme-ui-colors-gainsboro,#eee);--theme-ui-colors-gray:var(--theme-ui-colors-gray,#bbb);--theme-ui-colors-grayLight:var(--theme-ui-colors-grayLight,#ccc);--theme-ui-colors-grayLighter:var(--theme-ui-colors-grayLighter,#ddd);--theme-ui-colors-grayDim:var(--theme-ui-colors-grayDim,#666);--theme-ui-colors-blackLight:var(--theme-ui-colors-blackLight,#555);--theme-ui-colors-blackDim:var(--theme-ui-colors-blackDim,#333);--theme-ui-colors-blackDeep:var(--theme-ui-colors-blackDeep,#222);--theme-ui-colors-black:var(--theme-ui-colors-black,#000);--theme-ui-colors-red:var(--theme-ui-colors-red,#ff2a2a);--theme-ui-colors-blueBright:var(--theme-ui-colors-blueBright,#87daff);--theme-ui-colors-blue:var(--theme-ui-colors-blue,#0684bd);--theme-ui-colors-blueDeep:var(--theme-ui-colors-blueDeep,#262a30);--theme-ui-colors-orange:var(--theme-ui-colors-orange,#fc6423);--theme-ui-colors-orangeDark:var(--theme-ui-colors-orangeDark,#e34603);color:var(--theme-ui-colors-text,#555);background-color:var(--theme-ui-colors-background,#eee);}body.theme-ui-dark{--theme-ui-colors-text:var(--theme-ui-colors-modes-dark-text,#fff);--theme-ui-colors-background:var(--theme-ui-colors-modes-dark-background,#15202b);--theme-ui-colors-primary:var(--theme-ui-colors-modes-dark-primary,#0cf);--theme-ui-colors-header:var(--theme-ui-colors-modes-dark-header,#192734);--theme-ui-colors-card:var(--theme-ui-colors-modes-dark-card,#192734);--theme-ui-colors-table:var(--theme-ui-colors-modes-dark-table,#15202b);--theme-ui-colors-whitesmoke:var(--theme-ui-colors-modes-dark-whitesmoke,#15202b);--theme-ui-colors-grayLight:var(--theme-ui-colors-modes-dark-grayLight,#15202b);--theme-ui-colors-blackLight:var(--theme-ui-colors-modes-dark-blackLight,#fff);--theme-ui-colors-blackDeep:var(--theme-ui-colors-modes-dark-blackDeep,#fff);--theme-ui-colors-black:var(--theme-ui-colors-modes-dark-black,#fff);}&lt;/style&gt;&lt;style data-emotion-css=&quot;1w4nyi6&quot;&gt;*{box-sizing:border-box;}body{margin:0;font-family:&quot;PingFang SC&quot;,system-ui,sans-serif;line-height:1.5;font-weight:400;color:var(--theme-ui-colors-text,#555);background-color:var(--theme-ui-colors-background,#eee);word-wrap:break-word;}&lt;/style&gt;&lt;p&gt;在使用 Docker 安装 Gogs 时，一般会把容器的 22 端口映射到主机的其它端口(比如 10022)
在以 SSH 方式 clone 项目时，URL 长这样&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;ssh://&lt;a href=&quot;mailto:git@git.example.com&quot;&gt;git@git.example.com&lt;/a&gt;:10022:username/project.git&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;但我们想要的是类似于 GitHub 那样的，这时需要把 Gogs 的 SSH 端口设置为 22&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href=&quot;mailto:git@git.example.com&quot;&gt;git@git.example.com&lt;/a&gt;:username/project.git&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;下面说一下主要步骤&lt;/p&gt;&lt;h2 id=&quot;创建-git-用户&quot;&gt;创建 git 用户&lt;/h2&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;root&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$ &lt;span class=&quot;token function&quot;&gt;useradd&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;root&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$ &lt;span class=&quot;token function&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt;    &lt;span class=&quot;token comment&quot;&gt;# 获取uid和gid&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;uid&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1002&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;git&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;gid&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1002&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;git&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;groups&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1002&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;git&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;root&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$ &lt;span class=&quot;token function&quot;&gt;usermod&lt;/span&gt; -aG docker &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt;    &lt;span class=&quot;token comment&quot;&gt;# 把git用户加入docker组&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;root&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$ &lt;span class=&quot;token function&quot;&gt;su&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;git&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$ &lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; -p ~/gogs/data   &lt;span class=&quot;token comment&quot;&gt;# 在git用户下创建gogs/data文件夹，作为gogs容器主要数据的挂载目录&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;安装-gogs&quot;&gt;安装 Gogs&lt;/h2&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;git&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$ docker run -d --name&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;gogs -p &lt;span class=&quot;token number&quot;&gt;10022&lt;/span&gt;:22 -p &lt;span class=&quot;token number&quot;&gt;10080&lt;/span&gt;:3000 -v ~/gogs/data:/data -e &lt;span class=&quot;token string&quot;&gt;&amp;quot;PUID=1002&amp;quot;&lt;/span&gt; -e &lt;span class=&quot;token string&quot;&gt;&amp;quot;PGID=1002&amp;quot;&lt;/span&gt; --restart&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;always gogs/gogs     &lt;span class=&quot;token comment&quot;&gt;# PUID PGID与上面获取的uid gid保持一致&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;git&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$ &lt;span class=&quot;token function&quot;&gt;ln&lt;/span&gt; -s ~/gogs/data/git/.ssh ~/    &lt;span class=&quot;token comment&quot;&gt;# 将gogs的.ssh目录软连接到本地的.ssh&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;现在可以通过服务器外网 ip:10080 进入安装页面，也可以等反代设置好后通过域名进行访问我用的数据库是 Sqlite3，不需要额外配置，如果你选择的是其它数据库，可以参考&lt;a href=&quot;https://www.jianshu.com/p/424627516ef6&quot;&gt;这篇文章&lt;/a&gt;
相关配置可以参考&lt;a href=&quot;https://gogs.io/docs/advanced/configuration_cheat_sheet&quot;&gt;官方文档&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;生成-ssh-key&quot;&gt;生成 SSH key&lt;/h2&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;git&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$ ssh-keygen -t rsa -b &lt;span class=&quot;token number&quot;&gt;4096&lt;/span&gt; -C &lt;span class=&quot;token string&quot;&gt;&amp;quot;git@git.example.com&amp;quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;git&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$ &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; ~/.ssh
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;git&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$ &lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; id_rsa.pub &lt;span class=&quot;token operator&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; authorized_keys
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;git&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$ &lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;600&lt;/span&gt; authorized_keys&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在 authorized_keys 最前面添加&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1y&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;YGedddqAN6w&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; git@git.example.com&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;caddy-反向代理&quot;&gt;Caddy 反向代理&lt;/h2&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;root&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$ &lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; caddy &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$_&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在 caddy 目录下创建 Caddyfile 文件，下面是参考配置&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;git.example.com {
    tls git@example.com     # 填写你的邮箱，用于申请证书
    proxy / your-ip:10080
    header / Strict-Transport-Security &amp;quot;max-age=31536000;&amp;quot;      # 开启HSTS
    gzip
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;启动-caddy&quot;&gt;启动 caddy&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;root&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$ docker run -d --name&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;caddy -v ~/caddy/Caddyfile:/etc/Caddyfile -v ~/.caddy:/root/.caddy -p &lt;span class=&quot;token number&quot;&gt;80&lt;/span&gt;:80 -p &lt;span class=&quot;token number&quot;&gt;443&lt;/span&gt;:443 --restart&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;always abiosoft/caddy&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;配置-git-用户登录问题&quot;&gt;配置 git 用户登录问题&lt;/h2&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;root&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$ &lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; -p /app/gogs/
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;root&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$ &lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt;/app/gogs/gogs &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;END&amp;#x27;
#!/bin/sh
ssh -p 10022 -o StrictHostKeyChecking=no git@127.0.0.1 \
&amp;quot;SSH_ORIGINAL_COMMAND=\&amp;quot;$SSH_ORIGINAL_COMMAND\&amp;quot; $0 $@&amp;quot;
END&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;root&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$ &lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;755&lt;/span&gt; /app/gogs/gogs&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;这样就差不多完成了，下面需要在本地生成 SSH 密匙，然后在 web 端把密匙添加到 Gogs
如果需要修改 Gogs 的配置，比如安装的时候 DOMAIN 写的 IP 现在要修改为域名，可以到/home/git/gogs/data/gogs/conf/找到 app.ini，修改完后重启 gogs 容器&lt;/p&gt;&lt;/blockquote&gt;&lt;h2 id=&quot;参考文章&quot;&gt;参考文章&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;http://notes.guoliangwu.com/2018/01/09/Install-and-configure-Gogs-with-openSSH-Server/&quot;&gt;安装 Gogs 并共享主机 22 端口&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.ateijelo.com/blog/2016/07/09/share-port-22-between-docker-gogs-ssh-and-local-system&quot;&gt;Share port 22 between Gogs inside Docker &amp;amp; the local system&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[NexT 主题优化：重构 leancloud 阅读量统计模块]]></title><description><![CDATA[为什么要重构 从去年 10 月份开始，LeanCloud 国内节点 API 的老版域名 api.leancloud.cn 在国外一些地区和国内少数地区会出现一定概率的解析错误（DNS 污染），这导致我们的博客阅读量无法正常显示 官方解决方案 如果使用的是原生 SDK…]]></description><link>https://raincal.com/post/hexo-next-optimize-leancloud</link><guid isPermaLink="false">https://raincal.com/post/hexo-next-optimize-leancloud</guid><pubDate>Sun, 11 Feb 2018 00:00:00 GMT</pubDate><content:encoded>&lt;style data-emotion-css=&quot;afj4f8&quot;&gt;body{--theme-ui-colors-prism-token:var(--theme-ui-colors-prism-token,#fff);--theme-ui-colors-prism-languageJavascript:var(--theme-ui-colors-prism-languageJavascript,#e8696b);--theme-ui-colors-prism-javascript:var(--theme-ui-colors-prism-javascript,#e8696b);--theme-ui-colors-prism-background:var(--theme-ui-colors-prism-background,#292c34);--theme-ui-colors-prism-comment:var(--theme-ui-colors-prism-comment,#999999);--theme-ui-colors-prism-string:var(--theme-ui-colors-prism-string,#8dc891);--theme-ui-colors-prism-var:var(--theme-ui-colors-prism-var,#b3bac5);--theme-ui-colors-prism-number:var(--theme-ui-colors-prism-number,#e4854d);--theme-ui-colors-prism-constant:var(--theme-ui-colors-prism-constant,#b3bac5);--theme-ui-colors-prism-plain:var(--theme-ui-colors-prism-plain,#fff);--theme-ui-colors-prism-doctype:var(--theme-ui-colors-prism-doctype,#e8696b);--theme-ui-colors-prism-tag:var(--theme-ui-colors-prism-tag,#fc929e);--theme-ui-colors-prism-keyword:var(--theme-ui-colors-prism-keyword,#c5a5c5);--theme-ui-colors-prism-boolean:var(--theme-ui-colors-prism-boolean,#ff8b50);--theme-ui-colors-prism-function:var(--theme-ui-colors-prism-function,#79b6f2);--theme-ui-colors-prism-parameter:var(--theme-ui-colors-prism-parameter,#F9965D);--theme-ui-colors-prism-className:var(--theme-ui-colors-prism-className,#FAC863);--theme-ui-colors-prism-attrName:var(--theme-ui-colors-prism-attrName,#bf87ba);--theme-ui-colors-prism-attrValue:var(--theme-ui-colors-prism-attrValue,#a8e2a8);--theme-ui-colors-prism-interpolation:var(--theme-ui-colors-prism-interpolation,#fff);--theme-ui-colors-prism-punctuation:var(--theme-ui-colors-prism-punctuation,#5FB3B3);--theme-ui-colors-prism-maybe-class-name:var(--theme-ui-colors-prism-maybe-class-name,#fff);--theme-ui-colors-prism-property:var(--theme-ui-colors-prism-property,#80cbc4);--theme-ui-colors-prism-namespace:var(--theme-ui-colors-prism-namespace,#b2ccd6);--theme-ui-colors-prism-highlight:var(--theme-ui-colors-prism-highlight,rgba(255,255,255,0.07));--theme-ui-colors-prism-highlightBorder:var(--theme-ui-colors-prism-highlightBorder,#e1bde2);--theme-ui-colors-prism-dom:var(--theme-ui-colors-prism-dom,#5F8DC3);--theme-ui-colors-prism-operator:var(--theme-ui-colors-prism-operator,#fc929e);--theme-ui-colors-text:var(--theme-ui-colors-text,#555);--theme-ui-colors-background:var(--theme-ui-colors-background,#eee);--theme-ui-colors-primary:var(--theme-ui-colors-primary,#667eea);--theme-ui-colors-muted:var(--theme-ui-colors-muted,#999);--theme-ui-colors-header:var(--theme-ui-colors-header,#222);--theme-ui-colors-headerDark:var(--theme-ui-colors-headerDark,#131d27);--theme-ui-colors-card:var(--theme-ui-colors-card,#fff);--theme-ui-colors-table:var(--theme-ui-colors-table,#f9f9f9);--theme-ui-colors-whitesmoke:var(--theme-ui-colors-whitesmoke,#f5f5f5);--theme-ui-colors-gainsboro:var(--theme-ui-colors-gainsboro,#eee);--theme-ui-colors-gray:var(--theme-ui-colors-gray,#bbb);--theme-ui-colors-grayLight:var(--theme-ui-colors-grayLight,#ccc);--theme-ui-colors-grayLighter:var(--theme-ui-colors-grayLighter,#ddd);--theme-ui-colors-grayDim:var(--theme-ui-colors-grayDim,#666);--theme-ui-colors-blackLight:var(--theme-ui-colors-blackLight,#555);--theme-ui-colors-blackDim:var(--theme-ui-colors-blackDim,#333);--theme-ui-colors-blackDeep:var(--theme-ui-colors-blackDeep,#222);--theme-ui-colors-black:var(--theme-ui-colors-black,#000);--theme-ui-colors-red:var(--theme-ui-colors-red,#ff2a2a);--theme-ui-colors-blueBright:var(--theme-ui-colors-blueBright,#87daff);--theme-ui-colors-blue:var(--theme-ui-colors-blue,#0684bd);--theme-ui-colors-blueDeep:var(--theme-ui-colors-blueDeep,#262a30);--theme-ui-colors-orange:var(--theme-ui-colors-orange,#fc6423);--theme-ui-colors-orangeDark:var(--theme-ui-colors-orangeDark,#e34603);color:var(--theme-ui-colors-text,#555);background-color:var(--theme-ui-colors-background,#eee);}body.theme-ui-dark{--theme-ui-colors-text:var(--theme-ui-colors-modes-dark-text,#fff);--theme-ui-colors-background:var(--theme-ui-colors-modes-dark-background,#15202b);--theme-ui-colors-primary:var(--theme-ui-colors-modes-dark-primary,#0cf);--theme-ui-colors-header:var(--theme-ui-colors-modes-dark-header,#192734);--theme-ui-colors-card:var(--theme-ui-colors-modes-dark-card,#192734);--theme-ui-colors-table:var(--theme-ui-colors-modes-dark-table,#15202b);--theme-ui-colors-whitesmoke:var(--theme-ui-colors-modes-dark-whitesmoke,#15202b);--theme-ui-colors-grayLight:var(--theme-ui-colors-modes-dark-grayLight,#15202b);--theme-ui-colors-blackLight:var(--theme-ui-colors-modes-dark-blackLight,#fff);--theme-ui-colors-blackDeep:var(--theme-ui-colors-modes-dark-blackDeep,#fff);--theme-ui-colors-black:var(--theme-ui-colors-modes-dark-black,#fff);}&lt;/style&gt;&lt;style data-emotion-css=&quot;1w4nyi6&quot;&gt;*{box-sizing:border-box;}body{margin:0;font-family:&quot;PingFang SC&quot;,system-ui,sans-serif;line-height:1.5;font-weight:400;color:var(--theme-ui-colors-text,#555);background-color:var(--theme-ui-colors-background,#eee);word-wrap:break-word;}&lt;/style&gt;&lt;h2 id=&quot;为什么要重构&quot;&gt;为什么要重构&lt;/h2&gt;&lt;blockquote&gt;&lt;p&gt;从去年 10 月份开始，LeanCloud 国内节点 API 的老版域名 api.leancloud.cn 在国外一些地区和国内少数地区会出现一定概率的解析错误（DNS 污染），这导致我们的博客阅读量无法正常显示&lt;/p&gt;&lt;/blockquote&gt;&lt;h3 id=&quot;官方解决方案&quot;&gt;官方解决方案&lt;/h3&gt;&lt;p&gt;如果使用的是原生 SDK，请尽快升级到以下版本：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Android 3.16.4 及更高版本&lt;/li&gt;&lt;li&gt;iOS 5.0.0 及更高版本&lt;/li&gt;&lt;li&gt;JavaScript 3.0.0 及更高版本&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;如果使用 REST API 来访问 api.leancloud.cn，请通过以下地址来动态获取应用专属的二级域名：&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://app-router.leancloud.cn/2/route?appId=&quot;&gt;https://app-router.leancloud.cn/2/route?appId=&lt;/a&gt; &amp;lt;替换为 appId&amp;gt;&lt;/p&gt;&lt;p&gt;然后使用 api_server 指示的域名来访问我们的 API 服务，即可正常获得结果。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;NexT 主题里使用的 SDK 是 av-core-mini-0.6.4，这个库 gzip 后有 28.5KB
对于一个只有几个请求的小模块来说，完全没必要用 SDK，可以手动请求官方 API 完成目的&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;重构后的代码可以到我的&lt;a href=&quot;https://github.com/Raincal/hexo-theme-next/blob/master/layout/_third-party/analytics/lean-analytics.swig&quot;&gt;GitHub&lt;/a&gt;查看&lt;/p&gt;</content:encoded></item><item><title><![CDATA[grub rescue 模式下修复 Linux 引导]]></title><description><![CDATA[前些天把很久没用的 Windows10 更新了下，更新后就进不了 Linux 系统了，提示 "file '/boot/grub/x86_64-efi/normal.mod' not found"，之后就进入 grub rescue 模式了 解决方法很简单，在 grub…]]></description><link>https://raincal.com/post/grub-rescue</link><guid isPermaLink="false">https://raincal.com/post/grub-rescue</guid><pubDate>Wed, 22 Nov 2017 00:00:00 GMT</pubDate><content:encoded>&lt;style data-emotion-css=&quot;afj4f8&quot;&gt;body{--theme-ui-colors-prism-token:var(--theme-ui-colors-prism-token,#fff);--theme-ui-colors-prism-languageJavascript:var(--theme-ui-colors-prism-languageJavascript,#e8696b);--theme-ui-colors-prism-javascript:var(--theme-ui-colors-prism-javascript,#e8696b);--theme-ui-colors-prism-background:var(--theme-ui-colors-prism-background,#292c34);--theme-ui-colors-prism-comment:var(--theme-ui-colors-prism-comment,#999999);--theme-ui-colors-prism-string:var(--theme-ui-colors-prism-string,#8dc891);--theme-ui-colors-prism-var:var(--theme-ui-colors-prism-var,#b3bac5);--theme-ui-colors-prism-number:var(--theme-ui-colors-prism-number,#e4854d);--theme-ui-colors-prism-constant:var(--theme-ui-colors-prism-constant,#b3bac5);--theme-ui-colors-prism-plain:var(--theme-ui-colors-prism-plain,#fff);--theme-ui-colors-prism-doctype:var(--theme-ui-colors-prism-doctype,#e8696b);--theme-ui-colors-prism-tag:var(--theme-ui-colors-prism-tag,#fc929e);--theme-ui-colors-prism-keyword:var(--theme-ui-colors-prism-keyword,#c5a5c5);--theme-ui-colors-prism-boolean:var(--theme-ui-colors-prism-boolean,#ff8b50);--theme-ui-colors-prism-function:var(--theme-ui-colors-prism-function,#79b6f2);--theme-ui-colors-prism-parameter:var(--theme-ui-colors-prism-parameter,#F9965D);--theme-ui-colors-prism-className:var(--theme-ui-colors-prism-className,#FAC863);--theme-ui-colors-prism-attrName:var(--theme-ui-colors-prism-attrName,#bf87ba);--theme-ui-colors-prism-attrValue:var(--theme-ui-colors-prism-attrValue,#a8e2a8);--theme-ui-colors-prism-interpolation:var(--theme-ui-colors-prism-interpolation,#fff);--theme-ui-colors-prism-punctuation:var(--theme-ui-colors-prism-punctuation,#5FB3B3);--theme-ui-colors-prism-maybe-class-name:var(--theme-ui-colors-prism-maybe-class-name,#fff);--theme-ui-colors-prism-property:var(--theme-ui-colors-prism-property,#80cbc4);--theme-ui-colors-prism-namespace:var(--theme-ui-colors-prism-namespace,#b2ccd6);--theme-ui-colors-prism-highlight:var(--theme-ui-colors-prism-highlight,rgba(255,255,255,0.07));--theme-ui-colors-prism-highlightBorder:var(--theme-ui-colors-prism-highlightBorder,#e1bde2);--theme-ui-colors-prism-dom:var(--theme-ui-colors-prism-dom,#5F8DC3);--theme-ui-colors-prism-operator:var(--theme-ui-colors-prism-operator,#fc929e);--theme-ui-colors-text:var(--theme-ui-colors-text,#555);--theme-ui-colors-background:var(--theme-ui-colors-background,#eee);--theme-ui-colors-primary:var(--theme-ui-colors-primary,#667eea);--theme-ui-colors-muted:var(--theme-ui-colors-muted,#999);--theme-ui-colors-header:var(--theme-ui-colors-header,#222);--theme-ui-colors-headerDark:var(--theme-ui-colors-headerDark,#131d27);--theme-ui-colors-card:var(--theme-ui-colors-card,#fff);--theme-ui-colors-table:var(--theme-ui-colors-table,#f9f9f9);--theme-ui-colors-whitesmoke:var(--theme-ui-colors-whitesmoke,#f5f5f5);--theme-ui-colors-gainsboro:var(--theme-ui-colors-gainsboro,#eee);--theme-ui-colors-gray:var(--theme-ui-colors-gray,#bbb);--theme-ui-colors-grayLight:var(--theme-ui-colors-grayLight,#ccc);--theme-ui-colors-grayLighter:var(--theme-ui-colors-grayLighter,#ddd);--theme-ui-colors-grayDim:var(--theme-ui-colors-grayDim,#666);--theme-ui-colors-blackLight:var(--theme-ui-colors-blackLight,#555);--theme-ui-colors-blackDim:var(--theme-ui-colors-blackDim,#333);--theme-ui-colors-blackDeep:var(--theme-ui-colors-blackDeep,#222);--theme-ui-colors-black:var(--theme-ui-colors-black,#000);--theme-ui-colors-red:var(--theme-ui-colors-red,#ff2a2a);--theme-ui-colors-blueBright:var(--theme-ui-colors-blueBright,#87daff);--theme-ui-colors-blue:var(--theme-ui-colors-blue,#0684bd);--theme-ui-colors-blueDeep:var(--theme-ui-colors-blueDeep,#262a30);--theme-ui-colors-orange:var(--theme-ui-colors-orange,#fc6423);--theme-ui-colors-orangeDark:var(--theme-ui-colors-orangeDark,#e34603);color:var(--theme-ui-colors-text,#555);background-color:var(--theme-ui-colors-background,#eee);}body.theme-ui-dark{--theme-ui-colors-text:var(--theme-ui-colors-modes-dark-text,#fff);--theme-ui-colors-background:var(--theme-ui-colors-modes-dark-background,#15202b);--theme-ui-colors-primary:var(--theme-ui-colors-modes-dark-primary,#0cf);--theme-ui-colors-header:var(--theme-ui-colors-modes-dark-header,#192734);--theme-ui-colors-card:var(--theme-ui-colors-modes-dark-card,#192734);--theme-ui-colors-table:var(--theme-ui-colors-modes-dark-table,#15202b);--theme-ui-colors-whitesmoke:var(--theme-ui-colors-modes-dark-whitesmoke,#15202b);--theme-ui-colors-grayLight:var(--theme-ui-colors-modes-dark-grayLight,#15202b);--theme-ui-colors-blackLight:var(--theme-ui-colors-modes-dark-blackLight,#fff);--theme-ui-colors-blackDeep:var(--theme-ui-colors-modes-dark-blackDeep,#fff);--theme-ui-colors-black:var(--theme-ui-colors-modes-dark-black,#fff);}&lt;/style&gt;&lt;style data-emotion-css=&quot;1w4nyi6&quot;&gt;*{box-sizing:border-box;}body{margin:0;font-family:&quot;PingFang SC&quot;,system-ui,sans-serif;line-height:1.5;font-weight:400;color:var(--theme-ui-colors-text,#555);background-color:var(--theme-ui-colors-background,#eee);word-wrap:break-word;}&lt;/style&gt;&lt;p&gt;前些天把很久没用的 Windows10 更新了下，更新后就进不了 Linux 系统了，提示 &amp;quot;file &amp;#x27;/boot/grub/x86_64-efi/normal.mod&amp;#x27; not found&amp;quot;，之后就进入 grub rescue 模式了&lt;/p&gt;&lt;p&gt;解决方法很简单，在 grub rescue 模式下找到系统的启动分区，手动启动系统，之后重新安装 grub 到 efi 分区即可&lt;/p&gt;&lt;h3 id=&quot;grub-rescue-下的操作&quot;&gt;grub rescue 下的操作&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# 查看设备和分区情况&lt;/span&gt;
grub rescue&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hd0&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hd0, gpt2&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hd0, gpt1&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;.
&lt;span class=&quot;token comment&quot;&gt;# 查看分区文件确定启动分区位置&lt;/span&gt;
grub rescue&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hd1, gpt10&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;/
&lt;span class=&quot;token comment&quot;&gt;# 设置启动分区，载入启动需要的模块&lt;/span&gt;
grub rescue&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hd1, gpt10&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
grub rescue&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;prefix&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;hd1, gpt10&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;/boot/grub
grub rescue&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt; insmod normal
grub rescue&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt; normal&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;执行完 normal 命令后，顺利的话就能进入系统了&lt;/p&gt;&lt;h3 id=&quot;查找-bootefi&quot;&gt;查找 boot/efi&lt;/h3&gt;&lt;p&gt;通过命令 &lt;strong&gt;df&lt;/strong&gt; 查看 boot/efi 所在挂载点&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:572px&quot;&gt;
      &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom:62.77777777777778%;position:relative;bottom:0;left:0;background-image:url(&amp;#x27;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsSAAALEgHS3X78AAACZUlEQVQ4y51TzU8TcRDdcw+GFuh3u+122+22pVu67X50u5V0a7l48WKCCQdJ5CPq2Zt38OaBKB4IxqRwEKkmmmhCwJuB/+k586MCwsV4eJnk7fzemzeTlQ5PzvDx+AxjwtHJ+X9hfHqOw+NfGH09hfRk9RnWnm5gaWMdS4/XBB5NsHSjXmLlGr+yjofLK3j+4iX2v/2EpMeSMCtR3CnOIjwVQTjyN6bCYarTVCMThCdcRPCRmRmEQiE02jbeH/2AJKtFaNU6FEVFWs4hcwNKsYR0VoacVwTyBVVw2VweKeKzxMUSCVheDzv7nyEVNR2266Kk60gk00imMzDmm2jbDgnK0GtzkOlxs23B9bqoztVhUT/3sBFjNhpDy+1OBMs69GpVuOeUgnD1encRDO5BUVUh0Gy14XZ9LPQD5KmHuXpjXiRIpNKYiUavBFWtDNOyUKFJFIrDjm3HhdPxUKRvLdtGzTDQsmx0ul0RmQXLlSoNUoNa0hCNJ9D+I6jRB4sEOGo8mRLV8XwMFxfFxArtmAVsMugPBsKUzU0yMGjKWt1AgXqsjo+3ozGkAjlwpHmzRe4FEcFomvD8nmjkXfLDCok6bocMSqgKwYtUfJzw9PRVZJ7Q8Tw0SIQn4sgWPezTDjlSwzTFAZgLaEKOyPvjVHwoPlqhSMY0oRDM5nIo04WjsThmYzFxMZ6sVq/TbuJIZTLiOBzdaDSQpARZOgaLaLouTEsapbQc7IxIcHj/Afz+EL1gEX4wvEB/eMnd4oPb8BYC+mtW8e7gC6TXuwfY2t7F5jVsTbD5j3j1Zg/bHw6x9+k7fgNhqt2EzB3d/wAAAABJRU5ErkJggg==&amp;#x27;);background-size:cover;display:block&quot;&gt;&lt;/span&gt;
  &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;grub&quot; title=&quot;grub&quot; src=&quot;/static/ea3fe79e2c1303d896759c196d34beac/a805e/grub.png&quot; srcSet=&quot;/static/ea3fe79e2c1303d896759c196d34beac/e9ff0/grub.png 180w,/static/ea3fe79e2c1303d896759c196d34beac/f21e7/grub.png 360w,/static/ea3fe79e2c1303d896759c196d34beac/a805e/grub.png 572w&quot; sizes=&quot;(max-width: 572px) 100vw, 572px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot;/&gt;
    &lt;/span&gt;&lt;/p&gt;&lt;h3 id=&quot;重新安装-grub&quot;&gt;重新安装 grub&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;➜ &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; grub-install /dev/sda1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[VSCode icon 分享]]></title><description><![CDATA[Icon created for  Visual Studio Code Reference  iiroj/public Download Raincal/vscode-icon]]></description><link>https://raincal.com/post/vscode-icon-share</link><guid isPermaLink="false">https://raincal.com/post/vscode-icon-share</guid><pubDate>Thu, 12 Oct 2017 00:00:00 GMT</pubDate><content:encoded>&lt;style data-emotion-css=&quot;afj4f8&quot;&gt;body{--theme-ui-colors-prism-token:var(--theme-ui-colors-prism-token,#fff);--theme-ui-colors-prism-languageJavascript:var(--theme-ui-colors-prism-languageJavascript,#e8696b);--theme-ui-colors-prism-javascript:var(--theme-ui-colors-prism-javascript,#e8696b);--theme-ui-colors-prism-background:var(--theme-ui-colors-prism-background,#292c34);--theme-ui-colors-prism-comment:var(--theme-ui-colors-prism-comment,#999999);--theme-ui-colors-prism-string:var(--theme-ui-colors-prism-string,#8dc891);--theme-ui-colors-prism-var:var(--theme-ui-colors-prism-var,#b3bac5);--theme-ui-colors-prism-number:var(--theme-ui-colors-prism-number,#e4854d);--theme-ui-colors-prism-constant:var(--theme-ui-colors-prism-constant,#b3bac5);--theme-ui-colors-prism-plain:var(--theme-ui-colors-prism-plain,#fff);--theme-ui-colors-prism-doctype:var(--theme-ui-colors-prism-doctype,#e8696b);--theme-ui-colors-prism-tag:var(--theme-ui-colors-prism-tag,#fc929e);--theme-ui-colors-prism-keyword:var(--theme-ui-colors-prism-keyword,#c5a5c5);--theme-ui-colors-prism-boolean:var(--theme-ui-colors-prism-boolean,#ff8b50);--theme-ui-colors-prism-function:var(--theme-ui-colors-prism-function,#79b6f2);--theme-ui-colors-prism-parameter:var(--theme-ui-colors-prism-parameter,#F9965D);--theme-ui-colors-prism-className:var(--theme-ui-colors-prism-className,#FAC863);--theme-ui-colors-prism-attrName:var(--theme-ui-colors-prism-attrName,#bf87ba);--theme-ui-colors-prism-attrValue:var(--theme-ui-colors-prism-attrValue,#a8e2a8);--theme-ui-colors-prism-interpolation:var(--theme-ui-colors-prism-interpolation,#fff);--theme-ui-colors-prism-punctuation:var(--theme-ui-colors-prism-punctuation,#5FB3B3);--theme-ui-colors-prism-maybe-class-name:var(--theme-ui-colors-prism-maybe-class-name,#fff);--theme-ui-colors-prism-property:var(--theme-ui-colors-prism-property,#80cbc4);--theme-ui-colors-prism-namespace:var(--theme-ui-colors-prism-namespace,#b2ccd6);--theme-ui-colors-prism-highlight:var(--theme-ui-colors-prism-highlight,rgba(255,255,255,0.07));--theme-ui-colors-prism-highlightBorder:var(--theme-ui-colors-prism-highlightBorder,#e1bde2);--theme-ui-colors-prism-dom:var(--theme-ui-colors-prism-dom,#5F8DC3);--theme-ui-colors-prism-operator:var(--theme-ui-colors-prism-operator,#fc929e);--theme-ui-colors-text:var(--theme-ui-colors-text,#555);--theme-ui-colors-background:var(--theme-ui-colors-background,#eee);--theme-ui-colors-primary:var(--theme-ui-colors-primary,#667eea);--theme-ui-colors-muted:var(--theme-ui-colors-muted,#999);--theme-ui-colors-header:var(--theme-ui-colors-header,#222);--theme-ui-colors-headerDark:var(--theme-ui-colors-headerDark,#131d27);--theme-ui-colors-card:var(--theme-ui-colors-card,#fff);--theme-ui-colors-table:var(--theme-ui-colors-table,#f9f9f9);--theme-ui-colors-whitesmoke:var(--theme-ui-colors-whitesmoke,#f5f5f5);--theme-ui-colors-gainsboro:var(--theme-ui-colors-gainsboro,#eee);--theme-ui-colors-gray:var(--theme-ui-colors-gray,#bbb);--theme-ui-colors-grayLight:var(--theme-ui-colors-grayLight,#ccc);--theme-ui-colors-grayLighter:var(--theme-ui-colors-grayLighter,#ddd);--theme-ui-colors-grayDim:var(--theme-ui-colors-grayDim,#666);--theme-ui-colors-blackLight:var(--theme-ui-colors-blackLight,#555);--theme-ui-colors-blackDim:var(--theme-ui-colors-blackDim,#333);--theme-ui-colors-blackDeep:var(--theme-ui-colors-blackDeep,#222);--theme-ui-colors-black:var(--theme-ui-colors-black,#000);--theme-ui-colors-red:var(--theme-ui-colors-red,#ff2a2a);--theme-ui-colors-blueBright:var(--theme-ui-colors-blueBright,#87daff);--theme-ui-colors-blue:var(--theme-ui-colors-blue,#0684bd);--theme-ui-colors-blueDeep:var(--theme-ui-colors-blueDeep,#262a30);--theme-ui-colors-orange:var(--theme-ui-colors-orange,#fc6423);--theme-ui-colors-orangeDark:var(--theme-ui-colors-orangeDark,#e34603);color:var(--theme-ui-colors-text,#555);background-color:var(--theme-ui-colors-background,#eee);}body.theme-ui-dark{--theme-ui-colors-text:var(--theme-ui-colors-modes-dark-text,#fff);--theme-ui-colors-background:var(--theme-ui-colors-modes-dark-background,#15202b);--theme-ui-colors-primary:var(--theme-ui-colors-modes-dark-primary,#0cf);--theme-ui-colors-header:var(--theme-ui-colors-modes-dark-header,#192734);--theme-ui-colors-card:var(--theme-ui-colors-modes-dark-card,#192734);--theme-ui-colors-table:var(--theme-ui-colors-modes-dark-table,#15202b);--theme-ui-colors-whitesmoke:var(--theme-ui-colors-modes-dark-whitesmoke,#15202b);--theme-ui-colors-grayLight:var(--theme-ui-colors-modes-dark-grayLight,#15202b);--theme-ui-colors-blackLight:var(--theme-ui-colors-modes-dark-blackLight,#fff);--theme-ui-colors-blackDeep:var(--theme-ui-colors-modes-dark-blackDeep,#fff);--theme-ui-colors-black:var(--theme-ui-colors-modes-dark-black,#fff);}&lt;/style&gt;&lt;style data-emotion-css=&quot;1w4nyi6&quot;&gt;*{box-sizing:border-box;}body{margin:0;font-family:&quot;PingFang SC&quot;,system-ui,sans-serif;line-height:1.5;font-weight:400;color:var(--theme-ui-colors-text,#555);background-color:var(--theme-ui-colors-background,#eee);word-wrap:break-word;}&lt;/style&gt;&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;
      &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom:32.22222222222222%;position:relative;bottom:0;left:0;background-image:url(&amp;#x27;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAIAAABM9SnKAAAACXBIWXMAAAsSAAALEgHS3X78AAABYklEQVQY02P4////n3//gGTTjfcMc647bn8IZP/98xtEfn71rMvpXpbU16uHgNyff34CySnPDjNsjTI/2vr77x+GmbfeJZ94PvPhF9PdD6L33pNbcffjxw+vlxR/Pb/l7dKCp6tqb5WZ/9q9cO2nu7EXZi96fcb0VGfa2Xk829Jfff/IMOvaW/d1lxkmnIjc82jljbdMk69ee/Ti7dKqC5XO1xMlPl3cf7cl+NOcqpVvLvvu72BYFuh+tG3Tk7MMK0MvvLvPsPnOe91ZZ7ZfeRiy8SZj51mGimO77399Mzn9yqzaF8e2XMswPOfF/6Q6/Ni7uxprs7ZcO5x8dDLDEj+GmQ7Lb+1jePv15+XnH/+DwN/2fXfTVl15//33t8e3fn56DxT69Oj2tdaUN0e3f/3359zLm2Bl/6eeX5u4s/3F5zcMQA4wuH7//ffn339k8O/f339//0BkoSKgoP0LRHA1ACvXEuYdYDI2AAAAAElFTkSuQmCC&amp;#x27;);background-size:cover;display:block&quot;&gt;&lt;/span&gt;
  &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;Preview of Visual Studio Code icon&quot; title=&quot;Preview of Visual Studio Code icon&quot; src=&quot;/static/7f3476df81c87c6a5583c8c061a52371/37523/vscode.png&quot; srcSet=&quot;/static/7f3476df81c87c6a5583c8c061a52371/e9ff0/vscode.png 180w,/static/7f3476df81c87c6a5583c8c061a52371/f21e7/vscode.png 360w,/static/7f3476df81c87c6a5583c8c061a52371/37523/vscode.png 720w,/static/7f3476df81c87c6a5583c8c061a52371/d48f1/vscode.png 796w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot;/&gt;
    &lt;/span&gt;&lt;/p&gt;&lt;p&gt;Icon created for &lt;a href=&quot;https://code.visualstudio.com&quot;&gt;Visual Studio Code&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Reference &lt;a href=&quot;https://github.com/iiroj/public/tree/master/Visual%20Studio%20Code%20icon&quot;&gt;iiroj/public&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;download&quot;&gt;Download&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/Raincal/vscode-icon&quot;&gt;Raincal/vscode-icon&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[使用 Docker 部署 FlarumChina]]></title><description><![CDATA[前期准备 服务器安装 Docker 和 Docker Compose 参考教程：
 http://get.daocloud.io/#install-docker 没有服务器的可以在本地安装 Docker 或使用 DaoCloud 的胶囊主机, 能免费体验 12…]]></description><link>https://raincal.com/post/deploy-flarumchina-with-docker</link><guid isPermaLink="false">https://raincal.com/post/deploy-flarumchina-with-docker</guid><pubDate>Mon, 07 Aug 2017 00:00:00 GMT</pubDate><content:encoded>&lt;style data-emotion-css=&quot;afj4f8&quot;&gt;body{--theme-ui-colors-prism-token:var(--theme-ui-colors-prism-token,#fff);--theme-ui-colors-prism-languageJavascript:var(--theme-ui-colors-prism-languageJavascript,#e8696b);--theme-ui-colors-prism-javascript:var(--theme-ui-colors-prism-javascript,#e8696b);--theme-ui-colors-prism-background:var(--theme-ui-colors-prism-background,#292c34);--theme-ui-colors-prism-comment:var(--theme-ui-colors-prism-comment,#999999);--theme-ui-colors-prism-string:var(--theme-ui-colors-prism-string,#8dc891);--theme-ui-colors-prism-var:var(--theme-ui-colors-prism-var,#b3bac5);--theme-ui-colors-prism-number:var(--theme-ui-colors-prism-number,#e4854d);--theme-ui-colors-prism-constant:var(--theme-ui-colors-prism-constant,#b3bac5);--theme-ui-colors-prism-plain:var(--theme-ui-colors-prism-plain,#fff);--theme-ui-colors-prism-doctype:var(--theme-ui-colors-prism-doctype,#e8696b);--theme-ui-colors-prism-tag:var(--theme-ui-colors-prism-tag,#fc929e);--theme-ui-colors-prism-keyword:var(--theme-ui-colors-prism-keyword,#c5a5c5);--theme-ui-colors-prism-boolean:var(--theme-ui-colors-prism-boolean,#ff8b50);--theme-ui-colors-prism-function:var(--theme-ui-colors-prism-function,#79b6f2);--theme-ui-colors-prism-parameter:var(--theme-ui-colors-prism-parameter,#F9965D);--theme-ui-colors-prism-className:var(--theme-ui-colors-prism-className,#FAC863);--theme-ui-colors-prism-attrName:var(--theme-ui-colors-prism-attrName,#bf87ba);--theme-ui-colors-prism-attrValue:var(--theme-ui-colors-prism-attrValue,#a8e2a8);--theme-ui-colors-prism-interpolation:var(--theme-ui-colors-prism-interpolation,#fff);--theme-ui-colors-prism-punctuation:var(--theme-ui-colors-prism-punctuation,#5FB3B3);--theme-ui-colors-prism-maybe-class-name:var(--theme-ui-colors-prism-maybe-class-name,#fff);--theme-ui-colors-prism-property:var(--theme-ui-colors-prism-property,#80cbc4);--theme-ui-colors-prism-namespace:var(--theme-ui-colors-prism-namespace,#b2ccd6);--theme-ui-colors-prism-highlight:var(--theme-ui-colors-prism-highlight,rgba(255,255,255,0.07));--theme-ui-colors-prism-highlightBorder:var(--theme-ui-colors-prism-highlightBorder,#e1bde2);--theme-ui-colors-prism-dom:var(--theme-ui-colors-prism-dom,#5F8DC3);--theme-ui-colors-prism-operator:var(--theme-ui-colors-prism-operator,#fc929e);--theme-ui-colors-text:var(--theme-ui-colors-text,#555);--theme-ui-colors-background:var(--theme-ui-colors-background,#eee);--theme-ui-colors-primary:var(--theme-ui-colors-primary,#667eea);--theme-ui-colors-muted:var(--theme-ui-colors-muted,#999);--theme-ui-colors-header:var(--theme-ui-colors-header,#222);--theme-ui-colors-headerDark:var(--theme-ui-colors-headerDark,#131d27);--theme-ui-colors-card:var(--theme-ui-colors-card,#fff);--theme-ui-colors-table:var(--theme-ui-colors-table,#f9f9f9);--theme-ui-colors-whitesmoke:var(--theme-ui-colors-whitesmoke,#f5f5f5);--theme-ui-colors-gainsboro:var(--theme-ui-colors-gainsboro,#eee);--theme-ui-colors-gray:var(--theme-ui-colors-gray,#bbb);--theme-ui-colors-grayLight:var(--theme-ui-colors-grayLight,#ccc);--theme-ui-colors-grayLighter:var(--theme-ui-colors-grayLighter,#ddd);--theme-ui-colors-grayDim:var(--theme-ui-colors-grayDim,#666);--theme-ui-colors-blackLight:var(--theme-ui-colors-blackLight,#555);--theme-ui-colors-blackDim:var(--theme-ui-colors-blackDim,#333);--theme-ui-colors-blackDeep:var(--theme-ui-colors-blackDeep,#222);--theme-ui-colors-black:var(--theme-ui-colors-black,#000);--theme-ui-colors-red:var(--theme-ui-colors-red,#ff2a2a);--theme-ui-colors-blueBright:var(--theme-ui-colors-blueBright,#87daff);--theme-ui-colors-blue:var(--theme-ui-colors-blue,#0684bd);--theme-ui-colors-blueDeep:var(--theme-ui-colors-blueDeep,#262a30);--theme-ui-colors-orange:var(--theme-ui-colors-orange,#fc6423);--theme-ui-colors-orangeDark:var(--theme-ui-colors-orangeDark,#e34603);color:var(--theme-ui-colors-text,#555);background-color:var(--theme-ui-colors-background,#eee);}body.theme-ui-dark{--theme-ui-colors-text:var(--theme-ui-colors-modes-dark-text,#fff);--theme-ui-colors-background:var(--theme-ui-colors-modes-dark-background,#15202b);--theme-ui-colors-primary:var(--theme-ui-colors-modes-dark-primary,#0cf);--theme-ui-colors-header:var(--theme-ui-colors-modes-dark-header,#192734);--theme-ui-colors-card:var(--theme-ui-colors-modes-dark-card,#192734);--theme-ui-colors-table:var(--theme-ui-colors-modes-dark-table,#15202b);--theme-ui-colors-whitesmoke:var(--theme-ui-colors-modes-dark-whitesmoke,#15202b);--theme-ui-colors-grayLight:var(--theme-ui-colors-modes-dark-grayLight,#15202b);--theme-ui-colors-blackLight:var(--theme-ui-colors-modes-dark-blackLight,#fff);--theme-ui-colors-blackDeep:var(--theme-ui-colors-modes-dark-blackDeep,#fff);--theme-ui-colors-black:var(--theme-ui-colors-modes-dark-black,#fff);}&lt;/style&gt;&lt;style data-emotion-css=&quot;1w4nyi6&quot;&gt;*{box-sizing:border-box;}body{margin:0;font-family:&quot;PingFang SC&quot;,system-ui,sans-serif;line-height:1.5;font-weight:400;color:var(--theme-ui-colors-text,#555);background-color:var(--theme-ui-colors-background,#eee);word-wrap:break-word;}&lt;/style&gt;&lt;h2 id=&quot;前期准备&quot;&gt;前期准备&lt;/h2&gt;&lt;p&gt;服务器安装 Docker 和 Docker Compose&lt;/p&gt;&lt;p&gt;参考教程：
&lt;a href=&quot;http://get.daocloud.io/#install-docker&quot;&gt;http://get.daocloud.io/#install-docker&lt;/a&gt;&lt;/p&gt;&lt;p&gt;没有服务器的可以在本地安装 Docker 或使用 DaoCloud 的胶囊主机, 能免费体验 120 分钟，足够学习使用&lt;/p&gt;&lt;p&gt;路径：自有主机 -&amp;gt; 集群管理 -&amp;gt; 添加主机&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;
      &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom:58.333333333333336%;position:relative;bottom:0;left:0;background-image:url(&amp;#x27;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsSAAALEgHS3X78AAABfklEQVQoz5WR3W7UQAyF9/0fgQskBJdIXPEISFBVSIsQUkvp7nYTyO4mm2T+Yo89Nk4oFYhyUeuLZzLRcU5OVpgzAEwTcCn6lAKkVVU3t5vt9ddvx1NLRDYL7co4IU1ACXKcMsxH9pDyfZGIYKYVAnTd2fkQYhxtidG23vsMUSjR5I1xHMN8OOPm7pkZM6+IeRhdP4xgd0ViSjaAiV6v9fkHfXmpry4l839s28JczFQmJi5mZp7C/KWRj3tZV/KpLmxpiIqhS5ff4t2+3u22V1fXVV0/OTBmaV3pggxJjkGPXh0osU6kKeuU543ZRvoLFkUTU9HqTPsOv5/x5ke4a/HkyCUaI/nEQ8hnBy5xQn0goppqTtu+J8M09u3h1N7Vx6rpbjb17f6wb/r6MLRDalp/6pOHEmeZGAHFrC2/ivTtZ3rxHi82lLD0gYfIYyoLHEyQ1boHecDBnP8iZnmzpmfv6GJbkCSA/vmGAI9g+nvbv3JfSkr5B3kcU1naPwEl9rXCXIF7UwAAAABJRU5ErkJggg==&amp;#x27;);background-size:cover;display:block&quot;&gt;&lt;/span&gt;
  &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;深度截图_选择区域_20170807083400&quot; title=&quot;深度截图_选择区域_20170807083400&quot; src=&quot;/static/7c2d77b8e89cbef6b1236d62ccff8fa9/37523/pic01.png&quot; srcSet=&quot;/static/7c2d77b8e89cbef6b1236d62ccff8fa9/e9ff0/pic01.png 180w,/static/7c2d77b8e89cbef6b1236d62ccff8fa9/f21e7/pic01.png 360w,/static/7c2d77b8e89cbef6b1236d62ccff8fa9/37523/pic01.png 720w,/static/7c2d77b8e89cbef6b1236d62ccff8fa9/63ec5/pic01.png 812w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot;/&gt;
    &lt;/span&gt;&lt;/p&gt;&lt;h2 id=&quot;安装-flarum&quot;&gt;安装 Flarum&lt;/h2&gt;&lt;p&gt;我们使用到的镜像是 &lt;a href=&quot;https://github.com/Raincal/docker-flarum-china&quot;&gt;raincal/docker-flarum-china&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;ports&quot;&gt;Ports&lt;/h3&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;8888&lt;/code&gt;&lt;/p&gt;&lt;h3 id=&quot;volume&quot;&gt;Volume&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;/flarum/app/assets : FlarumChina 资源目录&lt;/li&gt;&lt;li&gt;/flarum/app/extensions : FlarumChina 插件目录&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;环境变量&quot;&gt;环境变量&lt;/h3&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;变量&lt;/th&gt;&lt;th&gt;描述&lt;/th&gt;&lt;th&gt;类型&lt;/th&gt;&lt;th&gt;默认值&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;UID&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Flarum user id&lt;/td&gt;&lt;td&gt;&lt;em&gt;optional&lt;/em&gt;&lt;/td&gt;&lt;td&gt;991&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;GID&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Flarum group id&lt;/td&gt;&lt;td&gt;&lt;em&gt;optional&lt;/em&gt;&lt;/td&gt;&lt;td&gt;991&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;DEBUG&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Flarum debug mode&lt;/td&gt;&lt;td&gt;&lt;em&gt;optional&lt;/em&gt;&lt;/td&gt;&lt;td&gt;false&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;FORUM_URL&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Forum URL&lt;/td&gt;&lt;td&gt;&lt;strong&gt;required&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;none&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;DB_HOST&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;MariaDB instance ip/hostname&lt;/td&gt;&lt;td&gt;&lt;em&gt;optional&lt;/em&gt;&lt;/td&gt;&lt;td&gt;mariadb&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;DB_USER&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;MariaDB database username&lt;/td&gt;&lt;td&gt;&lt;em&gt;optional&lt;/em&gt;&lt;/td&gt;&lt;td&gt;flarum&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;DB_NAME&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;MariaDB database name&lt;/td&gt;&lt;td&gt;&lt;em&gt;optional&lt;/em&gt;&lt;/td&gt;&lt;td&gt;flarum&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;DB_PASS&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;MariaDB database password&lt;/td&gt;&lt;td&gt;&lt;strong&gt;required&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;none&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;DB_PREF&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Flarum tables prefix&lt;/td&gt;&lt;td&gt;&lt;em&gt;optional&lt;/em&gt;&lt;/td&gt;&lt;td&gt;none&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;UPLOAD_MAX_SIZE&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;The maximum size of an uploaded file&lt;/td&gt;&lt;td&gt;&lt;em&gt;optional&lt;/em&gt;&lt;/td&gt;&lt;td&gt;50M&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;MEMORY_LIMIT&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;maximum amount of memory used by php&lt;/td&gt;&lt;td&gt;&lt;em&gt;optional&lt;/em&gt;&lt;/td&gt;&lt;td&gt;128M&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h3 id=&quot;编写-docker-composeyml-文件&quot;&gt;编写 docker-compose.yml 文件&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; flarum &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; flarum
&lt;span class=&quot;token function&quot;&gt;vi&lt;/span&gt; docker-compose.yml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;根据自身情况 修改&lt;/p&gt;&lt;p&gt;FORUM_URL&lt;/p&gt;&lt;p&gt;DB_PASS&lt;/p&gt;&lt;p&gt;MYSQL_ROOT_PASSWORD&lt;/p&gt;&lt;p&gt;MYSQL_PASSWORD&lt;/p&gt;&lt;p&gt;等环境变量&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;yaml&quot;&gt;&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;flarum&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; raincal/docker&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;flarum&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;china&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;0.1.0&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;beta.7&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;stable
  &lt;span class=&quot;token key atrule&quot;&gt;container_name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; flarum
  &lt;span class=&quot;token key atrule&quot;&gt;links&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; mariadb&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;mariadb
  &lt;span class=&quot;token key atrule&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; FORUM_URL=https&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;//forum.domain.tld
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; DB_PASS=123456
  &lt;span class=&quot;token key atrule&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; /mnt/docker/flarum/assets&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;/flarum/app/assets
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; /mnt/docker/flarum/extensions&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;/flarum/app/extensions

&lt;span class=&quot;token key atrule&quot;&gt;mariadb&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; mariadb&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10.1&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;container_name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; mariadb
  &lt;span class=&quot;token key atrule&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; /mnt/docker/mysql/db&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;/var/lib/mysql
  &lt;span class=&quot;token key atrule&quot;&gt;environment&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; MYSQL_ROOT_PASSWORD=123456
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; MYSQL_DATABASE=flarum
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; MYSQL_USER=flarum
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; MYSQL_PASSWORD=123456

&lt;span class=&quot;token key atrule&quot;&gt;nginx&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; wonderfall/boring&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;nginx
  &lt;span class=&quot;token key atrule&quot;&gt;container_name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; nginx
  &lt;span class=&quot;token key atrule&quot;&gt;links&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; flarum&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;flarum
  &lt;span class=&quot;token key atrule&quot;&gt;ports&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;quot;80:8000&amp;quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;quot;443:4430&amp;quot;&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;volumes&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; /mnt/docker/nginx/sites&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;enabled&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;/sites&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt;enabled
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; /mnt/docker/nginx/conf&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;/conf.d
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; /mnt/docker/nginx/log&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;/var/log/nginx
    &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; /mnt/docker/nginx/certs&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;/certs&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;启动应用&quot;&gt;启动应用&lt;/h3&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;docker-compose up -d&lt;/code&gt;&lt;/p&gt;&lt;p&gt;若使用胶囊主机，可以到 自有主机 -&amp;gt; Stack -&amp;gt; 创建新 Stack&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;
      &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom:43.888888888888886%;position:relative;bottom:0;left:0;background-image:url(&amp;#x27;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAA/UlEQVQoz2P4+fPnr1+//pMC/v2DIoZv374D+etWr05LSCwuyCvKzynIySrMzQaSORlpyCgvKyMpLmblsqVA9X///gWSDBBrS4qLGRgY+NjZGHADFhYWIJmRng5U/+fPH5Dm379BmmurKnjZWLRUFKXFhGXERSSFBYR4OAW42JGRCB83UHNFaTFCM8Tm0pISoAQb2Gz8NmdmZiA0Q6idu3ZXVdR0dXa2NDc31Nc3NgBRQ1NjIzJqaGgsLa9ctnwlOMz+gZ3989e/P//+kwUYPvz8+vLnh+8/fnz+/PXLl6/AwP8NBr9A4DcmgLgUqvns57vLXx7+8w8U9KQ6AADbAm0TYUBHPgAAAABJRU5ErkJggg==&amp;#x27;);background-size:cover;display:block&quot;&gt;&lt;/span&gt;
  &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;深度截图_选择区域_20170807084450&quot; title=&quot;深度截图_选择区域_20170807084450&quot; src=&quot;/static/8465218cc652ec0fab9b0dbb96b93448/37523/pic02.png&quot; srcSet=&quot;/static/8465218cc652ec0fab9b0dbb96b93448/e9ff0/pic02.png 180w,/static/8465218cc652ec0fab9b0dbb96b93448/f21e7/pic02.png 360w,/static/8465218cc652ec0fab9b0dbb96b93448/37523/pic02.png 720w,/static/8465218cc652ec0fab9b0dbb96b93448/302a4/pic02.png 1080w,/static/8465218cc652ec0fab9b0dbb96b93448/07a9c/pic02.png 1440w,/static/8465218cc652ec0fab9b0dbb96b93448/bd44e/pic02.png 1643w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot;/&gt;
    &lt;/span&gt;&lt;/p&gt;&lt;h3 id=&quot;设置-nginx-反向代理&quot;&gt;设置 nginx 反向代理&lt;/h3&gt;&lt;p&gt;通过 ssh 连接到胶囊主机&lt;/p&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;ssh ubuntu@52.80.37.119&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:554px&quot;&gt;
      &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom:40%;position:relative;bottom:0;left:0;background-image:url(&amp;#x27;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAAA7EAAAOxAGVKw4bAAABL0lEQVQY03WQPUvFMBSG+8+cxFlwchBBFxfd5OIgiOjuoIOLu5Mi/gDF3c1R0bZpkqZJmrRpe2+S4+kF8Qreh+ScM7wv5yMBAF8V+u7avT5hbUwtRMU5KwrCkbLUSsUI/5J4o7L9VXK0Qc937eNNF4ASwihL0y/GWJblWuslXkialwdxNckO1orjTTJZnwUwzljoF0VxTpgTF8ZIho+3dG+Fnm7Tsx1xeeg8ZHlGBRelkKKqhKhNrZTWtcb5cal+GH7N+O3zfXGypW4vYmta13HGtFRM8dRQpkXwAZaNDX+vYa0hJFfalG2X24baXjfedLFuelwe+0splcIgh6EfO0Pw4P0YAWRVvX98FlwqiUorBAr1dOZDQMmcsQ6YcfkkLoBm59raum46nunnQVzCN+6gvuRQYuSBAAAAAElFTkSuQmCC&amp;#x27;);background-size:cover;display:block&quot;&gt;&lt;/span&gt;
  &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;深度截图_选择区域_20170807093749&quot; title=&quot;深度截图_选择区域_20170807093749&quot; src=&quot;/static/fb85222819e683c9f0698f7068659400/04abd/pic03.png&quot; srcSet=&quot;/static/fb85222819e683c9f0698f7068659400/e9ff0/pic03.png 180w,/static/fb85222819e683c9f0698f7068659400/f21e7/pic03.png 360w,/static/fb85222819e683c9f0698f7068659400/04abd/pic03.png 554w&quot; sizes=&quot;(max-width: 554px) 100vw, 554px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot;/&gt;
    &lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;docker &lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; -it nginx ngxproxy

Welcome to ngxproxy utility.
We&amp;#x27;re about to create a new virtual &lt;span class=&quot;token function&quot;&gt;host&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;AKA server block&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;.

Name: flarum
Domain: forum.domain.tld
Webroot &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;default is /&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;:
Container: flarum
Port &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;default is &lt;span class=&quot;token number&quot;&gt;80&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;: &lt;span class=&quot;token number&quot;&gt;8888&lt;/span&gt;
HTTPS &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;y/n&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;: n
Max body size &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; MB &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;integer/null&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;: &lt;span class=&quot;token number&quot;&gt;50&lt;/span&gt;

Done&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt; flarum.conf has been generated.
Reload nginx now? &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;y/n&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;: y
nginx successfully reloaded.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;完成后访问外网IP 52.80.37.119，本地环境的话访问 localhost 开始安装 flarum&lt;/p&gt;&lt;p&gt;&lt;strong&gt;管理员密码需要大于8位&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:540px&quot;&gt;
      &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom:175%;position:relative;bottom:0;left:0;background-image:url(&amp;#x27;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAjCAYAAACU9ioYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE6UlEQVRIx62WS28cRRDH90tw58pX4MARcYI7F+ACnCI+ARK5ROQSgiIEikRCHiY8EgiJvbv2xo5NUAh+JCEPxfEjXnu93ufsvHp6pufxz797dpe1vYlyYKSfarq6qrp6p6q3C+g/WZoYKf76Ge1j78ItfgOv/C3End8RN9bhz5+HO3kS3vR3cKdOwZ89C/lwbuibZZl5LwwDJrGR9oXj2HrnNdg/HIXz4zF4U6chFn5F58sP0Dn+IaxTR9D96lM0jrwJb/L00PdwwL4iqtVgz84hdS1ET1Yg5q7AL16Af/3sUHrXzkD+U0H0eLGfYXo44GhQ845Xe0Z9TECtGDJYLUm0JeI4hooTxP3xaJBBVqMcyvDgs16tY/nBGmqNDta36tiut8z7wDkbk63JUGcQJ2kumZHOKuE4kBEcT0CGCp6QBilDvY08w/5uMhUhi1WeYUplzxWwvQDNroN2z0OHaJ1DneX4aFBvbHwJ33WR9hpILNJr5rRrHO+ZjAv4P59MZ5g1EGfL5D65B0WiNJdSLSOMVxBEy4iSu2Z+PNp3BQlqKCRYQ5RdJSUoFOFFU2h7kxBxEbXmBDa2z2GT1NuXaFNERJuhHFIi1xDjof4oHlLskj1DRmDe65RN0jIyQyO3yepmbj97/RgOt8wXld1GmC6RRQTxIiRR2RJEdBuOuAUR3ubqS9QtUpKBHMI53OGWq3rL6wiz63DkDNywjK5fhiXKkOkMv+5lbO5MoGldoRNbLZvm1sYxQ6Zo85gBs2eMPs3Vb9JhzhCmcxzPMdsKZHKDhjfNWOFF3DRBE6zqgJtUlOCrWWZZQS+ooONVGHQW9dYVVOu/MPAMbWa52A3KcXAOZQZ8kmeot6IwP8xwNNODunHku6sgyVbzslH85HrbbliCQ2xZ5O9axm7rEqq7F7lt/fuUzU7Go+euM8NHKESxBVeuwQs3ycYhXLkxVr+fTRNDqjYKIkzQshW6jsJeV2KnJbDd0P0bot6RRtfh3MvoujG292xYdoBCEGqlgOVJEnCSB0Kfrrt//ELo16H0eToVhFRo2wK7bQdbexa2mzbpMTOeOk6ANhd7FVqM4QUMGKkMrmDTiIRHWMwjKkePvSB9ZVzah1HKXkaXPfiErPdZG5JkT9lmT/fpxqP9VtnvLV2HuvXysrFlCS23iJ4osfWmsdO4hGc7FxEk+oQp065k5GHYftkkF3+kA26ZolTZAuW8QRe5GkgSY4E1tmDkcO4Auov0jszhoMxZNs32K/FwKLIF88Kut37Cs9oFbFTPmQKv1if4AS8z+PRIQZfzs2BQ2CppMtBdBOoB/Og/BMeOuMsPtIKexls27668Z2yF+tfYDAji+1DJ7qCwI9ZbxNVDVBsuy8blkSUNux3B8olYazFtlEGPR9E6U9gsn35hB6awdRG3bN/U5aCo9VzXfTmWK42Pr+tQMGDLHjhKtpvH9nPQ6glT3LrQG5Zvxs2eXiy3HUX71ZqW+astyCg22dl+aNAraUe9siMi/utlUCkQEy09dlaP9j3aGryBn88CD198WdKPZbsozS+h/OcKSgvLhka7d/hiNfJeOHjZ0TJJ8svnraVHeP2tj/Dex0fx/mfH8cbbn+CPyt9mTl9VRoMNYhQO3qA0+nqin83tPXx+4jxOfP8bTp65ii++nsDD1S0zl465fWmeA0nKS4KN50ZfAAAAAElFTkSuQmCC&amp;#x27;);background-size:cover;display:block&quot;&gt;&lt;/span&gt;
  &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;screencapture-joudo-tk-1502095912645imgurl&quot; title=&quot;screencapture-joudo-tk-1502095912645imgurl&quot; src=&quot;/static/db1e01e4eeacaf107b21d5036725e6b6/07484/pic04.png&quot; srcSet=&quot;/static/db1e01e4eeacaf107b21d5036725e6b6/e9ff0/pic04.png 180w,/static/db1e01e4eeacaf107b21d5036725e6b6/f21e7/pic04.png 360w,/static/db1e01e4eeacaf107b21d5036725e6b6/07484/pic04.png 540w&quot; sizes=&quot;(max-width: 540px) 100vw, 540px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot;/&gt;
    &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;gatsby-resp-image-wrapper&quot; style=&quot;position:relative;display:block;margin-left:auto;margin-right:auto;max-width:720px&quot;&gt;
      &lt;span class=&quot;gatsby-resp-image-background-image&quot; style=&quot;padding-bottom:40%;position:relative;bottom:0;left:0;background-image:url(&amp;#x27;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAABGElEQVQoz22R226DMAyG8/5vsifYdr1eVJp2se6m6lTaig4o5QwhB0L+JaRUBWrpkwP+HTs2ablEUTMw4/teQ6l+gv2ntYaQCuG1RBAXSAqK0uRQJsCYRN40yFiFrutBoqQ2wuqO/bZcUscpyHD8S+GHOfwod7GbZjxbwsTlk2tuq3EUFUdesUF0vhTw/GS46PcUY+tF2B1jc75i76e3WLZoZLjwcE6w+tph/b3H588BtBVIzZOqhsGOw47i0Q8wBxPdndLoa8pBtl6Al9c13j42eF9tzBwUspJCGj81/cDSmpYPRUmnFLiQT0V2GSNSSghhEaZoN4lZRiMNNU8z2+q12/BcNE+YF5wXJ5zzSYfPRPNuHUu9tX9ikmrJl5p5ggAAAABJRU5ErkJggg==&amp;#x27;);background-size:cover;display:block&quot;&gt;&lt;/span&gt;
  &lt;img class=&quot;gatsby-resp-image-image&quot; alt=&quot;screencapture-54-222-128-207-1502096436141&quot; title=&quot;screencapture-54-222-128-207-1502096436141&quot; src=&quot;/static/9e782aaa44a7cd10ea82adf56cc731f7/37523/pic05.png&quot; srcSet=&quot;/static/9e782aaa44a7cd10ea82adf56cc731f7/e9ff0/pic05.png 180w,/static/9e782aaa44a7cd10ea82adf56cc731f7/f21e7/pic05.png 360w,/static/9e782aaa44a7cd10ea82adf56cc731f7/37523/pic05.png 720w,/static/9e782aaa44a7cd10ea82adf56cc731f7/302a4/pic05.png 1080w,/static/9e782aaa44a7cd10ea82adf56cc731f7/d56e1/pic05.png 1130w&quot; sizes=&quot;(max-width: 720px) 100vw, 720px&quot; style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0&quot; loading=&quot;lazy&quot;/&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[10 个可用 ES6 替代的 Lodash 特性]]></title><description><![CDATA[本文转载自： 众成翻译 
译者： 少年阿布 DX 
链接： http://www.zcfy.cc/article/467 
原文： https://www.sitepoint.com/lodash-features-replace-es6/ Dan Prince…]]></description><link>https://raincal.com/post/lodash</link><guid isPermaLink="false">https://raincal.com/post/lodash</guid><pubDate>Thu, 30 Jun 2016 00:00:00 GMT</pubDate><content:encoded>&lt;style data-emotion-css=&quot;afj4f8&quot;&gt;body{--theme-ui-colors-prism-token:var(--theme-ui-colors-prism-token,#fff);--theme-ui-colors-prism-languageJavascript:var(--theme-ui-colors-prism-languageJavascript,#e8696b);--theme-ui-colors-prism-javascript:var(--theme-ui-colors-prism-javascript,#e8696b);--theme-ui-colors-prism-background:var(--theme-ui-colors-prism-background,#292c34);--theme-ui-colors-prism-comment:var(--theme-ui-colors-prism-comment,#999999);--theme-ui-colors-prism-string:var(--theme-ui-colors-prism-string,#8dc891);--theme-ui-colors-prism-var:var(--theme-ui-colors-prism-var,#b3bac5);--theme-ui-colors-prism-number:var(--theme-ui-colors-prism-number,#e4854d);--theme-ui-colors-prism-constant:var(--theme-ui-colors-prism-constant,#b3bac5);--theme-ui-colors-prism-plain:var(--theme-ui-colors-prism-plain,#fff);--theme-ui-colors-prism-doctype:var(--theme-ui-colors-prism-doctype,#e8696b);--theme-ui-colors-prism-tag:var(--theme-ui-colors-prism-tag,#fc929e);--theme-ui-colors-prism-keyword:var(--theme-ui-colors-prism-keyword,#c5a5c5);--theme-ui-colors-prism-boolean:var(--theme-ui-colors-prism-boolean,#ff8b50);--theme-ui-colors-prism-function:var(--theme-ui-colors-prism-function,#79b6f2);--theme-ui-colors-prism-parameter:var(--theme-ui-colors-prism-parameter,#F9965D);--theme-ui-colors-prism-className:var(--theme-ui-colors-prism-className,#FAC863);--theme-ui-colors-prism-attrName:var(--theme-ui-colors-prism-attrName,#bf87ba);--theme-ui-colors-prism-attrValue:var(--theme-ui-colors-prism-attrValue,#a8e2a8);--theme-ui-colors-prism-interpolation:var(--theme-ui-colors-prism-interpolation,#fff);--theme-ui-colors-prism-punctuation:var(--theme-ui-colors-prism-punctuation,#5FB3B3);--theme-ui-colors-prism-maybe-class-name:var(--theme-ui-colors-prism-maybe-class-name,#fff);--theme-ui-colors-prism-property:var(--theme-ui-colors-prism-property,#80cbc4);--theme-ui-colors-prism-namespace:var(--theme-ui-colors-prism-namespace,#b2ccd6);--theme-ui-colors-prism-highlight:var(--theme-ui-colors-prism-highlight,rgba(255,255,255,0.07));--theme-ui-colors-prism-highlightBorder:var(--theme-ui-colors-prism-highlightBorder,#e1bde2);--theme-ui-colors-prism-dom:var(--theme-ui-colors-prism-dom,#5F8DC3);--theme-ui-colors-prism-operator:var(--theme-ui-colors-prism-operator,#fc929e);--theme-ui-colors-text:var(--theme-ui-colors-text,#555);--theme-ui-colors-background:var(--theme-ui-colors-background,#eee);--theme-ui-colors-primary:var(--theme-ui-colors-primary,#667eea);--theme-ui-colors-muted:var(--theme-ui-colors-muted,#999);--theme-ui-colors-header:var(--theme-ui-colors-header,#222);--theme-ui-colors-headerDark:var(--theme-ui-colors-headerDark,#131d27);--theme-ui-colors-card:var(--theme-ui-colors-card,#fff);--theme-ui-colors-table:var(--theme-ui-colors-table,#f9f9f9);--theme-ui-colors-whitesmoke:var(--theme-ui-colors-whitesmoke,#f5f5f5);--theme-ui-colors-gainsboro:var(--theme-ui-colors-gainsboro,#eee);--theme-ui-colors-gray:var(--theme-ui-colors-gray,#bbb);--theme-ui-colors-grayLight:var(--theme-ui-colors-grayLight,#ccc);--theme-ui-colors-grayLighter:var(--theme-ui-colors-grayLighter,#ddd);--theme-ui-colors-grayDim:var(--theme-ui-colors-grayDim,#666);--theme-ui-colors-blackLight:var(--theme-ui-colors-blackLight,#555);--theme-ui-colors-blackDim:var(--theme-ui-colors-blackDim,#333);--theme-ui-colors-blackDeep:var(--theme-ui-colors-blackDeep,#222);--theme-ui-colors-black:var(--theme-ui-colors-black,#000);--theme-ui-colors-red:var(--theme-ui-colors-red,#ff2a2a);--theme-ui-colors-blueBright:var(--theme-ui-colors-blueBright,#87daff);--theme-ui-colors-blue:var(--theme-ui-colors-blue,#0684bd);--theme-ui-colors-blueDeep:var(--theme-ui-colors-blueDeep,#262a30);--theme-ui-colors-orange:var(--theme-ui-colors-orange,#fc6423);--theme-ui-colors-orangeDark:var(--theme-ui-colors-orangeDark,#e34603);color:var(--theme-ui-colors-text,#555);background-color:var(--theme-ui-colors-background,#eee);}body.theme-ui-dark{--theme-ui-colors-text:var(--theme-ui-colors-modes-dark-text,#fff);--theme-ui-colors-background:var(--theme-ui-colors-modes-dark-background,#15202b);--theme-ui-colors-primary:var(--theme-ui-colors-modes-dark-primary,#0cf);--theme-ui-colors-header:var(--theme-ui-colors-modes-dark-header,#192734);--theme-ui-colors-card:var(--theme-ui-colors-modes-dark-card,#192734);--theme-ui-colors-table:var(--theme-ui-colors-modes-dark-table,#15202b);--theme-ui-colors-whitesmoke:var(--theme-ui-colors-modes-dark-whitesmoke,#15202b);--theme-ui-colors-grayLight:var(--theme-ui-colors-modes-dark-grayLight,#15202b);--theme-ui-colors-blackLight:var(--theme-ui-colors-modes-dark-blackLight,#fff);--theme-ui-colors-blackDeep:var(--theme-ui-colors-modes-dark-blackDeep,#fff);--theme-ui-colors-black:var(--theme-ui-colors-modes-dark-black,#fff);}&lt;/style&gt;&lt;style data-emotion-css=&quot;1w4nyi6&quot;&gt;*{box-sizing:border-box;}body{margin:0;font-family:&quot;PingFang SC&quot;,system-ui,sans-serif;line-height:1.5;font-weight:400;color:var(--theme-ui-colors-text,#555);background-color:var(--theme-ui-colors-background,#eee);word-wrap:break-word;}&lt;/style&gt;&lt;blockquote&gt;&lt;p&gt;本文转载自：&lt;a href=&quot;http://www.zcfy.cc&quot;&gt;众成翻译&lt;/a&gt;
译者：&lt;a href=&quot;http://www.zcfy.cc/@shawndai06&quot;&gt;少年阿布 DX&lt;/a&gt;
链接：&lt;a href=&quot;http://www.zcfy.cc/article/467&quot;&gt;http://www.zcfy.cc/article/467&lt;/a&gt;
原文：&lt;a href=&quot;https://www.sitepoint.com/lodash-features-replace-es6/&quot;&gt;https://www.sitepoint.com/lodash-features-replace-es6/&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://www.sitepoint.com/author/dprince/&quot;&gt;Dan Prince&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;本文由 &lt;a href=&quot;https://www.sitepoint.com/author/mbrown&quot;&gt;Mark Brown&lt;/a&gt; 协助审查。感谢所有 SitePoint 的审稿人使 SitePoint 的内容能达到最佳&lt;/em&gt;。&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lodash.com/&quot;&gt;Lodash&lt;/a&gt; 现在是 npm 上&lt;a href=&quot;https://www.npmjs.com/browse/depended&quot;&gt;被依赖最多的包&lt;/a&gt;，但如果你在使用 ES6 的话，实际上你可能不再需要它了。在本文中，我们将使用原生的集合方法与箭头函数还有一些其它新的特性来帮我们更简便地实现许多热门的用例。&lt;/p&gt;&lt;h2 id=&quot;1-map-filter-reduce&quot;&gt;1. Map, Filter, Reduce&lt;/h2&gt;&lt;p&gt;这些集合方法使数据转化变得轻而易举。由于普遍地对此特性的支持，我们可以将它与箭头函数组合起来，以助我们使用比 Lodash 的实现更简便的方法来实现。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;_&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// [3, 6, 9]&lt;/span&gt;
_&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;total&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; n&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; total &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; n
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 6&lt;/span&gt;
_&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// [1, 2]&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 变为&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;total&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; n&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; total &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; n&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;不止于此，如果我们使用 ES6 的 polyfill，我们也能使用 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find&quot;&gt;find&lt;/a&gt;、&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some&quot;&gt;some&lt;/a&gt;、&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every&quot;&gt;every&lt;/a&gt; 和 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduceRight&quot;&gt;reduceRight&lt;/a&gt;&lt;/p&gt;&lt;h2 id=&quot;2-head--tail&quot;&gt;2. Head &amp;amp; Tail&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://www.sitepoint.com/preparing-ecmascript-6-destructuring-assignment/&quot;&gt;解构语法&lt;/a&gt; 让我们可以获取一个列表的头（head）和尾（tail），而无需工具函数。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;_&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 1&lt;/span&gt;
_&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;tail&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// [2, 3]&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 变为&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;head&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;tail&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;也可以用相似的方式获得列表最后一个元素（last）以及除其之外的元素（initial）&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;_&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;initial&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// -&amp;gt; [1, 2]&lt;/span&gt;
_&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;last&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 3&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 变为&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;last&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;initial&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reverse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果你讨厌 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse&quot;&gt;reverse&lt;/a&gt; 会改变数据结构，那你可以在调用 reverse 之前使用延展操作符（spread operator）来复制一个数组。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; xs &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;last&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;initial&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;xs&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reverse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;3-rest--spread&quot;&gt;3. Rest &amp;amp; Spread&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://lodash.com/docs#rest&quot;&gt;rest&lt;/a&gt; 和 &lt;a href=&quot;https://lodash.com/docs#spread&quot;&gt;spread&lt;/a&gt; 函数能让我们定义与调用能接受参数数量不定的函数。ES6 为这两种操作引入了专用的语法。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; say &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;rest&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;what&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; names&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; last &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;last&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;names&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; initial &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;initial&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;names&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; finalSeparator &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;names&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;, &amp;amp; &amp;#x27;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;&amp;#x27;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; what &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27; &amp;#x27;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; initial&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;, &amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; finalSeparator &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;last&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;names&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;say&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;hello&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;fred&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;barney&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;pebbles&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// &amp;quot;hello fred, barney, &amp;amp; pebbles&amp;quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 变为&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;say&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;what&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;names&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;last&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;initial&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; names&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reverse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; finalSeparator &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; names&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;, &amp;amp;&amp;#x27;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;&amp;#x27;&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;what&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;initial&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;, &amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;finalSeparator&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt; &lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;last&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;say&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;hello&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;fred&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;barney&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;pebbles&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// &amp;quot;hello fred, barney, &amp;amp; pebbles&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;4-curry&quot;&gt;4. Curry&lt;/h2&gt;&lt;p&gt;如果没有更高级的语言如 &lt;a href=&quot;http://www.typescriptlang.org&quot;&gt;TypeScript&lt;/a&gt; 和 &lt;a href=&quot;http://flowtype.org/&quot;&gt;Flow&lt;/a&gt; 的支持，我们不能给函数设置类型签名，这使得函数的&lt;a href=&quot;https://www.sitepoint.com/currying-in-functional-javascript/&quot;&gt;柯里化&lt;/a&gt;（currying）非常困难。当我们接收一个柯里化的函数时，很难知道已经应用了多少参数以及我们接下来该提供什么参数。通过箭头函数，我们能显示地定义柯里化函数，使得它们对其他程序员来说非常易于理解。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; b
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; curriedAdd &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;curry&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;add&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; add2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;curriedAdd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;add2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 3&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 变为&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; b
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; add2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;add2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 3&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这些显式的柯里化箭头函数对调试非常重要。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; lodashAdd &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;curry&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; b
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; add3 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;lodashAdd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;add3&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 0&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;add3&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//function wrapper() {&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//  var length = arguments.length,&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//  args = Array(length),&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//  index = length;&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//  while (index--) {&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//    args[index] = arguments[index];&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;//  }…&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 变为&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;es6Add&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; a &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; b
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; add3 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;es6Add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;add3&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 1&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;add3&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// function b =&amp;gt; a + b&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果我们使用函数式的库如 &lt;a href=&quot;https://github.com/lodash/lodash/wiki/FP-Guide&quot;&gt;lodash/fp&lt;/a&gt; 和 &lt;a href=&quot;http://ramdajs.com&quot;&gt;ramda&lt;/a&gt;，那我们也能使用箭头函数来免除对自动柯里化风格的需要。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;_&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;_&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;prop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;name&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;people&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 变为&lt;/span&gt;

people&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;person&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; person&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;5-partial&quot;&gt;5. Partial&lt;/h2&gt;&lt;p&gt;正如柯里化一样，我们也能使用箭头函数来简化显式化偏函数用法。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;greet&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;greeting&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; greeting &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27; &amp;#x27;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; name
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; sayHelloTo &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;partial&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;greet&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;hello&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sayHelloTo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;fred&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// &amp;quot;hello fred&amp;quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 变为&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;sayHelloTo&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;greet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;hello&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sayHelloTo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;fred&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// &amp;quot;hello fred&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我们也能结合剩余参数与延展操作符来部分地应用可变参数函数、&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;sayHelloTo&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;args&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;greet&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;hello&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;...&lt;/span&gt;args&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sayHelloTo&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;fred&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// &amp;quot;hello fred&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;6-operators&quot;&gt;6. Operators&lt;/h2&gt;&lt;p&gt;Lodash 把很多句法操作符重新实现成了函数，所以它们可以被传入集合方法。&lt;/p&gt;&lt;p&gt;在大多数情况下，箭头函数能让它们定义地足够简单精炼，一行足矣。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;_&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;eq&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// true&lt;/span&gt;
_&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 11&lt;/span&gt;
_&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;multiply&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;n&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// [10, 20, 30]&lt;/span&gt;
_&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;add&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// 6&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 变为&lt;/span&gt;

&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; n &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;total&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; n&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; total &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; n&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;7-paths&quot;&gt;7. Paths&lt;/h2&gt;&lt;p&gt;许多 Lodash 的函数把路径当做字符串或者数组。然而我们可以使用箭头函数来创建更多可重用的路径。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; object &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; a&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; b&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; c&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

_&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;at&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;object&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;a[0].b.c&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;a[1]&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// [3, 4]&lt;/span&gt;
_&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;at&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;a&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;b&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;c&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// [&amp;#x27;a&amp;#x27;, &amp;#x27;c&amp;#x27;]&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 变为&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;obj&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; obj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;b&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;c&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;obj&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; obj&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;a&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;path&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;object&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;arr&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; arr&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;arr&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; arr&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;path&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;a&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;b&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;c&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;因为这些路径“只是函数”，所以我们也能复合它们。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;getFirstPerson&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;people&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; people&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;getPostCode&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;person&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; person&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;address&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;postcode
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;getFirstPostCode&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;people&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getPostCode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getFirstPerson&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;people&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我们甚至能创建更高阶能接收参数的路径。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;getFirstNPeople&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;n&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;people&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; people&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; n&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; getFirst5People &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getFirstNPeople&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;getFirst5PostCodes&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;people&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getFirst5People&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;people&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;getPostCode&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;8-pick&quot;&gt;8. Pick&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://lodash.com/docs#pick&quot;&gt;pick&lt;/a&gt; 工具能让我们从一个对象中选择我们想要的属性。我们也能通过解构与对象字面量简写来获取同样的结果。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;var&lt;/span&gt; object &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; a&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;2&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; c&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pick&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;object&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&amp;#x27;a&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;c&amp;#x27;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// { a: 1, c: 3 }&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 变为&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; c &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; a&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; b&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; c&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; c &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;9-constant-identity-noop&quot;&gt;9. Constant, Identity, Noop&lt;/h2&gt;&lt;p&gt;Lodash 提供了一些工具函数来创建简单的具某一特定行为的函数。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;_&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;constant&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; a&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// { a: 1 }&lt;/span&gt;
_&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;identity&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; user&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;fred&amp;#x27;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// { user: &amp;#x27;fred&amp;#x27; }&lt;/span&gt;
_&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;noop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// undefined&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我们也能使用箭头函数行内定义这些函数。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;constant&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; x
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;identity&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; x
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;noop&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或者我们也能把上面的例子重写为：&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; a&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// { a: 1 }&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; x&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; user&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&amp;#x27;fred&amp;#x27;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// { user: &amp;#x27;fred&amp;#x27; }&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// undefined&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;10-chaining--flow&quot;&gt;10. Chaining &amp;amp; Flow&lt;/h2&gt;&lt;p&gt;Lodash 提供了一些函数来帮我们编写链式的语句。在大多情况下，内置的集合函数会返回一个数组实例，能直接被链式调用。但某些情况下，这些方法会改变这个集合，这样就不可能再直接地链式调用了（译者注：需要自己返回实例）。&lt;/p&gt;&lt;p&gt;然而我们也能以一个箭头函数数组来定义同样的转化。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token function&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;tap&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// 修改输入函数&lt;/span&gt;
    array&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reverse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// [2, 1]&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;// 变为&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; pipeline &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token parameter&quot;&gt;array&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    array&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;pop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; array
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token parameter&quot;&gt;array&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; array&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reverse&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

pipeline&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;xs&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; f&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;xs&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样的话，我们甚至不需要去思考 &lt;a href=&quot;https://lodash.com/docs#tap&quot;&gt;tap&lt;/a&gt; 和 &lt;a href=&quot;https://lodash.com/docs#thru&quot;&gt;thru&lt;/a&gt; 的不同。把这个归约包装成工具函数能创造出一个非常有用的多功能工具。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token function-variable function&quot;&gt;pipe&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;functions&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; functions&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;value&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; func&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;value&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; data&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; pipeline &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;pipe&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; x &lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token parameter&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;b&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;pipeline&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// true&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;pipeline&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// false&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;总结&quot;&gt;总结&lt;/h2&gt;&lt;p&gt;Lodash 仍然还是一个非常优秀的库，这篇文章只提供了一个新鲜的观点，JavaScript 的进化版是如何让我们在一些我们之前可能不得不依赖一些工具模块的场景里允许我们直接解决问题的。&lt;/p&gt;&lt;p&gt;不要忽略它（译者注：Lodash），但——下次你需求一个抽象时——思考一下是否一个简单的函数就能办到了！&lt;/p&gt;</content:encoded></item><item><title><![CDATA[mongoDB 常用命令]]></title><description><![CDATA[安装 mongoDB 官网 下载安装（ Windows 安装方法 ） 基础知识 集合——对应关系数据库中的表 文档——对应关系数据库中的行 启动数据库服务 定位到安装目录下的 bin 文件夹里后 如没有 data/db 文件夹，需先创建， dbpath…]]></description><link>https://raincal.com/post/mongodb-command</link><guid isPermaLink="false">https://raincal.com/post/mongodb-command</guid><pubDate>Fri, 10 Jul 2015 00:00:00 GMT</pubDate><content:encoded>&lt;style data-emotion-css=&quot;afj4f8&quot;&gt;body{--theme-ui-colors-prism-token:var(--theme-ui-colors-prism-token,#fff);--theme-ui-colors-prism-languageJavascript:var(--theme-ui-colors-prism-languageJavascript,#e8696b);--theme-ui-colors-prism-javascript:var(--theme-ui-colors-prism-javascript,#e8696b);--theme-ui-colors-prism-background:var(--theme-ui-colors-prism-background,#292c34);--theme-ui-colors-prism-comment:var(--theme-ui-colors-prism-comment,#999999);--theme-ui-colors-prism-string:var(--theme-ui-colors-prism-string,#8dc891);--theme-ui-colors-prism-var:var(--theme-ui-colors-prism-var,#b3bac5);--theme-ui-colors-prism-number:var(--theme-ui-colors-prism-number,#e4854d);--theme-ui-colors-prism-constant:var(--theme-ui-colors-prism-constant,#b3bac5);--theme-ui-colors-prism-plain:var(--theme-ui-colors-prism-plain,#fff);--theme-ui-colors-prism-doctype:var(--theme-ui-colors-prism-doctype,#e8696b);--theme-ui-colors-prism-tag:var(--theme-ui-colors-prism-tag,#fc929e);--theme-ui-colors-prism-keyword:var(--theme-ui-colors-prism-keyword,#c5a5c5);--theme-ui-colors-prism-boolean:var(--theme-ui-colors-prism-boolean,#ff8b50);--theme-ui-colors-prism-function:var(--theme-ui-colors-prism-function,#79b6f2);--theme-ui-colors-prism-parameter:var(--theme-ui-colors-prism-parameter,#F9965D);--theme-ui-colors-prism-className:var(--theme-ui-colors-prism-className,#FAC863);--theme-ui-colors-prism-attrName:var(--theme-ui-colors-prism-attrName,#bf87ba);--theme-ui-colors-prism-attrValue:var(--theme-ui-colors-prism-attrValue,#a8e2a8);--theme-ui-colors-prism-interpolation:var(--theme-ui-colors-prism-interpolation,#fff);--theme-ui-colors-prism-punctuation:var(--theme-ui-colors-prism-punctuation,#5FB3B3);--theme-ui-colors-prism-maybe-class-name:var(--theme-ui-colors-prism-maybe-class-name,#fff);--theme-ui-colors-prism-property:var(--theme-ui-colors-prism-property,#80cbc4);--theme-ui-colors-prism-namespace:var(--theme-ui-colors-prism-namespace,#b2ccd6);--theme-ui-colors-prism-highlight:var(--theme-ui-colors-prism-highlight,rgba(255,255,255,0.07));--theme-ui-colors-prism-highlightBorder:var(--theme-ui-colors-prism-highlightBorder,#e1bde2);--theme-ui-colors-prism-dom:var(--theme-ui-colors-prism-dom,#5F8DC3);--theme-ui-colors-prism-operator:var(--theme-ui-colors-prism-operator,#fc929e);--theme-ui-colors-text:var(--theme-ui-colors-text,#555);--theme-ui-colors-background:var(--theme-ui-colors-background,#eee);--theme-ui-colors-primary:var(--theme-ui-colors-primary,#667eea);--theme-ui-colors-muted:var(--theme-ui-colors-muted,#999);--theme-ui-colors-header:var(--theme-ui-colors-header,#222);--theme-ui-colors-headerDark:var(--theme-ui-colors-headerDark,#131d27);--theme-ui-colors-card:var(--theme-ui-colors-card,#fff);--theme-ui-colors-table:var(--theme-ui-colors-table,#f9f9f9);--theme-ui-colors-whitesmoke:var(--theme-ui-colors-whitesmoke,#f5f5f5);--theme-ui-colors-gainsboro:var(--theme-ui-colors-gainsboro,#eee);--theme-ui-colors-gray:var(--theme-ui-colors-gray,#bbb);--theme-ui-colors-grayLight:var(--theme-ui-colors-grayLight,#ccc);--theme-ui-colors-grayLighter:var(--theme-ui-colors-grayLighter,#ddd);--theme-ui-colors-grayDim:var(--theme-ui-colors-grayDim,#666);--theme-ui-colors-blackLight:var(--theme-ui-colors-blackLight,#555);--theme-ui-colors-blackDim:var(--theme-ui-colors-blackDim,#333);--theme-ui-colors-blackDeep:var(--theme-ui-colors-blackDeep,#222);--theme-ui-colors-black:var(--theme-ui-colors-black,#000);--theme-ui-colors-red:var(--theme-ui-colors-red,#ff2a2a);--theme-ui-colors-blueBright:var(--theme-ui-colors-blueBright,#87daff);--theme-ui-colors-blue:var(--theme-ui-colors-blue,#0684bd);--theme-ui-colors-blueDeep:var(--theme-ui-colors-blueDeep,#262a30);--theme-ui-colors-orange:var(--theme-ui-colors-orange,#fc6423);--theme-ui-colors-orangeDark:var(--theme-ui-colors-orangeDark,#e34603);color:var(--theme-ui-colors-text,#555);background-color:var(--theme-ui-colors-background,#eee);}body.theme-ui-dark{--theme-ui-colors-text:var(--theme-ui-colors-modes-dark-text,#fff);--theme-ui-colors-background:var(--theme-ui-colors-modes-dark-background,#15202b);--theme-ui-colors-primary:var(--theme-ui-colors-modes-dark-primary,#0cf);--theme-ui-colors-header:var(--theme-ui-colors-modes-dark-header,#192734);--theme-ui-colors-card:var(--theme-ui-colors-modes-dark-card,#192734);--theme-ui-colors-table:var(--theme-ui-colors-modes-dark-table,#15202b);--theme-ui-colors-whitesmoke:var(--theme-ui-colors-modes-dark-whitesmoke,#15202b);--theme-ui-colors-grayLight:var(--theme-ui-colors-modes-dark-grayLight,#15202b);--theme-ui-colors-blackLight:var(--theme-ui-colors-modes-dark-blackLight,#fff);--theme-ui-colors-blackDeep:var(--theme-ui-colors-modes-dark-blackDeep,#fff);--theme-ui-colors-black:var(--theme-ui-colors-modes-dark-black,#fff);}&lt;/style&gt;&lt;style data-emotion-css=&quot;1w4nyi6&quot;&gt;*{box-sizing:border-box;}body{margin:0;font-family:&quot;PingFang SC&quot;,system-ui,sans-serif;line-height:1.5;font-weight:400;color:var(--theme-ui-colors-text,#555);background-color:var(--theme-ui-colors-background,#eee);word-wrap:break-word;}&lt;/style&gt;&lt;h2 id=&quot;安装&quot;&gt;安装&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://www.mongodb.org/&quot;&gt;mongoDB 官网&lt;/a&gt;下载安装（&lt;a href=&quot;http://docs.mongodb.org/manual/tutorial/install-mongodb-on-windows/&quot;&gt;Windows 安装方法&lt;/a&gt;）&lt;/p&gt;&lt;h2 id=&quot;基础知识&quot;&gt;基础知识&lt;/h2&gt;&lt;p&gt;集合——对应关系数据库中的表&lt;/p&gt;&lt;p&gt;文档——对应关系数据库中的行&lt;/p&gt;&lt;h2 id=&quot;启动数据库服务&quot;&gt;启动数据库服务&lt;/h2&gt;&lt;p&gt;定位到安装目录下的 bin 文件夹里后&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; mongod --dbpath ../data/db&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如没有&lt;code class=&quot;language-text&quot;&gt;data/db&lt;/code&gt;文件夹，需先创建，&lt;code class=&quot;language-text&quot;&gt;dbpath&lt;/code&gt;用于指定数据存放位置&lt;/p&gt;&lt;h2 id=&quot;开启一个客户端访问数据库&quot;&gt;开启一个客户端访问数据库&lt;/h2&gt;&lt;p&gt;同样的 bin 文件夹下执行&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; mongo&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;默认连接至&lt;code class=&quot;language-text&quot;&gt;test&lt;/code&gt;数据库&lt;/p&gt;&lt;h2 id=&quot;显示帮助&quot;&gt;显示帮助&lt;/h2&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; help&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;显示所有数据库名称&quot;&gt;显示所有数据库名称&lt;/h2&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; show dbs&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;切换数据库&quot;&gt;切换数据库&lt;/h2&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; use test&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;显示当前连接的数据库名称&quot;&gt;显示当前连接的数据库名称&lt;/h2&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;显示当前数据库所有集合&quot;&gt;显示当前数据库所有集合&lt;/h2&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; show collections&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;显示数据库支持的方法&quot;&gt;显示数据库支持的方法&lt;/h2&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.help()&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;显示集合支持的方法&quot;&gt;显示集合支持的方法&lt;/h2&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.help()&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;创建集合&quot;&gt;创建集合&lt;/h2&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.createCollection(&amp;quot;users&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;插入操作-insert&quot;&gt;插入操作 insert&lt;/h2&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.insert({&amp;quot;name&amp;quot;:&amp;quot;kiinlam&amp;quot;,&amp;quot;age&amp;quot;:28})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;查询操作-find&quot;&gt;查询操作 find&lt;/h2&gt;&lt;h3 id=&quot;查找所有文档&quot;&gt;查找所有文档&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.find()&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;查找指定文档&quot;&gt;查找指定文档&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.find({&amp;quot;name&amp;quot;:&amp;quot;kiinlam&amp;quot;})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;查询一条&quot;&gt;查询一条&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.findOne({&amp;quot;name&amp;quot;:&amp;quot;kiinlam&amp;quot;})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;大于gt&quot;&gt;大于\$gt&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.find({&amp;quot;age&amp;quot;:{$gt:22}})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;大于等于gte&quot;&gt;大于等于\$gte&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.find({&amp;quot;age&amp;quot;:{$gte:22}})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;小于lt&quot;&gt;小于\$lt&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.find({&amp;quot;age&amp;quot;:{$lt:22}})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;小于等于gte&quot;&gt;小于等于\$gte&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.find({&amp;quot;age&amp;quot;:{$lte:22}})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;不等于ne&quot;&gt;不等于\$ne&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.find(&amp;quot;age&amp;quot;:{$ne:22})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;或or&quot;&gt;或\$or&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.find({$or:[{&amp;quot;name&amp;quot;:&amp;quot;kiinlam&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;cheungkiinlam&amp;quot;}]})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;在集合中in&quot;&gt;在集合中\$in&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.find(&amp;quot;name&amp;quot;:{$in:[&amp;quot;kiinlam&amp;quot;,&amp;quot;cheungkiinlam&amp;quot;]})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;不在集合中nin&quot;&gt;不在集合中\$nin&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.find(&amp;quot;name&amp;quot;:{$nin:[&amp;quot;kiinlam&amp;quot;,&amp;quot;cheungkiinlam&amp;quot;]})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;正则查询&quot;&gt;正则查询&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.find({&amp;quot;name&amp;quot;:/^k/,&amp;quot;name&amp;quot;:/m$/})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;筛选查询where&quot;&gt;筛选查询\$where&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;// 使用js function作为筛选条件
&amp;gt; db.users.find({$where: function(){return this.name==&amp;#x27;kiinlam&amp;#x27;}})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;限制查询数量-limit&quot;&gt;限制查询数量 limit&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.find({&amp;quot;age&amp;quot;:22}).limit(10)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;更新操作-update&quot;&gt;更新操作 update&lt;/h2&gt;&lt;h3 id=&quot;指定文档全部更新，等于覆盖&quot;&gt;指定文档全部更新，等于覆盖&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.update({&amp;quot;name&amp;quot;:&amp;quot;kiinlam&amp;quot;}, {&amp;quot;name&amp;quot;:&amp;quot;cheungkiinlam&amp;quot;,&amp;quot;age&amp;quot;:27})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;局部更新一：增量更新inc&quot;&gt;局部更新一：增量更新\$inc&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;// age增加2，其他不变
&amp;gt; db.users.update({&amp;quot;name&amp;quot;:&amp;quot;kiinlam&amp;quot;}, {$inc:{&amp;quot;age&amp;quot;:2}})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;局部更新二：字段修改set&quot;&gt;局部更新二：字段修改\$set&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;// age改为20
&amp;gt; db.users.update({&amp;quot;name&amp;quot;:&amp;quot;kiinlam&amp;quot;}, {$set:{&amp;quot;age&amp;quot;:20}})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;新增更新：如果不存在，就新增一条&quot;&gt;新增更新：如果不存在，就新增一条&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;// 第三个参数为true
&amp;gt; db.users.update({&amp;quot;name&amp;quot;:&amp;quot;kiinlam&amp;quot;}, {$set:{&amp;quot;age&amp;quot;:18}}, true)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;批量更新&quot;&gt;批量更新&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;// 如果匹配多条，默认只改第一条，将第四个参数设为true可全部更新
&amp;gt; db.users.update({&amp;quot;name&amp;quot;:&amp;quot;kiinlam&amp;quot;}, {$set:{&amp;quot;age&amp;quot;:18}}, true, true)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;保存操作-save&quot;&gt;保存操作 save&lt;/h2&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;// 插入新文档，如果不提供&amp;quot;_id&amp;quot;字段
&amp;gt; db.users.save({&amp;quot;name&amp;quot;:&amp;quot;kiinlam&amp;quot;, &amp;quot;age&amp;quot;:28})
// 更新已存在的文档
&amp;gt; db.users.save({&amp;quot;_id&amp;quot;:&amp;quot;xxx&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;kiinlam&amp;quot;, &amp;quot;age&amp;quot;:28})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;删除操作-remove&quot;&gt;删除操作 remove&lt;/h2&gt;&lt;p&gt;删除操作不可恢复&lt;/p&gt;&lt;h3 id=&quot;删除所有，但不删除索引&quot;&gt;删除所有，但不删除索引&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.remove({})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;删除指定文档&quot;&gt;删除指定文档&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.remove({&amp;quot;name&amp;quot;:&amp;quot;kiinlam&amp;quot;})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;删除一条指定文档，如果有多条结果&quot;&gt;删除一条指定文档，如果有多条结果&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.remove({&amp;quot;name&amp;quot;:&amp;quot;kiinlam&amp;quot;}, true)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;完全删除集合，包括索引，应当使用&lt;code class=&quot;language-text&quot;&gt;drop&lt;/code&gt;&lt;/p&gt;&lt;p&gt;大量删除时，采用复制需要保留的文档到新集合，再用&lt;code class=&quot;language-text&quot;&gt;drop&lt;/code&gt;删除集合。&lt;/p&gt;&lt;h2 id=&quot;删除数据库&quot;&gt;删除数据库&lt;/h2&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.dropDatabase()&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;删除集合&quot;&gt;删除集合&lt;/h2&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.drop()&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;计数操作-count&quot;&gt;计数操作 count&lt;/h2&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.count()
&amp;gt; db.users.count({&amp;quot;age&amp;quot;:29})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;唯一值查询-distinct&quot;&gt;唯一值查询 distinct&lt;/h2&gt;&lt;h3 id=&quot;指定字段有多个相同时，只取一个，返回指定字段的值组合成的数组&quot;&gt;指定字段有多个相同时，只取一个，返回指定字段的值组合成的数组&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.distinct(&amp;quot;age&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;分组操作-group&quot;&gt;分组操作 group&lt;/h2&gt;&lt;p&gt;按照&lt;code class=&quot;language-text&quot;&gt;age&lt;/code&gt;进行分组操作，分组结果存放在&lt;code class=&quot;language-text&quot;&gt;user&lt;/code&gt;中，值为对应&lt;code class=&quot;language-text&quot;&gt;age&lt;/code&gt;的 name 值的数组&lt;/p&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;key&lt;/code&gt;：分组依据&lt;/p&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;initial&lt;/code&gt;：初始化函数，每个不同的 age 组共享同一个函数&lt;/p&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;$reduce&lt;/code&gt;： 第一个参数为当前文档，第二参数为前一次函数操作的累计对象，第一次为&lt;code class=&quot;language-text&quot;&gt;initial&lt;/code&gt;对应的对象&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.group({
                    &amp;quot;key&amp;quot;: {&amp;quot;age&amp;quot;: true},
                    &amp;quot;initial&amp;quot;: {&amp;quot;user&amp;quot;: []},
                    &amp;quot;$reduce&amp;quot;: function(cur,prev){
                        prev.user.push(cur.name);
                    }
                })&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;假设有数据如下：&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;{ &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;55910457607379845607d9e2&amp;quot;), &amp;quot;name&amp;quot; : &amp;quot;kiinlam&amp;quot;, &amp;quot;age&amp;quot; : 29 }
{ &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;55910468607379845607d9e3&amp;quot;), &amp;quot;name&amp;quot; : &amp;quot;shadow&amp;quot;, &amp;quot;age&amp;quot; : 26 }
{ &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;55910992607379845607d9e5&amp;quot;), &amp;quot;name&amp;quot; : &amp;quot;foo&amp;quot;, &amp;quot;age&amp;quot; : 29 }
{ &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;55911fca607379845607d9e6&amp;quot;), &amp;quot;name&amp;quot; : &amp;quot;dd&amp;quot;, &amp;quot;age&amp;quot; : 22 }
{ &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;55911fd3607379845607d9e7&amp;quot;), &amp;quot;name&amp;quot; : &amp;quot;mm&amp;quot;, &amp;quot;age&amp;quot; : 22 }
{ &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;55911fdf607379845607d9e8&amp;quot;), &amp;quot;name&amp;quot; : &amp;quot;gg&amp;quot;, &amp;quot;age&amp;quot; : 22 }
{ &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;55911feb607379845607d9e9&amp;quot;), &amp;quot;name&amp;quot; : &amp;quot;jj&amp;quot;, &amp;quot;age&amp;quot; : 22 }
{ &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;55920545ff40738c1fd0a839&amp;quot;), &amp;quot;name&amp;quot; : &amp;quot;zz&amp;quot;, &amp;quot;age&amp;quot; : 1 }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;分组结果为：&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[
        {
                &amp;quot;age&amp;quot; : 29,
                &amp;quot;user&amp;quot; : [
                        &amp;quot;kiinlam&amp;quot;,
                        &amp;quot;foo&amp;quot;
                ]
        },
        {
                &amp;quot;age&amp;quot; : 26,
                &amp;quot;user&amp;quot; : [
                        &amp;quot;shadow&amp;quot;
                ]
        },
        {
                &amp;quot;age&amp;quot; : 22,
                &amp;quot;user&amp;quot; : [
                        &amp;quot;dd&amp;quot;,
                        &amp;quot;mm&amp;quot;,
                        &amp;quot;gg&amp;quot;,
                        &amp;quot;jj&amp;quot;
                ]
        },
        {
                &amp;quot;age&amp;quot; : 1,
                &amp;quot;user&amp;quot; : [
                        &amp;quot;zz&amp;quot;
                ]
        }
]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;更多分组功能&quot;&gt;更多分组功能&lt;/h3&gt;&lt;p&gt;可选参数: &lt;code class=&quot;language-text&quot;&gt;condition&lt;/code&gt; 和 &lt;code class=&quot;language-text&quot;&gt;finalize&lt;/code&gt;。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;`condition` —— 过滤条件
`finalize` —— 函数，分组完成后执行&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;过滤掉&lt;code class=&quot;language-text&quot;&gt;age&lt;/code&gt;大于 22 的文档，增加属性标明分组中文档的数量&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.group({
                    &amp;quot;key&amp;quot;: {&amp;quot;age&amp;quot;: true},
                    &amp;quot;initial&amp;quot;: {&amp;quot;user&amp;quot;: []},
                    &amp;quot;$reduce&amp;quot;: function(cur,prev){
                        prev.user.push(cur.name);
                    },
                    &amp;quot;condition&amp;quot;: {&amp;quot;age&amp;quot;:{$lte:22}},
                    &amp;quot;finalize&amp;quot;: function(out){
                        out.count = out.user.length;
                    }
                })&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;分组结果为：&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[
        {
                &amp;quot;age&amp;quot; : 22,
                &amp;quot;user&amp;quot; : [
                        &amp;quot;dd&amp;quot;,
                        &amp;quot;mm&amp;quot;,
                        &amp;quot;gg&amp;quot;,
                        &amp;quot;jj&amp;quot;
                ],
                &amp;quot;count&amp;quot; : 4
        },
        {
                &amp;quot;age&amp;quot; : 1,
                &amp;quot;user&amp;quot; : [
                        &amp;quot;zz&amp;quot;
                ],
                &amp;quot;count&amp;quot; : 1
        }
]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;mapreduce&quot;&gt;mapReduce&lt;/h2&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;map&lt;/code&gt;：映射函数，内部调用&lt;code class=&quot;language-text&quot;&gt;emit(key,value)&lt;/code&gt;，集合按照&lt;code class=&quot;language-text&quot;&gt;key&lt;/code&gt;进行映射分组。&lt;/p&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;reduce&lt;/code&gt;：简化函数，对&lt;code class=&quot;language-text&quot;&gt;map&lt;/code&gt;分组后的数据进行分组简化，&lt;code class=&quot;language-text&quot;&gt;reduce(key,value)&lt;/code&gt;中的&lt;code class=&quot;language-text&quot;&gt;key&lt;/code&gt;是&lt;code class=&quot;language-text&quot;&gt;emit&lt;/code&gt;中的&lt;code class=&quot;language-text&quot;&gt;key&lt;/code&gt;，而&lt;code class=&quot;language-text&quot;&gt;value&lt;/code&gt;则是&lt;code class=&quot;language-text&quot;&gt;emit&lt;/code&gt;分组结果的集合。&lt;/p&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;mapReduce&lt;/code&gt;：最后执行的函数，参数为&lt;code class=&quot;language-text&quot;&gt;map&lt;/code&gt;、&lt;code class=&quot;language-text&quot;&gt;reduce&lt;/code&gt;和一些可选参数。&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.mapReduce
function ( map , reduce , optionsOrOutString ){
    var c = { mapreduce : this._shortName , map : map , reduce : reduce };
    assert( optionsOrOutString , &amp;quot;need to supply an optionsOrOutString&amp;quot; )

    if ( typeof( optionsOrOutString ) == &amp;quot;string&amp;quot; )
        c[&amp;quot;out&amp;quot;] = optionsOrOutString;
    else
        Object.extend( c , optionsOrOutString );

    var raw = this._db.runCommand( c );
    if ( ! raw.ok ){
        __mrerror__ = raw;
        throw Error( &amp;quot;map reduce failed:&amp;quot; + tojson(raw) );
    }
    return new MapReduceResult( this._db , raw );

}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;创建&lt;code class=&quot;language-text&quot;&gt;map&lt;/code&gt;函数&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;function (){
    emit(this.name,{count:1});
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;创建&lt;code class=&quot;language-text&quot;&gt;reduce&lt;/code&gt;函数&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;function (key,value){
    var result = {count:0};
    for(var i = 0; i &amp;lt; value.length; i++){
        result.count += value[i].count;
    }
    return result;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;执行&lt;code class=&quot;language-text&quot;&gt;mapReduce&lt;/code&gt;操作&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.mapReduce(map,reduce,{&amp;quot;out&amp;quot;:&amp;quot;collection&amp;quot;})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;假设有数据如下&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;{ &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;55910457607379845607d9e2&amp;quot;), &amp;quot;name&amp;quot; : &amp;quot;kiinlam&amp;quot;, &amp;quot;age&amp;quot; : 29 }
{ &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;55910468607379845607d9e3&amp;quot;), &amp;quot;name&amp;quot; : &amp;quot;shadow&amp;quot;, &amp;quot;age&amp;quot; : 26 }
{ &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;55910992607379845607d9e5&amp;quot;), &amp;quot;name&amp;quot; : &amp;quot;foo&amp;quot;, &amp;quot;age&amp;quot; : 29 }
{ &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;55920545ff40738c1fd0a839&amp;quot;), &amp;quot;name&amp;quot; : &amp;quot;zz&amp;quot;, &amp;quot;age&amp;quot; : 1 }
{ &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;55911fca607379845607d9e6&amp;quot;), &amp;quot;name&amp;quot; : &amp;quot;foo&amp;quot;, &amp;quot;age&amp;quot; : 22 }
{ &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;55911fd3607379845607d9e7&amp;quot;), &amp;quot;name&amp;quot; : &amp;quot;foo&amp;quot;, &amp;quot;age&amp;quot; : 22 }
{ &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;55911fdf607379845607d9e8&amp;quot;), &amp;quot;name&amp;quot; : &amp;quot;foo&amp;quot;, &amp;quot;age&amp;quot; : 22 }
{ &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;55911feb607379845607d9e9&amp;quot;), &amp;quot;name&amp;quot; : &amp;quot;foo&amp;quot;, &amp;quot;age&amp;quot; : 22 }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出结果&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;{
        &amp;quot;result&amp;quot; : &amp;quot;collection&amp;quot;,    // 存放最终结果的集合名
        &amp;quot;timeMillis&amp;quot; : 28,
        &amp;quot;counts&amp;quot; : {
                &amp;quot;input&amp;quot; : 8,    // 传入文档的次数
                &amp;quot;emit&amp;quot; : 8,    // emit函数被调用次数
                &amp;quot;reduce&amp;quot; : 1,    // reduce函数被调用次数
                &amp;quot;output&amp;quot; : 4    // 最后返回文档的个数
        },
        &amp;quot;ok&amp;quot; : 1
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看集合&lt;code class=&quot;language-text&quot;&gt;collection&lt;/code&gt;中的结果&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.collection.find()&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出结果&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;{ &amp;quot;_id&amp;quot; : &amp;quot;foo&amp;quot;, &amp;quot;value&amp;quot; : { &amp;quot;count&amp;quot; : 5 } }
{ &amp;quot;_id&amp;quot; : &amp;quot;kiinlam&amp;quot;, &amp;quot;value&amp;quot; : { &amp;quot;count&amp;quot; : 1 } }
{ &amp;quot;_id&amp;quot; : &amp;quot;shadow&amp;quot;, &amp;quot;value&amp;quot; : { &amp;quot;count&amp;quot; : 1 } }
{ &amp;quot;_id&amp;quot; : &amp;quot;zz&amp;quot;, &amp;quot;value&amp;quot; : { &amp;quot;count&amp;quot; : 1 } }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;游标&quot;&gt;游标&lt;/h2&gt;&lt;p&gt;游标只表示一个引用，并不是真正的执行，在需要的时候，通过 for 循环或&lt;code class=&quot;language-text&quot;&gt;next()&lt;/code&gt;方法进行遍历读取，枚举结束后，游标销毁，不再返回数据。&lt;/p&gt;&lt;p&gt;申明一个游标&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; var list = db.collection.find()&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;通过&lt;code class=&quot;language-text&quot;&gt;forEach&lt;/code&gt;遍历游标&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; list.forEach(function(i){
      print(i._id);
  })&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出结果&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;foo
kiinlam
shadow
zz&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或者通过&lt;code class=&quot;language-text&quot;&gt;next&lt;/code&gt;遍历集合&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; var list = db.collection.find()
&amp;gt; list.next()
{ &amp;quot;_id&amp;quot; : &amp;quot;foo&amp;quot;, &amp;quot;value&amp;quot; : { &amp;quot;count&amp;quot; : 5 } }
&amp;gt; list.next()
{ &amp;quot;_id&amp;quot; : &amp;quot;kiinlam&amp;quot;, &amp;quot;value&amp;quot; : { &amp;quot;count&amp;quot; : 1 } }
&amp;gt; list.next()
{ &amp;quot;_id&amp;quot; : &amp;quot;shadow&amp;quot;, &amp;quot;value&amp;quot; : { &amp;quot;count&amp;quot; : 1 } }
&amp;gt; list.next()
{ &amp;quot;_id&amp;quot; : &amp;quot;zz&amp;quot;, &amp;quot;value&amp;quot; : { &amp;quot;count&amp;quot; : 1 } }
&amp;gt; list.next()
2015-07-01T11:27:38.186+0800 E QUERY    Error: error hasNext: false
    at Error (&amp;lt;anonymous&amp;gt;)
    at DBQuery.next (src/mongo/shell/query.js:255:15)
    at (shell):1:6 at src/mongo/shell/query.js:255
&amp;gt; list
&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;索引-ensureindex&quot;&gt;索引 ensureIndex&lt;/h2&gt;&lt;h3 id=&quot;建立索引&quot;&gt;建立索引&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;// 1为升序，-1为降序
&amp;gt; db.users.ensureIndex({&amp;quot;name&amp;quot;:1})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;唯一索引&quot;&gt;唯一索引&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.ensureIndex({&amp;quot;name&amp;quot;:1},{&amp;quot;unique&amp;quot;:true})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;组合索引&quot;&gt;组合索引&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.ensureIndex({&amp;quot;name&amp;quot;:1, &amp;quot;age&amp;quot;:-1})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;查看索引&quot;&gt;查看索引&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.getIndexes()&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;按指定索引查询&quot;&gt;按指定索引查询&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.find({&amp;quot;name&amp;quot;:&amp;quot;kiinlam&amp;quot;}).hint({&amp;quot;name&amp;quot;:1,&amp;quot;age&amp;quot;:1})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;删除索引&quot;&gt;删除索引&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;// 删除所有自定义索引
&amp;gt; db.users.dropIndexes()
// 删除指定索引
&amp;gt; db.users.dropIndex(&amp;quot;name_1&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;性能分析函数-explain&quot;&gt;性能分析函数 explain&lt;/h2&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; db.users.find().explain(&amp;quot;executionStats&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;主从数据库部署&quot;&gt;主从数据库部署&lt;/h2&gt;&lt;h3 id=&quot;创建主数据库-master&quot;&gt;创建主数据库 master&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; mongod --dbpath=XXX --master&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;创建从数据库-slave&quot;&gt;创建从数据库 slave&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;// 指定从数据库端口--port
// 指定主数据库源--source
&amp;gt; mongod --dbpath=XXX --port=8888 --slave --source=127.0.0.1:27017&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;后期指定主数据库源&quot;&gt;后期指定主数据库源&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; mongod --dbpath=XXX --port=8888 --slave
// 后期添加源
// 切换到local数据库
&amp;gt; use local
// 在sources中加入源地址
&amp;gt; db.sources.insert({&amp;quot;host&amp;quot;:&amp;quot;127.0.0.1:27017&amp;quot;})&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;副本集-replset&quot;&gt;副本集 replSet&lt;/h2&gt;&lt;p&gt;该架构没有特定的主数据库，一个数据库宕机了，另一个数据库会顶上&lt;/p&gt;&lt;h3 id=&quot;创建第一个数据库服务器&quot;&gt;创建第一个数据库服务器&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;// 需要指定集群名及下一个数据库地址
&amp;gt; mongod --dbpath=XXX --port 2222 --replSet mySet/127.0.0.1:3333&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;创建第二个数据库服务器&quot;&gt;创建第二个数据库服务器&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; mongod --dbpath=XXX --port 3333 --replSet mySet/127.0.0.1:2222&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;初始化副本集&quot;&gt;初始化副本集&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;// 进入任一数据库的admin集合
&amp;gt; mongo 127.0.0.1:2222/admin
// 执行初始化操作
&amp;gt; db.runCommand({
                    &amp;quot;replSetInitiate&amp;quot;:{
                        &amp;quot;_id&amp;quot;:&amp;quot;mySet&amp;quot;,
                        &amp;quot;members&amp;quot;:[
                            {
                                &amp;quot;_id&amp;quot;:1,
                                &amp;quot;host&amp;quot;:&amp;quot;127.0.0.1:2222&amp;quot;
                            },
                            {
                                &amp;quot;_id&amp;quot;:2,
                                &amp;quot;host&amp;quot;:&amp;quot;127.0.0.1:3333&amp;quot;
                            }
                        ]
                    }
                })&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;仲裁服务器&quot;&gt;仲裁服务器&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;// 启动仲裁服务器
&amp;gt; mongod --dbpath=XXX --port 4444 --replSet mySet/127.0.0.1:2222
// 回到admin集合中添加仲裁服务器
&amp;gt; mongo 127.0.0.1:2222/admin
&amp;gt; rs.addArb(&amp;quot;127.0.0.1:4444&amp;quot;)
// 查看服务器集群状态
&amp;gt; rs.status()&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;分片技术&quot;&gt;分片技术&lt;/h2&gt;&lt;p&gt;将集合进行拆分，将拆分的数据均摊到几个分片上。&lt;/p&gt;&lt;p&gt;主要参与者：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;客户端&lt;/li&gt;&lt;li&gt;路由服务器 mongos&lt;/li&gt;&lt;li&gt;配置服务器&lt;/li&gt;&lt;li&gt;分片数据库实例&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;开启配置服务器-config&quot;&gt;开启配置服务器 config&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; mongod --dbpath=XXX --port 2222&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;开启路由服务器-mongos&quot;&gt;开启路由服务器 mongos&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;// 指定配置服务器
&amp;gt; mongos --port 3333 --configdb=127.0.0.1:2222&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;开启分片数据库服务器-mongod&quot;&gt;开启分片数据库服务器 mongod&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; mongod --dbpath=XXX --port 4444
&amp;gt; mongod --dbpath=XXX --port 5555&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;服务配置&quot;&gt;服务配置&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;// 进入mongos数据库admin集合
&amp;gt; mongo 127.0.0.1:3333/admin
// 添加分片服务器addshard
&amp;gt; db.runCommand({
                    &amp;quot;addshard&amp;quot;:&amp;quot;127.0.0.1:4444&amp;quot;,
                    &amp;quot;allowLocal&amp;quot;:true
                })
&amp;gt; db.runCommand({
                    &amp;quot;addshard&amp;quot;:&amp;quot;127.0.0.1:5555&amp;quot;,
                    &amp;quot;allowLocal&amp;quot;:true
                })
// 开启数据库test的分片功能enablesharding
&amp;gt; db.runCommand({&amp;quot;enablesharding&amp;quot;:&amp;quot;test&amp;quot;})
// 指定集合中分片的片键users.name
&amp;gt; db.runCommand({&amp;quot;shardcollection&amp;quot;:&amp;quot;test.users&amp;quot;,&amp;quot;key&amp;quot;:{&amp;quot;name&amp;quot;:1}})
// 在mongos中查看数据分片情况
&amp;gt; use test
&amp;gt; db.printShardingStatus()&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;运维&quot;&gt;运维&lt;/h2&gt;&lt;p&gt;运维通常会涉及到以下 4 个方面&lt;/p&gt;&lt;ul&gt;&lt;li&gt;安装部署&lt;/li&gt;&lt;li&gt;状态监控&lt;/li&gt;&lt;li&gt;安全认证&lt;/li&gt;&lt;li&gt;备份和恢复&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&quot;安装部署为-windows-服务&quot;&gt;安装部署为 windows 服务&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;// 指定日志路径，添加install参数
&amp;gt; mongod --dbpath=XXX --logpath=XXX --port=2222 --install
// 启动服务
&amp;gt; net start MongoDB&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&quot;状态监控&quot;&gt;状态监控&lt;/h3&gt;&lt;h4 id=&quot;静态统计&quot;&gt;静态统计&lt;/h4&gt;&lt;p&gt;&lt;em&gt;db.stats()&lt;/em&gt;&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;// 查看单个数据库状态
&amp;gt; db.stats()&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;stats&lt;/code&gt;比较简单，可以参考&lt;a href=&quot;http://www.cnblogs.com/xuegang/archive/2011/10/13/2209965.html&quot;&gt;db.stats()&lt;/a&gt;一文&lt;/p&gt;&lt;p&gt;&lt;em&gt;db.serverStatus()&lt;/em&gt;&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;// 查看整个mongodb的状态
// 进入admin集合
&amp;gt; mongo 127.0.0.1:2222/admin
// 查看状态
&amp;gt; db.serverStatus()&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;serverStatus&lt;/code&gt;的参数很多，可以参考&lt;a href=&quot;http://www.cnblogs.com/xuegang/archive/2011/10/13/2210339.html&quot;&gt;db.serverStatus()&lt;/a&gt;一文&lt;/p&gt;&lt;h4 id=&quot;实时统计&quot;&gt;实时统计&lt;/h4&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;gt; mongostat --port 2222&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&quot;安全认证&quot;&gt;安全认证&lt;/h2&gt;&lt;p&gt;&lt;em&gt;TODO&lt;/em&gt;&lt;/p&gt;&lt;p&gt;有点复杂，偷懒了，参考&lt;a href=&quot;http://docs.mongodb.org/manual/security/&quot;&gt;安全认证&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&quot;备份和恢复&quot;&gt;备份和恢复&lt;/h3&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;// 备份test数据库到D:\mongodb\backup
&amp;gt; mongodump --port 2222 -d test -o D:\mongodb\backup
// 恢复数据，drop表示恢复前删除原有数据
&amp;gt; mongorestore --port 2222 -d test --drop D:\mongodb\backup&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr/&gt;&lt;h2 id=&quot;参考资料&quot;&gt;参考资料&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://www.mongodb.org/&quot;&gt;mongoDB&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://docs.mongodb.org/manual/&quot;&gt;MongoDB 文档&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://docs.mongodb.org/manual/tutorial/install-mongodb-on-windows/&quot;&gt;install-mongodb-on-windows&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.cnblogs.com/huangxincheng/category/355399.html&quot;&gt;8 天学通 MongoDB 系列&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Mac OS 终端使用 subl 运行 Sublime Text 3]]></title><description><![CDATA[1.添加 link 2.编辑 PATH 3.添加 PATH 4.应用]]></description><link>https://raincal.com/post/launch-sublime-text-from-command-line</link><guid isPermaLink="false">https://raincal.com/post/launch-sublime-text-from-command-line</guid><pubDate>Sat, 09 May 2015 00:00:00 GMT</pubDate><content:encoded>&lt;style data-emotion-css=&quot;afj4f8&quot;&gt;body{--theme-ui-colors-prism-token:var(--theme-ui-colors-prism-token,#fff);--theme-ui-colors-prism-languageJavascript:var(--theme-ui-colors-prism-languageJavascript,#e8696b);--theme-ui-colors-prism-javascript:var(--theme-ui-colors-prism-javascript,#e8696b);--theme-ui-colors-prism-background:var(--theme-ui-colors-prism-background,#292c34);--theme-ui-colors-prism-comment:var(--theme-ui-colors-prism-comment,#999999);--theme-ui-colors-prism-string:var(--theme-ui-colors-prism-string,#8dc891);--theme-ui-colors-prism-var:var(--theme-ui-colors-prism-var,#b3bac5);--theme-ui-colors-prism-number:var(--theme-ui-colors-prism-number,#e4854d);--theme-ui-colors-prism-constant:var(--theme-ui-colors-prism-constant,#b3bac5);--theme-ui-colors-prism-plain:var(--theme-ui-colors-prism-plain,#fff);--theme-ui-colors-prism-doctype:var(--theme-ui-colors-prism-doctype,#e8696b);--theme-ui-colors-prism-tag:var(--theme-ui-colors-prism-tag,#fc929e);--theme-ui-colors-prism-keyword:var(--theme-ui-colors-prism-keyword,#c5a5c5);--theme-ui-colors-prism-boolean:var(--theme-ui-colors-prism-boolean,#ff8b50);--theme-ui-colors-prism-function:var(--theme-ui-colors-prism-function,#79b6f2);--theme-ui-colors-prism-parameter:var(--theme-ui-colors-prism-parameter,#F9965D);--theme-ui-colors-prism-className:var(--theme-ui-colors-prism-className,#FAC863);--theme-ui-colors-prism-attrName:var(--theme-ui-colors-prism-attrName,#bf87ba);--theme-ui-colors-prism-attrValue:var(--theme-ui-colors-prism-attrValue,#a8e2a8);--theme-ui-colors-prism-interpolation:var(--theme-ui-colors-prism-interpolation,#fff);--theme-ui-colors-prism-punctuation:var(--theme-ui-colors-prism-punctuation,#5FB3B3);--theme-ui-colors-prism-maybe-class-name:var(--theme-ui-colors-prism-maybe-class-name,#fff);--theme-ui-colors-prism-property:var(--theme-ui-colors-prism-property,#80cbc4);--theme-ui-colors-prism-namespace:var(--theme-ui-colors-prism-namespace,#b2ccd6);--theme-ui-colors-prism-highlight:var(--theme-ui-colors-prism-highlight,rgba(255,255,255,0.07));--theme-ui-colors-prism-highlightBorder:var(--theme-ui-colors-prism-highlightBorder,#e1bde2);--theme-ui-colors-prism-dom:var(--theme-ui-colors-prism-dom,#5F8DC3);--theme-ui-colors-prism-operator:var(--theme-ui-colors-prism-operator,#fc929e);--theme-ui-colors-text:var(--theme-ui-colors-text,#555);--theme-ui-colors-background:var(--theme-ui-colors-background,#eee);--theme-ui-colors-primary:var(--theme-ui-colors-primary,#667eea);--theme-ui-colors-muted:var(--theme-ui-colors-muted,#999);--theme-ui-colors-header:var(--theme-ui-colors-header,#222);--theme-ui-colors-headerDark:var(--theme-ui-colors-headerDark,#131d27);--theme-ui-colors-card:var(--theme-ui-colors-card,#fff);--theme-ui-colors-table:var(--theme-ui-colors-table,#f9f9f9);--theme-ui-colors-whitesmoke:var(--theme-ui-colors-whitesmoke,#f5f5f5);--theme-ui-colors-gainsboro:var(--theme-ui-colors-gainsboro,#eee);--theme-ui-colors-gray:var(--theme-ui-colors-gray,#bbb);--theme-ui-colors-grayLight:var(--theme-ui-colors-grayLight,#ccc);--theme-ui-colors-grayLighter:var(--theme-ui-colors-grayLighter,#ddd);--theme-ui-colors-grayDim:var(--theme-ui-colors-grayDim,#666);--theme-ui-colors-blackLight:var(--theme-ui-colors-blackLight,#555);--theme-ui-colors-blackDim:var(--theme-ui-colors-blackDim,#333);--theme-ui-colors-blackDeep:var(--theme-ui-colors-blackDeep,#222);--theme-ui-colors-black:var(--theme-ui-colors-black,#000);--theme-ui-colors-red:var(--theme-ui-colors-red,#ff2a2a);--theme-ui-colors-blueBright:var(--theme-ui-colors-blueBright,#87daff);--theme-ui-colors-blue:var(--theme-ui-colors-blue,#0684bd);--theme-ui-colors-blueDeep:var(--theme-ui-colors-blueDeep,#262a30);--theme-ui-colors-orange:var(--theme-ui-colors-orange,#fc6423);--theme-ui-colors-orangeDark:var(--theme-ui-colors-orangeDark,#e34603);color:var(--theme-ui-colors-text,#555);background-color:var(--theme-ui-colors-background,#eee);}body.theme-ui-dark{--theme-ui-colors-text:var(--theme-ui-colors-modes-dark-text,#fff);--theme-ui-colors-background:var(--theme-ui-colors-modes-dark-background,#15202b);--theme-ui-colors-primary:var(--theme-ui-colors-modes-dark-primary,#0cf);--theme-ui-colors-header:var(--theme-ui-colors-modes-dark-header,#192734);--theme-ui-colors-card:var(--theme-ui-colors-modes-dark-card,#192734);--theme-ui-colors-table:var(--theme-ui-colors-modes-dark-table,#15202b);--theme-ui-colors-whitesmoke:var(--theme-ui-colors-modes-dark-whitesmoke,#15202b);--theme-ui-colors-grayLight:var(--theme-ui-colors-modes-dark-grayLight,#15202b);--theme-ui-colors-blackLight:var(--theme-ui-colors-modes-dark-blackLight,#fff);--theme-ui-colors-blackDeep:var(--theme-ui-colors-modes-dark-blackDeep,#fff);--theme-ui-colors-black:var(--theme-ui-colors-modes-dark-black,#fff);}&lt;/style&gt;&lt;style data-emotion-css=&quot;1w4nyi6&quot;&gt;*{box-sizing:border-box;}body{margin:0;font-family:&quot;PingFang SC&quot;,system-ui,sans-serif;line-height:1.5;font-weight:400;color:var(--theme-ui-colors-text,#555);background-color:var(--theme-ui-colors-background,#eee);word-wrap:break-word;}&lt;/style&gt;&lt;p&gt;1.添加 link&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;ln&lt;/span&gt; -s /Applications/Sublime&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt; Text.app/Contents/SharedSupport/bin/subl /usr/local/bin/subl&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2.编辑 PATH&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;vim&lt;/span&gt; ~/.bash_profile&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;3.添加 PATH&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;&lt;span class=&quot;token environment constant&quot;&gt;PATH&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/usr/local/bin:&lt;span class=&quot;token environment constant&quot;&gt;$PATH&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;esc -&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;shift&lt;/span&gt; + &lt;span class=&quot;token builtin class-name&quot;&gt;:&lt;/span&gt; -&lt;span class=&quot;token operator&quot;&gt;&amp;gt;&lt;/span&gt; wq保存退出&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;4.应用&lt;/p&gt;&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;source&lt;/span&gt; ~/.bash_profile&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item></channel></rss>