<?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" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Mapping的技术小站]]></title><description><![CDATA[技术分享，填坑指南]]></description><link>https://iammapping.com/</link><image><url>https://iammapping.com/favicon.png</url><title>Mapping的技术小站</title><link>https://iammapping.com/</link></image><generator>Ghost 5.68</generator><lastBuildDate>Fri, 10 Apr 2026 20:02:44 GMT</lastBuildDate><atom:link href="https://iammapping.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[使用 ClickHouse 做去重加和]]></title><description><![CDATA[使用 ClickHouse 做去重加和，去重求和。使用 CK 做去重加和，去重求和。使用CH 做去重加和，去重求和。使用 SQL 做去重加和，去重求和。]]></description><link>https://iammapping.com/use-clickhouse-to-sum-distinct/</link><guid isPermaLink="false">6522cda9caa77d0fabe3ef49</guid><category><![CDATA[ClickHouse]]></category><dc:creator><![CDATA[Iam Mapping]]></dc:creator><pubDate>Mon, 06 Sep 2021 01:47:27 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><img src="https://cdn.iammapping.com/2021/09/06/163089527597069884.png" alt="ClickHouse" loading="lazy"></p>
<h2 id>&#x524D;&#x60C5;&#x63D0;&#x8981;</h2>
<h3 id>&#x4EC0;&#x4E48;&#x662F;&#x53BB;&#x91CD;&#x52A0;&#x548C;</h3>
<p>&#x5728;&#x505A;&#x6570;&#x636E;&#x7EDF;&#x8BA1;&#x67E5;&#x8BE2;&#x65F6;&#xFF0C;&#x300C;&#x53BB;&#x91CD;&#x8BA1;&#x6570;&#x300D;&#x53EF;&#x80FD;&#x5927;&#x5BB6;&#x5E76;&#x4E0D;&#x964C;&#x751F;&#xFF0C;&#x4E5F;&#x5C31;&#x662F; <code>COUNT(DISTINCT x)</code>&#xFF0C;&#x8BBF;&#x5BA2;&#x6570;&#x3001;&#x4E70;&#x5BB6;&#x6570;&#x3001;&#x8BA2;&#x5355;&#x6570;&#x7B49;&#x90FD;&#x8981;&#x8FD9;&#x4E48;&#x6765;&#x7EDF;&#x8BA1;&#x3002;&#x90A3;&#x300C;&#x53BB;&#x91CD;&#x52A0;&#x548C;&#x300D;&#x662F;&#x4EC0;&#x4E48;&#xFF1F;&#x987E;&#x540D;&#x601D;&#x4E49;&#x5C31;&#x662F; <code>SUM(DISTINCT x)</code>&#xFF0C;&#x5BF9; x &#x53BB;&#x91CD;&#x540E;&#x7136;&#x540E;&#x505A;&#x52A0;&#x548C;&#x8FD0;&#x7B97;&#xFF0C;&#x5F97;&#x5230;&#x52A0;&#x548C;&#x4E4B;&#x540E;&#x7684;&#x503C;&#x3002;&#x6BD4;&#x5982;&#x4E00;&#x4E32;&#x6570;&#x5B57; <code>1, 2, 1, 3, 1</code>&#xFF0C;&#x53BB;&#x91CD;&#x8BA1;&#x6570;&#x4E3A; 3&#xFF0C;&#x53BB;&#x91CD;&#x52A0;&#x548C;&#x4E3A; 6&#x3002;</p>
<h3 id>&#x4E3A;&#x4EC0;&#x4E48;&#x8981;&#x53BB;&#x91CD;&#x52A0;&#x548C;</h3>
<p>&#x4E86;&#x89E3;&#x4E86;&#x300C;&#x53BB;&#x91CD;&#x52A0;&#x548C;&#x300D;&#x662F;&#x600E;&#x4E48;&#x7B97;&#x7684;&#xFF0C;&#x90A3;&#x8FD9;&#x4E2A;&#x300C;&#x53BB;&#x91CD;&#x52A0;&#x548C;&#x300D;&#x6709;&#x4EC0;&#x4E48;&#x5E94;&#x7528;&#x573A;&#x666F;&#x5462;&#xFF1F;&#x5BF9;&#x4E8B;&#x5B9E;&#x5EA6;&#x91CF;&#x6570;&#x636E;&#x8FDB;&#x884C;&#x805A;&#x5408;&#x67E5;&#x8BE2;&#x65F6;&#xFF0C;&#x6307;&#x6807;&#x7C7B;&#x578B;&#x5206;&#x4E3A;&#x53EF;&#x52A0;&#x3001;&#x534A;&#x53EF;&#x52A0;&#x3001;&#x4E0D;&#x53EF;&#x52A0;&#x4E09;&#x79CD;&#xFF0C;&#x4EE5;&#x4E0B;&#x62FF;&#x8BA2;&#x5355;&#x4E8B;&#x5B9E;&#x8868;&#x4E3A;&#x4F8B;&#x3002;</p>
<p><strong>&#x53EF;&#x52A0;</strong></p>
<p>&#x6307;&#x7684;&#x662F;&#x8BE5;&#x5EA6;&#x91CF;&#x53EF;&#x4EE5;&#x6309;&#x7167;&#x548C;&#x4E8B;&#x5B9E;&#x8868;&#x5173;&#x8054;&#x7684;&#x4EFB;&#x4E00;&#x7EF4;&#x5EA6;&#x8FDB;&#x884C;&#x6C47;&#x603B;&#x3002;&#x6BD4;&#x5982;&#xFF1A;&#x9500;&#x552E;&#x989D;&#x3001;&#x552E;&#x51FA;&#x6570;&#xFF0C;&#x6309;&#x8BA2;&#x5355;&#x3001;&#x5546;&#x54C1;&#x3001;&#x4E70;&#x5BB6;&#x7EF4;&#x5EA6;&#x7EDF;&#x8BA1;&#x90FD;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x52A0;&#x548C;&#x3002;</p>
<p><strong>&#x534A;&#x53EF;&#x52A0;</strong></p>
<p>&#x6307;&#x7684;&#x5C31;&#x662F;&#x8BE5;&#x5EA6;&#x91CF;&#x5728;&#x67D0;&#x4E9B;&#x7EF4;&#x5EA6;&#x4E0B;&#x4E0D;&#x53EF;&#x8FDB;&#x884C;&#x6C47;&#x603B;&#xFF0C;&#x6216;&#x8005;&#x8BF4;&#x6C47;&#x603B;&#x8D77;&#x6765;&#x6CA1;&#x6709;&#x610F;&#x4E49;&#x3002;&#x6BD4;&#x5982;&#xFF1A;&#x5546;&#x54C1;&#x5E93;&#x5B58;&#xFF0C;&#x53EA;&#x80FD;&#x5728;&#x5546;&#x54C1;&#x7EF4;&#x5EA6;&#x4E0B;&#x505A;&#x52A0;&#x548C;&#x624D;&#x6709;&#x610F;&#x4E49;&#xFF0C;&#x5426;&#x5219;&#x5E93;&#x5B58;&#x6570;&#x4F1A;&#x865A;&#x9AD8;&#x3002;</p>
<p><strong>&#x4E0D;&#x53EF;&#x52A0;</strong></p>
<p>&#x6307;&#x7684;&#x662F;&#x8BE5;&#x5EA6;&#x91CF;&#x5728;&#x6240;&#x6709;&#x4E0E;&#x8BE5;&#x4E8B;&#x5B9E;&#x8868;&#x5173;&#x8054;&#x7684;&#x7EF4;&#x5EA6;&#x4E0B;&#x90FD;&#x4E0D;&#x53EF;&#x8FDB;&#x884C;&#x6C47;&#x603B;&#x3002;&#x6BD4;&#x5982;&#xFF1A;&#x5BA2;&#x5355;&#x4EF7;&#xFF0C;&#x8FD9;&#x7C7B;&#x6BD4;&#x503C;&#x5B57;&#x6BB5;&#x90FD;&#x4E0D;&#x53EF;&#x76F4;&#x63A5;&#x7D2F;&#x52A0;&#xFF0C;&#x9700;&#x8981;&#x628A;&#x5206;&#x5B50;&#x3001;&#x5206;&#x6BCD;&#x5206;&#x522B;&#x6C47;&#x603B;&#x518D;&#x505A;&#x8BA1;&#x7B97;&#x3002;</p>
<p>&#x4E86;&#x89E3;&#x4E86;&#x4EE5;&#x4E0A;&#x51E0;&#x4E2A;&#x6982;&#x5FF5;&#xFF0C;&#x6211;&#x4EEC;&#x300C;&#x53BB;&#x91CD;&#x52A0;&#x548C;&#x300D;&#x4E3B;&#x8981;&#x5C31;&#x662F;&#x9488;&#x5BF9;&#x534A;&#x53EF;&#x52A0;&#x6307;&#x6807;&#x7684;&#x8BA1;&#x7B97;&#x3002;&#x4F46;&#x5728;&#x5B9E;&#x9645;&#x5E94;&#x7528;&#x4E2D;&#x76F4;&#x63A5;&#x5BF9;&#x503C;&#x505A;&#x53BB;&#x91CD;&#x7136;&#x540E;&#x52A0;&#x548C;&#x7684;&#x573A;&#x666F;&#x6BD4;&#x8F83;&#x5C11;&#xFF0C;&#x66F4;&#x591A;&#x662F;&#x50CF;&#x4E0A;&#x9762;&#x63D0;&#x5230;&#x7684;&#x5546;&#x54C1;&#x5E93;&#x5B58;&#xFF0C;&#x9700;&#x8981;&#x6309;&#x67D0;&#x4E2A;&#x7EF4;&#x5EA6;&#x53BB;&#x91CD;&#xFF0C;&#x7136;&#x540E;&#x518D;&#x52A0;&#x548C;&#x3002;&#x90A3;&#x8FD9;&#x4E48;&#x8BF4;&#x76F4;&#x63A5;&#x7528; <code>SUM(DISTINCT x)</code> &#x7684;&#x65B9;&#x5F0F;&#x4E0D;&#x884C;&#x4E86;&#x5417;&#xFF1F;&#x662F;&#x53C8;&#x4E0D;&#x662F;&#xFF0C;&#x8FD9;&#x91CC;&#x5148;&#x6309;&#x4F4F;&#x4E0D;&#x8868;&#x3002;</p>
<h2 id>&#x5982;&#x4F55;&#x505A;&#x53BB;&#x91CD;&#x52A0;&#x548C;</h2>
<p>&#x5047;&#x8BBE;&#x4E00;&#x4E2A;&#x9500;&#x552E;&#x573A;&#x666F;</p>
<ul>
<li>&#x952E;&#x9F20;&#x5957;&#x88C5;&#x7EC4;&#x5408;&#x9500;&#x552E;&#xFF0C;&#x7EC4;&#x5408;&#x4E86;&#x4E00;&#x4E2A;&#x952E;&#x76D8;&#x4E24;&#x4E2A;&#x9F20;&#x6807;&#xFF0C;&#x5546;&#x54C1; ID &#x4E3A; 123&#xFF0C;&#x952E;&#x76D8;&#x9F20;&#x6807;&#x5206;&#x522B;&#x5BF9;&#x5E94;&#x5E93;&#x5B58;&#x7CFB;&#x7EDF;&#x91CC;&#x7684;&#x4E24;&#x4E2A; SKU JP1 &#x548C; SB1</li>
<li>&#x952E;&#x76D8; JP1 &#x4E5F;&#x5355;&#x72EC;&#x9500;&#x552E;&#xFF0C;&#x5546;&#x54C1; ID &#x4E3A; 456&#xFF0C;</li>
<li>&#x540C;&#x6837;&#x9F20;&#x6807; SB1 &#x4E5F;&#x5355;&#x72EC;&#x9500;&#x552E;&#xFF0C;&#x5546;&#x54C1; ID &#x4E3A; 789</li>
</ul>
<p>&#x5BF9;&#x5E94;&#x7684;&#x9500;&#x552E;&#x8BB0;&#x5F55;&#x5982;&#x4E0B;&#xFF1A;</p>
<ul>
<li>&#x8BA2;&#x5355; o1 &#x4E70;&#x4E86; 1 &#x4E2A; 123 &#x952E;&#x9F20;&#x5957;&#x88C5;</li>
<li>&#x8BA2;&#x5355; o2 &#x4E70;&#x4E86; 2 &#x4E2A; 456 &#x952E;&#x76D8;</li>
<li>&#x8BA2;&#x5355; o3 &#x4E70;&#x4E86; 1 &#x4E2A; 789 &#x9F20;&#x6807;</li>
</ul>
<p>&#x8BA2;&#x5355;&#x4E8B;&#x5B9E;&#x8868;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code>CREATE TABLE f_order
(
    `orderID` String,
    `productID` UInt32,
    `sku` String,
    `orgQuantity` UInt16,
    `realQuantity` UInt16
)
ENGINE = MergeTree
ORDER BY orderID

INSERT INTO f_order VALUES (&apos;o1&apos;, 123, &apos;JP1&apos;, 1, 1), (&apos;o1&apos;, 123, &apos;SB1&apos;, 1, 2), (&apos;o2&apos;, 456, &apos;JP1&apos;, 2, 2), (&apos;o3&apos;, 789, &apos;SB1&apos;, 1, 1)

SELECT * 
FROM f_order

&#x250C;&#x2500;orderID&#x2500;&#x252C;&#x2500;productID&#x2500;&#x252C;&#x2500;sku&#x2500;&#x252C;&#x2500;orgQuantity&#x2500;&#x252C;&#x2500;realQuantity&#x2500;&#x2510;
&#x2502; o1      &#x2502;       123 &#x2502; JP1 &#x2502;           1 &#x2502;            1 &#x2502;
&#x2502; o1      &#x2502;       123 &#x2502; SB1 &#x2502;           1 &#x2502;            2 &#x2502;
&#x2502; o2      &#x2502;       456 &#x2502; JP1 &#x2502;           2 &#x2502;            2 &#x2502;
&#x2502; o3      &#x2502;       789 &#x2502; SB1 &#x2502;           1 &#x2502;            1 &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
</code></pre>
<blockquote>
<p>orgQurantity &#x8868;&#x793A;&#x539F;&#x59CB;&#x9500;&#x552E;&#x6570;&#x91CF;<br>
realQuantity &#x8868;&#x793A;&#x5E93;&#x5B58;&#x5B9E;&#x9645;&#x6263;&#x51CF;&#x7684;&#x6570;&#x91CF;</p>
</blockquote>
<p>&#x9700;&#x6C42;&#x65B9;&#x671F;&#x671B;&#x5F97;&#x5230;&#x8FD9;&#x6837;&#x7684;&#x7ED3;&#x679C;</p>
<ul>
<li>&#x7EDF;&#x8BA1;&#x539F;&#x59CB;&#x9500;&#x91CF;&#x6C47;&#x603B;&#x4E3A; 4&#xFF08;123&#xFF1A;1&#xFF0C;456&#xFF1A;2&#xFF0C;789&#xFF1A;1&#xFF09;</li>
<li>&#x7EDF;&#x8BA1;&#x5546;&#x54C1;&#xFF08;productID&#xFF09;&#x7EF4;&#x5EA6;&#x7684;&#x539F;&#x59CB;&#x9500;&#x91CF;&#x4E3A; 123&#xFF1A;1&#xFF0C;456&#xFF1A;2&#xFF0C;789&#xFF1A;1</li>
<li>&#x7EDF;&#x8BA1; sku &#x7EF4;&#x5EA6;&#x7684;&#x5B9E;&#x9645;&#x9500;&#x91CF;&#x4E3A; JP1&#xFF1A;3&#xFF0C;SB1&#xFF1A;3</li>
<li>&#x7EDF;&#x8BA1; sku &#x7EF4;&#x5EA6;&#x7684;&#x539F;&#x59CB;&#x9500;&#x91CF;&#x4E3A; JP1&#xFF1A;3&#xFF0C;SB1&#xFF1A;2</li>
<li>...</li>
</ul>
<p>&#x770B;&#x4E0A;&#x53BB;&#x597D;&#x50CF;&#x6709;&#x4E9B;&#x7ED5;&#xFF0C;&#x5176;&#x5B9E;&#x8FD9;&#x91CC;&#x7684;&#x5173;&#x952E;&#x70B9;&#x5C31;&#x662F;&#x7EDF;&#x8BA1;&#x539F;&#x59CB;&#x9500;&#x91CF;&#x65F6;&#xFF0C;&#x9700;&#x8981;&#x6309;&#x8BA2;&#x5355;&#x548C;&#x5546;&#x54C1;&#x7EF4;&#x5EA6;&#x53BB;&#x91CD;&#x540E;&#x518D;&#x52A0;&#x548C;&#x3002;</p>
<h3 id>&#x5E38;&#x89C4;&#x505A;&#x6CD5;</h3>
<p>&#x4F7F;&#x7528;&#x4E24;&#x5C42;&#x805A;&#x5408;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x5185;&#x5C42;&#x6309;&#x8BA2;&#x5355;&#x548C;&#x5546;&#x54C1;&#x7EF4;&#x5EA6;&#x53BB;&#x91CD;&#xFF0C;&#x5916;&#x5C42;&#x518D;&#x5BF9;&#x53BB;&#x91CD;&#x540E;&#x7684;&#x539F;&#x59CB;&#x9500;&#x552E;&#x6570;&#x91CF;&#x52A0;&#x548C;&#x3002;</p>
<p>&#x7EDF;&#x8BA1;&#x539F;&#x59CB;&#x9500;&#x91CF;&#x6C47;&#x603B;</p>
<pre><code>SELECT sum(orgQuantity) AS totalOrgQuantity
FROM
(
    SELECT any(orgQuantity) AS orgQuantity
    FROM f_order
    GROUP BY orderID, productID
)

&#x250C;&#x2500;totalOrgQuantity&#x2500;&#x2510;
&#x2502;                4 &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
</code></pre>
<p>&#x8FD9;&#x79CD;&#x5199;&#x6CD5;&#x4F18;&#x70B9;&#x662F;&#x5F88;&#x6E05;&#x6670;&#xFF0C;&#x5199;&#x6CD5;&#x7B26;&#x5408; SQL &#x76F4;&#x89C9;&#xFF1B;&#x7F3A;&#x70B9;&#x662F;&#x9700;&#x8981;&#x591A;&#x505A;&#x4E00;&#x5C42;&#x805A;&#x5408;&#xFF0C;&#x4E0D;&#x4E00;&#x5B9A;&#x80FD;&#x8DDF;&#x5176;&#x4ED6;&#x6307;&#x6807;&#x540C;&#x65F6;&#x67E5;&#x8BE2;&#x3002;</p>
<h3 id="clickhouse">ClickHouse &#x505A;&#x6CD5;</h3>
<h4 id>&#x505A;&#x6CD5;&#x4E00;</h4>
<p>&#x7EDF;&#x8BA1;&#x539F;&#x59CB;&#x9500;&#x91CF;&#x6C47;&#x603B;</p>
<pre><code>SELECT arraySum(x -&gt; (x.3), groupUniqArray((orderID, productID, orgQuantity))) AS totalOrgQuantity
FROM f_order

&#x250C;&#x2500;totalOrgQuantity&#x2500;&#x2510;
&#x2502;                4 &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
</code></pre>
<p>&#x5C06; (orderID, productID, orgQuantity) &#x4F5C;&#x4E3A;&#x4E00;&#x4E2A;&#x5143;&#x7EC4; Tuple&#xFF0C;&#x7136;&#x540E;&#x901A;&#x8FC7; <code>groupUniqArray</code> &#x805A;&#x5408;&#x6210;&#x4E00;&#x4E2A;&#x53BB;&#x91CD;&#x540E;&#x7684;&#x6570;&#x7EC4;&#xFF0C;&#x518D;&#x7528; <code>arraySum</code> &#x5BF9;&#x6570;&#x7EC4;&#x4E2D;&#x6BCF;&#x4E00;&#x9879;&#x5143;&#x7EC4;&#x7684;&#x7B2C; 3 &#x9879;&#x4E5F;&#x5C31;&#x662F; <code>orgQuantity</code> &#x8FDB;&#x884C;&#x52A0;&#x548C;&#x3002;</p>
<p>&#x8FD9;&#x4E2A;&#x505A;&#x6CD5;&#x4F18;&#x70B9;&#x662F;&#x53EA;&#x8981;&#x4E00;&#x5C42;&#x805A;&#x5408;&#xFF0C;&#x8DDF;&#x5176;&#x4ED6;&#x6307;&#x6807;&#x4E00;&#x8D77;&#x67E5;&#x8BE2;&#x6CA1;&#x5565;&#x969C;&#x788D;&#xFF1B;&#x7F3A;&#x70B9;&#x662F;&#x5982;&#x679C;&#x53BB;&#x91CD;&#x540E;&#x7684;&#x6570;&#x7EC4;&#x975E;&#x5E38;&#x5927;&#xFF0C;&#x5C06;&#x975E;&#x5E38;&#x5F71;&#x54CD;&#x67E5;&#x8BE2;&#x6027;&#x80FD;&#x3002;</p>
<p>&#x770B;&#x4E0B;&#x8FD9;&#x4E24;&#x6761;&#x8BED;&#x53E5;&#x7684;&#x6267;&#x884C;&#x8017;&#x65F6;&#x5C31;&#x77E5;&#x9053;&#x4E86;&#xFF1A;</p>
<pre><code>SELECT sum(number) AS x
FROM
(
    SELECT number
    FROM numbers(10000000)
)

&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;x&#x2500;&#x2510;
&#x2502; 49999995000000 &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;

1 rows in set. Elapsed: 0.012 sec. Processed 10.02 million rows, 80.18 MB (814.14 million rows/s., 6.51 GB/s.)


SELECT arraySum(x -&gt; x, groupUniqArray(number)) AS x
FROM numbers(10000000)

&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;x&#x2500;&#x2510;
&#x2502; 49999995000000 &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;

1 rows in set. Elapsed: 1.264 sec. Processed 10.02 million rows, 80.18 MB (7.93 million rows/s., 63.45 MB/s.)
</code></pre>
<p>&#x5DEE;&#x7684;&#x4E0D;&#x662F;&#x4E00;&#x70B9;&#x534A;&#x70B9;&#xFF0C;&#x800C;&#x662F; 100 &#x500D;&#xFF0C;&#x8FD9;&#x80AF;&#x5B9A;&#x6CA1;&#x6CD5;&#x63A5;&#x53D7;&#x3002;</p>
<h4 id>&#x505A;&#x6CD5;&#x4E8C;</h4>
<p>&#x65E2;&#x7136;&#x505A;&#x6CD5;&#x4E00;&#x4E3B;&#x8981;&#x6027;&#x80FD;&#x95EE;&#x9898;&#x51FA;&#x5728;&#x53BB;&#x91CD;&#x540E;&#x6570;&#x7EC4;&#x592A;&#x5927;&#x4E0A;&#xFF0C;&#x90A3;&#x6211;&#x4EEC;&#x5C31;&#x60F3;&#x529E;&#x6CD5;&#x7F29;&#x5C0F;&#x8FD9;&#x4E2A;&#x6570;&#x7EC4;&#x3002;&#x56DE;&#x5230;&#x9700;&#x6C42;&#x4E0A;&#xFF0C;&#x6211;&#x4EEC;&#x4E0D;&#x96BE;&#x53D1;&#x73B0;&#x53EA;&#x6709;&#x7EC4;&#x5408;&#x9500;&#x552E;&#x7684;&#x5546;&#x54C1;&#x624D;&#x8981;&#x53BB;&#x91CD;&#xFF0C;&#x666E;&#x901A;&#x7684;&#x5546;&#x54C1;&#x76F4;&#x63A5;&#x52A0;&#x548C;&#x5C31;&#x884C;&#xFF0C;&#x800C;&#x6B63;&#x5E38;&#x7684;&#x9500;&#x552E;&#x573A;&#x666F;&#x4E2D;&#x7EC4;&#x5408;&#x5546;&#x54C1;&#x5360;&#x6BD4;&#x5F88;&#x5C11;&#xFF0C;&#x521A;&#x597D;&#x53EF;&#x4EE5;&#x7528;&#x8FD9;&#x4E2A;&#x300C;&#x662F;&#x5426;&#x7EC4;&#x5408;&#x5546;&#x54C1;&#x300D;&#x7684;&#x6761;&#x4EF6;&#x6765;&#x51CF;&#x5C11;&#x9700;&#x8981;&#x53BB;&#x91CD;&#x7684;&#x6570;&#x91CF;&#x3002;</p>
<p>&#x4E0D;&#x8FC7;&#x5728;&#x67E5;&#x8BE2;&#x4E4B;&#x524D;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x5BF9;&#x4EE5;&#x4E0A; <code>f_order</code> &#x8868;&#x6539;&#x9020;&#x4E0B;</p>
<pre><code>-- &#x5C06; orgQuantity &#x4FEE;&#x6539;&#x4E3A; Tuple(k Nullable(UInt32), q UInt16) &#x7C7B;&#x578B;
-- &#x7B2C;&#x4E00;&#x4F4D; k &#x4F5C;&#x53BB;&#x91CD;&#x952E;&#xFF0C;&#x53D6;&#x503C; NULL &#x8868;&#x793A;&#x975E;&#x7EC4;&#x5408;&#x5546;&#x54C1;&#xFF0C;&#x6709;&#x503C;&#x65F6;&#x4E3A;&#x7EC4;&#x5408;&#x5546;&#x54C1;&#x5F53;&#x524D;&#x8BA2;&#x5355;&#x7684;&#x8BA2;&#x5355;&#x53F7;&#x548C;&#x5546;&#x54C1; ID &#x7684; crc32 &#x503C;
CREATE TABLE f_order_2
(
    `orderID` String,
    `productID` UInt32,
    `sku` String,
    `orgQuantity` Tuple(k Nullable(UInt32), q UInt16),
    `realQuantity` UInt16
)
ENGINE = MergeTree
ORDER BY orderID
SETTINGS index_granularity = 8192

-- &#x4ECE; f_order &#x4E2D;&#x5BFC;&#x5165;&#x6570;&#x636E;&#xFF0C;&#x4EC5; productID &#x4E3A; 123 &#x7EC4;&#x5408;&#x5546;&#x54C1;&#x65F6;&#x624D;&#x8D4B;&#x503C;&#x7ED9; orgQuantity.k
INSERT INTO f_order_2 SELECT
    orderID,
    productID,
    sku,
    (if(productID = 123, crc32(concat(orderID, toString(productID))), NULL), orgQuantity),
    realQuantity
FROM f_order

SELECT *
FROM f_order_2

&#x250C;&#x2500;orderID&#x2500;&#x252C;&#x2500;productID&#x2500;&#x252C;&#x2500;sku&#x2500;&#x252C;&#x2500;orgQuantity&#x2500;&#x2500;&#x2500;&#x2500;&#x252C;&#x2500;realQuantity&#x2500;&#x2510;
&#x2502; o1      &#x2502;       123 &#x2502; JP1 &#x2502; (3806212741,1) &#x2502;            1 &#x2502;
&#x2502; o1      &#x2502;       123 &#x2502; SB1 &#x2502; (3806212741,1) &#x2502;            2 &#x2502;
&#x2502; o2      &#x2502;       456 &#x2502; JP1 &#x2502; (NULL,2)       &#x2502;            2 &#x2502;
&#x2502; o3      &#x2502;       789 &#x2502; SB1 &#x2502; (NULL,1)       &#x2502;            1 &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
</code></pre>
<p>&#x67E5;&#x8BE2;&#x8BED;&#x53E5;&#x6539;&#x5199;</p>
<pre><code>SELECT arraySum(x -&gt; (x.2), groupUniqArrayIf(orgQuantity, isNotNull(orgQuantity.k))) + sumIf(orgQuantity.q, isNull(orgQuantity.k)) AS totalOrgQuantity
FROM f_order_3

&#x250C;&#x2500;totalOrgQuantity&#x2500;&#x2510;
&#x2502;                4 &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
</code></pre>
<p>&#x8BED;&#x53E5;&#x5206;&#x4E3A;&#x4E24;&#x90E8;&#x5206;&#x76F8;&#x52A0;&#x7EC4;&#x6210;&#xFF0C;&#x7B2C;&#x4E00;&#x90E8;&#x5206;&#x8DDF;&#x505A;&#x6CD5;&#x4E00;&#x7C7B;&#x4F3C;&#xFF0C;&#x4F46;&#x52A0;&#x5165;&#x4E86;&#x6761;&#x4EF6;&#x5224;&#x65AD;&#xFF0C;&#x53EA;&#x6709;&#x7EC4;&#x5408;&#x5546;&#x54C1;&#x53C2;&#x4E0E;&#x53BB;&#x91CD;&#x52A0;&#x548C;&#xFF1B;&#x7B2C;&#x4E8C;&#x90E8;&#x5206;&#x4E5F;&#x6709;&#x6761;&#x4EF6;&#x5224;&#x65AD;&#xFF0C;&#x5BF9;&#x975E;&#x7EC4;&#x5408;&#x5546;&#x54C1;&#x76F4;&#x63A5;&#x7D2F;&#x52A0;&#x6570;&#x91CF;&#xFF0C;&#x8FD9;&#x6837;&#x8BA9;&#x7EDD;&#x5927;&#x591A;&#x6570;&#x975E;&#x7EC4;&#x5408;&#x5546;&#x54C1;&#x76F4;&#x63A5;&#x7D2F;&#x52A0;&#xFF0C;&#x5C31;&#x5927;&#x5927;&#x51CF;&#x5C11;&#x4E86;&#x53BB;&#x91CD;&#x52A0;&#x548C;&#x7684;&#x5F00;&#x9500;&#x3002;</p>
<p>&#x884C;&#x6587;&#x81F3;&#x6B64;&#xFF0C;&#x662F;&#x4E0D;&#x662F;&#x89C9;&#x5F97;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#x5DF2;&#x7ECF;&#x5B8C;&#x7F8E;&#x89E3;&#x51B3;&#x4E86;&#xFF0C;&#x8FD8;&#x8BB0;&#x5F97;&#x524D;&#x6587;&#x90A3;&#x4E2A;&#x300C;&#x662F;&#x53C8;&#x4E0D;&#x662F;&#x300D;&#x7684;&#x56DE;&#x7B54;&#x5417;&#xFF0C;&#x4E3A;&#x4EC0;&#x4E48;&#x8FD9;&#x4E48;&#x8BF4;&#x5462;&#xFF0C;&#x6211;&#x4EEC;&#x6765;&#x770B;&#x770B;&#x505A;&#x6CD5;&#x4E09;&#x3002;</p>
<h4 id>&#x505A;&#x6CD5;&#x4E09;</h4>
<p>&#x5982;&#x679C;&#x4F60;&#x8FD8;&#x5BF9; <code>SUM(DISTINCT x)</code> &#x803F;&#x803F;&#x4E8E;&#x6000;&#xFF0C;&#x90A3;&#x544A;&#x8BC9;&#x4F60;&#x5FF5;&#x5FF5;&#x4E0D;&#x5FD8;&#xFF0C;&#x5FC5;&#x6709;&#x56DE;&#x54CD;&#x3002;&#x7ECF;&#x8FC7;&#x505A;&#x6CD5;&#x4E8C;&#xFF0C;&#x4F7F;&#x7528;&#x5143;&#x7EC4;&#x4FDD;&#x5B58;&#x4E86;&#x300C;&#x53BB;&#x91CD;&#x952E;&#x300D;&#x53CA;&#x300C;&#x539F;&#x59CB;&#x6570;&#x91CF;&#x300D;&#xFF0C;&#x90A3;&#x662F;&#x4E0D;&#x662F;&#x53EF;&#x4EE5;&#x66F4;&#x8FDB;&#x4E00;&#x6B65;&#xFF0C;&#x62FF; <code>UInt64</code> &#x7C7B;&#x578B;&#x5206;&#x4E24;&#x6BB5;&#x6765;&#x5206;&#x522B;&#x4FDD;&#x5B58;&#x300C;&#x53BB;&#x91CD;&#x952E;&#x300D;&#x548C;&#x300C;&#x539F;&#x59CB;&#x6570;&#x91CF;&#x300D;&#xFF0C;&#x9AD8;&#x4F4D; 33 ~ 64 &#x7528;&#x6765;&#x4FDD;&#x5B58;&#x300C;&#x53BB;&#x91CD;&#x952E;&#x300D;&#xFF0C;&#x4F4E;&#x4F4D; 1 ~ 32 &#x7528;&#x6765;&#x4FDD;&#x5B58;&#x300C;&#x539F;&#x59CB;&#x6570;&#x91CF;&#x300D;&#xFF0C;&#x9AD8;&#x4F4D;&#x548C;&#x4F4E;&#x4F4D;&#x7684;&#x52A0;&#x548C;&#x4E0D;&#x51B2;&#x7A81;&#xFF0C;&#x67E5;&#x8BE2;&#x52A0;&#x548C;&#x540E;&#x53D6;&#x4F4E;&#x4F4D; 1 ~ 32 &#x7684;&#x503C;&#x4F5C;&#x4E3A;&#x7ED3;&#x679C;&#xFF08;&#x89C1;&#x4E0B;&#x56FE;&#xFF09;&#xFF0C;&#x7406;&#x8BBA;&#x53EF;&#x884C;&#xFF0C;&#x5B9E;&#x8DF5;&#x5F00;&#x59CB;&#x3002;</p>
<p><img src="https://cdn.iammapping.com/2021/09/06/163089484070637170.png" alt="&#x9AD8;&#x4F4E;&#x4F4D;&#x4FDD;&#x5B58;" loading="lazy"></p>
<p>&#x6539;&#x9020;&#x8868;</p>
<pre><code>-- &#x5C06; orgQuantity &#x4FEE;&#x6539;&#x4E3A; UInt64 &#x7C7B;&#x578B;
-- &#x9AD8;&#x4F4D; 33 ~ 64 &#x7528;&#x6765;&#x4FDD;&#x5B58;&#x300C;&#x53BB;&#x91CD;&#x952E;&#x300D;, &#x4E3A; 0 &#x8868;&#x793A;&#x975E;&#x7EC4;&#x5408;&#x5546;&#x54C1;&#xFF0C;&#x6709;&#x503C;&#x65F6;&#x4E3A;&#x7EC4;&#x5408;&#x5546;&#x54C1;&#x5F53;&#x524D;&#x8BA2;&#x5355;&#x7684;&#x8BA2;&#x5355;&#x53F7;&#x548C;&#x5546;&#x54C1; ID &#x7684; crc32 &#x503C;
CREATE TABLE f_order_3
(
    `orderID` String,
    `productID` UInt32,
    `sku` String,
    `orgQuantity` UInt64,
    `realQuantity` UInt16
)
ENGINE = MergeTree
ORDER BY orderID
SETTINGS index_granularity = 8192

-- &#x4ECE; f_order &#x4E2D;&#x5BFC;&#x5165;&#x6570;&#x636E;&#xFF0C;&#x4EC5; productID &#x4E3A; 123 &#x7EC4;&#x5408;&#x5546;&#x54C1;&#x65F6;&#x624D;&#x8D4B;&#x503C;&#x7ED9; orgQuantity.k
INSERT INTO f_order_3 SELECT
    orderID,
    productID,
    sku,
    bitShiftLeft(toUInt64(if(productID = 123, crc32(concat(orderID, toString(productID))), 0)), 32) + orgQuantity,
    realQuantity
FROM f_order

SELECT *
FROM f_order_3

&#x250C;&#x2500;orderID&#x2500;&#x252C;&#x2500;productID&#x2500;&#x252C;&#x2500;sku&#x2500;&#x252C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;orgQuantity&#x2500;&#x252C;&#x2500;realQuantity&#x2500;&#x2510;
&#x2502; o1      &#x2502;       123 &#x2502; JP1 &#x2502; 16347559244213518337 &#x2502;            1 &#x2502;
&#x2502; o1      &#x2502;       123 &#x2502; SB1 &#x2502; 16347559244213518337 &#x2502;            2 &#x2502;
&#x2502; o2      &#x2502;       456 &#x2502; JP1 &#x2502;                    2 &#x2502;            2 &#x2502;
&#x2502; o3      &#x2502;       789 &#x2502; SB1 &#x2502;                    1 &#x2502;            1 &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
</code></pre>
<p>&#x67E5;&#x8BE2;</p>
<pre><code>-- &#x7EDF;&#x8BA1;&#x539F;&#x59CB;&#x9500;&#x91CF;&#x6C47;&#x603B;&#x4E3A; 4&#xFF08;123&#xFF1A;1&#xFF0C;456&#xFF1A;2&#xFF0C;789&#xFF1A;1&#xFF09;
SELECT bitAnd(sumDistinctIf(orgQuantity, orgQuantity &gt;= 4294967296), 4294967295) + sumIf(orgQuantity, orgQuantity &lt; 4294967296) AS totalOrgQuantity
FROM f_order_3

&#x250C;&#x2500;totalOrgQuantity&#x2500;&#x2510;
&#x2502;                4 &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;


-- &#x7EDF;&#x8BA1;&#x5546;&#x54C1;&#xFF08;productID&#xFF09;&#x7EF4;&#x5EA6;&#x7684;&#x539F;&#x59CB;&#x9500;&#x91CF;&#x4E3A; 123&#xFF1A;1&#xFF0C;456&#xFF1A;2&#xFF0C;789&#xFF1A;1
SELECT
    productID,
    bitAnd(sumDistinctIf(orgQuantity, orgQuantity &gt;= 4294967296), 4294967295) + sumIf(orgQuantity, orgQuantity &lt; 4294967296) AS totalOrgQuantity
FROM f_order_3
GROUP BY productID

&#x250C;&#x2500;productID&#x2500;&#x252C;&#x2500;totalOrgQuantity&#x2500;&#x2510;
&#x2502;       456 &#x2502;                2 &#x2502;
&#x2502;       789 &#x2502;                1 &#x2502;
&#x2502;       123 &#x2502;                1 &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;


-- &#x7EDF;&#x8BA1; sku &#x7EF4;&#x5EA6;&#x7684;&#x5B9E;&#x9645;&#x9500;&#x91CF;&#x4E3A; JP1&#xFF1A;3&#xFF0C;SB1&#xFF1A;3
SELECT
    sku,
    sum(realQuantity) AS totalRealQuantity
FROM f_order_3
GROUP BY sku

&#x250C;&#x2500;sku&#x2500;&#x252C;&#x2500;totalRealQuantity&#x2500;&#x2510;
&#x2502; JP1 &#x2502;                 3 &#x2502;
&#x2502; SB1 &#x2502;                 3 &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;


-- &#x7EDF;&#x8BA1; sku &#x7EF4;&#x5EA6;&#x7684;&#x539F;&#x59CB;&#x9500;&#x91CF;&#x4E3A; JP1&#xFF1A;3&#xFF0C;SB1&#xFF1A;2
SELECT
    sku,
    bitAnd(sumDistinctIf(orgQuantity, orgQuantity &gt;= 4294967296), 4294967295) + sumIf(orgQuantity, orgQuantity &lt; 4294967296) AS totalOrgQuantity
FROM f_order_3
GROUP BY sku

&#x250C;&#x2500;sku&#x2500;&#x252C;&#x2500;totalOrgQuantity&#x2500;&#x2510;
&#x2502; JP1 &#x2502;                3 &#x2502;
&#x2502; SB1 &#x2502;                2 &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2534;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;
</code></pre>
<p>&#x8BED;&#x53E5;&#x5206;&#x540C;&#x6837;&#x4E3A;&#x4E24;&#x90E8;&#x5206;&#x7EC4;&#x6210;&#xFF0C;&#x7B2C;&#x4E00;&#x90E8;&#x5206;&#x6761;&#x4EF6; <code>orgQuantity &gt;= 4294967296</code> &#x8868;&#x793A;&#x6709;&#x53BB;&#x91CD;&#x952E;&#x662F;&#x7EC4;&#x5408;&#x5546;&#x54C1;&#xFF0C;&#x9700;&#x8981;&#x8FDB;&#x884C;&#x53BB;&#x91CD;&#x52A0;&#x548C;&#xFF0C;&#x76F4;&#x63A5;&#x4F7F;&#x7528; <code>sumDistinct</code> &#x505A;&#x52A0;&#x548C;&#xFF0C;&#x5BF9;&#x52A0;&#x548C;&#x540E;&#x7684;&#x7ED3;&#x679C;&#x4F7F;&#x7528; <code>bitAnd</code> &#x53D6;&#x51FA;&#x4F4E;&#x4F4D; 1 ~ 32&#xFF1B;&#x7B2C;&#x4E8C;&#x90E8;&#x5206;&#x6761;&#x4EF6; <code>orgQuantity &lt; 4294967296</code> &#x8868;&#x793A;&#x6CA1;&#x6709;&#x53BB;&#x91CD;&#x952E;&#x662F;&#x975E;&#x7EC4;&#x5408;&#x5546;&#x54C1;&#xFF0C;&#x76F4;&#x63A5;&#x7D2F;&#x52A0;&#x6570;&#x91CF;&#xFF1B;&#x6700;&#x540E;&#x4E24;&#x90E8;&#x5206;&#x76F8;&#x52A0;&#x5F97;&#x51FA;&#x6B63;&#x786E;&#x7ED3;&#x679C;&#x3002;</p>
<h4 id>&#x5C0F;&#x7ED3;</h4>
<p>&#x505A;&#x6CD5;&#x4E8C;&#x548C;&#x505A;&#x6CD5;&#x4E09;&#x770B;&#x4E0A;&#x53BB;&#x90FD;&#x80FD;&#x6EE1;&#x8DB3;&#x9700;&#x6C42;&#xFF0C;&#x5230;&#x5E95;&#x5E94;&#x8BE5;&#x7528;&#x54EA;&#x4E2A;&#x5462;&#xFF1F;&#x5148;&#x4E0D;&#x6025;&#x7740;&#x4E0B;&#x7ED3;&#x8BBA;&#xFF0C;&#x6211;&#x4EEC;&#x518D;&#x5BF9;&#x6BD4;&#x4E0B;&#x4E24;&#x8005;&#x7684;&#x6027;&#x80FD;&#xFF1A;</p>
<p>&#x6A21;&#x62DF;&#x505A;&#x6CD5;&#x4E8C;</p>
<pre><code>CREATE TABLE x_tuple
(
    `x` Tuple(Nullable(UInt32), UInt16)
)
ENGINE = MergeTree
ORDER BY x

-- &#x6A21;&#x62DF; 9 / 10 &#x7684;&#x6570;&#x636E;&#x4E3A;&#x975E;&#x7EC4;&#x5408;&#x5546;&#x54C1;&#xFF08;&#x6CA1;&#x6709;&#x53BB;&#x91CD;&#x952E;&#xFF09;
INSERT INTO x_tuple SELECT x
FROM
(
    SELECT
        number % 100000 AS y,
        (if(y &gt; 90000, NULL, y), (number % 4) + 1) AS x
    FROM numbers(10000000)
)

SELECT arraySum(x -&gt; (x.2), groupUniqArrayIf(x, isNotNull(x.1))) + sumIf(x.2, isNull(x.1)) AS x
FROM x_tuple

&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;x&#x2500;&#x2510;
&#x2502; 2724901 &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;

1 rows in set. Elapsed: 0.381 sec. Processed 10.00 million rows, 70.00 MB (26.26 million rows/s., 183.81 MB/s.)
</code></pre>
<p>&#x6A21;&#x62DF;&#x505A;&#x6CD5;&#x4E09;</p>
<pre><code>CREATE TABLE x_distinct
(
    `x` UInt64
)
ENGINE = MergeTree
ORDER BY x

-- &#x6A21;&#x62DF; 9 / 10 &#x7684;&#x6570;&#x636E;&#x4E3A;&#x975E;&#x7EC4;&#x5408;&#x5546;&#x54C1;&#xFF08;&#x6CA1;&#x6709;&#x53BB;&#x91CD;&#x952E;&#xFF09;
INSERT INTO x_distinct SELECT x
FROM
(
    SELECT
        number % 100000 AS y,
        (if(y &gt; 90000, 0, bitShiftLeft(toUInt64(y + 1), 32)) + (number % 4)) + 1 AS x
    FROM numbers(10000000)
)

SELECT bitAnd(sumDistinctIf(x, x &gt;= 4294967296), 4294967295) + sumIf(x, x &lt; 4294967296) AS x
FROM x_distinct

&#x250C;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;x&#x2500;&#x2510;
&#x2502; 2724901 &#x2502;
&#x2514;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2500;&#x2518;

1 rows in set. Elapsed: 0.170 sec. Processed 10.00 million rows, 80.00 MB (58.71 million rows/s., 469.69 MB/s.)
</code></pre>
<p>&#x4ECE;&#x4E0A;&#x9762;&#x7ED3;&#x679C;&#x770B;&#x51FA;&#xFF0C;&#x505A;&#x6CD5;&#x4E09;&#x5728;&#x6027;&#x80FD;&#x4E0A;&#x8FD8;&#x662F;&#x5FEB;&#x4E86;&#x4E00;&#x5927;&#x622A;&#x3002;</p>
<p>&#x90A3;&#x4E48;&#x679C;&#x65AD;&#x4F7F;&#x7528;&#x505A;&#x6CD5;&#x4E09;&#x5417;&#xFF0C;&#x5176;&#x5B9E;&#x4E0D;&#x7136;&#xFF0C;&#x5982;&#x679C;&#x7ECF;&#x5E38;&#x8981;&#x67E5;&#x770B;&#x539F;&#x59CB;&#x6570;&#x636E;&#xFF0C;&#x5EFA;&#x8BAE;&#x8FD8;&#x662F;&#x4F7F;&#x7528;&#x505A;&#x6CD5;&#x4E8C;&#xFF0C;&#x6BD5;&#x7ADF;&#x505A;&#x6CD5;&#x4E09;&#x50CF;&#x7ED9;&#x6570;&#x91CF;&#x300C;&#x52A0;&#x5BC6;&#x300D;&#x4E86;&#xFF0C;&#x6CA1;&#x6CD5;&#x8089;&#x773C;&#x770B;&#x51FA;&#x539F;&#x59CB;&#x6570;&#x91CF;&#x591A;&#x5C11;&#xFF0C;&#x4E3A;&#x4E86;&#x4E00;&#x70B9;&#x6027;&#x80FD;&#xFF0C;&#x635F;&#x5931;&#x4FBF;&#x5229;&#x6027;&#xFF0C;&#x6709;&#x70B9;&#x5F97;&#x4E0D;&#x507F;&#x5931;&#xFF1B;&#x505A;&#x6CD5;&#x4E09;&#x8FD8;&#x6709;&#x4E00;&#x4E2A;&#x5929;&#x751F;&#x7684;&#x77ED;&#x677F;&#xFF0C;&#x4F4E;&#x4F4D;&#x52A0;&#x548C;&#x8D85;&#x8FC7; <code>4294967295</code> &#x540E;&#x6570;&#x636E;&#x5C31;&#x5F00;&#x59CB;&#x9519;&#x4E71;&#x4E86;&#xFF0C;&#x4F46;&#x8FD9;&#x4E2A;&#x503C;&#x4E5F;&#x8DB3;&#x591F;&#x9500;&#x91CF;&#x6307;&#x6807;&#x7528;&#x4E86;&#x3002;</p>
<h2 id>&#x603B;&#x7ED3;</h2>
<p>&#x672C;&#x6587;&#x901A;&#x8FC7;&#x300C;&#x53BB;&#x91CD;&#x52A0;&#x548C;&#x300D;&#x8FD9;&#x4E2A;&#x573A;&#x666F;&#xFF0C;&#x5C55;&#x73B0;&#x51FA; ClickHouse &#x67E5;&#x8BE2;&#x8BED;&#x6CD5;&#x7684;&#x7075;&#x6D3B;&#x6027;&#xFF0C;&#x4EE5;&#x53CA;&#x5B58;&#x50A8;&#x683C;&#x5F0F;&#x7684;&#x591A;&#x6837;&#x6027;&#xFF0C;&#x629B;&#x7816;&#x5F15;&#x7389;&#xFF0C;&#x5E0C;&#x671B;&#x53EF;&#x4EE5;&#x62D3;&#x5BBD;&#x8BFB;&#x8005;&#x4F7F;&#x7528; ClickHouse &#x89E3;&#x51B3;&#x67E5;&#x8BE2;&#x95EE;&#x9898;&#x7684;&#x601D;&#x8DEF;&#x3002;&#x82E5;&#x300C;&#x67E5;&#x8BE2;&#x7EC4;&#x5408;&#x5546;&#x54C1;&#x7684;&#x539F;&#x59CB;&#x9500;&#x91CF;&#x6C47;&#x603B;&#x300D;&#x8FD9;&#x4E00;&#x7279;&#x5B9A;&#x6848;&#x4F8B;&#x7684;&#x6A21;&#x62DF;&#xFF0C;&#x80FD;&#x5E2E;&#x52A9;&#x8BFB;&#x8005;&#x89E3;&#x51B3;&#x7C7B;&#x4F3C;&#x6570;&#x636E;&#x67E5;&#x8BE2;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x500D;&#x611F;&#x8363;&#x5E78;&#x3002;</p>
<blockquote>
<p>&#x6CE8;&#xFF1A;&#x672C;&#x6587;&#x6240;&#x6709;&#x8BED;&#x53E5;&#x5747;&#x8FD0;&#x884C;&#x5728; ClickHouse 21.8.4.51 &#x7248;&#x672C;&#x4E0A;&#xFF0C;&#x8FC7;&#x4F4E;&#x7684;&#x7248;&#x672C;&#x53EF;&#x80FD;&#x65E0;&#x6CD5;&#x652F;&#x6301; <code>sumDistinct</code> &#x51FD;&#x6570;&#xFF0C;&#x8BF7;&#x8BFB;&#x8005;&#x81EA;&#x884C;&#x8FA8;&#x522B;&#x3002;</p>
</blockquote>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[在婚礼上搞点事情如何]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p><img src="https://cdn.iammapping.com/2017/10/22/150868155464033161.png" alt="PM Infinity" loading="lazy"></p>
<p>&#x524D;&#x51E0;&#x5929;&#x88AB;&#x65B0;&#x6D6A;&#x7684;&#x4E00;&#x4F4D;&#x7A0B;&#x5E8F;&#x5458;&#x5237;&#x5C4F;&#x4E86;&#xFF0C;&#x5A5A;&#x793C;&#x73B0;&#x573A;&#x8FD8;&#x8981;&#x8DD1;&#x53BB;&#x4FEE; bug&#xFF0C;&#x8FD9;&#x4E8B;&#x5F97;&#x8D56;&#x9E7F;&#x6657;&#x3002;&#x770B;&#x5230;&#x4E4B;&#x540E;&#x60F3;&#x8D77;&#x6211;&#x7684;&#x5A5A;&#x793C;&#xFF0C;&#x90A3;&#x662F;&#x4E00;&#x5E74;&#x524D;</p>]]></description><link>https://iammapping.com/lets-do-something-cool-on-the-wedding/</link><guid isPermaLink="false">6522cda9caa77d0fabe3ef46</guid><category><![CDATA[NodeJs]]></category><category><![CDATA[Product]]></category><dc:creator><![CDATA[Iam Mapping]]></dc:creator><pubDate>Sun, 22 Oct 2017 14:20:33 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><img src="https://cdn.iammapping.com/2017/10/22/150868155464033161.png" alt="PM Infinity" loading="lazy"></p>
<p>&#x524D;&#x51E0;&#x5929;&#x88AB;&#x65B0;&#x6D6A;&#x7684;&#x4E00;&#x4F4D;&#x7A0B;&#x5E8F;&#x5458;&#x5237;&#x5C4F;&#x4E86;&#xFF0C;&#x5A5A;&#x793C;&#x73B0;&#x573A;&#x8FD8;&#x8981;&#x8DD1;&#x53BB;&#x4FEE; bug&#xFF0C;&#x8FD9;&#x4E8B;&#x5F97;&#x8D56;&#x9E7F;&#x6657;&#x3002;&#x770B;&#x5230;&#x4E4B;&#x540E;&#x60F3;&#x8D77;&#x6211;&#x7684;&#x5A5A;&#x793C;&#xFF0C;&#x90A3;&#x662F;&#x4E00;&#x5E74;&#x524D;&#x4E5F;&#x662F;&#x5728;&#x56FD;&#x5E86;&#x3002;&#x8DDD;&#x5A5A;&#x793C;&#x8FD8;&#x6709;&#x4E00;&#x4E2A;&#x6708;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x5FC3;&#x60F3;&#x8FD9;&#x53EF;&#x662F;&#x4E00;&#x8F88;&#x5B50;&#x7684;&#x5927;&#x4E8B;&#xFF0C;&#x5728;&#x4F17;&#x591A;&#x4EB2;&#x670B;&#x597D;&#x53CB;&#x9762;&#x524D;&#x641E;&#x70B9;&#x6BD4;&#x8F83; cool &#x7684;&#x4E8B;&#x60C5;&#xFF0C;&#x8FD9;&#x6837;&#x4F1A;&#x4E0D;&#x4F1A;&#x8BA9;&#x5927;&#x5BB6;&#x5370;&#x8C61;&#x6DF1;&#x523B;&#x70B9;&#x3002;</p>
<h2 id="cool">&#x600E;&#x6837;&#x4F1A;&#x6BD4;&#x8F83; cool</h2>
<p>&#x5E0C;&#x671B;&#x4F60;&#x770B;&#x5230;&#x8FD9;&#x4E2A;&#x6807;&#x9898;&#x4E0D;&#x8981;&#x4EE5;&#x4E3A;&#x662F;&#x8BA9;&#x57FA;&#x53CB;&#x62C9;&#x7740;&#x6211;&#x79C1;&#x5954;&#x1F631;&#x3002;&#x8BA9;&#x73B0;&#x573A;&#x6240;&#x6709;&#x5BBE;&#x5BA2;&#x90FD;&#x80FD;&#x53C2;&#x4E0E;&#x8FDB;&#x6765;&#xFF0C;&#x5BF9;&#xFF0C;&#x8FD9;&#x5E94;&#x8BE5;&#x6BD4;&#x8F83; cool&#x3002;&#x6839;&#x636E;&#x4EE5;&#x5F80;&#x53C2;&#x52A0;&#x522B;&#x4EBA;&#x5A5A;&#x793C;&#x7684;&#x7ECF;&#x9A8C;&#xFF0C;&#x6D41;&#x7A0B;&#x5927;&#x6982;&#x662F;&#xFF1A;&#x4E3B;&#x6301;&#x4EBA;&#x5F15;&#x5BFC;&#x65B0;&#x90CE;&#x65B0;&#x5A18;&#x8FDB;&#x573A;&#xFF0C;&#x65B0;&#x90CE;&#x65B0;&#x5A18;&#x7ACB;&#x4E0B;&#x6D77;&#x8A93;&#x5C71;&#x76DF;&#xFF0C;&#x65B0;&#x90CE;&#x65B0;&#x5A18;&#x53CC;&#x65B9;&#x7236;&#x6BCD;&#x767B;&#x53F0;&#xFF0C;&#x7136;&#x540E;&#x5168;&#x573A;&#x4E00;&#x8D77;&#x4E3E;&#x676F;&#x795D;&#x798F;&#x65B0;&#x4EBA;&#xFF0C;&#x6700;&#x540E;&#x4E00;&#x76F4;&#x5403;&#x5230;&#x5A5A;&#x793C;&#x7ED3;&#x675F;&#x3002;&#x5BBE;&#x5BA2;&#x9664;&#x4E86;&#x90A3;&#x4E00;&#x6B21;&#x4E3E;&#x676F;&#xFF0C;&#x5168;&#x7A0B;&#x90FD;&#x662F;&#x8DEF;&#x4EBA;&#xFF0C;&#x53C2;&#x4E0E;&#x611F;&#x975E;&#x5E38;&#x4F4E;&#x3002;&#x6709;&#x7684;&#x5A5A;&#x793C;&#x4F1A;&#x6709;&#x4E9B;&#x4E92;&#x52A8;&#xFF0C;&#x8FD9;&#x5B8C;&#x5168;&#x770B;&#x4E3B;&#x6301;&#x4EBA;&#x7684;&#x4E2A;&#x4EBA;&#x98CE;&#x683C;&#x4E86;&#x3002;</p>
<p>&#x8981;&#x8C03;&#x52A8;&#x73B0;&#x573A;&#xFF0C;&#x7AD9;&#x5728;&#x53F0;&#x4E0A;&#x6492;&#x7EA2;&#x5305;&#x8FD9;&#x79CD;&#x571F;&#x8C6A;&#x7684;&#x505A;&#x6CD5;&#x663E;&#x7136;&#x4E0D;&#x9002;&#x5408;&#x6728;&#x8BB7;&#x7684;&#x6211;&#x3002;&#x773C;&#x4E0B;&#x51E0;&#x4E4E;&#x4EBA;&#x4EBA;&#x90FD;&#x6709;&#x667A;&#x80FD;&#x673A;&#xFF0C;&#x4EBA;&#x4EBA;&#x90FD;&#x6709;&#x5FAE;&#x4FE1;&#xFF0C;&#x4E8E;&#x662F;&#x5C31;&#x60F3;&#x80FD;&#x4E0D;&#x80FD;&#x501F;&#x52A9;&#x5FAE;&#x4FE1;&#x8BA9;&#x5927;&#x5BB6;&#x53C2;&#x4E0E;&#x8FDB;&#x6765;&#x3002;&#x5927;&#x5BB6;&#x53EF;&#x4EE5;&#x53D1;&#x795D;&#x798F;&#x4E0A;&#x5899;&#xFF0C;&#x7136;&#x540E;&#x73B0;&#x573A;&#x5927;&#x5C4F;&#x4EE5;&#x5F39;&#x5E55;&#x5F62;&#x5F0F;&#x5C06;&#x5927;&#x5BB6;&#x795D;&#x798F;&#x5C55;&#x793A;&#x51FA;&#x6765;&#x3002;&#x5927;&#x5BB6;&#x53D1;&#x5B8C;&#x795D;&#x798F;&#x53EF;&#x4EE5;&#x5728;&#x5927;&#x5C4F;&#x4E0A;&#x770B;&#x5230;&#x81EA;&#x5DF1;&#x7684;&#x5934;&#x50CF;&#x4EE5;&#x53CA;&#x795D;&#x798F;&#x7684;&#x8BDD;&#xFF0C;&#x5185;&#x5FC3;&#x662F;&#x4E0D;&#x662F;&#x6709;&#x4E00;&#x4E1D;&#x4E1D;&#x7684;&#x6EE1;&#x8DB3;&#x3002;</p>
<p>&#x4E00;&#x5F00;&#x59CB;&#x662F;&#x60F3;&#x641E;&#x4E00;&#x4E2A;&#x516C;&#x4F17;&#x53F7;&#xFF0C;&#x5927;&#x5BB6;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x5728;&#x8F93;&#x5165;&#x6846;&#x53D1;&#x795D;&#x798F;&#xFF0C;&#x540E;&#x9762;&#x89C9;&#x5F97;&#x8FD9;&#x6837;&#x8FD8;&#x662F;&#x592A;&#x6B7B;&#x677F;&#xFF0C;&#x6CA1;&#x8DA3;&#xFF0C;&#x653E;&#x5F03;&#x4E86;&#x3002;</p>
<p>&#x641E;&#x4E2A;&#x5FAE;&#x4FE1; web &#x5427;&#xFF0C;&#x4E0D;&#x7528;&#x5173;&#x6CE8;&#x4E5F;&#x80FD;&#x8BBF;&#x95EE;&#xFF0C;&#x800C;&#x4E14;&#x628A; web &#x9875;&#x9762;&#x505A;&#x6210;&#x8BF7;&#x67EC;&#x7684;&#x5F62;&#x5F0F;&#xFF0C;&#x8FD8;&#x53EF;&#x4EE5;&#x63D0;&#x524D;&#x5206;&#x4EAB;&#x7ED9;&#x5927;&#x5BB6;&#x6696;&#x6696;&#x573A;&#x3002;&#x90A3;&#x8FD8;&#x7B49;&#x4EC0;&#x4E48;&#xFF0C;&#x5E72;&#x5440;&#x3002;</p>
<h2 id>&#x64B8;&#x8D77;&#x8896;&#x5B50;&#x5C31;&#x662F;&#x5E72;</h2>
<p>&#x4F20;&#x7EDF;&#x8BF7;&#x67EC;&#x4E09;&#x8981;&#x7D20;&#xFF1A;&#x65F6;&#x95F4;&#x5730;&#x70B9;&#x548C;&#x4EBA;&#x7269;&#xFF0C;&#x6211;&#x7684;&#x8BF7;&#x67EC;&#x4E09;&#x8981;&#x7D20;&#xFF1A;&#x7B7E;&#x5230;&#x5730;&#x56FE;&#x548C;&#x5F39;&#x5E55;&#x3002;&#x542D;&#x54E7;&#x542D;&#x54E7;&#xFF0C;&#x82B1;&#x4E86;&#x4E24;&#x5468;&#x7684;&#x4E1A;&#x4F59;&#x65F6;&#x95F4;&#xFF0C;&#x671F;&#x95F4;&#x5AB3;&#x5987;&#x4E5F;&#x5E2E;&#x5FD9;&#x5904;&#x7406;&#x4E86;&#x56FE;&#x7247;&#xFF0C;&#x6210;&#x54C1;&#x957F;&#x8FD9;&#x6837;&#xFF1A;</p>
<p><img src="https://cdn.iammapping.com/2017/10/22/150866684532177784.png" alt="&#x5FAE;&#x4FE1;&#x7AEF; Demo" loading="lazy"></p>
<h3 id>&#x6280;&#x672F;&#x6808;</h3>
<p>&#x5012;&#x662F;&#x6CA1;&#x4EC0;&#x4E48;&#x540A;&#x70B8;&#x5929;&#x7684;&#x6280;&#x672F;&#xFF0C;&#x56E0;&#x4E3A;&#x5F00;&#x53D1;&#x65F6;&#x95F4;&#x6709;&#x5F3A;&#x5236;&#x7684; deadline&#xFF0C;&#x6211;&#x53EF;&#x4E0D;&#x60F3;&#x56E0;&#x4E3A;&#x5F00;&#x53D1;&#x8FD9;&#x4E2A;&#x800C;&#x9519;&#x8FC7;&#x6211;&#x7684;&#x5A5A;&#x793C;&#x1F602;&#x3002;&#x6240;&#x4EE5;&#x6311;&#x7684;&#x6280;&#x672F;&#x90FD;&#x662F;&#x4E00;&#x4E9B;&#x6BD4;&#x8F83;&#x719F;&#x6089;&#x800C;&#x4E14;&#x5F00;&#x7BB1;&#x5373;&#x7528;&#x7684;&#x3002;</p>
<p>&#x540E;&#x53F0;&#xFF1A;Mysql&#x3001;Nodejs&#x3001;Sails&#x3001;Sequelize&#x3001;Bluebird&#xFF1B;</p>
<p>&#x524D;&#x7AEF;&#xFF1A;WeUI&#x3001;jQuery&#x3001;jquery.fullPage&#x3001;slick&#x3001;CommentCoreLibrary(CCL&#x5F39;&#x5E55;)&#x3001;&#x9AD8;&#x5FB7;&#x5730;&#x56FE;&#x3001;iconfont&#x3002;</p>
<p>&#x5F39;&#x5E55;&#x6570;&#x636E;&#x5B9E;&#x65F6;&#x66F4;&#x65B0;&#x662F;&#x7528;&#x7684;&#x6700;&#x7B80;&#x5355;&#x7684;&#x77ED;&#x8F6E;&#x8BE2;&#xFF0C;&#x6CA1;&#x522B;&#x7684;&#xFF0C;&#x5C31;&#x4E00;&#x4E2A;&#x7A33;&#x5B57;&#x3002;</p>
<p>&#x5982;&#x679C;&#x4F60;&#x6709;&#x6253;&#x5F00;&#x4F53;&#x9A8C;&#xFF0C;&#x770B;&#x4E86;&#x51E0;&#x5F20;&#x80CC;&#x666F;&#x7167;&#x7247;&#x4F60;&#x4F1A;&#x53D1;&#x73B0;&#xFF0C;&#x4E0D;&#x7BA1;&#x7167;&#x7247;&#x4E2D;&#x4EBA;&#x7269;&#x4E3B;&#x4F53;&#x7684;&#x4F4D;&#x7F6E;&#x662F;&#x504F;&#x5DE6;&#x8FD8;&#x662F;&#x504F;&#x53F3;&#xFF0C;&#x5728;&#x4F60;&#x7684;&#x89C6;&#x89C9;&#x4E2D;&#x4E00;&#x5B9A;&#x662F;&#x5C45;&#x4E2D;&#x663E;&#x793A;&#x7684;&#xFF0C;&#x8FD9;&#x6837;&#x4FDD;&#x8BC1;&#x6253;&#x5F00;&#x540E;&#x4E00;&#x773C;&#x5C31;&#x80FD;&#x770B;&#x5230;&#x6211;&#x4EEC;&#x1F618;&#x3002;&#x8FD9;&#x4E2A;&#x4E5F;&#x4E0D;&#x662F;&#x4EC0;&#x4E48;&#x9AD8;&#x5927;&#x4E0A;&#x7684;&#x6280;&#x672F;&#xFF0C;&#x5C31;&#x662F;&#x63D0;&#x524D;&#x6D4B;&#x91CF;&#x597D;&#x6BCF;&#x5F20;&#x7167;&#x7247;&#x4EBA;&#x7269;&#x4E3B;&#x4F53;&#x4E2D;&#x5FC3;&#x7EBF;&#x7684;&#x504F;&#x79FB;&#x91CF;&#xFF0C;&#x7136;&#x540E;&#x5199;&#x5728;&#x56FE;&#x7247;&#x6807;&#x7B7E;&#x7684;&#x5C5E;&#x6027;&#x91CC;&#x3002;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#xFF0C;&#x767D;&#x8272;&#x4EE3;&#x8868;&#x7167;&#x7247;&#xFF0C;&#x7EFF;&#x8272;&#x4EE3;&#x8868;&#x624B;&#x673A;&#x5C4F;&#x5E55;&#xFF0C;&#x4E24;&#x4E2A;&#x5706;&#x5708;&#x4EE3;&#x8868;&#x7167;&#x7247;&#x4E0A;&#x7684;&#x4EBA;&#x7269;&#x4E3B;&#x4F53;&#x3002;</p>
<p><img src="https://cdn.iammapping.com/2017/10/21/150859868420052600.png" alt="&#x56FE;&#x7247;&#x4E2D;&#x7EBF;" loading="lazy"></p>
<h3 id>&#x9047;&#x5230;&#x7684;&#x4E00;&#x4E9B;&#x5751;</h3>
<h4 id>&#x5FAE;&#x4FE1;&#x7684;&#x5751;</h4>
<p>&#x505A;&#x597D;&#x540E;&#x662F;&#x90E8;&#x7F72;&#x5728;&#x6211;&#x81EA;&#x5DF1;&#x7684;&#x670D;&#x52A1;&#x5668;&#x4E0A;&#xFF0C;&#x57DF;&#x540D;&#x4E5F;&#x6CA1;&#x5907;&#x6848;&#xFF0C;&#x521A;&#x5206;&#x4EAB;&#x51FA;&#x53BB;&#x4E00;&#x5207;&#x90FD;&#x633A;&#x987A;&#x5229;&#x3002;&#x53EF;&#x540E;&#x9762;&#x9010;&#x6E10;&#x5C31;&#x6709;&#x4EBA;&#x53CD;&#x9988;&#x6253;&#x4E0D;&#x5F00;&#x6216;&#x6253;&#x5F00;&#x7A7A;&#x767D;&#x7684;&#x60C5;&#x51B5;&#xFF0C;&#x7ECF;&#x8FC7;&#x6293;&#x5305;&#x624D;&#x53D1;&#x73B0;&#x5FAE;&#x4FE1;&#x4F1A;&#x628A;&#x5206;&#x4EAB;&#x7684;&#x7F51;&#x5740;&#x5728;&#x6253;&#x5F00;&#x524D;&#x505A;&#x62E6;&#x622A;&#xFF0C;&#x5982;&#x679C;&#x57DF;&#x540D;&#x6CA1;&#x6709;&#x5907;&#x6848;&#x90A3;&#x5C31;&#x53EA;&#x80FD; say goodbye&#x3002;</p>
<p>&#x5FAE;&#x4FE1;&#x8FD8;&#x4F1A;&#x5728;&#x8F93;&#x5165;&#x6846;&#x83B7;&#x53D6;&#x7126;&#x70B9;&#x65F6;&#xFF0C;&#x63D0;&#x793A;&#x7528;&#x6237;&#x6CE8;&#x610F;&#x5B89;&#x5168;&#xFF0C;&#x8C28;&#x9632;&#x6CC4;&#x5BC6;&#x3002;&#x8FD9;&#x4E2A;&#x4E5F;&#x633A;&#x70E6;&#x4EBA;&#x7684;&#xFF0C;&#x53D1;&#x4E2A;&#x795D;&#x798F;&#x8FD8;&#x8981;&#x6CE8;&#x610F;&#x5B89;&#x5168;&#x1F625;&#x3002;&#x4E0D;&#x8FC7;&#x8FD9;&#x4E2A;&#x5728;&#x516C;&#x4F17;&#x53F7;&#x53EF;&#x4EE5;&#x8BBE;&#x7F6E;&#x57DF;&#x540D;&#x767D;&#x540D;&#x5355;&#xFF0C;&#x5F53;&#x7136;&#x524D;&#x63D0;&#x4E5F;&#x662F;&#x57DF;&#x540D;&#x8981;&#x5907;&#x6848;&#x3002;</p>
<h4 id>&#x5F39;&#x5E55;&#x7684;&#x5751;</h4>
<p>CCL &#x5F39;&#x5E55;&#x5E93;&#x4E4B;&#x524D;&#x9ED8;&#x8BA4;&#x7684;&#x6E32;&#x67D3;&#x65B9;&#x5F0F;&#x662F; left&#x3001;top&#xFF0C;&#x76EE;&#x7684;&#x662F;&#x4E3A;&#x4E86;&#x5411;&#x4E0B;&#x517C;&#x5BB9;&#x3002;&#x4F46;&#x662F;&#x5728;&#x624B;&#x673A;&#x7AEF;&#x7684;&#x6027;&#x80FD;&#x7B80;&#x76F4;&#x4E0D;&#x5FCD;&#x76F4;&#x89C6;&#xFF0C;&#x5F53;&#x65F6;&#x6709;&#x4E2A;&#x7248;&#x672C; v0.10.0-rc &#x5728;&#x6D4B;&#x8BD5;&#x4F7F;&#x7528; css3 &#x7684;&#x6E32;&#x67D3;&#x65B9;&#x5F0F;&#xFF0C;&#x5207;&#x8FC7;&#x53BB;&#x6548;&#x679C;&#x76F4;&#x903C; PC &#x7AEF;&#xFF0C;&#x5C31;&#x9A6C;&#x4E0A;&#x7528;&#x4E0A;&#x4E86;&#x3002;&#x73B0;&#x5728; CCL &#x9ED8;&#x8BA4;&#x7684;&#x6E32;&#x67D3;&#x65B9;&#x5F0F;&#x5C31;&#x662F; css3&#xFF0C;&#x4E0D;&#x7528;&#x518D;&#x8E29;&#x8FD9;&#x4E2A;&#x5751;&#x4E86;&#x3002;</p>
<h4 id>&#x8F93;&#x5165;&#x6CD5;&#x7684;&#x5751;</h4>
<p>&#x4F7F;&#x7528;&#x4E2D;&#x6587;&#x8F93;&#x5165;&#x6CD5;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x8F93;&#x5165;&#x6846;&#x5E95;&#x90E8;&#x548C;&#x952E;&#x76D8;&#x9876;&#x90E8;&#x65E0;&#x6CD5;&#x5B8C;&#x7F8E;&#x8D34;&#x5408;&#x3002;&#x8FD9;&#x4E2A;&#x5751;&#x5230;&#x73B0;&#x5728;&#x4E5F;&#x4E00;&#x76F4;&#x6CA1;&#x6709;&#x586B;&#xFF0C;&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;<a href="http://www.alloyteam.com/2017/03/moves-the-input-box-fill-series-a/?ref=iammapping.com">&#x300A;&#x79FB;&#x52A8;&#x7AEF;&#x8F93;&#x5165;&#x6846;&#x586B;&#x5751;&#x7CFB;&#x5217;&#xFF08;&#x4E00;&#xFF09;&#x300B;</a>&#x4F3C;&#x4E4E;&#x7ED9;&#x4E86;&#x89E3;&#x51B3;&#x529E;&#x6CD5;&#x3002;</p>
<h2 id>&#x5E72;&#x5B8C;&#x53EA;&#x662F;&#x5F00;&#x59CB;</h2>
<p>&#x4EA7;&#x54C1;&#x5F00;&#x53D1;&#x5B8C;&#x6210;&#x5E76;&#x4E0D;&#x662F;&#x7ED3;&#x675F;&#xFF0C;&#x800C;&#x662F;&#x5F00;&#x59CB;&#x3002;&#x600E;&#x4E48;&#x5F15;&#x6D41;&#xFF0C;&#x751F;&#x4EA7;&#x73AF;&#x5883;&#x6709; bug &#x7B49;&#x7B49;&#x8FD9;&#x4E9B;&#x95EE;&#x9898;&#x63A5;&#x8E35;&#x800C;&#x6765;&#x3002;</p>
<h3 id>&#x5982;&#x4F55;&#x8BA9;&#x5927;&#x5BB6;&#x73B0;&#x573A;&#x8BBF;&#x95EE;</h3>
<p>&#x5728;&#x5165;&#x53E3;&#x8FCE;&#x5BBE;&#x5904;&#x626B;&#x7801;&#xFF1F;&#x8FD9;&#x6837;&#x53EA;&#x80FD;&#x4E00;&#x6B21;&#x6027;&#x52A0;&#x5165;&#xFF0C;&#x9000;&#x51FA;&#x4E86;&#x5C31;&#x5F88;&#x96BE;&#x518D;&#x8FDB;&#x6765;&#x3002;</p>
<p>&#x5728;&#x73B0;&#x573A;&#x52A0;&#x7FA4;&#xFF0C;&#x5728;&#x7FA4;&#x91CC;&#x53D1;&#x94FE;&#x63A5;&#xFF1F;&#x8FD9;&#x6837;&#x770B;&#x4F3C;&#x662F;&#x4E2A;&#x597D;&#x529E;&#x6CD5;&#xFF0C;&#x4F46;&#x5BBE;&#x5BA2;&#x6709;&#x7EDD;&#x5927;&#x591A;&#x6570;&#x662F;&#x5E74;&#x7EAA;&#x6BD4;&#x8F83;&#x5927;&#xFF0C;&#x80FD;&#x7528;&#x5FAE;&#x4FE1;&#x626B;&#x7801;&#x5C31;&#x4E86;&#x4E0D;&#x8D77;&#xFF0C;&#x73B0;&#x573A;&#x52A0;&#x7FA4;&#x8FD9;&#x79CD;&#x64CD;&#x4F5C;&#x8FD8;&#x662F;&#x96BE;&#x4E3A;&#x4ED6;&#x4EEC;&#x4E86;&#x3002;</p>
<p>&#x4E8C;&#x7EF4;&#x7801;&#x6295;&#x5728;&#x5927;&#x5C4F;&#x4E0A;&#xFF1F;&#x8FD9;&#x5F71;&#x54CD;&#x5927;&#x5C4F;&#x7684;&#x7F8E;&#x611F;&#xFF0C;&#x800C;&#x4E14;&#x540E;&#x573A;&#x626B;&#x7801;&#x51E0;&#x4E4E;&#x662F;&#x4E0D;&#x53EF;&#x80FD;&#x7684;&#x3002;</p>
<p>&#x6700;&#x540E;&#x60F3;&#x4E86;&#x4E00;&#x4E2A;&#x571F;&#x529E;&#x6CD5;&#x5C06;&#x4E8C;&#x7EF4;&#x7801;&#x6253;&#x5728;&#x5C0F;&#x5361;&#x7247;&#x4E0A;&#xFF0C;&#x6BCF;&#x4E2A;&#x684C;&#x4E0A;&#x53D1;&#x51E0;&#x5F20;&#x3002;&#x4E8E;&#x662F;&#x968F;&#x4FBF;&#x8BBE;&#x8BA1;&#x4E86;&#x5C0F;&#x5361;&#x7247;&#x7684;&#x6837;&#x5F0F;&#xFF0C;&#x5728; TB &#x4E0A;&#x627E;&#x4E86;&#x5BB6;&#x6253;&#x5370;&#x5E97;&#x5370;&#x4E86; 100 &#x591A;&#x5F20;&#xFF0C;&#x6210;&#x672C;&#x8FD8;&#x662F;&#x6BD4;&#x8F83;&#x4F4E;&#x7684;&#x3002;</p>
<p><img src="https://cdn.iammapping.com/2017/10/20/150851187638786162.png" alt="&#x73B0;&#x573A;&#x5C0F;&#x5361;&#x7247;" loading="lazy"></p>
<blockquote>
<p>&#x5361;&#x7247;&#x4E0A;&#x7684;&#x4E8C;&#x7EF4;&#x7801;&#x73B0;&#x5728;&#x4F9D;&#x7136;&#x6709;&#x6548;&#xFF0C;&#x53EA;&#x662F;&#x73B0;&#x5728;&#x4E0D;&#x62BD;&#x5956;&#x4E86;&#x1F602;&#xFF0C;&#x53EF;&#x4EE5;&#x7528;&#x5FAE;&#x4FE1;&#x626B;&#x4E00;&#x626B;&#x4F53;&#x9A8C;&#x4E0B;&#x3002;</p>
</blockquote>
<p>&#x5A5A;&#x793C;&#x7ED3;&#x675F;&#x540E;&#x7EDF;&#x8BA1;&#x4E86;&#x4E0B;&#xFF0C;&#x73B0;&#x573A;&#x603B;&#x5171;&#x6709; 300 &#x591A;&#x4EBA;&#xFF0C;&#x53D1;&#x795D;&#x798F;&#x7684;&#x6709; 150 &#x591A;&#x4EBA;&#xFF0C;&#x8FD9;&#x4E2A;&#x8F6C;&#x6362;&#x7387;&#x8FD8;&#x662F;&#x53EF;&#x4EE5;&#x7684;&#x3002;</p>
<h3 id>&#x5982;&#x4F55;&#x641E;&#x5B9A;&#x73B0;&#x573A;&#x5927;&#x5C4F;</h3>
<p>&#x4E0A;&#x9762;&#x53EA;&#x8BB2;&#x4E86;&#x5FAE;&#x4FE1; web &#x7AEF;&#xFF0C;&#x5176;&#x5B9E;&#x5B8C;&#x6210;&#x6574;&#x4E2A;&#x4E92;&#x52A8;&#xFF0C;&#x8FD8;&#x6709;&#x4E00;&#x4E2A;&#x91CD;&#x8981;&#x7EC4;&#x6210;&#x90E8;&#x5206;&#x2014;&#x2014;&#x73B0;&#x573A;&#x5927;&#x5C4F;&#x3002;&#x9152;&#x5E97;&#x7684;&#x5927;&#x5C4F;&#x591A;&#x662F; LED &#x62FC;&#x63A5;&#x5927;&#x5C4F;&#xFF0C;&#x8FD9;&#x53EF;&#x4E0D;&#x50CF;&#x7535;&#x8111;&#x7684;&#x663E;&#x793A;&#x5668;&#xFF0C;&#x6709;&#x660E;&#x786E;&#x7684;&#x5206;&#x8FA8;&#x7387;&#x3002;&#x5F53;&#x65F6;&#x6253;&#x7535;&#x8BDD;&#x95EE;&#x9152;&#x5E97;&#x524D;&#x53F0;&#x5927;&#x5C4F;&#x5206;&#x8FA8;&#x7387;&#x662F;&#x591A;&#x5C11;&#xFF0C;&#x4ED6;&#x4EEC;&#x4E5F;&#x662F;&#x4E00;&#x8138;&#x61F5;&#x903C;&#x3002;&#x540E;&#x9762;&#x54A8;&#x8BE2;&#x505A;&#x5927;&#x5C4F;&#x7684;&#x670B;&#x53CB;&#x624D;&#x77E5;&#x9053;&#xFF0C;&#x4ED6;&#x4EEC;&#x6839;&#x672C;&#x4E0D;&#x8BB2;&#x5206;&#x8FA8;&#x7387;&#xFF0C;&#x53EA;&#x8BB2;&#x5C3A;&#x5BF8;&#xFF0C;&#x53EB;&#x6211;&#x7B49;&#x6BD4;&#x4F8B;&#x8D70;&#x5C31;&#x884C;&#xFF0C;&#x4E8E;&#x662F;&#x6211;&#x4E5F;&#x4E00;&#x8138;&#x61F5;&#x903C;&#x4E86;&#x3002;&#x4E0D;&#x7BA1;&#x5566;&#xFF0C;&#x505A;&#x4E86;&#x591A;&#x4E2A;&#x54CD;&#x5E94;&#x5F0F;&#x5C3A;&#x5BF8;&#x4EE5;&#x9632;&#x4E07;&#x4E00;&#x3002;</p>
<p>&#x5927;&#x5C4F;&#x7AEF;&#x7684;&#x4EA4;&#x4E92;&#x5C31;&#x6CA1;&#x90A3;&#x4E48;&#x591A;&#x4E86;&#xFF0C;&#x90FD;&#x662F;&#x4E00;&#x4E9B;&#x81EA;&#x52A8;&#x64AD;&#x653E;&#x6216;&#x9759;&#x6001;&#x5C55;&#x793A;&#x7684;&#x4E1C;&#x897F;&#x3002;</p>
<p><img src="https://cdn.iammapping.com/2017/10/22/150867322395988694.png" alt="&#x6B22;&#x8FCE;&#x9875;" loading="lazy"></p>
<h3 id>&#x5982;&#x4F55;&#x62BD;&#x5956;</h3>
<p>&#x5927;&#x5C4F;&#x7AEF;&#x6709;&#x4E2A;&#x62BD;&#x5956;&#x754C;&#x9762;&#xFF0C;&#x8FD9;&#x4E2A;&#x62BD;&#x5956;&#x73AF;&#x8282;&#x8FD8;&#x662F;&#x9700;&#x8981;&#x4E3B;&#x6301;&#x4EBA;&#x548C;&#x5E55;&#x540E;&#x4EBA;&#x5458;&#x914D;&#x5408;&#x7684;&#x3002;&#x4E3B;&#x6301;&#x4EBA;&#x53D1;&#x53E3;&#x4EE4;&#xFF0C;&#x5E55;&#x540E;&#x4EBA;&#x5458;&#x6839;&#x636E;&#x53E3;&#x4EE4;&#x63A7;&#x5236;&#x62BD;&#x5956;&#x5F00;&#x59CB;&#x4E0E;&#x7ED3;&#x675F;&#x3002;&#x5728;&#x5A5A;&#x793C;&#x524D;&#x4E0E;&#x4E3B;&#x6301;&#x4EBA;&#x6C9F;&#x901A;&#x8FC7;&#x7A0B;&#x4E2D;&#xFF0C;&#x4E3B;&#x6301;&#x4EBA;&#x8868;&#x793A;&#x8D5E;&#x53F9;&#xFF1A;&#x4E3B;&#x6301;&#x4E86;&#x5341;&#x591A;&#x5E74;&#x5A5A;&#x793C;&#xFF0C;&#x7B2C;&#x4E00;&#x6B21;&#x89C1;&#x5230;&#x8FD9;&#x4E48;&#x6709;&#x8DA3;&#x7684;&#x5F62;&#x5F0F;&#x3002;&#x6B64;&#x65F6;&#x6211;&#x5185;&#x5FC3;&#x559C;&#x60A6;&#x800C;&#x53C8;&#x60F6;&#x6050;&#xFF0C;&#x62C5;&#x5FC3;&#x73B0;&#x573A;&#x641E;&#x7838;&#x3002;</p>
<p><img src="https://cdn.iammapping.com/2017/10/22/150867310672178019.png" alt="&#x62BD;&#x5956;&#x9875;&#x9762;" loading="lazy"></p>
<p>&#x5173;&#x4E8E;&#x62BD;&#x5956;&#x7B97;&#x6CD5;&#xFF0C;&#x5C31;&#x662F;&#x7B80;&#x5355;&#x7684;&#x5B8C;&#x5168;&#x968F;&#x673A;&#x62BD;&#x53D6;&#xFF0C;&#x90A3;&#x53E5;&#x201C;&#x636E;&#x8BF4;&#x989C;&#x503C;&#x9AD8;&#x7684;&#x548C;&#x795D;&#x798F;&#x591A;&#x7684;&#x90FD;&#x66F4;&#x6709;&#x673A;&#x4F1A;&#x4E2D;&#x5956;&#x201D;&#xFF0C;&#x4EC5;&#x4EC5;&#x662F;&#x4FC3;&#x8FDB;&#x5927;&#x5BB6;&#x53D1;&#x795D;&#x798F;&#x7684;&#x5C0F;&#x73A9;&#x7B11;&#xFF08;&#x597D;&#x50CF;&#x6709;&#x70B9;&#x8D31;&#xFF0C;&#x9003;~~&#xFF09;&#x3002;&#x5019;&#x9009;&#x4EBA;&#x5219;&#x662F;&#x6240;&#x6709;&#x7B7E;&#x5230;&#x5728;&#x73B0;&#x573A;&#x7684;&#x5BBE;&#x5BA2;&#xFF0C;&#x626B;&#x4E86;&#x4E0A;&#x9762;&#x5C0F;&#x5361;&#x7247;&#x4E0A;&#x7684;&#x4E8C;&#x7EF4;&#x7801;&#x5C31;&#x53EF;&#x4EE5;&#x81EA;&#x52A8;&#x7B7E;&#x5230;&#x5728;&#x73B0;&#x573A;&#xFF0C;&#x8FD9;&#x6837;&#x4E5F;&#x7701;&#x53BB;&#x5BBE;&#x5BA2;&#x9700;&#x8981;&#x591A;&#x4F59;&#x7684;&#x64CD;&#x4F5C;&#x3002;</p>
<h2 id>&#x5176;&#x4ED6;&#x4E00;&#x4E9B;&#x672A;&#x5B8C;&#x6210;&#x7684;&#x60F3;&#x6CD5;</h2>
<p>&#x5728;&#x5FAE;&#x4FE1;&#x7AEF;&#x5B8C;&#x6210;&#x540E;&#xFF0C;&#x6211;&#x5C31;&#x5206;&#x4EAB;&#x5230;&#x670B;&#x53CB;&#x5708;&#x3002;&#x4E00;&#x4F1A;&#x513F;&#x6536;&#x5230;&#x4E86;&#x5F88;&#x591A;&#x795D;&#x798F;&#xFF0C;&#x4E3A;&#x4E86;&#x611F;&#x8C22;&#x5927;&#x5BB6;&#xFF0C;&#x5C31;&#x5728;&#x5F39;&#x5E55;&#x91CC;&#x53D1;&#x4E86;&#x4E00;&#x4E2A;&#x53E3;&#x4EE4;&#x7EA2;&#x5305;&#xFF0C;&#x6D4F;&#x89C8;&#x91CF;&#x77AC;&#x95F4;&#x7206;&#x68DA;&#xFF0C;&#x5C0F;&#x6C34;&#x7BA1;&#x670D;&#x52A1;&#x5668;&#x90FD;&#x6709;&#x70B9;&#x6297;&#x4E0D;&#x4F4F;&#x4E86;&#x3002;&#x8FD9;&#x7ED9;&#x4E86;&#x6211;&#x4E00;&#x4E2A;&#x5F88;&#x597D;&#x7684;&#x542F;&#x53D1;&#xFF0C;&#x4E8E;&#x662F;&#x60F3;&#x540E;&#x53F0;&#x8BBE;&#x7F6E;&#x4E2A;&#x5B9A;&#x65F6;&#x4EFB;&#x52A1;&#xFF0C;&#x5728;&#x5A5A;&#x793C;&#x73B0;&#x573A;&#x6765;&#x573A;&#x9707;&#x64BC;&#x7684;&#x53E3;&#x4EE4;&#x7EA2;&#x5305;&#x96E8;&#x3002;&#x4E0D;&#x8FC7;&#x8FD9;&#x4E2A;&#x60F3;&#x6CD5;&#x540E;&#x6765;&#x88AB;&#x5176;&#x4ED6;&#x4E8B;&#x803D;&#x6401;&#x4E86;&#xFF0C;&#x6CA1;&#x6709;&#x52A0;&#x4E0A;&#xFF0C;&#x4E5F;&#x662F;&#x6709;&#x70B9;&#x5C0F;&#x9057;&#x61BE;&#x3002;</p>
<h2 id="onemorething">One more thing</h2>
<p>&#x5728;&#x672C;&#x6587;&#x53D1;&#x5E03;&#x7684;&#x540C;&#x65F6;&#xFF0C;&#x4E5F;&#x6253;&#x7B97;&#x628A;&#x8FD9;&#x4E2A;&#x5C18;&#x5C01;&#x4E00;&#x5E74;&#x7684;&#x9879;&#x76EE;&#x5F00;&#x6E90;&#x51FA;&#x6765;&#x3002;&#x795D;&#x613F;&#x6240;&#x6709;&#x7684; forker &#x6709;&#x60C5;&#x4EBA;&#x7EC8;&#x6210;&#x7737;&#x5C5E;&#x3002;</p>
<p>&#x9879;&#x76EE;&#x5730;&#x5740;&#xFF1A;<a href="https://github.com/iammapping/wedding?ref=iammapping.com">iammapping/wedding</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[localStorage 还能这么用]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p><img src="https://cdn.iammapping.com/2017/10/09/150756387698667375.png" alt loading="lazy"></p>
<p>HTML5&#x4E2D; Web Storage &#x7684;&#x51FA;&#x73B0;&#xFF0C;&#x4E3B;&#x8981;&#x662F;&#x4E3A;&#x4E86;&#x5F25;&#x8865;&#x4F7F;&#x7528; Cookie &#x4F5C;&#x4E3A;&#x672C;&#x5730;&#x5B58;&#x50A8;&#x7684;&#x4E0D;&#x8DB3;&#x3002;Cookie &#x5B58;&#x50A8;&#x7684;&#x6570;&#x636E;&#x91CF;&#x975E;&#x5E38;&#x5C0F;&#xFF0C;&#x800C;&#x4E14;&#x6570;&#x636E;&#x4F1A;&#x81EA;&#x52A8;&#x643A;&#x5E26;&#x5230;&#x8BF7;</p>]]></description><link>https://iammapping.com/the-other-ways-to-use-localstorage/</link><guid isPermaLink="false">6522cda9caa77d0fabe3ef45</guid><dc:creator><![CDATA[Iam Mapping]]></dc:creator><pubDate>Mon, 09 Oct 2017 15:45:55 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><img src="https://cdn.iammapping.com/2017/10/09/150756387698667375.png" alt loading="lazy"></p>
<p>HTML5&#x4E2D; Web Storage &#x7684;&#x51FA;&#x73B0;&#xFF0C;&#x4E3B;&#x8981;&#x662F;&#x4E3A;&#x4E86;&#x5F25;&#x8865;&#x4F7F;&#x7528; Cookie &#x4F5C;&#x4E3A;&#x672C;&#x5730;&#x5B58;&#x50A8;&#x7684;&#x4E0D;&#x8DB3;&#x3002;Cookie &#x5B58;&#x50A8;&#x7684;&#x6570;&#x636E;&#x91CF;&#x975E;&#x5E38;&#x5C0F;&#xFF0C;&#x800C;&#x4E14;&#x6570;&#x636E;&#x4F1A;&#x81EA;&#x52A8;&#x643A;&#x5E26;&#x5230;&#x8BF7;&#x6C42;&#x5934;&#x91CC;&#xFF0C;&#x4F46;&#x670D;&#x52A1;&#x5668;&#x7AEF;&#x53EF;&#x80FD;&#x5E76;&#x4E0D;&#x5173;&#x5FC3;&#x8FD9;&#x4E9B;&#x6570;&#x636E;&#xFF0C;&#x6240;&#x4EE5;&#x4F1A;&#x9020;&#x6210;&#x5E26;&#x5BBD;&#x7684;&#x6D6A;&#x8D39;&#x3002;</p>
<p>Web Storage &#x63D0;&#x4F9B;&#x4E86;&#x4E24;&#x4E2A;&#x5B58;&#x50A8;&#x5BF9;&#x8C61;&#xFF1A;localStorage &#x548C; sessionStorage&#x3002;</p>
<p>sessionStorage &#x5B58;&#x50A8;&#x7684;&#x6570;&#x636E;&#x4EC5;&#x5728;&#x672C;&#x6B21;&#x4F1A;&#x8BDD;&#x6709;&#x7528;&#xFF0C;&#x4F1A;&#x8BDD;&#x7ED3;&#x675F;&#x540E;&#x4F1A;&#x81EA;&#x52A8;&#x5931;&#x6548;&#xFF0C;&#x800C;&#x4E14;&#x6570;&#x636E;&#x4EC5;&#x5728;&#x5F53;&#x524D;&#x7A97;&#x53E3;&#x6709;&#x6548;&#xFF0C;&#x540C;&#x4E00;&#x6E90;&#x4E0B;&#x65B0;&#x7A97;&#x53E3;&#x4E5F;&#x8BBF;&#x95EE;&#x4E0D;&#x5230;&#x5176;&#x4ED6;&#x7A97;&#x53E3;&#x57FA;&#x4E8E;<br>
sessionStorage &#x5B58;&#x50A8;&#x7684;&#x6570;&#x636E;&#x3002;&#x4E5F;&#x662F;&#x7531;&#x4E8E;&#x8FD9;&#x4E9B;&#x7279;&#x6027;&#xFF0C;&#x5BFC;&#x81F4; sessionStorage &#x7684;&#x4F7F;&#x7528;&#x573A;&#x666F;&#x4F1A;&#x6BD4;&#x8F83;&#x5C11;&#x3002;</p>
<p>localStorage &#x53EF;&#x4EE5;&#x6C38;&#x4E45;&#x5B58;&#x50A8;&#xFF0C;&#x800C;&#x4E14;&#x540C;&#x6E90;&#x4E0B;&#x6570;&#x636E;&#x591A;&#x7A97;&#x53E3;&#x4E5F;&#x80FD;&#x5171;&#x4EAB;&#x3002;&#x770B;&#x8D77;&#x6765;&#x5F88;&#x7F8E;&#x597D;&#xFF0C;&#x4F46; localStorage &#x4E5F;&#x6709;&#x77ED;&#x677F;&#xFF0C;&#x7EDD;&#x5927;&#x591A;&#x6570;&#x6D4F;&#x89C8;&#x5668;&#x6709; 5M &#x7684;&#x5927;&#x5C0F;&#x9650;&#x5236;&#x3002;&#x4F46;&#x662F;&#x8FD9;&#x4E0D;&#x8DB3;&#x4EE5;&#x6210;&#x4E3A;&#x5927;&#x5BB6;&#x4F7F;&#x7528; localStorage &#x7684;&#x969C;&#x788D;&#xFF0C;&#x8981;&#x77E5;&#x9053; Cookie &#x53EA;&#x6709; 4K &#x7684;&#x5927;&#x5C0F;&#xFF0C;&#x591A;&#x4E86;&#x4E00;&#x5343;&#x591A;&#x500D;&#xFF0C;&#x5077;&#x7740;&#x4E50;&#x5427;&#x3002;</p>
<h2 id="localstorage">localStorage &#x7684;&#x57FA;&#x672C;&#x4F7F;&#x7528;</h2>
<p>&#x8BB2;&#x8FD9;&#x4E2A;&#x5185;&#x5BB9;&#x7684;&#x6587;&#x7AE0;&#x7F51;&#x4E0A;&#x592A;&#x591A;&#x4E86;&#xFF0C;&#x73B0;&#x5728;&#x518D;&#x6765;&#x8BB2;&#x6709;&#x70B9;&#x8001;&#x5957;&#x4E86;&#x3002;&#x8FD9;&#x91CC;&#x5C31;&#x4E0D;&#x505A;&#x66F4;&#x591A;&#x4ECB;&#x7ECD;&#x4E86;&#xFF0C;&#x4E0D;&#x6E05;&#x695A;&#x7684;&#x8BFB;&#x8005;&#x53EF;&#x4EE5;&#x770B;<a href="https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API?ref=iammapping.com">&#x8FD9;&#x91CC;</a>&#x3002;</p>
<p>&#x6709;&#x4E24;&#x70B9;&#x9700;&#x8981;&#x6CE8;&#x610F;&#x4E00;&#x4E0B;&#x3002;&#x5728; <code>setItem</code> &#x65F6;&#xFF0C;&#x53EF;&#x80FD;&#x4F1A;&#x8FBE;&#x5230;&#x5927;&#x5C0F;&#x9650;&#x5236;&#xFF0C;&#x6700;&#x597D;&#x52A0;&#x4E0A;&#x9519;&#x8BEF;&#x6355;&#x6349; <sup><a href="#ref-error">1</a></sup>&#xFF1A;</p>
<pre><code class="language-javascript">try {
  localStorage.setItem(key, value);
} catch(e) {
  if (isQuotaExceeded(e)) {
    // Storage full, maybe notify user or do some clean-up
  }
}

function isQuotaExceeded(e) {
  var quotaExceeded = false;
  if (e) {
    if (e.code) {
      switch (e.code) {
        case 22:
          quotaExceeded = true;
          break;
        case 1014:
          // Firefox
          if (e.name === &apos;NS_ERROR_DOM_QUOTA_REACHED&apos;) {
            quotaExceeded = true;
          }
          break;
      }
    } else if (e.number === -2147024882) {
      // Internet Explorer 8
      quotaExceeded = true;
    }
  }
  return quotaExceeded;
}
</code></pre>
<p>&#x53E6;&#x5916;&#x5728;&#x5B58;&#x50A8;&#x5BB9;&#x91CF;&#x5FEB;&#x6EE1;&#x65F6;&#xFF0C;&#x4F1A;&#x9020;&#x6210; <code>getItem</code> &#x6027;&#x80FD;&#x6025;&#x5267;&#x4E0B;&#x964D; <sup><a href="#ref-performance">2</a></sup>&#x3002;</p>
<p>&#x6211;&#x4EEC;&#x4E0B;&#x9762;&#x770B;&#x770B; localStorage &#x6709;&#x54EA;&#x4E9B;&#x8111;&#x6D1E;&#x5927;&#x5F00;&#x7684;&#x7528;&#x6CD5;&#x3002;</p>
<h2 id>&#x7F13;&#x5B58;&#x9759;&#x6001;&#x6587;&#x4EF6;</h2>
<p>&#x4F60;&#x4E0D;&#x7981;&#x8981;&#x95EE;&#xFF0C;HTTP &#x534F;&#x8BAE;&#x4E0D;&#x662F;&#x672C;&#x6765;&#x5C31;&#x652F;&#x6301;&#x7F13;&#x5B58;&#x6587;&#x4EF6;&#x5417;&#xFF08;&#x4E4B;&#x524D;&#x5199;&#x8FC7;&#x4E00;&#x7BC7;&#x6587;&#x7AE0;<a href="https://iammapping.com/the-http-guide-of-web-cache/">&#x300A;Web&#x7F13;&#x5B58;&#x4E4B;HTTP&#x6307;&#x5357;&#x300B;</a>&#xFF09;&#xFF0C;&#x4E3A;&#x4EC0;&#x4E48;&#x8FD8;&#x8981;&#x4F7F;&#x7528; localStorage &#x6765;&#x7F13;&#x5B58;&#xFF1F;&#x4E3A;&#x4E86;&#x53EF;&#x7F16;&#x7A0B;&#x5316;&#xFF0C;&#x901A;&#x4FD7;&#x4E00;&#x70B9;&#x8BF4;&#x5C31;&#x662F;&#x628A;&#x547D;&#x8FD0;&#x63E1;&#x5728;&#x81EA;&#x5DF1;&#x624B;&#x4E2D;&#x3002;</p>
<p>HTTP &#x534F;&#x8BAE;&#x7684;&#x7F13;&#x5B58;&#xFF0C;&#x53EF;&#x4EE5;&#x7531;&#x7528;&#x6237;&#x6D4F;&#x89C8;&#x5668;&#x6E05;&#x9664;&#x6216;&#x7981;&#x7528;&#x7F13;&#x5B58;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x7531; Web &#x670D;&#x52A1;&#x5668;&#x8BBE;&#x7F6E;&#x8FC7;&#x671F;&#x65F6;&#x95F4;&#x6216;&#x4E0D;&#x7F13;&#x5B58;&#x3002;&#x5BF9;&#x4E8E;&#x524D;&#x7AEF;&#x5DE5;&#x7A0B;&#x5E08;&#xFF0C;&#x8FD9;&#x66F4;&#x50CF;&#x662F;&#x4E00;&#x4E2A;&#x9ED1;&#x76D2;&#xFF0C;&#x60F3;&#x8981;&#x51B3;&#x5B9A;&#x6587;&#x4EF6;&#x662F;&#x8BBF;&#x95EE;&#x7F13;&#x5B58;&#x8FD8;&#x662F;&#x8BBF;&#x95EE;&#x8FDC;&#x7A0B;&#x663E;&#x5F97;&#x6709;&#x4E9B;&#x529B;&#x4E0D;&#x4ECE;&#x5FC3;&#x4E86;&#x3002;</p>
<p>&#x4F7F;&#x7528; localStorage &#x63A7;&#x5236;&#x6587;&#x4EF6;&#x7F13;&#x5B58;&#x7684;&#x65B9;&#x5F0F;&#x6709;&#x4E24;&#x79CD;&#xFF1A;</p>
<ol>
<li>&#x4F7F;&#x7528; Loader &#x52A0;&#x8F7D;&#x9759;&#x6001;&#x6587;&#x4EF6;</li>
<li>&#x501F;&#x52A9;&#x670D;&#x52A1;&#x5668;&#x7AEF;&#x5C06;&#x9759;&#x6001;&#x6587;&#x4EF6; inline &#x5316;</li>
</ol>
<p>&#x8FD9;&#x4E24;&#x79CD;&#x65B9;&#x5F0F;&#x4E00;&#x822C;&#x90FD;&#x4F1A;&#x63D0;&#x524D;&#x505A;&#x597D;&#x7F13;&#x5B58;&#x8FC7;&#x671F;&#x7B56;&#x7565;&#xFF0C;&#x901A;&#x5E38;&#x662F;&#x4F7F;&#x7528;&#x7248;&#x672C;&#x53F7;&#x6765;&#x63A7;&#x5236;&#xFF0C;&#x4E0B;&#x9762;&#x8FD8;&#x4F1A;&#x7EC6;&#x8BB2;&#x3002;&#x5426;&#x5219;&#x6587;&#x4EF6;&#x65B0;&#x7248;&#x4E0A;&#x7EBF;&#xFF0C;&#x7528;&#x6237;&#x5BA2;&#x6237;&#x7AEF;&#x8FD8;&#x662F;&#x65E7;&#x7248;&#xFF0C;&#x8FD9;&#x5C31;&#x9EBB;&#x70E6;&#x5927;&#x4E86;&#xFF0C;&#x800C;&#x4E14;&#x8FD9;&#x7C7B;&#x95EE;&#x9898;&#xFF0C;&#x8FD8;&#x4E0D;&#x597D;&#x8C03;&#x8BD5;&#x4E0D;&#x597D;&#x91CD;&#x73B0;&#x3002;</p>
<h3 id="loader">&#x4F7F;&#x7528; Loader &#x52A0;&#x8F7D;&#x9759;&#x6001;&#x6587;&#x4EF6;</h3>
<p>&#x7531;&#x4E8E;&#x8BF7;&#x6C42;&#x90FD;&#x662F;&#x52A8;&#x6001;&#x53D1;&#x51FA;&#x7684;&#xFF0C;&#x6240;&#x4EE5;&#x53EF;&#x4EE5;&#x5BF9;&#x8BF7;&#x6C42;&#x62E6;&#x622A;&#x5904;&#x7406;&#x3002;&#x5927;&#x81F4;&#x6D41;&#x7A0B;&#x5982;&#x4E0B;&#xFF1A;</p>
<ol>
<li>&#x67E5;&#x770B;&#x8BF7;&#x6C42;&#x7684;&#x6587;&#x4EF6; url &#x662F;&#x5426;&#x6709;&#x7F13;&#x5B58;&#x5230; localStorage
<ol>
<li>&#x5982;&#x679C;&#x6CA1;&#x6709;&#xFF0C;&#x5230;&#x7B2C; 2 &#x5927;&#x6B65;</li>
<li>&#x5982;&#x679C;&#x6709;&#xFF0C;&#x5224;&#x65AD;&#x6587;&#x4EF6;&#x662F;&#x5426;&#x8FC7;&#x671F;&#x6216;&#x7248;&#x672C;&#x53F7;&#x662F;&#x5426;&#x5339;&#x914D;
<ol>
<li>&#x8FC7;&#x671F;&#x6216;&#x4E0D;&#x5339;&#x914D;&#xFF0C;&#x5230;&#x7B2C; 2 &#x5927;&#x6B65;</li>
<li>&#x6587;&#x4EF6;&#x5185;&#x5BB9;&#x6709;&#x6548;&#xFF0C;&#x5230;&#x7B2C; 4 &#x5927;&#x6B65;</li>
</ol>
</li>
</ol>
</li>
<li>&#x8BF7;&#x6C42;&#x8FDC;&#x7A0B;&#x6587;&#x4EF6;</li>
<li>&#x7F13;&#x5B58;&#x6700;&#x65B0;&#x6587;&#x4EF6;&#x5185;&#x5BB9;</li>
<li>&#x6267;&#x884C;&#x6587;&#x4EF6;&#x5185;&#x5BB9;</li>
</ol>
<p>&#x8FD9;&#x4E2A;&#x65B9;&#x5F0F;&#x6709;&#x4E2A;&#x5F00;&#x6E90;&#x5E93;&#xFF1A;<a href="https://github.com/addyosmani/basket.js?ref=iammapping.com">basket.js</a>&#x3002;</p>
<h3 id="inline">&#x501F;&#x52A9;&#x670D;&#x52A1;&#x5668;&#x7AEF;&#x5C06;&#x9759;&#x6001;&#x6587;&#x4EF6; inline &#x5316;</h3>
<p>&#x8FD9;&#x4E2A;&#x65B9;&#x5F0F;&#x6BD4;&#x4E0A;&#x9762;&#x90A3;&#x79CD;&#x66F4;&#x8FDB;&#x4E00;&#x6B65;&#xFF0C;&#x5728;&#x7B2C;&#x4E00;&#x6B21;&#x54CD;&#x5E94;&#x65F6;&#x628A;&#x9700;&#x8981;&#x653E;&#x5165; localStorage &#x7684;&#x6587;&#x4EF6;&#x90FD;&#x5185;&#x8054;&#x8FDB; html &#x4E2D;&#xFF0C;&#x540E;&#x9762;&#x6BCF;&#x6B21;&#x54CD;&#x5E94;&#x53EA;&#x8981;&#x6587;&#x4EF6;&#x7248;&#x672C;&#x6CA1;&#x6709;&#x53D8;&#x5316;&#xFF0C;&#x90FD;&#x662F;&#x6E32;&#x67D3;&#x4E00;&#x6BB5;&#x4ECE; localStorage &#x52A0;&#x8F7D;&#x8BE5;&#x6587;&#x4EF6;&#x7684;&#x4EE3;&#x7801;&#x3002;&#x8FD9;&#x6837;&#x505A;&#x7684;&#x597D;&#x5904;&#x662F;&#x53EF;&#x4EE5;&#x6709;&#x6548;&#x51CF;&#x5C11;&#x8BF7;&#x6C42;&#x6B21;&#x6570;&#xFF0C;&#x5373;&#x4F7F;&#x662F;&#x7B2C;&#x4E00;&#x6B21;&#x3002;</p>
<p>&#x7248;&#x672C;&#x53F7;&#x4E0D;&#x5339;&#x914D;&#xFF08;&#x7248;&#x672C;&#x53F7;&#x53EF;&#x8BB0;&#x5728; Cookie &#x4E2D;&#xFF0C;&#x7B2C;&#x4E00;&#x6B21;&#x8BBF;&#x95EE;&#x6CA1;&#x6709;&#x7248;&#x672C;&#x53F7;&#xFF09;&#xFF0C;&#x670D;&#x52A1;&#x7AEF;&#x54CD;&#x5E94;&#x5185;&#x5BB9;&#xFF1A;</p>
<pre><code class="language-html">&lt;script&gt;
function script2ls(id) {
  var script = document.getElementById(id);
  if (script) {
    localStorage[id] = script.innerHTML;
  }
}
&lt;/script&gt;

&lt;script id=&quot;jquery.js&quot;&gt;...jquery source code...&lt;/script&gt;
&lt;script&gt;script2ls(&apos;jquery.js&apos;)&lt;/script&gt;
</code></pre>
<p>&#x7248;&#x672C;&#x53F7;&#x5339;&#x914D;&#xFF0C;&#x670D;&#x52A1;&#x7AEF;&#x54CD;&#x5E94;&#x5185;&#x5BB9;&#xFF1A;</p>
<pre><code class="language-html">&lt;script&gt;
function ls2script(id) {
  var script = document.createElement(&apos;script&apos;);
  script.text = localStorage[id];
  document.head.appendChild(script);
}
&lt;/script&gt;

&lt;script&gt;ls2script(&apos;jquery.js&apos;)&lt;/script&gt;
</code></pre>
<p>&#x4E0D;&#x8FC7;&#x4F7F;&#x7528; localStorage &#x7F13;&#x5B58;&#x6587;&#x4EF6;&#x4F1A;&#x6709; XSS &#x7684;&#x98CE;&#x9669;&#xFF0C;&#x800C;&#x4E14;&#x9020;&#x6210;&#x7684;&#x4F24;&#x5BB3;&#x53EF;&#x80FD;&#x662F;&#x6C38;&#x4E45;&#x7684; <sup><a href="#ref-xss">3</a></sup>&#x3002;</p>
<h2 id>&#x540C;&#x6E90;&#x7A97;&#x53E3;&#x901A;&#x4FE1;</h2>
<p>&#x4F60;&#x53EF;&#x80FD;&#x4E0D;&#x7981;&#x53C8;&#x8981;&#x95EE;&#xFF0C;&#x4E0D;&#x662F;&#x6709; postMessage &#x5417;&#xFF1F;&#x6CA1;&#x9519; postMessage &#x786E;&#x5B9E;&#x53EF;&#x4EE5;&#x7528;&#x4E8E;&#x7A97;&#x53E3;&#x6216; iframe &#x95F4;&#x901A;&#x4FE1;&#xFF0C;&#x4F46;&#x662F;&#x524D;&#x63D0;&#x662F;&#x4F60;&#x5FC5;&#x987B;&#x62FF;&#x5230;&#x6253;&#x5F00;&#x65B0;&#x7A97;&#x6216; iframe &#x7684;&#x53E5;&#x67C4;&#x5BF9;&#x8C61;&#xFF1A;</p>
<pre><code class="language-javascript">var popup = window.open(...popup details...);
popup.postMessage(&quot;hello there!&quot;, &quot;http://example.com&quot;);
</code></pre>
<p>&#x8FD9;&#x6837;&#x5728;&#x65B0;&#x7A97;&#x4E2D;&#x518D;&#x6253;&#x5F00;&#x65B0;&#x7A97;&#xFF0C;&#x4F3C;&#x4E4E;&#x5C31;&#x4E0D;&#x597D;&#x4F20;&#x9012;&#x6D88;&#x606F;&#x4E86;&#x3002;</p>
<p>&#x4F60;&#x53EF;&#x80FD;&#x8FD8;&#x60F3;&#x95EE;&#xFF0C;&#x4E3A;&#x4EC0;&#x4E48;&#x8981;&#x5728;&#x7A97;&#x53E3;&#x95F4;&#x901A;&#x4FE1;&#xFF1F;&#x597D;&#x95EE;&#x9898;&#xFF0C;&#x6CA1;&#x6709;&#x5E94;&#x7528;&#x573A;&#x666F;&#x7684;&#x6280;&#x672F;&#x90FD;&#x662F;&#x800D;&#x6D41;&#x6C13;&#x3002;&#x50CF;&#x591A;&#x7A97;&#x53E3;&#x5171;&#x7528;&#x7684;&#x4E00;&#x4E9B;&#x7EC4;&#x4EF6;&#xFF0C;&#x800C;&#x4E14;&#x5BF9;&#x6570;&#x636E;&#x5B9E;&#x65F6;&#x540C;&#x6B65;&#x90FD;&#x6709;&#x8F83;&#x9AD8;&#x8981;&#x6C42;&#x7684;&#x90FD;&#x4F1A;&#x662F;&#x8FD9;&#x4E2A;&#x6280;&#x672F;&#x7684;&#x5E94;&#x7528;&#x573A;&#x666F;&#x3002;&#x6BD4;&#x5982;&#x901A;&#x77E5;&#x4E2D;&#x5FC3;&#x4E0A;&#x9762;&#x7684;&#x672A;&#x8BFB;&#x6570;&#x91CF;&#xFF0C;&#x4E24;&#x4E2A;&#x7A97;&#x53E3;&#xFF0C;A &#x7A97;&#x53E3;&#x66F4;&#x65B0;&#x4E3A; 8&#xFF0C;&#x5207;&#x5230; B &#x7A97;&#x53E3;&#x8FD8;&#x662F; 9&#xFF0C;&#x8FD9;&#x5C31;&#x9020;&#x6210;&#x4E86;&#x4F53;&#x9A8C;&#x4E0D;&#x4E00;&#x81F4;&#xFF0C;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#x53EF;&#x80FD;&#x8FD8;&#x89C9;&#x5F97;&#x65E0;&#x5173;&#x75DB;&#x75D2;&#xFF1B;&#x518D;&#x6BD4;&#x5982;&#x8D2D;&#x7269;&#x8F66;&#xFF0C;&#x4E24;&#x4E2A;&#x4EA7;&#x54C1;&#x7A97;&#x53E3;&#xFF0C;A &#x7A97;&#x53E3;&#x6DFB;&#x52A0;&#x5230;&#x8D2D;&#x7269;&#x8F66;&#xFF0C;&#x5207;&#x5230; B &#x7A97;&#x53E3;&#x6DFB;&#x52A0;&#x5230;&#x8D2D;&#x7269;&#x8F66;&#xFF0C;&#x53D1;&#x73B0;&#x6CA1;&#x6709; A &#x6DFB;&#x52A0;&#x7684;&#x4EA7;&#x54C1;&#xFF0C;&#x8FD9;&#x6837;&#x5C31;&#x6BD4;&#x8F83;&#x4E25;&#x91CD;&#x4E86;&#x3002;&#x8FD9;&#x5F53;&#x7136;&#x4E5F;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x6BCF;&#x4E2A;&#x7A97;&#x53E3;&#x90FD;&#x4E0E;&#x540E;&#x53F0;&#x5EFA;&#x7ACB;&#x8FDE;&#x63A5;&#x6765;&#x66F4;&#x65B0;&#xFF0C;&#x4F46;&#x7528;&#x6237;&#x5982;&#x679C;&#x5F00;&#x5341;&#x51E0;&#x4E2A;&#x7A97;&#x53E3;&#x5C31;&#x5F00;&#x9500;&#x5927;&#x4E86;&#x3002;</p>
<p>&#x6709;&#x4E86;&#x540C;&#x6E90;&#x7A97;&#x53E3;&#x901A;&#x4FE1;&#xFF0C;&#x6211;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x53EA;&#x6709;&#x4E00;&#x4E2A;&#x7A97;&#x53E3;&#x4E0E;&#x540E;&#x53F0;&#x5EFA;&#x7ACB;&#x8FDE;&#x63A5;&#xFF0C;&#x6536;&#x5230;&#x66F4;&#x65B0;&#x540E;&#xFF0C;&#x5E7F;&#x64AD;&#x7ED9;&#x5176;&#x4ED6;&#x7A97;&#x53E3;&#x5C31;&#x53EF;&#x4EE5;&#x3002;&#x8BF4;&#x4E86;&#x8FD9;&#x4E48;&#x591A;&#xFF0C;&#x5B9E;&#x73B0;&#x539F;&#x7406;&#x662F;&#x600E;&#x6837;&#x7684;&#x5462;&#xFF1F;</p>
<p><img src="https://cdn.iammapping.com/2017/10/09/150756219537917384.png" alt="storage event" loading="lazy"></p>
<p>&#x5176;&#x5B9E;&#x539F;&#x7406;&#x4E5F;&#x7B80;&#x5355;&#xFF0C;&#x6BCF;&#x6B21; localStorage &#x4E2D;&#x6709;&#x4EFB;&#x4F55;&#x53D8;&#x52A8;&#x90FD;&#x4F1A;&#x89E6;&#x53D1;&#x4E00;&#x4E2A; <code>storage</code> &#x4E8B;&#x4EF6;&#xFF0C;&#x6240;&#x6709;&#x7A97;&#x53E3;&#x90FD;&#x76D1;&#x542C;&#x8FD9;&#x4E2A;&#x4E8B;&#x4EF6;&#xFF0C;&#x4E00;&#x65E6;&#x6709;&#x7A97;&#x53E3;&#x66F4;&#x65B0; localStorage&#xFF0C;&#x5176;&#x4ED6;&#x7A97;&#x53E3;&#x90FD;&#x4F1A;&#x6536;&#x5230;&#x901A;&#x77E5;&#xFF0C;&#x6839;&#x636E;&#x4E8B;&#x4EF6;&#x4E2D;&#x7684; <code>key</code> &#x628A;&#x4E0D;&#x5173;&#x5FC3;&#x7684;&#x53D8;&#x52A8;&#x8FC7;&#x6EE4;&#x6389;&#x3002;&#x539F;&#x7406;&#x662F;&#x5F88;&#x7B80;&#x5355;&#xFF0C;&#x4F46;&#x662F;&#x8981;&#x5B9E;&#x73B0;&#x4E00;&#x5957;&#x5B8C;&#x6574;&#x7684;&#x5E7F;&#x64AD;&#x673A;&#x5236;&#x8FD8;&#x662F;&#x6709;&#x4E9B;&#x590D;&#x6742;&#xFF0C;&#x4F60;&#x9700;&#x8981;&#xFF1A;</p>
<ul>
<li>&#x7BA1;&#x7406;&#x597D;&#x6BCF;&#x4E2A;&#x7A97;&#x53E3;&#x7684;&#x552F;&#x4E00; ID</li>
<li>&#x9632;&#x6B62;&#x6D88;&#x606F;&#x91CD;&#x590D;</li>
<li>&#x9632;&#x6B62;&#x6D88;&#x606F;&#x53D1;&#x7ED9;&#x4E0D;&#x5173;&#x5FC3;&#x7684;&#x7A97;&#x53E3;</li>
<li>&#x7A97;&#x53E3;&#x5FC3;&#x8DF3; keep alive</li>
<li>&#x4E3B;&#x7A97;&#x53E3;&#x9009;&#x4E3E;</li>
<li>...</li>
</ul>
<p>&#x4E0D;&#x7528;&#x62C5;&#x5FC3;&#xFF0C;&#x5DF2;&#x7ECF;&#x6709;&#x4E86;&#x4E0D;&#x9519;&#x7684;&#x5F00;&#x6E90;&#x5B9E;&#x73B0;&#xFF1A;<a href="https://github.com/diy/intercom.js?ref=iammapping.com">diy/intercom.js</a>&#x3001;<a href="https://github.com/tejacques/crosstab?ref=iammapping.com">tejacques/crosstab</a></p>
<h2 id>&#x5176;&#x4ED6;</h2>
<h3 id="db">&#x4F5C;&#x4E3A;&#x524D;&#x7AEF; DB &#x7684;&#x5B58;&#x50A8;&#x4ECB;&#x8D28;</h3>
<p>&#x4F60;&#x53EF;&#x80FD;&#x4E0D;&#x6EE1;&#x8DB3;&#x4E8E;&#x7528;&#x952E;&#x503C;&#x5BF9;&#x4FDD;&#x5B58;&#x6570;&#x636E;&#xFF0C;&#x4F60;&#x8FD8;&#x60F3;&#x4FDD;&#x5B58;&#x66F4;&#x590D;&#x6742;&#x7684;&#x6570;&#x636E;&#x7ED3;&#x6784;&#x3002;</p>
<p>&#x7075;&#x6D3B;&#x5B58;&#x53D6; json &#x683C;&#x5F0F;&#x7684;&#x6570;&#x636E;&#xFF1A;<a href="https://github.com/typicode/lowdb?ref=iammapping.com#install">typicode/lowdb</a></p>
<p>&#x901A;&#x8FC7; sql &#x5BF9;&#x6570;&#x636E; CURD &#x64CD;&#x4F5C;&#xFF1A;<a href="https://github.com/agershun/alasql?ref=iammapping.com#localstorage-and-dom-storage">agershun/alasql</a></p>
<h3 id>&#x8868;&#x5355;&#x81EA;&#x52A8;&#x6301;&#x4E45;&#x5316;</h3>
<p>&#x5728;&#x586B;&#x5199;&#x8868;&#x5355;&#x65F6;&#xFF0C;&#x9047;&#x5230;&#x6D4F;&#x89C8;&#x5668;&#x5D29;&#x6E83;&#x6216;&#x8005;&#x8BEF;&#x64CD;&#x4F5C;&#x5BFC;&#x81F4;&#x586B;&#x5199;&#x5185;&#x5BB9;&#x4E22;&#x5931;&#xFF0C;&#x6B64;&#x523B;&#x7528;&#x6237;&#x7684;&#x5185;&#x5FC3;&#x4E5F;&#x5E94;&#x8BE5;&#x662F;&#x5D29;&#x6E83;&#x7684;&#x3002;&#x8BEF;&#x64CD;&#x4F5C;&#x8FD8;&#x53EF;&#x4EE5;&#x52A0;&#x4E00;&#x4E2A; <code>beforeunload</code> &#x4E8B;&#x4EF6;&#xFF0C;&#x5728;&#x5173;&#x95ED;&#x6D4F;&#x89C8;&#x5668;&#x6216;&#x8DF3;&#x51FA;&#x5F53;&#x524D;&#x9875;&#x524D;&#x63D0;&#x9192;&#x4E00;&#x4E0B;&#x7528;&#x6237;&#x3002;&#x90A3;&#x6D4F;&#x89C8;&#x5668;&#x5D29;&#x6E83;&#x5462;&#xFF0C;&#x5C06;&#x6570;&#x636E;&#x53D8;&#x66F4;&#x5B9E;&#x65F6;&#x4FDD;&#x5B58;&#x5230;&#x540E;&#x53F0;&#xFF0C;&#x8FD9;&#x6837;&#x4F3C;&#x4E4E;&#x5F00;&#x9500;&#x5F88;&#x5927;&#xFF0C;&#x5B9E;&#x65F6;&#x4FDD;&#x5B58;&#x5230; localStorage &#x662F;&#x4E2A;&#x4E0D;&#x9519;&#x7684;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#xFF0C;&#x771F;&#x5DE7;&#xFF0C;&#x4E5F;&#x6709;&#x4E00;&#x4E2A;&#x5F00;&#x6E90;&#x5B9E;&#x73B0;&#xFF1A;<a href="https://github.com/simsalabim/sisyphus?ref=iammapping.com">simsalabim/sisyphus</a></p>
<h2 id>&#x603B;&#x7ED3;</h2>
<p>&#x6587;&#x4EF6;&#x7F13;&#x5B58;&#x73B0;&#x5728;&#x6709;&#x66F4;&#x597D;&#x7684;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#xFF0C;&#x6CA1;&#x9519;&#xFF0C;&#x8BF4;&#x7684;&#x5C31;&#x662F; Service Worker &#x7684; <a href="https://developer.mozilla.org/en-US/docs/Web/API/CacheStorage?ref=iammapping.com">CacheStorage</a>&#x3002;</p>
<p>&#x4E0D;&#x8FC7;&#x591A;&#x4E86;&#x89E3;&#x4E00;&#x4E9B;&#x8111;&#x6D1E;&#x5927;&#x5F00;&#x7684;&#x60F3;&#x6CD5;&#xFF0C;&#x6709;&#x5229;&#x4E8E;&#x62D3;&#x5C55;&#x89E3;&#x51B3;&#x95EE;&#x9898;&#x7684;&#x601D;&#x8DEF;&#x3002;</p>
<p>Enjoy open source &#x2764;&#xFE0F;</p>
<p>&#x53C2;&#x8003;&#xFF1A;<br>
<small><br>
<span id="ref-error">1</span>&#xFF1A;<a href="http://crocodillon.com/blog/always-catch-localstorage-security-and-quota-exceeded-errors?ref=iammapping.com">Always catch LocalStorage security and quota exceeded errors</a><br>
<span id="ref-performance">2</span>&#xFF1A;<a href="http://www.stevesouders.com/blog/2014/02/11/measuring-localstorage-performance/?ref=iammapping.com">Measuring localStorage Performance</a><br>
<span id="ref-xss">3</span>&#xFF1A;<a href="https://imququ.com/post/enhance-security-for-ls-code.html?ref=iammapping.com">&#x4F7F;&#x7528; SRI &#x589E;&#x5F3A; localStorage &#x4EE3;&#x7801;&#x5B89;&#x5168;</a></small></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[巧用匿名函数重构你的代码]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p><img src="https://cdn.iammapping.com/2017/10/06/150722107304896868.png" alt="anonymous function" loading="lazy"></p>
<p>&#x533F;&#x540D;&#x51FD;&#x6570;&#x6700;&#x65E9;&#x662F;LISP&#x8BED;&#x8A00;&#x5F15;&#x5165;&#xFF0C;&#x540E;&#x9762;&#x53D1;&#x5C55;&#x4E3A;&#x4E0D;&#x4EC5;&#x662F;&#x51FD;&#x6570;&#x5F0F;&#x8BED;&#x8A00;&#x6240;&#x7279;&#x6709;&#xFF0C;&#x5728;&#x89E3;&#x91CA;&#x578B;&#x8BED;&#x8A00;&#x548C;&#x7F16;&#x8BD1;&#x578B;&#x8BED;&#x8A00;&#x4E2D;&#x4E5F;&#x8D8A;&#x6765;&#x8D8A;&#x591A;&#x5730;&#x770B;</p>]]></description><link>https://iammapping.com/the-good-things-of-fn/</link><guid isPermaLink="false">6522cda9caa77d0fabe3ef44</guid><dc:creator><![CDATA[Iam Mapping]]></dc:creator><pubDate>Thu, 05 Oct 2017 16:43:43 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><img src="https://cdn.iammapping.com/2017/10/06/150722107304896868.png" alt="anonymous function" loading="lazy"></p>
<p>&#x533F;&#x540D;&#x51FD;&#x6570;&#x6700;&#x65E9;&#x662F;LISP&#x8BED;&#x8A00;&#x5F15;&#x5165;&#xFF0C;&#x540E;&#x9762;&#x53D1;&#x5C55;&#x4E3A;&#x4E0D;&#x4EC5;&#x662F;&#x51FD;&#x6570;&#x5F0F;&#x8BED;&#x8A00;&#x6240;&#x7279;&#x6709;&#xFF0C;&#x5728;&#x89E3;&#x91CA;&#x578B;&#x8BED;&#x8A00;&#x548C;&#x7F16;&#x8BD1;&#x578B;&#x8BED;&#x8A00;&#x4E2D;&#x4E5F;&#x8D8A;&#x6765;&#x8D8A;&#x591A;&#x5730;&#x770B;&#x5230;&#x533F;&#x540D;&#x51FD;&#x6570;&#x7684;&#x8EAB;&#x5F71;&#xFF0C;&#x5B83;&#x6216;&#x8BB8;&#x6709;&#x4E2A;&#x66F4;&#x6F6E;&#x7684;&#x540D;&#x5B57;&#x53EB; lambda &#x8868;&#x8FBE;&#x5F0F;&#x3002;</p>
<p>&#x95ED;&#x5305;&#x591A;&#x662F;&#x7528;&#x533F;&#x540D;&#x51FD;&#x6570;&#x5B9E;&#x73B0;&#xFF0C;&#x5728;&#x533F;&#x540D;&#x51FD;&#x6570;&#x4E2D;&#x5F15;&#x7528;&#x4E86;&#x5916;&#x90E8;&#x53D8;&#x91CF;&#xFF0C;&#x90A3;&#x8FD9;&#x4E2A;&#x533F;&#x540D;&#x51FD;&#x6570;&#x5C31;&#x5F62;&#x6210;&#x4E86;&#x95ED;&#x5305;&#x3002;&#x7531;&#x4E8E;&#x95ED;&#x5305;&#x548C;&#x533F;&#x540D;&#x51FD;&#x6570;&#x4E4B;&#x95F4;&#x6709;&#x7740;&#x5343;&#x4E1D;&#x4E07;&#x7F15;&#x7684;&#x5173;&#x7CFB;&#xFF0C;&#x6240;&#x4EE5;&#x7ECF;&#x5E38;&#x4F1A;&#x628A;&#x4E24;&#x8005;&#x641E;&#x6DF7;&#x6DC6;&#x3002;&#x5176;&#x5B9E;&#x5728; Js &#x4E2D;&#x533F;&#x540D;&#x51FD;&#x6570;&#x3001;&#x95ED;&#x5305;&#x3001;&#x81EA;&#x6267;&#x884C;&#x51FD;&#x6570;&#x3001;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x3001;&#x7BAD;&#x5934;&#x51FD;&#x6570;&#xFF0C;&#x8FD9;&#x4E9B;&#x6982;&#x5FF5;&#x4F3C;&#x4E4E;&#x76F8;&#x540C;&#xFF0C;&#x5374;&#x53C8;&#x4E0D;&#x540C;&#xFF0C;&#x8BF7;&#x8BFB;&#x8005;&#x670B;&#x53CB;&#x81EA;&#x884C;&#x4E86;&#x89E3;&#x3002;</p>
<p>&#x533F;&#x540D;&#x51FD;&#x6570;&#x62E5;&#x6709;&#x53EF;&#x52A8;&#x6001;&#x7F16;&#x7A0B;&#x7684;&#x6267;&#x884C;&#x8FC7;&#x7A0B;&#x3002;&#x5DE7;&#x5999;&#x4F7F;&#x7528;&#x53EF;&#x4EE5;&#x8BA9;&#x4F60;&#x7684;&#x4EE3;&#x7801;&#x7B80;&#x7EA6;&#x800C;&#x4E0D;&#x5931;&#x4F18;&#x96C5;&#xFF0C;&#x7075;&#x6D3B;&#x800C;&#x4E0D;&#x5931;&#x7EA6;&#x675F;&#x3002;&#x597D;&#x4E86;&#xFF0C;&#x6B63;&#x5F0F;&#x5207;&#x5165;&#x672C;&#x6587;&#x7684;&#x6B63;&#x9898;&#xFF0C;&#x5DE7;&#x7528;&#x533F;&#x540D;&#x51FD;&#x6570;&#x91CD;&#x6784;&#x4EE3;&#x7801;&#x3002;&#x6309;&#x7167;&#x91CD;&#x6784;&#x7684;&#x60EF;&#x4F8B;&#xFF0C;&#x5148;&#x6307;&#x51FA;&#x4EE3;&#x7801;&#x4E2D;&#x7684;&#x574F;&#x5473;&#xFF08;Bad Smell&#xFF09;&#xFF1A;</p>
<ul>
<li>&#x5B9A;&#x4E49;&#x5197;&#x957F;&#x7684;&#x91CD;&#x590D;&#x914D;&#x7F6E;</li>
<li>&#x6761;&#x4EF6;&#x591A;&#x53D8;&#x7684;&#x96C6;&#x5408;&#x8FC7;&#x6EE4;</li>
<li>&#x8BF4;&#x4E00;&#x4E0D;&#x4E8C;&#x7684;&#x65B9;&#x6CD5;&#x8C03;&#x7528;</li>
</ul>
<h2 id>&#x5B9A;&#x4E49;&#x5197;&#x957F;&#x7684;&#x91CD;&#x590D;&#x914D;&#x7F6E;</h2>
<p>&#x5728;&#x5199;&#x914D;&#x7F6E;&#x4EE3;&#x7801;&#x65F6;&#xFF0C;&#x7ECF;&#x5E38;&#x4F1A;&#x9047;&#x5230;&#x5927;&#x91CF;&#x91CD;&#x590D;&#x7684;&#x914D;&#x7F6E;&#xFF0C;&#x5982;&#x679C;&#x8981;&#x4FEE;&#x6539;&#x4E00;&#x4E9B;&#x5185;&#x5BB9;&#xFF0C;&#x6240;&#x6709;&#x7684;&#x90FD;&#x8981;&#x4FEE;&#x6539;&#xFF0C;&#x7740;&#x5B9E;&#x5F88;&#x7D2F;&#xFF0C;&#x800C;&#x4E14;&#x5BB9;&#x6613;&#x9057;&#x6F0F;&#x3002;&#x6BD4;&#x5982;&#xFF1A;</p>
<pre><code class="language-javascript">{
  html: `
    &lt;label&gt;&lt;input type=&quot;checkbox&quot; name=&quot;apple&quot; /&gt; Apple&lt;/label&gt;
    &lt;label&gt;&lt;input type=&quot;checkbox&quot; name=&quot;banana&quot; /&gt; Banana&lt;/label&gt;
    &lt;label&gt;&lt;input type=&quot;checkbox&quot; name=&quot;orange&quot; /&gt; Orange&lt;/label&gt;
  `
}
</code></pre>
<p>&#x8FD9;&#x91CC;&#x9762;&#x6709;&#x4E09;&#x4E2A;&#x9009;&#x9879;&#xFF0C;&#x4E09;&#x4E2A;&#x9009;&#x9879;&#x7684;&#x7ED3;&#x6784;&#x5B8C;&#x5168;&#x4E00;&#x6837;&#xFF0C;&#x5982;&#x679C;&#x8981;&#x7ED9;&#x6240;&#x6709;&#x9009;&#x9879;&#x52A0;&#x4E00;&#x4E2A; <code>title</code>&#xFF0C;&#x90A3;&#x4F60;&#x5C31;&#x8981;&#x628A;&#x8FD9;&#x4EF6;&#x4E8B;&#x91CD;&#x590D;&#x505A;&#x4E09;&#x904D;&#x3002;</p>
<pre><code class="language-javascript">{
  html: `
    &lt;label&gt;&lt;input type=&quot;checkbox&quot; name=&quot;apple&quot; title=&quot;Apple&quot; /&gt; Apple&lt;/label&gt;
    &lt;label&gt;&lt;input type=&quot;checkbox&quot; name=&quot;banana&quot; title=&quot;Banana&quot; /&gt; Banana&lt;/label&gt;
    &lt;label&gt;&lt;input type=&quot;checkbox&quot; name=&quot;orange&quot; title=&quot;Orange&quot; /&gt; Orange&lt;/label&gt;
  `
}
</code></pre>
<p>&#x7A0B;&#x5E8F;&#x733F;&#x662F;&#x4E2A;&#x5947;&#x602A;&#x7684;&#x7FA4;&#x4F53;&#xFF0C;&#x4ED6;&#x4EEC;&#x5B81;&#x613F;&#x505A;&#x4E94;&#x4EF6;&#x4E0D;&#x540C;&#x7684;&#x4E8B;&#xFF0C;&#x4E5F;&#x4E0D;&#x613F;&#x91CD;&#x590D;&#x4E09;&#x6B21;&#x505A;&#x540C;&#x4E00;&#x4EF6;&#x4E8B;&#x3002;&#x6240;&#x4EE5;&#x8FD9;&#x600E;&#x4E48;&#x80FD;&#x5FCD;&#xFF0C;&#x628A;&#x914D;&#x7F6E;&#x4E2D;&#x4E0D;&#x540C;&#x7684;&#x5185;&#x5BB9;&#x63D0;&#x53D6;&#x51FA;&#x6765;&#xFF1A;</p>
<pre><code class="language-javascript">{
  html: (function(fruits) {
    return fruits.map(it =&gt; `&lt;label&gt;&lt;input type=&quot;checkbox&quot; name=&quot;${it.name}&quot; title=&quot;${it.title}&quot; /&gt; ${it.title}&lt;/label&gt;`).join(&apos;&apos;);
  }([
    {name: &apos;apple&apos;, title: &apos;Apple&apos;},
    {name: &apos;banana&apos;, title: &apos;Banana&apos;},
    {name: &apos;orange&apos;, title: &apos;Orange&apos;}
  ]))
}
</code></pre>
<p>&#x8FD9;&#x6837;&#x7684;&#x4FEE;&#x6539;&#x5BF9;&#x914D;&#x7F6E;&#x7684;&#x8C03;&#x7528;&#x65B9;&#x6765;&#x8BF4;&#x662F;&#x5B8C;&#x5168;&#x900F;&#x660E;&#x7684;&#xFF0C;&#x4F46;&#x662F;&#x5BF9;&#x4E8E;&#x914D;&#x7F6E;&#x7684;&#x7EF4;&#x62A4;&#x8005;&#x6765;&#x8BF4;&#xFF0C;&#x5C06;&#x7ED3;&#x6784;&#x548C;&#x6570;&#x636E;&#x5206;&#x79BB;&#x5F00;&#xFF0C;&#x8981;&#x6539;&#x7ED3;&#x6784;&#x5C31;&#x6539;&#x81EA;&#x6267;&#x884C;&#x65B9;&#x6CD5;&#x4F53;&#xFF0C;&#x8981;&#x6539;&#x6570;&#x636E;&#x5C31;&#x6539;&#x4F20;&#x5165;&#x81EA;&#x6267;&#x884C;&#x65B9;&#x6CD5;&#x7684;&#x53C2;&#x6570;&#xFF0C;&#x53EF;&#x4EE5;&#x5927;&#x5927;&#x51CF;&#x5C11;&#x72AF;&#x9519;&#x7684;&#x98CE;&#x9669;&#xFF0C;&#x53C8;&#x907F;&#x514D;&#x4E00;&#x4E9B;&#x65E0;&#x8111;&#x7684;&#x590D;&#x5236;&#x7C98;&#x8D34;&#x3002;</p>
<p>&#x867D;&#x7136;&#x5728;&#x914D;&#x7F6E;&#x4E2D;&#x5199;&#x4EE3;&#x7801;&#x903B;&#x8F91;&#x4E0D;&#x662F;&#x7279;&#x522B;&#x63A8;&#x8350;&#x7684;&#x505A;&#x6CD5;&#xFF0C;&#x4F46;&#x76F8;&#x5BF9;&#x4E8E;&#x4EE3;&#x7801;&#x53EF;&#x7EF4;&#x62A4;&#x6027;&#x6765;&#x8BF4;&#x8FD9;&#x4E0D;&#x7B97;&#x5565;&#x4E86;&#x3002;</p>
<h2 id>&#x6761;&#x4EF6;&#x591A;&#x53D8;&#x7684;&#x96C6;&#x5408;&#x8FC7;&#x6EE4;</h2>
<p>&#x96C6;&#x5408;&#x8FC7;&#x6EE4;&#x662F;&#x4E2A;&#x975E;&#x5E38;&#x5E38;&#x89C1;&#x7684;&#x9700;&#x6C42;&#xFF0C;&#x5047;&#x8BBE;&#x6709;&#x4E2A;&#x5B66;&#x751F;&#x96C6;&#x5408;&#xFF1A;</p>
<pre><code class="language-javascript">let students = [
  {name: &apos;Lucy&apos;, age: 20, sex: &apos;female&apos;},
  {name: &apos;LiLei&apos;, age: 21, sex: &apos;male&apos;},
  {name: &apos;Jim&apos;, age: 18, sex: &apos;male&apos;}
]
</code></pre>
<p>&#x73B0;&#x5728;&#x8981;&#x8FC7;&#x6EE4;&#x51FA;&#x5E74;&#x9F84; 20 &#x5C81;&#x7684;&#x540C;&#x5B66;&#xFF1A;</p>
<pre><code class="language-javascript">function filterByAge(list, age) {
  let filtered = [];
  for (let i = 0; i &lt; list.length; i++) {
    if (list[i].age === age) {
      filtered.push(list[i]);
    }
  }
  return filtered;
}
</code></pre>
<p>&#x53C8;&#x8981;&#x8FC7;&#x6EE4;&#x51FA;&#x59D3;&#x540D;&#x53EB; LiLei &#x7684;&#x540C;&#x5B66;&#xFF1A;</p>
<pre><code class="language-javascript">function filterByName(list, name) {
  let filtered = [];
  for (let i = 0; i &lt; list.length; i++) {
    if (list[i].name === name) {
      filtered.push(list[i]);
    }
  }
  return filtered;
}
</code></pre>
<p>&#x8FD8;&#x8981;&#x8FC7;&#x6EE4;&#x51FA;&#x6027;&#x522B;&#x4E3A;&#x7537;&#x7684;&#x540C;&#x5B66;&#xFF1A;</p>
<pre><code class="language-javascript">function filterBySex(list, sex) {
  let filtered = [];
  for (let i = 0; i &lt; list.length; i++) {
    if (list[i].sex === sex) {
      filtered.push(list[i]);
    }
  }
  return filtered;
}
</code></pre>
<p>&#x5C31;&#x5728;&#x4F60;&#x89C9;&#x5F97;&#x5927;&#x529F;&#x544A;&#x6210;&#xFF0C;&#x53EF;&#x4EE5;&#x7AD9;&#x8D77;<s>&#x5F2F;</s>&#x4F38;&#x8170;&#x7684;&#x65F6;&#x523B;&#xFF0C;&#x7A81;&#x7136;&#x88AB;&#x4E00;&#x80A1;&#x5F3A;&#x5927;&#x7684;&#x529B;&#x91CF;&#x6309;&#x56DE;&#x4E86;&#x5EA7;&#x6905;&#xFF0C;&#x5E2E;&#x6211;&#x627E;&#x51FA;&#x59D3;&#x540D;&#x4EE5; &#x201C;L&#x201D; &#x5F00;&#x5934;&#x7684;&#x7AE5;&#x978B;&#x3002;&#x867D;&#x7136;&#x4F60;&#x5185;&#x5FC3;&#x662F; mmp~&#xFF0C;&#x4F46;&#x8FD8;&#x80FD;&#x600E;&#x4E48;&#x529E;&#xFF0C;&#x5199;&#x554A;&#xFF0C;&#x4E8E;&#x662F;&#x53C8;&#x542D;&#x54E7;&#x542D;&#x54E7;&#x52A0;&#x4E86;&#x5982;&#x4E0B;&#x65B9;&#x6CD5;&#xFF1A;</p>
<pre><code class="language-javascript">function filterByNameStart(list, nameStart) {
  let filtered = [];
  for (let i = 0; i &lt; list.length; i++) {
    if (list[i].name.indexOf(nameStart) === 0) {
      filtered.push(list[i]);
    }
  }
  return filtered;
}
</code></pre>
<p>&#x4E8E;&#x662F;&#x4E4E;&#xFF0C;&#x8FD9;&#x4E2A;&#x8C03;&#x7528;&#x65B9;&#x5F0F;&#xFF1A;</p>
<pre><code class="language-javascript">filterByName(filterBySex(filterByAge(students, 21), &apos;male&apos;), &apos;LiLei&apos;); 
</code></pre>
<p>&#x5C31;&#x53EF;&#x4EE5;&#x7406;&#x89E3;&#x4E3A;&#x627E;&#x51FA;&#x5E74;&#x9F84;&#x4E3A; 21 &#x5C81;&#x7684;&#x7537;&#x6027; LiLei&#x3002;&#x597D;&#x5427;&#xFF0C;&#x53EF;&#x8BFB;&#x6027;&#x8FD8;&#x4E0D;&#x7B97;&#x592A;&#x5DEE;&#x3002;</p>
<p>&#x4F46;&#x662F;&#xFF0C;&#x4E0D;&#x96BE;&#x770B;&#x51FA;&#x4EE5;&#x4E0A; <code>filterByAge</code>&#x3001;<code>filterByNameStart</code> &#x7B49;&#x8FD9;&#x4E00;&#x7CFB;&#x5217;&#x65B9;&#x6CD5;&#x4E2D;&#xFF0C;&#x9664;&#x4E86;&#x8FC7;&#x6EE4;&#x6761;&#x4EF6;&#x4E0D;&#x540C;&#xFF0C;&#x5176;&#x4ED6;&#x903B;&#x8F91;&#x5B8C;&#x5168;&#x4E00;&#x6837;&#xFF0C;&#x9020;&#x6210;&#x4E86;&#x5927;&#x91CF;&#x4EE3;&#x7801;&#x7684;&#x91CD;&#x590D;&#xFF1B;&#x5E76;&#x4E14;&#x6CA1;&#x6709;&#x4EFB;&#x4F55;&#x7075;&#x6D3B;&#x6027;&#x53EF;&#x8A00;&#xFF0C;&#x8C03;&#x7528;&#x65B9;&#x6539;&#x9700;&#x6C42;&#xFF0C;&#x4F60;&#x5C31;&#x8981;&#x52A0;&#x65B9;&#x6CD5;&#x3002;</p>
<p>&#x6211;&#x4EEC;&#x73B0;&#x5728;&#x5C31;&#x4F7F;&#x7528;&#x533F;&#x540D;&#x51FD;&#x6570;&#x628A;&#x4E0D;&#x540C;&#x7684;&#x90E8;&#x5206;&#x62BD;&#x51FA;&#x53BB;&#xFF0C;&#x8BA9;&#x8C03;&#x7528;&#x65B9;&#x60F3;&#x600E;&#x4E48;&#x8FC7;&#x6EE4;&#x5C31;&#x8FC7;&#x6EE4;&#x3002;<code>filter</code> &#x65B9;&#x6CD5;&#x7684;&#x4E3B;&#x5E72;&#x903B;&#x8F91;&#x53EA;&#x5173;&#x5FC3;&#x5F53;&#x524D;&#x7684;&#x5143;&#x7D20;&#x662F;&#x4E0D;&#x662F;&#x8981;&#x653E;&#x5165;&#x7ED3;&#x679C;&#x96C6;&#x5408;&#x4E2D;&#xFF0C;&#x5176;&#x4ED6;&#x7684;&#x5224;&#x65AD;&#x903B;&#x8F91;&#x90FD;&#x4EA4;&#x7ED9;&#x533F;&#x540D;&#x51FD;&#x6570; <code>fn</code> &#x53BB;&#x505A;&#xFF1A;</p>
<pre><code class="language-javascript">function filter(list, fn) {
  let filtered = [];
  for (let i = 0; i &lt; list.length; i++) {
    if (fn(list[i], i) === true) {
      filtered.push(list[i]);
    }
  }
  return filtered;
}
</code></pre>
<p>&#x4E0A;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x4F1A;&#x53D8;&#x6210;&#x8FD9;&#x79CD;&#x5199;&#x6CD5;&#xFF1A;</p>
<pre><code class="language-javascript">filter(students, function(member) {
  return member.name === &apos;LiLei&apos; &amp;&amp; member.age === 21 &amp;&amp; member.sex === &apos;male&apos;;
});
</code></pre>
<p>&#x4F7F;&#x7528;&#x7BAD;&#x5934;&#x65B9;&#x6CD5;&#x53EF;&#x4EE5;&#x66F4;&#x7B80;&#x6D01;&#xFF1A;</p>
<pre><code class="language-javascript">filter(students, member =&gt; member.name === &apos;LiLei&apos; &amp;&amp; 
    member.age === 21 &amp;&amp; 
    member.sex === &apos;male&apos;);
</code></pre>
<p>&#x73B0;&#x5728;&#x8C03;&#x7528;&#x65B9;&#x518D;&#x63D0;&#x4E00;&#x4E9B;&#x53D8;&#x6001;&#x7684;&#x8FC7;&#x6EE4;&#x65B9;&#x5F0F;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x56DE;&#x4E00;&#x4E2A;&#x773C;&#x795E;&#xFF0C;&#x81EA;&#x5DF1;&#x5199;&#x53BB;&#x3002;</p>
<h2 id>&#x8BF4;&#x4E00;&#x4E0D;&#x4E8C;&#x7684;&#x65B9;&#x6CD5;&#x8C03;&#x7528;</h2>
<p>&#x5047;&#x8BBE;&#x6709;&#x4E2A; Api &#x63A5;&#x53E3;&#xFF0C;&#x5C06;&#x4F20;&#x5165;&#x7684;&#x6570;&#x5B57;&#x7FFB;&#x500D;&#x5E76;&#x8FD4;&#x56DE;&#xFF0C;&#x8FD9;&#x4E2A;&#x63A5;&#x53E3;&#x652F;&#x6301;&#x5355;&#x4E2A;&#x548C;&#x6279;&#x91CF;&#x7684;&#x65B9;&#x5F0F;&#x3002;</p>
<p>&#x4F20;&#x5165; <code>5</code></p>
<ul>
<li>&#x6267;&#x884C;&#x6210;&#x529F;&#x8FD4;&#x56DE; <code>{status: &apos;success&apos;, data: 10}</code></li>
<li>&#x6267;&#x884C;&#x5931;&#x8D25;&#x8FD4;&#x56DE; <code>{status: &apos;failed&apos;, error: &apos;xxx&apos;}</code></li>
</ul>
<p>&#x4F20;&#x5165; <code>[2, 3]</code></p>
<ul>
<li>&#x6267;&#x884C;&#x6210;&#x529F;&#x8FD4;&#x56DE; <code>{status: &apos;success&apos;, data: [{status: &apos;success&apos;, data: 4}, {status: &apos;success&apos;, data: 6}]}</code></li>
<li>&#x6267;&#x884C;&#x5931;&#x8D25;&#x8FD4;&#x56DE; <code>{status: &apos;success&apos;, data: [{status: &apos;failed&apos;, error: &apos;xxx&apos;}, {status: &apos;failed&apos;, error: &apos;xxx&apos;}]}</code></li>
</ul>
<p>&#x4E5F;&#x5C31;&#x662F;&#x5355;&#x4E2A;&#x8F93;&#x5165;&#x4F1A;&#x6309;&#x5355;&#x4E2A;&#x683C;&#x5F0F;&#x8F93;&#x51FA;&#xFF0C;&#x6279;&#x91CF;&#x8F93;&#x5165;&#x4F1A;&#x6309;&#x6279;&#x91CF;&#x683C;&#x5F0F;&#x8F93;&#x51FA;&#x3002;&#x4E09;&#x4E0B;&#x4E94;&#x9664;&#x4E8C;&#xFF0C;&#x5B9E;&#x73B0;&#x4E86;&#x4E0B;&#x9762;&#x8FD9;&#x4E2A;&#x7248;&#x672C;&#xFF1A;</p>
<pre><code class="language-javascript">function multiple(inNum) {
  if (Array.isArray(inNum)) {
    // &#x5904;&#x7406;&#x6279;&#x91CF;&#x60C5;&#x51B5;
    return {
      status: &apos;success&apos;,
      data: inNum.map(it =&gt; {
        if (isNaN(parseFloat(it))) {
          return {
            status: &apos;failed&apos;,
            error: &apos;The input is not a number&apos;
          };
        } 

        return {
          status: &apos;success&apos;,
          data: it * 2
        }
      })
    };
  } else {
    // &#x5904;&#x7406;&#x5355;&#x4E2A;&#x60C5;&#x51B5;
    if (isNaN(parseFloat(inNum))) {
      return {
        status: &apos;failed&apos;,
        error: &apos;The input is not a number&apos;
      };
    }

    return {
      status: &apos;success&apos;,
      data: inNum * 2
    };
  }
}
</code></pre>
<p>&#x8FD9;&#x91CC;&#x9762;&#x5355;&#x4E2A;&#x548C;&#x6279;&#x91CF;&#x4E24;&#x79CD;&#x65B9;&#x5F0F;&#x9664;&#x4E86;&#x8F93;&#x5165;&#x548C;&#x8F93;&#x51FA;&#x683C;&#x5F0F;&#x4E0D;&#x540C;&#xFF0C;&#x5176;&#x4ED6;&#x903B;&#x8F91;&#x5B8C;&#x5168;&#x4E00;&#x6837;&#x3002;&#x5982;&#x679C;&#x8981;&#x5C06;&#x4E58; 2 &#x6539;&#x6210;&#x4E58; 3&#xFF0C;&#x4E24;&#x4E2A;&#x5730;&#x65B9;&#x90FD;&#x8981;&#x6539;&#x3002;&#x90A3;&#x770B;&#x4E0B;&#x600E;&#x4E48;&#x4F7F;&#x7528;&#x533F;&#x540D;&#x51FD;&#x6570;&#x6765;&#x907F;&#x514D;&#x4E24;&#x5904;&#x4FEE;&#x6539;&#xFF1A;</p>
<pre><code class="language-javascript">function execute(data, fn) {
  // &#x6700;&#x5C0F;&#x6267;&#x884C;&#x5355;&#x5143;
  let single = it =&gt; {
    try {
      return {
        status: &apos;success&apos;,
        data: fn(it)
      };
    } catch (e) {
      return {
        status: &apos;failed&apos;,
        error: e.toString()
      }
    }
  };

  if (Array.isArray(data)) {
    return {
      status: &apos;success&apos;,
      data: data.map(single)
    }
  } else {
    return single(data);
  }
}

function multiple(inNum) {
  return execute(inNum, it =&gt; {
    if (isNaN(parseFloat(it))) {
      throw new Error(&apos;The input is not a number&apos;);
    }

    return it * 2;
  });
}
</code></pre>
<p>&#x73B0;&#x5728; <code>execute</code> &#x65B9;&#x6CD5;&#x53EA;&#x7BA1;&#x8F93;&#x5165;&#x8F93;&#x51FA;&#x7684;&#x683C;&#x5F0F;&#x548C;&#x9519;&#x8BEF;&#x5904;&#x7406;&#xFF0C;&#x5305;&#x63FD;&#x4E86;&#x6240;&#x6709;&#x810F;&#x6D3B;&#x7D2F;&#x6D3B;&#xFF1B;<code>multiple</code> &#x65B9;&#x6CD5;&#x5219;&#x53EA;&#x5173;&#x5FC3;&#x4E1A;&#x52A1;&#x7684;&#x5177;&#x4F53;&#x5B9E;&#x73B0;&#xFF0C;&#x4E5F;&#x4E0D;&#x7528;&#x5173;&#x5FC3;&#x8F93;&#x5165;&#x7684;&#x662F;&#x5355;&#x4E2A;&#x5143;&#x7D20;&#x8FD8;&#x662F;&#x6570;&#x7EC4;&#x3002;&#x5982;&#x679C;&#x8981;&#x6539;&#x4E58; 3&#xFF0C;&#x53EA;&#x8981;&#x4FEE;&#x6539; <code>multiple</code> &#x65B9;&#x6CD5;&#x6700;&#x540E;&#x4E00;&#x4E2A; <code>return</code>&#x3002;&#x5982;&#x6B64;&#x4E00;&#x6765;&#xFF0C;<code>execute</code> &#x8FD8;&#x53EF;&#x4EE5;&#x88AB;&#x5176;&#x4ED6;&#x7684; Api &#x65B9;&#x6CD5;&#x590D;&#x7528;&#xFF0C;&#x53EF;&#x8C13;&#x4E00;&#x4E3E;&#x4E24;&#x5F97;&#x3002;</p>
<h2 id>&#x603B;&#x7ED3;</h2>
<p>&#x672C;&#x6587;&#x7684;&#x76EE;&#x7684;&#x53EA;&#x662F;&#x629B;&#x7816;&#x5F15;&#x7389;&#xFF0C;&#x4EE3;&#x7801;&#x4E2D;&#x53EF;&#x5229;&#x7528;&#x533F;&#x540D;&#x51FD;&#x6570;&#x91CD;&#x6784;&#x7684;&#x574F;&#x5473;&#x8FD8;&#x6709;&#x5F88;&#x591A;&#xFF0C;&#x8FD9;&#x79CD;&#x91CD;&#x6784;&#x65B9;&#x5F0F;&#x4E0D;&#x53EA;&#x662F;&#x9002;&#x7528;&#x4E8E; Js &#x4E2D;&#x3002;&#x5927;&#x5BB6;&#x53EA;&#x8981;&#x591A;&#x601D;&#x8003;&#x3001;&#x591A;&#x52A8;&#x624B;&#xFF0C;&#x4EE3;&#x7801;&#x8D28;&#x91CF;&#x4E00;&#x5B9A;&#x4F1A;day day up~~</p>
<p>&#x5173;&#x4E8E;&#x91CD;&#x6784;&#x6211;&#x8FD8;&#x60F3;&#x591A;&#x8BF4;&#x4E00;&#x70B9;&#xFF0C;&#x91CD;&#x6784;&#x7684;&#x8FC7;&#x7A0B;&#x5E94;&#x8BE5;&#x662F;&#x6E10;&#x8FDB;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x5F53;&#x4F60;&#x6539;&#x7B2C;&#x4E00;&#x6B21;&#x7684;&#x65F6;&#x5019;&#x53EF;&#x80FD;&#x89C9;&#x5F97;&#x8FD8;ok&#xFF0C;&#x7B2C;&#x4E8C;&#x6B21;&#x5C31;&#x8981;&#x60F3;&#x4E0B;&#x662F;&#x4E0D;&#x662F;&#x6709;&#x66F4;&#x597D;&#x7684;&#x65B9;&#x5F0F;&#x6765;&#x5B9E;&#x73B0;&#x3002;&#x5982;&#x679C;&#x4FEE;&#x6539;&#x5BF9;&#x8C03;&#x7528;&#x65B9;&#x900F;&#x660E;&#x90A3;&#x662F;&#x6700;&#x597D;&#x4E86;&#xFF0C;&#x5B9E;&#x5728;&#x4E0D;&#x884C;&#x8BA9;&#x8C03;&#x7528;&#x65B9;&#x914D;&#x5408;&#x4FEE;&#x6539;&#x4E5F;&#x662F;&#x503C;&#x5F97;&#x7684;&#xFF0C;&#x5F53;&#x7136;&#x8FD9;&#x5176;&#x4E2D;&#x8FD8;&#x8981;&#x6743;&#x8861;&#x65F6;&#x95F4;&#x6210;&#x672C;&#x3002;Your boss is watching you &#x1F621;</p>
<p>Happy Code &#x1F601;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[如何优雅地写js异步循环]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p><img src="https://iammapping.com/content/images/2016/02/advancedjs-async-1.jpg" alt="ADVANCED JS RETHINKING ASYNC" loading="lazy"></p>
<blockquote>
<p>&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;&#x4F5C;&#x4E3A;&#x4E4B;&#x524D;&#x4E24;&#x7BC7;&#x6587;&#x7AE0;&#x7684;&#x5EF6;&#x7EED;&#xFF0C;&#x6765;&#x7684;&#x7A0D;&#x5FAE;&#x6709;&#x70B9;&#x8FDF;&#x3002;</p>
</blockquote>
<blockquote>
<ul>
<li><a href="https://iammapping.com/write-js-async-gracefully/">&#x5982;&#x4F55;&#x4F18;&#x96C5;&#x5730;&#x5199;js&#x5F02;&#x6B65;&#x4EE3;&#x7801;</a></li>
<li><a href="https://iammapping.com/write-js-async-gracefully-2/">&#x5982;&#x4F55;&#x4F18;&#x96C5;&#x5730;&#x5199;js&#x5F02;&#x6B65;&#x4EE3;&#x7801;(2)</a></li>
</ul>
</blockquote>
<blockquote>
<p>&#x65F6;&#x9694;&#x4E00;</p></blockquote>]]></description><link>https://iammapping.com/write-js-async-loop-gracefully/</link><guid isPermaLink="false">6522cda9caa77d0fabe3ef3e</guid><category><![CDATA[NodeJs]]></category><category><![CDATA[Async]]></category><category><![CDATA[Promise]]></category><category><![CDATA[Await]]></category><dc:creator><![CDATA[Iam Mapping]]></dc:creator><pubDate>Wed, 19 Jul 2017 16:58:27 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><img src="https://iammapping.com/content/images/2016/02/advancedjs-async-1.jpg" alt="ADVANCED JS RETHINKING ASYNC" loading="lazy"></p>
<blockquote>
<p>&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;&#x4F5C;&#x4E3A;&#x4E4B;&#x524D;&#x4E24;&#x7BC7;&#x6587;&#x7AE0;&#x7684;&#x5EF6;&#x7EED;&#xFF0C;&#x6765;&#x7684;&#x7A0D;&#x5FAE;&#x6709;&#x70B9;&#x8FDF;&#x3002;</p>
</blockquote>
<blockquote>
<ul>
<li><a href="https://iammapping.com/write-js-async-gracefully/">&#x5982;&#x4F55;&#x4F18;&#x96C5;&#x5730;&#x5199;js&#x5F02;&#x6B65;&#x4EE3;&#x7801;</a></li>
<li><a href="https://iammapping.com/write-js-async-gracefully-2/">&#x5982;&#x4F55;&#x4F18;&#x96C5;&#x5730;&#x5199;js&#x5F02;&#x6B65;&#x4EE3;&#x7801;(2)</a></li>
</ul>
</blockquote>
<blockquote>
<p>&#x65F6;&#x9694;&#x4E00;&#x5E74;&#xFF0C;&#x4EE5;&#x4E0A;&#x4E24;&#x7BC7;&#x6587;&#x7AE0;&#x5185;&#x5BB9;&#x6216;&#x6709;&#x8FC7;&#x65F6;&#xFF0C;&#x8BF7;&#x8BFB;&#x8005;&#x81EA;&#x884C;&#x659F;&#x914C;&#x3002;&#x597D;&#x4E0B;&#x9762;&#x6B63;&#x5F0F;&#x5F00;&#x59CB;&#x672C;&#x6587;&#x5185;&#x5BB9;&#x3002;</p>
</blockquote>
<h2 id>&#x5FAA;&#x73AF;&#x7684;&#x65B9;&#x5F0F;</h2>
<p>&#x5047;&#x8BBE;&#x6211;&#x4EEC;&#x6709;&#x4E2A;&#x6570;&#x7EC4;&#xFF0C;&#x5305;&#x542B; 5 &#x4E2A;&#x6570;&#x5B57;&#xFF1A;<code>let times = [100, 150, 200, 250, 300]</code>&#xFF1B;<br>
&#x8FD8;&#x6709;&#x4E00;&#x4E2A;&#x5F02;&#x6B65;&#x7684;&#x7761;&#x89C9;&#x65B9;&#x6CD5;&#xFF1A;<code>sleep(time, cb)</code>&#x3002;</p>
<pre><code class="language-javascript">import Promise from &apos;bluebird&apos;;

// &#x5F53;&#x6CA1;&#x6709; cb &#x65F6;&#xFF0C;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A; Promise &#x5BF9;&#x8C61;
export default function sleep(time, cb) {
    if (cb) {
        setTimeout(cb, time);
    } else {
        return new Promise(resolve =&gt; {
            setTimeout(resolve, time);
        });
    }
};
</code></pre>
<p>&#x73B0;&#x5728;&#x8981;&#x53BB;&#x5FAA;&#x73AF;&#x7761;&#x8FD9;&#x51E0;&#x4E2A;&#x6570;&#x5B57;&#xFF0C;&#x95EE;&#x4F60;&#x6709;&#x54EA;&#x4E9B;&#x7761;&#x6CD5;&#xFF1F;&#x1F914;</p>
<p>&#x4E3A;&#x4E86;&#x65B9;&#x4FBF;&#x4EA4;&#x6D41;&#xFF0C;&#x6211;&#x5C31;&#x7ED9;&#x8FD9;&#x51E0;&#x4E2A;&#x7761;&#x6CD5;&#x8D77;&#x4E2A;&#x540D;&#x5B57;&#xFF1A;</p>
<ol>
<li>All in&#xFF1A;&#x4F60;&#x5982;&#x679C;&#x8D76;&#x65F6;&#x95F4;&#x53C8;&#x4E0D;&#x62C5;&#x5FC3;&#x6D88;&#x8017;&#x8FC7;&#x5EA6;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x4E00;&#x6B21;&#x6027;&#x90FD;&#x7761;&#x4E86;&#xFF1B;</li>
<li>One by one&#xFF1A;&#x4F60;&#x60F3;&#x7EC6;&#x6C34;&#x957F;&#x6D41;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x4E00;&#x4E2A;&#x4E00;&#x4E2A;&#x7761;&#xFF1B;</li>
<li>With concurrency&#xFF1A;&#x4F60;&#x5BB3;&#x7F9E;&#x5730;&#x4F4E;&#x4E0B;&#x5934;&#xFF0C;&#x8BF4;&#x4E00;&#x6B21;&#x80FD;&#x4E0D;&#x80FD;&#x7761;&#x4E24;&#x4E2A;&#x3002;</li>
</ol>
<blockquote>
<p>&#x4F5C;&#x4E3A;&#x4E00;&#x6BB5;&#x6709;&#x8282;&#x64CD;&#x7684;&#x4EE3;&#x7801;&#xFF0C;&#x80AF;&#x5B9A;&#x8981;&#x544A;&#x8BC9;&#x5176;&#x4ED6;&#x4EBA;&#x4F60;&#x7761;&#x5B8C;&#x4E86;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x5FC5;&#x987B;&#x6709;&#x5168;&#x90E8;&#x5B8C;&#x6210;&#x7684;&#x56DE;&#x8C03;&#xFF0C;&#x5426;&#x5219;&#x6211;&#x4EEC;&#x63A5;&#x4E0B;&#x6765;&#x7684;&#x4EA4;&#x6D41;&#x4F1A;&#x6BEB;&#x65E0;&#x610F;&#x4E49;&#x3002;</p>
</blockquote>
<p>&#x672C;&#x6587;&#x76EE;&#x7684;&#x662F;&#x548C;&#x5927;&#x5BB6;&#x63A2;&#x8BA8;&#x5982;&#x4F55;&#x5199;&#x51FA;&#x4F18;&#x96C5;&#x7684;&#x5F02;&#x6B65;&#x5FAA;&#x73AF;&#x4EE3;&#x7801;&#xFF0C;&#x5E76;&#x4E0D;&#x662F;&#x53BB;&#x5B9E;&#x73B0;&#x8FD9;&#x4E9B;&#x5FAA;&#x73AF;&#x63A7;&#x5236;&#x7684;&#x903B;&#x8F91;&#xFF1B;&#x800C;&#x4FDD;&#x6301;&#x4EE3;&#x7801;&#x4F18;&#x96C5;&#xFF0C;&#x4E2A;&#x4EBA;&#x4EE5;&#x4E3A;&#x6700;&#x597D;&#x7684;&#x529E;&#x6CD5;&#x662F;&#x4F7F;&#x7528;&#x8F83;&#x65B0;&#x7684;&#x8BED;&#x8A00;&#x7279;&#x6027;&#xFF0C;&#x5176;&#x6B21;&#x662F;&#x4F7F;&#x7528;&#x4F18;&#x79C0;&#x7684;&#x5F00;&#x6E90;&#x9879;&#x76EE;&#xFF0C;&#x6700;&#x540E;&#x624D;&#x662F;&#x81EA;&#x5DF1;&#x64B8;&#x3002;&#x4E0B;&#x9762;&#x4F1A;&#x4F7F;&#x7528; <a href="https://github.com/caolan/async?ref=iammapping.com">Async</a>&#x3001;<a href="https://github.com/petkaantonov/bluebird?ref=iammapping.com">Promise(bluebird)</a> &#x548C; ES7 &#x4E2D;&#x7684; <code>async/await</code> &#x5BF9;&#x6BD4;&#x4E0B;&#x5B9E;&#x73B0;&#x8FD9;&#x51E0;&#x79CD;&#x5FAA;&#x73AF;&#x7684;&#x533A;&#x522B;&#x3002;</p>
<h3 id="allin">All in</h3>
<p><img src="https://cdn.iammapping.com/2017/07/20/150050731490921033.png" alt="All in" loading="lazy"></p>
<p>&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x6548;&#x7387;&#x662F;&#x6700;&#x9AD8;&#x7684;&#xFF0C;&#x8017;&#x65F6;&#x53D6;&#x51B3;&#x4E8E;&#x5FAA;&#x73AF;&#x4E2D;&#x6700;&#x6162;&#x7684;&#x90A3;&#x4E2A;&#x5F02;&#x6B65;&#x65B9;&#x6CD5;&#x3002;&#x5BF9;&#x8D44;&#x6E90;&#x7684;&#x6D88;&#x8017;&#x4E5F;&#x662F;&#x6700;&#x5927;&#x7684;&#xFF0C;&#x5982;&#x679C;&#x5927;&#x91CF;&#x5FAA;&#x73AF;&#x8BF7;&#x6C42;&#x540E;&#x7AEF;&#x670D;&#x52A1;&#xFF0C;&#x5F88;&#x6709;&#x53EF;&#x80FD;&#x9020;&#x6210;&#x77AC;&#x65F6;&#x62E5;&#x5835;&#x7684;&#x60C5;&#x51B5;&#x3002;</p>
<p>&#x5982;&#x679C;&#x81EA;&#x5DF1;&#x5B9E;&#x73B0;&#xFF0C;&#x8FD9;&#x4E5F;&#x662F;&#x6700;&#x7B80;&#x5355;&#x7684;&#x573A;&#x666F;&#xFF0C;&#x52A0;&#x4E00;&#x4E2A;&#x5B8C;&#x6210;&#x8BA1;&#x6570;&#x5668;&#xFF0C;&#x6BCF;&#x4E2A;&#x5F02;&#x6B65;&#x65B9;&#x6CD5;&#x5B8C;&#x5C31;&#x7ED9;&#x8FD9;&#x4E2A;&#x5B8C;&#x6210;&#x8BA1;&#x6570;&#x5668;&#x52A0; 1&#xFF0C;&#x7136;&#x540E;&#x68C0;&#x67E5;&#x5B8C;&#x6210;&#x6570;&#x662F;&#x4E0D;&#x662F;&#x7B49;&#x4E8E;&#x6570;&#x7EC4;&#x957F;&#x5EA6;&#xFF0C;&#x4E00;&#x65E6;&#x76F8;&#x7B49;&#x5C31;&#x8868;&#x793A;&#x6240;&#x6709;&#x7684;&#x5F02;&#x6B65;&#x65B9;&#x6CD5;&#x6267;&#x884C;&#x5B8C;&#x6BD5;&#xFF0C;&#x901A;&#x77E5;&#x5168;&#x90E8;&#x5B8C;&#x6210;&#x7684;&#x56DE;&#x8C03;&#x3002;</p>
<p>&#x4F7F;&#x7528; async.each&#xFF1A;</p>
<pre><code class="language-javascript">import { each } from &apos;async&apos;;
import sleep from &apos;./sleep&apos;;

let times = [100, 150, 200, 250, 300];

console.log(&apos;sleep start&apos;);
console.time(&apos;async all in&apos;);
each(times, sleep, (err) =&gt; {
    console.timeEnd(&apos;async all in&apos;);
    console.log(&apos;sleep complete&apos;);
});
// sleep start
// async all in: 304.627ms
// sleep complete
</code></pre>
<p>&#x4F7F;&#x7528; Promise.all&#xFF1A;</p>
<pre><code class="language-javascript">import Promise from &apos;bluebird&apos;;
import sleep from &apos;./sleep&apos;;

let times = [100, 150, 200, 250, 300];

console.log(&apos;sleep start&apos;);
console.time(&apos;promise all in&apos;);
Promise.all(times.map(time =&gt; sleep(time))).then(() =&gt; {
    console.timeEnd(&apos;promise all in&apos;);
    console.log(&apos;sleep complete&apos;);
});
// sleep start
// promise all in: 305.509ms
// sleep complete
</code></pre>
<p>&#x4F7F;&#x7528;ES7 async/await&#xFF1A;</p>
<pre><code class="language-javascript">import sleep from &apos;./sleep&apos;;

let times = [100, 150, 200, 250, 300];

(async function() {
    console.log(&apos;sleep start&apos;);
    console.time(&apos;es7 all in&apos;);
    for await (let i of times.map(time =&gt; sleep(time))) {}
    console.timeEnd(&apos;es7 all in&apos;);
    console.log(&apos;sleep complete&apos;);
}());
// sleep start
// es7 all in: 305.986ms
// sleep complete
</code></pre>
<h3 id="onebyone">One by one</h3>
<p><img src="https://cdn.iammapping.com/2017/07/20/150050736064789652.png" alt="One by one" loading="lazy"></p>
<p>&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x6548;&#x7387;&#x6700;&#x4F4E;&#xFF0C;&#x6709;&#x70B9;&#x7C7B;&#x4F3C;&#x4E8E;&#x540C;&#x6B65;&#x8BED;&#x8A00;&#x4E2D;&#x7684;&#x5FAA;&#x73AF;&#xFF0C;&#x4E00;&#x4E2A;&#x63A5;&#x7740;&#x4E00;&#x4E2A;&#x6267;&#x884C;&#xFF0C;&#x8017;&#x65F6;&#x81EA;&#x7136;&#x4E5F;&#x5C31;&#x662F;&#x6240;&#x6709;&#x5F02;&#x6B65;&#x65B9;&#x6CD5;&#x8017;&#x65F6;&#x7684;&#x603B;&#x548C;&#x3002;&#x5BF9;&#x8D44;&#x6E90;&#x7684;&#x6D88;&#x8017;&#x6700;&#x5C0F;&#x3002;</p>
<p>&#x8FD9;&#x4E2A;&#x5B9E;&#x73B0;&#x8D77;&#x6765;&#x4E5F;&#x6BD4;&#x8F83;&#x7B80;&#x5355;&#xFF0C;&#x628A;&#x6570;&#x7EC4;&#x770B;&#x505A;&#x4E00;&#x4E2A;&#x961F;&#x5217;&#xFF0C;&#x6BCF;&#x6B21;&#x4ECE;&#x961F;&#x5217;<code>shift</code>&#x51FA;&#x4E00;&#x4E2A;&#x4EE3;&#x5165;&#x5F02;&#x6B65;&#x65B9;&#x6CD5;&#x6267;&#x884C;&#xFF0C;&#x6267;&#x884C;&#x5B8C;&#x6210;&#x5C31;&#x5F00;&#x59CB;&#x9012;&#x5F52;&#x8C03;&#x7528;&#x8FD9;&#x4E2A;&#x8FC7;&#x7A0B;&#xFF0C;&#x5F53;&#x961F;&#x5217;&#x957F;&#x5EA6;&#x4E3A;&#x7A7A;&#x5C31;&#x8868;&#x793A;&#x6240;&#x6709;&#x7684;&#x5F02;&#x6B65;&#x65B9;&#x6CD5;&#x6267;&#x884C;&#x5B8C;&#x6BD5;&#xFF0C;&#x7ED3;&#x675F;&#x9012;&#x5F52;&#xFF0C;&#x901A;&#x77E5;&#x5168;&#x90E8;&#x5B8C;&#x6210;&#x7684;&#x56DE;&#x8C03;&#x3002;</p>
<p>&#x4F7F;&#x7528; async.eachSeries&#xFF1A;</p>
<pre><code class="language-javascript">import { eachSeries } from &apos;async&apos;;
import sleep from &apos;./sleep&apos;;

let times = [100, 150, 200, 250, 300];

console.log(&apos;sleep start&apos;);
console.time(&apos;async one by one&apos;);
eachSeries(times, sleep, (err) =&gt; {
    console.timeEnd(&apos;async one by one&apos;);
    console.log(&apos;sleep complete&apos;);
});
// sleep start
// async one by one: 1020.078ms
// sleep complete
</code></pre>
<p>&#x4F7F;&#x7528; Promise.reduce&#xFF1A;</p>
<pre><code class="language-javascript">import Promise from &apos;bluebird&apos;;
import sleep from &apos;./sleep&apos;;

let times = [100, 150, 200, 250, 300];

console.log(&apos;sleep start&apos;);
console.time(&apos;promise one by one&apos;);
Promise.reduce(times, (last, curr) =&gt; {
    return sleep(curr);
}, 0).then(() =&gt; {
    console.timeEnd(&apos;promise one by one&apos;);
    console.log(&apos;sleep complete&apos;);
});
// sleep start
// promise one by one: 1023.014ms
// sleep complete
</code></pre>
<p>&#x4F7F;&#x7528;ES7 async/await&#xFF1A;</p>
<pre><code class="language-javascript">import sleep from &apos;./sleep&apos;;

let times = [100, 150, 200, 250, 300];

(async function() {
    console.log(&apos;sleep start&apos;);
    console.time(&apos;es7 one by one&apos;);
    for (let time of times) {
        await sleep(time);
    }
    console.timeEnd(&apos;es7 one by one&apos;);
    console.log(&apos;sleep complete&apos;);
}());
// sleep start
// es7 one by one: 1025.513ms
// sleep complete
</code></pre>
<h3 id="withconcurrency">With concurrency</h3>
<p>&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x7A0D;&#x5FAE;&#x590D;&#x6742;&#x4E9B;&#xFF0C;&#x4F46;&#x4E5F;&#x662F;&#x6700;&#x7075;&#x6D3B;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x53EF;&#x4EE5;&#x968F;&#x5FC3;&#x63A7;&#x5236;&#x5E76;&#x53D1;&#x6570;&#x3002;&#x6548;&#x7387;&#x548C;&#x8017;&#x65F6;&#x53D6;&#x51B3;&#x4E8E;&#x9B54;&#x6CD5;&#x6570;&#x5B57; <code>concurrency</code>&#xFF0C;&#x5F53; <code>concurrency</code> &#x5927;&#x4E8E;&#x6216;&#x7B49;&#x4E8E;&#x6570;&#x7EC4;&#x957F;&#x5EA6;&#x65F6;&#xFF0C;&#x5B83;&#x5C31;&#x7B49;&#x540C;&#x4E8E; <strong>All in</strong> &#x65B9;&#x5F0F;&#xFF1B;&#x5F53; <code>concurrency</code> &#x4E3A; 1 &#x65F6;&#xFF0C;&#x5B83;&#x5C31;&#x7B49;&#x540C;&#x4E8E; <strong>One by one</strong> &#x65B9;&#x5F0F;&#x3002;&#x6240;&#x4EE5;&#x8017;&#x65F6;&#x548C;&#x5BF9;&#x8D44;&#x6E90;&#x7684;&#x6D88;&#x8017;&#x90FD;&#x4F1A;&#x4ECB;&#x4E8E;&#x4EE5;&#x4E0A;&#x4E24;&#x79CD;&#x65B9;&#x5F0F;&#x4E4B;&#x95F4;&#x3002;</p>
<p><strong>With concurrency</strong> &#x672C;&#x8EAB;&#x5728;&#x5B9E;&#x73B0;&#x4E0A;&#x4E5F;&#x4F1A;&#x6709;&#x4E0D;&#x540C;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x5206;&#x522B;&#x662F;&#x9884;&#x5206;&#x7EC4;&#x548C;&#x4EFB;&#x52A1;&#x6C60;&#x3002;</p>
<h4 id>&#x9884;&#x5206;&#x7EC4;</h4>
<p><img src="https://cdn.iammapping.com/2017/07/20/150050738619135111.png" alt="Pre Group" loading="lazy"></p>
<p>&#x987E;&#x540D;&#x601D;&#x4E49;&#xFF0C;&#x5C31;&#x662F;&#x63D0;&#x524D;&#x5C06;&#x6570;&#x7EC4;&#x5185;&#x5BB9;&#x6309; <code>concurrency</code> &#x5206;&#x597D;&#x7EC4;&#xFF0C;&#x7EC4;&#x5185;&#x662F;&#x4EE5; <strong>All in</strong> &#x65B9;&#x5F0F;&#x6267;&#x884C;&#xFF0C;&#x7EC4;&#x4E4B;&#x95F4;&#x5219;&#x662F;&#x4EE5; <strong>One by one</strong> &#x7684;&#x65B9;&#x5F0F;&#x6267;&#x884C;&#x3002;</p>
<p>&#x5C31;&#x4EE5;&#x4E0A;&#x6587;&#x7684;&#x4F8B;&#x5B50;&#xFF0C;&#x5047;&#x5982; <code>concurrency</code> &#x4E3A; 2&#xFF0C;<code>times</code> &#x9884;&#x5148;&#x5206;&#x7EC4;&#x6210;&#xFF1A;<code>[[100, 150], [200, 250], [300]]</code>&#xFF0C;&#x8FD9;&#x6837;&#x8017;&#x65F6;&#x4F1A;&#x662F; 700&#xFF08;150 + 250 + 300&#xFF09;&#x3002;</p>
<p>&#x8FD9;&#x4E2A;&#x5B9E;&#x73B0;&#x65B9;&#x5F0F;&#x53EF;&#x4EE5;&#x6709;&#x6548;&#x5730;&#x63A7;&#x5236;&#x5E76;&#x53D1;&#x6570;&#xFF0C;&#x4F18;&#x70B9;&#x5C31;&#x662F;&#x7B80;&#x5355;&#xFF0C;&#x7F3A;&#x70B9;&#x662F;&#x5E76;&#x4E0D;&#x80FD;&#x8FBE;&#x5230;&#x6548;&#x7387;&#x6700;&#x5927;&#x5316;&#x3002;</p>
<h4 id>&#x4EFB;&#x52A1;&#x6C60;</h4>
<p><img src="https://cdn.iammapping.com/2017/07/20/150050743989579254.png" alt="Task Pool" loading="lazy"></p>
<p>&#x4EFB;&#x52A1;&#x6C60;&#x7684;&#x65B9;&#x5F0F;&#x5C31;&#x662F;&#x8BBE;&#x7F6E;&#x4E00;&#x4E2A;&#x5BB9;&#x91CF;&#x4E3A; <code>concurrency</code> &#x7684;&#x6C60;&#x5B50;&#xFF0C;&#x6BD4;&#x5982;&#x5BB9;&#x91CF;&#x4E3A; 2&#xFF0C;&#x521D;&#x59CB;&#x5316;&#x653E;&#x5165;&#x4E24;&#x4E2A;&#x4EFB;&#x52A1;&#xFF0C;&#x6BCF;&#x5F53;&#x6709;&#x4EFB;&#x52A1;&#x5B8C;&#x6210;&#xFF0C;&#x5C31;&#x7EE7;&#x7EED;&#x5F80;&#x6C60;&#x5B50;&#x6DFB;&#x52A0;&#x65B0;&#x7684;&#x4EFB;&#x52A1;&#xFF0C;&#x76F4;&#x5230;&#x6240;&#x6709;&#x4EFB;&#x52A1;&#x90FD;&#x5B8C;&#x6210;&#x3002;&#x4E0A;&#x6587;&#x7684;&#x4F8B;&#x5B50;&#x6267;&#x884C;&#x8FC7;&#x7A0B;&#x5927;&#x81F4;&#x5982;&#x4E0B;&#xFF1A;</p>
<ol>
<li><code>time = 0; pool = [100, 150]</code>&#xFF1A;&#x653E;&#x5165; <code>100</code> &#x548C; <code>150</code></li>
<li><code>time = 100; pool = [150, 200]</code>&#xFF1A;<code>100</code> &#x7ED3;&#x675F;&#xFF0C;&#x653E;&#x5165; <code>200</code></li>
<li><code>time = 150; pool = [200, 250]</code>&#xFF1A;<code>150</code> &#x7ED3;&#x675F;&#xFF0C;&#x653E;&#x5165; <code>250</code></li>
<li><code>time = 300; pool = [250, 300]</code>&#xFF1A;<code>200</code> &#x7ED3;&#x675F;&#xFF0C;&#x653E;&#x5165; <code>300</code></li>
<li><code>time = 400; pool = [300]</code>&#xFF1A;<code>250</code> &#x7ED3;&#x675F;&#xFF0C;&#x6CA1;&#x6709;&#x66F4;&#x591A;&#x4EFB;&#x52A1;</li>
<li><code>time = 600; pool = []</code>&#xFF1A;<code>300</code> &#x7ED3;&#x675F;&#xFF0C;&#x5FAA;&#x73AF;&#x5B8C;&#x6BD5;</li>
</ol>
<p>&#x5F97;&#x51FA;&#x6765;&#x7684;&#x8017;&#x65F6;&#x662F; 600&#xFF0C;&#x6BD4;&#x9884;&#x5206;&#x7EC4;&#x7684;&#x65B9;&#x5F0F;&#x6548;&#x7387;&#x66F4;&#x9AD8;&#xFF0C;&#x800C;&#x4E14;&#x540C;&#x6837;&#x80FD;&#x6709;&#x6548;&#x63A7;&#x5236;&#x5E76;&#x53D1;&#x4E2A;&#x6570;&#x3002;async &#x548C; bluebird &#x4E5F;&#x6709;&#x76F8;&#x5173;&#x7684;&#x65B9;&#x6CD5;&#x4F9B;&#x76F4;&#x63A5;&#x4F7F;&#x7528;&#x3002;</p>
<p>&#x4F7F;&#x7528; async.eachLimit&#xFF1A;</p>
<pre><code class="language-javascript">import { eachLimit } from &apos;async&apos;;
import sleep from &apos;./sleep&apos;;

let times = [100, 150, 200, 250, 300];

console.log(&apos;sleep start&apos;);
console.time(&apos;async with concurrency&apos;);
eachLimit(times, 2, sleep, (err) =&gt; {
    console.timeEnd(&apos;async with concurrency&apos;);
    console.log(&apos;sleep complete&apos;);
});
// sleep start
// async with concurrency: 611.498ms
// sleep complete
</code></pre>
<p>&#x4F7F;&#x7528; Promise.map&#xFF08;bluebird &#x7279;&#x6709; api&#xFF09;&#xFF1A;</p>
<pre><code class="language-javascript">import Promise from &apos;bluebird&apos;;
import sleep from &apos;./sleep&apos;;

let times = [100, 150, 200, 250, 300];

console.log(&apos;sleep start&apos;);
console.time(&apos;promise one by one&apos;);
Promise.map(times, (time) =&gt; {
    return sleep(time);
}, {
    concurrency: 2
}).then(() =&gt; {
    console.timeEnd(&apos;promise one by one&apos;);
    console.log(&apos;sleep complete&apos;);
});
// sleep start
// promise with concurrency: 616.601ms
// sleep complete
</code></pre>
<p>&#x4F7F;&#x7528;ES7 async/await&#xFF1A;</p>
<blockquote>
<p><code>pool</code> &#x65B9;&#x6CD5;&#x6765;&#x81EA;<a href="https://github.com/davetemplin/async-parallel/blob/master/index.ts?ref=iammapping.com#L153">davetemplin/async-parallel</a></p>
</blockquote>
<pre><code class="language-javascript">import sleep from &apos;./sleep&apos;;

let times = [100, 150, 200, 250, 300];

(async function() {
    console.log(&apos;sleep start&apos;);
    console.time(&apos;es7 with concurrency&apos;);
    await pool(2, async () =&gt; {
        await sleep(times.shift());
        return times.length &gt; 0;
    });
    console.timeEnd(&apos;es7 with concurrency&apos;);
    console.log(&apos;sleep complete&apos;);
}());

async function pool(size, task) {
    var active = 0;
    var done = false;
    var errors = [];
    return new Promise((resolve, reject) =&gt; {
        next();
        function next() {
            while (active &lt; size &amp;&amp; !done) {
                active += 1;
                task()
                    .then(more =&gt; {
                        if (--active === 0 &amp;&amp; (done || !more))
                            errors.length === 0 ? resolve() : reject(errors);
                        else if (more)
                            next();
                        else
                            done = true;
                    })
                    .catch(err =&gt; {
                        errors.push(err);
                        done = true;
                        if (--active === 0)
                            reject(errors);
                    });
            }
        }
    });
}
// sleep start
// es7 with concurrency: 612.197ms
// sleep complete
</code></pre>
<h2 id>&#x603B;&#x7ED3;</h2>
<p>&#x597D;&#x4E86;&#xFF0C;&#x5230;&#x8FD9;&#x5E94;&#x8BE5;&#x53EF;&#x4EE5;&#x7ED9;&#x8FD9;&#x4E09;&#x79CD;&#x5FAA;&#x73AF;&#x65B9;&#x5F0F;&#x6253;&#x4E0B;&#x5206;&#x4E86;&#xFF1A;</p>
<table>
  <tr>
    <th>&#x5FAA;&#x73AF;&#x65B9;&#x5F0F;</th>
    <td>&#x6548;&#x7387;</td>
    <td>&#x6D88;&#x8017;</td>
    <td>&#x7075;&#x6D3B;&#x5EA6;</td>
    <td>&#x590D;&#x6742;&#x5EA6;</td>
  </tr>
  <tr>
    <th>All in</th>
    <td>&#x9AD8;</td>
    <td>&#x9AD8;</td>
    <td>&#x4F4E;</td>
    <td>&#x4F4E;</td>
  </tr>
  <tr>
    <th>One by one</th>
    <td>&#x4F4E;</td>
    <td>&#x4F4E;</td>
    <td>&#x4F4E;</td>
    <td>&#x4F4E;</td>
  </tr>
  <tr>
    <th>With concurrency</th>
    <td>&#x4E2D;</td>
    <td>&#x4E2D;</td>
    <td>&#x9AD8;</td>
    <td>&#x9AD8;</td>
  </tr>
</table>
<p>&#x4E4D;&#x4E00;&#x770B; <strong>With concurrency</strong> &#x662F;&#x5B8C;&#x80DC;&#xFF0C;&#x5176;&#x5B9E;&#x5E76;&#x6CA1;&#x6709;&#x3002;<strong>All in</strong> &#x548C; <strong>One by one</strong> &#x867D;&#x7136;&#x7075;&#x6D3B;&#x5EA6;&#x4F4E;&#xFF0C;&#x4F46;&#x662F;&#x5E94;&#x7528;&#x7684;&#x573A;&#x666F;&#x8FD8;&#x662F;&#x975E;&#x5E38;&#x5E7F;&#x6CDB;&#x7684;&#x3002;&#x8981;&#x6C42;&#x6548;&#x7387;&#x4F18;&#x5148;&#x5C31;&#x4F7F;&#x7528; <strong>All in</strong>&#xFF1B;&#x5982;&#x679C;&#x6709;&#x4E0B;&#x4E00;&#x6B21;&#x5FAA;&#x73AF;&#x4F9D;&#x8D56;&#x4E0A;&#x4E00;&#x6B21;&#x5FAA;&#x73AF;&#x7ED3;&#x679C;&#x7684;&#x573A;&#x666F;&#xFF0C;&#x5C31;&#x5FC5;&#x987B;&#x4F7F;&#x7528; <strong>One by One</strong>&#x3002;</p>
<p>&#x518D;&#x8BF4;&#x4E0B;&#x4E0A;&#x9762; async&#x3001;bluebird&#x3001;ES7 &#x5BF9;&#x8FD9;&#x4E09;&#x79CD;&#x5FAA;&#x73AF;&#x65B9;&#x5F0F;&#x7684;&#x5B9E;&#x73B0;&#x3002;&#x9700;&#x6C42;&#x4E00;&#x76F4;&#x5728;&#x53D8;&#xFF0C;async &#x9700;&#x8981;&#x4FEE;&#x6539;&#x7684;&#x4EE3;&#x7801;&#x975E;&#x5E38;&#x5C11;&#xFF0C;&#x751A;&#x81F3;&#x53EA;&#x8981;&#x6539;&#x4E0B;&#x65B9;&#x6CD5;&#x540D;&#x5C31;&#x53EF;&#x4EE5;&#xFF0C;&#x65B9;&#x6CD5;&#x5B9A;&#x4E49;&#x7B80;&#x5355;&#x4F18;&#x96C5;&#xFF0C;&#x8FD9;&#x53EF;&#x80FD;&#x4E5F;&#x662F; async &#x6613;&#x4E0A;&#x624B;&#x7684;&#x539F;&#x56E0;&#xFF1B;bluebird &#x5728; <code>Promise</code> &#x6807;&#x51C6;&#x57FA;&#x7840;&#x4E0A;&#x6DFB;&#x52A0;&#x7684;&#x65B9;&#x6CD5;&#x975E;&#x5E38;&#x5B9E;&#x7528;&#xFF0C;&#x5982;&#xFF1A;map&#x3001;join...&#xFF0C;&#x4EE5;&#x81F3;&#x4E8E;&#x6211;&#x51E0;&#x4E4E;&#x662F;&#x6CA1;&#x6709;&#x4F7F;&#x7528;&#x8FC7;&#x539F;&#x751F; <code>Promise</code> &#x1F602;&#xFF1B;ES7 &#x65B0;&#x589E;&#x7684; <code>async/await</code> &#x8BED;&#x6CD5;&#x7279;&#x6027;&#x786E;&#x5B9E;&#x51CF;&#x8F7B;&#x4E86;&#x7F16;&#x5199;&#x5F02;&#x6B65;&#x4EE3;&#x7801;&#x7684;&#x75DB;&#x82E6;&#xFF0C;&#x540C;&#x65F6;&#x8FD8;&#x589E;&#x5F3A;&#x4E86;&#x4EE3;&#x7801;&#x7684;&#x53EF;&#x8BFB;&#x6027;&#x3002;</p>
<p>So&#xFF0C;&#x4F60;&#x89C9;&#x5F97;&#x54EA;&#x79CD;&#x5199;&#x6CD5;&#x66F4;&#x4F18;&#x96C5;&#x5462;&#xFF1F;</p>
<small style="color:#B3B3B3">
&#x6CE8;&#xFF1A;&#x672C;&#x6587;&#x7ED3;&#x679C;&#x6570;&#x636E;&#x6709;&#x6240;&#x5DEE;&#x5F02;&#xFF0C;&#x4E3A;&#x6D4B;&#x8BD5;&#x968F;&#x673A;&#x4EA7;&#x751F;&#xFF0C;&#x4E0D;&#x4EE3;&#x8868;&#x5404; lib &#x6027;&#x80FD;&#x5DEE;&#x5F02;&#x3002;<br>
&#x9898;&#x56FE;&#x5F15;&#x81EA;&#xFF1A;[http://forwardjs.com/img/workshops/advancedjs-async.jpg](http://forwardjs.com/img/workshops/advancedjs-async.jpg)</small>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[为什么要使用 99+，记一次 sql 优化]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x4E00;&#x822C;&#x5728;&#x8BBE;&#x8BA1;&#x901A;&#x77E5;&#x4E2D;&#x5FC3;&#x65F6;&#xFF0C;&#x90FD;&#x4F1A;&#x5728;&#x5165;&#x53E3;&#x5904;&#x663E;&#x793A;&#x4E00;&#x4E2A;&#x672A;&#x8BFB;&#x6D88;&#x606F;&#x6570;&#xFF0C;&#x8FD9;&#x6837;&#x4E0D;&#x4EC5;&#x53EF;&#x4EE5;&#x9192;&#x76EE;&#x5730;&#x544A;&#x77E5;&#x7528;&#x6237;&#x6709;&#x672A;&#x8BFB;&#x6D88;&#x606F;&#xFF0C;&#x8FD8;&#x80FD;&#x8BA9;&#x7528;</p>]]></description><link>https://iammapping.com/why-use-99plus/</link><guid isPermaLink="false">6522cda9caa77d0fabe3ef43</guid><category><![CDATA[Mysql]]></category><category><![CDATA[Performance]]></category><dc:creator><![CDATA[Iam Mapping]]></dc:creator><pubDate>Mon, 13 Feb 2017 06:26:03 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x4E00;&#x822C;&#x5728;&#x8BBE;&#x8BA1;&#x901A;&#x77E5;&#x4E2D;&#x5FC3;&#x65F6;&#xFF0C;&#x90FD;&#x4F1A;&#x5728;&#x5165;&#x53E3;&#x5904;&#x663E;&#x793A;&#x4E00;&#x4E2A;&#x672A;&#x8BFB;&#x6D88;&#x606F;&#x6570;&#xFF0C;&#x8FD9;&#x6837;&#x4E0D;&#x4EC5;&#x53EF;&#x4EE5;&#x9192;&#x76EE;&#x5730;&#x544A;&#x77E5;&#x7528;&#x6237;&#x6709;&#x672A;&#x8BFB;&#x6D88;&#x606F;&#xFF0C;&#x8FD8;&#x80FD;&#x8BA9;&#x7528;&#x6237;&#x66F4;&#x5BB9;&#x6613;&#x4ECE;&#x4F17;&#x591A;&#x5C0F;&#x56FE;&#x6807;&#x4E2D;&#x533A;&#x5206;&#x51FA;&#x901A;&#x77E5;&#x4E2D;&#x5FC3;&#x7684;&#x5165;&#x53E3;&#x3002;&#x6BD4;&#x5982; ucloud &#x63A7;&#x5236;&#x53F0;&#x7684;&#x9876;&#x680F;&#xFF1A;</p>
<p><img src="https://cdn.iammapping.com/2017/02/13/148696624810909667.png" alt loading="lazy"></p>
<p>&#x6211;&#x4EEC;&#x7F51;&#x7AD9;&#x7684;&#x901A;&#x77E5;&#x4E2D;&#x5FC3;&#x4E5F;&#x4E00;&#x6837;&#xFF0C;&#x5728;&#x5165;&#x53E3;&#x540C;&#x6837;&#x52A0;&#x4E0A;&#x4E86;&#x672A;&#x8BFB;&#x6D88;&#x606F;&#x6570;&#x7684;&#x663E;&#x793A;&#x3002;</p>
<p><img src="https://cdn.iammapping.com/2017/02/13/148696611525856103.png" alt loading="lazy"></p>
<p>&#x4E0A;&#x7EBF;&#x540E;&#x5E73;&#x7A33;&#x8FD0;&#x884C;&#xFF0C;&#x4EE5;&#x4E3A;&#x53EF;&#x4EE5;&#x5C31;&#x8FD9;&#x6837;&#x4E00;&#x76F4;&#x7F8E;&#x4E0B;&#x53BB;&#x3002;&#x7A0B;&#x5E8F;&#x53EA;&#x8981;&#x6709;&#x4EBA;&#x7528;&#xFF0C;&#x603B;&#x4F1A;&#x6709;&#x51FA; bug &#x7684;&#x90A3;&#x4E00;&#x5929;&#xFF0C;&#x6700;&#x8FD1;&#x9AD8;&#x5CF0;&#x671F;&#x7ECF;&#x5E38;&#x4F1A;&#x51FA;&#x73B0;&#x6765;&#x81EA;&#x901A;&#x77E5;&#x8868;&#x7684;&#x6162;&#x67E5;&#x8BE2;&#x8BED;&#x53E5;&#xFF0C;&#x4ED4;&#x7EC6;&#x4E00;&#x67E5;&#xFF0C;&#x539F;&#x6765;&#x5C31;&#x662F;&#x7EDF;&#x8BA1;&#x672A;&#x8BFB;&#x6D88;&#x606F;&#x6570;&#x7684;&#x8BED;&#x53E5;&#xFF0C;&#x800C;&#x4E14;&#x90FD;&#x662F;&#x6765;&#x81EA;&#x51E0;&#x4E2A;&#x5927;&#x7528;&#x6237;&#x3002;&#x6211;&#x4EEC;&#x901A;&#x77E5;&#x91CC;&#x5206;&#x4E86;&#x591A;&#x4E2A;&#x7EC4;&#xFF0C;&#x6BCF;&#x4E2A;&#x7EC4;&#x90FD;&#x6709;&#x81EA;&#x5DF1;&#x7684;&#x4E00;&#x4E2A;&#x672A;&#x8BFB;&#x6570;&#xFF0C;sql &#x8BED;&#x53E5;&#x5DEE;&#x4E0D;&#x591A;&#x662F;&#x4E0B;&#x9762;&#x8FD9;&#x6837;&#xFF1A;</p>
<pre><code class="language-sql">SELECT groupID, count(0) unreadCount FROM notification WHERE userID=xxx AND hasRead=0 GROUP BY groupID;
</code></pre>
<blockquote>
<p><em>notification</em> &#x8868;&#x4E2D;&#x5DF2;&#x5EFA;&#x7ACB;&#x672A;&#x8BFB;&#x7D22;&#x5F15; unreads&#xFF1A; <em>userID</em> + <em>hasRead</em> + <em>groupID</em> &#x7684;&#x7EC4;&#x5408;&#x952E;&#x3002;</p>
</blockquote>
<p>&#x7531;&#x4E8E;&#x6211;&#x4EEC;&#x7F51;&#x7AD9;&#x5927;&#x591A;&#x662F;&#x6279;&#x91CF;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;&#xFF0C;&#x5373;&#x4F7F;&#x505A;&#x4E86;&#x6D88;&#x606F;&#x5408;&#x5E76;&#xFF0C;&#x4E00;&#x5929;&#x4EA7;&#x751F;&#x51E0;&#x5341;&#x4E0A;&#x767E;&#x6761;&#x901A;&#x77E5;&#x4E5F;&#x5F88;&#x6B63;&#x5E38;&#xFF0C;&#x800C;&#x4E14;&#x6709;&#x7684;&#x7528;&#x6237;&#x5C31;&#x662F;&#x4E0D;&#x559C;&#x6B22;&#x6807;&#x8BB0;&#x901A;&#x77E5;&#x4E3A;&#x5DF2;&#x8BFB;&#xFF0C;&#x8FD9;&#x6837;&#x65E5;&#x79EF;&#x6708;&#x7D2F;&#xFF0C;&#x6709;&#x7684;&#x7528;&#x6237;&#x672A;&#x8BFB;&#x6570;&#x5DF2;&#x7ECF;&#x4E0A;&#x5341;&#x4E07;&#x4E86;&#x3002;&#x5047;&#x8BBE;&#x603B;&#x8BB0;&#x5F55;&#x884C;&#x6709; 20 &#x4E07;&#xFF0C;&#x5982;&#x679C;&#x672A;&#x8BFB;&#x6570;&#x4E3A; 50&#xFF0C;&#x5EFA;&#x7ACB;&#x4E00;&#x4E2A;&#x672A;&#x8BFB;&#x7684;&#x7D22;&#x5F15;&#xFF0C;&#x6548;&#x7387;&#x4F1A;&#x975E;&#x5E38;&#x663E;&#x8457;&#xFF1B;&#x4F46;&#x662F;&#x672A;&#x8BFB;&#x6570;&#x4E3A; 15 &#x4E07;&#xFF0C;&#x8FD9;&#x65F6;&#x7D22;&#x5F15;&#x7684;&#x610F;&#x4E49;&#x4E5F;&#x4E0D;&#x5927;&#x4E86;&#x3002;&#x6240;&#x4EE5;&#x8FD9;&#x4E2A;&#x6027;&#x80FD;&#x95EE;&#x9898;&#x76F4;&#x5230;&#x73B0;&#x5728;&#x624D;&#x66B4;&#x9732;&#x51FA;&#x6765;&#x3002;</p>
<p><strong>&#x5F53;&#x672A;&#x8BFB;&#x6570;&#x6BD4;&#x8F83;&#x5C0F;&#x65F6;&#xFF1A;</strong><br>
&#x7ED3;&#x679C;&#x96C6;&#xFF1A;</p>
<pre><code>groupID | unreadCount
0 | 23
4 | 16
</code></pre>
<p>Explain&#xFF1A;</p>
<pre><code>id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
1 | SIMPLE | notification | ref | unreads | unreads | 5 | const,const | 39 | Using where; Using index
</code></pre>
<p>&#x8017;&#x65F6;&#xFF1A;0.4ms&#xFF08;&#x6D4B;&#x8BD5;&#x6570;&#x636E;&#xFF09;</p>
<p><strong>&#x5F53;&#x672A;&#x8BFB;&#x6570;&#x6BD4;&#x8F83;&#x5927;&#x65F6;&#xFF1A;</strong><br>
&#x7ED3;&#x679C;&#x96C6;&#xFF1A;</p>
<pre><code>groupID | unreadCount
0 | 23
1 | 103234
3 | 3032
4 | 16
</code></pre>
<p>Explain&#xFF1A;</p>
<pre><code>id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
1 | SIMPLE | notification | ref | unreads | unreads | 4 | const | 69886 | Using where; Using index
</code></pre>
<p>&#x8017;&#x65F6;&#xFF1A;38.9ms&#xFF08;&#x6D4B;&#x8BD5;&#x6570;&#x636E;&#xFF09;</p>
<p>&#x7531;&#x4E0A;&#x53EF;&#x4EE5;&#x770B;&#x51FA;&#xFF0C;&#x672A;&#x8BFB;&#x7684;&#x8BB0;&#x5F55;&#x884C;&#x6570;&#x76F4;&#x63A5;&#x5F71;&#x54CD;&#x8BE5;&#x8BED;&#x53E5;&#x7684;&#x6027;&#x80FD;&#x3002;</p>
<p>&#x95EE;&#x9898;&#x51FA;&#x73B0;&#x603B;&#x5F52;&#x8981;&#x89E3;&#x51B3;&#x7684;&#xFF0C;&#x5982;&#x4F55;&#x89E3;&#x51B3;&#x5462;&#xFF1F;&#x6700;&#x76F4;&#x63A5;&#x7684;&#x529E;&#x6CD5;&#x5C31;&#x662F;&#x770B;&#x770B;&#x5176;&#x4ED6;&#x4EA7;&#x54C1;&#x662F;&#x600E;&#x4E48;&#x505A;&#x7684;&#x3002;LG &#x540C;&#x5B66;&#x63D0;&#x51FA;&#xFF0C;&#x53EF;&#x4EE5;&#x4F18;&#x5316;&#x6210;&#x50CF; QQ &#x672A;&#x8BFB;&#x6D88;&#x606F;&#x6570;&#x90A3;&#x6837;&#x663E;&#x793A; 99+ &#x5440;&#x3002;QQ &#x4E0A;&#x6709;&#x51E0;&#x4E2A;&#x7FA4;&#xFF0C;&#x6BCF;&#x5929;&#x90FD;&#x6709;&#x4EBA;&#x5728;&#x91CC;&#x9762;&#x5439;&#x6C34;&#x6597;&#x8868;&#x60C5;&#xFF0C;&#x6D88;&#x606F;&#x4E00;&#x4F1A;&#x4E0D;&#x770B;&#x5C31; 99+ &#x4E86;&#x3002;&#x5F53;&#x521D;&#x4EE5;&#x4E3A;&#x8FD9;&#x6837;&#x53EA;&#x662F;&#x4E3A;&#x4E86;&#x6392;&#x7248;&#x7F8E;&#x89C2;&#xFF0C;&#x6216;&#x8005;&#x907F;&#x514D;&#x7279;&#x522B;&#x5927;&#x7684;&#x6570;&#x5B57;&#x7ED9;&#x7528;&#x6237;&#x9020;&#x6210;&#x5F88;&#x5927;&#x7684;&#x5FC3;&#x7406;&#x8D1F;&#x62C5;&#xFF0C;&#x518D;&#x8005;&#x4E5F;&#x4E0D;&#x4F1A;&#x6709;&#x4EBA;&#x5173;&#x5FC3;&#x672A;&#x8BFB;&#x7684;&#x6D88;&#x606F;&#x662F; 101 &#x8FD8;&#x662F; 102&#xFF0C;&#x6240;&#x4EE5;&#x7D22;&#x6027;&#x663E;&#x793A; 99+&#x3002;&#x5373;&#x544A;&#x8BC9;&#x7528;&#x6237;&#x6709;&#x5F88;&#x591A;&#x672A;&#x8BFB;&#x6D88;&#x606F;&#xFF0C;&#x53C8;&#x4E0D;&#x4F1A;&#x56E0;&#x663E;&#x793A;&#x4E00;&#x4E2A;&#x7279;&#x522B;&#x5927;&#x7684;&#x6570;&#x5B57;&#x5413;&#x5230;&#x7528;&#x6237;&#xFF0C;&#x8FD9;&#x6837;&#x4E00;&#x4E3E;&#x4E24;&#x5F97;&#x3002;&#x4F46;&#x8FD9;&#x6837;&#x4F3C;&#x4E4E;&#x53EA;&#x662F;&#x5BF9;&#x7528;&#x6237;&#x66F4;&#x53CB;&#x597D;&#xFF0C;&#x5BF9;&#x6027;&#x80FD;&#x7136;&#x5E76;&#x5375;&#x3002;&#x8FD9;&#x65F6;&#x4ED6;&#x518D;&#x6B21;&#x63D0;&#x51FA;&#x53EF;&#x4EE5;&#x628A; sql &#x8BED;&#x53E5;&#x62C6;&#x5F00;&#x6765;&#x5199;&#xFF0C;&#x4E00;&#x5F00;&#x59CB;&#x6211;&#x662F;&#x62D2;&#x7EDD;&#x7684;&#xFF0C;&#x6309;&#x7167;&#x8FC7;&#x5F80;&#x7ECF;&#x9A8C;&#xFF0C;&#x591A;&#x6761;&#x8BED;&#x53E5;&#x67E5;&#x51FA;&#x7ED3;&#x679C;&#x5408;&#x5E76;&#x80AF;&#x5B9A;&#x6CA1;&#x6709;&#x5355;&#x6761;&#x8BED;&#x53E5; <code>GROUP BY</code> &#x6765;&#x7684;&#x5FEB;&#x3002;&#x6709;&#x65F6;&#x7ECF;&#x9A8C;&#x4E5F;&#x4F1A;&#x5BB3;&#x6B7B;&#x4EBA;&#xFF0C;&#x4E8E;&#x662F; LG &#x7ED9;&#x51FA;&#x4E86;&#x4E0B;&#x9762;&#x7684;&#x8BED;&#x53E5;&#xFF1A;</p>
<pre><code class="language-sql">SELECT 0 AS groupID, count(1) AS unreadCount FROM (SELECT 1 FROM notification WHERE userID=xxx AND hasRead=&apos;0&apos; AND groupID = 0 LIMIT 100) AS a
UNION 
SELECT 1 AS groupID, count(1) AS unreadCount FROM (SELECT 1 FROM notification WHERE userID=xxx AND hasRead=&apos;0&apos; AND groupID = 1 LIMIT 100) AS a
UNION 
SELECT 2 AS groupID, count(1) AS unreadCount FROM (SELECT 1 FROM notification WHERE userID=xxx AND hasRead=&apos;0&apos; AND groupID = 2 LIMIT 100) AS a
UNION 
SELECT 3 AS groupID, count(1) AS unreadCount FROM (SELECT 1 FROM notification WHERE userID=xxx AND hasRead=&apos;0&apos; AND groupID = 3 LIMIT 100) AS a
UNION 
SELECT 4 AS groupID, count(1) AS unreadCount FROM (SELECT 1 FROM notification WHERE userID=xxx AND hasRead=&apos;0&apos; AND groupID = 4 LIMIT 100) AS a
</code></pre>
<p>&#x8FD9;&#x6761;&#x8BED;&#x53E5;&#x7CBE;&#x5999;&#x5C31;&#x7CBE;&#x5999;&#x5728; <code>LIMIT 100</code>&#xFF0C;&#x4F7F;&#x7528;&#x672A;&#x8BFB;&#x7D22;&#x5F15;&#x5E76;&#x628A;&#x7ED3;&#x679C;&#x96C6;&#x9650;&#x5B9A;&#x5728; 100 &#x884C;&#x4EE5;&#x5185;&#xFF0C;&#x8FD9;&#x4E2A;&#x901F;&#x5EA6;&#x662F;&#x975E;&#x5E38;&#x5FEB;&#x7684;&#x3002;</p>
<p><strong>&#x4F18;&#x5316;&#x540E;&#x7684;&#x65F6;&#x95F4;&#xFF1A;</strong><br>
&#x7ED3;&#x679C;&#x96C6;&#xFF1A;</p>
<pre><code>groupID | unreadCount
0 | 23
1 | 100
2 | 0
3 | 100
4 | 16
</code></pre>
<p>Explain&#xFF1A;</p>
<pre><code>id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
1 | PRIMARY | &lt;derived2&gt; | ALL | NULL | NULL | NULL | NULL | 23 | NULL
2 | DERIVED | notification | ref | unreads | unreads | 6 | const,const,const | 23 | Using index
3 | UNION | &lt;derived4&gt; | ALL | NULL | NULL | NULL | NULL | 100 | NULL
4 | DERIVED | notification | ref | unreads | unreads | 6 | const,const,const | 73020 | Using index
5 | UNION | &lt;derived6&gt; | ALL | NULL | NULL | NULL | NULL | 2 | NULL
6 | DERIVED | notification | ref | unreads | unreads | 6 | const,const,const | 1 | Using index
7 | UNION | &lt;derived8&gt; | ALL | NULL | NULL | NULL | NULL | 100 | NULL
8 | DERIVED | notification | ref | unreads | unreads | 6 | const,const,const | 3208 | Using index
9 | UNION | &lt;derived10&gt; | ALL | NULL | NULL | NULL | NULL | 16 | NULL
10 | DERIVED | notification | ref | unreads | unreads | 6 | const,const,const | 16 | Using index
NULL | UNION RESULT | &lt;union1,3,5,7,9&gt; | ALL | NULL | NULL | NULL | NULL | NULL | Using temporary
</code></pre>
<p>&#x8017;&#x65F6;&#xFF1A;0.7ms&#xFF08;&#x6D4B;&#x8BD5;&#x6570;&#x636E;&#xFF09;</p>
<p>&#x6027;&#x80FD;&#x63D0;&#x5347;&#x4E86;&#x51E0;&#x5341;&#x500D;&#xFF0C;&#x5835;&#x5728;&#x80F8;&#x53E3;&#x7684;&#x8FD9;&#x5768;&#x7FD4;&#x7EC8;&#x4E8E;&#x901A;&#x4E86;&#x3002;&#x8FD9;&#x6761;&#x8BED;&#x53E5;&#x7684;&#x6027;&#x80FD;&#x4F1A;&#x56E0;&#x5206;&#x7EC4;&#x7684;&#x6570;&#x91CF;&#x6240;&#x5F71;&#x54CD;&#xFF0C;&#x4F46;&#x5206;&#x7EC4;&#x7684;&#x6570;&#x91CF;&#x662F;&#x6709;&#x9650;&#x800C;&#x4E14;&#x6BD4;&#x8F83;&#x56FA;&#x5B9A;&#x7684;&#xFF0C;&#x6240;&#x4EE5;&#x8FD9;&#x4E2A;&#x5A01;&#x80C1;&#x4E0D;&#x6210;&#x7ACB;&#x3002;</p>
<p>&#x5176;&#x5B9E;&#x5230;&#x8FD9;&#x8FD8;&#x6CA1;&#x7ED3;&#x675F;&#xFF0C;&#x8FD8;&#x8981;&#x7ED3;&#x5408;&#x524D;&#x53F0;&#xFF0C;&#x5F53; <em>unreadCount</em> &#x5927;&#x4E8E; 99 &#x65F6;&#xFF0C;&#x5C31;&#x8981;&#x663E;&#x793A; 99+&#xFF0C;&#x4F18;&#x5316;&#x540E;&#x6211;&#x4EEC;&#x7684;&#x901A;&#x77E5;&#x4E2D;&#x5FC3;&#x672A;&#x8BFB;&#x63D0;&#x9192;&#x6210;&#x4E86;&#x8FD9;&#x6837;&#xFF1A;</p>
<p><img src="https://cdn.iammapping.com/2017/02/13/148696593144193504.png" alt loading="lazy"></p>
<h3 id>&#x603B;&#x7ED3;</h3>
<p>&#x4F18;&#x5316;&#x4E0D;&#x80FD;&#x5355;&#x9760;&#x6280;&#x672F;&#x624B;&#x6BB5;&#xFF0C;&#x6709;&#x65F6;&#x4EA7;&#x54C1;&#x4E0A;&#x505A;&#x4E0B;&#x6298;&#x4E2D;&#xFF0C;&#x4F18;&#x5316;&#x7684;&#x65B9;&#x6CD5;&#x4F1A;&#x7B80;&#x5355;&#x5F88;&#x591A;&#x3002;&#x5982;&#x679C;&#x8FD9;&#x6B21;&#x4EC5;&#x51ED;&#x6280;&#x672F;&#x624B;&#x6BB5;&#x6765;&#x4F18;&#x5316;&#xFF0C;&#x53EF;&#x80FD;&#x8981;&#x5F15;&#x5165;&#x7F13;&#x5B58;&#xFF0C;&#x6216;&#x8005;&#x5197;&#x4F59;&#x4E00;&#x4E2A;&#x672A;&#x8BFB;&#x6570;&#xFF0C;&#x6BCF;&#x6B21;&#x66F4;&#x65B0;&#x7EF4;&#x62A4;&#x8FD9;&#x4E2A;&#x6570;&#x5B57;&#xFF0C;&#x8FD9;&#x53EF;&#x80FD;&#x9700;&#x8981; 2 ~ 3 &#x5929;&#x7684;&#x5DE5;&#x4F5C;&#x91CF;&#xFF0C;&#x800C;&#x4E14;&#x8FD8;&#x5BB9;&#x6613;&#x51FA; bug&#xFF1B;&#x800C;&#x4F7F;&#x7528; 99+ &#x7684;&#x505A;&#x6CD5;&#x53EA;&#x82B1;&#x4E86;&#x4E0D;&#x5230; 2 &#x5C0F;&#x65F6;&#x3002;&#x53E6;&#x5916;&#x4E5F;&#x4E0D;&#x80FD;&#x4E00;&#x76F4;&#x76F8;&#x4FE1;&#x7ECF;&#x9A8C;&#xFF0C;&#x7ECF;&#x9A8C;&#x6709;&#x65F6;&#x4E5F;&#x4F1A;&#x72AF;&#x9519;&#xFF0C;&#x800C;&#x4E14;&#x4F1A;&#x56FA;&#x5316;&#x601D;&#x7EF4;&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[撸一个基于 Promise 的简单流程控制框架]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x5728;&#x6587;&#x7AE0;&#x5F00;&#x59CB;&#x524D;&#xFF0C;&#x5148;&#x4ECB;&#x7ECD;&#x4E00;&#x4E2A;&#x80CC;&#x666F;&#x3002;&#x8457;&#x540D;&#x7684;&#x5F02;&#x6B65;&#x6846;&#x67B6; <a href="http://caolan.github.io/async/?ref=iammapping.com">async</a> &#x4E2D;&#x6709;&#x4E00;&#x4E2A; <code>waterfall</code> &#x65B9;&#x6CD5;&#xFF08;<a href="http://caolan.github.io/async/docs.html?ref=iammapping.com#waterfall">&#x5B98;&#x65B9;&#x793A;&#x4F8B;</a>&#xFF09;&#xFF0C;&#x8BE5;&#x65B9;&#x6CD5;&#x7528;&#x4E8E;&#x63A7;&#x5236;&#x5F02;&#x6B65;&#x7684;&#x6D41;&#x7A0B;&#x975E;</p>]]></description><link>https://iammapping.com/a-simple-flow-framework-based-on-promise/</link><guid isPermaLink="false">6522cda9caa77d0fabe3ef42</guid><category><![CDATA[NodeJs]]></category><category><![CDATA[Promise]]></category><category><![CDATA[TypeScript]]></category><dc:creator><![CDATA[Iam Mapping]]></dc:creator><pubDate>Sat, 11 Feb 2017 09:00:11 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x5728;&#x6587;&#x7AE0;&#x5F00;&#x59CB;&#x524D;&#xFF0C;&#x5148;&#x4ECB;&#x7ECD;&#x4E00;&#x4E2A;&#x80CC;&#x666F;&#x3002;&#x8457;&#x540D;&#x7684;&#x5F02;&#x6B65;&#x6846;&#x67B6; <a href="http://caolan.github.io/async/?ref=iammapping.com">async</a> &#x4E2D;&#x6709;&#x4E00;&#x4E2A; <code>waterfall</code> &#x65B9;&#x6CD5;&#xFF08;<a href="http://caolan.github.io/async/docs.html?ref=iammapping.com#waterfall">&#x5B98;&#x65B9;&#x793A;&#x4F8B;</a>&#xFF09;&#xFF0C;&#x8BE5;&#x65B9;&#x6CD5;&#x7528;&#x4E8E;&#x63A7;&#x5236;&#x5F02;&#x6B65;&#x7684;&#x6D41;&#x7A0B;&#x975E;&#x5E38;&#x76F4;&#x89C2;&#x800C;&#x4E14;&#x65B9;&#x4FBF;&#xFF0C;&#x5C31;&#x50CF;&#x4E0B;&#x9762;&#x8FD9;&#x6837;&#xFF1A;</p>
<pre><code class="language-javascript">async.waterfall([
    function Task1(callback) {
        callback(null, &apos;a&apos;);
    },
    function Task2(last, callback) {
        // last now equals &apos;a&apos;
        callback(null, &apos;b&apos;);
    },
    function Task3(last, callback) {
        // last now equals &apos;b&apos;
        callback(null, &apos;done&apos;);
    }
], function (err, result) {
    // result now equals &apos;done&apos;
});
</code></pre>
<p>&#x6574;&#x4E2A;&#x8FC7;&#x7A0B;&#x5199;&#x4E0B;&#x6765;&#x5C31;&#x50CF;&#x7011;&#x5E03;&#x4E00;&#x6837;&#xFF0C;&#x53C2;&#x6570;&#x9010;&#x6B65;&#x4F20;&#x9012;&#xFF0C;&#x4ECE;&#x4E0A;&#x800C;&#x4E0B;&#xFF0C;&#x884C;&#x4E91;&#x6D41;&#x6C34;&#x3002;&#x5982;&#x679C;&#x4F7F;&#x7528; Promise &#x5B9E;&#x73B0;&#xFF0C;&#x53EF;&#x4EE5;&#x6D88;&#x9664;&#x6389;&#x4E11;&#x964B;&#x7684; callback&#xFF0C;&#x4F1F;&#x5927;&#x7684; Github &#x4E0A;&#x4E5F;&#x6709;<a href="https://github.com/notjrbauer/promise.waterfall?ref=iammapping.com">&#x73B0;&#x6210;&#x7684;&#x5B9E;&#x73B0;</a>&#x3002;&#x672C;&#x6587;&#x53EF;&#x4E0D;&#x662F;&#x4E3A;&#x4E86;&#x4ECB;&#x7ECD;&#x8FD9;&#x4E24;&#x4E2A;&#x5E93;&#xFF0C;&#x800C;&#x662F;&#x8981;&#x5728;&#x8FD9;&#x57FA;&#x7840;&#x4E0A;&#x66F4;&#x8FDB;&#x4E00;&#x6B65;&#x3002;</p>
<p>&#x4E0A;&#x9762;&#x7684;&#x6D41;&#x7A0B;&#xFF0C;&#x5927;&#x81F4;&#x53EF;&#x4EE5;&#x7528;&#x5982;&#x4E0B;&#x793A;&#x610F;&#x56FE;&#x8868;&#x793A;&#xFF1A;</p>
<p><img src="https://cdn.iammapping.com/2017/02/10/148673961632909238.png" alt loading="lazy"></p>
<p>&#x53EF;&#x662F;&#x5982;&#x679C;&#x8981;&#x5B9E;&#x73B0;&#x4E0B;&#x56FE;&#x7684;&#x6D41;&#x7A0B;&#xFF1A;</p>
<p><img src="https://cdn.iammapping.com/2017/02/10/148673957560530273.png" alt loading="lazy"></p>
<ol>
<li><code>Task1</code> &#x6267;&#x884C;&#x8FD4;&#x56DE; a&#xFF1B;</li>
<li><code>Task2_1</code>&#x3001;<code>Task2_2</code>&#x3001;<code>Task2_3</code> &#x5E76;&#x884C;&#x6267;&#x884C;;</li>
<li><code>Task2_1</code> &#x6536;&#x5230; a &#x8FD4;&#x56DE; b1;</li>
<li><code>Task2_2</code> &#x6536;&#x5230; a &#x6267;&#x884C;&#x8FD4;&#x56DE; b2&#xFF1B;
<ol>
<li><code>Task3</code> &#x5728; <code>Task2_2</code> &#x6267;&#x884C;&#x7ED3;&#x675F;&#x540E;&#x6536;&#x5230; b2 &#x6267;&#x884C;&#x8FD4;&#x56DE; c&#xFF1B;</li>
</ol>
</li>
<li><code>Task2_3</code> &#x6536;&#x5230; a &#x8FD4;&#x56DE; b3;</li>
<li><code>Task4</code> &#x6536;&#x5230;&#x4E0A;&#x4E00;&#x6B65;&#x7684; [b1, c, b3] &#x6267;&#x884C;&#x3002;</li>
</ol>
<p>&#x662F;&#x4E0D;&#x662F;&#x611F;&#x89C9;&#x6709;&#x70B9;&#x529B;&#x4E0D;&#x4ECE;&#x5FC3;&#x4E86;&#xFF0C;&#x6CA1;&#x4E8B;&#xFF0C;<code>async.waterfall</code> &#x7ED3;&#x5408; <code>async.parallel</code> &#x4E00;&#x8D77;&#x8FD8;&#x662F;&#x80FD;&#x8FBE;&#x5230;&#x76EE;&#x7684;&#xFF1A;</p>
<pre><code class="language-javascript">async.waterfall([
    function Task1(callback) {
        callback(null, &apos;a&apos;);
    },
    function(last, callback) {
        // last equals &apos;a&apos;
        async.parallel([
            function Task2_1(callback) {
                // last equals &apos;a&apos;
                callback(null, &apos;b1&apos;);
            },
            function(callback) {
                async.waterfall([
                    function Task2_2(callback) {
                        // last equals &apos;a&apos;
                        callback(null, &apos;b2&apos;);
                    },
                    function Task3(last, callback) {
                        // last equals &apos;b2&apos;
                        callback(null, &apos;c&apos;);
                    }
                ], callback);
            },
            function Task2_3(callback) {
                // last equals &apos;a&apos;
                callback(null, &apos;b3&apos;);
            }
        ], callback);
    },
    function Task4(last, callback) {
        // last equals [&apos;b1&apos;, &apos;c&apos;, &apos;b3&apos;]
        callback(null, &apos;d&apos;);
    }
], function(err, result) {
    // result equals &apos;d&apos;
});
</code></pre>
<p>&#x7B80;&#x76F4;&#x53F9;&#x4E3A;&#x89C2;&#x6B62;&#xFF0C;&#x4F46;&#x613F;&#x8FD9;&#x6BB5;&#x4EE3;&#x7801;&#x7684;&#x5D4C;&#x5957;&#x4EE5;&#x53CA;&#x5404;&#x79CD; <code>last</code> &#x548C; <code>callback</code> &#x6CA1;&#x6709;&#x8BA9;&#x4F60;&#x7729;&#x6655;&#x3002;&#x5982;&#x679C;&#x6709;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x6D41;&#x7A0B;&#x63A7;&#x5236;&#x6846;&#x67B6;&#x53EF;&#x4EE5;&#x50CF;&#x4E0B;&#x9762;&#x8FD9;&#x6837;&#x7B80;&#x4FBF;&#x5730;&#x5B9E;&#x73B0;&#x8FD9;&#x4E2A;&#x6D41;&#x7A0B;&#xFF1A;</p>
<pre><code class="language-javascript">new Flow([
    function Task1() {
        return &apos;a&apos;;
    },
    [
        function Task2_1(last) {
        	// last equals &apos;a&apos;
            return &apos;b1&apos;;
        },
        new Flow([
            function Taks2_2(last) {
            	// last equals &apos;a&apos;
                return &apos;b2&apos;;
            },
            function Task3(last) {
            	// last equals &apos;b2&apos;
                return &apos;c&apos;;
            }
        ]),
        function Task2_3(last) {
        	// last equals &apos;a&apos;
            return &apos;b3&apos;;
        }
    ],
    function Task4(last) {
    	// last equals [&apos;b1&apos;, &apos;c&apos;, &apos;b3&apos;]
        console.log(last);
    }
]).start();
</code></pre>
<p>&#x8FD9;&#x6837;&#x770B;&#x4E0A;&#x53BB;&#x662F;&#x4E0D;&#x662F;&#x8212;&#x670D;&#x591A;&#x5566;&#x3002;&#x4E0D;&#x8FC7;&#x975E;&#x5E38;&#x9057;&#x61BE;&#xFF0C;&#x5728;&#x5199;&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;&#x524D;&#x8FD8;&#x6CA1;&#x6709;&#x51FA;&#x73B0;&#x8FD9;&#x6837;&#x7684;&#x4E00;&#x4E2A;&#x6846;&#x67B6;&#x3002;&#x611F;&#x89C9;&#x88AB;&#x800D;&#xFF0C;&#x522B;&#x7740;&#x6025;&#xFF0C;&#x6211;&#x4EEC;&#x81EA;&#x5DF1;&#x64B8;&#x4E00;&#x4E2A;&#x4FBF;&#x662F;&#x3002;</p>
<h3 id="talkischeaplets">Talk is cheap, Let&apos;s &#x64B8;.</h3>
<p>&#x4EE5;&#x4E0B;&#x4EE3;&#x7801;&#x81EA;&#x8C6A;&#x5730;&#x4F7F;&#x7528; <strong>TypeScript</strong> &#x7F16;&#x5199;&#xFF08;ps: &#x4F7F;&#x7528; vscode &#x5199; typescript&#xFF0C;&#x771F;&#x7684;&#x723D;&#x5230;&#x4E0D;&#x8981;&#x4E0D;&#x8981;&#x7684;&#xFF09;&#x3002;</p>
<p>&#x4E3A;&#x7B80;&#x5355;&#x8D77;&#x89C1;&#xFF0C;&#x4F7F;&#x7528; <a href="http://bluebirdjs.com/?ref=iammapping.com">bluebird</a>&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x539F;&#x751F;&#x7684; <code>Promise</code>&#xFF1B;</p>
<pre><code class="language-javascript">import * as Promise from &apos;bluebird&apos;;
</code></pre>
<p>&#x5B9A;&#x4E49; Task &#x7684;&#x7C7B;&#x578B;&#xFF0C;&#x652F;&#x6301;&#x666E;&#x901A; <code>Function</code> &#x5BF9;&#x8C61;&#xFF0C;<code>Flow</code> &#x5BF9;&#x8C61;&#x548C;&#x6570;&#x7EC4;&#xFF1B;</p>
<pre><code class="language-javascript">type Task = Function | Flow | Array&lt;Function | Flow&gt;;
</code></pre>
<p>&#x5B9A;&#x4E49; Flow &#x7C7B;&#xFF1B;</p>
<pre><code class="language-javascript">export class Flow {
    // &#x4FDD;&#x5B58;&#x4E0A;&#x4E00;&#x4E2A; Task &#x7684;&#x8FD4;&#x56DE;&#x503C;
    private lastValue: any;
    
    // &#x6307;&#x5411;&#x5B50; Flow &#x7684;&#x7236; Flow
    public parent: Flow = null;

    // Flow &#x7684;&#x6784;&#x9020;&#x65B9;&#x6CD5;&#xFF0C;&#x63A5;&#x6536; Tasks
    constructor(protected tasks: Array&lt;Task&gt; = []) {
        if (!(this instanceof Flow)) {
            return new Flow(tasks);
        }
    }

    // &#x5F00;&#x59CB; Flow &#x4E2D;&#x7684; tasks
    start(initValue: any = Promise.resolve()) : Promise&lt;any&gt; {
        // &#x9010;&#x4E2A;&#x6267;&#x884C;&#x6BCF;&#x4E00;&#x4E2A;&#x4EFB;&#x52A1;
        return Promise.reduce(this.tasks, (last, curr) =&gt; {
            return this.exec(curr, last);
        }, initValue);
    }
}
</code></pre>
<p>Flow &#x4E2D;&#x7684; exec &#x65B9;&#x6CD5;&#xFF1B;</p>
<pre><code class="language-javascript">    protected exec(task: Task, last: any) {
        this.lastValue = last;

        // &#x6267;&#x884C;&#x6BCF;&#x4E2A;&#x5355;&#x4E00; task
        let single = (t) =&gt; {
            if (t instanceof Flow) {
                // task &#x4E3A; Flow &#x5BF9;&#x8C61;&#xFF0C;&#x65E2;&#x662F;&#x4E00;&#x4E2A;&#x5B50; Flow
                // &#x6307;&#x5B9A; parent &#x4E3A;&#x5F53;&#x524D; Flow
                t.parent = this;

                // &#x5F00;&#x59CB;&#x5B50; Flow
                return t.start(last);
            } else {
                // task &#x4E3A;&#x666E;&#x901A;&#x65B9;&#x6CD5;
                return t.call(this, last);
            }
        }

        if (Array.isArray(task)) {
            // task &#x662F;&#x6570;&#x7EC4;
            // &#x5E76;&#x884C;&#x6267;&#x884C;&#x6BCF;&#x4E00;&#x4E2A; task
            return Promise.map(task, function(it) {
                return single(it);
            });
        } else {
            return single(task);
        }
    }
</code></pre>
<p>&#x5230;&#x6B64;&#x4E3A;&#x6B62;&#xFF0C;&#x6211;&#x4EEC;&#x7684; Flow &#x6846;&#x67B6;&#x5DF2;&#x7ECF;&#x5B8C;&#x6210;&#x4E86;&#x3002;&#x53E6;&#x5916;&#x53EF;&#x4EE5;&#x6DFB;&#x52A0;&#x4E24;&#x4E2A;&#x65B9;&#x6CD5;&#xFF0C;&#x7528;&#x4E8E;&#x5916;&#x90E8;&#x5411; flow &#x5B9E;&#x4F8B;&#x4E2D;&#x6DFB;&#x52A0;&#x65B0;&#x7684; task&#xFF1B;</p>
<pre><code class="language-javascript">    // &#x5F80;&#x540E;&#x8FFD;&#x52A0; task
    append(...tasks: Array&lt;Task&gt;) {
        this.tasks = this.tasks.concat(tasks);

        return this;
    }

    // &#x5F80;&#x524D;&#x6DFB;&#x52A0; task
    prepend(...tasks: Array&lt;Task&gt;) {
        this.tasks = tasks.concat(this.tasks);

        return this;
    }
</code></pre>
<p>&#x5B8C;&#x6574;&#x4EE3;&#x7801;&#x53EF;&#x67E5;&#x770B;&#x1F449; <a href="https://github.com/iammapping/flow?ref=iammapping.com">https://github.com/iammapping/flow</a>&#x3002;</p>
<p>&#x6846;&#x67B6;&#x5B8C;&#x6210;&#x4E86;&#xFF0C;&#x73B0;&#x5728;&#x770B;&#x770B;&#x5B9E;&#x9645;&#x7684;&#x5E94;&#x7528;&#x5427;&#xFF0C;&#x5C31;&#x6765;&#x5199;&#x4E00;&#x4E2A;&#x524D;&#x9635;&#x5B50;&#x5F88;&#x706B;&#x7684;&#x9762;&#x8BD5;&#x9898; LazyMan&#xFF1A;</p>
<pre><code class="language-javascript">import * as Promise from &apos;bluebird&apos;;
import {Flow} from &apos;../flow&apos;;

class LazyMan extends Flow {
    constructor(name: string) {
        super([function() {
            console.log(&apos;Hi, I am %s&apos;, name);
        }]);
        
        process.nextTick(() =&gt; this.start());
    }

    sleep(second: number) {
        return this.append(function() {
            return new Promise((resolve, reject) =&gt; {
                setTimeout(() =&gt; {
                    console.log(&apos;Wake up after %ds!&apos;, second);
                    resolve();
                }, second * 1000);
            });
        });
    }

    sleepFirst(second: number) {
        return this.prepend(function() {
            return new Promise((resolve, reject) =&gt; {
                setTimeout(() =&gt; {
                    console.log(&apos;Wake up after %ds!&apos;, second);
                    resolve();
                }, second * 1000);
            });
        });
    }

    eat(food: string) {
        return this.append(function() {
            console.log(&apos;Eat %s~&apos;, food);
        });
    }
}

new LazyMan(&apos;mapping&apos;).sleep(2).eat(&apos;apple&apos;).sleepFirst(5);
// Wake up after 5s!
// Hi, I am mapping
// Wake up after 2s!
// Eat apple~
</code></pre>
<p>&#x8FD9;&#x53EA;&#x662F;&#x629B;&#x7816;&#x5F15;&#x7389;&#xFF0C;&#x5C0F;&#x6846;&#x67B6;&#x4E5F;&#x80FD;&#x53D1;&#x6325;&#x5927;&#x5A01;&#x529B;&#x3002;</p>
<p>Happy coding~~</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[基于 Redis 的代理 ip 池设计]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x4EE3;&#x7406; ip &#x56E0;&#x4E3A;&#x914D;&#x7F6E;&#x7B80;&#x5355;&#x800C;&#x4E14;&#x5EC9;&#x4EF7;&#xFF0C;&#x7ECF;&#x5E38;&#x7528;&#x6765;&#x4F5C;&#x4E3A;&#x53CD;&#x53CD;&#x722C;&#x866B;&#x7684;&#x624B;&#x6BB5;&#xFF0C;&#x4F46;&#x662F;&#x7A33;&#x5B9A;&#x6027;&#x4E00;&#x76F4;&#x662F;&#x5176;&#x8BDF;&#x75C5;&#x3002;&#x7B5B;&#x9009;&#x51FA;&#x4F18;&#x8D28;&#x7684;&#x4EE3;&#x7406; ip &#x5E76;</p>]]></description><link>https://iammapping.com/proxy-ip-pool-based-on-redis/</link><guid isPermaLink="false">6522cda9caa77d0fabe3ef41</guid><category><![CDATA[redis]]></category><dc:creator><![CDATA[Iam Mapping]]></dc:creator><pubDate>Thu, 19 Jan 2017 02:18:31 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x4EE3;&#x7406; ip &#x56E0;&#x4E3A;&#x914D;&#x7F6E;&#x7B80;&#x5355;&#x800C;&#x4E14;&#x5EC9;&#x4EF7;&#xFF0C;&#x7ECF;&#x5E38;&#x7528;&#x6765;&#x4F5C;&#x4E3A;&#x53CD;&#x53CD;&#x722C;&#x866B;&#x7684;&#x624B;&#x6BB5;&#xFF0C;&#x4F46;&#x662F;&#x7A33;&#x5B9A;&#x6027;&#x4E00;&#x76F4;&#x662F;&#x5176;&#x8BDF;&#x75C5;&#x3002;&#x7B5B;&#x9009;&#x51FA;&#x4F18;&#x8D28;&#x7684;&#x4EE3;&#x7406; ip &#x5E76;&#x4E0D;&#x7B80;&#x5355;&#xFF0C;&#x5373;&#x4F7F;&#x4ED8;&#x8D39;&#x8D2D;&#x4E70;&#x7684;&#x4EE3;&#x7406; ip &#x6E90;&#xFF0C;&#x5356;&#x5BB6;&#x4E5F;&#x4E0D;&#x6562;&#x4FDD;&#x8BC1; 100% &#x53EF;&#x7528;&#xFF1B;&#x53E6;&#x5916;&#x4EE3;&#x7406; ip &#x7684;&#x751F;&#x547D;&#x5468;&#x671F;&#x4E5F;&#x65E0;&#x6CD5;&#x9884;&#x77E5;&#xFF0C;&#x53EF;&#x80FD;&#x4E0A;&#x4E00;&#x79D2;&#x80FD;&#x7528;&#xFF0C;&#x4E0B;&#x4E00;&#x79D2;&#x5C31;&#x6251;&#x8857;&#x4E86;&#x3002;&#x57FA;&#x4E8E;&#x8FD9;&#x4E9B;&#x539F;&#x56E0;&#xFF0C;&#x4F1A;&#x7ED9;&#x4F7F;&#x7528;&#x4EE3;&#x7406; ip &#x7684;&#x722C;&#x866B;&#x7A0B;&#x5E8F;&#x5E26;&#x6765;&#x5F88;&#x591A;&#x4E0D;&#x7A33;&#x5B9A;&#x7684;&#x56E0;&#x7D20;&#x3002;&#x8981;&#x6392;&#x9664;&#x4EE3;&#x7406; ip &#x7684;&#x5F71;&#x54CD;&#xFF0C;&#x901A;&#x5E38;&#x7684;&#x505A;&#x6CD5;&#x662F;&#x5EFA;&#x4E00;&#x4E2A;&#x4EE3;&#x7406; ip &#x6C60;&#xFF0C;&#x6BCF;&#x6B21;&#x8BF7;&#x6C42;&#x524D;&#x6765;&#x6C60;&#x5B50;&#x53D6;&#x4E00;&#x4E2A; ip&#xFF0C;&#x7528;&#x5B8C;&#x4E4B;&#x540E;&#x5F52;&#x8FD8;&#xFF0C;&#x4FDD;&#x8BC1;&#x6C60;&#x5B50;&#x91CC;&#x7684; ip &#x90FD;&#x662F;&#x53EF;&#x7528;&#x7684;&#x3002;&#x672C;&#x6587;&#x63A5;&#x4E0B;&#x6765;&#x5C31;&#x63A2;&#x8BA8;&#x4E00;&#x4E0B;&#xFF0C;&#x5982;&#x4F55;&#x4F7F;&#x7528; Redis &#x6784;&#x5EFA;&#x4EE3;&#x7406; ip &#x6C60;&#xFF0C;&#x5B9E;&#x73B0;&#x81EA;&#x52A8;&#x66F4;&#x65B0;&#xFF0C;&#x81EA;&#x52A8;&#x62E9;&#x4F18;&#x3002;</p>
<h2 id>&#x6574;&#x4F53;&#x6D41;&#x7A0B;</h2>
<p><img src="https://cdn.iammapping.com/2017/01/02/148334033225878738.png" alt loading="lazy"></p>
<p>&#x7531;&#x4E0A;&#x56FE;&#x6240;&#x793A;&#xFF0C;&#x5DE6;&#x4FA7;&#x662F;&#x5F62;&#x6210;&#x4E86;&#x6574;&#x4E2A;&#x6D41;&#x7A0B;&#x7684;&#x95ED;&#x73AF;&#xFF0C;&#x4ECE;&#x722C;&#x866B;&#x7A0B;&#x5E8F;&#x4EE5;&#x72EC;&#x5360;&#x7684;&#x65B9;&#x5F0F;&#x62FF;&#x5230;&#x4E00;&#x4E2A;&#x4EE3;&#x7406; ip &#x5230;&#x722C;&#x53D6;&#x5B8C;&#x6210;&#x5F52;&#x8FD8; ip&#x3002;&#x8FD9;&#x4E2A;&#x6D41;&#x7A0B;&#x5176;&#x5B9E;&#x662F;&#x4E0D;&#x592A;&#x4E25;&#x8C28;&#x7684;&#xFF0C;&#x5982;&#x679C;&#x722C;&#x866B;&#x7A0B;&#x5E8F;&#x5F02;&#x5E38;&#x4E2D;&#x65AD;&#xFF0C;&#x5C31;&#x4F1A;&#x5BFC;&#x81F4; ip &#x65E0;&#x6CD5;&#x5F52;&#x8FD8;&#xFF0C;&#x5C31;&#x4F1A;&#x5BFC;&#x81F4;&#x8FD9;&#x4E2A; ip &#x65E0;&#x6CD5;&#x5FAA;&#x73AF;&#x5229;&#x7528;&#x3002;&#x4F46;&#x662F;&#x7531;&#x4E8E;&#x4EE3;&#x7406; ip &#x672C;&#x8EAB;&#x7684;&#x7279;&#x70B9;&#xFF0C;&#x91CF;&#x591A;&#x800C;&#x4E14;&#x5FAA;&#x73AF;&#x5229;&#x7528;&#x7684;&#x4EF7;&#x503C;&#x5E76;&#x4E0D;&#x5927;&#xFF0C;&#x6240;&#x4EE5;&#x8FD9;&#x79CD;&#x60C5;&#x51B5;&#x5C31;let it go&#x3002;</p>
<p>&#x4E0A;&#x9762;&#x4E5F;&#x63D0;&#x5230; ip &#x662F;&#x4EE5;&#x72EC;&#x5360;&#x7684;&#x65B9;&#x5F0F;&#x83B7;&#x53D6;&#xFF0C;&#x5982;&#x679C;&#x662F;&#x53BB;&#x722C;&#x4E24;&#x4E2A;&#x6BEB;&#x4E0D;&#x76F8;&#x5173;&#x7684;&#x7F51;&#x7AD9;&#xFF0C;&#x672C;&#x6765;&#x4E00;&#x4E2A; ip &#x5C31;&#x53EF;&#x4EE5;&#xFF0C;&#x53EF;&#x73B0;&#x5728;&#x9700;&#x8981;&#x4E24;&#x4E2A;&#x3002;&#x4E3A;&#x4E86;&#x8D44;&#x6E90;&#x6700;&#x5927;&#x5316;&#x4F7F;&#x7528;&#xFF0C;&#x8FD9;&#x91CC;&#x5F15;&#x5165;&#x4E86;&#x9891;&#x9053; ip &#x6C60;&#x548C;&#x603B;&#x4EE3;&#x7406; ip &#x6C60;&#x3002;&#x4E24;&#x4E2A;&#x7F51;&#x7AD9;&#x5C31;&#x5F53;&#x505A;&#x4E24;&#x4E2A;&#x9891;&#x9053;&#xFF0C;&#x5404;&#x81EA;&#x72EC;&#x5360;&#xFF0C;&#x4E92;&#x4E0D;&#x76F8;&#x5173;&#xFF1B;&#x603B;&#x6C60;&#x5B50;&#x5C31;&#x662F;&#x4FDD;&#x5B58;&#x6240;&#x6709;&#x7684; ip&#xFF0C;&#x6BCF;&#x4E2A;&#x9891;&#x9053;&#x90FD;&#x5171;&#x4EAB;&#x3002;&#x5047;&#x8BBE;&#x53EA;&#x6709;&#x4E00;&#x4E2A; ip&#xFF1A;1.1.1.1 &#x5728;&#x603B;&#x6C60;&#x5B50;&#xFF0C;&#x722C; A &#x7F51;&#x7AD9;&#x4F1A;&#x628A;&#x5B83;&#x4ECE;&#x603B;&#x6C60;&#x5B50;&#x53D6;&#x5230; A &#x9891;&#x9053;&#x7684; ip &#x6C60;&#xFF0C;&#x7136;&#x540E; A &#x722C;&#x866B;&#x7A0B;&#x5E8F;&#x4ECE; A &#x9891;&#x9053; ip &#x6C60;&#x53D6;&#x51FA; 1.1.1.1 &#x8FDB;&#x884C;&#x4F7F;&#x7528;&#xFF0C;&#x8FD9;&#x65F6; 1.1.1.1 &#x4F9D;&#x7136;&#x5728;&#x603B;&#x6C60;&#x5B50;&#x91CC;&#xFF0C;&#x4F46; A &#x9891;&#x9053;&#x7684; ip &#x6C60;&#x5DF2;&#x7ECF;&#x4E0D;&#x5305;&#x542B; 1.1.1.1 &#x4E86;&#xFF1B;&#x722C; B &#x7F51;&#x7AD9;&#x4E5F;&#x662F;&#x4E00;&#x6837;&#x7684;&#x6D41;&#x7A0B;&#x62FF;&#x5230; 1.1.1.1&#xFF0C;&#x53EA;&#x662F;&#x4ECE; B &#x81EA;&#x5DF1;&#x7684;&#x9891;&#x9053;&#x6C60;&#x83B7;&#x53D6;&#x3002;&#x4E0B;&#x9762;&#x5C31;&#x8BE6;&#x7EC6;&#x8BF4;&#x8BF4;&#x603B;&#x6C60;&#x5B50;&#x548C;&#x9891;&#x9053;&#x6C60;&#x5B50;&#x3002;</p>
<h3 id="ip">&#x603B;&#x4EE3;&#x7406; ip &#x6C60;</h3>
<p>&#x603B;&#x6C60;&#x5B50;&#x7684;&#x4F5C;&#x7528;&#x5C31;&#x662F;&#x5171;&#x4EAB;&#x6240;&#x6709;&#x53EF;&#x7528;&#x7684; ip&#xFF0C;&#x4F46;&#x662F;&#x4EC5;&#x4F5C;&#x4E3A;&#x5B58;&#x50A8; ip &#x7684;&#x6C60;&#x5B50;&#x5E76;&#x4E0D;&#x80FD;&#x5B9E;&#x73B0;&#x81EA;&#x52A8;&#x62E9;&#x4F18;&#x554A;&#xFF0C;&#x8FD9;&#x91CC;&#x7684;&#x62E9;&#x4F18;&#x901A;&#x5E38;&#x662F;&#x5E0C;&#x671B;&#x5EF6;&#x8FDF;&#x4F4E;&#x901F;&#x5EA6;&#x5FEB;&#x7684; ip &#x66F4;&#x5BB9;&#x6613;&#x88AB;&#x7B5B;&#x9009;&#x51FA;&#xFF0C;&#x6240;&#x4EE5;&#x6211;&#x4EEC;&#x5E0C;&#x671B;&#x6C60;&#x5B50;&#x4E2D;&#x7684; ip &#x662F;&#x6839;&#x636E;&#x5B83;&#x4EEC;&#x7684;&#x5EF6;&#x65F6;&#x5347;&#x5E8F;&#x6392;&#x5217;&#xFF0C;&#x501F;&#x52A9; Redis &#x7684; <code>Sorted Sets</code> &#x6570;&#x636E;&#x7ED3;&#x6784;&#x5373;&#x53EF;&#x5B9E;&#x73B0;&#xFF0C;&#x7528;&#x5EF6;&#x65F6;&#x8868;&#x793A; score&#xFF0C;ip &#x8868;&#x793A; member&#x3002;</p>
<p>&#x4F7F;&#x7528; <code>ZADD</code> &#x6DFB;&#x52A0;&#x65B0; ip &#x6216;&#x66F4;&#x65B0; ip &#x7684;&#x5EF6;&#x8FDF;&#xFF1A;</p>
<pre><code>&gt; ZADD proxy_global_ips 200 1.1.1.1:8080 100 2.2.2.2:80 300 3.3.3.3:8888
(integer) 3
</code></pre>
<p>&#x4F7F;&#x7528; <code>ZRANGE</code> &#x83B7;&#x53D6; ip&#xFF0C;&#x53EF;&#x4EE5;&#x6307;&#x5B9A;&#x83B7;&#x53D6;&#x7684;&#x4E2A;&#x6570;&#xFF0C;&#x6BD4;&#x5982;&#x53D6;&#x4E24;&#x4E2A;&#xFF1A;</p>
<pre><code>&gt; ZRANGE proxy_global_ips 0 1 WITHSCORES
1) &quot;2.2.2.2:80&quot;
2) &quot;100&quot;
3) &quot;1.1.1.1:8080&quot;
4) &quot;200&quot;
</code></pre>
<h3 id="ip">&#x9891;&#x9053; ip &#x6C60;</h3>
<p>&#x9891;&#x9053; ip &#x6C60;&#x7684;&#x4F5C;&#x7528;&#x662F;&#x4E3A;&#x4E86;&#x6700;&#x5927;&#x5316;&#x4F7F;&#x7528;&#x603B;&#x6C60;&#x5B50;&#x4E2D;&#x7684; ip&#xFF0C;&#x5E76;&#x4E14;&#x9694;&#x79BB;&#x5176;&#x4ED6;&#x9891;&#x9053;&#x7684; ip &#x6C60;&#x3002;&#x7531;&#x4E8E;&#x4E00;&#x4E2A; ip &#x4F7F;&#x7528;&#x6B21;&#x6570;&#x8FC7;&#x591A;&#x662F;&#x6709;&#x5F88;&#x5927;&#x7684;&#x6982;&#x7387;&#x88AB;&#x76EE;&#x6807;&#x7F51;&#x7AD9;&#x5C4F;&#x853D;&#x6389;&#xFF0C;&#x6240;&#x4EE5;&#x8FD9;&#x91CC;&#x4E5F;&#x9700;&#x8981;&#x8FDB;&#x884C;&#x62E9;&#x4F18;&#xFF0C;&#x5E94;&#x8BE5;&#x4F18;&#x5148;&#x7B5B;&#x9009;&#x51FA;&#x4F7F;&#x7528;&#x6B21;&#x6570;&#x5C11;&#x7684; ip&#xFF0C;&#x540C;&#x7406;&#x4E5F;&#x662F;&#x4F7F;&#x7528; <code>Sorted Sets</code>&#xFF0C;&#x4F7F;&#x7528;&#x6B21;&#x6570;&#x8868;&#x793A; score&#xFF0C;ip &#x8868;&#x793A; member&#xFF0C;&#x8FD9;&#x91CC;&#x4E0E;&#x603B;&#x6C60;&#x5B50;&#x660E;&#x663E;&#x7684;&#x4E0D;&#x540C;&#x4E4B;&#x5904;&#x662F; key &#x4E0D;&#x662F;&#x56FA;&#x5B9A;&#x7684;&#xFF0C;&#x9700;&#x8981;&#x628A;&#x9891;&#x9053;&#x540D;&#x79F0;&#x7EC4;&#x5408;&#x8FDB;&#x53BB;&#xFF0C;&#x8FD9;&#x6837;&#x4FDD;&#x8BC1;&#x9891;&#x9053;&#x4E4B;&#x95F4;&#x7684;&#x9694;&#x79BB;&#xFF0C;&#x5982;&#x9891;&#x9053; abc &#x7684; key&#xFF1A;<code>proxy_channel_abc_ips</code>&#x3002;</p>
<p>&#x7531;&#x4E8E;&#x9891;&#x9053;&#x6C60;&#x5B50;&#x4E2D;&#x7684; ip &#x662F;&#x8981;&#x4EE5;&#x72EC;&#x5360;&#x7684;&#x65B9;&#x5F0F;&#x53D6;&#x51FA;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x4E00;&#x4E2A; <code>ZPOP</code> &#x7684;&#x65B9;&#x6CD5;&#xFF0C;&#x5948;&#x4F55; Redis &#x672C;&#x8EAB;&#x6CA1;&#x6709;&#xFF0C;&#x8FD8;&#x597D;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; Lua &#x6A21;&#x62DF;&#xFF0C;&#x5728;&#x4E00;&#x4E2A;&#x539F;&#x5B50;&#x64CD;&#x4F5C;&#x4E0B;&#x53D6;&#x51FA; ip&#xFF0C;&#x7136;&#x540E;&#x5220;&#x9664;&#xFF1A;</p>
<pre><code>&gt; eval &quot;local el = redis.call(&apos;zrange&apos;, KEYS[1], 0, 0, &apos;WITHSCORES&apos;); redis.call(&apos;zrem&apos;, KEYS[1], el[1]); return el;&quot; 1 proxy_channel_abc_ips
</code></pre>
<p>&#x5F80;&#x9891;&#x9053; ip &#x6C60;&#x6DFB;&#x52A0; ip&#xFF1A;</p>
<pre><code>&gt; ZADD proxy_channel_abc_ips INCR 0 1.1.1.1:8080
</code></pre>
<p>&#x8FD9;&#x91CC;&#x4E0E;&#x603B;&#x6C60;&#x5B50;&#x4E0D;&#x540C;&#x7684;&#x662F;&#x591A;&#x4E86;&#x4E00;&#x4E2A; <code>INCR</code> &#x9009;&#x9879;&#xFF0C;&#x8FD9;&#x662F; Redis 3.0.2 &#x7248;&#x672C;&#x540E;&#x624D;&#x652F;&#x6301;&#x7684;&#x65B0;&#x7279;&#x6027;&#xFF0C;&#x5373;&#x6307;&#x5B9A;&#x5728; ZADD &#x65F6;&#x53D1;&#x751F; member &#x51B2;&#x7A81;&#x91C7;&#x53D6;&#x7684;&#x5904;&#x7406;&#x65B9;&#x5F0F;&#xFF0C;<code>INCR</code> &#x987E;&#x540D;&#x601D;&#x4E49;&#x662F;&#x51B2;&#x7A81;&#x540E;&#x7D2F;&#x52A0; score &#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x4E3A;&#x4EC0;&#x4E48;&#x8981;&#x7528;&#x8FD9;&#x4E2A;&#x9009;&#x9879;&#xFF0C;&#x770B;&#x770B;&#x4E0B;&#x9762;&#x8FD9;&#x4E2A;&#x6D41;&#x7A0B;&#xFF1A;</p>
<ol>
<li>&#x5728;&#x9891;&#x9053;&#x6C60;&#x5B50;&#x4E2D;&#x53EA;&#x6709; 1.1.1.1&#xFF0C;&#x4F7F;&#x7528;&#x6B21;&#x6570;&#x4E3A; 10&#xFF1B;&#x603B;&#x6C60;&#x5B50;&#x4E5F;&#x6709; 1.1.1.1&#xFF0C;&#x800C;&#x4E14;&#x6392;&#x5728;&#x7B2C;&#x4E00;&#x4E2A;</li>
<li>&#x7EBF;&#x7A0B; A &#x53D6;&#x51FA; 1.1.1.1</li>
<li>&#x7EBF;&#x7A0B; B &#x4ECE;&#x9891;&#x9053;&#x6C60;&#x5B50;&#x53D6; ip&#xFF0C;&#x6CA1;&#x53D6;&#x5230;&#xFF0C;&#x4ECE;&#x603B;&#x6C60;&#x5B50;&#x8865;&#x5145; ip &#x5230;&#x9891;&#x9053;&#x6C60;&#x5B50;&#xFF1A;<code>ZADD proxy_channel_abc_ips 0 1.1.1.1</code>&#xFF1B;&#x53D6;&#x51FA; 1.1.1.1</li>
<li>&#x7EBF;&#x7A0B; A &#x5F52;&#x8FD8; 1.1.1.1&#xFF1A;<code>ZADD proxy_channel_abc_ips 11 1.1.1.1</code></li>
<li>&#x7EBF;&#x7A0B; B &#x5F52;&#x8FD8; 1.1.1.1&#xFF1A;<code>ZADD proxy_channel_abc_ips 1 1.1.1.1</code></li>
</ol>
<p>&#x7B2C; 5 &#x6B65;&#x7ED3;&#x675F;&#x540E;&#xFF0C;ip 1.1.1.1 &#x7684;&#x8BA1;&#x6570;&#x88AB;&#x9519;&#x8BEF;&#x5730;&#x91CD;&#x7F6E;&#x4E3A; 1&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x6211;&#x4EEC;&#x9884;&#x671F;&#x7684; 12&#x3002;&#x4F7F;&#x7528; <code>INCR</code> &#x9009;&#x9879;&#x5C31;&#x53EF;&#x4EE5;&#x907F;&#x514D;&#x8FD9;&#x4E2A;&#x5C34;&#x5C2C;&#xFF0C;&#x5176;&#x5B9E;&#x8FD9;&#x4E5F;&#x53EA;&#x80FD;&#x4FDD;&#x8BC1;&#x6700;&#x7EC8;&#x8BA1;&#x6570;&#x6B63;&#x786E;&#xFF0C;&#x4E2D;&#x9014;&#x8FD8;&#x662F;&#x4F1A;&#x6709;&#x4E9B;&#x975E;&#x9884;&#x671F;&#x7684;&#x60C5;&#x51B5;&#xFF0C;&#x5982;&#xFF1A;</p>
<ol>
<li>&#x5728;&#x9891;&#x9053;&#x6C60;&#x5B50;&#x4E2D;&#x6709; 1.1.1.1&#xFF0C;&#x4F7F;&#x7528;&#x6B21;&#x6570;&#x4E3A; 10&#xFF0C;&#x8FD8;&#x6709; 2.2.2.2&#xFF0C;&#x4F7F;&#x7528;&#x6B21;&#x6570;&#x4E3A; 2&#xFF1B;&#x603B;&#x6C60;&#x5B50;&#x4E5F;&#x6709; 1.1.1.1&#xFF0C;&#x800C;&#x4E14;&#x6392;&#x5728;&#x7B2C;&#x4E00;&#x4E2A;</li>
<li>&#x7EBF;&#x7A0B; A &#x53D6;&#x51FA; 1.1.1.1</li>
<li>&#x7EBF;&#x7A0B; B &#x53D6;&#x51FA; 2.2.2.2</li>
<li>&#x7EBF;&#x7A0B; C &#x4ECE;&#x9891;&#x9053;&#x6C60;&#x5B50;&#x53D6; ip&#xFF0C;&#x6CA1;&#x53D6;&#x5230;&#xFF0C;&#x4ECE;&#x603B;&#x6C60;&#x5B50;&#x8865;&#x5145; ip &#x5230;&#x9891;&#x9053;&#x6C60;&#x5B50;&#xFF1A;<code>ZADD proxy_channel_abc_ips 0 1.1.1.1</code>&#xFF1B;&#x53D6;&#x51FA; 1.1.1.1</li>
<li>&#x7EBF;&#x7A0B; C &#x5F52;&#x8FD8; 1.1.1.1&#xFF1A;<code>ZADD proxy_channel_abc_ips INCR 1 1.1.1.1</code></li>
<li>&#x7EBF;&#x7A0B; B &#x5F52;&#x8FD8; 2.2.2.2&#xFF1A;<code>ZADD proxy_channel_abc_ips INCR 3 2.2.2.2</code></li>
<li>&#x7EBF;&#x7A0B; D &#x6765;&#x6C60;&#x5B50;&#x53D6; ip&#xFF0C;&#x6309;&#x4F7F;&#x7528;&#x6B21;&#x6570;&#x5C11;&#x7684;&#x88AB;&#x5206;&#x914D;&#x4E86; 1.1.1.1&#xFF0C;&#x8FD9;&#x5C31;&#x4E0D;&#x662F;&#x6211;&#x4EEC;&#x671F;&#x671B;&#x7684;&#xFF0C;1.1.1.1 &#x5B9E;&#x9645;&#x5DF2;&#x7ECF;&#x7528;&#x4E86; 12 &#x6B21;&#xFF0C;&#x6211;&#x4EEC;&#x66F4;&#x5E0C;&#x671B; 2.2.2.2 &#x88AB;&#x53D6;&#x51FA;</li>
</ol>
<p>&#x5982;&#x679C;&#x8981;&#x907F;&#x514D;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#xFF0C;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7C97;&#x66B4;&#x7684;&#x529E;&#x6CD5;&#x5C31;&#x662F;&#x589E;&#x52A0;&#x9891;&#x9053;&#x6C60;&#x5B50;&#x7684;&#x5BB9;&#x91CF;&#xFF0C;&#x8BA9; ip &#x6570;&#x6C38;&#x8FDC;&#x5927;&#x4E8E;&#x5E76;&#x53D1;&#x7684;&#x7EBF;&#x7A0B;&#x6570;&#x3002;</p>
<h3 id>&#x66F4;&#x65B0;</h3>
<p>&#x4E0E; ip &#x6709;&#x5173;&#x7684;&#x4E24;&#x4E2A;&#x5C5E;&#x6027;&#xFF1A;&#x5EF6;&#x65F6;&#xFF08;&#x722C;&#x53D6;&#x9875;&#x9762;&#x6240;&#x82B1;&#x7684;&#x65F6;&#x95F4;&#xFF09;&#x548C;&#x4F7F;&#x7528;&#x6B21;&#x6570;&#x3002;&#x4E0A;&#x9762;&#x53EA;&#x8BB2;&#x5230;&#x4E86;&#x6839;&#x636E;&#x5B83;&#x4EEC;&#x81EA;&#x52A8;&#x62E9;&#x4F18;&#xFF0C;&#x8FD9;&#x91CC;&#x7684;&#x5C31;&#x6765;&#x8BF4;&#x4E0B;&#x5B83;&#x4EEC;&#x662F;&#x5982;&#x4F55;&#x66F4;&#x65B0;&#x7684;&#x3002;&#x5EF6;&#x65F6;&#x548C;&#x4F7F;&#x7528;&#x6B21;&#x6570;&#x7684;&#x66F4;&#x65B0;&#x9700;&#x8981;&#x722C;&#x866B;&#x7A0B;&#x5E8F;&#x7684;&#x914D;&#x5408;&#xFF0C;&#x7A0B;&#x5E8F;&#x4E2D;&#x8981;&#x8BB0;&#x5F55;&#x65F6;&#x95F4;&#x548C;&#x9012;&#x589E;&#x4F7F;&#x7528;&#x6B21;&#x6570;&#xFF0C;&#x5728;&#x5F52;&#x8FD8; ip &#x65F6;&#x8981;&#x5C06;&#x6700;&#x65B0;&#x503C;&#x5E26;&#x56DE;&#x7ED9;&#x603B;&#x6C60;&#x5B50;&#x548C;&#x9891;&#x9053;&#x6C60;&#x5B50;&#x3002;&#x4E0A;&#x9762;&#x9891;&#x9053; ip &#x6C60;&#x7684;&#x4F8B;&#x5B50;&#x4E5F;&#x6709;&#x63D0;&#x53CA;&#xFF0C;&#x6BCF;&#x6B21;&#x5F52;&#x8FD8; ip &#x90FD;&#x8981;&#x5C06;&#x6700;&#x65B0;&#x7684;&#x4F7F;&#x7528;&#x6B21;&#x6570;&#x5E26;&#x4E0A;&#xFF0C;&#x5176;&#x6B21;&#x8FD8;&#x8981;&#x5C06; ip &#x7684;&#x5EF6;&#x65F6;&#x66F4;&#x65B0;&#x5230;&#x603B;&#x6C60;&#x5B50;&#x91CC;&#x9762;&#x3002;&#x5982;&#x679C;&#x5F52;&#x8FD8; ip &#x65F6;&#x51FA;&#x73B0;&#x4F7F;&#x7528;&#x5931;&#x8D25;&#x7684;&#x60C5;&#x51B5;&#xFF0C;&#x5C31;&#x8981;&#x5C06;&#x8BE5; ip &#x4ECE;&#x603B;&#x6C60;&#x5B50;&#x91CC;&#x5220;&#x9664;&#x6389;&#xFF0C;&#x4FDD;&#x8BC1;&#x8BE5; ip &#x4E0D;&#x4F1A;&#x518D;&#x88AB;&#x4F7F;&#x7528;&#xFF0C;&#x81F3;&#x4E8E;&#x5F53;&#x524D;&#x7684;&#x9891;&#x9053;&#x6C60;&#x4E0D;&#x7528;&#x5F52;&#x8FD8;&#x5C31;&#x884C;&#x4E86;&#x3002;&#x5176;&#x4ED6;&#x9891;&#x9053;&#x6C60;&#x4E0D;&#x4F5C;&#x4EFB;&#x4F55;&#x5904;&#x7406;&#xFF0C;&#x56E0;&#x4E3A; ip &#x5728;&#x5F53;&#x524D;&#x9891;&#x9053;&#x4E0D;&#x53EF;&#x7528;&#xFF0C;&#x4E00;&#x822C;&#x90FD;&#x662F;&#x56E0;&#x4E3A;&#x88AB;&#x5C4F;&#x853D;&#xFF0C;&#x5176;&#x4ED6;&#x9891;&#x9053;&#x4F9D;&#x7136;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#xFF0C;&#x5373;&#x4F7F;&#x786E;&#x5B9E;&#x90FD;&#x4E0D;&#x80FD;&#x4F7F;&#x7528;&#xFF0C;&#x4E5F;&#x4F1A;&#x5728;&#x5176;&#x4ED6;&#x9891;&#x9053;&#x5F52;&#x8FD8; ip &#x65F6;&#x88AB;&#x5220;&#x9664;&#x3002;</p>
<p>&#x8FD9;&#x4E24;&#x4E2A;&#x5C5E;&#x6027;&#x5176;&#x5B9E;&#x4E5F;&#x53EF;&#x4EE5;&#x90FD;&#x5728; Redis &#x4E2D;&#x66F4;&#x65B0;&#xFF0C;&#x5728;&#x83B7;&#x53D6; ip &#x65F6;&#xFF0C;&#x4F7F;&#x7528; <code>Hashs</code> &#x4FDD;&#x5B58; ip &#x5BF9;&#x5E94;&#x7684;&#x83B7;&#x53D6;&#x65F6;&#x95F4;&#x548C;&#x4F7F;&#x7528;&#x6B21;&#x6570;&#xFF1B;&#x5728;&#x5F52;&#x8FD8;&#x65F6;&#x4ECE; <code>Hashs</code> &#x4E2D;&#x53D6;&#x51FA;&#x65F6;&#x95F4;&#x8BA1;&#x7B97;&#x51FA;&#x5EF6;&#x65F6;&#xFF0C;&#x53D6;&#x51FA;&#x4F7F;&#x7528;&#x6B21;&#x6570;&#x5E76;&#x52A0; 1&#xFF0C;&#x518D;&#x5206;&#x522B;&#x66F4;&#x65B0;&#x5230;&#x603B;&#x6C60;&#x5B50;&#x548C;&#x9891;&#x9053;&#x6C60;&#x5B50;&#x4E2D;&#x3002;&#x800C;&#x4E14;&#x8FD9;&#x8FD8;&#x80FD;&#x907F;&#x514D;&#x4E0A;&#x9762;&#x63D0;&#x5230;&#x7684;&#x83B7;&#x53D6; ip &#x4E0D;&#x7B26;&#x5408;&#x9884;&#x671F;&#x7684;&#x95EE;&#x9898;&#x3002;</p>
<h2 id>&#x603B;&#x7ED3;</h2>
<p>&#x653E;&#x5728; Redis &#x4E2D;&#x66F4;&#x65B0;&#x7684;&#x65B9;&#x6CD5;&#x4E5F;&#x6709;&#x5F0A;&#x7AEF;&#xFF0C;&#x5EF6;&#x65F6;&#x4F1A;&#x5305;&#x542B;&#x83B7;&#x53D6;&#x548C;&#x5F52;&#x8FD8;&#x7684;&#x4F20;&#x8F93;&#x65F6;&#x95F4;&#xFF0C;&#x5982;&#x679C;&#x722C;&#x866B;&#x7A0B;&#x5E8F;&#x83B7;&#x53D6;&#x4E00;&#x4E2A; ip &#x591A;&#x6B21;&#x4F7F;&#x7528;&#xFF0C;&#x4F1A;&#x9020;&#x6210;&#x4F7F;&#x7528;&#x6B21;&#x6570;&#x7EDF;&#x8BA1;&#x504F;&#x5C11;&#x3002;&#x5F53;&#x7136;&#x4E5F;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5728;&#x7A0B;&#x5E8F;&#x4E2D;&#x591A;&#x6B21;&#x8C03;&#x7528; Redis &#x66F4;&#x65B0; ip &#x7684;&#x5C5E;&#x6027;&#x6765;&#x89E3;&#x51B3;&#xFF0C;&#x8FD9;&#x6837;&#x589E;&#x52A0;&#x4E86;&#x6574;&#x4E2A;&#x6D41;&#x7A0B;&#x7684;&#x590D;&#x6742;&#x6027;&#xFF0C;&#x9700;&#x8981;&#x81EA;&#x5DF1;&#x6743;&#x8861;&#x3002;</p>
<p>&#x4E2A;&#x4EBA;&#x8FD8;&#x662F;&#x503E;&#x5411;&#x5728;&#x7A0B;&#x5E8F;&#x4E2D;&#x8BB0;&#x5F55;&#xFF0C;&#x6700;&#x540E;&#x66F4;&#x65B0;&#x5230; Redis &#x4E2D;&#x3002;&#x8FD9;&#x4E2A;&#x65B9;&#x6848;&#x903B;&#x8F91;&#x786E;&#x5B9E;&#x4E0D;&#x591F;&#x4E25;&#x8C28;&#xFF0C;&#x4F46;&#x662F;&#x51FA;&#x73B0;&#x95EE;&#x9898;&#x4E5F;&#x4E0D;&#x4F1A;&#x5BFC;&#x81F4;&#x4E25;&#x91CD;&#x540E;&#x679C;&#x3002;&#x7A0B;&#x5E8F;&#x7684;&#x5065;&#x58EE;&#x6027;&#x4E5F;&#x4E0D;&#x662F;&#x4E0D;&#x5141;&#x8BB8;&#x51FA;&#x73B0; bug&#xFF0C;&#x800C;&#x662F;&#x51FA;&#x73B0; bug &#x6709;&#x5F88;&#x597D;&#x7684;&#x5BB9;&#x9519;&#x6027;&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Upload image non-blocking with alfred uploader workflow]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Markdown is a great language to write a document, and generate a good looking. But it is unpleasant when you insert a local image into your document. If I share the document including some local images with others, the images will be lost. So I should upload the images to</p>]]></description><link>https://iammapping.com/upload-image-non-blocking-with-alfred-uploader-workflow/</link><guid isPermaLink="false">6522cda9caa77d0fabe3ef40</guid><dc:creator><![CDATA[Iam Mapping]]></dc:creator><pubDate>Sun, 20 Nov 2016 14:15:13 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Markdown is a great language to write a document, and generate a good looking. But it is unpleasant when you insert a local image into your document. If I share the document including some local images with others, the images will be lost. So I should upload the images to a cloud storage provider at first, and copy back the access url into my document. It&apos;s so complicated and repetitive. The real terrible thing is to write a document, I want to insert a image, after I finished these fucking steps, back to the document, I have forgotten what to write.</p>
<p><a href="http://www.alfredapp.com/?ref=iammapping.com">Alfred</a> is a efficient tool for Mac. There is a great feature call <strong>Workflows</strong>, we can create a workflow to do the complicated and repetitive work. I&apos;m a heavy user of Alfred, I use it to find files, open apps, translate, calculate and so on. Only you can not think, no you can not do.</p>
<p>I can not stand to spend a lot of time waiting for the upload and copy again and again. So I create a workflow called <strong>Uploader</strong> to connect file input, image processing and url output.</p>
<p>With <strong>Uploader</strong>, if I want to insert a image while writing, use hotkey to open alfred, input &quot;upload&quot; keyword, select the image to upload, continue writing, just keep an eye on the upload success notification, paste the access url, that&apos;s all. My focus was always on the document I&apos;m writing, alfred only disturbed for 1 to 3 seconds.</p>
<p>The all images in this document was uploaded by Uploader  proudly. Now let me introduce Uploader to you, you can get it from <a href="https://github.com/iammapping/alfred-uploader?ref=iammapping.com">alfred-uploader</a>.</p>
<h2 id="alfreduploader">alfred-uploader</h2>
<p>An Alfred workflow to help you upload local images to cloud storage provider (just support <a href="https://www.upyun.com/?ref=iammapping.com">upyun</a> now), and get back the public access url.</p>
<p><img src="https://cdn.iammapping.com/2016/11/20/147965074335841960.png" alt="Uploader v1.0.0" loading="lazy"></p>
<h3 id="setup">Setup</h3>
<p>Download&#xA0;<a href="https://github.com/iammapping/alfred-uploader/releases?ref=iammapping.com">the latest release</a>&#xA0;and double-click the workflow file (with a <em>.alfredworkflow</em> extension). Alfred will install it automatically.</p>
<p>After installed, you can find it in <strong>Alfred Preferences -&gt; Workflows list</strong>.</p>
<p>Before we get started, we have to set some variables, click the &quot;<strong>[x]</strong>&quot; icon button specified with red arrow below.</p>
<p><img src="https://cdn.iammapping.com/2016/11/20/147963249017197318.png" alt loading="lazy"></p>
<p>Fill the variables into the right list on the pop-up modal,  then save.</p>
<p><img src="https://cdn.iammapping.com/2016/11/20/147963276083921517.png" alt loading="lazy"></p>
<h4 id="variables">Variables</h4>
<ul>
<li><code>UPLOAD_PROVIDER</code>
<ul>
<li><strong>Required</strong></li>
<li>The cloud storage provider, such as: S3, Upyun, Qiniu...</li>
<li>Just support <code>upyun</code> now, all provider name shoud be lower case</li>
</ul>
</li>
<li><code>UPLOAD_HISTORY_COUNT</code>
<ul>
<li><strong>Optional</strong>, Default is <code>50</code></li>
<li>The maximum number of records to save</li>
</ul>
</li>
<li>The provider specific variables
<ul>
<li><code>UPYUN_BUCKET</code>
<ul>
<li><strong>Required</strong></li>
<li>The service name created at <strong>Upyun Console</strong></li>
</ul>
</li>
<li><code>UPYUN_USER</code>
<ul>
<li><strong>Required</strong></li>
<li>The operator name</li>
<li>Make sure you have granted the operator reading and writing</li>
</ul>
</li>
<li><code>UPYUN_PWD</code>
<ul>
<li><strong>Required</strong></li>
<li>The operator password</li>
<li>Be careful, it saved as plain</li>
</ul>
</li>
<li><code>UPYUN_USE_STREAM</code>
<ul>
<li><strong>Optional</strong>, Default is <code>false</code></li>
<li>Whether enable stream mode</li>
<li>Upload with stream mode will save memory</li>
</ul>
</li>
<li><code>UPYUN_USE_RAW_FILENAME</code>
<ul>
<li><strong>Optional</strong>, Default is <code>fasle</code></li>
<li>Whether use the original filename</li>
<li>The image uploaded will be given a random numeric filename, looks like <em>147963249017197318.png</em>.</li>
<li>If <code>true</code>, the image upload with the original filename, but some special chars (space and ?#%:) will replace with &quot;_&quot;</li>
</ul>
</li>
<li><code>UPYUN_BASEURL</code>
<ul>
<li><strong>Optinal</strong>, Default is <code>http://{UPYUN_BUCKET}.b0.upaiyun.com</code></li>
<li>The base url of the access url</li>
<li>You can change to the domain of yourself, only when you have config the <strong>CNAME</strong> redirector</li>
</ul>
</li>
</ul>
</li>
</ul>
<blockquote>
<p>Attention: Don&apos;t export your secret variables, unless you want to share your storage.</p>
</blockquote>
<h3 id="usage">Usage</h3>
<p>Everything is ready. Let&apos;s upload.</p>
<h4 id="upload">Upload</h4>
<p>There are three ways to upload:</p>
<ol>
<li>
<p>Input &quot;upload&quot; keyword, pick a file.  You can also filter the files with query.<br>
<img src="https://cdn.iammapping.com/2016/11/20/147964465139413269.png" alt loading="lazy"></p>
</li>
<li>
<p>locate a file in Alfred, select &quot;Uploader&quot; operation<br>
<img src="https://cdn.iammapping.com/2016/11/20/147964477679258266.png" alt loading="lazy"><br>
&#x200B;</p>
</li>
<li>
<p>select files in Finder, press hotkey &quot;cmd+shift+s&quot;. I highly recommend this way, because it support multi files once.<br>
<img src="https://cdn.iammapping.com/2016/11/20/147964528913390042.png" alt loading="lazy"></p>
</li>
</ol>
<p>Once you receive a notification said &quot;&#x1F600;Image upload success&quot;, it means the local image has been uploaded to remote, and the access url is ready in your clipboard, you can paste it directly.</p>
<blockquote>
<p>Tips: The first way, if you select a file with &quot;alt (option)&quot; key pressing, the result url will wrap a markdown img tag (![]({url}))</p>
</blockquote>
<h4 id="uploaded">Uploaded</h4>
<p>Use &quot;uploaded&quot; keyword to lookup the uploaded images, keeping 50 records by default,  query filter alse support.</p>
<p><img src="https://cdn.iammapping.com/2016/11/20/147964637559652782.png" alt loading="lazy"></p>
<p>As shown above, you can see the access url, the original file path and the upload time. Once you select a image, the access url copied, then paste it to anywhere you want. From last tips learned, the &quot;alt&quot; key also works here.</p>
<h3 id="contribute">Contribute</h3>
<p>Send me a pull request, or commit an issue.</p>
<p>&#x1F449; <a href="https://github.com/iammapping/alfred-uploader?ref=iammapping.com">alfred-uploader</a></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[我们的打枪(工程师)文化]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p><img src="https://iammapping.com/content/images/2016/05/unnamed.jpg" alt="BIA3" loading="lazy"></p>
<p>&#x597D;&#x50CF;&#x5728;&#x6211;&#x4EEC;&#x56E2;&#x961F;&#x5EFA;&#x7ACB;&#x7684;&#x521D;&#x671F;&#xFF0C;&#x90A3;&#x8FD8;&#x662F;&#x4E24;&#x5E74;&#x591A;&#x524D;&#xFF0C;&#x5C31;&#x6709;&#x4E86;&#x6253;&#x67AA;&#x7684;&#x4F20;&#x7EDF;&#x3002;&#x5662;&#xFF0C;&#x8FD9;&#x91CC;&#x8981;&#x89E3;&#x91CA;&#x4E00;&#x4E0B;&#xFF0C;&#x8FD9;&#x4E2A;&#x6253;&#x67AA;&#x662F;&#x6307;&#x5728;&#x624B;&#x673A;&#x4E0A;</p>]]></description><link>https://iammapping.com/the-gun-for-the-guys/</link><guid isPermaLink="false">6522cda9caa77d0fabe3ef3f</guid><category><![CDATA[developer]]></category><category><![CDATA[packing problem]]></category><category><![CDATA[tesseract]]></category><dc:creator><![CDATA[Iam Mapping]]></dc:creator><pubDate>Sun, 29 May 2016 03:12:52 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><img src="https://iammapping.com/content/images/2016/05/unnamed.jpg" alt="BIA3" loading="lazy"></p>
<p>&#x597D;&#x50CF;&#x5728;&#x6211;&#x4EEC;&#x56E2;&#x961F;&#x5EFA;&#x7ACB;&#x7684;&#x521D;&#x671F;&#xFF0C;&#x90A3;&#x8FD8;&#x662F;&#x4E24;&#x5E74;&#x591A;&#x524D;&#xFF0C;&#x5C31;&#x6709;&#x4E86;&#x6253;&#x67AA;&#x7684;&#x4F20;&#x7EDF;&#x3002;&#x5662;&#xFF0C;&#x8FD9;&#x91CC;&#x8981;&#x89E3;&#x91CA;&#x4E00;&#x4E0B;&#xFF0C;&#x8FD9;&#x4E2A;&#x6253;&#x67AA;&#x662F;&#x6307;&#x5728;&#x624B;&#x673A;&#x4E0A;&#x7684;FPS(&#x7B2C;&#x4E00;&#x4EBA;&#x79F0;&#x5C04;&#x51FB;)&#x6E38;&#x620F;&#xFF0C;&#x4E0D;&#x662F;&#x90A3;&#x4E2A;&#x610F;&#x601D;&#x5566;&#x3002;&#x90A3;&#x65F6;&#x8FD8;&#x662F;&#x73A9;BIA2(&#x5144;&#x5F1F;&#x8FDE;)&#xFF0C;&#x8FD9;&#x4E2A;&#x6E38;&#x620F;&#x592A;&#x8001;&#x4E86;&#xFF0C;&#x4EE5;&#x81F3;&#x4E8E;&#x540E;&#x9762;IOS&#x5347;&#x7EA7;&#x540E;&#x6CA1;&#x6CD5;&#x73A9;&#xFF0C;&#x5B98;&#x65B9;&#x4E5F;&#x51FA;&#x4E86;BIA3&#xFF0C;&#x4F46;&#x662F;&#x8054;&#x673A;&#x4E0D;&#x662F;&#x8FD9;&#x4E2A;&#x6E38;&#x620F;&#x7684;&#x7279;&#x957F;&#xFF0C;&#x6240;&#x4EE5;&#x6709;&#x5F88;&#x957F;&#x7684;&#x4E00;&#x6BB5;&#x65F6;&#x95F4;&#xFF0C;&#x6253;&#x67AA;&#x6587;&#x5316;&#x9010;&#x6E10;&#x6D88;&#x9000;&#x4E86;&#x3002;&#x76F4;&#x5230;&#x6700;&#x8FD1;&#x4E24;&#x4E2A;&#x6708;&#xFF0C;&#x53D1;&#x73B0;CFM(&#x7A7F;&#x8D8A;&#x706B;&#x7EBF;&#x624B;&#x6E38;&#x7248;)&#x53EF;&#x4EE5;&#x8054;&#x673A;&#x5B9E;&#x65F6;PK&#xFF0C;&#x6211;&#x4EEC;&#x7684;&#x8FD9;&#x4E2A;&#x6587;&#x5316;&#x53C8;&#x6D6E;&#x51FA;&#x4E86;&#x6C34;&#x9762;&#x3002;&#x6BCF;&#x5929;&#x4E2D;&#x5348;&#x5403;&#x5B8C;&#x996D;&#x4F11;&#x606F;&#x7684;&#x65F6;&#x5019;&#x90FD;&#x8981;&#x6765;&#x4E2A;&#x4E09;&#x5C40;&#x4E24;&#x80DC;&#x3002;&#x4F60;&#x4EE5;&#x4E3A;&#x8FD9;&#x7BC7;&#x662F;&#x8981;&#x4ECB;&#x7ECD;CFM&#xFF0C;&#x90A3;&#x5C31;&#x771F;&#x7684;&#x9519;&#x4E86;&#xFF0C;&#x4E0B;&#x9762;&#x6211;&#x8981;&#x7ED9;&#x5927;&#x5BB6;&#x4ECB;&#x7ECD;&#x4E00;&#x4E0B;&#x6211;&#x4EEC;&#x6253;&#x67AA;&#x80CC;&#x540E;&#x7684;&#x90A3;&#x4E9B;&#x4E8B;&#xFF0C;&#x5176;&#x5B9E;&#x5C31;&#x662F;&#x6211;&#x4EEC;&#x7684;&#x6253;&#x67AA;&#x8BA1;&#x5206;&#x7CFB;&#x7EDF;&#x3002;</p>
<h2 id="10">&#x8BA1;&#x5206;&#x7CFB;&#x7EDF;1.0</h2>
<p>&#x8FD9;&#x4E2A;&#x8BA1;&#x5206;&#x7CFB;&#x7EDF;&#x7684;&#x53D1;&#x8D77;&#x4EBA;&#x662F;Johnny&#xFF0C;Johnny&#x559C;&#x6B22;&#x6570;&#x636E;&#xFF0C;&#x4EC0;&#x4E48;&#x90FD;&#x559C;&#x6B22;&#x641E;&#x4E2A;&#x62A5;&#x8868;&#xFF0C;&#x4ED6;&#x4E00;&#x5F00;&#x59CB;&#x7684;&#x60F3;&#x6CD5;&#x662F;&#x641E;&#x4E2A;Excel&#xFF0C;&#x628A;&#x6211;&#x4EEC;&#x6BCF;&#x5C40;&#x7684;&#x6BD4;&#x5206;&#x8BB0;&#x4E0B;&#x6765;&#xFF0C;&#x7136;&#x540E;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x6BCF;&#x4E2A;&#x4EBA;&#x7684;&#x53D1;&#x6325;&#x8D8B;&#x52BF;&#x548C;&#x6392;&#x540D;&#xFF1B;&#x518D;&#x4E00;&#x60F3;&#x8FD8;&#x662F;&#x641E;&#x4E2A;&#x7CFB;&#x7EDF;&#x5427;&#xFF0C;&#x6709;&#x7814;&#x7A76;Excel&#x7684;&#x5DE5;&#x592B;&#xFF0C;&#x7CFB;&#x7EDF;&#x90FD;&#x5199;&#x597D;&#x4E86;&#x3002;&#x7136;&#x540E;&#x542D;&#x54E7;&#x542D;&#x54E7;&#xFF0C;&#x8BA1;&#x5206;&#x7CFB;&#x7EDF;1.0&#x5C31;&#x51FA;&#x6765;&#x4E86;&#x3002;&#x5C31;&#x662F;&#x4E0B;&#x56FE;&#x7684;&#x6837;&#x5B50;&#xFF1A;</p>
<p><img src="https://iammapping.com/content/images/2016/05/Snip20160528_19.png" alt loading="lazy"></p>
<p>&#x8FD9;&#x4E2A;&#x5176;&#x5B9E;&#x8FD8;&#x662F;&#x4E24;&#x5E74;&#x524D;&#x7684;&#x90A3;&#x4E2A;&#x7248;&#x672C;&#x3002;&#x524D;&#x6BB5;&#x65F6;&#x95F4;Johnny&#x53C8;&#x52A0;&#x4E86;&#x4E00;&#x4E2A;&#x80DC;&#x7387;&#x699C;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x8C01;&#x8DDF;&#x8C01;&#x7EC4;&#x5408;&#x80DC;&#x7387;&#x66F4;&#x9AD8;&#xFF0C;&#x89C1;&#x4E0B;&#x56FE;&#xFF1A;</p>
<p><img src="https://iammapping.com/content/images/2016/05/Snip20160528_20.png" alt loading="lazy"></p>
<p>&#x6211;&#x4EEC;&#x6BCF;&#x6B21;&#x6253;&#x5B8C;&#x90FD;&#x8981;&#x770B;&#x4E0B;&#x6392;&#x540D;&#x6709;&#x6CA1;&#x6709;&#x53D8;&#x5316;&#xFF0C;&#x4E0D;&#x8FC7;&#x7B2C;&#x4E00;&#x540D;&#x5C31;&#x50CF;&#x4E00;&#x4E2A;bug&#x6837;&#x7684;&#x5B58;&#x5728;&#xFF0C;&#x6BCF;&#x4E2A;&#x6708;&#x8D5B;&#x7ED3;&#x675F;&#x603B;&#x80FD;&#x9AD8;&#x51FA;&#x7B2C;&#x4E8C;&#x540D;300&#x591A;&#x5206;&#xFF0C;&#x4ED6;&#x5C31;&#x662F;&#x6211;&#x4EEC;&#x7684;&#x201C;&#x5F55;&#x5206;&#x5458;&#x201D;&#x5C0F;&#x946B;&#x946B;&#xFF0C;&#x5F55;&#x5206;&#x662F;&#x7ED9;&#x4ED6;&#x6740;&#x6211;&#x4EEC;&#x8FD9;&#x4E48;&#x60E8;&#x70C8;&#x7684;&#x60E9;&#x7F5A;&#x3002;</p>
<h2 id="20">&#x8BA1;&#x5206;&#x7CFB;&#x7EDF;2.0</h2>
<p>1.0&#x7684;&#x7248;&#x672C;&#x5DF2;&#x7ECF;&#x53EF;&#x4EE5;&#x5F55;&#x6210;&#x7EE9;&#xFF0C;&#x770B;&#x6570;&#x636E;&#x4E86;&#xFF0C;&#x90A3;&#x600E;&#x4E48;&#x8FD8;&#x8981;2.0&#x7684;&#x7248;&#x672C;&#x3002;&#x8FD9;&#x662F;&#x4E2A;&#x597D;&#x95EE;&#x9898;&#x554A;&#xFF0C;&#x5C31;&#x50CF;&#x4F60;&#x95EE;&#x4F60;&#x4EEC;&#x4EA7;&#x54C1;&#x7ECF;&#x7406;&#x4E3A;&#x4EC0;&#x4E48;&#x53C8;&#x8981;&#x6539;&#x7248;&#x4E00;&#x6837;&#x3002;&#x8FD9;&#x65F6;&#x4F60;&#x4EEC;&#x4EA7;&#x54C1;&#x7ECF;&#x7406;&#x4F1A;&#x5E7D;&#x6028;&#x5730;&#x770B;&#x7740;&#x4F60;&#xFF1A;&#x5BA2;&#x6237;&#x9700;&#x8981;&#x554A;&#x3002;&#x6CA1;&#x9519;&#xFF0C;2.0&#x7248;&#x662F;&#x9700;&#x6C42;&#x9A71;&#x52A8;&#x7684;&#xFF0C;&#x53EA;&#x4E0D;&#x8FC7;&#x9700;&#x6C42;&#x65B9;&#x5C31;&#x662F;&#x6211;&#x4EEC;&#x81EA;&#x5DF1;&#x3002;</p>
<p>&#x5FD8;&#x8BB0;&#x8BF4;&#x4E86;&#xFF0C;&#x73B0;&#x5728;&#x6253;&#x67AA;&#x7684;&#x90FD;&#x662F;&#x6211;&#x4EEC;&#x7684;&#x5DE5;&#x7A0B;&#x5E08;&#xFF0C;&#x73B0;&#x5728;&#x6709;7&#x4E2A;&#x4EBA;&#x3002;&#x65E2;&#x7136;&#x8BF4;&#x5230;&#x8FD9;&#xFF0C;&#x6211;&#x5C31;&#x4ECB;&#x7ECD;&#x4E00;&#x4E0B;&#x8FD9;7&#x4E2A;guys&#xFF1A;</p>
<ul>
<li>Johnny&#xFF1A;&#x95EA;&#x95EA;&#x7684;&#x4EBA;&#x6C11;&#x5E01;&#x73A9;&#x5BB6;&#x5440;</li>
<li>&#x91D1;&#x521A;&#xFF1A;BIA&#x65F6;&#x4EE3;&#x7684;&#x67AD;&#x96C4;&#xFF0C;&#x73B0;&#x5728;&#x53EF;&#x4EE5;&#x5728;&#x7325;&#x7410;&#x7684;&#x89D2;&#x843D;&#x8E72;&#x5230;&#x6BD4;&#x8D5B;&#x7ED3;&#x675F;</li>
<li>&#x8D85;&#x4EBA;&#xFF1A;&#x76F8;&#x5F53;&#x751F;&#x731B;&#xFF0C;&#x603B;&#x80FD;&#x628A;&#x961F;&#x53CB;&#x5751;&#x5F97;&#x4E0D;&#x8981;&#x4E0D;&#x8981;</li>
<li>&#x6559;&#x7EC3;&#xFF1A;&#x72D9;&#x795E;&#xFF0C;&#x77AC;&#x72D9;&#x76F2;&#x72D9;&#x90FD;&#x4E0D;&#x5728;&#x8BDD;&#x4E0B;</li>
<li>&#x946B;&#x946B;&#xFF1A;&#x6700;&#x8BA8;&#x538C;&#x4F18;&#x79C0;&#x7684;&#x4EBA;&#x6BD4;&#x6211;&#x4EEC;&#x8FD8;&#x52AA;&#x529B;&#xFF0C;&#x5C31;&#x662F;&#x8BF4;&#x4ED6;&#xFF0C;&#x73B0;&#x5728;&#x7ECF;&#x5E38;&#x9650;&#x5236;&#x4ED6;&#x53EA;&#x7528;&#x624B;&#x67AA;</li>
<li>&#x5C0F;&#x65ED;&#xFF1A;&#x521B;&#x9020;&#x8FC7;&#x4E00;&#x6740;&#x96F6;&#x6B7B;&#x7684;&#x8F89;&#x714C;&#x6218;&#x7EE9;</li>
<li>&#x6211;&#xFF1A;&#x6211;&#x5C31;&#x662F;&#x6211;&#xFF0C;&#x662F;&#x989C;&#x8272;&#x4E0D;&#x4E00;&#x6837;&#x7684;&#x70DF;&#x706B;</li>
</ul>
<p>&#x6BCF;&#x6B21;&#x7EC4;&#x961F;&#x524D;&#xFF0C;&#x6211;&#x4EEC;&#x90FD;&#x8981;&#x7EA0;&#x7ED3;&#x4E2A;&#x4E00;&#x5206;&#x949F;&#xFF0C;&#x8C01;&#x90FD;&#x60F3;&#x62B1;&#x5C0F;&#x946B;&#x946B;&#x7684;&#x5927;&#x817F;&#xFF0C;&#x4F46;&#x662F;&#x817F;&#x53EA;&#x6709;&#x4E24;&#x6761;&#xFF0C;&#x603B;&#x8981;&#x5206;&#x51FA;&#x4E00;&#x4E2A;3v4&#x7684;&#x961F;&#x5F62;&#xFF0C;&#x5982;&#x679C;&#x662F;4v3&#xFF0C;&#x90A3;&#x5C31;&#x662F;&#x6709;&#x4EBA;&#x539A;&#x989C;&#x65E0;&#x803B;&#x62FD;&#x4F4F;&#x4E86;&#x4ED6;&#x7684;&#x7B2C;&#x4E09;&#x6761;&#x817F;&#xFF08;&#x6C61;~~&#xFF09;&#xFF0C;&#x7EA0;&#x7ED3;&#x5B8C;&#x5206;&#x7EC4;&#x53C8;&#x8981;&#x7EA0;&#x7ED3;&#x6253;&#x4EC0;&#x4E48;&#x56FE;&#x3002;&#x65E2;&#x7136;&#x90FD;&#x8FD9;&#x4E48;&#x7EA0;&#x7ED3;&#xFF0C;&#x5E72;&#x561B;&#x4E0D;&#x4EA4;&#x7ED9;&#x7A0B;&#x5E8F;&#x81EA;&#x52A8;&#x5206;&#x7EC4;&#xFF0C;&#x968F;&#x673A;&#x9009;&#x56FE;&#x3002;&#x4E8E;&#x662F;2.0&#x7248;&#x5C31;&#x589E;&#x52A0;&#x4E86;&#x8FD9;&#x4E24;&#x4E2A;&#x529F;&#x80FD;&#xFF1A;</p>
<p><img src="https://iammapping.com/content/images/2016/05/Snip20160528_18.png" alt loading="lazy"></p>
<p>&#x968F;&#x673A;&#x9009;&#x56FE;&#x5C31;&#x662F;&#x4ECE;&#x6570;&#x7EC4;&#x91CC;&#x968F;&#x673A;&#x6311;&#x4E00;&#x9879;&#xFF0C;&#x8FD9;&#x4E2A;&#x5F88;&#x7B80;&#x5355;&#x3002;&#x81F3;&#x4E8E;&#x81EA;&#x52A8;&#x5206;&#x7EC4;&#xFF0C;&#x8FD9;&#x771F;&#x7684;&#x662F;&#x4E2A;&#x96BE;&#x9898;&#x3002;</p>
<h3 id>&#x81EA;&#x52A8;&#x5206;&#x7EC4;</h3>
<p>&#x76F4;&#x63A5;&#x8DDF;&#x9009;&#x56FE;&#x4E00;&#x6837;&#xFF0C;&#x641E;&#x4E2A;&#x968F;&#x673A;&#x7684;&#x51FA;&#x6765;&#x4E0D;&#x5C31;&#x5B8C;&#x4E86;&#x4E48;&#x3002;&#x968F;&#x673A;&#x662F;&#x7B80;&#x5355;&#xFF0C;&#x4F46;&#x968F;&#x673A;&#x51FA;&#x6765;&#x7684;&#x961F;&#x5F62;&#x5F88;&#x6709;&#x53EF;&#x80FD;&#x4E00;&#x5BB6;&#x6B22;&#x559C;&#x4E00;&#x5BB6;&#x6101;&#xFF0C;&#x516C;&#x5E73;&#x5206;&#x7EC4;&#x624D;&#x662F;&#x89E3;&#x51B3;&#x4E4B;&#x9053;&#x3002;&#x600E;&#x4E48;&#x4FDD;&#x8BC1;&#x516C;&#x5E73;&#xFF0C;1.0&#x7248;&#x4E2D;&#x4E0D;&#x662F;&#x90FD;&#x8BB0;&#x5F55;&#x4E86;&#x6BD4;&#x8D5B;&#x6210;&#x7EE9;&#xFF0C;&#x6309;&#x6BD4;&#x8D5B;&#x6210;&#x7EE9;&#x5206;&#xFF0C;&#x8BA9;&#x4E24;&#x5BF9;&#x5206;&#x503C;&#x52A0;&#x548C;&#x76F8;&#x5DEE;&#x4E0D;&#x5927;&#x3002;&#x662F;&#x7684;&#xFF0C;&#x63CF;&#x8FF0;&#x8D77;&#x6765;&#x5C31;&#x662F;&#x8FD9;&#x4E48;&#x7B80;&#x5355;&#x7684;&#x4E00;&#x53E5;&#x8BDD;&#xFF0C;&#x8F6C;&#x6362;&#x6210;&#x7A0B;&#x5E8F;&#xFF0C;&#x771F;&#x662F;&#x4E00;&#x4E2A;&#x201C;&#x96BE;&#x9898;&#x201D;&#x3002;&#x8FD9;&#x5F88;&#x7C7B;&#x4F3C;&#x4E00;&#x4E2A;&#x7ECF;&#x5178;&#x7684;<a href="http://baike.baidu.com/view/158424.htm?ref=iammapping.com">NP&#x96BE;&#x9898;</a>(&#x770B;&#xFF0C;&#x6211;&#x6CA1;&#x552C;&#x4F60;&#x4EEC;&#x5427;)&#xFF0C;&#x5373;<a href="http://baike.baidu.com/view/5340477.htm?ref=iammapping.com">&#x4E00;&#x7EF4;&#x88C5;&#x7BB1;&#x95EE;&#x9898;</a>&#xFF0C;&#x6253;&#x4E2A;&#x6BD4;&#x65B9;&#xFF1A;</p>
<ol>
<li>&#x5047;&#x8BBE;&#x6240;&#x6709;&#x4EBA;&#x603B;&#x5206;&#x52A0;&#x8D77;&#x6765;&#x662F;100</li>
<li>&#x628A;&#x4E24;&#x961F;&#x770B;&#x6210;&#x4E24;&#x4E2A;&#x7BB1;&#x5B50;&#xFF0C;&#x6BCF;&#x4E2A;&#x7BB1;&#x5B50;&#x5BB9;&#x79EF;&#x90FD;&#x662F;50</li>
<li>&#x628A;&#x4E00;&#x4E2A;&#x7BB1;&#x5B50;&#x88C5;&#x6EE1;&#x5230;50&#xFF0C;&#x5269;&#x4E0B;&#x7684;&#x90FD;&#x88C5;&#x53E6;&#x4E00;&#x4E2A;&#x7BB1;&#x5B50;</li>
<li>&#x4E24;&#x961F;&#x603B;&#x5206;&#x5C31;&#x90FD;&#x662F;50&#x4E86;</li>
</ol>
<p>&#x770B;&#x8D77;&#x6765;&#x4E0D;&#x9519;&#x54E6;&#xFF0C;&#x4F46;&#x662F;&#x4E0A;&#x9762;&#x8BF4;&#x4E86;&#x662F;&#x7C7B;&#x4F3C;&#xFF0C;&#x90A3;&#x4E0D;&#x540C;&#x7684;&#x5730;&#x65B9;&#xFF1A;</p>
<ol>
<li>&#x4E24;&#x961F;&#x4E0D;&#x53EF;&#x80FD;&#x603B;&#x80FD;&#x5206;&#x6210;50:50</li>
<li>&#x600E;&#x4E48;&#x907F;&#x514D;1v6&#x8FD9;&#x79CD;&#x961F;&#x5F62;(&#x6709;&#x5C0F;&#x946B;&#x946B;&#x8FD9;&#x4E2A;bug)</li>
<li>&#x6210;&#x7EE9;&#x8FD8;&#x6709;&#x8D1F;&#x6570;&#x554A;&#xFF0C;&#x88C5;&#x7BB1;&#x7684;&#x5BB9;&#x79EF;&#x600E;&#x4E48;&#x80FD;&#x662F;&#x8D1F;&#x6570;</li>
</ol>
<p>&#x6240;&#x4EE5;&#x6211;&#x4EEC;&#x8981;&#x7ED9;&#x88C5;&#x7BB1;&#x95EE;&#x9898;&#x8FDB;&#x884C;&#x4E00;&#x4E9B;&#x8F6C;&#x6362;&#x548C;&#x9650;&#x5236;&#xFF0C;&#x5982;&#xFF1A;&#x5C06;&#x8D1F;&#x6570;&#x8865;&#x9F50;&#x6210;&#x6B63;&#x6570;&#xFF1B;&#x9650;&#x5236;&#x6BCF;&#x4E2A;&#x7BB1;&#x5B50;&#x81F3;&#x5C11;&#x88C5;3&#x4E2A;&#xFF0C;&#x6700;&#x591A;&#x88C5;4&#x4E2A;&#x3002;&#x5177;&#x4F53;&#x7B97;&#x6CD5;&#x53EF;&#x53C2;&#x8003;&#x6211;&#x7684;github&#xFF1A;<a href="https://github.com/iammapping/autoGroup?ref=iammapping.com">iammapping/autoGroup</a></p>
<p>&#x4F3C;&#x4E4E;&#x5230;&#x8FD9;&#x5E94;&#x8BE5;&#x7ED3;&#x675F;&#x4E86;&#xFF0C;&#x5982;&#x679C;&#x4F60;&#x8FD9;&#x4E48;&#x8BA4;&#x4E3A;&#xFF0C;&#x90A3;&#x5C31;&#x592A;&#x4F4E;&#x4F30;&#x6211;&#x4EEC;&#x5DE5;&#x7A0B;&#x5E08;&#x7684;&#x6298;&#x817E;&#x52B2;&#x4E86;&#x3002;&#x5728;2.0&#x4E2D;&#x8FD8;&#x52A0;&#x5165;&#x4E86;&#x4E00;&#x4E2A;&#x91CD;&#x91CF;&#x7EA7;&#x529F;&#x80FD;&#x2014;&#x2014;&#x81EA;&#x52A8;&#x5F55;&#x5206;&#x3002;</p>
<h3 id>&#x81EA;&#x52A8;&#x5F55;&#x5206;</h3>
<p>&#x6211;&#x4EEC;&#x7528;&#x5F55;&#x5206;&#x6765;&#x60E9;&#x7F5A;&#x5C0F;&#x946B;&#x946B;&#xFF0C;&#x6BCF;&#x5C40;&#x6253;&#x5B8C;&#x4ED6;&#x90FD;&#x4F1A;&#x628A;&#x6E38;&#x620F;&#x7ED3;&#x679C;&#x622A;&#x56FE;&#xFF0C;&#x5728;&#x5168;&#x90E8;&#x7ED3;&#x675F;&#x540E;&#xFF0C;&#x628A;&#x6210;&#x7EE9;&#x5F55;&#x5230;&#x8BA1;&#x5206;&#x7CFB;&#x7EDF;&#x91CC;&#x3002;&#x7F5A;&#x5728;&#x4ED6;&#x8EAB;&#xFF0C;&#x75DB;&#x5728;&#x6211;&#x4EEC;&#x5FC3;&#x5440;&#x3002;&#x75DB;&#x4E0D;&#x662F;&#x5FC3;&#x75BC;&#x4ED6;&#xFF0C;&#x662F;&#x8981;&#x7126;&#x6025;&#x5730;&#x7B49;&#x4ED6;&#x5F55;&#x5B8C;&#x6210;&#x7EE9;&#x770B;&#x6700;&#x65B0;&#x6392;&#x540D;&#x3002;&#x4EBA;&#x5DE5;&#x6765;&#x5F55;&#x4E0D;&#x4EC5;&#x6162;&#x8FD8;&#x5BB9;&#x6613;&#x72AF;&#x9519;&#xFF0C;&#x90A3;&#x5C31;&#x81EA;&#x52A8;&#x5316;&#x5427;&#x3002;</p>
<h4 id>&#x65B9;&#x6848;&#x9A8C;&#x8BC1;</h4>
<p>&#x8FD9;&#x91CC;&#x9762;&#x6700;&#x4E3B;&#x8981;&#x7684;&#x96BE;&#x70B9;&#x5C31;&#x662F;&#x5982;&#x4F55;&#x8BC6;&#x522B;&#x51FA;&#x622A;&#x56FE;&#x91CC;&#x7684;&#x540D;&#x5B57;&#x548C;&#x6BD4;&#x5206;&#xFF0C;&#x4E8E;&#x662F;&#x627E;&#x5230;&#x4E86;&#x5F00;&#x6E90;&#x7684;OCR&#x7A0B;&#x5E8F;<code>tesseract</code>&#xFF0C;&#x628A;&#x6574;&#x5F20;&#x622A;&#x56FE;&#x7ED9;&#x5B83;&#x8BC6;&#x522B;&#xFF1A;<br>
<img src="https://iammapping.com/content/images/2016/05/hh.png" alt loading="lazy"></p>
<pre><code>&gt; tesseract hh.png stdout -l eng+chi_sim
</code></pre>
<p>&#x7ED3;&#x679C;&#x8F93;&#x51FA;&#x4E86;&#x4E00;&#x5768;&#xFF0C;&#x6211;&#x7684;&#x5929;&#x5450;&#xFF0C;&#x771F;&#x7684;&#x662F;&#x4E00;&#x5768;&#xFF1A;</p>
<p><img src="https://iammapping.com/content/images/2016/05/Snip20160528_8.png" alt loading="lazy"></p>
<p>&#x8FD9;&#x6CA1;&#x529E;&#x6CD5;&#x89E3;&#x6790;&#x554A;&#x3002;&#x4E8E;&#x662F;&#x6211;&#x628A;&#x540D;&#x5B57;&#x548C;&#x6BD4;&#x5206;&#x5355;&#x72EC;&#x622A;&#x51FA;&#x6765;&#x7ED9;&#x5B83;&#x8BC6;&#x522B;&#xFF1A;</p>
<p><img src="https://iammapping.com/content/images/2016/05/Snip20160528_11.png" alt loading="lazy"></p>
<p>&#x54C7;&#x585E;&#xFF0C;&#x5B83;&#x8BA4;&#x51FA;&#x6765;&#x4E86;&#x3002;&#x786E;&#x5B9A;&#x8FD9;&#x4E2A;&#x65B9;&#x6848;&#x53EF;&#x884C;&#xFF0C;&#x90A3;&#x5C31;&#x53EF;&#x4EE5;&#x5F00;&#x5E72;&#x4E86;&#x3002;&#x4E0D;&#x4F1A;&#x5207;&#x56FE;&#x7684;&#x524D;&#x7AEF;&#x4E0D;&#x662F;&#x597D;&#x5DE5;&#x7A0B;&#x5E08;&#xFF0C;&#x5728;Fw&#x91CC;&#x6807;&#x8BB0;&#x4E86;&#x6BCF;&#x4E2A;&#x5207;&#x5272;&#x70B9;&#x7684;&#x533A;&#x57DF;&#xFF1A;</p>
<p><img src="https://iammapping.com/content/images/2016/05/Snip20160528_12-1.png" alt loading="lazy"></p>
<p>&#x8FD9;&#x91CC;&#x4E3A;&#x4E86;&#x907F;&#x514D;&#x4E00;&#x5F20;&#x56FE;&#x7247;&#x5B9A;&#x4F4D;&#x4E0D;&#x51C6;&#x786E;&#xFF0C;&#x62FF;&#x4E86;&#x591A;&#x5F20;&#x56FE;&#x7247;&#x8C03;&#x900F;&#x660E;&#x91CD;&#x53E0;&#x5728;&#x4E00;&#x8D77;&#xFF0C;&#x65B9;&#x4FBF;&#x627E;&#x51FA;&#x6BD4;&#x8F83;&#x51C6;&#x786E;&#x7684;&#x5B9A;&#x4F4D;&#x3002;</p>
<h4 id>&#x65B9;&#x6848;&#x5B9E;&#x65BD;</h4>
<p>&#x4ECE;&#x4E0A;&#x56FE;&#x4E2D;&#x5207;&#x7247;&#x5F97;&#x5230;&#x4F4D;&#x7F6E;&#x4FE1;&#x606F;&#xFF0C;&#x5B9A;&#x4E49;&#x6210;php&#x6570;&#x7EC4;&#xFF1A;</p>
<pre><code class="language-php">protected $imgMap = array(
	&apos;1334x750&apos; =&gt; array(
		&apos;score&apos; =&gt; array(
			&apos;left&apos; =&gt; array(468, 87, 66, 35),
			&apos;right&apos; =&gt; array(797, 87, 66, 35)
		),
		&apos;players&apos; =&gt; array(
			&apos;left&apos; =&gt; array(
				array(
					&apos;name&apos; =&gt; array(208, 176, 188, 27),
					&apos;score&apos; =&gt; array(353, 203, 90, 27)
				),
				array(
					&apos;name&apos; =&gt; array(208, 268, 188, 27),
					&apos;score&apos; =&gt; array(353, 295, 90, 27)
				),
				array(
					&apos;name&apos; =&gt; array(208, 360, 188, 27),
					&apos;score&apos; =&gt; array(353, 387, 90, 27)
				),
				array(
					&apos;name&apos; =&gt; array(208, 453, 188, 27),
					&apos;score&apos; =&gt; array(353, 480, 90, 27)
				),
				array(
					&apos;name&apos; =&gt; array(208, 547, 188, 27),
					&apos;score&apos; =&gt; array(353, 574, 90, 27)
				)
			),
			&apos;right&apos; =&gt; array(
				array(
					&apos;name&apos; =&gt; array(771, 176, 188, 27),
					&apos;score&apos; =&gt; array(920, 203, 90, 27)
				),
				array(
					&apos;name&apos; =&gt; array(771, 268, 188, 27),
					&apos;score&apos; =&gt; array(920, 295, 90, 27)
				),
				array(
					&apos;name&apos; =&gt; array(771, 360, 188, 27),
					&apos;score&apos; =&gt; array(920, 387, 90, 27)
				),
				array(
					&apos;name&apos; =&gt; array(771, 453, 188, 27),
					&apos;score&apos; =&gt; array(920, 480, 90, 27)
				),
				array(
					&apos;name&apos; =&gt; array(771, 547, 188, 27),
					&apos;score&apos; =&gt; array(920, 574, 90, 27)
				)
			)
		)
	)
);
</code></pre>
<p><code>1334x750</code>&#x662F;iphone6&#x622A;&#x56FE;&#x7684;&#x5C3A;&#x5BF8;&#xFF0C;&#x5982;&#x6709;&#x5FC5;&#x8981;&#x4E5F;&#x53EF;&#x4EE5;&#x6269;&#x5C55;&#x51FA;&#x5176;&#x4ED6;&#x5C3A;&#x5BF8;&#x7684;&#xFF0C;&#x4E0D;&#x8FC7;&#x6807;&#x8BB0;&#x4F4D;&#x7F6E;&#x4FE1;&#x606F;&#x771F;&#x662F;&#x4E2A;&#x4F53;&#x529B;&#x6D3B;&#x3002;</p>
<p>&#x5927;&#x81F4;&#x6B65;&#x9AA4;&#x5982;&#x4E0B;&#xFF1A;</p>
<ol>
<li>&#x63D0;&#x4F9B;&#x6BD4;&#x5206;&#x56FE;&#x7247;&#x4E0A;&#x4F20;&#x63A5;&#x53E3;</li>
<li>&#x4E0A;&#x4F20;&#x540E;&#x6309;&#x5B9A;&#x4E49;&#x597D;&#x7684;&#x7684;&#x4F4D;&#x7F6E;&#x5207;&#x5206;&#x56FE;&#x7247;</li>
<li>&#x4F7F;&#x7528;<code>tesseract splice.png stdout -l eng+chi_sim</code>&#x8BC6;&#x522B;&#x5207;&#x7247;&#x7684;&#x6587;&#x5B57;&#xFF0C;&#x53C2;&#x8003;&#xFF1A;<a href="https://github.com/thiagoalessio/tesseract-ocr-for-php?ref=iammapping.com">https://github.com/thiagoalessio/tesseract-ocr-for-php</a></li>
<li>&#x83B7;&#x53D6;&#x6BCF;&#x4E2A;&#x4F4D;&#x7F6E;&#x7684;&#x8BC6;&#x522B;&#x7ED3;&#x679C;&#x3002;&#x4F4D;&#x7F6E;1&#x548C;&#x4F4D;&#x7F6E;2&#x662F;&#x603B;&#x6BD4;&#x5206;&#xFF0C;&#x7528;&#x6765;&#x5224;&#x65AD;&#x6BD4;&#x8D5B;&#x8F93;&#x8D62;&#xFF1B;&#x4F4D;&#x7F6E;3&#x7528;&#x6765;&#x8BC6;&#x522B;&#x540D;&#x5B57;&#xFF1B;&#x4F4D;&#x7F6E;4&#x7528;&#x6765;&#x8BC6;&#x522B;&#x4E2A;&#x4EBA;&#x6BD4;&#x5206;&#xFF0C;&#x5982;17/11&#xFF0C;&#x5C06;17&#x8BB0;&#x4F5C;kill&#xFF0C;&#x5C06;11&#x8BB0;&#x4F5C;die</li>
<li>&#x4F4D;&#x7F6E;2&#x6570;&#x5B57;&#x66F4;&#x5927;&#xFF0C;&#x5219;&#x53F3;&#x8FB9;&#x6240;&#x6709;&#x7684;player&#x90FD;&#x6807;&#x8BB0;&#x4E3A;&#x80DC;&#x5229;&#xFF1B;&#x5982;&#x679C;&#x76F8;&#x7B49;&#xFF0C;&#x5219;&#x90FD;&#x4E0D;&#x4E0D;&#x6807;&#x8BB0;&#x80DC;&#x5229;&#xFF1B;&#x5426;&#x5219;&#xFF0C;&#x5DE6;&#x8FB9;&#x6240;&#x6709;&#x7684;player&#x90FD;&#x6807;&#x8BB0;&#x80DC;&#x5229;</li>
<li>&#x5C06;&#x8BC6;&#x522B;&#x7684;&#x7ED3;&#x679C;&#x81EA;&#x52A8;&#x586B;&#x5165;&#xFF0C;&#x53EF;&#x4EBA;&#x5DE5;&#x6821;&#x9A8C;&#x4FEE;&#x6539;</li>
</ol>
<p>&#x8BC6;&#x522B;&#x7684;&#x6838;&#x5FC3;&#x4EE3;&#x7801;&#x53C2;&#x8003;&#xFF1A;<a href="https://gist.github.com/iammapping/e0866fcc1f0ee0f600ad3185a9dbd801?ref=iammapping.com">Recognize_Score_Model</a>&#x3002;&#x5C06;&#x56FE;&#x7247;&#x7070;&#x5EA6;&#x5316;&#x548C;&#x53CD;&#x8272;&#x5BF9;&#x8BC6;&#x522B;&#x901F;&#x5EA6;&#x548C;&#x51C6;&#x786E;&#x5EA6;&#x90FD;&#x6CA1;&#x6709;&#x592A;&#x5927;&#x7684;&#x5F71;&#x54CD;&#xFF0C;&#x5C31;&#x53D6;&#x6D88;&#x4E86;&#x3002;</p>
<h4 id>&#x5B8C;&#x6210;&#xFF1F;</h4>
<p>&#x81EA;&#x52A8;&#x5F55;&#x5206;&#x7A0B;&#x5E8F;&#x4E00;&#x4E0A;&#xFF0C;&#x8BC6;&#x522B;&#x7684;&#x901F;&#x5EA6;&#x548C;&#x51C6;&#x786E;&#x5EA6;&#x90FD;&#x975E;&#x5E38;&#x60CA;&#x4EBA;&#xFF0C;&#x662F;&#x60CA;&#x4EBA;&#x7684;&#x6162;&#x548C;&#x60CA;&#x4EBA;&#x7684;&#x9519;&#x8BEF;&#xFF0C;&#x7528;&#x4E0B;&#x6765;&#x53D1;&#x73B0;&#x8FD8;&#x6CA1;&#x4EBA;&#x5DE5;&#x5F55;&#x5165;&#x7684;&#x6548;&#x7387;&#x9AD8;&#xFF0C;&#x4E0D;&#x8BF4;&#x540D;&#x5B57;&#xFF0C;&#x5C31;&#x8FDE;&#x6570;&#x5B57;3568&#x90FD;&#x5206;&#x4E0D;&#x6E05;&#xFF0C;&#x8FD9;&#x600E;&#x4E48;&#x80FD;&#x5FCD;&#x3002;&#x4E3B;&#x8981;&#x95EE;&#x9898;&#x8FD8;&#x662F;&#x51FA;&#x5728;&#x4E86;<code>tesseract</code>&#x4E0A;&#xFF0C;&#x4E00;&#x5B9A;&#x8981;&#x60F3;&#x529E;&#x6CD5;&#x4F18;&#x5316;&#x5B83;&#x7684;&#x6548;&#x7387;&#xFF0C;&#x597D;&#x5728;&#x5B83;&#x662F;&#x53EF;&#x4EE5;&#x8BAD;&#x7EC3;&#x7684;&#xFF0C;&#x4E8E;&#x662F;&#x6309;&#x7167;<a href="https://blog.cedric.ws/how-to-train-tesseract-301?ref=iammapping.com">&#x8FD9;&#x7BC7;&#x535A;&#x5BA2;</a>&#x628A;&#x5B83;&#x8BAD;&#x7EC3;&#x4E86;&#x4E00;&#x756A;&#x3002;&#x63D0;&#x53D6;&#x4E86;&#x4E00;&#x4E9B;&#x6837;&#x672C;&#xFF0C;&#x62FC;&#x5728;&#x4E00;&#x5F20;&#x56FE;&#x4E0A;&#x8BAD;&#x7EC3;&#xFF1A;</p>
<p><img src="https://iammapping.com/content/images/2016/05/Snip20160528_16.png" alt loading="lazy"></p>
<p>&#x8BAD;&#x7EC3;&#x987A;&#x5229;&#x7684;&#x8BDD;&#xFF0C;&#x4F1A;&#x5F97;&#x5230;&#x4E00;&#x4E2A;&#x8BAD;&#x7EC3;&#x597D;&#x7684;&#x6587;&#x4EF6;<code>cf.traineddata</code></p>
<p><img src="https://iammapping.com/content/images/2016/05/Snip20160528_17.png" alt loading="lazy"></p>
<p>&#x628A;&#x8FD9;&#x4E2A;&#x6587;&#x4EF6;&#x653E;&#x5230;<code>/usr/local/share/tessdata/</code>&#x4E2D;&#xFF0C;&#x5728;&#x8BC6;&#x522B;&#x7684;&#x65F6;&#x5019;&#x6307;&#x5B9A;<code>lang</code>&#x4E3A;<code>cf</code>&#x5C31;&#x53EF;&#x4EE5;&#x4E86;&#xFF0C;&#x7531;&#x4E8E;&#x6211;&#x4EEC;&#x8BC6;&#x522B;&#x7684;&#x56FE;&#x7247;&#x90FD;&#x662F;&#x5207;&#x597D;&#x7684;&#x5355;&#x4E2A;&#x5355;&#x8BCD;&#xFF0C;&#x53EF;&#x4EE5;&#x6307;&#x5B9A;<code>psm</code>&#x4E3A;<code>8</code>&#xFF0C;&#x5982;&#xFF1A;</p>
<pre><code>&gt; tesseract test.png stdout -l cf -psm 8
</code></pre>
<p>&#x8FD9;&#x6837;&#x4E00;&#x4F18;&#x5316;&#xFF0C;&#x8BC6;&#x522B;&#x7684;&#x901F;&#x5EA6;&#x548C;&#x51C6;&#x786E;&#x5EA6;&#x90FD;&#x975E;&#x5E38;&#x60CA;&#x4EBA;&#xFF0C;&#x8FD9;&#x6B21;&#x662F;&#x60CA;&#x4EBA;&#x7684;&#x5FEB;&#x548C;&#x60CA;&#x4EBA;&#x7684;&#x51C6;&#x786E;&#x3002;&#x901F;&#x5EA6;&#x53D8;&#x5FEB;&#x8FD9;&#x662F;&#x51FA;&#x4E4E;&#x610F;&#x6599;&#x7684;&#xFF0C;&#x4E0D;&#x8FC7;&#x518D;&#x4E00;&#x60F3;&#x4E5F;&#x5408;&#x60C5;&#x5408;&#x7406;&#xFF0C;&#x4E4B;&#x524D;&#x8981;&#x5728;&#x6574;&#x4E2A;&#x82F1;&#x6587;&#x5E93;&#x548C;&#x7B80;&#x4F53;&#x4E2D;&#x6587;&#x5E93;&#x5339;&#x914D;&#xFF0C;&#x73B0;&#x5728;&#x53EA;&#x8981;&#x5339;&#x914D;&#x6211;&#x4EEC;&#x8FD9;&#x51E0;&#x4E2A;&#x540D;&#x5B57;&#x548C;&#x6570;&#x5B57;&#x5C31;&#x53EF;&#x4EE5;&#x4E86;&#xFF1B;&#x51C6;&#x786E;&#x5EA6;&#x73B0;&#x5728;&#x53EF;&#x8FBE;&#x5230;99%&#xFF0C;&#x5B9E;&#x6D4B;&#x4E0B;&#x6765;&#x662F;&#x5B8C;&#x5168;&#x51C6;&#x786E;&#x7684;&#xFF0C;&#x6263;1&#x5206;&#x4E0D;&#x8BA9;&#x5B83;&#x9A84;&#x50B2;&#x5427;&#x3002;</p>
<h4 id>&#x771F;&#x7684;&#x5B8C;&#x6210;&#x4E86;</h4>
<p>&#x73B0;&#x5728;&#x6211;&#x4EEC;&#x6BD4;&#x8D5B;&#x7ED3;&#x675F;&#xFF0C;&#x5C0F;&#x946B;&#x946B;&#x53EA;&#x8981;&#x5728;&#x4ED6;iphone6&#x7684;safari&#x4E2D;&#x6253;&#x5F00;&#x4E0A;&#x4F20;&#x9875;&#x70B9;&#x51FB;&#x4E0A;&#x4F20;&#xFF0C;&#x52FE;&#x9009;&#x6BCF;&#x5C40;&#x7684;&#x622A;&#x56FE;&#x4E0A;&#x4F20;&#xFF0C;&#x7136;&#x540E;&#x9759;&#x5019;3s&#xFF0C;&#x4EE5;&#x524D;&#x624B;&#x5DE5;&#x53EF;&#x662F;&#x8981;1&#x5206;&#x591A;&#x949F;&#xFF0C;&#x6548;&#x7387;&#x63D0;&#x9AD8;&#x4E86;&#x81F3;&#x5C11;20&#x500D;&#xFF0C;&#x4E0A;&#x4F20;&#x6210;&#x529F;&#x540E;&#xFF0C;&#x6210;&#x7EE9;&#x5C31;&#x4F1A;&#x81EA;&#x52A8;&#x586B;&#x5165;&#x4E0B;&#x56FE;&#x7684;&#x8868;&#x5355;&#xFF0C;&#x8FD8;&#x505A;&#x4E86;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x6821;&#x9A8C;&#xFF0C;&#x5982;&#x679C;&#x8BC6;&#x522B;&#x6709;&#x8BEF;&#x5C31;&#x50CF;&#x5DE6;&#x8FB9;&#x51FA;&#x73B0;&#x7EA2;&#x8272;&#x8B66;&#x544A;&#xFF0C;&#x5982;&#x679C;&#x50CF;&#x53F3;&#x8FB9;&#x90FD;&#x662F;&#x7EFF;&#x8272;&#x90A3;&#x5C31;&#x5927;&#x53EF;&#x653E;&#x5FC3;&#x5730;&#x70B9;&#x4E0B;&#x7EFF;&#x8272;&#x6309;&#x94AE;&#x4FDD;&#x5B58;&#x6210;&#x7EE9;&#x4E86;&#x3002;</p>
<p><img src="https://iammapping.com/content/images/2016/05/Untitled-1.png" alt loading="lazy"></p>
<h2 id>&#x7ED3;&#x675F;</h2>
<p>&#x8BA1;&#x5206;&#x7CFB;&#x7EDF;1.0&#x548C;2.0&#x5DEE;&#x4E0D;&#x591A;&#x90FD;&#x662F;Johnny&#x548C;&#x6211;&#x5728;&#x4E1A;&#x4F59;&#x65F6;&#x95F4;&#x5F00;&#x53D1;&#xFF0C;2.0&#x5DEE;&#x4E0D;&#x591A;&#x82B1;&#x4E86;&#x6211;4-5&#x4E2A;&#x665A;&#x4E0A;&#x3002;&#x77ED;&#x671F;&#x6765;&#x770B;&#x6298;&#x817E;&#x8FD9;&#x4E9B;BB&#x6709;&#x610F;&#x601D;&#x4E48;&#xFF0C;&#x82B1;&#x4E86;&#x90A3;&#x4E48;&#x591A;&#x65F6;&#x95F4;&#xFF1B;&#x4F46;&#x957F;&#x671F;&#x6765;&#x770B;&#xFF0C;&#x8282;&#x7701;&#x7684;&#x65F6;&#x95F4;&#x66F4;&#x591A;&#x4E86;&#xFF0C;&#x4E2A;&#x4EBA;&#x7684;&#x89C1;&#x8BC6;&#x589E;&#x957F;&#x4E86;&#x3002;</p>
<p>&#x7231;&#x6298;&#x817E;&#xFF0C;&#x4F46;&#x4E0D;&#x778E;&#x6298;&#x817E;&#xFF1B;&#x5D07;&#x5C1A;&#x9AD8;&#x6548;&#xFF0C;&#x62D2;&#x7EDD;&#x91CD;&#x590D;&#x3002;&#x8FD9;&#x5C31;&#x662F;&#x6211;&#x4EEC;&#x7684;&#x5DE5;&#x7A0B;&#x5E08;&#x6587;&#x5316;&#xFF0C;&#x4E5F;&#x662F;&#x6211;&#x4EEC;&#x7684;&#x6253;&#x67AA;&#x6587;&#x5316;&#x3002;</p>
<p><small style="color:#B3B3B3">&#x9898;&#x56FE;&#x5F15;&#x81EA;&#xFF1A;BIA3</small></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Web缓存之HTTP指南]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>&#x5F53;Web&#x8BF7;&#x6C42;&#x53D1;&#x8D77;&#x65F6;&#xFF0C;&#x4F1A;&#x5148;&#x67E5;&#x770B;&#x672C;&#x5730;&#x662F;&#x5426;&#x6709;&#x8BE5;&#x8D44;&#x6E90;&#x5DF2;&#x7F13;&#x5B58;&#x7684;&#x526F;&#x672C;&#xFF0C;&#x5982;&#x679C;&#x6709;&#xFF0C;&#x5C31;&#x76F4;&#x63A5;&#x4ECE;&#x672C;&#x5730;&#x8BFB;&#x53D6;&#xFF0C;&#x800C;&#x4E0D;&#x9700;&#x8981;&#x4ECE;&#x539F;&#x59CB;&#x670D;&#x52A1;&#x5668;</p>]]></description><link>https://iammapping.com/the-http-guide-of-web-cache/</link><guid isPermaLink="false">6522cda9caa77d0fabe3ef3d</guid><category><![CDATA[Cache]]></category><category><![CDATA[HTTP]]></category><category><![CDATA[Web Performance]]></category><dc:creator><![CDATA[Iam Mapping]]></dc:creator><pubDate>Sat, 16 Apr 2016 18:14:20 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>&#x5F53;Web&#x8BF7;&#x6C42;&#x53D1;&#x8D77;&#x65F6;&#xFF0C;&#x4F1A;&#x5148;&#x67E5;&#x770B;&#x672C;&#x5730;&#x662F;&#x5426;&#x6709;&#x8BE5;&#x8D44;&#x6E90;&#x5DF2;&#x7F13;&#x5B58;&#x7684;&#x526F;&#x672C;&#xFF0C;&#x5982;&#x679C;&#x6709;&#xFF0C;&#x5C31;&#x76F4;&#x63A5;&#x4ECE;&#x672C;&#x5730;&#x8BFB;&#x53D6;&#xFF0C;&#x800C;&#x4E0D;&#x9700;&#x8981;&#x4ECE;&#x539F;&#x59CB;&#x670D;&#x52A1;&#x5668;&#x4E2D;&#x83B7;&#x53D6;&#x8BE5;&#x8D44;&#x6E90;&#x3002;&#x8FD9;&#x6837;&#x4E00;&#x6765;&#x53EF;&#x4EE5;&#x975E;&#x5E38;&#x6709;&#x6548;&#x5730;&#x51CF;&#x5C11;&#x5197;&#x4F59;&#x7684;&#x6570;&#x636E;&#x4F20;&#x8F93;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x51CF;&#x8F7B;&#x539F;&#x59CB;&#x670D;&#x52A1;&#x5668;&#x7684;&#x8BF7;&#x6C42;&#x538B;&#x529B;&#x3002;&#x4E0B;&#x56FE;&#x5C31;&#x662F;&#x4E00;&#x4E2A;&#x8BF7;&#x6C42;&#x7684;&#x795E;&#x5947;&#x4E4B;&#x65C5;&#xFF1A;</p>
<p><img src="https://iammapping.com/content/images/2016/04/web-cache_r2_c2.png" alt="request flow" loading="lazy"></p>
<p>&#x5DE6;&#x8FB9;&#x865A;&#x7EBF;&#x6846;&#x90FD;&#x662F;&#x5728;&#x7F13;&#x5B58;&#x5C42;&#x5B8C;&#x6210;&#xFF0C;&#x5927;&#x90E8;&#x5206;&#x60C5;&#x51B5;&#x4E0B;&#x662F;&#x6307;&#x6D4F;&#x89C8;&#x5668;&#x5185;&#x90E8;&#x7684;&#x7F13;&#x5B58;&#x673A;&#x5236;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x6307;&#x4E00;&#x4E9B;&#x7F13;&#x5B58;&#x4EE3;&#x7406;&#x670D;&#x52A1;&#xFF0C;&#x5982;CDN&#x7B49;&#xFF08;&#x672C;&#x6587;&#x4E0D;&#x8BA8;&#x8BBA;&#xFF09;&#xFF1B;&#x53F3;&#x8FB9;&#x865A;&#x7EBF;&#x6846;&#x90FD;&#x662F;&#x5728;&#x670D;&#x52A1;&#x5668;&#x7AEF;&#x5B8C;&#x6210;&#x7684;&#x3002;</p>
<p>&#x4E0B;&#x9762;&#x5C31;&#x6309;&#x7167;&#x8FD9;&#x4E2A;&#x6D41;&#x7A0B;&#x56FE;&#xFF0C;&#x5BA2;&#x6237;&#x7AEF;&#x4F7F;&#x7528;Chrome&#x6D4F;&#x89C8;&#x5668;&#x6253;&#x5F00;Google&#xFF08;&#x4F46;&#x613F;&#x4F60;&#x770B;&#x5230;&#x7684;&#x4E0D;&#x662F;<code>404 not found</code>&#xFF09;&#x6765;&#x6F14;&#x793A;&#x4E0D;&#x540C;&#x573A;&#x666F;&#x4E0B;&#x7684;&#x8BF7;&#x6C42;&#x3002;</p>
<h3 id>&#x7F13;&#x5B58;&#x672A;&#x547D;&#x4E2D;</h3>
<p><img src="https://iammapping.com/content/images/2016/04/web-cache_r2_c2-2.png" alt="cache miss" loading="lazy"></p>
<p>&#x8FD9;&#x662F;&#x6700;&#x7B80;&#x5355;&#x7684;&#x573A;&#x666F;&#xFF0C;&#x6240;&#x6709;&#x8D44;&#x6E90;&#x90FD;&#x662F;&#x4ECE;&#x670D;&#x52A1;&#x5668;&#x8FD4;&#x56DE;&#xFF0C;&#x5C31;&#x597D;&#x50CF;&#x6CA1;&#x6709;&#x7F13;&#x5B58;&#x8FD9;&#x4E00;&#x5C42;&#x4E00;&#x6837;&#x3002;&#x901A;&#x5E38;&#x662F;&#x8D44;&#x6E90;&#x4ECE;&#x6765;&#x6CA1;&#x6709;&#x8BF7;&#x6C42;&#x8FC7;&#xFF0C;&#x6216;&#x8005;&#x5728;&#x8BF7;&#x6C42;&#x5934;&#x90E8;&#x6307;&#x660E;&#x4E0D;&#x4F7F;&#x7528;&#x7F13;&#x5B58;&#x3002;Chrome&#x5F00;&#x53D1;&#x8005;&#x5DE5;&#x5177;&#x6709;&#x4E2A;&#x5F88;&#x65B9;&#x4FBF;&#x7684;&#x529F;&#x80FD;&#xFF0C;&#x5C31;&#x662F;&#x53EF;&#x4EE5;&#x8BBE;&#x7F6E;&#x5F53;&#x6253;&#x5F00;&#x5F00;&#x53D1;&#x8005;&#x5DE5;&#x5177;&#x65F6;&#x7981;&#x7528;&#x7F13;&#x5B58;&#xFF1A;</p>
<p><img src="https://iammapping.com/content/images/2016/04/Snip20160412_1.png" alt="chrome disable cache" loading="lazy"></p>
<p>&#x5B83;&#x7684;&#x539F;&#x7406;&#x5F88;&#x7B80;&#x5355;&#xFF0C;&#x5C31;&#x662F;&#x5728;&#x6BCF;&#x4E2A;&#x8BF7;&#x6C42;&#x524D;&#x52A0;&#x4E0A;&#x4E0D;&#x4F7F;&#x7528;&#x7F13;&#x5B58;&#x7684;&#x5934;&#x90E8;<code>cache-control: no-cache</code>&#x548C;<code>pragma: no-cache</code>&#xFF1A;</p>
<p><img src="https://iammapping.com/content/images/2016/04/Untitled-1_r1_c1.png" alt="no cache header" loading="lazy"></p>
<p>&#x5728;&#x7ED9;&#x9759;&#x6001;&#x6587;&#x4EF6;&#x6253;&#x7248;&#x672C;&#x53F7;&#x8FD8;&#x6CA1;&#x6D41;&#x884C;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x8FD9;&#x4E2A;&#x529E;&#x6CD5;&#x4E5F;&#x5E38;&#x7528;&#x6765;&#x66F4;&#x65B0;&#x9759;&#x6001;&#x6587;&#x4EF6;&#x7684;&#x7F13;&#x5B58;&#xFF0C;&#x5373;&#x7528;<code>Ajax</code>&#x8BBE;&#x7F6E;<code>cache-control: no-cache</code>&#x548C;<code>pragma: no-cache</code>&#x7684;&#x5934;&#x90E8;&#x5C06;&#x6240;&#x6709;&#x9759;&#x6001;&#x6587;&#x4EF6;&#x8BF7;&#x6C42;&#x4E00;&#x904D;&#x3002;</p>
<h3 id>&#x7F13;&#x5B58;&#x547D;&#x4E2D;</h3>
<p><img src="https://iammapping.com/content/images/2016/04/web-cache_r2_c3.png" alt="cache hit" loading="lazy"></p>
<p>&#x8FD9;&#x662F;&#x6211;&#x4EEC;&#x6700;&#x671F;&#x671B;&#x7684;&#x7ED3;&#x679C;&#x3002;&#x4ECE;&#x4E0A;&#x56FE;&#x770B;&#x8FD9;&#x4E2A;&#x65F6;&#x5019;&#x6CA1;&#x6709;&#x670D;&#x52A1;&#x5668;&#x4EC0;&#x4E48;&#x4E8B;&#xFF0C;&#x5982;&#x679C;&#x662F;&#x5168;&#x9759;&#x6001;&#x5185;&#x5BB9;&#xFF0C;&#x800C;&#x4E14;&#x5DF2;&#x88AB;&#x5168;&#x7F13;&#x5B58;&#xFF0C;&#x5373;&#x4F7F;&#x6CA1;&#x6709;&#x7F51;&#x7EDC;&#x8FDE;&#x63A5;&#x4E5F;&#x53EF;&#x4EE5;&#x6B63;&#x5E38;&#x8BBF;&#x95EE;&#x3002;</p>
<h4 id>&#x662F;&#x5426;&#x7F13;&#x5B58;</h4>
<p>&#x6D4F;&#x89C8;&#x5668;&#x5BF9;&#x8BF7;&#x6C42;&#x8FC7;&#x7684;&#x8D44;&#x6E90;&#x9ED8;&#x8BA4;&#x90FD;&#x4F1A;&#x6309;&#x8BF7;&#x6C42;url&#x7F13;&#x5B58;&#x8D77;&#x6765;&#xFF0C;&#x8FD9;&#x6837;&#x518D;&#x6B21;&#x8BF7;&#x6C42;&#x65F6;&#x5C31;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x8FD4;&#x56DE;&#x7F13;&#x5B58;&#x7684;&#x5BF9;&#x8C61;&#x3002;</p>
<p><img src="https://iammapping.com/content/images/2016/04/Snip20160417_7.png" alt="chrome view http cache" loading="lazy"></p>
<p>&#x5373;&#x4F7F;&#x8BBE;&#x7F6E;&#x4E86;<code>cache-control: no-cache</code>&#x548C;<code>pragma: no-cache</code>&#x5934;&#x90E8;&#x4E5F;&#x4F9D;&#x7136;&#x4F1A;&#x7F13;&#x5B58;&#xFF0C;&#x9664;&#x975E;&#x54CD;&#x5E94;&#x5934;&#x90E8;&#x8BBE;&#x7F6E;&#x4E86;<code>cache-control: no-store</code>&#x5C31;&#x4E0D;&#x4F1A;&#x5C06;&#x8BE5;&#x8D44;&#x6E90;&#x7F13;&#x5B58;&#x3002;</p>
<h4 id>&#x662F;&#x5426;&#x8FC7;&#x671F;</h4>
<p>&#x8D44;&#x6E90;&#x4E0D;&#x662F;&#x521B;&#x5EFA;&#x597D;&#x5C31;&#x6C38;&#x8FDC;&#x4E0D;&#x4F1A;&#x518D;&#x53D8;&#x66F4;&#xFF0C;&#x670D;&#x52A1;&#x5668;&#x7AEF;&#x4E3A;&#x9632;&#x6B62;&#x7F13;&#x5B58;&#x7684;&#x8D44;&#x6E90;&#x4E0E;&#x6700;&#x65B0;&#x7248;&#x4E0D;&#x4E00;&#x81F4;&#xFF0C;&#x5C31;&#x4F1A;&#x7ED9;&#x8FD9;&#x4E9B;&#x8D44;&#x6E90;&#x8BBE;&#x7F6E;&#x4E00;&#x4E2A;&#x8FC7;&#x671F;&#x65F6;&#x95F4;&#x7684;&#x54CD;&#x5E94;&#x5934;&#x90E8;&#xFF0C;&#x7F13;&#x5B58;&#x5C31;&#x4F1A;&#x6309;&#x7167;&#x8FD9;&#x4E2A;&#x8FC7;&#x671F;&#x65F6;&#x95F4;&#x5B58;&#x653E;&#x8D44;&#x6E90;&#xFF0C;&#x4E00;&#x65E6;&#x8FC7;&#x671F;&#xFF0C;&#x5C31;&#x4F1A;&#x8DDF;&#x670D;&#x52A1;&#x5668;&#x6821;&#x9A8C;&#xFF0C;&#x68C0;&#x67E5;&#x8FD9;&#x4E2A;&#x8D44;&#x6E90;&#x662F;&#x5426;&#x53D8;&#x66F4;&#xFF0C;&#x5982;&#x679C;&#x6709;&#x53D8;&#x66F4;&#xFF0C;&#x5C31;&#x83B7;&#x53D6;&#x6700;&#x65B0;&#x7248;&#x3002;</p>
<p>&#x8FC7;&#x671F;&#x65F6;&#x95F4;&#x53EF;&#x4EE5;&#x7531;HTTP/1.0+&#x7684;<code>Expires</code>&#x5934;&#x90E8;&#x548C;HTTP/1.1&#x7684;<code>Cache-Control: max-age</code>&#x5934;&#x90E8;&#x6765;&#x6307;&#x5B9A;&#x3002;&#x524D;&#x8005;&#x662F;&#x8BBE;&#x7F6E;&#x4E00;&#x4E2A;GMT&#x7684;&#x7EDD;&#x5BF9;&#x8FC7;&#x671F;&#x65F6;&#x95F4;&#xFF0C;&#x5982;&#xFF1A;<code>Expires: Wed, 20 Apr 2016, 09:11:33 GMT</code>&#xFF1B;&#x540E;&#x8005;&#x662F;&#x8BBE;&#x7F6E;&#x4E00;&#x4E2A;&#x76F8;&#x5BF9;&#x4E8E;&#x8D44;&#x6E90;&#x7B2C;&#x4E00;&#x6B21;&#x521B;&#x5EFA;&#x7684;&#x5B58;&#x6D3B;&#x65F6;&#x95F4;&#xFF08;&#x5355;&#x4F4D;&#x4E3A;&#x79D2;&#xFF09;&#xFF0C;&#x5982;&#xFF1A;<code>Cache-Control: max-age=3600</code>&#xFF0C;&#x5C31;&#x8868;&#x793A;&#x5728;&#x4E00;&#x5C0F;&#x65F6;&#x540E;&#x8FC7;&#x671F;&#x3002;</p>
<p>&#x7531;&#x4E0A;&#x53EF;&#x77E5;&#xFF0C;&#x7F13;&#x5B58;&#x547D;&#x4E2D;&#x9700;&#x8981;&#x6EE1;&#x8DB3;&#x4E24;&#x4E2A;&#x6761;&#x4EF6;&#xFF1A;</p>
<ol>
<li>&#x5DF2;&#x7F13;&#x5B58;</li>
<li>&#x7F13;&#x5B58;&#x6CA1;&#x6709;&#x8FC7;&#x671F;</li>
</ol>
<p><img src="https://iammapping.com/content/images/2016/04/Snip20160417_8.png" alt loading="lazy"></p>
<p>&#x547D;&#x4E2D;&#x7F13;&#x5B58;&#xFF0C;Chrome&#x5F00;&#x53D1;&#x5DE5;&#x5177;&#x4F1A;&#x6807;&#x8BB0;&#x51FA;<code>from cache</code>&#xFF0C;&#x800C;&#x4E14;<code>request</code>&#x8BF7;&#x6C42;&#x4F53;&#x4E5F;&#x6CA1;&#x90A3;&#x4E48;&#x590D;&#x6742;&#x4E86;&#x1F604; &#x3002;</p>
<h3 id>&#x7F13;&#x5B58;&#x518D;&#x9A8C;&#x8BC1;&#x547D;&#x4E2D;</h3>
<p><img src="https://iammapping.com/content/images/2016/04/web-cache_r2_c3-1.png" alt="cache revalidation hit" loading="lazy"></p>
<p>&#x4E0A;&#x4E00;&#x573A;&#x666F;&#x4E2D;&#x63D0;&#x5230;&#x7F13;&#x5B58;&#x8D44;&#x6E90;&#x90FD;&#x6709;&#x4E00;&#x4E2A;&#x8FC7;&#x671F;&#x65F6;&#x95F4;&#xFF0C;&#x5728;&#x5F53;&#x524D;&#x65F6;&#x95F4;&#x8D85;&#x8FC7;&#x8FD9;&#x4E2A;&#x8FC7;&#x671F;&#x65F6;&#x95F4;&#x540E;&#xFF0C;&#x5BA2;&#x6237;&#x7AEF;&#x5C31;&#x4E0D;&#x786E;&#x5B9A;&#x8FD9;&#x4E2A;&#x8D44;&#x6E90;&#x662F;&#x5426;&#x53EF;&#x4FE1;&#x4E86;&#xFF0C;&#x4E8E;&#x662F;&#x8981;&#x8BE2;&#x95EE;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x8FD9;&#x65F6;&#x4F1A;&#x53D1;&#x4E00;&#x4E2A;<code>If-Modified-Since</code>&#x5934;&#x90E8;&#xFF0C;&#x5E76;&#x5E26;&#x4E0A;&#x7F13;&#x5B58;&#x597D;&#x7684;&#x8D44;&#x6E90;&#x6700;&#x540E;&#x4FEE;&#x6539;&#x65F6;&#x95F4;&#xFF08;&#x8FD9;&#x4E2A;&#x65F6;&#x95F4;&#x662F;&#x670D;&#x52A1;&#x5668;&#x7684;&#x54CD;&#x5E94;&#x5934;&#x90E8;<code>Last-Modified</code>&#xFF09;&#xFF0C;&#x5982;&#xFF1A;<code>If-Modified-Since: Wed, 13 Apr 2016, 09:11:33 GMT</code>&#x3002;&#x670D;&#x52A1;&#x5668;&#x6536;&#x5230;&#x8BF7;&#x6C42;&#x540E;&#xFF0C;&#x5F53;&#x53D1;&#x73B0;&#x6709;<code>If-Modified-Since</code>&#x5934;&#x90E8;&#x65F6;&#xFF0C;&#x4F1A;&#x5C06;&#x8BE5;&#x65F6;&#x95F4;&#x4E0E;&#x670D;&#x52A1;&#x5668;&#x7AEF;&#x8BE5;&#x8D44;&#x6E90;&#x7684;&#x6700;&#x540E;&#x4FEE;&#x6539;&#x5BF9;&#x6BD4;&#xFF0C;&#x5982;&#x679C;&#x76F8;&#x7B49;&#xFF0C;&#x5C31;&#x4F1A;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x5C0F;&#x7684;&#x54CD;&#x5E94;&#x4F53;&#xFF0C;&#x5373;&#xFF1A;<code>304 Not Modified</code>&#xFF1B;&#x800C;&#x4E0D;&#x7528;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x6BD4;&#x8F83;&#x5927;&#x7684;&#x5B8C;&#x6574;&#x8D44;&#x6E90;&#x3002;&#x7F13;&#x5B58;&#x6536;&#x5230;<code>304 Not Modified</code>&#x540E;&#xFF0C;&#x5C31;&#x77E5;&#x9053;&#x8FD9;&#x4E2A;&#x8D44;&#x6E90;&#x6CA1;&#x6709;&#x53D8;&#x66F4;&#xFF0C;&#x8FD8;&#x53EF;&#x4EE5;&#x7EE7;&#x7EED;&#x4F7F;&#x7528;&#xFF0C;&#x4E8E;&#x662F;&#x4FEE;&#x6539;&#x4E00;&#x4E0B;&#x8FC7;&#x671F;&#x65F6;&#x95F4;&#xFF0C;&#x7136;&#x540E;&#x5F53;&#x4EC0;&#x4E48;&#x90FD;&#x6CA1;&#x53D1;&#x751F;&#x8FC7;&#x3002;</p>
<p>&#x8FD9;&#x4E2A;&#x573A;&#x666F;&#xFF0C;&#x4E5F;&#x53EB;&#x4F5C;&#x201C;&#x7F13;&#x6162;&#x547D;&#x4E2D;&#x201D;&#xFF0C;&#x867D;&#x7136;&#x6709;&#x4E0E;&#x670D;&#x52A1;&#x5668;&#x901A;&#x4FE1;&#xFF0C;&#x4F46;&#x662F;&#x4E00;&#x65E6;&#x547D;&#x4E2D;&#xFF0C;&#x4F9D;&#x7136;&#x80FD;&#x8282;&#x7701;&#x4E0D;&#x5C11;&#x7684;&#x5E26;&#x5BBD;&#x8D44;&#x6E90;&#x3002;</p>
<p>&#x7528;&#x6700;&#x540E;&#x4FEE;&#x6539;&#x65F6;&#x95F4;&#x4F5C;&#x4E3A;&#x8BC4;&#x5224;&#x8D44;&#x6E90;&#x53D8;&#x66F4;&#x7684;&#x552F;&#x4E00;&#x6807;&#x51C6;&#xFF0C;&#x8FD9;&#x663E;&#x7136;&#x662F;&#x4E0D;&#x4E25;&#x8C28;&#x7684;&#xFF0C;&#x6709;&#x7684;&#x8D44;&#x6E90;&#x5728;&#x670D;&#x52A1;&#x5668;&#x7AEF;&#x5B9A;&#x65F6;&#x751F;&#x6210;&#xFF0C;&#x4FEE;&#x6539;&#x65F6;&#x95F4;&#x4E00;&#x76F4;&#x5728;&#x53D8;&#xFF0C;&#x4F46;&#x5185;&#x5BB9;&#x4E0D;&#x4E00;&#x5B9A;&#x53D8;&#x5316;&#x3002;&#x8FD9;&#x65F6;&#x53EF;&#x4EE5;&#x7528;<code>ETag</code>&#x548C;<code>If-None-Match</code>&#x66FF;&#x4EE3;&#x4E0A;&#x9762;&#x7684;<code>Last-Modified</code>&#x548C;<code>If-Modified-Since</code>&#xFF0C;<code>ETag</code>&#x548C;<code>Last-Modified</code>&#x4E5F;&#x53EF;&#x4EE5;&#x540C;&#x65F6;&#x8BBE;&#x7F6E;&#xFF0C;&#x540C;&#x65F6;&#x9A8C;&#x8BC1;&#x3002;<code>ETag</code>&#x4E00;&#x822C;&#x7528;&#x6765;&#x8BBE;&#x7F6E;&#x6587;&#x4EF6;&#x7684;&#x7248;&#x672C;&#x53F7;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x6587;&#x4EF6;<code>md5</code>&#x503C;&#xFF0C;&#x5982;<code>ETag: &quot;c9f8b79751fe3b975999de6cd82759ba&quot;</code>&#x3002;</p>
<h3 id>&#x7F13;&#x5B58;&#x518D;&#x9A8C;&#x8BC1;&#x672A;&#x547D;&#x4E2D;</h3>
<p><img src="https://iammapping.com/content/images/2016/04/web-cache_r2_c4.png" alt="cache revalidation miss" loading="lazy"></p>
<p>&#x8FD9;&#x4E2A;&#x573A;&#x666F;&#x4E0E;&#x4E0A;&#x4E00;&#x4E2A;&#x7C7B;&#x4F3C;&#xFF0C;&#x53EA;&#x662F;&#x5728;&#x9A8C;&#x8BC1;&#x53D8;&#x66F4;&#x8FD9;&#x4E00;&#x6B65;&#x51FA;&#x73B0;&#x4E0D;&#x76F8;&#x7B49;&#x7684;&#x7ED3;&#x679C;&#x3002;&#x8FD9;&#x65F6;&#x670D;&#x52A1;&#x5668;&#x4F1A;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x5B8C;&#x6574;&#x7684;<code>200</code>&#x54CD;&#x5E94;&#x4F53;&#xFF0C;&#x5E76;&#x5E26;&#x4E0A;&#x6700;&#x65B0;&#x7684;<code>Last-Modified</code>&#x548C;<code>ETag</code>(&#x5982;&#x679C;&#x6709;&#x8BBE;&#x7F6E;)&#xFF0C;&#x7F13;&#x5B58;&#x4F1A;&#x5C06;&#x526F;&#x672C;&#x66F4;&#x65B0;&#x7136;&#x540E;&#x4F20;&#x9012;&#x7ED9;&#x5BA2;&#x6237;&#x7AEF;&#x3002;</p>
<h2 id>&#x603B;&#x7ED3;</h2>
<p>&#x672C;&#x6587;&#x4E3B;&#x8981;&#x8BB2;&#x89E3;&#x57FA;&#x4E8E;http&#x534F;&#x8BAE;&#x7684;Web&#x7F13;&#x5B58;&#x662F;&#x600E;&#x4E48;&#x56DE;&#x4E8B;&#xFF0C;&#x5185;&#x5BB9;&#x5927;&#x91CF;&#x53C2;&#x8003;&#x81EA;&#x300A;HTTP&#x6743;&#x5A01;&#x6307;&#x5357;--&#x7B2C;7&#x7AE0; &#x7F13;&#x5B58;&#x300B;&#x3002;&#x7F13;&#x5B58;&#x662F;&#x628A;&#x53CC;&#x5203;&#x5251;&#xFF0C;&#x7528;&#x5F97;&#x597D;&#x53EF;&#x4EE5;&#x975E;&#x5E38;&#x663E;&#x8457;&#x63D0;&#x5347;&#x6027;&#x80FD;&#xFF0C;&#x7528;&#x5F97;&#x4E0D;&#x597D;&#x8BF7;&#x5237;&#x65B0;&#x6D4F;&#x89C8;&#x5668;&#x1F613; &#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[如何使用Node.js的原生Addons提升性能(译)]]></title><description><![CDATA[<!--kg-card-begin: markdown--><blockquote>
<p>&#x539F;&#x6587;&#xFF1A;<a href="https://medium.com/@devlucky/how-to-get-a-performance-boost-using-node-js-native-addons-fd3a24719c85?ref=iammapping.com#.ok93vvbbu">How to get a performance boost using Node.js native addons</a></p>
</blockquote>
<p><img src="https://iammapping.com/content/images/2016/03/1-T5rMwM8edXuILUrew2YHxw.jpeg" alt loading="lazy"></p>
<p>&#x4E5F;&#x8BB8;&#x4F60;&#x5DF2;&#x7ECF;&#x542C;&#x8BF4;&#x8FC7;&#x4E0A;&#x5343;&#x6B21;&#xFF0C;&#x4F46;&#x6211;&#x4ECA;&#x5929;&#x8981;&#x5411;&#x4F60;&#x5C55;&#x793A;&#x4EC0;&#x4E48;&#x662F;Node.js&#x7684;&#x539F;&#x751F;&#x6A21;&#x5757;&#xFF0C;&#x4EE5;&#x53CA;&#x4F60;&#x4E3A;</p>]]></description><link>https://iammapping.com/how-to-get-a-performance-boost-using-node-js-native-addons/</link><guid isPermaLink="false">6522cda9caa77d0fabe3ef3c</guid><category><![CDATA[NodeJs]]></category><category><![CDATA[Javascript]]></category><category><![CDATA[Performance]]></category><dc:creator><![CDATA[Iam Mapping]]></dc:creator><pubDate>Tue, 22 Mar 2016 15:07:15 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><blockquote>
<p>&#x539F;&#x6587;&#xFF1A;<a href="https://medium.com/@devlucky/how-to-get-a-performance-boost-using-node-js-native-addons-fd3a24719c85?ref=iammapping.com#.ok93vvbbu">How to get a performance boost using Node.js native addons</a></p>
</blockquote>
<p><img src="https://iammapping.com/content/images/2016/03/1-T5rMwM8edXuILUrew2YHxw.jpeg" alt loading="lazy"></p>
<p>&#x4E5F;&#x8BB8;&#x4F60;&#x5DF2;&#x7ECF;&#x542C;&#x8BF4;&#x8FC7;&#x4E0A;&#x5343;&#x6B21;&#xFF0C;&#x4F46;&#x6211;&#x4ECA;&#x5929;&#x8981;&#x5411;&#x4F60;&#x5C55;&#x793A;&#x4EC0;&#x4E48;&#x662F;Node.js&#x7684;&#x539F;&#x751F;&#x6A21;&#x5757;&#xFF0C;&#x4EE5;&#x53CA;&#x4F60;&#x4E3A;&#x4EC0;&#x4E48;&#x5E94;&#x8BE5;&#x5173;&#x6CE8;&#x5B83;&#x4EEC;&#x3002;</p>
<blockquote>
<p>Node.js addons&#x662F;&#x4F7F;&#x7528;C&#x6216;C++&#x7F16;&#x5199;&#x7684;&#x52A8;&#x6001;&#x94FE;&#x63A5;&#x5171;&#x4EAB;&#x5BF9;&#x8C61;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;<a href="https://nodejs.org/api/globals.html?ref=iammapping.com#globals_require">require()</a>&#x65B9;&#x6CD5;&#x52A0;&#x8F7D;&#xFF0C;&#x5E76;&#x4E14;&#x50CF;&#x5176;&#x4ED6;&#x666E;&#x901A;&#x7684;Node.js&#x6A21;&#x5757;&#x4E00;&#x6837;&#x4F7F;&#x7528;&#x3002;<br>
<small>(&#x8BD1;&#x6CE8;&#xFF1A;addons: &#x6269;&#x5C55;&#xFF0C;&#x4E3A;&#x4FDD;&#x6301;&#x7EDF;&#x4E00;&#x53EB;&#x6CD5;&#xFF0C;&#x4E0D;&#x4E88;&#x7FFB;&#x8BD1;)</small></p>
</blockquote>
<p>&#x8BF4;&#x5F97;&#x8FD9;&#x4E48;&#x597D;&#x542C;&#xFF0C;&#x4F46;&#x662F;&#xFF0C;&#x4E3A;&#x4EC0;&#x4E48;&#x8981;&#x6211;&#x5199;C++&#x4EE3;&#x7801;&#xFF0C;JavaScript&#x5DF2;&#x7ECF;&#x8BA9;&#x6211;&#x5F88;&#x723D;&#x4E86;&#xFF0C;&#x5E76;&#x4E14;&#x4E0A;&#x4E00;&#x6B21;&#x770B;&#x5230;C++&#x4EE3;&#x7801;&#x8FD8;&#x662F;&#x5728;&#x5927;&#x5B66;...&#x7B54;&#x6848;&#x6CA1;&#x6709;&#x522B;&#x7684;&#x53EA;&#x6709;<strong>&#x6027;&#x80FD;&#xFF01;</strong></p>
<h3 id>&#x4E00;&#x4E2A;&#x5B9E;&#x9645;&#x7684;&#x4F8B;&#x5B50;</h3>
<p>&#x6BD4;&#x5982;&#xFF0C;&#x6211;&#x4EEC;&#x8981;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x5728;&#x7EBF;&#x7684;&#x56DE;&#x6587;&#x8BA1;&#x7B97;&#x5668;&#x5DE5;&#x5177;&#xFF0C;&#x611F;&#x8C22;Javascript&#x8FD9;&#x95E8;&#x9AD8;&#x5C42;&#x6B21;&#x7684;&#x8BED;&#x8A00;&#xFF0C;&#x4F60;&#x5F88;&#x5FEB;&#x5C31;&#x60F3;&#x5230;&#x4E86;&#x4E00;&#x4E2A;&#x5E72;&#x51C0;&#x5229;&#x843D;&#x7684;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#xFF1A;</p>
<pre><code class="language-javascript">function isPalindrome(str) {
  return str === str.split(&apos;&apos;).reverse().join(&apos;&apos;); 
}
</code></pre>
<p>&#x7B80;&#x76F4;&#x5C31;&#x662F;&#x5929;&#x624D;&#xFF1F;&#x4F60;&#x8FC5;&#x901F;&#x53D1;&#x5E03;&#x4EE3;&#x7801;&#x5230;&#x751F;&#x4EA7;&#x73AF;&#x5883;&#xFF0C;&#x7761;&#x89C9;...&#x4F46;&#x662F;&#x51E0;&#x5929;&#x540E;&#xFF0C;&#x4F60;&#x610F;&#x8BC6;&#x5230;&#x8FD9;&#x7B97;&#x6CD5;&#x5E76;&#x6CA1;&#x6709;&#x770B;&#x8D77;&#x6765;&#x90A3;&#x4E48;&#x597D;&#xFF0C;&#x5B83;&#x5B9E;&#x9645;&#x4E0A;&#x7279;&#x522B;&#x6162;&#xFF0C;&#x4E8E;&#x662F;&#x4F60;&#x5F00;&#x59CB;&#x63A2;&#x7D22;&#x65B0;&#x7684;&#x89C6;&#x91CE;...</p>
<h3 id="nodeaddons">Node addons&#x7684;&#x751F;&#x6001;&#x7CFB;&#x7EDF;</h3>
<p>&#x6211;&#x4EEC;&#x9700;&#x8981;&#x4F7F;&#x7528;&#x4E0B;&#x9762;&#x7684;&#x5DE5;&#x5177;&#x6765;&#x521B;&#x5EFA;addon&#xFF1A;</p>
<ul>
<li><a href="https://github.com/nodejs/node-gyp?ref=iammapping.com">node-gyp</a>&#xFF1A;&#x7528;&#x4E8E;&#x7F16;&#x8BD1;&#x539F;&#x751F;addons&#x7684;&#x8DE8;&#x5E73;&#x53F0;&#x547D;&#x4EE4;&#x884C;&#x63A5;&#x53E3;&#x3002;</li>
<li><a href="https://github.com/TooTallNate/node-bindings?ref=iammapping.com">node-bindings</a>&#xFF1A;&#x7528;&#x4E8E;&#x52A0;&#x8F7D;&#x539F;&#x751F;addon&#x7684;<code>.node</code>&#x6587;&#x4EF6;&#x7684;&#x5E2E;&#x52A9;&#x6A21;&#x5757;&#x3002;</li>
<li><a href="https://github.com/nodejs/nan?ref=iammapping.com">nan</a>&#xFF1A;&#x4F7F;addon&#x8DE8;Node&#x7248;&#x672C;&#x5F00;&#x53D1;&#x66F4;&#x7B80;&#x5355;&#x3002;</li>
</ul>
<p>&#x5168;&#x90E8;&#x5B89;&#x88C5;&#xFF1A;</p>
<pre><code>&gt; npm i node-gyp -g &amp;&amp; npm i bindings nan --save
</code></pre>
<p>&#x7A0D;&#x7B49;&#x7247;&#x523B;&#xFF0C;&#x6211;&#x4EEC;&#x6DFB;&#x52A0;<code>&quot;gypfile&quot;: true</code>&#x5230;package(&#x8BD1;&#x6CE8;&#xFF1A;&#x6307;&#x6DFB;&#x52A0;&#x5230;package.json&#x6587;&#x4EF6;)&#xFF0C;&#x5E76;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x65B0;<code>binding.gyp</code>&#x6587;&#x4EF6;&#xFF1A;</p>
<pre><code class="language-javascript">{
  &quot;targets&quot;: [ 
    { 
      &quot;target_name&quot;: &quot;palindrome&quot;,
      &quot;sources&quot;: [ &quot;palindrome.cc&quot; ],
      &quot;include_dirs&quot;: [ &quot;&lt;!(node -e \&quot;require(&apos;nan&apos;)\&quot;)&quot; ]
    } 
  ]
}
</code></pre>
<p>&#x51C6;&#x5907;&#x5C31;&#x7EEA;&#xFF0C;&#x73B0;&#x5728;&#x7528;C++&#x5199;&#x6211;&#x4EEC;&#x7684;&#x56DE;&#x6587;&#x65B9;&#x6CD5;&#xFF0C;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code class="language-c++">#include &lt;nan.h&gt;

using namespace v8;

void IsPalindrome(const FunctionCallbackInfo&lt;Value&gt;&amp; info) {
  String::Utf8Value sentence(info[0]-&gt;ToString());
  std::string str = std::string(*sentence);
  int len = str.length();
  int half = len / 2;
  int start = 0;
  int end = len - 1;
  int space = 32;
  bool isPal = true;

  while (half &gt; 0 &amp;&amp; isPal) {
    bool startSpace = str.at(start) == space;
    bool endSpace = str.at(end) == space;

    if (str.at(start) == str.at(end)) {
      start++;
      end--;
    } else if (startSpace || endSpace) {
      startSpace &amp;&amp; start++;
      endSpace &amp;&amp; end--;
    } else {
      isPal = false;
    }

    half--;
  }

  info.GetReturnValue().Set(isPal);
}

void Init(Local&lt;Object&gt; exports, Local&lt;Object&gt; module) {
  NODE_SET_METHOD(module, &quot;exports&quot;, IsPalindrome);
}

NODE_MODULE(addon, Init)
</code></pre>
<p>&#x8FD9;&#x4E5F;&#x8BB8;&#x4E0D;&#x662F;&#x6700;&#x597D;&#x7684;&#x5B9E;&#x73B0;&#x65B9;&#x5F0F;&#xFF0C;&#x4F46;&#x5B83;&#x7684;&#x65F6;&#x95F4;&#x590D;&#x6742;&#x5EA6;&#x662F;<code>O(n)</code>&#xFF0C;&#x73B0;&#x5728;&#x8FD8;&#x662F;&#x53EF;&#x4EE5;&#x63A5;&#x53D7;&#x7684;&#x3002;&#x6211;&#x4EEC;&#x51C6;&#x5907;&#x68C0;&#x67E5;&#x4E0A;&#x9762;&#x7684;&#x4EE3;&#x7801;&#xFF0C;&#x9996;&#x5148;&#x4E0B;&#x9762;&#x8FD9;&#x51E0;&#x884C;&#xFF1A;</p>
<pre><code class="language-c++">void Init(Local&lt;Object&gt; exports, Local&lt;Object&gt; module) { 
  NODE_SET_METHOD(module, &#x201C;exports&#x201D;, IsPalindrome);
} 
NODE_MODULE(addon, Init)
</code></pre>
<p>&#x66B4;&#x9732;<code>IsPalindrome</code>&#x65B9;&#x6CD5;&#xFF0C;&#x7A0D;&#x540E;&#x4F1A;&#x88AB;Node&#x5F15;&#x7528;&#xFF0C;(&#x6709;&#x5174;&#x8DA3;&#x53EF;&#x4EE5;)&#x5728;Node&#x7684;&#x6E90;&#x7801;&#x4E2D;&#x770B;&#x4E00;&#x4E0B;<a href="https://github.com/nodejs/node/blob/master/src/node.h?ref=iammapping.com#L457">NODE_MODULE</a>&#x548C;<a href="https://github.com/nodejs/node/blob/master/src/node.h?ref=iammapping.com#L244-L255">NODE_SET_METHOD</a>&#x65B9;&#x6CD5;&#x3002;</p>
<p>&#x53E6;&#x5916;&#x8FD9;&#x6BB5;&#x4EE3;&#x7801;&#x6709;&#x8DA3;&#x7684;&#x90E8;&#x5206;&#xFF1A;</p>
<pre><code class="language-c++">void IsPalindrome(const FunctionCallbackInfo&lt;Value&gt;&amp; info) {
  String::Utf8Value sentence(info[0]-&gt;ToString());
  std::string str = std::string(*sentence);
</code></pre>
<p>&#x6211;&#x4EEC;&#x8FD9;&#x91CC;&#x4F7F;&#x7528;&#x4E86;&#x4E00;&#x4E9B;<a href="https://developers.google.com/v8/?ref=iammapping.com">v8</a>&#x7684;&#x7C7B;&#xFF0C;<code>FunctionCallbackInfo</code>&#x63D0;&#x4F9B;&#x8C03;&#x7528;&#x4E0A;&#x4E0B;&#x6587;&#x4FE1;&#x606F;&#x7684;&#x8BBF;&#x95EE;&#xFF0C;&#x5305;&#x62EC;&#x63A5;&#x6536;&#x8005;&#xFF0C;&#x53C2;&#x6570;&#x7684;&#x6570;&#x91CF;&#x548C;&#x503C;&#xFF0C;&#x8FD8;&#x6709;&#x65B9;&#x6CD5;&#x7684;&#x6301;&#x6709;&#x8005;&#x3002;&#x6700;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x4F7F;&#x7528;<code>Utf8Value</code>&#x7C7B;&#x5C06;&#x53C2;&#x6570;&#x8F6C;&#x6362;&#x4E3A;<code>std string</code>&#xFF0C;&#x7528;&#x4EE5;&#x540E;&#x7EED;&#x5728;&#x7B97;&#x6CD5;&#x4E2D;&#x64CD;&#x4F5C;&#x3002;</p>
<p>&#x662F;&#x65F6;&#x5019;&#x8861;&#x91CF;&#x8FD9;&#x4E24;&#x79CD;&#x5B9E;&#x73B0;&#x7684;&#x6027;&#x80FD;&#x4E86;&#xFF0C;&#x4E3A;&#x6B64;&#x6211;&#x4EEC;&#x501F;&#x52A9;<a href="https://benchmarkjs.com/?ref=iammapping.com">benchmarkjs</a>&#xFF0C;&#x5B83;&#x4E5F;&#x662F;<a href="http://jsperf.com/?ref=iammapping.com">jsperf.com</a>&#x5185;&#x90E8;&#x4F7F;&#x7528;&#x7684;&#x5E93;&#xFF1A;</p>
<pre><code>&gt; npm i --save benckmark
</code></pre>
<pre><code class="language-javascript">var Benchmark = require(&apos;benchmark&apos;);
var palindromeC = require(&apos;bindings&apos;)(&apos;palindrome.node&apos;);
var palindromeJs = require(&apos;./palindrome.js&apos;);
var suite = new Benchmark.Suite;
var str = &apos;a man a plan a cat a ham a yak a yam a hat a canal panama&apos;;

suite
.add(&apos;Javascript palindrome&apos;, function() {
  palindromeJs(str);
})
.add(&apos;C palindrome&apos;, function() {
  palindromeC(str);
})
.on(&apos;cycle&apos;, cycle)
.on(&apos;complete&apos;, complete)
.run({ &apos;async&apos;: true });

function cycle(event) {
  console.log(String(event.target));
}

function complete(a,b) {
  console.log(&apos;Fastest: &apos; + this.filter(&apos;fastest&apos;).map(&apos;name&apos;));
  console.log(&apos;Slowest: &apos; + this.filter(&apos;slowest&apos;).map(&apos;name&apos;));
}
</code></pre>
<pre><code>C palindrome x 1,353,176 ops/sec &#xB1;1.98% (80 runs sampled)
Javascript palindrome x 293,383 ops/sec &#xB1;1.34% (87 runs sampled)

Fastest: C palindrome
Slowest: Javascript palindrome
</code></pre>
<p>&#x8D70;&#x8D77;&#xFF0C;C&#x56DE;&#x6587;&#x6BD4;Javascript&#x5FEB;&#x4E86;460%&#xFF01;&#x1F60F;&#x1F60F; &#x63D0;&#x5347;&#x592A;&#x60CA;&#x4EBA;&#x4E86;&#xFF1F;&#x4F46;&#x662F;&#x7B49;&#x7B49;&#xFF0C;&#x6211;&#x4EEC;&#x6709;&#x70B9;&#x4F5C;&#x5F0A;... &#x6211;&#x4EEC;&#x4F7F;&#x7528;&#x4E86;&#x4E24;&#x79CD;&#x4E0D;&#x540C;&#x7684;&#x5B9E;&#x73B0;&#xFF0C;Javascript&#x7684;&#x5355;&#x884C;&#x6BD4;&#x8D77;C++&#x7684;&#x65F6;&#x95F4;&#x590D;&#x6742;&#x5EA6;&#x8981;&#x66F4;&#x9AD8;&#x3002;&#x6211;&#x4EEC;&#x73B0;&#x5728;&#x5C1D;&#x8BD5;&#x7528;Javascript&#x5B9E;&#x73B0;C++&#x4E00;&#x6A21;&#x4E00;&#x6837;&#x7684;&#x7B97;&#x6CD5;&#xFF1A;</p>
<pre><code class="language-javascript">function isPalindrome(str) {
  var half = Math.round(str.length / 2);
  var start = 0;
  var end = str.length - 1;
  var palindrome = true;
  var SPACE = 32;
  var COMMA = 44;
  var startSpace, endSpace;

  while (half &amp;&amp; palindrome) {
    startSpace = str.charCodeAt(start) === SPACE || str.charCodeAt(start) === COMMA;
    endSpace = str.charCodeAt(end) === SPACE ||  str.charCodeAt(end) === COMMA;

    if (str[start] == str[end]) {
      start++;
      end--;
    } else if (startSpace || endSpace) {
      startSpace &amp;&amp; start++;
      endSpace &amp;&amp; end--;
    } else {
      palindrome = false;
    }

    half--;
  }

  return palindrome;
}
</code></pre>
<pre><code>C palindrome x 1,370,148 ops/sec &#xB1;1.32% (80 runs sampled)
Javascript palindrome x 3,326,042 ops/sec &#xB1;0.98% (82 runs sampled)

Fastest: Javascript palindrome
Slowest: C palindrome
</code></pre>
<p>&#x795E;&#x9A6C;&#xFF0C;Javascript&#x7684;&#x5B9E;&#x73B0;&#x73B0;&#x5728;&#x66F4;&#x5FEB;&#x4E86;240%&#x1F632;...&#x90A3;&#x8FD8;&#x6709;&#x4EC0;&#x4E48;&#x610F;&#x601D;&#xFF1F;&#x597D;&#x5728;&#x6211;&#x4EEC;&#x8FD8;&#x53EF;&#x4EE5;&#x505A;&#x4E9B;&#x4EC0;&#x4E48;&#x6765;&#x89E3;&#x51B3;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#x3002;</p>
<h3 id="nan">&#x5F15;&#x5165;nan</h3>
<blockquote>
<p><em>Node.js&#x7684;&#x539F;&#x751F;&#x62BD;&#x8C61;</em></p>
<p>&#x7531;&#x4E8E;V8&#xFF08;Node&#x5185;&#x6838;&#xFF09;&#x7684;&#x53D8;&#x5316;&#xFF0C;&#x4FDD;&#x6301;&#x6109;&#x5FEB;&#x5730;&#x8DE8;&#x7248;&#x672C;&#x7F16;&#x8BD1;&#x539F;&#x751F;&#x63D2;&#x4EF6;&#xFF0C;&#x7B80;&#x76F4;&#x662F;&#x4E2A;&#x5C0F;&#x5669;&#x68A6;&#xFF0C;&#x800C;nan&#x7684;&#x76EE;&#x6807;&#x5C31;&#x662F;&#x53EA;&#x4FDD;&#x7559;&#x5F00;&#x53D1;&#x539F;&#x751F;Node.js&#x63D2;&#x4EF6;&#x7684;&#x5FC5;&#x8981;&#x903B;&#x8F91;&#xFF0C;&#x800C;&#x65E0;&#x9700;&#x68C0;&#x67E5;NODE_MODULE_VERSION&#x3002;</p>
</blockquote>
<p>&#x6211;&#x4EEC;&#x539F;&#x751F;&#x7684;&#x5B9E;&#x73B0;&#x6BD4;js&#x66F4;&#x6162;&#x662F;&#x56E0;&#x4E3A;&#x8FD9;&#x4E2A;&#xFF1A;</p>
<pre><code class="language-c++">String::Utf8Value sentence(info[0]-&gt;ToString());
std::string str = std::string(*sentence);
</code></pre>
<p>&#x8FD9;&#x91CC;&#x6211;&#x4EEC;&#x53EA;&#x662F;&#x628A;&#x7B2C;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#x8F6C;&#x5316;&#x4E3A;<code>std string</code>&#xFF0C;&#x4F46;&#x662F;&#x7531;&#x4E8E;<code>Utf8Value</code>&#x7684;&#x5185;&#x90E8;&#x539F;&#x7406;&#xFF0C;&#x6211;&#x4EEC;&#x4ED8;&#x51FA;&#x6602;&#x8D35;&#x7684;&#x4EE3;&#x4EF7;&#x6765;&#x8F6C;&#x5316;&#x3002;&#x6211;&#x4EEC;&#x73B0;&#x5728;&#x6765;&#x770B;&#x770B;&#x4F7F;&#x7528;<code>nan</code>&#x662F;&#x600E;&#x4E48;&#x505A;&#x7684;&#xFF1A;</p>
<pre><code class="language-c++">Nan::Utf8String arg0(info[0]);
char *str = *arg0;
</code></pre>
<p>&#x6211;&#x4EEC;&#x73B0;&#x5728;&#x4F7F;&#x7528;<code>nan Utf8Value</code>&#x6765;&#x66FF;&#x4EE3;<code>v8 Utf8Value</code>&#xFF0C;&#x5E76;&#x5C06;&#x5176;&#x8F6C;&#x5316;&#x4E3A;&#x5B57;&#x7B26;&#x6570;&#x7EC4;&#x3002;&#x6211;&#x4EEC;&#x8FD8;&#x505A;&#x4E86;&#x4E00;&#x4E9B;&#x5C0F;&#x6539;&#x52A8;&#x4EE5;&#x9002;&#x5E94;&#x5B57;&#x7B26;&#x6570;&#x7EC4;&#xFF1A;</p>
<pre><code class="language-c++">#include &lt;nan.h&gt;

using namespace v8;

void IsPalindrome(const FunctionCallbackInfo&lt;Value&gt;&amp; info) {
  Nan::Utf8String arg0(info[0]);
  char *str = *arg0;
  size_t len = arg0.length();
  int half = len / 2;
  int start = 0;
  int end = len - 1;
  int space = 32;
  int comma = 44;
  bool isPal = true;
  bool startSpace;
  bool endSpace;

  while (half &gt; 0 &amp;&amp; isPal) {
    startSpace = str[start] == space || str[start] == comma;
    endSpace = str[end] == space || str[end] == comma;

    if (str[start] == str[end]) {
      start++;
      end--;
    } else if (startSpace || endSpace) {
      startSpace &amp;&amp; start++;
      endSpace &amp;&amp; end--;
    } else {
      isPal = false;
    }

    half--;
  }

  info.GetReturnValue().Set(isPal);
}

void Init(Local&lt;Object&gt; exports, Local&lt;Object&gt; module) {
  NODE_SET_METHOD(module, &quot;exports&quot;, IsPalindrome);
}

NODE_MODULE(addon, Init)
</code></pre>
<pre><code>C palindrome x 5,753,415 ops/sec &#xB1;1.40% (84 runs sampled)
Javascript palindrome x 3,307,899 ops/sec &#xB1;1.28% (84 runs sampled)

Fastest: C palindrome
Slowest: Javascript palindrome
</code></pre>
<p>&#x501F;&#x52A9;<code>nan</code>&#x73B0;&#x5728;C++&#x6BD4;js&#x5FEB;&#x4E86;170% &#x1F603;</p>
<h3 id>&#x524D;&#x6240;&#x672A;&#x6709;&#x7684;&#x5927;&#x56DE;&#x6587;</h3>
<p>&#x6700;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x6765;&#x8BD5;&#x4E00;&#x4E2A;&#x524D;&#x6240;&#x672A;&#x6709;&#x7684;&#x5927;&#x56DE;&#x6587;&#xFF0C;&#x770B;&#x770B;&#x66F4;&#x957F;&#x7684;&#x5B57;&#x7B26;&#x4E32;&#x6027;&#x80FD;&#x80FD;&#x5426;&#x4FDD;&#x6301;&#x6216;&#x662F;&#x66F4;&#x597D;&#x3002;&#x9686;&#x91CD;&#x4ECB;&#x7ECD;<a href="http://norvig.com/pal17txt.html?ref=iammapping.com">17,826&#x5B57;&#x56DE;&#x6587;</a> &#x1F608;&#x3002;&#x7ED3;&#x679C;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code>C palindrome x 4,636 ops/sec &#xB1;1.10% (83 runs sampled)
Javascript palindrome x 1,712 ops/sec &#xB1;1.22% (83 runs sampled)

Fastest: C palindrome
Slowest: Javascript palindrome
</code></pre>
<p>C++&#x518D;&#x6B21;&#x83B7;&#x5F97;&#x66F4;&#x597D;&#x7684;&#x6027;&#x80FD;&#xFF0C;&#x8FD9;&#x6B21;&#x662F;270%&#x3002;&#x53EF;&#x80FD;&#x4E5F;&#x6CA1;&#x90A3;&#x4E48;&#x663E;&#x8457;&#xFF0C;&#x4F46;&#x662F;&#x4F60;&#x80FD;&#x53D1;&#x73B0;&#x5B57;&#x7B26;&#x4E32;&#x8D8A;&#x957F;C++&#x7684;&#x6027;&#x80FD;&#x4F1A;&#x8D8A;&#x597D;&#x3002;</p>
<h3 id>&#x603B;&#x7ED3;</h3>
<p>&#x6211;&#x4EEC;&#x770B;&#x5230;&#x4E86;&#x600E;&#x4E48;&#x521B;&#x5EFA;&#x5E76;&#x6027;&#x80FD;&#x6D4B;&#x8BD5;Node.js&#x7684;&#x539F;&#x751F;addons&#xFF0C;&#x53EF;&#x80FD;&#x4E0A;&#x9762;&#x7684;&#x4F8B;&#x5B50;&#x5E76;&#x6CA1;&#x6709;&#x5F88;&#x597D;&#x7684;&#x6027;&#x80FD;&#xFF0C;&#x56E0;&#x4E3A;&#x6211;&#x4EEC;&#x4EC5;&#x4EC5;&#x5904;&#x7406;&#x5B57;&#x7B26;&#x4E32;&#xFF0C;&#x4F46;&#x81F3;&#x5C11;&#x624B;&#x628A;&#x624B;&#x5C55;&#x793A;&#x600E;&#x4E48;&#x505A;&#x3002;</p>
<p>&#x4F60;&#x53EF;&#x4EE5;&#x67E5;&#x770B;&#x5B8C;&#x6574;&#x7684;<a href="https://github.com/zzarcon/palindrome?ref=iammapping.com">&#x56DE;&#x6587;addon&#x6E90;&#x7801;</a>&#xFF0C;&#x8FD8;&#x6709;<a href="https://github.com/zzarcon/node-palindrome-benchmark?ref=iammapping.com">&#x6027;&#x80FD;&#x6D4B;&#x8BD5;&#x7684;&#x4F8B;&#x5B50;</a>&#x3002;</p>
<p>&#x6700;&#x540E;&#x6211;&#x5FC5;&#x987B;&#x627F;&#x8BA4;&#x5F88;&#x96BE;&#x627E;&#x5230;&#x5408;&#x9002;&#x7684;node addons&#x6587;&#x6863;&#x548C;&#x4F8B;&#x5B50;&#xFF0C;&#x4E0D;&#x7BA1;&#x600E;&#x6837;&#xFF0C;&#x4E0B;&#x9762;&#x63A8;&#x8350;&#x6211;&#x5B66;&#x4E60;&#x9014;&#x4E2D;&#x7684;&#x4E00;&#x4E9B;&#x53C2;&#x8003;&#xFF1A;</p>
<ul>
<li><a href="https://nodejs.org/api/addons.html?ref=iammapping.com">Node.js official guide</a></li>
<li><a href="https://developers.google.com/v8/get_started?ref=iammapping.com">v8 getting started</a></li>
<li><a href="https://github.com/nodejs/node-addon-examples?ref=iammapping.com">Addon examples</a></li>
<li><a href="https://v8docs.nodesource.com/?ref=iammapping.com">v8 documentation</a></li>
<li><a href="https://blog.scottfrees.com/?ref=iammapping.com">Scott Frees blog</a></li>
<li><a href="http://www.slideshare.net/cb1kenobi/nodejsiojs-native-c-addons?ref=iammapping.com">Node Native addons slides by Chris Barber</a></li>
<li><a href="https://github.com/nodejs/node-gyp/wiki/%22binding.gyp%22-files-out-in-the-wild?ref=iammapping.com">Community addons</a></li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[如何优雅地写js异步代码(2)]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p><img src="https://iammapping.com/content/images/2016/02/advancedjs-async-1.jpg" alt="ADVANCED JS RETHINKING ASYNC" loading="lazy"></p>
<h2 id="rockwithasyncawait">Rock with async/await</h2>
<p>&#x672C;&#x7BC7;&#x6587;&#x7AE0;&#x662F;&#x4F5C;&#x4E3A;<a href="https://iammapping.com/write-js-async-gracefully/">&#x4E0A;&#x4E00;&#x7BC7;</a>&#x7684;&#x7EED;&#x96C6;&#xFF0C;&#x8003;&#x8651;&#x5230;&#x7B2C;&#x4E00;&#x7BC7;&#x7684;&#x7BC7;&#x5E45;&#xFF0C;&#x8FD8;&#x6709;&#x66F4;&#x91CD;&#x8981;&#x7684;&#x4E00;&#x70B9;&#x5C31;&#x662F;&#x4E0A;&#x4E00;&#x7BC7;&#x8BB2;&#x7684;&#x5185;&#x5BB9;&#x5DF2;&#x7ECF;&#x53EF;&#x4EE5;&#x76F4;</p>]]></description><link>https://iammapping.com/write-js-async-gracefully-2/</link><guid isPermaLink="false">6522cda9caa77d0fabe3ef3b</guid><category><![CDATA[NodeJs]]></category><category><![CDATA[Async]]></category><category><![CDATA[Promise]]></category><category><![CDATA[Await]]></category><dc:creator><![CDATA[Iam Mapping]]></dc:creator><pubDate>Sun, 13 Mar 2016 03:12:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><img src="https://iammapping.com/content/images/2016/02/advancedjs-async-1.jpg" alt="ADVANCED JS RETHINKING ASYNC" loading="lazy"></p>
<h2 id="rockwithasyncawait">Rock with async/await</h2>
<p>&#x672C;&#x7BC7;&#x6587;&#x7AE0;&#x662F;&#x4F5C;&#x4E3A;<a href="https://iammapping.com/write-js-async-gracefully/">&#x4E0A;&#x4E00;&#x7BC7;</a>&#x7684;&#x7EED;&#x96C6;&#xFF0C;&#x8003;&#x8651;&#x5230;&#x7B2C;&#x4E00;&#x7BC7;&#x7684;&#x7BC7;&#x5E45;&#xFF0C;&#x8FD8;&#x6709;&#x66F4;&#x91CD;&#x8981;&#x7684;&#x4E00;&#x70B9;&#x5C31;&#x662F;&#x4E0A;&#x4E00;&#x7BC7;&#x8BB2;&#x7684;&#x5185;&#x5BB9;&#x5DF2;&#x7ECF;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x5E94;&#x7528;&#x5728;&#x6700;&#x65B0;&#x7248;&#x672C;&#x7684;Node.js&#x548C;&#x4E00;&#x4E9B;&#x9AD8;&#x7EA7;&#x6D4F;&#x89C8;&#x5668;&#xFF08;Chrome&#xFF0C;FF&#xFF09;&#x4E2D;&#xFF0C;&#x5177;&#x4F53;&#x517C;&#x5BB9;&#x6027;&#x53EF;&#x53C2;&#x8003;&#xFF1A;<a href="https://kangax.github.io/compat-table/es6/?ref=iammapping.com">https://kangax.github.io/compat-table/es6/</a>&#x3002;</p>
<p>&#x800C;&#x8FD9;&#x4E00;&#x7BC7;&#x8BB2;&#x7684;&#x5185;&#x5BB9;&#xFF0C;&#x662F;ECMAScript 2016&#xFF08;ES7&#xFF09;&#x7684;<a href="https://github.com/tc39/ecmascript-asyncawait?ref=iammapping.com"><code>async/await</code></a>&#x7279;&#x6027;&#xFF0C;&#x76EE;&#x524D;&#x7684;&#x517C;&#x5BB9;&#x6027;&#x53EF;&#x53C2;&#x8003;&#xFF1A;<a href="http://kangax.github.io/compat-table/esnext/?ref=iammapping.com#test-async_functions">http://kangax.github.io/compat-table/esnext/#test-async_functions</a>&#xFF0C;&#x867D;&#x7136;&#x73B0;&#x5728;&#x6765;&#x770B;&#x8FD8;&#x4E0D;&#x662F;&#x975E;&#x5E38;&#x4E50;&#x89C2;&#xFF0C;&#x4F46;&#x662F;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x7B2C;&#x4E09;&#x65B9;&#x7684;&#x4EE3;&#x7801;&#x8F6C;&#x6362;&#x5DE5;&#x5177;&#xFF08;&#x5982;<code>Traceur</code>&#x548C;<code>Babel</code>&#xFF09;&#xFF0C;&#x5C06;&#x8FD9;&#x4E9B;&#x65B0;&#x7279;&#x6027;&#x7684;&#x4EE3;&#x7801;&#x8F6C;&#x6362;&#x4E3A;&#x5F53;&#x524D;&#x73AF;&#x5883;&#x53EF;&#x8FD0;&#x884C;&#x7684;&#x4EE3;&#x7801;&#x3002;</p>
<h3 id>&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x4F8B;&#x5B50;</h3>
<p>&#x5B9E;&#x73B0;&#x540C;&#x6B65;&#x7684;sleep&#xFF0C;&#x540C;&#x6B65;&#x7684;&#x4EE3;&#x7801;&#x770B;&#x8D77;&#x6765;&#x5E94;&#x8BE5;&#x662F;&#x4E0B;&#x9762;&#x7684;&#x6837;&#x5B50;&#xFF1A;</p>
<pre><code class="language-javascript">function sleep(timeout) {
    setTimeout(function() {}, timeout);
}

function main() {
    console.time(&apos;how long did I sleep&apos;);
    sleep(3000);
    console.timeEnd(&apos;how long did I sleep&apos;);
}

main();
// how long did I sleep: 0ms
</code></pre>
<p>&#x4F46;&#x662F;&#x5728;js&#x4E2D;&#x7684;&#x6267;&#x884C;&#x7ED3;&#x679C;&#x5374;&#x662F;<code>0ms</code>&#xFF0C;&#x8FD9;&#x4E0D;&#x662F;&#x6211;&#x4EEC;&#x9884;&#x671F;&#x7684;&#x5440;&#x3002;</p>
<h4 id>&#x6539;&#x9020;</h4>
<p>&#x6309;&#x7167;&#x8FD9;&#x79CD;&#x540C;&#x6B65;&#x7684;&#x4EE3;&#x7801;&#x6D41;&#x7A0B;&#xFF0C;&#x600E;&#x4E48;&#x6837;&#x624D;&#x80FD;&#x8F93;&#x51FA;<code>3000ms</code>&#x5462;&#xFF1F;&#x770B;&#x8FC7;<a href="https://iammapping.com/write-js-async-gracefully/">&#x4E0A;&#x4E00;&#x7BC7;</a>&#x6587;&#x7AE0;&#x7684;&#x7AE5;&#x978B;&#x5E94;&#x8BE5;&#x5F88;&#x5FEB;&#x5C31;&#x80FD;&#x60F3;&#x5230;&#x4F7F;&#x7528;<code>Generator</code>&#x548C;<code>yield</code>&#xFF0C;&#x6CA1;&#x770B;&#x8FC7;&#x7684;&#x7AE5;&#x978B;&#x5EFA;&#x8BAE;&#x5148;&#x770B;&#x5B8C;<a href="https://iammapping.com/write-js-async-gracefully/">&#x4E0A;&#x4E00;&#x7BC7;</a>&#x518D;&#x56DE;&#x6765;&#x3002;</p>
<p>sleep(5min)</p>
<p>&#x597D;&#xFF0C;&#x6211;&#x5C31;&#x5F53;&#x4F60;&#x4EEC;&#x90FD;&#x56DE;&#x6765;&#x4E86;&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#x5C31;&#x8BF4;&#x8BF4;&#x5982;&#x4F55;&#x4F7F;&#x7528;<code>async/await</code>&#x5B9E;&#x73B0;&#x201C;&#x540C;&#x6B65;&#x201D;&#x7684;sleep&#x3002;</p>
<p><code>await</code>&#x671F;&#x671B;&#x7684;&#x503C;&#x662F;&#x4E00;&#x4E2A;<code>Promise</code>&#x5BF9;&#x8C61;&#xFF0C;&#x6539;&#x9020;<code>sleep</code>&#x65B9;&#x6CD5;&#xFF1A;</p>
<pre><code class="language-javascript">function sleep(timeout) {
    return new Promise(function(resolve, reject) {
        setTimeout(resolve, timeout);
    });
}
</code></pre>
<p>&#x9664;&#x6B64;&#x4E4B;&#x5916;&#xFF0C;<code>main</code>&#x65B9;&#x6CD5;&#x8FD8;&#x9700;&#x8981;&#x4F7F;&#x7528;<code>async</code>&#x663E;&#x5F0F;&#x58F0;&#x660E;&#x6210;&#x5F02;&#x6B65;&#x65B9;&#x6CD5;&#xFF1A;</p>
<pre><code class="language-javascript">async function main() {
    console.time(&apos;how long did I sleep&apos;);
    await sleep(3000);
    console.timeEnd(&apos;how long did I sleep&apos;);
}
</code></pre>
<p>&#x5C06;&#x4EE5;&#x4E0A;&#x4EE3;&#x7801;&#x4FDD;&#x5B58;&#x4E3A;<code>async-sleep.js</code>&#x3002;&#x524D;&#x9762;&#x4E5F;&#x8BF4;&#x4E86;&#x9700;&#x8981;&#x501F;&#x52A9;&#x7B2C;&#x4E09;&#x65B9;&#x4EE3;&#x7801;&#x8F6C;&#x6362;&#x5DE5;&#x5177;&#xFF0C;&#x90A3;&#x6211;&#x4EEC;&#x5C31;&#x5B89;&#x88C5;<code>Babel</code>&#xFF1A;</p>
<pre><code>&gt; npm install --save-dev babel-cli
</code></pre>
<p>&#x5B89;&#x88C5;&#x540E;&#x6267;&#x884C;&#xFF1A;</p>
<pre><code>&gt; ./node_modules/babel-cli/bin/babel-node.js async-sleep.js
</code></pre>
<p>&#x6CA1;&#x51FA;&#x610F;&#x5916;&#x7684;&#x8BDD;&#xFF0C;&#x6211;&#x4EEC;&#x5E94;&#x8BE5;&#x770B;&#x5230;...WTF&#xFF0C;&#x51FA;&#x9519;&#x4E86;</p>
<pre><code>SyntaxError: async-sleep.js: Unexpected token (7:6)
   5 | }
   6 |
&gt;  7 | async function main() {
     |       ^
   8 | 	console.time(&apos;how long did I sleep&apos;);
   9 | 	await sleep(3000);
  10 | 	console.timeEnd(&apos;how long did I sleep&apos;);
</code></pre>
<p>&#x8FD9;&#x65F6;&#x9700;&#x8981;&#x5B89;&#x88C5;&#x4E00;&#x4E2A;<code>Babel</code>&#x7684;&#x63D2;&#x4EF6;&#x7528;&#x4E8E;&#x8F6C;&#x6362;<code>async</code>&#xFF1A;</p>
<pre><code>&gt; npm install --save-dev babel-plugin-transform-async-to-generator
</code></pre>
<p>&#x5B89;&#x88C5;&#x597D;&#x540E;&#xFF0C;&#x9700;&#x8981;&#x5728;&#x8FD0;&#x884C;&#x76EE;&#x5F55;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A;&#x914D;&#x7F6E;&#x6587;&#x4EF6;<code>.babelrc</code>&#xFF1A;</p>
<pre><code>&gt; vi .babelrc
{
    &quot;plugins&quot;: [&quot;transform-async-to-generator&quot;]
}
</code></pre>
<p>&#x6216;&#x5728;&#x547D;&#x4EE4;&#x4E2D;&#x6307;&#x5B9A;&#xFF1A;</p>
<pre><code>&gt;  ./node_modules/babel-cli/bin/babel-node.js --plugins transform-async-to-generator async-sleep.js
</code></pre>
<p>&#x6CA1;&#x51FA;&#x610F;&#x5916;&#x7684;&#x8BDD;&#xFF0C;&#x6211;&#x4EEC;&#x5E94;&#x8BE5;&#x770B;&#x5230;...WTF&#xFF0C;&#x53C8;&#x51FA;&#x9519;&#x4E86;</p>
<pre><code>async-sleep.js:1
(function (exports, require, module, __filename, __dirname) { let main = (() =&gt; {
                                                              ^^^

SyntaxError: Block-scoped declarations (let, const, function, class) not yet supported outside strict mode
</code></pre>
<p>&#x597D;&#x5427;&#xFF0C;&#x63D0;&#x793A;&#x4E5F;&#x5F88;&#x660E;&#x663E;&#xFF0C;&#x6211;&#x4EEC;&#x4F7F;&#x7528;<code>strict</code>&#x6A21;&#x5F0F;&#xFF0C;&#x5B8C;&#x6574;&#x7684;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code class="language-javascript">&apos;use strict&apos;;

function sleep(timeout) {
    return new Promise(function(resolve, reject) {
        setTimeout(resolve, timeout);
    });
}

async function main() {
	console.time(&apos;how long did I sleep&apos;);
	await sleep(3000);
	console.timeEnd(&apos;how long did I sleep&apos;);
}

main();
// how long did I sleep: 3003ms
</code></pre>
<p>&#x518D;&#x6267;&#x884C;&#xFF0C;&#x7EC8;&#x4E8E;&#x770B;&#x5230;&#x6211;&#x4EEC;&#x671F;&#x671B;&#x7684;<code>3003ms</code>&#x3002;&#x5443;&#xFF0C;&#x600E;&#x4E48;&#x4E0D;&#x662F;<code>3000ms</code>&#xFF0C;&#x4E0D;&#x8981;&#x5728;&#x610F;&#x8FD9;&#x4E9B;&#x7EC6;&#x8282;&#x3002;&#x96BE;&#x9053;QQ&#x7A7A;&#x95F4;&#x66FE;&#x7ECF;&#x7528;&#x8FD9;&#x4E2A;&#x5B9E;&#x9645;&#x5EF6;&#x8FDF;&#x7684;&#x8BEF;&#x5DEE;&#x6765;&#x5224;&#x65AD;&#x5BA2;&#x6237;&#x7AEF;CPU&#x7684;&#x7E41;&#x5FD9;&#x7A0B;&#x5EA6;&#x4E5F;&#x8981;&#x544A;&#x8BC9;&#x4F60;&#x3002;</p>
<p>&#x770B;&#x5B8C;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;&#xFF0C;&#x662F;&#x4E0D;&#x662F;&#x53D1;&#x73B0;<code>async</code>&#x7C7B;&#x4F3C;&#x4E8E;<code>Generator</code>&#x4E2D;&#x7684;<code>*</code>&#xFF0C;&#x800C;<code>await</code>&#x7C7B;&#x4F3C;&#x4E8E;<code>yield</code>&#xFF0C;&#x4F46;&#x662F;&#x73B0;&#x5728;&#x4E0D;&#x9700;&#x8981;&#x518D;&#x989D;&#x5916;&#x5C01;&#x88C5;&#x4E00;&#x4E2A;<code>run</code>&#x65B9;&#x6CD5;&#x4E86;&#xFF0C;&#x8FD9;&#x8FD8;&#x662F;&#x5F88;&#x65B9;&#x4FBF;&#x7684;&#x3002;</p>
<h3 id>&#x91CD;&#x5199;&#x56DE;&#x8C03;&#x5730;&#x72F1;&#x7684;&#x4F8B;&#x5B50;</h3>
<p>&#x7EE7;&#x7EED;&#x91CD;&#x5199;&#x90A3;&#x4E2A;&#x56DE;&#x8C03;&#x5730;&#x72F1;&#x7684;&#x4F8B;&#x5B50;&#xFF1A;</p>
<ol>
<li>&#x8BFB;&#x53D6;&#x5F53;&#x524D;&#x76EE;&#x5F55;&#x7684;package.json</li>
<li>&#x68C0;&#x67E5;backup&#x76EE;&#x5F55;&#x662F;&#x5426;&#x5B58;&#x5728;&#xFF0C;&#x5982;&#x679C;&#x4E0D;&#x5B58;&#x5728;&#x5C31;&#x521B;&#x5EFA;backup&#x76EE;&#x5F55;</li>
<li>&#x5C06;&#x6587;&#x4EF6;&#x5185;&#x5BB9;&#x5199;&#x5230;&#x5907;&#x4EFD;&#x6587;&#x4EF6;</li>
</ol>
<p><code>readPackageFile</code>&#x3001;<code>checkBackupDir</code>&#x548C;<code>backupPackageFile</code>&#x76F4;&#x63A5;&#x4F7F;&#x7528;&#x4E0A;&#x4E00;&#x7BC7;&#x4E2D;&#x7684;&#x5B9A;&#x4E49;&#xFF1A;</p>
<pre><code class="language-javascript">var readPackageFile = new Promise(function(resolve, reject) {
    fs.readFile(&apos;./package.json&apos;, function(err, data) {
        if (err) {
            reject(err);
        }

        resolve(data);
    });
});

var checkBackupDir = new Promise(function(resolve, reject) {
    fs.exists(&apos;./backup&apos;, function(exists) {
        if (!exists) {
            resolve(mkBackupDir);
        } else {
            resolve();
        }
    });
});

var mkBackupDir = new Promise(function(resolve, reject) {
    // throw new Error(&apos;unexpected error&apos;);
    fs.mkdir(&apos;./backup&apos;, function(err) {
        if (err) {
            return reject(err);
        }

        resolve();
    });
});

function backupPackageFile(data) {
    return new Promise(function(resolve, reject) {
        fs.writeFile(&apos;./backup/package.json&apos;, data, function(err) {
            if (err) {
                return reject(err);
            }

            resolve();
        });
    });
};
</code></pre>
<p>Let&apos;s Rock&#xFF1A;</p>
<pre><code class="language-javascript">(async function() {
    try {
        // 1. &#x8BFB;&#x53D6;&#x5F53;&#x524D;&#x76EE;&#x5F55;&#x7684;package.json
        var data = await readPackageFile;
        
        // 2. &#x68C0;&#x67E5;backup&#x76EE;&#x5F55;&#x662F;&#x5426;&#x5B58;&#x5728;&#xFF0C;&#x5982;&#x679C;&#x4E0D;&#x5B58;&#x5728;&#x5C31;&#x521B;&#x5EFA;backup&#x76EE;&#x5F55;
        await checkBackupDir;

        // 3. &#x5C06;&#x6587;&#x4EF6;&#x5185;&#x5BB9;&#x5199;&#x5230;&#x5907;&#x4EFD;&#x6587;&#x4EF6;
        await backupPackageFile(data);

        console.log(&apos;backup successed&apos;);
    } catch (err) {
        console.error(err);
    }
}());
</code></pre>
<h2 id>&#x603B;&#x7ED3;</h2>
<p>js&#x6B63;&#x671D;&#x7740;&#x8D8A;&#x6765;&#x8D8A;&#x597D;&#x7684;&#x65B9;&#x5411;&#x53D1;&#x5C55;&#xFF0C;&#x4E0D;&#x662F;&#x5417;&#xFF1F;</p>
<h2 id>&#x53C2;&#x8003;&#x5730;&#x5740;</h2>
<ul>
<li><a href="https://www.twilio.com/blog/2015/10/asyncawait-the-hero-javascript-deserved.html?ref=iammapping.com">Async/Await: The Hero JavaScript Deserved</a></li>
<li><a href="http://stackoverflow.com/questions/33641593/babel-6-async-await-unexpected-token?ref=iammapping.com">babel 6 async / await: Unexpected token</a></li>
<li><a href="http://babeljs.io/docs/usage/cli/?ref=iammapping.com">Babel cli usage</a></li>
</ul>
<p><small style="color:#B3B3B3">&#x9898;&#x56FE;&#x5F15;&#x81EA;&#xFF1A;<a href="http://forwardjs.com/img/workshops/advancedjs-async.jpg?ref=iammapping.com">http://forwardjs.com/img/workshops/advancedjs-async.jpg</a></small></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[使用Vagrant搭建开发环境]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p><img src="https://iammapping.com/content/images/2016/02/687474703a2f2f6572696b6168656964692e636f6d2f7468656d652f6661746361747a2f696d616765732f76616772616e742f6c6f676f5f76616772616e742e706e67.png" alt="VAGRANT" loading="lazy"></p>
<p>&#x65B0;&#x7684;&#x5F00;&#x53D1;&#x540C;&#x4E8B;&#x5165;&#x804C;&#xFF0C;&#x603B;&#x662F;&#x8981;&#x53BB;&#x5E2E;&#x4ED6;&#x4EEC;&#x91CD;&#x65B0;&#x642D;&#x5EFA;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#xFF0C;&#x521A;&#x5F00;&#x59CB;&#x4E00;&#x4E24;&#x4E2A;&#x5012;&#x89C9;&#x5F97;&#x8FD8;&#x597D;&#xFF0C;&#x82B1;&#x534A;&#x5929;&#x65F6;&#x95F4;&#x5C31;&#x53EF;&#x4EE5;&#x641E;&#x5B9A;&#xFF1B;&#x4F46;&#x968F;</p>]]></description><link>https://iammapping.com/use-vagrant-building-your-development-env/</link><guid isPermaLink="false">6522cda9caa77d0fabe3ef39</guid><category><![CDATA[Vagrant]]></category><category><![CDATA[DevOps]]></category><dc:creator><![CDATA[Iam Mapping]]></dc:creator><pubDate>Thu, 25 Feb 2016 01:56:17 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><img src="https://iammapping.com/content/images/2016/02/687474703a2f2f6572696b6168656964692e636f6d2f7468656d652f6661746361747a2f696d616765732f76616772616e742f6c6f676f5f76616772616e742e706e67.png" alt="VAGRANT" loading="lazy"></p>
<p>&#x65B0;&#x7684;&#x5F00;&#x53D1;&#x540C;&#x4E8B;&#x5165;&#x804C;&#xFF0C;&#x603B;&#x662F;&#x8981;&#x53BB;&#x5E2E;&#x4ED6;&#x4EEC;&#x91CD;&#x65B0;&#x642D;&#x5EFA;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#xFF0C;&#x521A;&#x5F00;&#x59CB;&#x4E00;&#x4E24;&#x4E2A;&#x5012;&#x89C9;&#x5F97;&#x8FD8;&#x597D;&#xFF0C;&#x82B1;&#x534A;&#x5929;&#x65F6;&#x95F4;&#x5C31;&#x53EF;&#x4EE5;&#x641E;&#x5B9A;&#xFF1B;&#x4F46;&#x968F;&#x7740;&#x65B0;&#x52A0;&#x5165;&#x4EBA;&#x6570;&#x8D8A;&#x6765;&#x8D8A;&#x591A;&#xFF0C;&#x800C;&#x4E14;&#x8FD8;&#x7ECF;&#x5E38;&#x4F1A;&#x78B0;&#x5230;&#x540C;&#x4E8B;&#x7535;&#x8111;&#x4E0A;&#x7684;&#x67D0;&#x4E2A;&#x670D;&#x52A1;&#x6CA1;&#x542F;&#x52A8;&#xFF0C;&#x5BFC;&#x81F4;&#x9879;&#x76EE;&#x6CA1;&#x6CD5;&#x8DD1;&#x8D77;&#x6765;&#xFF0C;&#x53C8;&#x8981;&#x5E2E;&#x5FD9;&#x8C03;&#x8BD5;&#xFF0C;&#x8FD9;&#x4E9B;&#x65E0;&#x8111;&#x7684;&#x4F53;&#x529B;&#x6D3B;&#x4E5F;&#x53D8;&#x5F97;&#x8D8A;&#x6765;&#x8D8A;&#x5197;&#x957F;&#x4E4F;&#x5473;&#x3002;&#x6D88;&#x9664;&#x91CD;&#x590D;&#xFF0C;&#x662F;&#x7A0B;&#x5E8F;&#x733F;&#x7684;&#x5929;&#x751F;&#x804C;&#x8D23;&#xFF0C;&#x5DE5;&#x4F5C;&#x7684;&#x91CD;&#x590D;&#x4E5F;&#x4E0D;&#x4F8B;&#x5916;&#x3002;</p>
<p>&#x4E8E;&#x662F;&#x6211;&#x627E;&#x5230;&#x4E86;<code>Vagrant</code>&#xFF0C;&#x5176;&#x5B9E;&#x65E9;&#x5728;2014&#x5E74;&#x5C31;&#x542C;&#x8BF4;&#xFF0C;&#x53EA;&#x662F;&#x5F53;&#x65F6;&#x56E2;&#x961F;&#x8FD8;&#x5F88;&#x5C0F;&#xFF0C;&#x800C;&#x4E14;&#x6BCF;&#x4E2A;&#x4EBA;&#x90FD;&#x80FD;&#x9A7E;&#x9A6D;&#x81EA;&#x5DF1;&#x7684;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#xFF0C;&#x6240;&#x4EE5;&#x6CA1;&#x591A;&#x7559;&#x610F;&#xFF0C;&#x53EA;&#x662F;&#x77E5;&#x9053;&#x6709;&#x8FD9;&#x4E48;&#x4E2A;&#x4E1C;&#x897F;&#x3002;&#x73B0;&#x5728;&#x56DE;&#x60F3;&#xFF0C;&#x5F53;&#x65F6;&#x771F;&#x662F;&#x76EE;&#x5149;&#x77ED;&#x6D45;&#xFF0C;&#x65E9;&#x7528;&#x8D77;&#x6765;&#x5C31;&#x4E0D;&#x4F1A;&#x53D1;&#x4E0A;&#x9762;&#x90A3;&#x6BB5;&#x7262;&#x9A9A;&#x4E86;&#x3002;&#x4E0B;&#x9762;&#x8FDB;&#x5165;&#x6B63;&#x9898;&#x3002;</p>
<h3 id="vagrant">&#x4EC0;&#x4E48;&#x662F;Vagrant&#xFF1F;</h3>
<p>Vagrant&#x4E3A;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#x800C;&#x751F;&#xFF0C;&#x662F;&#x7528;&#x4E8E;&#x521B;&#x5EFA;&#x5E76;&#x914D;&#x7F6E;&#x8F7B;&#x91CF;&#x7684;&#x3001;&#x53EF;&#x91CD;&#x73B0;&#x7684;&#x3001;&#x53EF;&#x79FB;&#x690D;&#x7684;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#x3002;</p>
<h3 id="vagrant">&#x4E3A;&#x4EC0;&#x4E48;&#x8981;&#x7528;Vagrant&#xFF1F;</h3>
<p>&#x636E;&#x6211;&#x4E86;&#x89E3;&#xFF0C;&#x76EE;&#x524D;&#x56E2;&#x961F;&#x5408;&#x4F5C;&#x7684;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#x5927;&#x81F4;&#x5206;&#x4E3A;&#x4E09;&#x79CD;&#xFF1A;</p>
<p>&#x7B2C;&#x4E00;&#x79CD;&#xFF1A;&#x6BCF;&#x4E2A;&#x4EBA;&#x7684;&#x7535;&#x8111;&#x90FD;&#x6709;&#x4E00;&#x5957;&#x72EC;&#x7ACB;&#x914D;&#x7F6E;&#x7684;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#x3002;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x5982;&#x679C;&#x5728;&#x9879;&#x76EE;&#x4E2D;&#x9700;&#x8981;&#x4F9D;&#x8D56;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x670D;&#x52A1;&#xFF0C;&#x90A3;&#x6240;&#x6709;&#x4EBA;&#x7684;&#x7535;&#x8111;&#x90FD;&#x8981;&#x6328;&#x4E2A;&#x88C5;&#x4E2A;&#x904D;&#xFF0C;&#x867D;&#x7136;&#x8FD9;&#x4E2A;&#x60C5;&#x51B5;&#x4E0D;&#x4F1A;&#x7ECF;&#x5E38;&#x51FA;&#x73B0;&#xFF0C;&#x4E00;&#x65E6;&#x51FA;&#x73B0;&#x5C31;&#x662F;&#x707E;&#x96BE;&#x3002;</p>
<p>&#x7B2C;&#x4E8C;&#x79CD;&#xFF1A;&#x6709;&#x4E00;&#x53F0;&#x4E13;&#x4F9B;&#x5F00;&#x53D1;&#x7684;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x670D;&#x52A1;&#x5668;&#x4E0A;&#x6BCF;&#x4E2A;&#x4EBA;&#x90FD;&#x6709;&#x72EC;&#x7ACB;&#x7684;&#x7A7A;&#x95F4;&#x7528;&#x4E8E;&#x6258;&#x7BA1;&#x5E76;&#x8FD0;&#x884C;&#x81EA;&#x5DF1;&#x7684;&#x4EE3;&#x7801;&#x3002;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x8F83;&#x4E3A;&#x9AD8;&#x7EA7;&#xFF0C;&#x6210;&#x672C;&#x76F8;&#x5BF9;&#x4E5F;&#x8F83;&#x9AD8;&#xFF0C;&#x4F46;&#x662F;&#x4E5F;&#x6709;&#x4E00;&#x4E2A;&#x81F4;&#x547D;&#x7684;&#x77ED;&#x677F;&#xFF0C;&#x5982;&#x679C;&#x6709;&#x4E00;&#x4E2A;&#x4EBA;&#x628A;&#x8FD9;&#x53F0;&#x670D;&#x52A1;&#x5668;&#x641E;&#x6302;&#x4E86;&#xFF0C;&#x90A3;&#x6574;&#x4E2A;&#x56E2;&#x961F;&#x8DDF;&#x7740;&#x6B47;&#x83DC;&#x3002;</p>
<p>&#x7B2C;&#x4E09;&#x79CD;&#xFF1A;&#x4F7F;&#x7528;&#x7C7B;&#x4F3C;Vagrant&#x7684;&#x865A;&#x62DF;&#x5316;&#x65B9;&#x5F0F;&#x3002;&#x8FC7;&#x53BB;&#x4F60;&#x53EF;&#x80FD;&#x7ECF;&#x5E38;&#x542C;&#x8BF4;&#xFF1A;&#x5582;&#xFF0C;&#x54E5;&#x4EEC;&#xFF0C;&#x6211;&#x4EE3;&#x7801;&#x66F4;&#x65B0;&#x4E86;&#xFF0C;&#x4F60;&#x62C9;&#x4E00;&#x4E0B;&#x3002;&#x4F7F;&#x7528;Vagrant&#x540E;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#xFF1A;&#x90A3;&#x4E2A;&#x8C01;&#xFF0C;&#x6211;&#x628A;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#x66F4;&#x65B0;&#x4E86;&#xFF0C;&#x4F60;&#x62C9;&#x4E00;&#x4E0B;&#x3002;</p>
<p>&#x5F53;&#x7136;&#x53EF;&#x80FD;&#x8FD8;&#x6709;&#x4E9B;&#x571F;&#x8C6A;&#x516C;&#x53F8;&#x7684;&#x505A;&#x6CD5;&#x662F;&#x4ECE;&#x7B2C;&#x4E8C;&#x79CD;&#x884D;&#x751F;&#x51FA;&#x6765;&#xFF0C;&#x6BCF;&#x4E2A;&#x4EBA;&#x6709;&#x72EC;&#x7ACB;&#x7684;&#x5F00;&#x53D1;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x6709;&#x4E13;&#x804C;&#x7684;&#x8FD0;&#x7EF4;&#x540C;&#x5B66;&#x7EDF;&#x4E00;&#x914D;&#x7F6E;&#xFF0C;&#x8FD9;&#x91CC;&#x5C31;&#x4E0D;&#x505A;&#x8BA8;&#x8BBA;&#x4E86;&#x3002;<br>
&#x5BF9;&#x6BD4;&#x4EE5;&#x4E0A;&#x4E09;&#x79CD;&#x65B9;&#x5F0F;&#xFF0C;&#x4F7F;&#x7528;&#x865A;&#x62DF;&#x5316;&#x7684;&#x65B9;&#x4FBF;&#x7A0B;&#x5EA6;&#x6EA2;&#x4E8E;&#x8A00;&#x8868;&#x3002;</p>
<h3 id="vagrant">Vagrant&#x7684;&#x5DE5;&#x4F5C;&#x539F;&#x7406;</h3>
<p>&#x4F60;&#x770B;&#x4E86;&#x4E0A;&#x9762;&#x90A3;&#x6BB5;&#x53EF;&#x80FD;&#x8FD8;&#x89C9;&#x5F97;&#x4E00;&#x5934;&#x96FE;&#x6C34;&#xFF0C;&#x4F60;&#x53EB;&#x6211;&#x62C9;&#x4E00;&#x4E0B;&#xFF0C;&#x662F;&#x62C9;&#x4EC0;&#x4E48;&#xFF1F;&#xFF08;&#x5443;&#xFF0C;&#x8FD9;&#x4F4D;&#x540C;&#x5B66;&#xFF0C;&#x4E0D;&#x8981;&#x60F3;&#x6B6A;&#x4E86;&#xFF09;</p>
<p>&#x5982;&#x679C;&#x4F7F;&#x7528;&#x4F20;&#x7EDF;&#x7684;&#x865A;&#x62DF;&#x673A;&#x642D;&#x5EFA;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#xFF0C;&#x5927;&#x81F4;&#x6B65;&#x9AA4;&#x5982;&#x4E0B;&#xFF1A;</p>
<ol>
<li>&#x4E0B;&#x8F7D;&#x4E00;&#x4E2A;&#x865A;&#x62DF;&#x5316;&#x7684;&#x8F6F;&#x4EF6;&#xFF0C;&#x5982;&#xFF1A;VMare&#xFF0C;VirtualBox&#xFF1B;</li>
<li>&#x7136;&#x540E;&#x627E;&#x4E00;&#x4E2A;&#x7CFB;&#x7EDF;&#x5B89;&#x88C5;&#x5305;&#x5B89;&#x88C5;&#xFF1B;</li>
<li>&#x5B89;&#x88C5;&#x597D;&#x4E86;&#x4E4B;&#x540E;&#xFF0C;&#x8FDB;&#x5165;&#x7CFB;&#x7EDF;&#xFF0C;&#x914D;&#x7F6E;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#xFF1B;</li>
<li>&#x914D;&#x7F6E;&#x4EE3;&#x7801;&#x76EE;&#x5F55;&#x5171;&#x4EAB;&#x5230;&#x865A;&#x62DF;&#x7CFB;&#x7EDF;&#xFF1B;</li>
<li>&#x5927;&#x529F;&#x544A;&#x6210;&#xFF0C;&#x73B0;&#x5728;&#x53EF;&#x4EE5;&#x672C;&#x5730;&#x5199;&#x4EE3;&#x7801;&#xFF0C;&#x865A;&#x62DF;&#x673A;&#x6267;&#x884C;&#x4E86;&#x3002;</li>
</ol>
<p>Vagrant&#x7684;&#x5DE5;&#x4F5C;&#x539F;&#x7406;&#x4E0E;&#x4E0A;&#x9762;&#x7C7B;&#x4F3C;&#xFF0C;&#x53EA;&#x662F;&#x505A;&#x4E86;&#x62BD;&#x8C61;&#xFF0C;&#x8BA9;&#x914D;&#x7F6E;&#x548C;&#x8FC1;&#x79FB;&#x66F4;&#x7B80;&#x5355;&#x3002;</p>
<ol>
<li>&#x9996;&#x5148;&#x9700;&#x8981;&#x5B89;&#x88C5;&#x4E00;&#x4E2A;<code>Provider</code>&#xFF0C;&#x8FD9;&#x4E2A;<code>Provider</code>&#x5C31;&#x662F;&#x4E3A;Vagrant&#x63D0;&#x4F9B;&#x865A;&#x62DF;&#x5316;&#x670D;&#x52A1;&#x7684;&#x8F6F;&#x4EF6;&#xFF1B;</li>
<li>&#x4E0B;&#x8F7D;&#x4E00;&#x4E2A;<code>Box</code>&#xFF0C;&#x76F8;&#x5F53;&#x4E8E;&#x4E0A;&#x9762;&#x7684;&#x5B89;&#x88C5;&#x5305;&#xFF0C;&#x8FDB;&#x5165;&#x4EE3;&#x7801;&#x76EE;&#x5F55;&#x521D;&#x59CB;&#x5316;&#xFF1B;</li>
<li>&#x8FDB;&#x5165;&#x865A;&#x62DF;&#x5B9E;&#x4F8B;&#xFF0C;&#x914D;&#x7F6E;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#xFF1B;</li>
<li>&#x9000;&#x51FA;&#x5E76;&#x5173;&#x95ED;&#x865A;&#x62DF;&#x5B9E;&#x4F8B;&#xFF0C;&#x5C06;&#x5F53;&#x524D;&#x73AF;&#x5883;&#x6253;&#x5305;&#x6210;&#x4E00;&#x4E2A;&#x65B0;&#x7684;<code>Box</code>&#xFF1B;</li>
<li>&#x5C06;&#x8FD9;&#x4E2A;<code>Box</code>&#x5171;&#x4EAB;&#x7ED9;&#x5176;&#x4ED6;&#x5C0F;&#x4F19;&#x4F34;&#xFF0C;&#x7136;&#x540E;&#x4F60;&#x4EEC;&#x5C31;&#x53EF;&#x4EE5;&#x5FEB;&#x4E50;&#x5E78;&#x798F;&#x5730;&#x7528;&#x540C;&#x6837;&#x7684;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#x5199;&#x4EE3;&#x7801;&#x4E86;&#x3002;</li>
</ol>
<h3 id="vagrant01">Vagrant&#x7684;&#x4ECE;0&#x5230;1</h3>
<h4 id="1virtualbox">1 &#x4E0B;&#x8F7D;VirtualBox</h4>
<p>&#x524D;&#x5F80;&#x5B98;&#x7F51;&#x4E0B;&#x8F7D;&#xFF1A;<a href="https://www.virtualbox.org/wiki/Downloads?ref=iammapping.com">https://www.virtualbox.org/wiki/Downloads</a>&#xFF0C;&#x5EFA;&#x8BAE;&#x628A;Extension Pack&#x4E5F;&#x88C5;&#x4E0A;</p>
<h4 id="2vagrant">2 &#x4E0B;&#x8F7D;Vagrant</h4>
<p>&#x524D;&#x5F80;&#x5B98;&#x7F51;&#x4E0B;&#x8F7D;&#xFF1A;<a href="https://www.vagrantup.com/downloads.html?ref=iammapping.com">https://www.vagrantup.com/downloads.html</a></p>
<h4 id="3vagrantbox">3 &#x4E3A;Vagrant&#x65B0;&#x589E;Box</h4>
<p>&#x4F7F;&#x7528;&#x547D;&#x4EE4;<code>vagrant box add {name} {url}</code>&#xFF0C;&#x5176;&#x4E2D;<code>{name}</code>&#x662F;&#x81EA;&#x5B9A;&#x4E49;&#x7684;&#x540D;&#x79F0;&#xFF08;&#x53EF;&#x9009;&#xFF09;&#xFF0C;<code>{url}</code>&#x53EF;&#x4EE5;&#x662F;&#x8FDC;&#x7A0B;&#x7684;&#x6587;&#x4EF6;&#x5730;&#x5740;&#x6216;&#x672C;&#x5730;&#x7684;&#x6587;&#x4EF6;&#x8DEF;&#x5F84;&#xFF0C;&#x8003;&#x8651;&#x5230;&#x56FD;&#x5185;&#x590D;&#x6742;&#x7684;&#x7F51;&#x7EDC;&#x73AF;&#x5883;&#xFF0C;&#x5C3D;&#x91CF;&#x8FD8;&#x662F;&#x5148;&#x4E0B;&#x5230;&#x672C;&#x5730;&#x3002;&#x8FD8;&#x6709;&#x4E00;&#x5B9A;&#x8981;&#x4ECE;<a href="http://www.vagrantbox.es/?ref=iammapping.com">&#x5B98;&#x65B9;</a>&#x4E0B;&#x8F7D;box&#xFF0C;&#x5438;&#x53D6;15&#x5E74;<em>xcode ghost</em>&#x4E8B;&#x4EF6;&#x7684;&#x6559;&#x8BAD;&#x3002;</p>
<p>&#x4E0B;&#x8F7D;<a href="http://files.vagrantup.com/precise64.box?ref=iammapping.com">http://files.vagrantup.com/precise64.box</a>&#x5230;<code>~/Downloads/precise64.box</code></p>
<p>&#x6267;&#x884C;&#xFF1A;</p>
<pre><code>&gt; vagrant box add my-php-dev ~/Downloads/precise64.box
</code></pre>
<h4 id="4">4 &#x521D;&#x59CB;&#x5316;</h4>
<p>&#x8FDB;&#x5165;&#x5230;&#x6211;&#x4EEC;&#x7684;&#x9879;&#x76EE;&#x76EE;&#x5F55;<code>~/Documents/php/project</code>&#x521D;&#x59CB;&#x5316;&#xFF0C;&#x4F7F;&#x7528;&#x4E0A;&#x4E00;&#x6B65;&#x521B;&#x5EFA;&#x7684;box&#xFF1A;</p>
<pre><code>&gt; cd ~/Documents/php/project
&gt; vagrant init my-php-dev
</code></pre>
<p>&#x521D;&#x59CB;&#x5316;&#x540E;&#x4EA7;&#x751F;&#x4E86;&#x4E00;&#x4E2A;<code>Vagrantfile</code>&#x6587;&#x4EF6;&#xFF0C;&#x8FD9;&#x662F;vagrant&#x5BF9;&#x5F53;&#x524D;&#x9879;&#x76EE;&#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF0C;&#x4EE5;&#x4E0B;&#x6709;&#x51E0;&#x4E2A;&#x914D;&#x7F6E;&#x5EFA;&#x8BAE;</p>
<h5 id="41">4.1 &#x7F51;&#x7EDC;&#x914D;&#x7F6E;</h5>
<p>&#x5982;&#x679C;&#x4F60;&#x60F3;&#x901A;&#x8FC7;&#x4E00;&#x4E2A;&#x56FA;&#x5B9A;&#x7684;ip&#x8BBF;&#x95EE;&#x5230;&#x4F60;&#x7684;&#x9879;&#x76EE;&#xFF0C;&#x90A3;&#x7ED9;&#x8FD9;&#x4E2A;&#x865A;&#x62DF;&#x5B9E;&#x4F8B;&#x8BBE;&#x7F6E;&#x4E00;&#x4E2A;&#x56FA;&#x5B9A;&#x7684;&#x79C1;&#x6709;ip&#xFF0C;&#x6CE8;&#x610F;&#x4E0D;&#x8981;&#x4E0E;&#x5176;&#x4ED6;ip&#x4EA7;&#x751F;&#x51B2;&#x7A81;&#xFF1A;</p>
<pre><code class="language-ruby">config.vm.network &quot;private_network&quot;, ip: &quot;192.168.100.100&quot;
</code></pre>
<p>&#x8FD9;&#x6837;&#x53EF;&#x4EE5;&#x65B9;&#x4FBF;&#x6211;&#x4EEC;&#x914D;&#x7F6E;&#x4E00;&#x4E2A;host&#x6307;&#x5411;&#x8FD9;&#x4E2A;&#x5B9E;&#x4F8B;&#xFF0C;&#x5982;&#xFF1A;</p>
<pre><code>&gt; vi /etc/hosts
192.168.100.100 dev.project.com
</code></pre>
<p>&#x5982;&#x679C;&#x4F60;&#x7684;&#x865A;&#x62DF;&#x5B9E;&#x4F8B;&#x8FD8;&#x9700;&#x8981;&#x8BBF;&#x95EE;&#x5916;&#x90E8;&#x7684;&#x4E00;&#x4E9B;&#x8D44;&#x6E90;&#xFF0C;&#x6BD4;&#x5982;&#x5C40;&#x57DF;&#x7F51;&#x4E2D;&#x7684;&#x6570;&#x636E;&#x5E93;&#xFF0C;&#x90A3;&#x4E48;&#x5C31;&#x9700;&#x8981;&#x4E3A;&#x5B83;&#x6865;&#x63A5;&#x4E00;&#x4E2A;&#x5916;&#x7F51;&#xFF1A;</p>
<pre><code class="language-ruby">config.vm.network &quot;public_network&quot;,
  # &#x9ED8;&#x8BA4;&#x7531;dhcp&#x5206;&#x914D;ip
  use_dhcp_assigned_default_route: true,
  # &#x6865;&#x63A5;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x53EF;&#x8BBE;&#x7F6E;&#x591A;&#x4E2A;
  bridge: [&quot;en0: Wi-Fi (AirPort)&quot;, &quot;en1: Wi-Fi (AirPort)&quot;]
</code></pre>
<p>&#x8FD9;&#x91CC;&#x76F4;&#x63A5;&#x901A;&#x8FC7;wifi&#x8FDE;&#x5230;&#x5C40;&#x57DF;&#x7F51;</p>
<h5 id="42">4.2 &#x5DE5;&#x4F5C;&#x76EE;&#x5F55;&#x914D;&#x7F6E;</h5>
<p>Vagrant&#x542F;&#x52A8;&#x540E;&#x4F1A;&#x628A;&#x5F53;&#x524D;&#x7684;&#x9879;&#x76EE;&#x76EE;&#x5F55;&#x6302;&#x8F7D;&#x5230;<code>/vagrant</code>&#xFF0C;&#x4F46;&#x53EF;&#x4EE5;&#x4FEE;&#x6539;&#xFF1A;</p>
<pre><code class="language-ruby"># &#x5C06;&#x5F53;&#x524D;&#x76EE;&#x5F55;mount&#x5230;/var/www/project
config.vm.synced_folder &quot;.&quot;, &quot;/var/www/project&quot;, 
  # &#x5982;&#x679C;&#x4E0D;&#x5B58;&#x5728;&#x5219;&#x521B;&#x5EFA;
  create: true
</code></pre>
<p>&#x66F4;&#x591A;&#x914D;&#x7F6E;&#x8BF7;&#x53C2;&#x8003;<a href="https://www.vagrantup.com/docs/vagrantfile/machine_settings.html?ref=iammapping.com">&#x5B98;&#x65B9;&#x6587;&#x6863;</a></p>
<h4 id="5">5 &#x542F;&#x52A8;</h4>
<pre><code>&gt; vagrant up
</code></pre>
<p>&#x542F;&#x52A8;&#x540E;&#x4F1A;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;Vagrant&#x7684;&#x5DE5;&#x4F5C;&#x76EE;&#x5F55;<code>.vagrant</code></p>
<p>&#x5982;&#x679C;&#x542F;&#x52A8;&#x65F6;&#x62A5;&#x9519;&#xFF1A;</p>
<pre><code>Failed to mount folders in Linux guest. This is usually because
the &quot;vboxsf&quot; file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

stdin: is not a tty
mount: unknown filesystem type &apos;vboxsf&apos;
</code></pre>
<p>&#x5B89;&#x88C5;<code>vagrant-vbguest</code>&#x63D2;&#x4EF6;</p>
<pre><code>&gt; vagrant plugin install vagrant-vbguest
</code></pre>
<p>&#x5982;&#x679C;&#x8FD8;&#x6CA1;&#x89E3;&#x51B3;&#xFF0C;&#x8BF7;&#x53C2;&#x8003;<a href="https://github.com/mitchellh/vagrant/issues/3341?ref=iammapping.com">https://github.com/mitchellh/vagrant/issues/3341</a></p>
<h4 id="6">6 &#x914D;&#x7F6E;&#x73AF;&#x5883;</h4>
<p>&#x767B;&#x5F55;&#x5230;&#x5B9E;&#x4F8B;</p>
<pre><code>&gt; vagrant ssh
</code></pre>
<p>&#x9ED8;&#x8BA4;&#x662F;&#x4F7F;&#x7528;<code>vagrant</code>&#x7528;&#x6237;&#x767B;&#x5F55;&#x3002;</p>
<p>&#x4E0A;&#x9762;&#x5B89;&#x88C5;&#x7684;box&#x662F;ubuntu&#xFF0C;&#x53EF;&#x53C2;&#x8003;<a href="http://www.cnblogs.com/CheeseZH/p/4694135.html?ref=iammapping.com">http://www.cnblogs.com/CheeseZH/p/4694135.html</a>&#x5B89;&#x88C5;&#xFF0C;&#x5982;&#x679C;&#x5B89;&#x88C5;&#x63D0;&#x793A;&#x6743;&#x9650;&#x9519;&#x8BEF;&#xFF0C;&#x52A0;&#x4E0A;<code>sudo</code>&#x5C31;&#x53EF;&#x4EE5;</p>
<h3 id="vagrant1n">Vagrant&#x7684;&#x4ECE;1&#x5230;n</h3>
<h4 id="1">1 &#x6253;&#x5305;</h4>
<p>&#x6253;&#x5305;&#x524D;&#x9700;&#x8981;&#x5C06;&#x5B9E;&#x4F8B;&#x505C;&#x6B62;</p>
<pre><code># &#x505C;&#x6B62;&#x5B9E;&#x4F8B;
&gt; vagrant halt
# &#x91CD;&#x65B0;&#x6253;&#x5305;
&gt; vagrant package
</code></pre>
<p>&#x6253;&#x5305;&#x540E;&#x4F1A;&#x5728;&#x5F53;&#x524D;&#x76EE;&#x5F55;&#x751F;&#x6210;&#x4E00;&#x4E2A;<code>package.box</code>&#x6587;&#x4EF6;</p>
<h4 id="2">2 &#x5206;&#x53D1;</h4>
<p>&#x6839;&#x636E;&#x4E0A;&#x9762;&#x7684;&#x6B65;&#x9AA4;&#xFF0C;Vagrant&#x4F1A;&#x5728;&#x5F53;&#x524D;&#x76EE;&#x5F55;&#x4EA7;&#x751F;3&#x4E2A;&#x6587;&#x4EF6;&#xFF1A;</p>
<ol>
<li>&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF1A;Vagrantfile</li>
<li>&#x5DE5;&#x4F5C;&#x76EE;&#x5F55;&#xFF1A;.vagrant</li>
<li>&#x65B0;&#x7684;Box&#xFF1A;package.box</li>
</ol>
<h5 id="21">2.1 &#x521D;&#x7EA7;&#x5206;&#x53D1;</h5>
<p>&#x521D;&#x7EA7;&#x7684;&#x5206;&#x53D1;&#x65B9;&#x5F0F;&#x5F88;&#x7B80;&#x5355;&#xFF0C;&#x5C31;&#x662F;&#x624B;&#x52A8;&#x5206;&#x53D1;&#xFF0C;&#x628A;<code>Vagrantfile</code>&#x548C;<code>package.box</code>&#x62F7;&#x7ED9;&#x4F60;&#x7684;&#x540C;&#x4E8B;&#xFF0C;&#x5047;&#x8BBE;&#x4ED6;&#x7684;&#x9879;&#x76EE;&#x76EE;&#x5F55;&#x662F;<code>/mydev/php/project</code>&#xFF0C;&#x5F53;&#x7136;&#x5728;&#x8FD9;&#x4E4B;&#x524D;&#x4ED6;&#x7684;&#x7535;&#x8111;&#x4E0A;&#x5FC5;&#x987B;&#x9884;&#x5148;&#x5B89;&#x88C5;&#x597D;&#x4E86;<code>VirtualBox</code>&#x548C;<code>Vagrant</code>&#x3002;</p>
<p>&#x7B2C;&#x4E00;&#x6B21;&#x521D;&#x59CB;&#x5316;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#xFF1A;</p>
<pre><code># &#x5C06;Vagrantfile&#x62F7;&#x5230;&#x9879;&#x76EE;&#x6839;&#x76EE;&#x5F55;
&gt; mv Vagrantfile /mydev/php/project/
# &#x5C06;package&#x5B89;&#x88C5;&#x5230;vagrant&#xFF0C;&#x6CE8;&#x610F;box&#x7684;&#x547D;&#x540D;&#x9700;&#x4E0E;&#x4E0A;&#x6587;&#x4E00;&#x81F4;
&gt; vagrant box add my-php-dev package.box
# &#x8FDB;&#x5165;&#x9879;&#x76EE;&#x76EE;&#x5F55;
&gt; cd /mydev/php/project/
# &#x542F;&#x52A8;
&gt; vagrant up
</code></pre>
<p>&#x5982;&#x679C;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#x6709;&#x53D8;&#x66F4;&#xFF0C;&#x751F;&#x6210;&#x4E86;&#x65B0;&#x7684;<code>package.box</code>&#xFF0C;&#x91CD;&#x65B0;&#x62F7;&#x8D1D;&#x8FC7;&#x6765;&#xFF0C;&#x9700;&#x8981;&#x6267;&#x884C;&#xFF1A;</p>
<pre><code># &#x5173;&#x95ED;&#x5E76;&#x9500;&#x6BC1;&#x5F53;&#x524D;&#x865A;&#x62DF;&#x5B9E;&#x4F8B;
&gt; vagrant destroy
&gt; vagrant box remove my-php-dev
</code></pre>
<p>&#x518D;&#x91CD;&#x590D;&#x4E0A;&#x9762;&#x7B2C;&#x4E00;&#x6B21;&#x7684;&#x6B65;&#x9AA4;&#x3002;</p>
<h5 id="22">2.2 &#x9AD8;&#x7EA7;&#x5206;&#x53D1;</h5>
<p>&#x4E0A;&#x9762;&#x521D;&#x7EA7;&#x5206;&#x53D1;&#x867D;&#x7136;&#x7B80;&#x5355;&#xFF0C;&#x4F46;&#x4E2D;&#x95F4;&#x8FD8;&#x662F;&#x6709;&#x5F88;&#x591A;&#x4EBA;&#x5DE5;&#x5E72;&#x9884;&#x7684;&#x6B65;&#x9AA4;&#xFF0C;&#x8FD9;&#x589E;&#x52A0;&#x4E86;&#x64CD;&#x4F5C;&#x5931;&#x8BEF;&#x7684;&#x6982;&#x7387;&#xFF0C;&#x4E5F;&#x65E0;&#x6CD5;&#x5B9E;&#x73B0;&#x4E0A;&#x6587;&#x63D0;&#x5230;&#x201C;&#x62C9;&#x4E00;&#x4E0B;&#x201D;&#x7684;&#x6548;&#x679C;&#x3002;</p>
<p>&#x4E0B;&#x9762;&#x5C31;&#x8BF4;&#x8BF4;&#x5982;&#x4F55;&#x5B9E;&#x73B0;&#x201C;&#x62C9;&#x4E00;&#x4E0B;&#x201D;&#x7684;&#x6548;&#x679C;&#xFF0C;&#x9700;&#x8981;&#x642D;&#x5EFA;&#x4E00;&#x4E2A;&#x4E3B;&#x673A;&#x6258;&#x7BA1;&#x4E0D;&#x540C;&#x7248;&#x672C;&#x7684;<code>Box</code>&#x3002;&#x4EE5;&#x4E0B;&#x5185;&#x5BB9;&#x53C2;&#x8003;&#x81EA;<a href="https://github.com/hollodotme/Helpers/blob/master/Tutorials/vagrant/self-hosted-vagrant-boxes-with-versioning.md?ref=iammapping.com">self-hosted-vagrant-boxes-with-versioning</a></p>
<h6 id="221box">2.2.1 &#x5B9A;&#x4E49;<code>Box</code>&#x5B58;&#x653E;&#x7684;&#x76EE;&#x5F55;&#x7ED3;&#x6784;</h6>
<pre><code>- /var/www
    `- vagrant                          # &#x6839;&#x76EE;&#x5F55;
       `- my-php-dev                    # Box&#x6587;&#x4EF6;&#x5939;
          |- boxes                      # &#x5B58;&#x653E;&#x6240;&#x6709;&#x4E0D;&#x540C;&#x7248;&#x672C;&#x7684;Box
          |  |- my-php-dev_0.1.0.box    # &#x7248;&#x672C; 0.1.0
          |  `- my-php-dev_0.1.1.box    # &#x7248;&#x672C; 0.1.1
          `- my-php-dev.json            # Box&#x7684;&#x76EE;&#x5F55;&#x7D22;&#x5F15;&#x6587;&#x4EF6;
</code></pre>
<p>&#x6839;&#x76EE;&#x5F55;<code>vagrant</code>&#x7528;&#x6765;&#x5B58;&#x653E;&#x6240;&#x6709;&#x7684;<code>Box</code>&#x96C6;&#x5408;&#xFF0C;&#x4E5F;&#x8BB8;&#x4F60;&#x8FD8;&#x4F1A;&#x5EFA;&#x4E00;&#x4E2A;<code>my-java-dev</code></p>
<h6 id="222web">2.2.2 &#x914D;&#x7F6E;Web&#x670D;&#x52A1;</h6>
<p>&#x8FDB;&#x5165;&#x5230;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x786E;&#x4FDD;&#x670D;&#x52A1;&#x5668;&#x5DF2;&#x5B89;&#x88C5;&#x597D;<code>nginx</code>&#xFF0C;&#x521B;&#x5EFA;2.2.1&#x4E2D;&#x7684;&#x76EE;&#x5F55;&#x7ED3;&#x6784;&#xFF1A;</p>
<pre><code>&gt; mkdir -p /var/www/vagrant/my-php-dev/boxes
</code></pre>
<p>&#x65B0;&#x589E;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF1A;</p>
<pre><code>&gt; vi /etc/nginx/sites-enabled/vagrant
</code></pre>
<p>&#x5185;&#x5BB9;&#x4E3A;&#xFF1A;</p>
<pre><code>server {
    listen   80;

    server_name vagrant.myhost.com;

    root /var/www/vagrant;

    # &#x8BBF;&#x95EE;box&#x76EE;&#x5F55;&#x65F6;&#xFF0C;&#x8FD4;&#x56DE;&#x76EE;&#x5F55;&#x7D22;&#x5F15;&#x6587;&#x4EF6;
    # e.g. http://vagrant.myhost.com/my-php-dev/ &#x89E3;&#x6790;&#x4E3A; /var/www/vagrant/my-php-dev/my-php-dev.json  
    location ~ ^/([^\/]+)/$ {
        index $1.json;
        try_files $uri $uri/ $1.json =404;
        autoindex off;
    }

    # &#x5141;&#x8BB8;&#x7D22;&#x5F15;boxes&#x76EE;&#x5F55;
    location ~ ^/([^\/]+)/boxes/$ {
        try_files $uri $uri/ =404;
        autoindex on;
        autoindex_exact_size on;
        autoindex_localtime on;
    }

    # &#x4FEE;&#x6539;json&#x6587;&#x4EF6;&#x7684;header
    location ~ \.json$ {
        add_header Content-Type application/json;
    }

    # &#x4FEE;&#x6539;json&#x6587;&#x4EF6;&#x7684;header
    location ~ \.box$ {
        add_header Content-Type application/octet-stream;
    }

    # &#x963B;&#x6B62;&#x76F4;&#x63A5;&#x8BBF;&#x95EE;&#x6839;&#x76EE;&#x5F55;
    location ~ ^/$ {
        return 403;
    }
}
</code></pre>
<p>&#x91CD;&#x65B0;&#x8F7D;&#x5165;nginx&#x914D;&#x7F6E;&#xFF1A;</p>
<pre><code>&gt; service nginx reload
</code></pre>
<h6 id="223box">2.2.3 &#x65B0;&#x589E;Box&#x7684;&#x76EE;&#x5F55;&#x7D22;&#x5F15;&#x6587;&#x4EF6;</h6>
<p>&#x5728;&#x670D;&#x52A1;&#x5668;&#x4E2D;&#x8FDB;&#x5165;box&#x76EE;&#x5F55;&#xFF0C;&#x6DFB;&#x52A0;&#x76EE;&#x5F55;&#x7D22;&#x5F15;&#x6587;&#x4EF6;&#xFF1A;</p>
<pre><code>&gt; cd /var/www/vagrant/my-php-dev/
&gt; vi my-php-dev.json
</code></pre>
<p>&#x5185;&#x5BB9;&#x4E3A;&#xFF1A;</p>
<pre><code>{
    &quot;name&quot;: &quot;my-php-dev&quot;,
    &quot;description&quot;: &quot;my php development box&quot;,
    &quot;versions&quot;: [{
        &quot;version&quot;: &quot;0.1.0&quot;,
        &quot;providers&quot;: [{
            &quot;name&quot;: &quot;virtualbox&quot;,
            &quot;url&quot;: &quot;http://vagrant.myhost.com/my-php-dev/boxes/my-php-dev_0.1.0.box&quot;,
            &quot;checksum_type&quot;: &quot;sha1&quot;,
            &quot;checksum&quot;: &quot;d3597dccfdc6953d0a6eff4a9e1903f44f72ab94&quot;
        }]
    },{
        &quot;version&quot;: &quot;0.1.1&quot;,
        &quot;providers&quot;: [{
            &quot;name&quot;: &quot;virtualbox&quot;,
            &quot;url&quot;: &quot;http://vagrant.myhost.com/my-php-dev/boxes/my-php-dev_0.1.1.box&quot;,
            &quot;checksum_type&quot;: &quot;sha1&quot;,
            &quot;checksum&quot;: &quot;0b530d05896cfa60a3da4243d03eccb924b572e2&quot;
        }]
    }]
}
</code></pre>
<p>box&#x6587;&#x4EF6;&#x7684;checksum&#x53EF;&#x901A;&#x8FC7;<code>openssl sha1</code>&#x751F;&#x6210;&#xFF1A;</p>
<pre><code>&gt; openssl sha1 /var/www/vagrant/my-php-dev/boxes/my-php-dev_0.1.0.box
SHA1(/var/www/vagrant/my-php-dev/boxes/my-php-dev_0.1.0.box)= d3597dccfdc6953d0a6eff4a9e1903f44f72ab94
</code></pre>
<h6 id="224box">2.2.4 &#x4E0A;&#x4F20;&#x4F60;&#x7684;Box</h6>
<p>&#x4E0A;&#x9762;&#x6211;&#x4EEC;&#x6253;&#x5305;&#x65F6;&#x751F;&#x6210;&#x7684;<code>package.box</code>&#xFF0C;&#x53EF;&#x4EE5;&#x91CD;&#x547D;&#x540D;&#x4E3A;&#x5E26;&#x7248;&#x672C;&#x53F7;&#x7684;&#x6587;&#x4EF6;&#x540D;<code>my-php-dev_0.1.0.box</code>&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x5728;&#x6253;&#x5305;&#x65F6;&#x6307;&#x5B9A;&#xFF1A;</p>
<pre><code>&gt; vagrant package --output &apos;my-php-dev_0.1.1.box&apos;
</code></pre>
<p>&#x628A;<code>my-php-dev_0.1.0.box</code>&#x548C;<code>my-php-dev_0.1.1.box</code>&#x90FD;&#x4E0A;&#x4F20;&#x5230;&#x670D;&#x52A1;&#x5668;&#x7684;<code>/var/www/vagrant/my-php-dev/boxes/</code>&#x76EE;&#x5F55;&#x4E2D;&#x3002;</p>
<p>&#x4E0A;&#x4F20;&#x5B8C;&#x6210;&#x540E;&#xFF0C;&#x8BBF;&#x95EE;<code>http://vagrant.myhost.com/vagrant/my-php-dev/boxes/</code>&#x5E94;&#x8BE5;&#x4F1A;&#x5217;&#x51FA;&#x6240;&#x6709;box&#x6587;&#x4EF6;&#x3002;</p>
<p>&#x5927;&#x653E;&#x9001;&#x4E00;&#x4E2A;php&#x811A;&#x672C;&#xFF0C;&#x81EA;&#x52A8;&#x751F;&#x6210;&#x76EE;&#x5F55;&#x7D22;&#x5F15;&#x6587;&#x4EF6;&#xFF1A;</p>
<pre><code class="language-php">&lt;?php

$boxName = isset($argv[1]) ? $argv[1] : &apos;&apos;;

if (!$boxName) {
    echo &apos;The box name is required&apos; . PHP_EOL;
    exit(1);
}

$boxBaseDir = __DIR__ . &apos;/&apos; . $boxName;
$boxJsonFile = $boxBaseDir . &apos;/&apos; . $boxName . &apos;.json&apos;;
$boxesDir = $boxBaseDir . &apos;/boxes&apos;;

if (!file_exists($boxBaseDir) || !file_exists($boxJsonFile) || !file_exists($boxesDir)) {
    echo &apos;The box is not inited&apos; . PHP_EOL;
    exit(1);
}

$meta = json_decode(file_get_contents($boxJsonFile), true);
$regVersionBox = &apos;/_(\d+\.\d+\.\d+)\.box$/&apos;;

$boxes = array_filter(scandir($boxesDir), function($filename) use ($regVersionBox) {
    // &#x8FC7;&#x6EE4;&#x6389;&#x4E0D;&#x5305;&#x542B;&#x7248;&#x672C;&#x53F7;&#x7684;box&#x6587;&#x4EF6;
    return $filename != &apos;.&apos; &amp;&amp; $filename != &apos;..&apos; &amp;&amp; preg_match($regVersionBox, $filename);
});

$meta[&apos;versions&apos;] = isset($meta[&apos;versions&apos;]) ? $meta[&apos;versions&apos;] : array();
if (!isset($meta[&apos;baseurl&apos;])) {
    echo &apos;Warning! baseurl is not defined in json&apos; . PHP_EOL;
}

foreach ($boxes as $box) {
    preg_match($regVersionBox, $box, $match);
    $version = $match[1];
    $isVersionExist = false;
    foreach ($meta[&apos;versions&apos;] as $ver) {
        if ($ver[&apos;version&apos;] == $version) {
            $isVersionExist = true;
            break;
        }
    }
    if ($isVersionExist) {
        continue;
    }

    $checksum = sha1_file($boxesDir . &apos;/&apos; . $box);
    $meta[&apos;versions&apos;][] = array(
        &apos;version&apos; =&gt; $version,
        &apos;providers&apos; =&gt; array(
            array(
                &apos;name&apos; =&gt; &apos;virtualbox&apos;,
                &apos;url&apos; =&gt; $meta[&apos;baseurl&apos;] . &apos;/&apos; . $boxName . &apos;/boxes/&apos; . $box,
                &apos;checksum_type&apos; =&gt; &apos;sha1&apos;,
                &apos;checksum&apos; =&gt; $checksum
            )
        )
    );
}

$metaJson = json_encode($meta, JSON_PRETTY_PRINT);
file_put_contents($boxJsonFile, $metaJson);
echo $metaJson . PHP_EOL;
?&gt;
</code></pre>
<p>&#x5C06;&#x4EE5;&#x4E0A;&#x811A;&#x672C;&#x4FDD;&#x5B58;&#x5230;&#x670D;&#x52A1;&#x5668;&#x76EE;&#x5F55;<code>/var/www/vagrant/</code>&#x4E2D;&#xFF0C;&#x5B58;&#x4E3A;<code>autoversion.php</code>&#xFF0C;&#x6BCF;&#x6B21;&#x4E0A;&#x4F20;&#x5B8C;&#x65B0;&#x7248;&#x672C;&#x7684;box&#x6587;&#x4EF6;&#x540E;&#xFF0C;&#x6267;&#x884C;&#xFF1A;</p>
<pre><code>&gt; cd /var/www/vagrant/
&gt; php autoversion.php my-php-dev
</code></pre>
<p>&#x5C31;&#x53EF;&#x4EE5;&#x81EA;&#x52A8;&#x751F;&#x6210;&#x65B0;&#x7684;&#x76EE;&#x5F55;&#x7D22;&#x5F15;&#x6587;&#x4EF6;&#x4E86;&#x3002;</p>
<h6 id="225vagrantfile">2.2.5 &#x4FEE;&#x6539;Vagrantfile</h6>
<p>&#x4FEE;&#x6539;&#x672C;&#x5730;&#x9879;&#x76EE;&#x4E2D;&#x7684;<code>Vagrantfile</code>&#xFF0C;&#x5728;</p>
<pre><code class="language-ruby">config.vm.box = &quot;my-php-dev&quot;
</code></pre>
<p>&#x4E4B;&#x540E;&#x6DFB;&#x52A0;&#xFF1A;</p>
<pre><code class="language-ruby">config.vm.box_url = &quot;http://vagrant.myhost.com/vagrant/my-php-dev/my-php-dev.json&quot;
</code></pre>
<h6 id="226">2.2.6 &#x62C9;&#x4E00;&#x4E0B;</h6>
<p>&#x5C06;<code>Vagrantfile</code>&#x4E0E;&#x9879;&#x76EE;&#x4EE3;&#x7801;&#x4E00;&#x6837;&#x653E;&#x5230;&#x7248;&#x672C;&#x63A7;&#x5236;&#x91CC;&#xFF0C;&#x6CE8;&#x610F;&#x628A;<code>.vagrant</code>&#x76EE;&#x5F55;&#x5728;&#x7248;&#x672C;&#x63A7;&#x5236;&#x4E2D;&#x5FFD;&#x7565;&#x3002;</p>
<p>&#x5728;<code>Vagrantfile</code>&#x4E2D;&#x6709;&#x4E00;&#x4E2A;&#x914D;&#x7F6E;&#x88AB;&#x6CE8;&#x91CA;&#x4E86;:</p>
<pre><code class="language-ruby"># Disable automatic box update checking. If you disable this, then
# boxes will only be checked for updates when the user runs
# `vagrant box outdated`. This is not recommended.
# config.vm.box_check_update = false
</code></pre>
<p>&#x5C31;&#x8868;&#x793A;<code>box_check_update</code>&#x9ED8;&#x8BA4;&#x662F;&#x5F00;&#x542F;&#x7684;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#x6267;&#x884C;<code>vagrant up</code>&#x65F6;&#x4F1A;&#x81EA;&#x52A8;&#x68C0;&#x67E5;<code>Box</code>&#x662F;&#x5426;&#x6709;&#x66F4;&#x65B0;&#x3002;</p>
<pre><code>&gt; vagrant up
Bringing machine &apos;default&apos; up with &apos;virtualbox&apos; provider...
==&gt; default: Checking if box &apos;my-php-dev&apos; is up to date...
==&gt; default: A newer version of the box &apos;my-php-dev&apos; is available! You currently
==&gt; default: have version &apos;0.1.0&apos;. The latest is version &apos;0.1.1&apos;. Run
==&gt; default: `vagrant box update` to update.
...
</code></pre>
<p>&#x6309;&#x7167;&#x63D0;&#x793A;&#xFF0C;&#x6267;&#x884C;<code>vagrant box update</code>&#x5C31;&#x53EF;&#x4EE5;&#x66F4;&#x65B0;&#x5230;&#x6700;&#x65B0;&#x7684;&#x7248;&#x672C;&#x3002;</p>
<p>&#x5230;&#x6B64;&#x4E3A;&#x6B62;&#xFF0C;&#x6211;&#x4EEC;&#x7684;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#x5DF2;&#x7ECF;&#x53EF;&#x4EE5;&#x4E00;&#x952E;&#x62C9;&#x53D6;&#x4E86;&#x3002;</p>
<h3 id>&#x603B;&#x7ED3;</h3>
<p>&#x4F7F;&#x7528;Vagrant&#x642D;&#x5EFA;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#xFF0C;&#x5C06;&#x5927;&#x5927;&#x51CF;&#x5C11;&#x91CD;&#x590D;&#x914D;&#x7F6E;&#x7684;&#x5DE5;&#x4F5C;&#xFF0C;&#x662F;&#x65F6;&#x5019;&#x8DDF;&#x201C;&#x4EE3;&#x7801;&#x5728;&#x6211;&#x8FD9;&#x8FD0;&#x884C;&#x6CA1;&#x95EE;&#x9898;&#x201D;&#x8BF4;&#x518D;&#x89C1;&#x4E86;&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[如何优雅地写js异步代码]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p><img src="https://iammapping.com/content/images/2016/02/advancedjs-async-1.jpg" alt="ADVANCED JS RETHINKING ASYNC" loading="lazy"><br>
&#x672C;&#x6587;&#x901A;&#x8FC7;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x9700;&#x6C42;&#xFF1A;&#x8BFB;&#x53D6;&#x6587;&#x4EF6;&#x5E76;&#x5907;&#x4EFD;&#x5230;&#x6307;&#x5B9A;&#x76EE;&#x5F55;&#xFF08;&#x8BE6;&#x89C1;&#x7B2C;&#x4E00;&#x6BB5;&#x4EE3;&#x7801;&#x7684;&#x6CE8;&#x91CA;&#xFF09;&#xFF0C;&#x4EE5;&#x4E0D;&#x540C;&#x7684;js&#x4EE3;&#x7801;&#x5B9E;&#x73B0;&#xFF0C;&#x6765;&#x6F14;&#x793A;</p>]]></description><link>https://iammapping.com/write-js-async-gracefully/</link><guid isPermaLink="false">6522cda9caa77d0fabe3ef37</guid><category><![CDATA[NodeJs]]></category><category><![CDATA[Async]]></category><category><![CDATA[Promise]]></category><category><![CDATA[Generator]]></category><dc:creator><![CDATA[Iam Mapping]]></dc:creator><pubDate>Tue, 02 Feb 2016 06:41:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><img src="https://iammapping.com/content/images/2016/02/advancedjs-async-1.jpg" alt="ADVANCED JS RETHINKING ASYNC" loading="lazy"><br>
&#x672C;&#x6587;&#x901A;&#x8FC7;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x9700;&#x6C42;&#xFF1A;&#x8BFB;&#x53D6;&#x6587;&#x4EF6;&#x5E76;&#x5907;&#x4EFD;&#x5230;&#x6307;&#x5B9A;&#x76EE;&#x5F55;&#xFF08;&#x8BE6;&#x89C1;&#x7B2C;&#x4E00;&#x6BB5;&#x4EE3;&#x7801;&#x7684;&#x6CE8;&#x91CA;&#xFF09;&#xFF0C;&#x4EE5;&#x4E0D;&#x540C;&#x7684;js&#x4EE3;&#x7801;&#x5B9E;&#x73B0;&#xFF0C;&#x6765;&#x6F14;&#x793A;&#x4EE3;&#x7801;&#x662F;&#x5982;&#x4F55;&#x53D8;&#x4F18;&#x96C5;&#x7684;&#x3002;&#x5BF9;&#x6BD4;&#x624D;&#x80FD;&#x5206;&#x6E05;&#x597D;&#x574F;&#xFF0C;&#x60F3;&#x77E5;&#x9053;&#x4EC0;&#x4E48;&#x662F;&#x4F18;&#x96C5;&#x7684;&#x4EE3;&#x7801;&#xFF0C;&#x5148;&#x770B;&#x770B;&#x7CDF;&#x7CD5;&#x7684;&#x4EE3;&#x7801;&#x3002;</p>
<h2 id>&#x4E0D;&#x4F18;&#x96C5;&#x7684;&#x4EE3;&#x7801;&#x662F;&#x4EC0;&#x4E48;&#x6837;&#x7684;&#xFF1F;</h2>
<p>1&#x3001; &#x56DE;&#x8C03;&#x5730;&#x72F1;</p>
<pre><code class="language-javascript">/**
 * &#x8BFB;&#x53D6;&#x5F53;&#x524D;&#x76EE;&#x5F55;&#x7684;package.json&#xFF0C;&#x5E76;&#x5C06;&#x5176;&#x5907;&#x4EFD;&#x5230;backup&#x76EE;&#x5F55;
 * 
 * 1. &#x8BFB;&#x53D6;&#x5F53;&#x524D;&#x76EE;&#x5F55;&#x7684;package.json
 * 2. &#x68C0;&#x67E5;backup&#x76EE;&#x5F55;&#x662F;&#x5426;&#x5B58;&#x5728;&#xFF0C;&#x5982;&#x679C;&#x4E0D;&#x5B58;&#x5728;&#x5C31;&#x521B;&#x5EFA;backup&#x76EE;&#x5F55;
 * 3. &#x5C06;&#x6587;&#x4EF6;&#x5185;&#x5BB9;&#x5199;&#x5230;&#x5907;&#x4EFD;&#x6587;&#x4EF6;
 */
fs.readFile(&apos;./package.json&apos;, function(err, data) {
    if (err) {
        console.error(err);
    } else {
        fs.exists(&apos;./backup&apos;, function(exists) {
            if (!exists) {
                fs.mkdir(&apos;./backup&apos;, function(err) {
                    if (err) {
                        console.error(err);
                    } else {
                        // throw new Error(&apos;unexpected&apos;);
                        fs.writeFile(&apos;./backup/package.json&apos;, data, function(err) {
                            if (err) {
                                console.error(err);
                            } else {
                                console.log(&apos;backup successed&apos;);
                            }
                        });
                    }
                });
            } else {
                fs.writeFile(&apos;./backup/package.json&apos;, data, function(err) {
                    if (err) {
                        console.error(err);
                    } else {
                        console.log(&apos;backup successed&apos;);
                    }
                });
            }
        });
    }
});
</code></pre>
<p>2&#x3001; &#x533F;&#x540D;&#x8C03;&#x8BD5;</p>
<p>&#x53D6;&#x6D88;&#x4E0A;&#x9762;&#x4EE3;&#x7801;&#x4E2D;&#x629B;&#x51FA;&#x5F02;&#x5E38;&#x7684;&#x6CE8;&#x91CA;&#x518D;&#x6267;&#x884C;<br>
<img src="https://iammapping.com/content/images/2016/02/8801EACB-13DF-4E21-8452-1003A209AED5.png" alt loading="lazy"></p>
<p>wtf&#xFF0C;&#x8FD9;&#x4E2A;<code>unexpected</code>&#x9519;&#x8BEF;&#x4ECE;&#x54EA;&#x4E2A;&#x65B9;&#x6CD5;&#x629B;&#x51FA;&#x6765;&#x7684;&#xFF1F;</p>
<p>&#x795E;&#x9A6C;&#xFF1F;&#x4F60;&#x89C9;&#x7684;&#x8FD9;&#x4E2A;&#x4EE3;&#x7801;&#x5199;&#x5F97;&#x5F88;&#x597D;&#xFF0C;&#x4F18;&#x96C5;&#x5F97;&#x65E0;&#x53EF;&#x6311;&#x5254;&#xFF1F;&#x90A3;&#x4E48;&#x4F60;&#x73B0;&#x5728;&#x53EF;&#x4EE5;&#x5FFD;&#x7565;&#x4E0B;&#x6587;&#x76F4;&#x63A5;&#x53BB;&#x6700;&#x540E;&#x7684;&#x8BC4;&#x8BBA;&#x5199;&#xFF1A;&#x697C;&#x4E3B;&#x654F;&#x611F;&#x8BCD;</p>
<h2 id="js">&#x600E;&#x6837;&#x5199;&#x624D;&#x80FD;&#x8BA9;js&#x56DE;&#x8C03;&#x770B;&#x4E0A;&#x53BB;&#x4F18;&#x96C5;&#xFF1F;</h2>
<p>1&#x3001; &#x6D88;&#x9664;&#x56DE;&#x8C03;&#x5D4C;&#x5957;</p>
<p>2&#x3001; &#x547D;&#x540D;&#x65B9;&#x6CD5;</p>
<pre><code class="language-javascript">fs.readFile(&apos;./package.json&apos;, function(err, data) {
    if (err) {
        console.error(err);
    } else {
        writeFileContentToBackup(data);
    }
});


function writeFileContentToBackup(fileContent) {
    checkBackupDir(function(err) {
        if (err) {
            console.error(err);
        } else {
            backup(fileContent, log);
        }
    });
}

function checkBackupDir(cb) {
    fs.exists(&apos;./backup&apos;, function(exists) {
        if (!exists) {
            mkBackupDir(cb);
        } else {
            cb(null);
        }
    });
}

function mkBackupDir(cb) {
    // throw new Error(&apos;unexpected&apos;);
    fs.mkdir(&apos;./backup&apos;, cb);
}

function backup(data, cb) {
    fs.writeFile(&apos;./backup/package.json&apos;, data, cb);
}

function log(err) {
    if (err) {
        console.error(err);
    } else {
        console.log(&apos;backup successed&apos;);
    }
}
</code></pre>
<p>&#x6211;&#x4EEC;&#x73B0;&#x5728;&#x53EF;&#x4EE5;&#x5FEB;&#x901F;&#x5B9A;&#x4F4D;&#x629B;&#x51FA;&#x5F02;&#x5E38;&#x7684;&#x65B9;&#x6CD5;</p>
<p><img src="https://iammapping.com/content/images/2016/02/1FE18407-64BC-4FE6-A421-2238FBF0FCEC.png" alt loading="lazy"></p>
<h2 id>&#x4ED6;&#x5C71;&#x4E4B;&#x77F3; &#x53EF;&#x4EE5;&#x653B;&#x7389;</h2>
<p>&#x501F;&#x52A9;&#x7B2C;&#x4E09;&#x65B9;&#x5E93;&#xFF0C;&#x4F18;&#x5316;&#x5F02;&#x6B65;&#x4EE3;&#x7801;</p>
<h3 id="browserjs">browser js</h3>
<ul>
<li>jQuery Deferred
<ul>
<li>ajax</li>
<li>animate</li>
</ul>
</li>
</ul>
<h3 id="nodejs">NodeJs</h3>
<ul>
<li>
<p><a href="https://github.com/caolan/async?ref=iammapping.com">Async</a></p>
<ul>
<li>async.each</li>
<li>async.map</li>
<li>async.waterfall</li>
</ul>
</li>
<li>
<p>ECMAScript 6</p>
<ul>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise?ref=iammapping.com">Promise</a></li>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/function*?ref=iammapping.com">Generator</a></li>
</ul>
</li>
</ul>
<hr>
<h2 id="jquerydeferred">jQuery Deferred</h2>
<blockquote>
<p>&#x5728;jQuery-1.5&#x4E2D;&#x5F15;&#x8FDB;&#xFF0C;&#x88AB;&#x5E94;&#x7528;&#x5728;ajax&#x3001;animate&#x7B49;&#x5F02;&#x6B65;&#x65B9;&#x6CD5;&#x4E0A;</p>
</blockquote>
<p>&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x4F8B;&#x5B50;&#xFF1A;</p>
<pre><code class="language-javascript">function sleep(timeout) {
    var dtd = $.Deferred();
    setTimeout(dtd.resolve, timeout);
    return dtd;
}

// &#x7B49;&#x540C;&#x4E8E;&#x4E0A;&#x9762;&#x7684;&#x5199;&#x6CD5;
function sleep(timeout) {
    return $.Deferred(function(dtd) {
        setTimeout(dtd.resolve, timeout);
    });
}

console.time(&apos;sleep&apos;);
sleep(2000).done(function() {
    console.timeEnd(&apos;sleep&apos;);
});
</code></pre>
<p>&#x4E00;&#x4E2A;&#x590D;&#x6742;&#x7684;&#x4F8B;&#x5B50;&#xFF1A;</p>
<pre><code class="language-javascript">function loadImg(src) {
    var dtd = $.Deferred(),
        img = new Image;

    img.onload = function() {
        dtd.resolve(img);
    }

    img.onerror = function(e) {
        dtd.reject(e);
    }

    img.src = src;

    return dtd;
}

loadImg(&apos;http://www.baidu.com/favicon.ico&apos;).then(
    function(img) {
        $(&apos;body&apos;).prepend(img);
    }, function() {
        alert(&apos;load error&apos;);
    }
)
</code></pre>
<p>&#x90A3;&#x4E48;&#x95EE;&#x9898;&#x6765;&#x4E86;&#xFF0C;&#x6211;&#x60F3;&#x8981;&#x8FC7;5s&#x540E;&#x628A;&#x767E;&#x5EA6;Logo&#x663E;&#x793A;&#x51FA;&#x6765;&#xFF1F;</p>
<p>&#x666E;&#x901A;&#x5199;&#x6CD5;&#xFF1A;</p>
<pre><code class="language-javascript">sleep(5000).done(function() {
     loadImg(&apos;http://www.baidu.com/favicon.ico&apos;).done(function(img) {
        $(&apos;body&apos;).prepend(img);
    });
});
</code></pre>
<p>&#x4E8C;&#x903C;&#x5199;&#x6CD5;&#xFF1A;</p>
<pre><code class="language-js">setTimeout(function() {
    loadImg(&apos;http://www.baidu.com/favicon.ico&apos;).done(function(img) {
        $(&apos;body&apos;).prepend(img);
    });
}, 5000);
</code></pre>
<p>&#x6587;&#x827A;&#x5199;&#x6CD5;(&#x7761;5s&#x548C;&#x52A0;&#x8F7D;&#x56FE;&#x7247;&#x540C;&#x6B65;&#x6267;&#x884C;)&#xFF1A;</p>
<pre><code class="language-js">$.when(sleep(5000), loadImg(&apos;http://www.baidu.com/favicon.ico&apos;)).done(function(ignore, img) {
    $(&apos;body&apos;).prepend(img);
});
</code></pre>
<h2 id="async">Async</h2>
<p>&#x4F7F;&#x7528;&#x65B9;&#x6CD5;&#x53C2;&#x8003;&#xFF1A;<a href="https://github.com/caolan/async?ref=iammapping.com">https://github.com/caolan/async</a></p>
<p>&#x4F18;&#x70B9;&#xFF1A;</p>
<ol>
<li>&#x7B80;&#x5355;&#x3001;&#x6613;&#x4E8E;&#x7406;&#x89E3;</li>
<li>&#x51FD;&#x6570;&#x4E30;&#x5BCC;&#xFF0C;&#x51E0;&#x4E4E;&#x53EF;&#x4EE5;&#x6EE1;&#x8DB3;&#x4EFB;&#x4F55;&#x56DE;&#x8C03;&#x9700;&#x6C42;</li>
<li>&#x6D41;&#x884C;</li>
</ol>
<p>&#x7F3A;&#x70B9;&#xFF1A;</p>
<ol>
<li>&#x989D;&#x5916;&#x5F15;&#x5165;&#x7B2C;&#x4E09;&#x65B9;&#x5E93;</li>
<li>&#x867D;&#x7136;&#x7B80;&#x5355;&#xFF0C;&#x4F46;&#x8FD8;&#x662F;&#x96BE;&#x4EE5;&#x638C;&#x63E1;&#x6240;&#x6709;api</li>
</ol>
<h2 id="ecmascript6">ECMAScript 6</h2>
<blockquote>
<p>ES6&#x7684;&#x76EE;&#x6807;&#xFF0C;&#x662F;&#x4F7F;&#x5F97;JavaScript&#x8BED;&#x8A00;&#x53EF;&#x4EE5;&#x7528;&#x6765;&#x7F16;&#x5199;&#x5927;&#x578B;&#x7684;&#x590D;&#x6742;&#x7684;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#xFF0C;&#x6210;&#x4E3A;&#x4F01;&#x4E1A;&#x7EA7;&#x5F00;&#x53D1;&#x8BED;&#x8A00;&#x3002;</p>
</blockquote>
<p>&#x63A5;&#x4E0B;&#x6765;&#x4ECB;&#x7ECD;ES6&#x7684;&#x65B0;&#x7279;&#x6027;&#xFF1A;Promise&#x5BF9;&#x8C61;&#x548C;Generator&#x51FD;&#x6570;&#xFF0C;&#x662F;&#x5982;&#x4F55;&#x8BA9;&#x4EE3;&#x7801;&#x770B;&#x8D77;&#x6765;&#x66F4;&#x4F18;&#x96C5;&#x3002;</p>
<p>&#x66F4;&#x591A;ES6&#x7684;&#x7279;&#x6027;&#x53C2;&#x8003;&#xFF1A;<a href="http://es6.ruanyifeng.com/?ref=iammapping.com">ECMAScript 6 &#x5165;&#x95E8;</a></p>
<h3 id="promise">Promise</h3>
<p>Promise&#x5BF9;&#x8C61;&#x7684;&#x521D;&#x59CB;&#x5316;&#x4EE5;&#x53CA;&#x4F7F;&#x7528;&#xFF1A;</p>
<pre><code class="language-javascript">var promise = new Promise(function(resolve, reject) {
    setTimeout(function() {
        if (true) {
            resolve(&apos;ok&apos;);
        } else {
            reject(new Error(&apos;unexpected error&apos;));
        }
    }, 2000);
});

promise.then(function(msg) {
    // throw new Error(&apos;unexpected resolve error&apos;);
    console.log(msg);
}).catch(function(err) {
    console.error(err);
});
</code></pre>
<blockquote>
<p>JavaScript Promise &#x7684; API &#x4F1A;&#x628A;&#x4EFB;&#x4F55;&#x5305;&#x542B;&#x6709; then &#x65B9;&#x6CD5;&#x7684;&#x5BF9;&#x8C61;&#x5F53;&#x4F5C;&#x201C;&#x7C7B; Promise&#x201D;&#xFF08;&#x6216;&#x8005;&#x7528;&#x672F;&#x8BED;&#x6765;&#x8BF4;&#x5C31;&#x662F; thenable&#xFF09;</p>
</blockquote>
<p>&#x4E0E;&#x4E0A;&#x9762;&#x4ECB;&#x7ECD;&#x7684;jQuery Deferred&#x5BF9;&#x8C61;&#x7C7B;&#x4F3C;&#xFF0C;&#x4F46;api&#x65B9;&#x6CD5;&#x548C;&#x9519;&#x8BEF;&#x6355;&#x6349;&#x7B49;&#x4E0D;&#x5B8C;&#x5168;&#x4E00;&#x6837;&#x3002;<br>
&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x4EE5;&#x4E0B;&#x65B9;&#x6CD5;&#x8F6C;&#x6362;&#xFF1A;</p>
<pre><code class="language-javascript">var promise = Promise.resolve($.Deferred());
</code></pre>
<p>&#x90A3;&#x600E;&#x4E48;&#x4F7F;&#x7528;Promise&#x6539;&#x5199;&#x56DE;&#x8C03;&#x5730;&#x72F1;&#x90A3;&#x4E2A;&#x4F8B;&#x5B50;&#xFF1F;</p>
<pre><code class="language-javascript">// 1. &#x8BFB;&#x53D6;&#x5F53;&#x524D;&#x76EE;&#x5F55;&#x7684;package.json
readPackageFile.then(function(data) {
    // 2. &#x68C0;&#x67E5;backup&#x76EE;&#x5F55;&#x662F;&#x5426;&#x5B58;&#x5728;&#xFF0C;&#x5982;&#x679C;&#x4E0D;&#x5B58;&#x5728;&#x5C31;&#x521B;&#x5EFA;backup&#x76EE;&#x5F55;
    return checkBackupDir.then(function() {
        // 3. &#x5C06;&#x6587;&#x4EF6;&#x5185;&#x5BB9;&#x5199;&#x5230;&#x5907;&#x4EFD;&#x6587;&#x4EF6;
        return backupPackageFile(data);
    });
}).then(function() {
    console.log(&apos;backup successed&apos;);
}).catch(function(err) {
    console.error(err);
});
</code></pre>
<p>&#x8FD9;&#x4E48;&#x7B80;&#x5355;&#xFF1F;</p>
<p>&#x770B;&#x770B;<code>readPackageFile</code>&#x3001;<code>checkBackupDir</code>&#x548C;<code>backupPackageFile</code>&#x7684;&#x5B9A;&#x4E49;&#xFF1A;</p>
<pre><code class="language-javascript">var readPackageFile = new Promise(function(resolve, reject) {
    fs.readFile(&apos;./package.json&apos;, function(err, data) {
        if (err) {
            reject(err);
        }

        resolve(data);
    });
});

var checkBackupDir = new Promise(function(resolve, reject) {
    fs.exists(&apos;./backup&apos;, function(exists) {
        if (!exists) {
            resolve(mkBackupDir);
        } else {
            resolve();
        }
    });
});

var mkBackupDir = new Promise(function(resolve, reject) {
    // throw new Error(&apos;unexpected error&apos;);
    fs.mkdir(&apos;./backup&apos;, function(err) {
        if (err) {
            return reject(err);
        }

        resolve();
    });
});

function backupPackageFile(data) {
    return new Promise(function(resolve, reject) {
        fs.writeFile(&apos;./backup/package.json&apos;, data, function(err) {
            if (err) {
                return reject(err);
            }

            resolve();
        });
    });
};
</code></pre>
<p>&#x662F;&#x4E0D;&#x662F;&#x611F;&#x89C9;&#x5230;&#x6EE1;&#x6EE1;&#x7684;&#x6B3A;&#x9A97;&#xFF0C;&#x8BF4;&#x597D;&#x7684;&#x7B80;&#x5355;&#x5462;&#xFF0C;&#x5148;&#x522B;&#x6253;&#xFF0C;&#x81F3;&#x5C11;&#x8C03;&#x7528;&#x8D77;&#x6765;&#x8FD8;&#x662F;&#x5F88;&#x7B80;&#x5355;&#x7684;XD&#x3002;&#x4E2A;&#x4EBA;&#x89C9;&#x5F97;&#x4F7F;&#x7528;<strong>Promise</strong>&#x6700;&#x5927;&#x7684;&#x597D;&#x5904;&#x5C31;&#x662F;&#x8BA9;&#x8C03;&#x7528;&#x65B9;&#x723D;&#x3002;</p>
<p>&#x6D41;&#x7A0B;&#x4F18;&#x5316;&#xFF0C;&#x4F7F;&#x7528;js&#x7684;&#x65E0;&#x963B;&#x585E;&#x7279;&#x6027;&#xFF0C;&#x6211;&#x4EEC;&#x53D1;&#x73B0;&#x7B2C;&#x4E00;&#x6B65;&#x548C;&#x7B2C;&#x4E8C;&#x6B65;&#x53EF;&#x4EE5;&#x540C;&#x6B65;&#x6267;&#x884C;&#xFF1A;</p>
<pre><code class="language-javascript">Promise.all([readPackageFile, checkBackupDir]).then(function(res) {
    return backupPackageFile(res[0]);
}).then(function() {
    console.log(&apos;backup successed&apos;);
}).catch(function(err) {
    console.error(err);
});
</code></pre>
<p>&#x5728;ES5&#x73AF;&#x5883;&#x4E0B;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x7684;&#x5E93;&#xFF1A;</p>
<ul>
<li><a href="https://github.com/petkaantonov/bluebird?ref=iammapping.com">bluebird</a></li>
<li><a href="https://github.com/kriskowal/q?ref=iammapping.com">Q</a></li>
<li><a href="https://github.com/cujojs/when?ref=iammapping.com">when</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/windows/apps/br211867.aspx?ref=iammapping.com">WinJS</a></li>
<li><a href="https://github.com/tildeio/rsvp.js?ref=iammapping.com">RSVP.js</a></li>
</ul>
<h3 id="generator">Generator</h3>
<p>NodeJs&#x9ED8;&#x8BA4;&#x4E0D;&#x652F;&#x6301;Generator&#x7684;&#x5199;&#x6CD5;&#xFF0C;&#x4F46;&#x5728;v0.12&#x540E;&#x53EF;&#x4EE5;&#x6DFB;&#x52A0;<code>--harmony</code>&#x53C2;&#x6570;&#x4F7F;&#x5176;&#x652F;&#x6301;&#xFF1A;</p>
<pre><code>&gt; node --harmony generator.js
</code></pre>
<blockquote>
<p>&#x5141;&#x8BB8;&#x51FD;&#x6570;&#x5728;&#x7279;&#x5B9A;&#x5730;&#x65B9;&#x50CF;<code>return</code>&#x4E00;&#x6837;&#x9000;&#x51FA;&#xFF0C;&#x4F46;&#x662F;&#x7A0D;&#x540E;&#x53C8;&#x80FD;&#x6062;&#x590D;&#x5230;&#x8FD9;&#x4E2A;&#x4F4D;&#x7F6E;&#x548C;&#x72B6;&#x6001;&#x4E0A;&#x7EE7;&#x7EED;&#x6267;&#x884C;</p>
</blockquote>
<pre><code class="language-javascript">function * foo(input) {
    console.log(&apos;&#x8FD9;&#x91CC;&#x4F1A;&#x5728;&#x7B2C;&#x4E00;&#x6B21;&#x8C03;&#x7528;next&#x65B9;&#x6CD5;&#x65F6;&#x6267;&#x884C;&apos;);
    yield input;
    console.log(&apos;&#x8FD9;&#x91CC;&#x4E0D;&#x4F1A;&#x88AB;&#x6267;&#x884C;&#xFF0C;&#x9664;&#x975E;&#x518D;&#x8C03;&#x4E00;&#x6B21;next&#x65B9;&#x6CD5;&apos;);
}

var g = foo(10);

console.log(Object.prototype.toString.call(g)); // [object Generator]
console.log(g.next()); // { value: 10, done: false }
console.log(g.next()); // { value: undefined, done: true }
</code></pre>
<p>&#x5982;&#x679C;&#x89C9;&#x5F97;&#x6BD4;&#x8F83;&#x96BE;&#x7406;&#x89E3;&#xFF0C;&#x5C31;&#x628A;<code>yield</code>&#x770B;&#x6210;<code>return</code>&#x8BED;&#x53E5;&#xFF0C;&#x628A;&#x6574;&#x4E2A;&#x51FD;&#x6570;&#x62C6;&#x5206;&#x6210;&#x8BB8;&#x591A;&#x5C0F;&#x5757;&#xFF0C;&#x6BCF;&#x6B21;&#x8C03;&#x7528;<code>generator</code>&#x7684;<code>next</code>&#x65B9;&#x6CD5;&#x5C31;&#x6309;&#x987A;&#x5E8F;&#x6267;&#x884C;&#x4E00;&#x5C0F;&#x5757;&#xFF0C;&#x6267;&#x884C;&#x5230;<code>yield</code>&#x5C31;&#x9000;&#x51FA;&#x3002;</p>
<p>&#x544A;&#x8BC9;&#x4F60;&#x4E00;&#x4E2A;&#x60CA;&#x4EBA;&#x7684;&#x79D8;&#x5BC6;&#xFF0C;&#x6211;&#x4EEC;&#x73B0;&#x5728;&#x53EF;&#x4EE5;&#x201C;&#x540C;&#x6B65;&#x201D;&#x5199;js&#x7684;<code>sleep</code>&#x4E86;&#xFF1A;</p>
<pre><code class="language-javascript">var sleepGenerator;

function sleep(time) {
    setTimeout(function() {
        sleepGenerator.next(); // step 5
    }, time);
}

var sleepGenerator = (function * () {
    console.log(&apos;wait...&apos;); // step 2
    console.time(&apos;how long did I sleep&apos;); // step 3
    yield sleep(2000); // step 4
    console.log(&apos;weakup&apos;); // step 6
    console.timeEnd(&apos;how long did I sleep&apos;); // step 7
}());

sleepGenerator.next(); // step 1
</code></pre>
<h4 id="promisegenerator">&#x5408;&#x4F53;&#xFF0C;&#x4F7F;&#x7528;Promise&#x548C;Generator&#x91CD;&#x5199;&#x56DE;&#x8C03;&#x5730;&#x72F1;&#x7684;&#x4F8B;&#x5B50;</h4>
<p>&#x5408;&#x4F53;&#x524D;&#x7684;&#x51C6;&#x5907;&#x5DE5;&#x4F5C;&#xFF0C;&#x53C2;&#x8003;<a href="https://github.com/kriskowal/q/blob/db9220d714b16b96a05e9a037fa44ce581715e41/q.js?ref=iammapping.com#L500">Q.async</a>&#xFF1A;</p>
<pre><code class="language-javascript">function run(makeGenerator) {
    function continuer(verb, arg) {
        var result;
        try {
            result = generator[verb](arg);
        } catch (err) {
            return Promise.reject(err);
        }
        if (result.done) {
            return result.value;
        } else {
            return Promise.resolve(result.value).then(callback, errback);
        }
    }
    var generator = makeGenerator.apply(this, arguments);
    var callback = continuer.bind(continuer, &quot;next&quot;);
    var errback = continuer.bind(continuer, &quot;throw&quot;);
    return callback();
}
</code></pre>
<p><code>readPackageFile</code>&#x3001;<code>checkBackupDir</code>&#x548C;<code>backupPackageFile</code>&#x76F4;&#x63A5;&#x4F7F;&#x7528;&#x4E0A;&#x9762;Promise&#x4E2D;&#x7684;&#x5B9A;&#x4E49;&#xFF0C;&#x662F;&#x4E0D;&#x662F;&#x5F88;&#x723D;&#x3002;</p>
<p>&#x5408;&#x4F53;&#x540E;&#x7684;&#x6267;&#x884C;&#xFF1A;</p>
<pre><code class="language-javascript">run(function *() {
    try {
        // 1. &#x8BFB;&#x53D6;&#x5F53;&#x524D;&#x76EE;&#x5F55;&#x7684;package.json
        var data = yield readPackageFile;
        
        // 2. &#x68C0;&#x67E5;backup&#x76EE;&#x5F55;&#x662F;&#x5426;&#x5B58;&#x5728;&#xFF0C;&#x5982;&#x679C;&#x4E0D;&#x5B58;&#x5728;&#x5C31;&#x521B;&#x5EFA;backup&#x76EE;&#x5F55;
        yield checkBackupDir;

        // 3. &#x5C06;&#x6587;&#x4EF6;&#x5185;&#x5BB9;&#x5199;&#x5230;&#x5907;&#x4EFD;&#x6587;&#x4EF6;
        yield backupPackageFile(data);

        console.log(&apos;backup successed&apos;);
    } catch (err) {
        console.error(err);
    }
});
</code></pre>
<p>&#x662F;&#x4E0D;&#x662F;&#x611F;&#x89C9;&#x8DDF;&#x5199;&#x540C;&#x6B65;&#x4EE3;&#x7801;&#x4E00;&#x6837;&#x4E86;&#x3002;</p>
<h2 id>&#x603B;&#x7ED3;</h2>
<p>&#x770B;&#x5B8C;&#x672C;&#x6587;&#xFF0C;&#x5982;&#x679C;&#x4F60;&#x611F;&#x6168;&#xFF1A;&#x201C;&#x9760;&#xFF0C;js&#x8FD8;&#x80FD;&#x8FD9;&#x6837;&#x5199;&#x201D;&#xFF0C;&#x90A3;&#x4E48;&#x6211;&#x7684;&#x76EE;&#x7684;&#x5C31;&#x8FBE;&#x5230;&#x4E86;&#x3002;&#x672C;&#x6587;&#x7684;&#x5199;&#x4F5C;&#x521D;&#x8877;&#x4E0D;&#x662F;&#x4ECB;&#x7ECD;<code>Async</code>&#x3001;<code>Deferred</code>&#x3001;<code>Promise</code>&#x3001;<code>Generator</code>&#x7684;&#x7528;&#x6CD5;&#xFF0C;&#x5982;&#x679C;&#x5BF9;&#x4E8E;&#x8FD9;&#x51E0;&#x4E2A;&#x6982;&#x5FF5;&#x4E0D;&#x662F;&#x5F88;&#x719F;&#x6089;&#x7684;&#x8BDD;&#xFF0C;&#x5EFA;&#x8BAE;&#x67E5;&#x9605;&#x5176;&#x4ED6;&#x8D44;&#x6599;&#x5B66;&#x4E60;&#x3002;&#x5199;js&#x5C31;&#x50CF;&#x8BF4;&#x82F1;&#x8BED;&#xFF0C;&#x4E0D;&#x662F;<em>write in js</em>&#xFF0C;&#x800C;&#x662F;<em>think in js</em>&#x3002;&#x4E0D;&#x7BA1;&#x4F7F;&#x7528;&#x90A3;&#x79CD;&#x65B9;&#x5F0F;&#xFF0C;&#x90FD;&#x662F;&#x4E3A;&#x4E86;&#x589E;&#x5F3A;&#x4EE3;&#x7801;&#x7684;&#x53EF;&#x8BFB;&#x6027;&#x548C;&#x53EF;&#x7EF4;&#x62A4;&#x6027;&#xFF1B;&#x5982;&#x679C;&#x662F;&#x5728;&#x5DF2;&#x6709;&#x7684;&#x9879;&#x76EE;&#x4E2D;&#x4FEE;&#x6539;&#xFF0C;&#x8FD8;&#x8981;&#x8003;&#x8651;&#x5BF9;&#x73B0;&#x6709;&#x4EE3;&#x7801;&#x7684;&#x4FB5;&#x7565;&#x6027;&#x3002;</p>
<blockquote>
<p>&#x7EED;&#x96C6;&#xFF1A;<a href="https://iammapping.com/write-js-async-gracefully-2/">&#x5982;&#x4F55;&#x4F18;&#x96C5;&#x5730;&#x5199;js&#x5F02;&#x6B65;&#x4EE3;&#x7801;(2)</a></p>
</blockquote>
<h2 id>&#x53C2;&#x8003;&#x5730;&#x5740;</h2>
<ul>
<li><a href="http://callbackhell.com/?ref=iammapping.com">&#x56DE;&#x8C03;&#x5730;&#x72F1;</a></li>
<li><a href="http://www.alloyteam.com/2014/05/javascript-promise-mode/?ref=iammapping.com">JavaScript Promise&#x542F;&#x793A;&#x5F55;</a></li>
<li><a href="https://promisesaplus.com/?ref=iammapping.com">Promises/A+</a></li>
<li><a href="http://es6.ruanyifeng.com/?ref=iammapping.com">ECMAScript 6&#x5165;&#x95E8;</a></li>
<li><a href="http://www.html5rocks.com/zh/tutorials/es6/promises/?ref=iammapping.com">JavaScript Promises</a></li>
<li><a href="http://huangj.in/765?ref=iammapping.com">&#x4F7F;&#x7528; (Generator) &#x751F;&#x6210;&#x5668;&#x89E3;&#x51B3; JavaScript &#x56DE;&#x8C03;&#x5D4C;&#x5957;&#x95EE;&#x9898;</a></li>
<li><a href="http://yaniswang.com/frontend/2014/09/29/es6-generator/?ref=iammapping.com">&#x62E5;&#x62B1;Generator&#xFF0C;&#x544A;&#x522B;&#x56DE;&#x8C03;</a></li>
</ul>
<p><small style="color:#B3B3B3">&#x9898;&#x56FE;&#x5F15;&#x81EA;&#xFF1A;<a href="http://forwardjs.com/img/workshops/advancedjs-async.jpg?ref=iammapping.com">http://forwardjs.com/img/workshops/advancedjs-async.jpg</a></small></p>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>