<?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[<!DOCTYPE html>]]></title><description><![CDATA[<!DOCTYPE html>]]></description><link>https://doctype-html.com/</link><image><url>https://doctype-html.com/favicon.png</url><title>&lt;!DOCTYPE html&gt;</title><link>https://doctype-html.com/</link></image><generator>Ghost 4.41</generator><lastBuildDate>Thu, 05 Feb 2026 02:25:02 GMT</lastBuildDate><atom:link href="https://doctype-html.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[当 yarn 的路径中存在空格时，yarn create 命令报错问题]]></title><description><![CDATA[记录了一个解决 yarn create 命令报错问题的过程。]]></description><link>https://doctype-html.com/yarn-create-space-issue/</link><guid isPermaLink="false">625c2cec8596800001809257</guid><category><![CDATA[Yarn]]></category><dc:creator><![CDATA[Valor Lin(威老)]]></dc:creator><pubDate>Sun, 17 Apr 2022 16:18:07 GMT</pubDate><media:content url="https://doctype-html.com/content/images/2022/04/mark-duffel-U5y077qrMdI-unsplash.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://doctype-html.com/content/images/2022/04/mark-duffel-U5y077qrMdI-unsplash.jpg" alt="&#x5F53; yarn &#x7684;&#x8DEF;&#x5F84;&#x4E2D;&#x5B58;&#x5728;&#x7A7A;&#x683C;&#x65F6;&#xFF0C;yarn create &#x547D;&#x4EE4;&#x62A5;&#x9519;&#x95EE;&#x9898;"><p>&#x4ECA;&#x5929;&#x5728;&#x4E00;&#x53F0;&#x65B0; Windows 10 &#x8BBE;&#x5907;&#x4E0A;&#x5C1D;&#x8BD5;&#x4F7F;&#x7528; <code>yarn create</code> &#x547D;&#x4EE4;&#x7684;&#x65F6;&#x5019;&#x53D1;&#x73B0;&#x4E00;&#x4E2A;&#x62A5;&#x9519;&#xFF1A;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://doctype-html.com/content/images/2022/04/image-5.png" class="kg-image" alt="&#x5F53; yarn &#x7684;&#x8DEF;&#x5F84;&#x4E2D;&#x5B58;&#x5728;&#x7A7A;&#x683C;&#x65F6;&#xFF0C;yarn create &#x547D;&#x4EE4;&#x62A5;&#x9519;&#x95EE;&#x9898;" loading="lazy" width="527" height="198"><figcaption>yarn create &#x62A5;&#x9519;&#x4FE1;&#x606F;</figcaption></figure><p>&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x662F;&#x56E0;&#x4E3A;&#x6211;&#x7684;&#x7528;&#x6237;&#x540D;&#x4E2D;&#x5B58;&#x5728;&#x7A7A;&#x683C;&#xFF0C;&#x5BFC;&#x81F4; <code>yarn create</code> &#x547D;&#x4EE4;&#x8BEF;&#x628A;&#x7A7A;&#x683C;&#x4E4B;&#x524D;&#x7684;&#x90E8;&#x5206;&#x5F53;&#x505A;&#x5B8C;&#x6574;&#x7684;&#x547D;&#x4EE4;&#x6765;&#x6267;&#x884C;&#x4E86;&#xFF0C;&#x8FD9;&#x663E;&#x7136;&#x662F;&#x4E2A; Yarn &#x7684; bug&#x3002;</p><h2 id="%E5%AF%BB%E6%89%BE%E7%AD%94%E6%A1%88">&#x5BFB;&#x627E;&#x7B54;&#x6848;</h2><p>&#x9996;&#x5148; Google &#x4E00;&#x4E0B;&#xFF1A;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://doctype-html.com/content/images/2022/04/image-11.png" class="kg-image" alt="&#x5F53; yarn &#x7684;&#x8DEF;&#x5F84;&#x4E2D;&#x5B58;&#x5728;&#x7A7A;&#x683C;&#x65F6;&#xFF0C;yarn create &#x547D;&#x4EE4;&#x62A5;&#x9519;&#x95EE;&#x9898;" loading="lazy" width="767" height="420" srcset="https://doctype-html.com/content/images/size/w600/2022/04/image-11.png 600w, https://doctype-html.com/content/images/2022/04/image-11.png 767w" sizes="(min-width: 720px) 720px"><figcaption>google &#x641C;&#x7D22; yarn create space</figcaption></figure><p>&#x5F88;&#x5FEB;&#x5C31;&#x80FD;&#x5B9A;&#x4F4D;&#x5230;&#x8FD9;&#x4E2A; Yarn &#x9879;&#x76EE;&#x4E0B;&#x7684; issue&#xFF1A;</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/yarnpkg/yarn/issues/6851"><div class="kg-bookmark-content"><div class="kg-bookmark-title">cannot run yarn create if yarn is in a folder where the file path has a space &#xB7; Issue #6851 &#xB7; yarnpkg/yarn</div><div class="kg-bookmark-description">Yarn v1.12.3 my laptop (helpfully, thank you windows) installed yarn by default in a directory where the file path includes a space (e.g. C:/Users/Some Name/AppData/Yarn...). This results in the fo...</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.com/fluidicon.png" alt="&#x5F53; yarn &#x7684;&#x8DEF;&#x5F84;&#x4E2D;&#x5B58;&#x5728;&#x7A7A;&#x683C;&#x65F6;&#xFF0C;yarn create &#x547D;&#x4EE4;&#x62A5;&#x9519;&#x95EE;&#x9898;"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">yarnpkg</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/49993e4101a85d95956cc1ee6fa87e9f779bc41b079af87bc2e9d922c87545a8/yarnpkg/yarn/issues/6851" alt="&#x5F53; yarn &#x7684;&#x8DEF;&#x5F84;&#x4E2D;&#x5B58;&#x5728;&#x7A7A;&#x683C;&#x65F6;&#xFF0C;yarn create &#x547D;&#x4EE4;&#x62A5;&#x9519;&#x95EE;&#x9898;"></div></a></figure><p>issue &#x91CC;&#x9762;&#x6709;&#x8001;&#x54E5;&#x63D0;&#x5230;&#x4E86;&#x4E00;&#x4E2A;&#x6BD4;&#x8F83;&#x7B80;&#x5355;&#x7684; workaround&#x3002;&#x5C31;&#x662F;&#x91CD;&#x65B0;&#x6307;&#x5B9A; <code>cache-folder</code> &#x548C; <code>prefix</code> &#x8FD9;&#x4E24;&#x4E2A;&#x914D;&#x7F6E;&#x9879;&#xFF0C;&#x5C06;&#x9ED8;&#x8BA4;&#x8DEF;&#x5F84;&#x66FF;&#x6362;&#x4E3A;&#x65E0;&#x7A7A;&#x683C;&#x8DEF;&#x5F84;&#xFF1A;</p><pre><code class="language-bash">yarn config set cache-folder &quot;C:\Users\Valor~1\AppData\Local\Yarn\Cache&quot;
yarn config set prefix &quot;C:\Users\Valor~1\AppData\Local\Yarn&quot;</code></pre><p>&#x8BD5;&#x4E86;&#x4E0B;&#xFF0C;&#x641E;&#x5B9A;&#xFF01;</p><figure class="kg-card kg-image-card"><img src="https://doctype-html.com/content/images/2022/04/image-14.png" class="kg-image" alt="&#x5F53; yarn &#x7684;&#x8DEF;&#x5F84;&#x4E2D;&#x5B58;&#x5728;&#x7A7A;&#x683C;&#x65F6;&#xFF0C;yarn create &#x547D;&#x4EE4;&#x62A5;&#x9519;&#x95EE;&#x9898;" loading="lazy" width="337" height="149"></figure><p>&#x4F46;&#x8FC7;&#x4E86;&#x4E00;&#x4F1A;&#xFF0C;&#x6211;&#x5C45;&#x7136;&#x5728; Users &#x76EE;&#x5F55;&#x4E0B;&#x53D1;&#x73B0;&#x4E86;&#x4E00;&#x4E2A;&#x540D;&#x4E3A; <code>Valor~1</code> &#x7684;&#x76EE;&#x5F55;&#x3002;</p><figure class="kg-card kg-image-card"><img src="https://doctype-html.com/content/images/2022/04/image-15.png" class="kg-image" alt="&#x5F53; yarn &#x7684;&#x8DEF;&#x5F84;&#x4E2D;&#x5B58;&#x5728;&#x7A7A;&#x683C;&#x65F6;&#xFF0C;yarn create &#x547D;&#x4EE4;&#x62A5;&#x9519;&#x95EE;&#x9898;" loading="lazy" width="142" height="104"></figure><figure class="kg-card kg-image-card"><img src="https://doctype-html.com/content/images/2022/04/image-12.png" class="kg-image" alt="&#x5F53; yarn &#x7684;&#x8DEF;&#x5F84;&#x4E2D;&#x5B58;&#x5728;&#x7A7A;&#x683C;&#x65F6;&#xFF0C;yarn create &#x547D;&#x4EE4;&#x62A5;&#x9519;&#x95EE;&#x9898;" loading="lazy" width="238" height="211"></figure><p>&#x867D;&#x7136;&#x4E0D;&#x884C;&#xFF0C;&#x4F46;&#x8FD8;&#x662F;&#x5F88;&#x597D;&#x5947;&#x8001;&#x54E5;&#x662F;&#x4ECE;&#x54EA;&#x91CC;&#x77E5;&#x9053;&#x4F1A;&#x6709; <code>Valor~1</code> &#x8FD9;&#x79CD;&#x77ED;&#x540D;&#x79F0;&#x7684;&#x3002;</p><h2 id="%E7%BB%A7%E7%BB%AD%E5%AF%BB%E6%89%BE%E7%AD%94%E6%A1%88">&#x7EE7;&#x7EED;&#x5BFB;&#x627E;&#x7B54;&#x6848;</h2><p>&#x5E26;&#x7740;&#x8FD9;&#x4E2A;&#x7591;&#x95EE;&#x7EE7;&#x7EED;&#x627E;&#x7B54;&#x6848;&#xFF1A;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://doctype-html.com/content/images/2022/04/image-7.png" class="kg-image" alt="&#x5F53; yarn &#x7684;&#x8DEF;&#x5F84;&#x4E2D;&#x5B58;&#x5728;&#x7A7A;&#x683C;&#x65F6;&#xFF0C;yarn create &#x547D;&#x4EE4;&#x62A5;&#x9519;&#x95EE;&#x9898;" loading="lazy" width="870" height="445" srcset="https://doctype-html.com/content/images/size/w600/2022/04/image-7.png 600w, https://doctype-html.com/content/images/2022/04/image-7.png 870w" sizes="(min-width: 720px) 720px"><figcaption>google &#x641C;&#x7D22; windows shortname</figcaption></figure><p>&#x5B9A;&#x4F4D;&#x5230;&#x8FD9;&#x4E2A;&#x63D0;&#x95EE;&#xFF1A;</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://superuser.com/questions/348079/how-can-i-find-the-short-path-of-a-windows-directory-file"><div class="kg-bookmark-content"><div class="kg-bookmark-title">How can I find the short path of a Windows directory/file?</div><div class="kg-bookmark-description">I need to use shortened path names for an application that I am using. For example I need C:\PROGRA~1\ as opposed to C:\Program Files. The program can&#x2019;t handle spaces and won&#x2019;t accept quoted paths ...</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://cdn.sstatic.net/Sites/superuser/Img/apple-touch-icon.png?v=0ad5b7a83e49" alt="&#x5F53; yarn &#x7684;&#x8DEF;&#x5F84;&#x4E2D;&#x5B58;&#x5728;&#x7A7A;&#x683C;&#x65F6;&#xFF0C;yarn create &#x547D;&#x4EE4;&#x62A5;&#x9519;&#x95EE;&#x9898;"><span class="kg-bookmark-author">Super User</span><span class="kg-bookmark-publisher">somehume</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://cdn.sstatic.net/Sites/superuser/Img/apple-touch-icon@2.png?v=e869e4459439" alt="&#x5F53; yarn &#x7684;&#x8DEF;&#x5F84;&#x4E2D;&#x5B58;&#x5728;&#x7A7A;&#x683C;&#x65F6;&#xFF0C;yarn create &#x547D;&#x4EE4;&#x62A5;&#x9519;&#x95EE;&#x9898;"></div></a></figure><p>&#x8FD0;&#x884C;&#x7B54;&#x4E3B; @Paul &#x5728;&#x56DE;&#x7B54;&#x91CC;&#x9762;&#x7ED9;&#x51FA;&#x7684;&#x547D;&#x4EE4;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x8F93;&#x51FA;&#x76EE;&#x5F55;&#x7F29;&#x5199;&#x4E86;&#xFF1A;</p><pre><code class="language-bash">dir \x</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://doctype-html.com/content/images/2022/04/image-8.png" class="kg-image" alt="&#x5F53; yarn &#x7684;&#x8DEF;&#x5F84;&#x4E2D;&#x5B58;&#x5728;&#x7A7A;&#x683C;&#x65F6;&#xFF0C;yarn create &#x547D;&#x4EE4;&#x62A5;&#x9519;&#x95EE;&#x9898;" loading="lazy" width="549" height="82"><figcaption>&#x6211;&#x7684;&#x4E2A;&#x4EBA;&#x76EE;&#x5F55;&#x771F;&#x6B63;&#x7F29;&#x5199;</figcaption></figure><p>&#x540C;&#x65F6;&#x7B54;&#x4E3B; @freedenizen &#x89E3;&#x91CA;&#x4E86;&#x76F8;&#x5173;&#x7684;&#x89C4;&#x5219;&#xFF1A;</p><!--kg-card-begin: markdown--><blockquote>
<p>The &quot;short name&quot; is really the old DOS 8.3 naming convention, so all the directories will be the first 6 letters followed by ~1 assuming there is only one name that matches, for example:</p>
<pre><code class="language-bash">C:\ABCDEF~1    - C:\ABCDEFG I AM DIRECTORY
C:\BCDEFG~1    - C:\BCDEFGHIJKL I AM ANOTHER DIRECTORY
</code></pre>
</blockquote>
<!--kg-card-end: markdown--><p></p><p>&#x539F;&#x6765; Windows &#x5BF9;&#x76EE;&#x5F55;&#x7684;&#x603B;&#x662F;&#x4FDD;&#x7559;&#x524D; 6 &#x4E2A;&#x5B57;&#x7B26;&#xFF0C;&#x7136;&#x540E;&#x4EE5; <code>~1</code> &#x7ED3;&#x675F;&#xFF0C;&#x5982;&#x679C;&#x91CD;&#x590D;&#x7684;&#x8BDD;&#xFF0C;&#x5219;&#x5E8F;&#x53F7;&#x4F9D;&#x6B21;&#x9012;&#x589E;&#x5F97;&#x5230; <code>~2</code> <code>~3</code> ...</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://doctype-html.com/content/images/2022/04/image-9.png" class="kg-image" alt="&#x5F53; yarn &#x7684;&#x8DEF;&#x5F84;&#x4E2D;&#x5B58;&#x5728;&#x7A7A;&#x683C;&#x65F6;&#xFF0C;yarn create &#x547D;&#x4EE4;&#x62A5;&#x9519;&#x95EE;&#x9898;" loading="lazy" width="636" height="42" srcset="https://doctype-html.com/content/images/size/w600/2022/04/image-9.png 600w, https://doctype-html.com/content/images/2022/04/image-9.png 636w"><figcaption>&#x524D;&#x7F00;&#x91CD;&#x590D;&#x65F6;&#x7684;&#x76EE;&#x5F55;&#x7F29;&#x5199;&#x89C4;&#x5219;</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://doctype-html.com/content/images/2022/04/image-10.png" class="kg-image" alt="&#x5F53; yarn &#x7684;&#x8DEF;&#x5F84;&#x4E2D;&#x5B58;&#x5728;&#x7A7A;&#x683C;&#x65F6;&#xFF0C;yarn create &#x547D;&#x4EE4;&#x62A5;&#x9519;&#x95EE;&#x9898;" loading="lazy" width="637" height="460" srcset="https://doctype-html.com/content/images/size/w600/2022/04/image-10.png 600w, https://doctype-html.com/content/images/2022/04/image-10.png 637w"><figcaption>&#x5947;&#x602A;&#x7684;&#x77E5;&#x8BC6;&#x53C8;&#x589E;&#x52A0;&#x4E86;</figcaption></figure><h2 id="%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3">&#x95EE;&#x9898;&#x89E3;&#x51B3;</h2><p>&#x663E;&#x7136;&#xFF0C;&#x5BF9;&#x6211;&#x6765;&#x8BB2;&#x6B63;&#x786E;&#x7684;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#x5E94;&#x8BE5;&#x662F;&#xFF1A;</p><pre><code class="language-bash">yarn config set cache-folder &quot;C:\Users\VALORL~1\AppData\Local\Yarn\Cache&quot;
yarn config set prefix &quot;C:\Users\VALORL~1\AppData\Local\Yarn&quot;</code></pre><p>&#x8FD0;&#x884C;&#x4E4B;&#x540E;&#xFF0C;&#x91CD;&#x65B0;&#x6D4B;&#x8BD5;&#xFF0C;&#x95EE;&#x9898;&#x89E3;&#x51B3;&#x3002;</p><hr><p>&#x540E;&#x7EED;&#x9605;&#x8BFB;&#x4E86;&#x66F4;&#x591A;&#x7684;&#x8D44;&#x6599;&#x4E4B;&#x540E;&#x53D1;&#x73B0;&#xFF0C;&#x8FD9;&#x4E2A;&#x5E94;&#x8BE5;&#x662F; Node.js &#x7684;&#x9505;&#xFF0C;&#x5B83;&#x5C45;&#x7136;&#x4E0D;&#x652F;&#x6301;&#x5B89;&#x88C5;&#x5230;&#x5E26;&#x7A7A;&#x683C;&#x7684;&#x8DEF;&#x5F84;&#x4E2D;&#x3002;&#x4F46;&#x662F;&#x522B;&#x6025;&#xFF0C;&#x6211;&#x4EEC;&#x770B;&#x4E0B; macOS &#x7684;&#x5BF9;&#x540C;&#x6837;&#x7528;&#x6237;&#x540D;&#x7684;&#x76EE;&#x5F55;&#x5904;&#x7406;&#x65B9;&#x5F0F;&#xFF1A;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://pica.zhimg.com/80/v2-2a73ba37a540a4971d9b77c3d89cfb6a_720w.png" class="kg-image" alt="&#x5F53; yarn &#x7684;&#x8DEF;&#x5F84;&#x4E2D;&#x5B58;&#x5728;&#x7A7A;&#x683C;&#x65F6;&#xFF0C;yarn create &#x547D;&#x4EE4;&#x62A5;&#x9519;&#x95EE;&#x9898;" loading="lazy"><figcaption>macOS &#x4E0B;&#x6211;&#x7684;&#x7528;&#x6237;&#x540D;&#x4E5F;&#x662F; &quot;Valor Lin&quot;</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://pica.zhimg.com/80/v2-55e43299b8faf7d0e260c3e56480fdab_720w.png" class="kg-image" alt="&#x5F53; yarn &#x7684;&#x8DEF;&#x5F84;&#x4E2D;&#x5B58;&#x5728;&#x7A7A;&#x683C;&#x65F6;&#xFF0C;yarn create &#x547D;&#x4EE4;&#x62A5;&#x9519;&#x95EE;&#x9898;" loading="lazy"><figcaption>&#x7CFB;&#x7EDF;&#x4E3A;&#x4E86;&#x66F4;&#x597D;&#x7684;&#x517C;&#x5BB9;&#x6027;&#x521B;&#x5EFA;&#x7684;&#x76EE;&#x5F55;&#x540D;&#x4E3A; &quot;valor.lin&quot;</figcaption></figure><p><br>&#x6240;&#x4EE5;&#x8BF4;&#xFF0C;&#x5F52;&#x6839;&#x7ED3;&#x5E95;&#xFF1A;Windows &#x5C31;&#x662F;&#x900A;&#x5566;~</p><hr><p>&#x5C1D;&#x8BD5;&#x4E00;&#x4E0B;&#x8BB0;&#x5F55;&#x95EE;&#x9898;&#x89E3;&#x51B3;&#x8FC7;&#x7A0B;&#x7684;&#x5199;&#x6CD5;&#xFF0C;&#x5982;&#x679C;&#x5927;&#x5BB6;&#x559C;&#x6B22;&#x8FD9;&#x6837;&#x7684;&#x6587;&#x7AE0;&#xFF0C;&#x7ED9;&#x6211;&#x70B9;&#x8D5E;&#x8BC4;&#x8BBA;&#xFF0C;&#x4E0B;&#x6B21;&#x6709;&#x673A;&#x4F1A;&#x5C31;&#x591A;&#x5199;&#x5199;&#x3002;</p><p>&#x5C31;&#x8BB2;&#x8FD9;&#x4E9B;&#x4E86;&#xFF0C;&#x6211;&#x4EEC;&#x4E0B;&#x6B21;&#x518D;&#x89C1;&#x3002;</p>]]></content:encoded></item><item><title><![CDATA[一生只做一次的 Nginx 反向代理配置]]></title><description><![CDATA[作为一个经常需要在 VPS 上面部署各种应用的程序员，我要说 Docker 是真的香，但配置 Nginx 是真的烦。每部署一个新的应用，都要去改一次 Nginx 的配置文件，把它指向我们新部署的应用。每当应用下线的时候，还得记得手动去把对应的配置删掉。]]></description><link>https://doctype-html.com/nginx-proxy/</link><guid isPermaLink="false">625af858756a4f00017d8579</guid><category><![CDATA[Nginx]]></category><category><![CDATA[nginx-proxy]]></category><category><![CDATA[Docker]]></category><category><![CDATA[反向代理]]></category><category><![CDATA[reverse proxy]]></category><dc:creator><![CDATA[Valor Lin(威老)]]></dc:creator><pubDate>Sat, 16 Apr 2022 21:09:54 GMT</pubDate><media:content url="https://doctype-html.com/content/images/2022/04/moritz-kindler-G66K_ERZRhM-unsplash.jpg" medium="image"/><content:encoded><![CDATA[<h2 id="%E9%97%AE%E9%A2%98">&#x95EE;&#x9898;</h2><img src="https://doctype-html.com/content/images/2022/04/moritz-kindler-G66K_ERZRhM-unsplash.jpg" alt="&#x4E00;&#x751F;&#x53EA;&#x505A;&#x4E00;&#x6B21;&#x7684; Nginx &#x53CD;&#x5411;&#x4EE3;&#x7406;&#x914D;&#x7F6E;"><p>&#x4F5C;&#x4E3A;&#x4E00;&#x4E2A;&#x7ECF;&#x5E38;&#x9700;&#x8981;&#x5728; VPS &#x4E0A;&#x9762;&#x90E8;&#x7F72;&#x5404;&#x79CD;&#x5E94;&#x7528;&#x7684;&#x7A0B;&#x5E8F;&#x5458;&#xFF0C;&#x6211;&#x8981;&#x8BF4; <a href="https://www.docker.com/">Docker </a>&#x662F;&#x771F;&#x7684;&#x9999;&#xFF0C;&#x4F46;&#x914D;&#x7F6E; <a href="https://www.nginx.com/">Nginx</a> &#x662F;&#x771F;&#x7684;&#x70E6;&#x3002;&#x6BCF;&#x90E8;&#x7F72;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x5E94;&#x7528;&#xFF0C;&#x90FD;&#x8981;&#x53BB;&#x6539;&#x4E00;&#x6B21; Nginx &#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF0C;&#x628A;&#x5B83;&#x6307;&#x5411;&#x6211;&#x4EEC;&#x65B0;&#x90E8;&#x7F72;&#x7684;&#x5E94;&#x7528;&#x3002;&#x6BCF;&#x5F53;&#x5E94;&#x7528;&#x4E0B;&#x7EBF;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x8FD8;&#x5F97;&#x8BB0;&#x5F97;&#x624B;&#x52A8;&#x53BB;&#x628A;&#x5BF9;&#x5E94;&#x7684;&#x914D;&#x7F6E;&#x5220;&#x6389;&#x3002;</p><p>&#x867D;&#x7136;&#x8BF4;&#x53EA;&#x662F;&#x6539;&#x4E2A;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x7684;&#x4E8B;&#x60C5;&#xFF0C;&#x8FD9;&#x5BF9;&#x4E8E;&#x6211;&#x8FD9;&#x79CD;&#x53C8;&#x61D2;&#x8BB0;&#x6027;&#x53C8;&#x5DEE;&#x7684;&#x4EBA;&#x771F;&#x662F;&#x4E00;&#x4EF6;&#x75DB;&#x82E6;&#x7684;&#x4E8B;&#x60C5;&#x3002;&#x56E0;&#x4E3A;&#x6211;&#x6839;&#x672C;&#x8BB0;&#x4E0D;&#x4F4F;&#x5404;&#x79CD;&#x914D;&#x7F6E;&#x9879;&#xFF0C;&#x5BFC;&#x81F4;&#x5F97;&#x5728;&#x51E0;&#x4E2A;&#x76EE;&#x5F55;&#x4E4B;&#x95F4;&#x6765;&#x56DE;&#x5207;&#x6362;&#x53CD;&#x590D;&#x8C03;&#x8BD5;&#x3002;&#x9EBB;&#x70E6;&#x4E5F;&#x5C31;&#x7B97;&#x4E86;&#xFF0C;&#x5173;&#x952E;&#x662F;&#x8FD9;&#x6837;&#x4E00;&#x65E6;&#x628A; Nginx &#x6539;&#x6302;&#x4E86;&#xFF0C;&#x8FD8;&#x4F1A;&#x5F71;&#x54CD;&#x5230;&#x5176;&#x4ED6;&#x6B63;&#x5728;&#x8FD0;&#x884C;&#x7684;&#x5E94;&#x7528;&#x3002;</p><p>&#x90A3;&#x4E48;&#xFF0C;&#x6709;&#x4EC0;&#x4E48;&#x66F4;&#x597D;&#x7684;&#x529E;&#x6CD5;&#x6765;&#x89E3;&#x51B3;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#x5462;&#xFF1F;</p><h2 id="%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E9%85%8D%E7%BD%AE">&#x53CD;&#x5411;&#x4EE3;&#x7406;&#x914D;&#x7F6E;</h2><p><a href="https://github.com/nginx-proxy/nginx-proxy">nginx-proxy</a> &#x8FD9;&#x4E2A;&#x9879;&#x76EE;&#x5E2E;&#x6211;&#x4EEC;&#x89E3;&#x51B3;&#x4E86;&#x8FD9;&#x4E2A;&#x95EE;&#x9898;&#x3002;</p><p>&#x9996;&#x5148;&#x521B;&#x5EFA; <code>docker-compose.yml</code> &#x6587;&#x4EF6;&#xFF1A;</p><figure class="kg-card kg-code-card"><pre><code class="language-yaml">services:
  nginx-proxy:
    image: nginxproxy/nginx-proxy
    container_name: nginx-proxy
    ports:
      - &quot;80:80&quot;
      - &quot;443:443&quot;
    volumes:
      - conf:/etc/nginx/conf.d
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - certs:/etc/nginx/certs:ro
      - /var/run/docker.sock:/tmp/docker.sock:ro

  acme-companion:
    image: nginxproxy/acme-companion
    container_name: nginx-proxy-acme
    environment:
      - DEFAULT_EMAIL=mail@yourdomain.tld
    volumes_from:
      - nginx-proxy
    volumes:
      - certs:/etc/nginx/certs:rw
      - acme:/etc/acme.sh
      - /var/run/docker.sock:/var/run/docker.sock:ro

volumes:
  conf:
  vhost:
  html:
  certs:
  acme:</code></pre><figcaption>nginx-proxy/docker-compose.yml</figcaption></figure><p>&#x8FD9;&#x91CC;&#x9762;&#x53EA;&#x6709; <code>DEFAULT_EMAIL</code> &#x4E00;&#x4E2A;&#x5730;&#x65B9;&#x9700;&#x8981;&#x4FEE;&#x6539;&#xFF0C;&#x6539;&#x4E3A;&#x4F60;&#x5E73;&#x65F6;&#x5E38;&#x7528;&#x7684;&#x90AE;&#x7BB1;&#x5C31;&#x884C;&#x3002;&#x5F53;&#x8BC1;&#x4E66;&#x5FEB;&#x8FC7;&#x671F;&#x6CA1;&#x6709;&#x81EA;&#x52A8;&#x7EED;&#x8BA2;&#x6210;&#x529F;&#x65F6;&#xFF0C; <a href="https://letsencrypt.org/">Let&apos;s Encrypt</a> &#x4F1A;&#x7ED9;&#x8FD9;&#x4E2A;&#x5730;&#x5740;&#x53D1;&#x9001;&#x62A5;&#x8B66;&#x90AE;&#x4EF6;&#x3002;</p><p>&#x4FDD;&#x5B58;&#x597D;&#x4E4B;&#x540E;&#xFF0C;&#x542F;&#x52A8;&#x5B83;&#xFF0C;&#x4ECE;&#x6B64;&#x4EE5;&#x540E;&#x6211;&#x4EEC;&#x5C31;&#x518D;&#x4E5F;&#x4E0D;&#x9700;&#x8981;&#x7EF4;&#x62A4; Nginx &#x7684;&#x914D;&#x7F6E;&#x4E86;&#x3002;</p><p>&#x63A5;&#x7740;&#x6211;&#x4EEC;&#x6765;&#x914D;&#x7F6E;&#x9700;&#x8981;&#x88AB;&#x4EE3;&#x7406;&#x7684;&#x5E94;&#x7528;&#x3002;</p><h2 id="%E5%BA%94%E7%94%A8%E9%85%8D%E7%BD%AE">&#x5E94;&#x7528;&#x914D;&#x7F6E;</h2><p>&#x8BB0;&#x5F97;&#x5148;&#x5C06;&#x57DF;&#x540D;&#x89E3;&#x6790;&#x914D;&#x7F6E;&#x597D;&#xFF0C;&#x7136;&#x540E;&#x6765;&#x5199;&#x5E94;&#x7528;&#x914D;&#x7F6E;&#x3002;&#x4EE5;&#x672C;&#x7AD9;&#x7684; <a href="hello.doctype-html.com">hello.doctype-html.com</a> &#x914D;&#x7F6E;&#x4E3A;&#x4F8B;&#xFF1A;</p><figure class="kg-card kg-code-card"><pre><code class="language-yml">services:
  hello.doctype-html.com:
    image: crccheck/hello-world
    environment:
      - VIRTUAL_HOST=hello.doctype-html.com
      - LETSENCRYPT_HOST=hello.doctype-html.com
    expose:
      - &quot;8000&quot;

networks:
  default:
    name: nginx-proxy_default</code></pre><figcaption>hello.doctype-html.com/docker-compose.yml</figcaption></figure><p>&#x8FD9;&#x4EFD;&#x914D;&#x7F6E;&#x505A;&#x4E86;&#x4E09;&#x4EF6;&#x4E8B;&#x60C5;&#x3002;</p><ol><li>&#x8BBE;&#x7F6E; <code>VIRTUAL_HOST</code>&#x548C; <code>LETSENCRYPT_HOST</code> &#xFF0C;&#x5206;&#x522B;&#x544A;&#x77E5; nginx-proxy &#x548C; Let&apos;s Encrypt &#x672C;&#x5E94;&#x7528;&#x60F3;&#x8981;&#x4F7F;&#x7528;&#x57DF;&#x540D;&#x3002;</li><li>&#x8BBE;&#x7F6E;&#x53C2;&#x6570; <code>expose</code>&#xFF0C;&#x5C06;&#x6B64;&#x5E94;&#x7528;&#x7684;&#x7AEF;&#x53E3;&#x66B4;&#x9732;&#x7ED9; nginx-proxy&#x3002;</li><li>&#x8BBE;&#x7F6E;&#x7F51;&#x7EDC;&#x4FE1;&#x606F;&#xFF0C;&#x4FDD;&#x8BC1;&#x5E94;&#x7528;&#x8DDF; nginx-proxy &#x5904;&#x4E8E;&#x540C;&#x4E00;&#x7F51;&#x7EDC;&#x3002;</li></ol><p>&#x542F;&#x52A8;&#x5B83;&#xFF0C;&#x6211;&#x4EEC;&#x5C31;&#x80FD;&#x901A;&#x8FC7;&#x914D;&#x7F6E;&#x597D;&#x7684;&#x57DF;&#x540D;&#x6765;&#x8BBF;&#x95EE;&#x8FD9;&#x4E2A;&#x5E94;&#x7528;&#x4E86;&#x3002;</p><h2 id="%E6%B7%B1%E5%85%A5%E6%80%9D%E8%80%83">&#x6DF1;&#x5165;&#x601D;&#x8003;</h2><p>&#x5927;&#x5BB6;&#x6709;&#x6CA1;&#x6709;&#x60F3;&#x8FC7;&#x4E3A;&#x4EC0;&#x4E48;&#x6709;&#x4EBA;&#x80FD;&#x505A;&#x51FA; nginx-proxy &#x8FD9;&#x6837;&#x7684;&#x9879;&#x76EE;&#x5462;&#xFF1F;&#x5B83;&#x662F;&#x57FA;&#x4E8E;&#x4EC0;&#x4E48;&#x6837;&#x7684;&#x601D;&#x8DEF;&#x505A;&#x51FA;&#x6765;&#x7684;&#x5462;&#xFF1F;</p><p>&#x5176;&#x5B9E;&#xFF0C;&#x8FD9;&#x91CC;&#x9762;&#x53EA;&#x7528;&#x5230;&#x4E86;&#x4E00;&#x4E2A;&#x63A7;&#x5236;&#x53CD;&#x8F6C;&#x7684;&#x601D;&#x60F3;&#x3002;&#x6211;&#x4EEC;&#x5728; Nginx &#x7684;&#x914D;&#x7F6E;&#x4E2D;&#x7ED9;&#x5176;&#x4ED6;&#x5E94;&#x7528;&#x505A;&#x53CD;&#x5411;&#x4EE3;&#x7406;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x610F;&#x5473;&#x7740;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x9700;&#x8981;&#x4E86;&#x89E3;&#x6240;&#x6709;&#x5E94;&#x7528;&#x7684;&#x4FE1;&#x606F;&#x3002;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://doctype-html.com/content/images/2022/04/image-2.png" class="kg-image" alt="&#x4E00;&#x751F;&#x53EA;&#x505A;&#x4E00;&#x6B21;&#x7684; Nginx &#x53CD;&#x5411;&#x4EE3;&#x7406;&#x914D;&#x7F6E;" loading="lazy" width="442" height="314"><figcaption>&#x901A;&#x5E38;&#x60C5;&#x51B5; Nginx &#x914D;&#x7F6E;&#x4F9D;&#x8D56;&#x4E8E;&#x5E94;&#x7528;&#x4FE1;&#x606F;</figcaption></figure><p>&#x800C; nginx-proxy &#x8FD9;&#x4E2A;&#x9879;&#x76EE;&#x5E2E;&#x6211;&#x4EEC;&#x5BF9;&#x53CD;&#x5411;&#x4EE3;&#x7406;&#x914D;&#x7F6E;&#x505A;&#x4E86;&#x4E00;&#x4E2A;&#x62BD;&#x8C61;&#xFF0C;&#x5B9A;&#x4E49;&#x6210;&#x4E86;&#x4E00;&#x4E2A;&#x89C4;&#x8303;&#xFF0C;nginx-proxy &#x53EA;&#x4F9D;&#x8D56;&#x4E8E;&#x8FD9;&#x4E2A;&#x89C4;&#x8303;&#xFF0C;&#x4ECE;&#x800C;&#x5B9E;&#x73B0;&#x4E86;&#x4E0E;&#x5177;&#x4F53;&#x7684;&#x5E94;&#x7528;&#x4FE1;&#x606F;&#x7684;&#x89E3;&#x8026;&#x3002;</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://doctype-html.com/content/images/2022/04/image-4.png" class="kg-image" alt="&#x4E00;&#x751F;&#x53EA;&#x505A;&#x4E00;&#x6B21;&#x7684; Nginx &#x53CD;&#x5411;&#x4EE3;&#x7406;&#x914D;&#x7F6E;" loading="lazy" width="408" height="300"><figcaption>nginx-proxy &#x4F9D;&#x8D56;&#x4E8E;&#x914D;&#x7F6E;&#x89C4;&#x8303;&#xFF0C;&#x5E94;&#x7528;&#x5B9E;&#x73B0;&#x4E86;&#x914D;&#x7F6E;&#x89C4;&#x8303;</figcaption></figure><p>&#x6211;&#x4EEC;&#x53EA;&#x8981;&#x6309;&#x7167;&#x5B83;&#x7684;&#x89C4;&#x8303;&#x6765;&#x5B9E;&#x73B0;&#x4E00;&#x4E2A;&#x65B0;&#x5E94;&#x7528;&#x7684;&#x914D;&#x7F6E;&#xFF0C;&#x5B83;&#x5C31;&#x80FD;&#x6B63;&#x786E;&#x8BC6;&#x522B;&#x65B0;&#x5E94;&#x7528;&#x3002;&#x81F3;&#x6B64;&#xFF0C;&#x88AB;&#x4EE3;&#x7406;&#x7684;&#x5E94;&#x7528;&#x5C31;&#x88AB;&#x63D2;&#x4EF6;&#x5316;&#x4E86;&#xFF0C;&#x53EF;&#x4EE5;&#x968F;&#x65F6;&#x589E;&#x5220;&#xFF0C;&#x540C;&#x65F6;&#x4E5F;&#x4E0D;&#x7528;&#x62C5;&#x5FC3;&#x67D0;&#x4E2A;&#x5E94;&#x7528;&#x7684;&#x914D;&#x7F6E;&#x4FEE;&#x6539;&#x5BFC;&#x81F4;&#x5168;&#x5C40;&#x7684;&#x53CD;&#x5411;&#x4EE3;&#x7406;&#x53D7;&#x5230;&#x5F71;&#x54CD;&#x3002;</p><p>&#x4ECA;&#x5929;&#x5C31;&#x804A;&#x8FD9;&#x4E48;&#x591A;&#xFF0C;&#x6211;&#x4EEC;&#x4E0B;&#x6B21;&#x518D;&#x89C1;&#x3002;</p>]]></content:encoded></item><item><title><![CDATA[VS Code Awesome console.log(tips)]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h2 id="insertconsolelog">Insert console.log()</h2>
<p>Install extension: <a href="https://marketplace.visualstudio.com/items?itemName=weilao.v-snippets">v-snippets</a></p>
<p>Type <code>cl</code> and then press <code>TAB</code>, it expand to <code>console.log()</code></p>
<h3 id="usage">Usage:</h3>
<p><code>cl</code> =&gt; <code>console.log()</code><br>
<code>cw</code> =&gt; <code>console.warn()</code><br>
<code>ce</code> =&gt; <code>console.error()</code><br>
...</p>
<h2 id="wrapselectedcode">Wrap selected code</h2>
<p>Install extension: <a href="https://marketplace.visualstudio.com/items?itemName=whtouche.vscode-js-console-utils">javascript console utils</a></p>
<h3 id="usage">Usage:</h3>
<p><img src="https://i.imgur.com/0tiesd2.gif" alt="javascript console utils" loading="lazy"></p>
<!--kg-card-end: markdown-->]]></description><link>https://doctype-html.com/console-log-tips/</link><guid isPermaLink="false">5b07e0b8b464bf00011b19a0</guid><dc:creator><![CDATA[Valor Lin(威老)]]></dc:creator><pubDate>Sat, 28 Sep 2019 02:02:28 GMT</pubDate><media:content url="https://doctype-html.com/content/images/2019/09/IMG_20190928_1008542.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="insertconsolelog">Insert console.log()</h2>
<img src="https://doctype-html.com/content/images/2019/09/IMG_20190928_1008542.jpg" alt="VS Code Awesome console.log(tips)"><p>Install extension: <a href="https://marketplace.visualstudio.com/items?itemName=weilao.v-snippets">v-snippets</a></p>
<p>Type <code>cl</code> and then press <code>TAB</code>, it expand to <code>console.log()</code></p>
<h3 id="usage">Usage:</h3>
<p><code>cl</code> =&gt; <code>console.log()</code><br>
<code>cw</code> =&gt; <code>console.warn()</code><br>
<code>ce</code> =&gt; <code>console.error()</code><br>
...</p>
<h2 id="wrapselectedcode">Wrap selected code</h2>
<p>Install extension: <a href="https://marketplace.visualstudio.com/items?itemName=whtouche.vscode-js-console-utils">javascript console utils</a></p>
<h3 id="usage">Usage:</h3>
<p><img src="https://i.imgur.com/0tiesd2.gif" alt="VS Code Awesome console.log(tips)" loading="lazy"></p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Better Unit Testing]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h2 id="unittests">Unit tests</h2>
<p><strong>Unit = Unit of work</strong></p>
<p>This could involve <strong>multiple methods and classes</strong> invoked by some public API that can:</p>
<ul>
<li>Return a value or throw an exception</li>
<li>Change the state of the system</li>
<li>Make 3rd party calls</li>
</ul>
<!--topic-->
<h2 id="basic">Basic</h2>
<ol>
<li>Test case</li>
<li>Test suit</li>
<li>Stub</li>
<li>Mock</li>
<li>Coverage</li>
</ol>
<!--topic-->
<h3 id="testcase">Test case</h3>
<blockquote>
<p>A <em>test case</em></p></blockquote>]]></description><link>https://doctype-html.com/better-unit-testing/</link><guid isPermaLink="false">5ae096a8b464bf00011b199a</guid><dc:creator><![CDATA[Valor Lin(威老)]]></dc:creator><pubDate>Wed, 25 Apr 2018 15:13:34 GMT</pubDate><media:content url="https://doctype-html.com/content/images/2018/04/IMG_23762.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="unittests">Unit tests</h2>
<img src="https://doctype-html.com/content/images/2018/04/IMG_23762.jpg" alt="Better Unit Testing"><p><strong>Unit = Unit of work</strong></p>
<p>This could involve <strong>multiple methods and classes</strong> invoked by some public API that can:</p>
<ul>
<li>Return a value or throw an exception</li>
<li>Change the state of the system</li>
<li>Make 3rd party calls</li>
</ul>
<!--topic-->
<h2 id="basic">Basic</h2>
<ol>
<li>Test case</li>
<li>Test suit</li>
<li>Stub</li>
<li>Mock</li>
<li>Coverage</li>
</ol>
<!--topic-->
<h3 id="testcase">Test case</h3>
<blockquote>
<p>A <em>test case</em> is the smallest unit of testing. It checks for a specific response to a particular set of inputs.</p>
</blockquote>
<!--section-->
<p>You may do these things in a test case:</p>
<ol>
<li>Prepare/mock input data</li>
<li>Apply action</li>
<li>Check the response</li>
</ol>
<!--section-->
<p>Format</p>
<pre><code class="language-Javascript">it(&apos;should [expected behaviour] when [scenario/context]&apos;, () =&gt; {
  // Your test logic
});
</code></pre>
<p>Example</p>
<pre><code class="language-javascript">it(&quot;should return 2 when 1+1&quot;, () =&gt; {
  expect(add(1, 1)).toBe(2);
});
</code></pre>
<!--section-->
<p>Some times you need to split it into multiple lines</p>
<p>:(</p>
<pre><code class="language-javascript">it(&quot;should return all matched person&quot;, async () =&gt; {
  expect(await personService.getPersonsByIds([1, 2, 3])).toEqual([{ id: 1 }, { id: 2 }, { id: 3 }
  ]);
});
</code></pre>
<p><br>:)</p>
<pre><code class="language-javascript">it(&quot;should return all matched person&quot;, async () =&gt; {
  const result = await personService.getPersonsByIds([1, 2, 3]);
  expect(result).toEqual([{ id: 1 }, { id: 2 }, { id: 3 }]);
});
</code></pre>
<!--section-->
<p>But keep in mind that split code into multiple lines is the last choice, put them <strong>in same line</strong> when possible.</p>
<!--topic-->
<h3 id="testsuit">Test suit</h3>
<blockquote>
<p>A <em>test suite</em> is a collection of test cases, test suites, or both. It is used to aggregate tests that should be executed together.</p>
</blockquote>
<!--section-->
<p><strong>Testing a function</strong></p>
<p>Format</p>
<pre><code class="language-javascript">describe(&quot;[functionName()]&quot;, () =&gt; {
  it(&quot;should [expected behavior] when [scenario/context]&quot;);
});
</code></pre>
<p>Example</p>
<pre><code class="language-javascript">describe(&quot;add()&quot;, () =&gt; {
  it(&quot;should work with int&quot;);
  it(&quot;should return NaN when add a NaN&quot;);
  it(&quot;should concern about preciseness&quot;);
});
</code></pre>
<!--section-->
<p><strong>Testing a class</strong></p>
<p>Format</p>
<pre><code class="language-javascript">describe(&apos;[ClassName]&apos;, () =&gt; {
  describe(&apos;[functionName()]&apos;, () =&gt; {
    it(&apos;should [expected behaviour] when [scenario/context]&apos;);
  }
});
</code></pre>
<p>Example:</p>
<pre><code class="language-javascript">describe(&quot;Calculator&quot;, () =&gt; {
  describe(&quot;add()&quot;, () =&gt; {
    it(&quot;should work with int&quot;);
    it(&quot;should return NaN when add a NaN&quot;);
    it(&quot;should concern about preciseness&quot;);
  });
});
</code></pre>
<!--topic-->
<h3 id="mocking">Mocking</h3>
<blockquote>
<p>Mocking is one particlar technique to allow testing of a unit of code with out being reliant upon dependencies.</p>
</blockquote>
<!--section-->
<p>Mock could do these for you:</p>
<ul>
<li>Erasing the actual implementation of a function</li>
<li>Capturing calls to the function</li>
<li>Capturing instances of constructor functions when instantiated with <code>new</code></li>
<li>Allowing test-time configuration of return values.</li>
<li>Boost test speed.</li>
</ul>
<!--section-->
<h4 id="ensurefunctioncalled">Ensure function called</h4>
<pre><code class="language-javascript">import EventEmitter2 from &apos;eventemitter2&apos;;

class UploadManager extends EventEmitter2 {
  on(type, listener) {
    super.on(type, listener);
  }
  emit(type, ...arg) {
    super.emit(type, ...arg);
  }
}
</code></pre>
<pre><code class="language-javascript">it(&apos;should call the event handler&apos;, () =&gt; {
  const handler = jest.fn();
  uploadManager.on(&apos;1&apos;, handler);
  uploadManager.emit(&apos;1&apos;);
  expect(handler).toHaveBeenCalled();
});
</code></pre>
<!--section-->
<h4 id="configurereturnvalues">Configure return values</h4>
<pre><code class="language-javascript">import PostAPI from &apos;sdk/api/glip/post&apos;;

export default class PostService extends BaseService {
  async getPostsFromRemote({ groupId, postId, limit, direction }) {
    // ...
    const requestResult = await PostAPI.requestPosts(params);
    // ...
    return result;
  }
}
</code></pre>
<pre><code class="language-javascript">describe(&apos;getPostsFromRemote()&apos;, () =&gt; {
  it(&apos;should return posts of the group from remote&apos;, async () =&gt; {
    PostAPI.requestPosts.mockResolveValue({ data: { posts: postsOfGroup3 } });
    const result = await postService.getPostsFromRemote({ groupId: 3 });
    expect(result.posts).toBe(postsOfGroup3);
  });
});
</code></pre>
<!--section-->
<h4 id="replacedependeciesmodulewithmock">Replace dependecies module with mock</h4>
<pre><code class="language-javascript">// utils.js
export const fn1 = () =&gt; {};
</code></pre>
<pre><code class="language-javascript">// doSomeThing.js
import { fn1 } from &apos;./utils&apos;;
export default function doSomeThing() {
  // ...
  fn1();
  // ...
}
</code></pre>
<pre><code class="language-javascript">// doSomeThing.test.js
import { fn1 } from &apos;./utils&apos;;
import doSomeThing from &apos;./doSomeThing&apos;;

jest.mock(&apos;./utils&apos;);

it(&apos;should call fn1&apos;, () =&gt; {
    doSomeThing();
    expect(fn1).toHaveBeenCalled();
});
</code></pre>
<!--topic-->
<h3 id="coverage">Coverage</h3>
<blockquote>
<p><em>test coverage</em> is a measure used to describe the degree to which the source code of a program is executed when a particular test suite runs.</p>
</blockquote>
<!--section-->
<h4 id="coveragereport">Coverage report</h4>
<p><img src="https://ws4.sinaimg.cn/large/006tNc79gy1fqpazzvtrcj30ma0f0wfw.jpg" alt="Better Unit Testing" loading="lazy"></p>
<!--section-->
<h4 id="coveragedetail">Coverage detail</h4>
<p><img src="https://ws4.sinaimg.cn/large/006tNc79gy1fqpay5difhj31460oqdp5.jpg" alt="Better Unit Testing" loading="lazy"></p>
<!--topic-->
<h2 id="bestpractice">Best Practice</h2>
<!--section-->
<p>Unit tests are isolated and independent of each other</p>
<ul>
<li>Any given behaviour should be specified in <strong>one and only one test</strong></li>
<li>The execution/order of execution of one test <strong>cannot affect the others</strong></li>
</ul>
<!--section-->
<p>:(</p>
<pre><code class="language-javascript">const store = new Store();
it(&apos;should append object&apos;, () =&gt; {
  store.append({id: 1});
  expect(store.getById(1)).toBe({id: 1});
});

it(&apos;should remove object&apos;, () =&gt; {
  store.remove(1);
  expect(store.getById(1)).toBeNull();
});
</code></pre>
<!--section-->
<p>:)</p>
<pre><code class="language-javascript">it(&apos;should append object&apos;, () =&gt; {
  const store = new Store();
  store.append({id: 1});
  expect(store.getById(1)).toBe({id: 1});
});

it(&apos;should remove object&apos;, () =&gt; {
  const store = new Store([{id: 1}]);
  store.remove(1);
  expect(store.getById(1)).toBeNull();
});
</code></pre>
<!--section-->
<p>Unit tests are code too.</p>
<ul>
<li>They must meet the same level of quality as the code being tested.</li>
<li>They can be refactored as well to make them more maintainable and/or readable.</li>
<li>They should be review first when applying a code review.</li>
</ul>
<!--section-->
<p>Unit tests are lightweight tests</p>
<ul>
<li>Repeatable</li>
<li>Fast</li>
<li>Consistent</li>
<li>Easy to write and read</li>
</ul>
<!--section-->
<p>Make your tests:</p>
<ul>
<li><strong>Readable</strong></li>
<li><strong>Maintainable</strong></li>
<li><strong>Reliable</strong></li>
</ul>
<!--section-->
<p>:(</p>
<pre><code class="language-javascript">expect(result === obj).toBe(true)
</code></pre>
<p><img src="https://ws3.sinaimg.cn/large/006tNc79gy1fqpay681slj30bh06mglv.jpg" alt="Better Unit Testing" loading="lazy"></p>
<br>
<!--section-->
<p>:)</p>
<pre><code class="language-javascript">expect(result).toBe(obj)
</code></pre>
<p><img src="https://ws3.sinaimg.cn/large/006tNc79gy1fqpay7q75hj30b60b8dgb.jpg" alt="Better Unit Testing" loading="lazy"></p>
<!--section-->
<p>:(</p>
<pre><code class="language-javascript">expect(result.length).toBe(2)
</code></pre>
<p><img src="https://ws1.sinaimg.cn/large/006tNc79gy1fqpay8f6gtj30bj06ejrm.jpg" alt="Better Unit Testing" loading="lazy"></p>
<!--section-->
<p>:)</p>
<pre><code class="language-javascript">expect(result).toHaveLength(2)
</code></pre>
<p><img src="https://ws3.sinaimg.cn/large/006tNc79gy1fqpay91q91j309v0790t1.jpg" alt="Better Unit Testing" loading="lazy"></p>
<!--section-->
<p>:(</p>
<pre><code class="language-javascript">const result = store.getById(1);
expect(result.id).toBe(1);
expect(result.name).toBe(&apos;Object 1&apos;);
expect(result.group).toBe(2);
expect(result.type).toBe(3);
</code></pre>
<p><img src="https://ws1.sinaimg.cn/large/006tNc79gy1fqpay9yedxj30az07bq3l.jpg" alt="Better Unit Testing" loading="lazy"></p>
<!--section-->
<p>:)</p>
<pre><code class="language-javascript">const result = store.getById(1);
expect(result).toBe(obj1);
</code></pre>
<p><img src="https://ws1.sinaimg.cn/large/006tNc79gy1fqpayackuvj30b409m3z5.jpg" alt="Better Unit Testing" loading="lazy"></p>
<!--section-->
<p>:(</p>
<pre><code class="language-javascript">store.append({id: 1, name: &apos;Object 1&apos;, group: 2, type: 3});
store.append({id: 2, name: &apos;Object 2&apos;, group: 2, type: 3});
</code></pre>
<p><img src="https://ws1.sinaimg.cn/large/006tNc79gy1fqpayackuvj30b409m3z5.jpg" alt="Better Unit Testing" loading="lazy"></p>
<!--section-->
<p>:)</p>
<pre><code class="language-javascript">store.append({id: 1});
store.append({id: 2});
</code></pre>
<p><img src="https://ws2.sinaimg.cn/large/006tNc79gy1fqpayc9jmoj30aw07r74m.jpg" alt="Better Unit Testing" loading="lazy"></p>
<!--section-->
<p>:(</p>
<pre><code class="language-javascript">store.append(obj);
expect(store.items.find(o =&gt; o.id === 1)).toBe(obj);
</code></pre>
<!--section-->
<p>:)</p>
<pre><code class="language-javascript">store.append(obj);
expect(store.getById(1)).toBe(obj);
</code></pre>
<!--section-->
<p>:(</p>
<pre><code class="language-javascript">it(&apos;should return 100 if type is 1 and 200 if type is not 1&apos;, () =&gt; {
  const obj1 = {id: 1, type: 1};
  const obj2 = {id: 2, type: 2};
  const obj3 = {id: 3, type: 3};
  [obj1, obj2, obj3].forEach(o =&gt; {
    if(o.type === 1) {
      expect(getPrice(o)).toBe(100);
    } else {
      expect(getPrice(o)).toBe(210);
    }
  });
});
</code></pre>
<p><img src="https://ws2.sinaimg.cn/large/006tNc79gy1fqpaycpun4j30b106j3z0.jpg" alt="Better Unit Testing" loading="lazy"></p>
<!--section-->
<p>:)</p>
<pre><code class="language-javascript">it(&apos;should return 100 when type is 1&apos;, () =&gt; {
  expect(getPrice({id: 1, type: 1})).toBe(100);
});

it(&apos;should return 200 when type is not 1&apos;, () =&gt; {
  expect(getPrice({id: 1, type: 2})).toBe(200);
});
</code></pre>
<p><img src="https://ws3.sinaimg.cn/large/006tNc79gy1fqpaydjy9gj30b603wt8v.jpg" alt="Better Unit Testing" loading="lazy"></p>
<p><img src="https://ws2.sinaimg.cn/large/006tNc79gy1fqpaye6lefj30b603zdg0.jpg" alt="Better Unit Testing" loading="lazy"></p>
<!--topic-->
<h2 id="testdriven">Test Driven</h2>
<blockquote>
<p>Test first.</p>
</blockquote>
<!--section-->
<h3 id="lifecycle">life-cycle</h3>
<p><img src="https://ws3.sinaimg.cn/large/006tNc79gy1fqpayel8pnj30a702jt8u.jpg" alt="Better Unit Testing" loading="lazy"></p>
<!--section-->
<h3 id="whyusetdd">Why use TDD?</h3>
<ul>
<li>Change the way of thinking.</li>
<li>Setup a tiny enviorment for development and debug.</li>
<li>Don&apos;t have to run entire application to verify code.</li>
</ul>
<!--section-->
<h3 id="alwaysusetdd">Always use TDD?</h3>
<!--section-->
<h3 id="no">NO</h3>
<p>Don&apos;t use TDD unless it makes you feel good and confident.</p>
<!--topic-->
<h2 id="ci">CI</h2>
<p><img src="https://ws2.sinaimg.cn/large/006tNc79gy1fqpayfqiatj30s30i6gu2.jpg" alt="Better Unit Testing" loading="lazy"></p>
<!--section-->
<p><img src="https://ws1.sinaimg.cn/large/006tNc79gy1fqpaygz9icj30m80arq58.jpg" alt="Better Unit Testing" loading="lazy"></p>
<!--topic-->
<h2 id="tools">Tools</h2>
<ul>
<li>VS Code - <a href="https://marketplace.visualstudio.com/items?itemName=Orta.vscode-jest">Jest Plugin</a></li>
<li>VS Code - <a href="https://marketplace.visualstudio.com/items/WallabyJs.wallaby-vscode">Wallaby.js Plugin</a></li>
<li><a href="https://github.com/jest-community/eslint-plugin-jest">ESLint plugin for Jest</a></li>
<li><a href="https://docs.gitlab.com/ee/integration/jenkins.html">Jenkins/Gitlab</a></li>
</ul>
<!--topic-->
<h2 id="reference">Reference</h2>
<ul>
<li>
<p>Book: <a href="https://www.manning.com/books/effective-unit-testing">Effective Unit Testing</a></p>
</li>
<li>
<p><a href="https://github.com/mawrkus/js-unit-testing-guide">A guide to unit testing in JavaScript</a></p>
</li>
<li>
<p><a href="https://medium.com/@yahelyechieli/5-tips-for-writing-great-javascript-unit-tests-86296ad2d997">5 Tips for Writing Great Javascript Unit Tests</a></p>
</li>
<li>
<p><a href="https://technologyconversations.com/2013/12/24/test-driven-development-tdd-best-practices-using-java-examples-2/">Test Driven Development (TDD): Best Practices Using Java Examples</a></p>
</li>
<li>
<p><a href="https://docs.gitlab.com/ee/integration/jenkins.html">Jenkins and Gitlab integration</a></p>
</li>
<li>
<p><a href="https://about.gitlab.com/2016/11/03/publish-code-coverage-report-with-gitlab-pages/">Gitlab Coverage Report</a></p>
</li>
</ul>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[用WebStorm在团队中共享前端项目配置]]></title><description><![CDATA[众所周知，在团队中统一代码风格是一件很重要但实践起来却非常困难的事情。在过去，我们为了实现整个项目代码风格的一致，需要制定一套冗长的规范，然后要求团队每个成员阅读并按照规范来编写代码，这就要求每个新成员需要一个很长的学习周期才能比较好的融入团队。同时，对新成员而言，一个陌生项目的初始化和各项配置也是一件非常麻烦的事情，需要较高的学习成本。]]></description><link>https://doctype-html.com/jetbrains-team-work/</link><guid isPermaLink="false">59c5d6116b327b0001b1c58d</guid><category><![CDATA[JetBrains]]></category><category><![CDATA[WebStorm]]></category><dc:creator><![CDATA[Valor Lin(威老)]]></dc:creator><pubDate>Fri, 01 Dec 2017 18:04:54 GMT</pubDate><media:content url="https://doctype-html.com/content/images/2017/12/jelleke-vanooteghem.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://doctype-html.com/content/images/2017/12/jelleke-vanooteghem.jpg" alt="&#x7528;WebStorm&#x5728;&#x56E2;&#x961F;&#x4E2D;&#x5171;&#x4EAB;&#x524D;&#x7AEF;&#x9879;&#x76EE;&#x914D;&#x7F6E;"><p>&#x4F17;&#x6240;&#x5468;&#x77E5;&#xFF0C;&#x5728;&#x56E2;&#x961F;&#x4E2D;&#x7EDF;&#x4E00;&#x4EE3;&#x7801;&#x98CE;&#x683C;&#x662F;&#x4E00;&#x4EF6;&#x5F88;&#x91CD;&#x8981;&#x4F46;&#x5B9E;&#x8DF5;&#x8D77;&#x6765;&#x5374;&#x975E;&#x5E38;&#x56F0;&#x96BE;&#x7684;&#x4E8B;&#x60C5;&#x3002;&#x5728;&#x8FC7;&#x53BB;&#xFF0C;&#x6211;&#x4EEC;&#x4E3A;&#x4E86;&#x5B9E;&#x73B0;&#x6574;&#x4E2A;&#x9879;&#x76EE;&#x4EE3;&#x7801;&#x98CE;&#x683C;&#x7684;&#x4E00;&#x81F4;&#xFF0C;&#x9700;&#x8981;&#x5236;&#x5B9A;&#x4E00;&#x5957;&#x5197;&#x957F;&#x7684;&#x89C4;&#x8303;&#xFF0C;&#x8981;&#x6C42;&#x56E2;&#x961F;&#x6BCF;&#x4E2A;&#x6210;&#x5458;&#x9605;&#x8BFB;&#x5E76;&#x6309;&#x7167;&#x89C4;&#x8303;&#x6765;&#x7F16;&#x5199;&#x4EE3;&#x7801;&#xFF0C;&#x8FD9;&#x4F7F;&#x5F97;&#x6BCF;&#x4E2A;&#x65B0;&#x6210;&#x5458;&#x9700;&#x8981;&#x4E00;&#x4E2A;&#x5F88;&#x957F;&#x7684;&#x5B66;&#x4E60;&#x5468;&#x671F;&#x624D;&#x80FD;&#x6BD4;&#x8F83;&#x597D;&#x7684;&#x878D;&#x5165;&#x56E2;&#x961F;&#x3002;&#x540C;&#x65F6;&#xFF0C;&#x5BF9;&#x65B0;&#x6210;&#x5458;&#x800C;&#x8A00;&#xFF0C;&#x4E00;&#x4E2A;&#x964C;&#x751F;&#x9879;&#x76EE;&#x7684;&#x521D;&#x59CB;&#x5316;&#x548C;&#x5404;&#x9879;&#x73AF;&#x5883;&#x914D;&#x7F6E;&#x4E5F;&#x662F;&#x4E00;&#x4EF6;&#x975E;&#x5E38;&#x9EBB;&#x70E6;&#x7684;&#x4E8B;&#x60C5;&#xFF0C;&#x9700;&#x8981;&#x8F83;&#x9AD8;&#x7684;&#x5B66;&#x4E60;&#x6210;&#x672C;&#x3002;</p>
<p>&#x4E3A;&#x4E86;&#x89E3;&#x51B3;&#x8FD9;&#x4E9B;&#x95EE;&#x9898;&#xFF0C;&#x5F88;&#x591A;&#x5DE5;&#x5177;&#x5E94;&#x5B55;&#x800C;&#x751F;&#xFF0C;&#x4F8B;&#x5982;&#xFF1A;jslint&#x3001;eslint&#x3001;stylelint&#x3001;editorconfig&#x2026;&#x2026; &#x4F46;&#x7531;&#x6B64;&#x5E26;&#x6765;&#x7684;&#x53E6;&#x5916;&#x4E00;&#x4E2A;&#x95EE;&#x9898;&#x5C31;&#x662F;&#xFF0C;&#x8FD9;&#x4E9B;&#x4E1C;&#x897F;&#x672C;&#x8EAB;&#x4E5F;&#x662F;&#x6709;&#x5B66;&#x4E60;&#x6210;&#x672C;&#x7684;&#x3002;&#x867D;&#x7136;&#x65B0;&#x6210;&#x5458;&#x4E0D;&#x518D;&#x9700;&#x8981;&#x518D;&#x9605;&#x8BFB;&#x5197;&#x957F;&#x7684;&#x89C4;&#x8303;&#x6587;&#x6863;&#x4E86;&#xFF0C;&#x4ED6;&#x4EEC;&#x4ECD;&#x7136;&#x9700;&#x8981;&#x5B66;&#x4E60;&#x8FD9;&#x4E9B;&#x5DE5;&#x5177;&#x7684;&#x914D;&#x7F6E;&#x548C;&#x4F7F;&#x7528;&#x3002;&#x90A3;&#x4E48;&#x6709;&#x6CA1;&#x6709;&#x4E00;&#x79CD;&#x529E;&#x6CD5;&#xFF0C;&#x53EF;&#x4EE5;&#x8BA9;&#x65B0;&#x6210;&#x5458;&#x65E0;&#x9700;&#x5B66;&#x4E60;&#x8FD9;&#x4E00;&#x5207;&#xFF0C;&#x76F4;&#x63A5;&#x4E0A;&#x624B;&#x65B0;&#x9879;&#x76EE;&#x5462;&#xFF1F;</p>
<p>&#x6709;&#xFF0C;&#x800C;&#x4E14;&#x975E;&#x5E38;&#x7B80;&#x5355;&#xFF01;&#x7528;&#x6211;&#x4EEC;&#x6240;&#x719F;&#x6089;&#x7684; WebStorm &#x5C31;&#x53EF;&#x4EE5;&#x8F7B;&#x677E;&#x5B9E;&#x73B0;&#x3002;&#x5F53;&#x7136;&#x5176;&#x4ED6; JetBrains IDE &#x4E5F;&#x662F;&#x4E00;&#x6837;&#x7684;&#xFF0C;&#x8FD9;&#x91CC;&#x4ECB;&#x7ECD;&#x7684;&#x65B9;&#x6CD5;&#x540C;&#x6837;&#x9002;&#x7528;&#x4E8E;&#xFF1A;IntelliJ IDEA&#x3001;RubyMine&#x3001;PhpStorm&#x3001;AppCode&#x3001;PyCharm&#x3001;CLion &#x548C; Android Studio&#x3002;</p>
<h2 id>&#x9879;&#x76EE;&#x914D;&#x7F6E;</h2>
<p>WebStorm &#x9879;&#x76EE;&#x914D;&#x7F6E;&#x7531;&#x4E00;&#x7CFB;&#x5217;&#x7684; xml &#x6587;&#x4EF6;&#x7EC4;&#x6210;&#xFF0C;&#x4F4D;&#x4E8E;&#x9879;&#x76EE;&#x6839;&#x76EE;&#x5F55;&#x4E0B;&#x7684; <code>.idea/</code> &#x76EE;&#x5F55;&#x3002; &#x5728; WebStorm &#x4E2D;&#xFF0C;&#x8BB8;&#x591A;&#x8BBE;&#x7F6E;&#x9879;&#x90FD;&#x662F;&#x80FD;&#x591F;&#x53EA;&#x5BF9;&#x7279;&#x5B9A;&#x9879;&#x76EE;&#x751F;&#x6548;&#x7684;&#x3002;&#x5F53;&#x4F60;&#x5728;&#x8BBE;&#x7F6E;&#x754C;&#x9762;&#x4E0A;&#x770B;&#x5230;&#x8FD9;&#x884C;&#x5C0F;&#x5B57;&#x7684;&#x65F6;&#x5019; <img src="https://doctype-html.com/content/images/2017/09/for_current_project.png" alt="&#x7528;WebStorm&#x5728;&#x56E2;&#x961F;&#x4E2D;&#x5171;&#x4EAB;&#x524D;&#x7AEF;&#x9879;&#x76EE;&#x914D;&#x7F6E;" loading="lazy"> &#x8FD9;&#x5C31;&#x4EE3;&#x8868;&#x4F60;&#x5728;&#x8FD9;&#x4E2A;&#x754C;&#x9762;&#x4E0A;&#x7684;&#x505A;&#x7684;&#x6240;&#x6709;&#x8BBE;&#x7F6E;&#x90FD;&#x53EA;&#x5BF9;&#x5F53;&#x524D;&#x9879;&#x76EE;&#x751F;&#x6548;&#xFF0C;&#x5E76;&#x4E14;&#x4F1A;&#x4EE5; xml &#x6587;&#x4EF6;&#x7684;&#x5F62;&#x5F0F;&#x5B58;&#x50A8;&#x5230; <code>.idea/</code> &#x76EE;&#x5F55;&#x4E2D;&#x3002;&#x8FD9;&#x610F;&#x5473;&#x7740;&#xFF0C;&#x5982;&#x679C;&#x5408;&#x7406;&#x5229;&#x7528;&#x7684;&#x8BDD;&#xFF0C;&#x6211;&#x4EEC;&#x5C31;&#x80FD;&#x591F;&#x5728;&#x56E2;&#x961F;&#x6210;&#x5458;&#x95F4;&#x901A;&#x8FC7;&#x7248;&#x672C;&#x63A7;&#x5236;&#x7CFB;&#x7EDF;&#x6765;&#x5171;&#x4EAB;&#x8FD9;&#x4E9B;&#x914D;&#x7F6E;&#x3002;&#x65B0;&#x4EBA;&#x63A5;&#x624B;&#x9879;&#x76EE;&#x65F6;&#xFF0C;&#x65E0;&#x9700;&#x5173;&#x5FC3;&#x6B64;&#x9879;&#x76EE;&#x539F;&#x5148;&#x7684;&#x4EE3;&#x7801;&#x98CE;&#x683C;&#xFF0C;&#x53EA;&#x9700;&#x4E00;&#x4E2A;&#x5FEB;&#x6377;&#x952E;&#x4FBF;&#x53EF;&#x5C06;&#x4EE3;&#x7801;&#x6574;&#x7406;&#x6210;&#x7EDF;&#x4E00;&#x7684;&#x98CE;&#x683C;&#x3002;&#x65B0;&#x4EBA;&#x53EA;&#x9700;&#x51E0;&#x5206;&#x949F;&#x4FBF;&#x53EF;&#x5B8C;&#x6210;&#x6574;&#x4E2A;&#x5F00;&#x53D1;&#x73AF;&#x5883;&#x7684;&#x642D;&#x5EFA;&#x3002;</p>
<p>&#x5BF9;&#x6211;&#x4EEC;&#x800C;&#x8A00;&#xFF0C;&#x4EE5;&#x4E0B;&#x662F;&#x6BD4;&#x8F83;&#x91CD;&#x8981;&#x7684;&#x4E00;&#x4E9B;&#x914D;&#x7F6E;&#xFF1A;</p>
<h3 id="codestyle">&#x4EE3;&#x7801;&#x98CE;&#x683C; Code Style</h3>
<p>&#x9996;&#x5148;&#xFF0C;&#x521B;&#x5EFA;&#x4E00;&#x5957;&#x81EA;&#x5DF1;&#x7684;&#x4EE3;&#x7801;&#x98CE;&#x683C;&#x914D;&#x7F6E;&#xFF0C;&#x5927;&#x90E8;&#x5206;&#x4EBA;&#x90FD;&#x6709;&#x81EA;&#x5DF1;&#x7684;&#x4E00;&#x5957;&#x98CE;&#x683C;&#x914D;&#x7F6E;&#x4E86;&#x3002;&#x5982;&#x679C;&#x6CA1;&#x6709;&#x7684;&#x8BDD;&#xFF0C;WebStorm  &#x9664;&#x4E86;&#x9ED8;&#x8BA4;&#x65B9;&#x6848;&#x4E4B;&#x5916;&#xFF0C;&#x8FD8;&#x6709;&#x4E24;&#x5957;&#x9884;&#x8BBE;&#x53EF;&#x4F9B;&#x9009;&#x62E9; <img src="https://doctype-html.com/content/images/2017/09/code_style_predefined.png" alt="&#x7528;WebStorm&#x5728;&#x56E2;&#x961F;&#x4E2D;&#x5171;&#x4EAB;&#x524D;&#x7AEF;&#x9879;&#x76EE;&#x914D;&#x7F6E;" loading="lazy"></p>
<p>&#x63A5;&#x4E0B;&#x6765;&#xFF0C;&#x5C06; Code Style &#x7684; schema &#x8BBE;&#x7F6E;&#x4E3A; Project <img src="https://doctype-html.com/content/images/2017/12/code_style_project.png" alt="&#x7528;WebStorm&#x5728;&#x56E2;&#x961F;&#x4E2D;&#x5171;&#x4EAB;&#x524D;&#x7AEF;&#x9879;&#x76EE;&#x914D;&#x7F6E;" loading="lazy"></p>
<p>&#x70B9;&#x51FB; OK&#xFF0C;&#x7136;&#x540E; BOOM!!! &#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x51FA;&#x73B0;&#x4E86; <code>.idea/codeStyleSettings.xml</code>  <img src="https://doctype-html.com/content/images/2017/12/code_style_settings_xml.png" alt="&#x7528;WebStorm&#x5728;&#x56E2;&#x961F;&#x4E2D;&#x5171;&#x4EAB;&#x524D;&#x7AEF;&#x9879;&#x76EE;&#x914D;&#x7F6E;" loading="lazy"></p>
<h3 id="rundebug">&#x8FD0;&#x884C;/&#x8C03;&#x8BD5; Run/Debug</h3>
<p>&#x6CA1;&#x9519;&#xFF0C;&#x8FD9;&#x4E2A;&#x529F;&#x80FD;&#x7684;&#x914D;&#x7F6E;&#x4E5F;&#x662F;&#x53EF;&#x4EE5;&#x5171;&#x4EAB;&#x7684; <img src="https://doctype-html.com/content/images/2017/12/run_debug.png" alt="&#x7528;WebStorm&#x5728;&#x56E2;&#x961F;&#x4E2D;&#x5171;&#x4EAB;&#x524D;&#x7AEF;&#x9879;&#x76EE;&#x914D;&#x7F6E;" loading="lazy"></p>
<p>&#x53EA;&#x8981;&#x52FE;&#x9009; share &#x9009;&#x6846;&#x5373;&#x53EF; <img src="https://doctype-html.com/content/images/2017/12/run_debug_configurations.png" alt="&#x7528;WebStorm&#x5728;&#x56E2;&#x961F;&#x4E2D;&#x5171;&#x4EAB;&#x524D;&#x7AEF;&#x9879;&#x76EE;&#x914D;&#x7F6E;" loading="lazy"></p>
<p>&#x70B9;&#x51FB; OK&#xFF0C;&#x76F8;&#x5E94;&#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x5DF2;&#x7ECF;&#x5B89;&#x9759;&#x7684;&#x8EBA;&#x5728; <code>.idea/runConfigurations</code> &#x76EE;&#x5F55;&#x4E2D;&#x4E86; <img src="https://doctype-html.com/content/images/2017/12/run_configurations.png" alt="&#x7528;WebStorm&#x5728;&#x56E2;&#x961F;&#x4E2D;&#x5171;&#x4EAB;&#x524D;&#x7AEF;&#x9879;&#x76EE;&#x914D;&#x7F6E;" loading="lazy"></p>
<h3 id="startuptasks">&#x542F;&#x52A8;&#x4EFB;&#x52A1; Startup Tasks</h3>
<p>&#x540C;&#x6837;&#x662F;&#x4E00;&#x4E2A; share &#x9009;&#x6846;&#xFF0C;&#x5728;&#x8FD9;&#x91CC;&#x53EF;&#x4EE5;&#x627E;&#x5230; <img src="https://doctype-html.com/content/images/2017/12/start_up_task_share.png" alt="&#x7528;WebStorm&#x5728;&#x56E2;&#x961F;&#x4E2D;&#x5171;&#x4EAB;&#x524D;&#x7AEF;&#x9879;&#x76EE;&#x914D;&#x7F6E;" loading="lazy"><br>
&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x4E3A; <code>.idea/startup.xml</code></p>
<h3 id="languagesframeworks">&#x8BED;&#x8A00;&#x548C;&#x6846;&#x67B6; Languages &amp; Frameworks</h3>
<p>&#x9009;&#x62E9;&#x5F53;&#x524D;&#x9879;&#x76EE;&#x6240;&#x4F7F;&#x7528;&#x7684; ECMAScript &#x7248;&#x672C; <img src="https://doctype-html.com/content/images/2017/12/languages_frameworks.png" alt="&#x7528;WebStorm&#x5728;&#x56E2;&#x961F;&#x4E2D;&#x5171;&#x4EAB;&#x524D;&#x7AEF;&#x9879;&#x76EE;&#x914D;&#x7F6E;" loading="lazy"></p>
<p>&#x914D;&#x7F6E;&#x4FDD;&#x5B58;&#x5728; <code>misc.xml</code> &#x4E2D;&#x3002;</p>
<h3 id="filewatchers">&#x6587;&#x4EF6;&#x76D1;&#x89C6; File Watchers</h3>
<p>&#x8FD9;&#x4E2A;&#x65E0;&#x9700;&#x989D;&#x5916;&#x914D;&#x7F6E;&#xFF0C;&#x6240;&#x6709;&#x7684; File Watcher &#x90FD;&#x4F1A;&#x81EA;&#x52A8;&#x88AB;&#x6DFB;&#x52A0;&#x5230; <code>.idea/watcherTasks.xml</code> &#x5F53;&#x4E2D;&#x3002;</p>
<p>&#x6BD4;&#x8F83;&#x5E38;&#x7528;&#x7684;&#x5C31;&#x4E0A;&#x9762;&#x8FD9;&#x4E9B;&#x4E86;&#xFF0C;&#x5176;&#x4ED6;&#x7684;&#x5927;&#x5BB6;&#x53EF;&#x4EE5;&#x81EA;&#x884C;&#x6478;&#x7D22;&#x3002;</p>
<h2 id="gitignore">&#x6DFB;&#x52A0; .gitignore &#x6587;&#x4EF6;</h2>
<p>&#x76F8;&#x4FE1;&#x4E0D;&#x5C11;&#x4EBA;&#x521A;&#x63A5;&#x89E6; WebStorm &#x7684;&#x65F6;&#x5019;&#xFF0C;&#x90FD;&#x6709;&#x8FC7;&#x5C06; <code>.idea/</code> &#x76EE;&#x5F55;&#x4E0B;&#x7684;&#x6587;&#x4EF6;&#x63D0;&#x4EA4;&#x5230; git &#x4E0A;&#xFF0C;&#x5BFC;&#x81F4; WebStorm &#x9519;&#x4E71;&#x800C;&#x75DB;&#x4E0D;&#x6B32;&#x751F;&#x7684;&#x7ECF;&#x5386;&#x3002;&#x4E3A;&#x4E86;&#x907F;&#x514D;&#x8FD9;&#x79CD;&#x95EE;&#x9898;&#x7684;&#x53D1;&#x751F;&#xFF0C;&#x4E0D;&#x5C11;&#x4EBA;&#x90FD;&#x7C97;&#x66B4;&#x5730;&#x5C06;&#x6574;&#x4E2A; <code>.idea/</code> &#x76EE;&#x5F55;&#x5FFD;&#x7565;&#x6389;&#x4E86;&#x3002;</p>
<p>&#x4E00;&#x5F00;&#x59CB;&#x6211;&#x4E5F;&#x5F88;&#x7EB3;&#x95F7;&#xFF0C;&#x4E3A;&#x4EC0;&#x4E48; WebStorm &#x8981;&#x5C06;&#x6574;&#x4E2A;&#x9879;&#x76EE;&#x7684;&#x6240;&#x6709;&#x914D;&#x7F6E;&#x653E;&#x5728;&#x9879;&#x76EE;&#x6839;&#x76EE;&#x5F55;&#x4E0B;&#xFF0C;&#x8BA9;&#x5927;&#x5BB6;&#x4E00;&#x4E2A;&#x4E0D;&#x5C0F;&#x5FC3;&#x5C31;&#x63D0;&#x4EA4;&#x4E0A;&#x53BB;&#x51FA;&#x9519;&#x5462;&#xFF1F;&#x76F4;&#x5230;&#x6709;&#x4E00;&#x5929;&#xFF0C;&#x6211;&#x901A;&#x8FC7; ignore &#x63D2;&#x4EF6;&#x751F;&#x6210;&#x4E86;&#x4E00;&#x4EFD;&#x9488;&#x5BF9; WebStorm &#x7684; <code>.gitignore</code> &#x6587;&#x4EF6;&#xFF0C;&#x6211;&#x53D1;&#x73B0;&#x63D2;&#x4EF6;&#x751F;&#x6210;&#x7684;&#x89C4;&#x5219;&#xFF0C;&#x5E76;&#x4E0D;&#x662F;&#x7B80;&#x5355;&#x7684;&#x5C06;&#x6574;&#x4E2A; <code>.idea/</code> &#x76EE;&#x5F55;&#x6392;&#x9664;&#x5728;&#x5916;&#xFF0C;&#x800C;&#x662F;&#x6709;&#x9488;&#x5BF9;&#x6027;&#x7684;&#x6392;&#x9664;&#x6389;&#x4E86;&#x4E00;&#x4E9B;&#x7528;&#x6237;&#x79C1;&#x6709;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF0C;&#x800C;&#x4FDD;&#x7559;&#x4E86;&#x6240;&#x6709;&#x53EF;&#x4EE5;&#x63D0;&#x4EA4;&#x5230; git &#x4E0A;&#x4F46;&#x53C8;&#x4E0D;&#x4F1A;&#x5BFC;&#x81F4; bug &#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x3002;&#x6211;&#x604D;&#x7136;&#x5927;&#x609F;&#xFF0C;&#x539F;&#x6765; <code>.idea/</code> &#x76EE;&#x5F55;&#x4E0B;&#x8FD9;&#x4E9B;&#x6587;&#x4EF6;&#xFF0C;&#x5C31;&#x662F;&#x7528;&#x6765;&#x8BA9;&#x4F60;&#x5728;&#x56E2;&#x961F;&#x6210;&#x5458;&#x95F4;&#x5171;&#x4EAB;&#x7684;&#xFF01;&#x53EA;&#x4E0D;&#x8FC7;&#x524D;&#x63D0;&#x662F;&#x4F60;&#x9700;&#x8981;&#x641E;&#x6E05;&#x695A;&#xFF0C;&#x54EA;&#x4E9B;&#x6587;&#x4EF6;&#x53EF;&#x4EE5;&#x63D0;&#x4EA4;&#xFF0C;&#x54EA;&#x4E9B;&#x4E0D;&#x53EF;&#x4EE5;&#x3002;</p>
<p>&#x53EA;&#x8981;&#x6709;&#x4E00;&#x4EFD;&#x5408;&#x7406;&#x7684; <code>.gitignore</code> &#x6587;&#x4EF6;&#xFF0C;<code>.idea/</code> &#x76EE;&#x5F55;&#x4E2D;&#x7684;&#x6587;&#x4EF6;&#x4E5F;&#x662F;&#x53EF;&#x4EE5;&#x63D0;&#x4EA4;&#x7684;&#xFF01;&#x800C;&#x7531;&#x4E8E;&#x6709; ignore &#x63D2;&#x4EF6;&#x7684;&#x8F85;&#x52A9;&#xFF0C;&#x8FD9;&#x4E00;&#x5207;&#x4E5F;&#x975E;&#x5E38;&#x7B80;&#x5355;&#x3002;</p>
<h3 id="1ignore">&#x65B9;&#x6848;1 &#x4F7F;&#x7528; ignore &#x63D2;&#x4EF6;&#x751F;&#x6210;&#x914D;&#x7F6E;</h3>
<p>&#x5B89;&#x88C5; <code>ignore</code> &#x63D2;&#x4EF6; <img src="https://doctype-html.com/content/images/2017/12/ignore_plugin.png" alt="&#x7528;WebStorm&#x5728;&#x56E2;&#x961F;&#x4E2D;&#x5171;&#x4EAB;&#x524D;&#x7AEF;&#x9879;&#x76EE;&#x914D;&#x7F6E;" loading="lazy"></p>
<p>&#x4F7F;&#x7528;&#x63D2;&#x4EF6;&#x65B0;&#x5EFA;&#x4E00;&#x4E2A; ignore &#x6587;&#x4EF6; <img src="https://doctype-html.com/content/images/2017/12/new_ignore.png" alt="&#x7528;WebStorm&#x5728;&#x56E2;&#x961F;&#x4E2D;&#x5171;&#x4EAB;&#x524D;&#x7AEF;&#x9879;&#x76EE;&#x914D;&#x7F6E;" loading="lazy"></p>
<p>&#x521B;&#x5EFA;&#x65F6;&#x4F1A;&#x8BA9;&#x4F60;&#x9009;&#x62E9;&#x6A21;&#x677F;&#xFF0C;&#x641C;&#x7D22;&#x5E76;&#x52FE;&#x9009; JetBrains &#x6A21;&#x677F;&#xFF0C;&#x70B9; <code>Generate</code> <img src="https://doctype-html.com/content/images/2017/12/ignore_generator.png" alt="&#x7528;WebStorm&#x5728;&#x56E2;&#x961F;&#x4E2D;&#x5171;&#x4EAB;&#x524D;&#x7AEF;&#x9879;&#x76EE;&#x914D;&#x7F6E;" loading="lazy"></p>
<h3 id="2gitignoreio">&#x65B9;&#x6848;2 &#x4F7F;&#x7528; gitignore.io &#x751F;&#x6210;&#x914D;&#x7F6E;</h3>
<p>&#x6253;&#x5F00; <a href="http://gitignore.io/">gitignore.io</a>&#x3002;</p>
<p>&#x8F93;&#x5165; JetBrains &#x70B9;&#x51FB;&#x521B;&#x5EFA;&#xFF0C;&#x83B7;&#x5F97;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x3002;</p>
<h3 id="3">&#x65B9;&#x6848;3 &#x590D;&#x5236;&#x8FD9;&#x4EFD;&#x914D;&#x7F6E;</h3>
<pre><code class="language-gitignore"># Created by .ignore support plugin (hsz.mobi)
### JetBrains template
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839

# User-specific stuff:
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/dictionaries

# Sensitive or high-churn files:
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.xml
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml

# Gradle:
.idea/**/gradle.xml
.idea/**/libraries

# CMake
cmake-build-debug/

# Mongo Explorer plugin:
.idea/**/mongoSettings.xml

## File-based project format:
*.iws

## Plugin-specific files:

# IntelliJ
out/

# mpeltonen/sbt-idea plugin
.idea_modules/

# JIRA plugin
atlassian-ide-plugin.xml

# Cursive Clojure plugin
.idea/replstate.xml

# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
</code></pre>
<h2 id>&#x63D0;&#x4EA4;&#x914D;&#x7F6E;&#x6587;&#x4EF6;</h2>
<p>&#x6700;&#x540E;&#x4E00;&#x6B65;&#xFF0C;&#x53EA;&#x8981;&#x5C06;&#x4E0A;&#x8FF0; <code>.gitignore</code> &#x6587;&#x4EF6;&#x4EE5;&#x53CA; <code>.idea</code> &#x76EE;&#x5F55;&#x4E0B;&#x6CA1;&#x6709;&#x88AB;&#x5FFD;&#x7565;&#x6389;&#x7684;&#x6587;&#x4EF6;&#x63D0;&#x4EA4;&#x5230; git &#x4E0A;&#x5C31;&#x884C;&#x4E86;&#x3002;</p>
<p>&#x9A8C;&#x6536;&#x4E00;&#x4E0B;&#x6210;&#x679C;&#xFF0C;&#x91CD;&#x65B0; git clone &#x4E00;&#x6B21;&#x8FD9;&#x4E2A;&#x9879;&#x76EE;&#xFF0C;&#x89C2;&#x5BDF;&#x5404;&#x9879;&#x914D;&#x7F6E;&#x80FD;&#x5426;&#x6B63;&#x5E38;&#x540C;&#x6B65;&#x3002;</p>
<p>&#x5B8C;&#x6210;&#x4E4B;&#x540E;&#xFF0C;&#x53BB;&#x6CE1;&#x676F;&#x8336;&#xFF0C;&#x6216;&#x8005;&#x5496;&#x5561;&#x4F11;&#x606F;&#x4E00;&#x4E0B;&#x5427;&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Mac和Linux下搜索并操作文件命令]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h2 id="find">find &#x547D;&#x4EE4;</h2>
<pre><code class="language-bash"># &#x627E;&#x5230; src/ &#x76EE;&#x5F55;&#x4E2D;&#x7684; file.txt &#x6587;&#x4EF6;
find src/ -name &apos;file.txt&apos;

# &#x627E;&#x5230; src/ &#x76EE;&#x5F55;&#x4E2D;&#x7684;&#x6240;&#x6709; txt &#x6587;&#x4EF6;
find src/ -name &apos;*.txt&apos;
</code></pre>
<h2 id="exec">-exec &#x53C2;&#x6570;</h2>
<p>&#x4EE5;&#x590D;&#x5236;&#x6240;&#x6709;&#x627E;&#x5230;&#x7684;</p>]]></description><link>https://doctype-html.com/mac-linux-find-copy/</link><guid isPermaLink="false">59b74619678a6b0001d26709</guid><category><![CDATA[shell]]></category><dc:creator><![CDATA[Valor Lin(威老)]]></dc:creator><pubDate>Fri, 01 Dec 2017 16:31:35 GMT</pubDate><media:content url="https://doctype-html.com/content/images/2017/12/goran-ivos.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id="find">find &#x547D;&#x4EE4;</h2>
<pre><code class="language-bash"># &#x627E;&#x5230; src/ &#x76EE;&#x5F55;&#x4E2D;&#x7684; file.txt &#x6587;&#x4EF6;
find src/ -name &apos;file.txt&apos;

# &#x627E;&#x5230; src/ &#x76EE;&#x5F55;&#x4E2D;&#x7684;&#x6240;&#x6709; txt &#x6587;&#x4EF6;
find src/ -name &apos;*.txt&apos;
</code></pre>
<h2 id="exec">-exec &#x53C2;&#x6570;</h2>
<img src="https://doctype-html.com/content/images/2017/12/goran-ivos.jpg" alt="Mac&#x548C;Linux&#x4E0B;&#x641C;&#x7D22;&#x5E76;&#x64CD;&#x4F5C;&#x6587;&#x4EF6;&#x547D;&#x4EE4;"><p>&#x4EE5;&#x590D;&#x5236;&#x6240;&#x6709;&#x627E;&#x5230;&#x7684;&#x6587;&#x4EF6;&#x81F3; <code>dest/</code> &#x76EE;&#x5F55;&#x4E3A;&#x4F8B;&#xFF0C;&#x547D;&#x4EE4;&#x5982;&#x4E0B;</p>
<h3 id="mac">Mac &#x4E0B;</h3>
<pre><code class="language-bash">find src/ -name &apos;file.txt&apos; -exec rsync -R {} dest/ \;
</code></pre>
<h3 id="linux">Linux &#x4E0B;</h3>
<pre><code class="language-bash">find src/ -name &apos;file.txt&apos; -exec cp --parents {} dest/ \;
</code></pre>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[开启 MacOS 下应用内嵌页开发者工具]]></title><description><![CDATA[<!--kg-card-begin: markdown--><h2 id>&#x5148;&#x4E0A;&#x6700;&#x7EC8;&#x6548;&#x679C;</h2>
<p><img src="https://doctype-html.com/content/images/2017/11/safari_embed_devtool-2.png" alt="safari_embed_devtool-2" loading="lazy"></p>
<h2 id>&#x5F00;&#x542F;&#x65B9;&#x5F0F;</h2>
<p>&#x5728;&#x7EC8;&#x7AEF;&#x4E2D;&#x8F93;&#x5165;&#x547D;&#x4EE4;</p>
<pre><code class="language-bash">defaults write com.sample.yourApp WebKitDeveloperExtras -bool true
</code></pre>
<p>&#x5176;&#x4E2D;<code>com.sample.yourApp</code>&#x662F;&#x4F60;&#x8981;&#x8C03;&#x8BD5;&#x7684;&#x7A0B;&#x5E8F;&#x7684;<code>Bundle identifier</code>&#x3002;</p>
<p>&#x5982;&#x679C;&#x4E0D;&#x77E5;&#x9053;&#x503C;&#x662F;</p>]]></description><link>https://doctype-html.com/macos-safari-embed-devtool/</link><guid isPermaLink="false">5a1390c06b327b0001b1c5c0</guid><category><![CDATA[safari]]></category><category><![CDATA[MacOS]]></category><dc:creator><![CDATA[Valor Lin(威老)]]></dc:creator><pubDate>Tue, 21 Nov 2017 03:09:46 GMT</pubDate><media:content url="https://doctype-html.com/content/images/2017/12/ludovic-toinel.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><h2 id>&#x5148;&#x4E0A;&#x6700;&#x7EC8;&#x6548;&#x679C;</h2>
<img src="https://doctype-html.com/content/images/2017/12/ludovic-toinel.jpg" alt="&#x5F00;&#x542F; MacOS &#x4E0B;&#x5E94;&#x7528;&#x5185;&#x5D4C;&#x9875;&#x5F00;&#x53D1;&#x8005;&#x5DE5;&#x5177;"><p><img src="https://doctype-html.com/content/images/2017/11/safari_embed_devtool-2.png" alt="&#x5F00;&#x542F; MacOS &#x4E0B;&#x5E94;&#x7528;&#x5185;&#x5D4C;&#x9875;&#x5F00;&#x53D1;&#x8005;&#x5DE5;&#x5177;" loading="lazy"></p>
<h2 id>&#x5F00;&#x542F;&#x65B9;&#x5F0F;</h2>
<p>&#x5728;&#x7EC8;&#x7AEF;&#x4E2D;&#x8F93;&#x5165;&#x547D;&#x4EE4;</p>
<pre><code class="language-bash">defaults write com.sample.yourApp WebKitDeveloperExtras -bool true
</code></pre>
<p>&#x5176;&#x4E2D;<code>com.sample.yourApp</code>&#x662F;&#x4F60;&#x8981;&#x8C03;&#x8BD5;&#x7684;&#x7A0B;&#x5E8F;&#x7684;<code>Bundle identifier</code>&#x3002;</p>
<p>&#x5982;&#x679C;&#x4E0D;&#x77E5;&#x9053;&#x503C;&#x662F;&#x591A;&#x5C11;&#xFF0C;&#x53EF;&#x4EE5;&#x5728;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x4E2D;&#x627E;&#x5230;&#x4F60;&#x60F3;&#x8C03;&#x8BD5;&#x7684;&#x7A0B;&#x5E8F;&#xFF0C;&#x70B9;&#x51FB;&#x53F3;&#x952E;=&gt;&#x663E;&#x793A;&#x5305;&#x5185;&#x5BB9;=&gt;&#x5728;<code>Contents/Info.plist</code>&#x6587;&#x4EF6;&#x4E2D;&#x67E5;&#x627E;<code>CFBundleIdentifier</code>&#x3002;</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Windows Server 2012下IIS8.0配置FTP服务]]></title><description><![CDATA[自从上次博客挂掉，丢失了所有数据之后就好长一段时间没有写东西了。今天稍微折腾了一下 Windows 服务器，配置的过程中找了几篇文章，都没有看比较全面的讲解，踩坑不少，浪费了不少时间，感觉有必要做一些总结。我们一步一步来吧。]]></description><link>https://doctype-html.com/iis8-ftp/</link><guid isPermaLink="false">59b069ec678a6b0001d266f8</guid><category><![CDATA[FTP]]></category><category><![CDATA[IIS]]></category><category><![CDATA[Windows Server]]></category><dc:creator><![CDATA[Valor Lin(威老)]]></dc:creator><pubDate>Wed, 06 Sep 2017 21:42:40 GMT</pubDate><media:content url="https://doctype-html.com/content/images/2017/09/ftp.jpg" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://doctype-html.com/content/images/2017/09/ftp.jpg" alt="Windows Server 2012&#x4E0B;IIS8.0&#x914D;&#x7F6E;FTP&#x670D;&#x52A1;"><p>&#x81EA;&#x4ECE;&#x4E0A;&#x6B21;&#x535A;&#x5BA2;&#x6302;&#x6389;&#xFF0C;&#x4E22;&#x5931;&#x4E86;&#x6240;&#x6709;&#x6570;&#x636E;&#x4E4B;&#x540E;&#x5C31;&#x597D;&#x957F;&#x4E00;&#x6BB5;&#x65F6;&#x95F4;&#x6CA1;&#x6709;&#x5199;&#x4E1C;&#x897F;&#x4E86;&#x3002;&#x4ECA;&#x5929;&#x7A0D;&#x5FAE;&#x6298;&#x817E;&#x4E86;&#x4E00;&#x4E0B; Windows &#x670D;&#x52A1;&#x5668;&#xFF0C;&#x914D;&#x7F6E;&#x7684;&#x8FC7;&#x7A0B;&#x4E2D;&#x627E;&#x4E86;&#x51E0;&#x7BC7;&#x6587;&#x7AE0;&#xFF0C;&#x90FD;&#x6CA1;&#x6709;&#x770B;&#x6BD4;&#x8F83;&#x5168;&#x9762;&#x7684;&#x8BB2;&#x89E3;&#xFF0C;&#x8E29;&#x5751;&#x4E0D;&#x5C11;&#xFF0C;&#x6D6A;&#x8D39;&#x4E86;&#x4E0D;&#x5C11;&#x65F6;&#x95F4;&#xFF0C;&#x611F;&#x89C9;&#x6709;&#x5FC5;&#x8981;&#x505A;&#x4E00;&#x4E9B;&#x603B;&#x7ED3;&#x3002;&#x6211;&#x4EEC;&#x4E00;&#x6B65;&#x4E00;&#x6B65;&#x6765;&#x5427;&#x3002;</p>
<h3 id="ftp">&#x5B89;&#x88C5;FTP&#x670D;&#x52A1;</h3>
<p>&#x9996;&#x5148;<code>Ctrl+R</code>&#x8F93;&#x5165;<strong>control.exe /name Microsoft.ProgramsAndFeatures</strong>&#x6253;&#x5F00;&#x7A0B;&#x5E8F;&#x548C;&#x529F;&#x80FD;&#x7A97;&#x53E3;&#x3002;&#x70B9;&#x51FB;<strong>&#x542F;&#x7528;&#x6216;&#x5173;&#x95ED; Windows &#x529F;&#x80FD;</strong>&#x3002;<br>
<img src="https://doctype-html.com/content/images/2017/09/ftp_1.png" alt="Windows Server 2012&#x4E0B;IIS8.0&#x914D;&#x7F6E;FTP&#x670D;&#x52A1;" loading="lazy"><br>
&#x6B64;&#x65F6;&#x4F1A;&#x51FA;&#x6765;&#x4E00;&#x4E2A;<strong>&#x6DFB;&#x52A0;&#x89D2;&#x8272;&#x548C;&#x529F;&#x80FD;&#x5411;&#x5BFC;</strong>&#x7A97;&#x53E3;&#xFF0C;&#x6211;&#x4EEC;&#x5148;&#x8DDF;&#x7740;&#x529F;&#x80FD;&#x5411;&#x5BFC;&#x7684;&#x63D0;&#x793A;&#xFF0C;&#x76F4;&#x5230;<strong>&#x670D;&#x52A1;&#x5668;&#x89D2;&#x8272;</strong>&#x8FD9;&#x4E00;&#x6B65;&#x3002;<br>
<img src="https://doctype-html.com/content/images/2017/09/ftp_2.png" alt="Windows Server 2012&#x4E0B;IIS8.0&#x914D;&#x7F6E;FTP&#x670D;&#x52A1;" loading="lazy"><br>
&#x5728;<strong>&#x89D2;&#x8272;</strong>&#x5217;&#x8868;&#x4E2D;&#x9009;&#x4E2D;<strong>FTP&#x670D;&#x52A1;&#x5668;</strong>&#xFF0C;&#x7136;&#x540E;&#x7EE7;&#x7EED;&#x8DDF;&#x7740;&#x529F;&#x80FD;&#x5411;&#x5BFC;&#x7684;&#x63D0;&#x793A;&#x5C31;&#x80FD;&#x5B8C;&#x6210;FTP&#x670D;&#x52A1;&#x7684;&#x5B89;&#x88C5;&#x4E86;&#x3002;</p>
<h3 id="ftp">&#x6DFB;&#x52A0;FTP&#x7AD9;&#x70B9;</h3>
<p>&#x6211;&#x4EEC;&#x6253;&#x5F00;IIS&#x7BA1;&#x7406;&#x5668;&#xFF0C;&#x53F3;&#x952E;&#x7F51;&#x7AD9;&#x6216;&#x670D;&#x52A1;&#x5668;&#x540D;&#xFF0C;&#x9009;&#x62E9;<strong>&#x6DFB;&#x52A0;FTP&#x7AD9;&#x70B9;</strong>&#x3002;<br>
<img src="https://doctype-html.com/content/images/2017/09/ftp_3.png" alt="Windows Server 2012&#x4E0B;IIS8.0&#x914D;&#x7F6E;FTP&#x670D;&#x52A1;" loading="lazy"><br>
&#x8F93;&#x5165;&#x7AD9;&#x70B9;&#x540D;&#x79F0;&#x5E76;&#x9009;&#x62E9;&#x5185;&#x5BB9;&#x76EE;&#x5F55;&#xFF0C;&#x70B9;&#x51FB;&#x4E0B;&#x4E00;&#x6B65;&#x3002;<br>
<img src="https://doctype-html.com/content/images/2017/09/ftp_4.png" alt="Windows Server 2012&#x4E0B;IIS8.0&#x914D;&#x7F6E;FTP&#x670D;&#x52A1;" loading="lazy"><br>
&#x8FD9;&#x6837;&#x5C31;&#x6765;&#x5230;&#x4E86;&#x7ED1;&#x5B9A;&#x548C;SSL&#x8BBE;&#x7F6E;&#x754C;&#x9762;&#xFF0C;&#x7ED1;&#x5B9A;&#x90E8;&#x5206;&#x6211;&#x4EEC;&#x4E0D;&#x9700;&#x8981;&#x52A8;&#x4ED6;&#xFF0C;SSL&#x90E8;&#x5206;&#x9009;&#x62E9;<strong>&#x65E0;SSL</strong>&#x3002;<br>
<img src="https://doctype-html.com/content/images/2017/09/ftp_5.png" alt="Windows Server 2012&#x4E0B;IIS8.0&#x914D;&#x7F6E;FTP&#x670D;&#x52A1;" loading="lazy"><br>
&#x6700;&#x540E;&#xFF0C;&#x8BBE;&#x7F6E;&#x8EAB;&#x4EFD;&#x9A8C;&#x8BC1;&#x4FE1;&#x606F;&#xFF0C;&#x4E00;&#x822C;&#x6211;&#x4EEC;&#x90FD;&#x4E0D;&#x5F00;&#x542F;&#x533F;&#x540D;&#x8BBF;&#x95EE;&#x529F;&#x80FD;&#xFF0C;&#x6240;&#x4EE5;&#x8EAB;&#x4EFD;&#x9A8C;&#x8BC1;&#x8FD9;&#x5757;&#x52FE;&#x9009;<strong>&#x57FA;&#x672C;</strong>&#x5373;&#x53EF;&#x3002;&#x6388;&#x6743;&#x65B9;&#x5F0F;&#x9009;&#x5219;&#x6307;&#x5B9A;&#x7528;&#x6237;&#xFF0C;&#x8F93;&#x5165;Windows&#x7684;&#x7528;&#x6237;&#x540D;&#xFF0C;&#x6211;&#x8FD9;&#x91CC;&#x662F;&#x4E8B;&#x5148;&#x521B;&#x5EFA;&#x4E86;&#x4E00;&#x4E2A;&#x53EB;&#x505A;&#x201C;ftpuser&#x201D;&#x7684;Windows&#x7528;&#x6237;&#x3002;&#x6743;&#x9650;&#x65B9;&#x9762;&#xFF0C;&#x8BFB;&#x53D6;&#x548C;&#x5199;&#x5165;&#x90FD;&#x52FE;&#x9009;&#x3002;<br>
<img src="https://doctype-html.com/content/images/2017/09/ftp_6.png" alt="Windows Server 2012&#x4E0B;IIS8.0&#x914D;&#x7F6E;FTP&#x670D;&#x52A1;" loading="lazy"><br>
&#x8FD9;&#x6837;&#x6211;&#x4EEC;&#x5C31;&#x5B8C;&#x6210;&#x4E86;FTP&#x7AD9;&#x70B9;&#x7684;&#x6DFB;&#x52A0;&#x4E86;&#x3002;<br>
&#x4F46;&#x6211;&#x4EEC;&#x8FD8;&#x9700;&#x8981;&#x8BBE;&#x7F6E;&#x4E00;&#x4E0B;Windows&#x7528;&#x6237;&#x5BF9;ftp&#x76EE;&#x5F55;&#x7684;&#x8BBF;&#x95EE;&#x6743;&#x9650;&#xFF0C;&#x5426;&#x5219;&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#x975E;&#x7BA1;&#x7406;&#x5458;&#x5E10;&#x53F7;&#x201C;ftpuser&#x201D;&#x5BF9;&#x201C;c:\ftproot&#x201D;&#x76EE;&#x5F55;&#x662F;&#x6CA1;&#x6709;&#x5199;&#x5165;&#x6743;&#x9650;&#x7684;&#x3002;</p>
<h3 id>&#x914D;&#x7F6E;&#x7528;&#x6237;&#x6743;&#x9650;</h3>
<p>&#x5728;&#x201C;c:\ftproot&#x201D;&#x6587;&#x4EF6;&#x5939;&#x4E0A;&#x70B9;&#x51FB;&#x53F3;&#x952E;&#x9009;&#x62E9;&#x5C5E;&#x6027;-&#x70B9;&#x51FB;<strong>&#x5B89;&#x5168;</strong>&#x9009;&#x9879;&#x5361;&#x4E2D;&#x7684;<strong>&#x7F16;&#x8F91;</strong>-&#x5728;&#x65B0;&#x7A97;&#x53E3;&#x4E2D;&#x70B9;<strong>&#x6DFB;&#x52A0;</strong>&#x6309;&#x94AE;&#xFF1B;<br>
<img src="https://doctype-html.com/content/images/2017/09/ftp_user.png" alt="Windows Server 2012&#x4E0B;IIS8.0&#x914D;&#x7F6E;FTP&#x670D;&#x52A1;" loading="lazy"><br>
&#x8F93;&#x5165;Windows&#x7528;&#x6237;&#x540D;&#x3002;<br>
<img src="https://doctype-html.com/content/images/2017/09/ftp_user_2.png" alt="Windows Server 2012&#x4E0B;IIS8.0&#x914D;&#x7F6E;FTP&#x670D;&#x52A1;" loading="lazy"><br>
&#x52FE;&#x9009;<strong>&#x5B8C;&#x5168;&#x63A7;&#x5236;</strong>&#x9009;&#x9879;&#x3002;<br>
<img src="https://doctype-html.com/content/images/2017/09/ftp_user_3.png" alt="Windows Server 2012&#x4E0B;IIS8.0&#x914D;&#x7F6E;FTP&#x670D;&#x52A1;" loading="lazy"><br>
&#x8FD9;&#x6837;&#x201C;ftpsuer&#x201D;&#x4FBF;&#x62E5;&#x6709;&#x4E86;&#x8FD9;&#x4E2A;&#x76EE;&#x5F55;&#x7684;&#x5199;&#x5165;&#x6743;&#x9650;&#x3002;</p>
<h3 id="ftp">&#x5BA2;&#x6237;&#x7AEF;&#x8BBF;&#x95EE;FTP&#x7AD9;&#x70B9;</h3>
<p>&#x5982;&#x679C;&#x4E00;&#x5207;&#x987A;&#x5229;&#x7684;&#x8BDD;&#xFF0C;&#x73B0;&#x5728;&#x5C31;&#x53EF;&#x4EE5;&#x5728;<strong>&#x6587;&#x4EF6;&#x8D44;&#x6E90;&#x7BA1;&#x7406;&#x5668;</strong>&#x91CC;&#x9762;&#x8F93;&#x5165; <code>ftp://IP&#x5730;&#x5740;</code> &#x6765;&#x767B;&#x5F55;FTP&#x670D;&#x52A1;&#x5668;&#x4E86;&#xFF0C;&#x5982;&#x679C;&#x4F60;&#x6709;&#x57DF;&#x540D;&#x89E3;&#x6790;&#x5230;&#x670D;&#x52A1;&#x5668;ip&#x4E0A;&#x7684;&#x8BDD;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x8BBF;&#x95EE;<code>ftp://&#x57DF;&#x540D;</code>&#x6765;&#x767B;&#x5F55;&#x670D;&#x52A1;&#x5668;&#x3002;<br>
<img src="https://doctype-html.com/content/images/2017/09/ftp_connect.png" alt="Windows Server 2012&#x4E0B;IIS8.0&#x914D;&#x7F6E;FTP&#x670D;&#x52A1;" loading="lazy"><br>
&#x53EA;&#x9700;&#x8981;&#x8F93;&#x5165;&#x8BBE;&#x7F6E;&#x597D;&#x7684;Windows&#x7528;&#x6237;&#x540D;&#x548C;&#x5BC6;&#x7801;&#x5373;&#x53EF;&#x3002;<br>
<img src="https://doctype-html.com/content/images/2017/09/ftp_connect_2.png" alt="Windows Server 2012&#x4E0B;IIS8.0&#x914D;&#x7F6E;FTP&#x670D;&#x52A1;" loading="lazy"></p>
<h3 id>&#x9632;&#x706B;&#x5899;&#x8BBE;&#x7F6E;</h3>
<p>&#x5982;&#x679C;&#x51FA;&#x73B0;&#x4E86;&#x8FDE;&#x63A5;&#x4E0D;&#x4E0A;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x90A3;&#x4E48;&#x53EF;&#x80FD;&#x662F;&#x9632;&#x706B;&#x5899;&#x7684;&#x539F;&#x56E0;&#xFF0C;&#x53EF;&#x4EE5;&#x5C1D;&#x8BD5;&#x6682;&#x65F6;&#x5173;&#x95ED;&#x9632;&#x706B;&#x5899;&#x6D4B;&#x8BD5;&#x4E00;&#x4E0B;&#x662F;&#x5426;&#x80FD;&#x591F;&#x8FDE;&#x63A5;&#x3002;&#x5982;&#x679C;&#x662F;&#x9632;&#x706B;&#x5899;&#x7684;&#x539F;&#x56E0;&#xFF0C;&#x7F16;&#x8F91;&#x4E00;&#x4E0B;&#x9632;&#x706B;&#x5899;&#x89C4;&#x5219;&#x5373;&#x53EF;&#x3002;</p>
<p>(&#x8F6C;&#x8F7D;&#x8BF7;&#x6CE8;&#x660E;&#x51FA;&#x5904;&#x5E76;&#x4FDD;&#x7559;<a href="https://doctype-html.com/iis8-ftp/">&#x539F;&#x6587;&#x94FE;&#x63A5;</a>)</p>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>