<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>brucewar</title>
  
  <link href="/atom.xml" rel="self"/>
  
  <link href="http://brucewar.cn/"/>
  <updated>2020-05-19T14:25:28.870Z</updated>
  <id>http://brucewar.cn/</id>
  
  <author>
    <name>brucewar</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>使用requestAnimationFrame实现通知栏滚动</title>
    <link href="http://brucewar.cn/2020/05/19/%E4%BD%BF%E7%94%A8requestAnimationFrame%E5%AE%9E%E7%8E%B0%E9%80%9A%E7%9F%A5%E6%A0%8F%E6%BB%9A%E5%8A%A8/"/>
    <id>http://brucewar.cn/2020/05/19/使用requestAnimationFrame实现通知栏滚动/</id>
    <published>2020-05-19T14:21:33.000Z</published>
    <updated>2020-05-19T14:25:28.870Z</updated>
    
    <content type="html"><![CDATA[<h1 id="requestAnimationFrame&#x662F;&#x4EC0;&#x4E48;"><a href="#requestAnimationFrame&#x662F;&#x4EC0;&#x4E48;" class="headerlink" title="requestAnimationFrame&#x662F;&#x4EC0;&#x4E48;"></a>requestAnimationFrame&#x662F;&#x4EC0;&#x4E48;</h1><p><code>window.requestAnimationFrame()</code> &#x544A;&#x8BC9;&#x6D4F;&#x89C8;&#x5668;&#x2014;&#x2014;&#x4F60;&#x5E0C;&#x671B;&#x6267;&#x884C;&#x4E00;&#x4E2A;&#x52A8;&#x753B;&#xFF0C;&#x5E76;&#x4E14;&#x8981;&#x6C42;&#x6D4F;&#x89C8;&#x5668;&#x5728;&#x4E0B;&#x6B21;&#x91CD;&#x7ED8;&#x4E4B;&#x524D;&#x8C03;&#x7528;&#x6307;&#x5B9A;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x66F4;&#x65B0;&#x52A8;&#x753B;&#x3002;&#x8BE5;&#x65B9;&#x6CD5;&#x9700;&#x8981;&#x4F20;&#x5165;&#x4E00;&#x4E2A;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x4F5C;&#x4E3A;&#x53C2;&#x6570;&#xFF0C;&#x8BE5;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x4F1A;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x4E0B;&#x4E00;&#x6B21;&#x91CD;&#x7ED8;&#x4E4B;&#x524D;&#x6267;&#x884C;&#x3002;&#x5982;&#x679C;&#x60F3;&#x8BA9;&#x6D4F;&#x89C8;&#x5668;&#x5728;&#x4E0B;&#x4E00;&#x6B21;&#x91CD;&#x7ED8;&#x524D;&#x7EE7;&#x7EED;&#x66F4;&#x65B0;&#x4E0B;&#x4E00;&#x5E27;&#x52A8;&#x753B;&#xFF0C;&#x9700;&#x8981;&#x5728;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x4E2D;&#x518D;&#x6B21;&#x8C03;&#x7528;<code>window.requestAnimationFrame()</code>&#x3002;</p><p>&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x6267;&#x884C;&#x6B21;&#x6570;&#x901A;&#x5E38;&#x662F;&#x6BCF;&#x79D2;<strong>60</strong>&#x6B21;&#xFF0C;&#x4F46;&#x5728;&#x5927;&#x591A;&#x6570;&#x9075;&#x5FAA;W3C&#x5EFA;&#x8BAE;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#x4E2D;&#xFF0C;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x6267;&#x884C;&#x6B21;&#x6570;&#x901A;&#x5E38;&#x4E0E;&#x6D4F;&#x89C8;&#x5668;&#x5C4F;&#x5E55;&#x5237;&#x65B0;&#x6B21;&#x6570;&#x76F8;&#x5339;&#x914D;&#x3002;&#x4E3A;&#x4E86;&#x63D0;&#x9AD8;&#x6027;&#x80FD;&#x548C;&#x7535;&#x6C60;&#x5BFF;&#x547D;&#xFF0C;&#x56E0;&#x6B64;&#x5728;&#x5927;&#x591A;&#x6570;&#x6D4F;&#x89C8;&#x5668;&#x91CC;&#xFF0C;&#x5F53;<code>requestAnimationFrame()</code> &#x8FD0;&#x884C;&#x5728;&#x540E;&#x53F0;&#x6807;&#x7B7E;&#x9875;&#x6216;&#x8005;&#x9690;&#x85CF;&#x7684;<code>&lt;iframe&gt;</code> &#x91CC;&#x65F6;&#xFF0C;<code>requestAnimationFrame()</code> &#x4F1A;&#x88AB;&#x6682;&#x505C;&#x8C03;&#x7528;&#x4EE5;&#x63D0;&#x5347;&#x6027;&#x80FD;&#x548C;&#x7535;&#x6C60;&#x5BFF;&#x547D;&#x3002;</p><p>&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x6267;&#x884C;&#x65F6;&#xFF0C;&#x4F1A;&#x88AB;&#x4F20;&#x5165;&#x4E00;&#x4E2A;&#x65F6;&#x95F4;&#x6233;&#x53C2;&#x6570;&#xFF0C;&#x8868;&#x793A;&#x5F53;&#x524D;&#x6267;&#x884C;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x7684;&#x65F6;&#x523B;&#x3002;</p><h2 id="&#x5982;&#x4F55;&#x4F7F;&#x7528;"><a href="#&#x5982;&#x4F55;&#x4F7F;&#x7528;" class="headerlink" title="&#x5982;&#x4F55;&#x4F7F;&#x7528;"></a>&#x5982;&#x4F55;&#x4F7F;&#x7528;</h2><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> frameId = <span class="built_in">window</span>.requestAnimationFrame(callback)</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x505C;&#x6B62;&#x52A8;&#x753B;</span></span><br><span class="line"><span class="built_in">window</span>.cancelAnimationFrame()</span><br></pre></td></tr></table></figure><h2 id="&#x4F18;&#x7F3A;&#x70B9;"><a href="#&#x4F18;&#x7F3A;&#x70B9;" class="headerlink" title="&#x4F18;&#x7F3A;&#x70B9;"></a>&#x4F18;&#x7F3A;&#x70B9;</h2><p>&#x548C;<code>setTimeout(callback, 16)</code>&#x7C7B;&#x4F3C;&#xFF0C;&#x4F46;&#x53C8;&#x4E0D;&#x540C;&#xFF0C;<code>requestAnimationFrame</code>&#x662F;&#x901A;&#x8FC7;&#x6D4F;&#x89C8;&#x5668;&#x5237;&#x65B0;&#x9891;&#x7387;&#x51B3;&#x5B9A;&#x6267;&#x884C;&#x7684;&#x6700;&#x4F73;&#x65F6;&#x673A;&#xFF0C;&#x52A8;&#x753B;&#x4E0D;&#x4F1A;&#x51FA;&#x73B0;&#x5361;&#x987F;&#x73B0;&#x8C61;&#x3002;</p><ul><li>&#x4F18;&#x70B9;<ul><li>&#x52A8;&#x753B;&#x4FDD;&#x6301;60fps&#xFF08;&#x6BCF;&#x5E27;16ms&#xFF09;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x5185;&#x90E8;&#x51B3;&#x5B9A;&#x6E32;&#x67D3;&#x7684;&#x6700;&#x4F73;&#x65F6;&#x673A;</li><li>API&#x7B80;&#x6D01;&#x6807;&#x51C6;&#xFF0C;&#x7EF4;&#x62A4;&#x6210;&#x672C;&#x4F4E;</li></ul></li><li>&#x7F3A;&#x70B9;<ul><li>&#x52A8;&#x753B;&#x7684;&#x5F00;&#x59CB;/&#x53D6;&#x6D88;&#x9700;&#x8981;&#x5F00;&#x53D1;&#x8005;&#x81EA;&#x5DF1;&#x63A7;&#x5236;</li><li>&#x6D4F;&#x89C8;&#x5668;&#x6807;&#x7B7E;&#x672A;&#x6FC0;&#x6D3B;&#x65F6;&#xFF0C;&#x4E00;&#x5207;&#x90FD;&#x4E0D;&#x4F1A;&#x6267;&#x884C;</li><li>&#x8001;&#x7248;&#x672C;&#x6D4F;&#x89C8;&#x5668;&#x4E0D;&#x652F;&#x6301;IE9</li><li>Node.js&#x4E0D;&#x652F;&#x6301;&#xFF0C;&#x65E0;&#x6CD5;&#x7528;&#x5728;&#x670D;&#x52A1;&#x5668;&#x7684;&#x6587;&#x4EF6;&#x7CFB;&#x7EDF;&#x4E8B;&#x4EF6;</li></ul></li></ul><h1 id="&#x5B9E;&#x73B0;&#x6EDA;&#x52A8;&#x901A;&#x77E5;&#x680F;"><a href="#&#x5B9E;&#x73B0;&#x6EDA;&#x52A8;&#x901A;&#x77E5;&#x680F;" class="headerlink" title="&#x5B9E;&#x73B0;&#x6EDA;&#x52A8;&#x901A;&#x77E5;&#x680F;"></a>&#x5B9E;&#x73B0;&#x6EDA;&#x52A8;&#x901A;&#x77E5;&#x680F;</h1><p>&#x4EE5;&#x4E0B;&#x57FA;&#x4E8E;React&#x5B9E;&#x73B0;&#x4E86;&#x4E00;&#x4E2A;&#x6587;&#x5B57;&#x53EF;&#x6EDA;&#x52A8;&#x7684;&#x901A;&#x77E5;&#x680F;&#xFF1A;</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span>&#xA0;React,&#xA0;{&#xA0;Component&#xA0;}&#xA0;<span class="keyword">from</span>&#xA0;<span class="string">&apos;react&apos;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span>&#xA0;<span class="keyword">default</span>&#xA0;<span class="class"><span class="keyword">class</span>&#xA0;<span class="title">NoticeBar</span>&#xA0;<span class="keyword">extends</span>&#xA0;<span class="title">Component</span>&#xA0;</span>{</span><br><span class="line">&#xA0;&#xA0;<span class="keyword">constructor</span>&#xA0;(props)&#xA0;{</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="keyword">super</span>(props)</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="keyword">this</span>.state&#xA0;=&#xA0;{</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="attr">closed</span>:&#xA0;<span class="literal">false</span></span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;}</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="keyword">this</span>.marquee&#xA0;=&#xA0;<span class="literal">null</span></span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="keyword">this</span>.aFrameId&#xA0;=&#xA0;<span class="literal">null</span></span><br><span class="line">&#xA0;&#xA0;}</span><br><span class="line">&#xA0;&#xA0;componentDidMount&#xA0;()&#xA0;{</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="keyword">if</span>&#xA0;(<span class="built_in">window</span>.requestAnimationFrame&#xA0;&amp;&amp;&#xA0;<span class="keyword">this</span>.props.marqueeText)&#xA0;{</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="keyword">let</span>&#xA0;scrollWidth&#xA0;=&#xA0;<span class="keyword">this</span>.marquee.parentElement.offsetWidth</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="keyword">let</span>&#xA0;textWidth&#xA0;=&#xA0;<span class="keyword">this</span>.marquee.offsetWidth</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="keyword">let</span>&#xA0;right&#xA0;=&#xA0;<span class="number">0</span></span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="keyword">let</span>&#xA0;marquee&#xA0;=&#xA0;<span class="function"><span class="params">()</span>&#xA0;=&gt;</span>&#xA0;{</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;right++</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="keyword">if</span>&#xA0;(right&#xA0;&gt;=&#xA0;textWidth&#xA0;-&#xA0;scrollWidth&#xA0;+&#xA0;<span class="number">30</span>)&#xA0;{</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;right&#xA0;=&#xA0;<span class="number">0</span></span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="keyword">this</span>.marquee.style.right&#xA0;=&#xA0;right&#xA0;+&#xA0;<span class="string">&apos;px&apos;</span></span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="keyword">this</span>.aFrameId&#xA0;=&#xA0;<span class="built_in">window</span>.requestAnimationFrame(marquee)</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="keyword">if</span>(textWidth&#xA0;&gt;&#xA0;scrollWidth)&#xA0;<span class="keyword">this</span>.aFrameId&#xA0;=&#xA0;<span class="built_in">window</span>.requestAnimationFrame(marquee)</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;}</span><br><span class="line">  }</span><br><span class="line">&#xA0;&#xA0;componentWillUnmount&#xA0;()&#xA0;{</span><br><span class="line">    <span class="comment">// &#x4E3A;&#x4E86;&#x63D0;&#x9AD8;&#x6027;&#x80FD;&#xFF0C;&#x7EC4;&#x4EF6;&#x5378;&#x8F7D;&#x524D;&#xFF0C;&#x8BB0;&#x5F97;&#x505C;&#x6B62;&#x52A8;&#x753B;</span></span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="built_in">window</span>.cancelAnimationFrame(<span class="keyword">this</span>.aFrameId)</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="keyword">this</span>.aFrameId&#xA0;=&#xA0;<span class="literal">null</span></span><br><span class="line">&#xA0;&#xA0;}</span><br><span class="line">&#xA0;&#xA0;onClose&#xA0;=&#xA0;<span class="function"><span class="params">()</span>&#xA0;=&gt;</span>&#xA0;{</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="keyword">if</span>&#xA0;(<span class="keyword">this</span>.aFrameId)&#xA0;{</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="built_in">window</span>.cancelAnimationFrame(<span class="keyword">this</span>.aFrameId)</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="keyword">this</span>.aFrameId&#xA0;=&#xA0;<span class="literal">null</span></span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;}</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="keyword">this</span>.setState({&#xA0;<span class="attr">closed</span>:&#xA0;<span class="literal">true</span>&#xA0;})</span><br><span class="line">&#xA0;&#xA0;}</span><br><span class="line">&#xA0;&#xA0;render&#xA0;()&#xA0;{</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="keyword">const</span>&#xA0;{&#xA0;mode,&#xA0;marqueeText,&#xA0;onClick,&#xA0;children&#xA0;}&#xA0;=&#xA0;<span class="keyword">this</span>.props</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="keyword">const</span>&#xA0;{&#xA0;onClose&#xA0;}&#xA0;=&#xA0;<span class="keyword">this</span></span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="keyword">const</span>&#xA0;{&#xA0;closed&#xA0;}&#xA0;=&#xA0;<span class="keyword">this</span>.state</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="keyword">if</span>&#xA0;(closed)&#xA0;<span class="keyword">return</span>&#xA0;<span class="literal">null</span></span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="keyword">return</span>&#xA0;(</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="xml"><span class="tag">&lt;<span class="name">div</span>&#xA0;<span class="attr">className</span>=<span class="string">&quot;notice-bar&quot;</span>&gt;</span></span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="tag">&lt;<span class="name">div</span>&#xA0;<span class="attr">className</span>=<span class="string">&quot;notice-bar-icon&quot;</span>/&gt;</span></span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="tag">&lt;<span class="name">div</span>&#xA0;<span class="attr">className</span>=<span class="string">&quot;notice-bar-content&quot;</span>&gt;</span></span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;{!!children&#xA0;&amp;&amp;&#xA0;children}</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;{</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;!!marqueeText&#xA0;&amp;&amp;&#xA0;!children&#xA0;&amp;&amp;&#xA0;(</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="tag">&lt;<span class="name">div</span>&#xA0;<span class="attr">className</span>=<span class="string">&quot;notice-bar-marquee-wrap&quot;</span>&gt;</span></span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="tag">&lt;<span class="name">div</span>&#xA0;<span class="attr">className</span>=<span class="string">&quot;notice-bar-marquee&quot;</span>&#xA0;<span class="attr">ref</span>=<span class="string">{ele</span>&#xA0;=&gt;</span>&#xA0;this.marquee&#xA0;=&#xA0;ele}&gt;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;{marqueeText}</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;)</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;{</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;mode&#xA0;===&#xA0;&apos;link&apos;&#xA0;&amp;&amp;&#xA0;(</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="tag">&lt;<span class="name">div</span>&#xA0;<span class="attr">className</span>=<span class="string">&quot;notice-bar-operation&quot;</span>&#xA0;<span class="attr">onClick</span>=<span class="string">{onClick}</span>&gt;</span></span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="tag">&lt;<span class="name">i</span>&#xA0;<span class="attr">className</span>=<span class="string">&quot;icon-link&quot;</span>/&gt;</span></span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;)</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;{</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;mode&#xA0;===&#xA0;&apos;closable&apos;&#xA0;&amp;&amp;&#xA0;(</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="tag">&lt;<span class="name">div</span>&#xA0;<span class="attr">className</span>=<span class="string">&quot;notice-bar-operation&quot;</span>&#xA0;<span class="attr">onClick</span>=<span class="string">{onClose}</span>&gt;</span></span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="tag">&lt;<span class="name">i</span>&#xA0;<span class="attr">className</span>=<span class="string">&quot;icon-close&quot;</span>/&gt;</span></span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;)</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;)</span><br><span class="line">&#xA0;&#xA0;}</span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight scss"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.notice-bar</span>{</span><br><span class="line">&#xA0;&#xA0;<span class="attribute">width</span>:&#xA0;<span class="number">100%</span>;</span><br><span class="line">&#xA0;&#xA0;<span class="attribute">height</span>:&#xA0;<span class="number">30px</span>;</span><br><span class="line">&#xA0;&#xA0;<span class="attribute">border-radius</span>:&#xA0;<span class="number">6px</span>;</span><br><span class="line">&#xA0;&#xA0;<span class="attribute">background</span>:&#xA0;<span class="number">#ffe37e</span>;</span><br><span class="line">&#xA0;&#xA0;<span class="attribute">font-size</span>:&#xA0;<span class="number">12px</span>;</span><br><span class="line">&#xA0;&#xA0;<span class="attribute">color</span>:&#xA0;<span class="number">#222</span>;</span><br><span class="line">&#xA0;&#xA0;<span class="attribute">display</span>:&#xA0;flex;</span><br><span class="line">&#xA0;&#xA0;<span class="attribute">align-items</span>:&#xA0;center;</span><br><span class="line">&#xA0;&#xA0;<span class="attribute">padding</span>:&#xA0;<span class="number">0</span>&#xA0;<span class="number">0</span>&#xA0;<span class="number">0</span>&#xA0;<span class="number">9px</span>;</span><br><span class="line">&#xA0;&#xA0;&amp;&#xA0;&gt;&#xA0;<span class="selector-class">.notice-bar-icon</span>{</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">background</span>:&#xA0;url(<span class="string">&quot;../img/notice-bar-icon.png&quot;</span>)&#xA0;center&#xA0;no-repeat;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">background-size</span>:&#xA0;<span class="number">100%</span>;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">width</span>:&#xA0;<span class="number">9px</span>;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">height</span>:&#xA0;<span class="number">9px</span>;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">margin-right</span>:&#xA0;<span class="number">6px</span>;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">flex-shrink</span>:&#xA0;<span class="number">0</span>;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">flex-grow</span>:&#xA0;<span class="number">0</span>;</span><br><span class="line">&#xA0;&#xA0;}</span><br><span class="line">&#xA0;&#xA0;&amp;&#xA0;&gt;&#xA0;<span class="selector-class">.notice-bar-content</span>{</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">margin-right</span>:&#xA0;<span class="number">12px</span>;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">white-space</span>:&#xA0;nowrap;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">overflow</span>:&#xA0;hidden;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">text-overflow</span>:&#xA0;ellipsis;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">flex</span>:&#xA0;<span class="number">1</span>;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&amp;&#xA0;<span class="selector-class">.notice-bar-marquee-wrap</span>{</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">overflow</span>:&#xA0;hidden;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&amp;&#xA0;<span class="selector-class">.notice-bar-marquee</span>{</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">white-space</span>:&#xA0;nowrap;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">display</span>:&#xA0;inline-block;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">position</span>:&#xA0;relative;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;}</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;}</span><br><span class="line">&#xA0;&#xA0;}</span><br><span class="line">&#xA0;&#xA0;&amp;&#xA0;&gt;&#xA0;<span class="selector-class">.notice-bar-operation</span>{</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">height</span>:&#xA0;<span class="number">100%</span>;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">display</span>:&#xA0;flex;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&amp;&#xA0;<span class="selector-class">.icon-close</span>{</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">background</span>:&#xA0;url(<span class="string">&quot;../img/notice-bar-close.png&quot;</span>)&#xA0;center&#xA0;no-repeat;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">background-size</span>:&#xA0;<span class="number">100%</span>;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">width</span>:&#xA0;<span class="number">12px</span>;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">height</span>:&#xA0;<span class="number">12px</span>;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">display</span>:&#xA0;block;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">align-self</span>:&#xA0;flex-start;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">flex-shrink</span>:&#xA0;<span class="number">0</span>;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">flex-grow</span>:&#xA0;<span class="number">0</span>;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;}</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&amp;&#xA0;<span class="selector-class">.icon-link</span>{</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">background</span>:&#xA0;url(<span class="string">&quot;../img/notice-bar-link.png&quot;</span>)&#xA0;center&#xA0;no-repeat;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">background-size</span>:&#xA0;<span class="number">100%</span>;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">width</span>:&#xA0;<span class="number">12px</span>;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">height</span>:&#xA0;<span class="number">12px</span>;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">display</span>:&#xA0;block;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">align-self</span>:&#xA0;center;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">flex-shrink</span>:&#xA0;<span class="number">0</span>;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">flex-grow</span>:&#xA0;<span class="number">0</span>;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;<span class="attribute">margin-right</span>:&#xA0;<span class="number">12px</span>;</span><br><span class="line">&#xA0;&#xA0;&#xA0;&#xA0;}</span><br><span class="line">&#xA0;&#xA0;}</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;requestAnimationFrame&amp;#x662F;&amp;#x4EC0;&amp;#x4E48;&quot;&gt;&lt;a href=&quot;#requestAnimationFrame&amp;#x662F;&amp;#x4EC0;&amp;#x4E48;&quot; class=&quot;headerlink&quot; title=&quot;re
    
    </summary>
    
      <category term="Web前端" scheme="http://brucewar.cn/categories/Web%E5%89%8D%E7%AB%AF/"/>
    
    
      <category term="React" scheme="http://brucewar.cn/tags/React/"/>
    
      <category term="requestAnimationFrame" scheme="http://brucewar.cn/tags/requestAnimationFrame/"/>
    
  </entry>
  
  <entry>
    <title>什么是thunk？</title>
    <link href="http://brucewar.cn/2019/05/07/%E4%BB%80%E4%B9%88%E6%98%AFthunk%EF%BC%9F/"/>
    <id>http://brucewar.cn/2019/05/07/什么是thunk？/</id>
    <published>2019-05-07T06:40:53.000Z</published>
    <updated>2020-05-19T14:25:05.379Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>&#x95EE;&#xFF1A;&#x4EC0;&#x4E48;&#x662F;<code>thunk</code>&#xFF1F;<br>&#x7B54;&#xFF1A;&#x7B2C;&#x4E00;&#x6B21;&#x542C;&#x5230;&#x8FD9;&#x4E2A;&#x8BCD;&#x662F;&#x901A;&#x8FC7;<code>redux-thunk</code></p></blockquote><p>&#x8A00;&#x5F52;&#x6B63;&#x4F20;&#xFF0C;&#x5F53;&#x7B2C;&#x4E00;&#x6B21;&#x542C;&#x5230;Redux Thunk&#x65F6;&#xFF0C;&#x4EE4;&#x4EBA;&#x975E;&#x5E38;&#x56F0;&#x60D1;&#x3002;&#x5F88;&#x53EF;&#x80FD;&#x5C31;&#x662F;&#x56E0;&#x4E3A;<code>thunk</code>&#x8FD9;&#x4E2A;&#x8BCD;&#x3002;&#x6240;&#x4EE5;&#x6211;&#x4EEC;&#x9996;&#x5148;&#x8981;&#x5F04;&#x6E05;&#x695A;&#x8FD9;&#x4E00;&#x70B9;&#x3002;</p><h3 id="thunk"><a href="#thunk" class="headerlink" title="thunk"></a>thunk</h3><p><code>thunk</code>&#x662F;&#x51FD;&#x6570;&#x7684;&#x53E6;&#x4E00;&#x4E2A;&#x8BCD;&#xFF0C;&#x4F46;&#x5B83;&#x4E0D;&#x4EC5;&#x4EC5;&#x53EA;&#x662F;&#x6211;&#x4EEC;&#x6240;&#x8BA4;&#x8BC6;&#x7684;&#x51FD;&#x6570;&#x3002;&#x5B83;&#x662F;&#x53E6;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#x8FD4;&#x56DE;&#x7684;&#x4E00;&#x4E2A;&#x7279;&#x6B8A;&#x7684;&#x51FD;&#x6570;&#x3002;&#x5982;&#x4E0B;&#x6240;&#x793A;&#xFF1A;<br></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">wrapper_function</span>(<span class="params"></span>) </span>{</span><br><span class="line">  <span class="comment">// &#x8FD9;&#x5C31;&#x662F;thunk&#xFF0C;&#x56E0;&#x4E3A;&#x5B83;&#x628A;&#x4E00;&#x4E9B;&#x4EFB;&#x52A1;&#x63A8;&#x8FDF;&#x505A;</span></span><br><span class="line">  <span class="keyword">return</span> <span class="function"><span class="keyword">function</span> <span class="title">thunk</span>(<span class="params"></span>) </span>{</span><br><span class="line">    <span class="built_in">console</span>.log(<span class="string">&apos;do stuff now&apos;</span>);</span><br><span class="line">  };</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p></p><p>&#x4F60;&#x53EF;&#x80FD;&#x5DF2;&#x7ECF;&#x89C1;&#x8FC7;&#x8FD9;&#x6837;&#x7684;&#x4EE3;&#x7801;&#xFF0C;&#x53EA;&#x662F;&#x4F60;&#x4E0D;&#x628A;&#x5B83;&#x53EB;&#x505A;<code>thunk</code>&#x3002;&#x5982;&#x679C;&#x60F3;&#x8981;&#x6267;&#x884C;&#x201C;do stuff now&#x201D;&#x90E8;&#x5206;&#xFF0C;&#x4F60;&#x5FC5;&#x987B;&#x8C03;&#x7528;&#x4E24;&#x6B21;<code>wrapper_function()()</code>&#x3002;</p><h3 id="redux-thunk"><a href="#redux-thunk" class="headerlink" title="redux-thunk"></a>redux-thunk</h3><p>&#x90A3;&#x4E48;&#x5982;&#x4F55;&#x5E94;&#x7528;&#x5728;Redux&#x3002;<br>&#x5982;&#x679C;&#x719F;&#x6089;Redux&#xFF0C;&#x4E0B;&#x9762;&#x8FD9;&#x4E9B;&#x6982;&#x5FF5;&#x5BF9;&#x4F60;&#x6765;&#x8BF4;&#x5E94;&#x8BE5;&#x4E0D;&#x964C;&#x751F;&#xFF1A;<strong>actions</strong>&#xFF0C;<strong>action creators</strong>&#xFF0C;<strong>reducers</strong>&#x548C;<strong>middleware</strong>&#x3002;&#x5982;&#x679C;&#x4E0D;&#x719F;&#x6089;&#x7684;&#x8BDD;&#xFF0C;&#x5EFA;&#x8BAE;&#x5148;&#x770B;&#x4E0B;<a href="https://redux.js.org/introduction/getting-started" target="_blank" rel="external">Redux&#x57FA;&#x7840;&#x6559;&#x7A0B;</a>&#x3002;</p><p>&#x5728;Redux&#x4E2D;&#xFF0C;<strong>actions</strong>&#x53EA;&#x662F;&#x4E00;&#x4E2A;&#x666E;&#x901A;&#x7684;JavaScript&#x5BF9;&#x8C61;&#xFF0C;&#x5E76;&#x4E14;&#x8FD9;&#x4E2A;&#x5BF9;&#x8C61;&#x4E2D;&#x5305;&#x542B;<code>type</code>&#x5C5E;&#x6027;&#x3002;&#x9664;&#x6B64;&#x4E4B;&#x5916;&#xFF0C;&#x53EF;&#x4EE5;&#x5305;&#x542B;&#x4EFB;&#x4F55;&#x4F60;&#x60F3;&#x8981;&#x7684;&#x2014;&#x2014;&#x63CF;&#x8FF0;&#x8981;&#x6267;&#x884C;&#x7684;action&#x3002;<br></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 1. &#x666E;&#x901A;&#x5BF9;&#x8C61;</span></span><br><span class="line"><span class="comment">// 2. &#x6709;type&#x5C5E;&#x6027;</span></span><br><span class="line"><span class="comment">// 3. &#x5176;&#x4ED6;&#x4EFB;&#x610F;&#x5185;&#x5BB9;</span></span><br><span class="line">{</span><br><span class="line">  <span class="attr">type</span>: <span class="string">&apos;USER_LOGGED_IN&apos;</span>,</span><br><span class="line">  <span class="attr">username</span>: <span class="string">&apos;dave&apos;</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><p></p><p>&#x56E0;&#x4E3A;&#x4E00;&#x76F4;&#x624B;&#x5DE5;&#x7F16;&#x5199;&#x8FD9;&#x4E9B;&#x5BF9;&#x8C61;&#x5F88;&#x70E6;&#x4EBA;&#xFF08;&#x66F4;&#x522B;&#x8BF4;&#x5BB9;&#x6613;&#x51FA;&#x9519;&#xFF09;&#xFF0C;Redux&#x901A;&#x8FC7;&#x201C;action creators&#x201D;&#x8FD9;&#x4E2A;&#x6982;&#x5FF5;&#x89E3;&#x51B3;&#xFF1A;<br></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">userLoggedIn</span>(<span class="params"></span>) </span>{</span><br><span class="line">  <span class="keyword">return</span> {</span><br><span class="line">    <span class="attr">type</span>: <span class="string">&apos;USER_LOGGED_IN&apos;</span>,</span><br><span class="line">    <span class="attr">username</span>: <span class="string">&apos;dave&apos;</span></span><br><span class="line">  };</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p></p><p>&#x4E24;&#x4E2A;&#x5B8C;&#x5168;&#x76F8;&#x540C;&#x7684;<strong>action</strong>&#xFF0C;&#x53EA;&#x662F;&#x73B0;&#x5728;&#x62BD;&#x8C61;&#x4E86;&#x4E00;&#x5C42;&#xFF0C;&#x4F60;&#x9700;&#x8981;&#x901A;&#x8FC7;&#x8C03;&#x7528;<code>userLoggedIn</code>&#x51FD;&#x6570;&#x521B;&#x5EFA;&#x3002;&#x5982;&#x679C;&#x60F3;&#x5728;&#x5E94;&#x7528;&#x7684;&#x4E0D;&#x540C;&#x4F4D;&#x7F6E;&#x89E6;&#x53D1;&#x540C;&#x6837;&#x7684;<strong>action</strong>&#xFF0C;&#x53EF;&#x4EE5;&#x5F88;&#x65B9;&#x4FBF;&#x7684;&#x4F7F;&#x7528;<strong>action creator</strong>&#x3002;</p><h3 id="&#x70E6;&#x4EBA;&#x7684;Actions"><a href="#&#x70E6;&#x4EBA;&#x7684;Actions" class="headerlink" title="&#x70E6;&#x4EBA;&#x7684;Actions"></a>&#x70E6;&#x4EBA;&#x7684;Actions</h3><p>Redux&#x6240;&#x8C13;&#x7684;&#x201C;actions&#x201D;&#x5176;&#x5B9E;&#x5E76;&#x6CA1;&#x505A;&#x4EFB;&#x4F55;&#x4E8B;&#xFF0C;&#x5B83;&#x4EEC;&#x53EA;&#x662F;&#x666E;&#x901A;&#x7684;&#x5BF9;&#x8C61;&#x3002;&#x5982;&#x679C;&#x8BA9;&#x4ED6;&#x4EEC;&#x505A;&#x70B9;&#x4E8B;&#x5C82;&#x4E0D;&#x662F;&#x66F4;&#x9177;&#xFF1F;&#x6BD4;&#x5982;&#x8BF4;&#xFF0C;API&#x8C03;&#x7528;&#x6216;&#x8005;&#x89E6;&#x53D1;&#x522B;&#x7684;<strong>actions</strong>&#xFF1F;<br>&#x56E0;&#x4E3A;<strong>reducers</strong>&#x5E94;&#x8BE5;&#x662F;&#x7EAF;&#x51FD;&#x6570;&#xFF0C;&#x4E0D;&#x4F1A;&#x6539;&#x53D8;&#x5176;&#x4F5C;&#x7528;&#x57DF;&#x8303;&#x56F4;&#x4E4B;&#x5916;&#x7684;&#x4EFB;&#x4F55;&#x4E1C;&#x897F;&#xFF0C;&#x6240;&#x4EE5;&#x6211;&#x4EEC;&#x4E0D;&#x80FD;&#x5728;&#x5176;&#x5185;&#x90E8;&#x505A;API&#x8C03;&#x7528;&#x6216;&#x8005;&#x89E6;&#x53D1;<strong>actions</strong>&#x3002;<br>&#x5982;&#x679C;&#x4F60;&#x5E0C;&#x671B;<strong>action</strong>&#x6267;&#x884C;&#x67D0;&#x4E9B;&#x64CD;&#x4F5C;&#xFF0C;&#x5219;&#x8FD9;&#x90E8;&#x5206;&#x4EE3;&#x7801;&#x5B58;&#x5728;&#x67D0;&#x4E2A;&#x51FD;&#x6570;&#x3002;&#x8FD9;&#x4E2A;&#x51FD;&#x6570;&#xFF08;<strong>thunk</strong>&#xFF09;&#x5C31;&#x662F;&#x8FD9;&#x4E00;&#x7CFB;&#x5217;&#x64CD;&#x4F5C;&#x3002;<br>&#x5982;&#x679C;<strong>action creator</strong>&#x80FD;&#x591F;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#xFF08;&#x4E00;&#x7CFB;&#x5217;&#x7684;&#x64CD;&#x4F5C;&#xFF09;&#x800C;&#x4E0D;&#x662F;&#x4E00;&#x4E2A;<strong>action</strong>&#x5BF9;&#x8C61;&#x5C82;&#x4E0D;&#x662F;&#x66F4;&#x597D;&#xFF0C;&#x5C31;&#x50CF;&#x4E0B;&#x9762;&#x8FD9;&#x6837;&#xFF1A;<br></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">getUser</span>(<span class="params"></span>) </span>{</span><br><span class="line">  <span class="keyword">return</span> <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>{</span><br><span class="line">    <span class="keyword">return</span> axios.get(<span class="string">&apos;/current_user&apos;</span>);</span><br><span class="line">  };</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p></p><p>&#x5982;&#x679C;&#x6709;&#x4E00;&#x79CD;&#x65B9;&#x6CD5;&#x53EF;&#x4EE5;&#x544A;&#x8BC9;Redux&#x628A;&#x51FD;&#x6570;&#x5F53;&#x4F5C;<strong>actions</strong>&#x5904;&#x7406;&#x3002;<br>&#x5F53;&#x7136;&#xFF0C;&#x8FD9;&#x6B63;&#x662F;<strong>redux-thunk</strong>&#x505A;&#x7684;&#xFF1A;&#x5B83;&#x662F;&#x4E00;&#x4E2A;<strong>middleware</strong>&#xFF0C;&#x7CFB;&#x7EDF;&#x4E2D;&#x6240;&#x6709;&#x7684;action&#x90FD;&#x4F1A;&#x7ECF;&#x8FC7;&#x5B83;&#xFF0C;&#x5982;&#x679C;action&#x662F;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#xFF0C;&#x5C31;&#x4F1A;&#x8C03;&#x7528;&#x90A3;&#x4E2A;&#x51FD;&#x6570;&#x3002;<br>&#x4E0A;&#x9762;&#x90A3;&#x4E00;&#x5C0F;&#x6BB5;&#x4EE3;&#x7801;&#x4E2D;&#x9057;&#x6F0F;&#x4E86;&#x4E00;&#x4E9B;&#x4E1C;&#x897F;&#xFF0C;&#x90A3;&#x5C31;&#x662F;Redux&#x4F1A;&#x4F20;&#x9012;&#x4E24;&#x4E2A;&#x53C2;&#x6570;&#x7ED9;thunk&#x51FD;&#x6570;&#xFF1A;</p><ul><li><code>dispatch</code>&#xFF1A;&#x53EF;&#x4EE5;&#x7528;&#x6765;&#x89E6;&#x53D1;&#x65B0;&#x7684;action</li><li><code>getState</code>&#xFF1A;&#x8BBF;&#x95EE;&#x5F53;&#x524D;&#x7684;state<figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">logOutUser</span>(<span class="params"></span>) </span>{</span><br><span class="line">  <span class="keyword">return</span> <span class="function"><span class="keyword">function</span>(<span class="params">dispatch, getState</span>) </span>{</span><br><span class="line">    <span class="keyword">return</span> axios.post(<span class="string">&apos;/logout&apos;</span>).then(<span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>{</span><br><span class="line">      <span class="comment">// &#x5047;&#x8BBE;&#x6211;&#x4EEC;&#x58F0;&#x660E;&#x4E86;&#x4E00;&#x4E2A;&#x53EB; userLoggedOut &#x7684; action creator&#xFF0C;&#x73B0;&#x5728;&#x6211;&#x4EEC;&#x89E6;&#x53D1;&#x5B83;</span></span><br><span class="line">      dispatch(userLoggedOut());</span><br><span class="line">    });</span><br><span class="line">  }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li></ul><p>&#x4F9D;&#x8D56;&#x5F53;&#x524D;state&#xFF0C;<code>getState</code>&#x51FD;&#x6570;&#x5728;&#x51B3;&#x5B9A;&#x662F;&#x5426;&#x83B7;&#x53D6;&#x6570;&#x636E;&#x8FD8;&#x662F;&#x8FD4;&#x56DE;&#x7F13;&#x5B58;&#x6570;&#x636E;&#x65F6;&#x975E;&#x5E38;&#x6709;&#x7528;&#x3002;</p><h3 id="&#x786E;&#x5B9E;&#x975E;&#x5E38;&#x5C0F;&#x7684;&#x5E93;"><a href="#&#x786E;&#x5B9E;&#x975E;&#x5E38;&#x5C0F;&#x7684;&#x5E93;" class="headerlink" title="&#x786E;&#x5B9E;&#x975E;&#x5E38;&#x5C0F;&#x7684;&#x5E93;"></a>&#x786E;&#x5B9E;&#x975E;&#x5E38;&#x5C0F;&#x7684;&#x5E93;</h3><p><strong>redux-thunk</strong>&#x5E93;&#x7684;&#x6240;&#x6709;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#xFF1A;<br></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">createThunkMiddleware</span>(<span class="params">extraArgument</span>) </span>{</span><br><span class="line">  <span class="keyword">return</span> <span class="function">(<span class="params">{ dispatch, getState }</span>) =&gt;</span> <span class="function"><span class="params">next</span> =&gt;</span> <span class="function"><span class="params">action</span> =&gt;</span> {</span><br><span class="line">    <span class="comment">// &#x89E6;&#x53D1;&#x6BCF;&#x4E2A;action&#x8FD9;&#x91CC;&#x90FD;&#x4F1A;&#x88AB;&#x8C03;&#x7528;</span></span><br><span class="line">    <span class="comment">// &#x5982;&#x679C;&#x662F;&#x51FD;&#x6570;&#x5C31;&#x8C03;&#x7528;&#x5B83;</span></span><br><span class="line">    <span class="keyword">if</span> (<span class="keyword">typeof</span> action === <span class="string">&apos;function&apos;</span>) {</span><br><span class="line">      <span class="keyword">return</span> action(dispatch, getState, extraArgument);</span><br><span class="line">    }</span><br><span class="line">    </span><br><span class="line">    <span class="comment">// &#x5426;&#x5219;&#x7EE7;&#x7EED;&#x6309;&#x6B63;&#x5E38;&#x5904;&#x7406;</span></span><br><span class="line">    <span class="keyword">return</span> next(action);</span><br><span class="line">  };</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> thunk = createThunkMiddleware();</span><br><span class="line">thunk.withExtraArgument = createThunkMiddleware;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> thunk;</span><br></pre></td></tr></table></figure><p></p><p>&#x5982;&#x679C;&#x9879;&#x76EE;&#x4E2D;&#x5B89;&#x88C5;&#x4E86;redux-thunk&#xFF0C;&#x5E76;&#x4E14;&#x628A;&#x5B83;&#x5F53;&#x6210;&#x4E2D;&#x95F4;&#x4EF6;&#xFF0C;&#x89E6;&#x53D1;&#x7684;&#x6BCF;&#x4E2A;action&#x90FD;&#x4F1A;&#x8FDB;&#x5165;&#x8FD9;&#x90E8;&#x5206;&#x4EE3;&#x7801;&#x3002;&#x5982;&#x679C;action&#x662F;&#x51FD;&#x6570;&#x5C31;&#x8C03;&#x7528;&#x90A3;&#x4E2A;&#x51FD;&#x6570;&#xFF08;&#x4E0D;&#x7BA1;&#x51FD;&#x6570;&#x8FD4;&#x56DE;&#x4EC0;&#x4E48;&#xFF09;&#xFF0C;&#x5426;&#x5219;&#x5C06;&#x5B83;&#x4F20;&#x9012;&#x7ED9;&#x4E0B;&#x4E00;&#x4E2A;&#x4E2D;&#x95F4;&#x4EF6;&#xFF0C;&#x6700;&#x7EC8;&#x4F1A;&#x4EA4;&#x7ED9;Redux&#xFF08;<code>netx(action)</code>&#x5B8C;&#x6210;&#x8FD9;&#x90E8;&#x5206;&#x5DE5;&#x4F5C;&#xFF09;&#x3002;</p><h3 id="&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;redux-thunk"><a href="#&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;redux-thunk" class="headerlink" title="&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;redux-thunk"></a>&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;redux-thunk</h3><p>&#x5982;&#x679C;&#x9879;&#x76EE;&#x4E2D;&#x5DF2;&#x7ECF;&#x5B89;&#x88C5;&#x4E86;Redux&#xFF0C;&#x53EA;&#x9700;&#x4E24;&#x6B65;&#x5C31;&#x53EF;&#x6DFB;&#x52A0;redux-thunk&#x3002;<br>&#x9996;&#x5148;&#xFF0C;&#x5B89;&#x88C5;&#x5305;&#xFF1A;<br></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install --save redux-thunk</span><br></pre></td></tr></table></figure><p></p><p>&#x7136;&#x540E;&#x5728;&#x4F7F;&#x7528;redux&#x7684;&#x4EE3;&#x7801;&#x90E8;&#x5206;&#xFF0C;&#x5F15;&#x5165;<code>redux-thunk</code>&#x4E2D;&#x95F4;&#x4EF6;&#xFF0C;&#x6DFB;&#x52A0;&#x5230;Redux&#x4E2D;&#x3002;<br></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x4F60;&#x53EF;&#x4EE5;&#x5DF2;&#x7ECF;&#x5F15;&#x5165;&#x4E86;createStore&#xFF0C;&#x8FD8;&#x9700;&#x8981;&#x5F15;&#x5165;applyMiddleware</span></span><br><span class="line"><span class="keyword">import</span> { createStore, applyMiddleware } <span class="keyword">from</span> <span class="string">&apos;redux&apos;</span>;</span><br><span class="line"><span class="comment">// &#x5F15;&#x5165;`thunk` &#x4E2D;&#x95F4;&#x4EF6;</span></span><br><span class="line"><span class="keyword">import</span> thunk <span class="keyword">from</span> <span class="string">&apos;redux-thunk&apos;</span>;</span><br><span class="line"><span class="keyword">import</span> rootReducer <span class="keyword">from</span> <span class="string">&apos;./reducers/index&apos;</span>;</span><br><span class="line"><span class="comment">// &#x4F7F;&#x7528;applyMiddleware&#x521B;&#x5EFA;thunk&#x4E2D;&#x95F4;&#x4EF6;</span></span><br><span class="line"><span class="keyword">const</span> store = createStore(</span><br><span class="line">  rootReducer,</span><br><span class="line">  applyMiddleware(thunk)</span><br><span class="line">);</span><br></pre></td></tr></table></figure><p></p><p>&#x786E;&#x4FDD;<code>thunk</code>&#x4F5C;&#x4E3A;<code>applyMiddleware</code>&#x53C2;&#x6570;&#x8C03;&#x7528;&#xFF0C;&#x5426;&#x5219;&#x4E0D;&#x8D77;&#x4F5C;&#x7528;&#x3002;&#x8FD9;&#x6837;&#x4F60;&#x5DF2;&#x7ECF;&#x5B8C;&#x6210;&#x4E86;&#x6240;&#x6709;&#x8BBE;&#x7F6E;&#xFF0C;&#x73B0;&#x5728;&#x53EF;&#x4EE5;dispatch&#x4EFB;&#x4F55;&#x51FD;&#x6570;&#x3002;</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;&lt;p&gt;&amp;#x95EE;&amp;#xFF1A;&amp;#x4EC0;&amp;#x4E48;&amp;#x662F;&lt;code&gt;thunk&lt;/code&gt;&amp;#xFF1F;&lt;br&gt;&amp;#x7B54;&amp;#xFF1A;&amp;#x7B2C;&amp;#x4E00;&amp;#x6B21;&amp;#x542C;&amp;#x5230
    
    </summary>
    
      <category term="React" scheme="http://brucewar.cn/categories/React/"/>
    
    
      <category term="React" scheme="http://brucewar.cn/tags/React/"/>
    
      <category term="redux" scheme="http://brucewar.cn/tags/redux/"/>
    
      <category term="redux-thunk" scheme="http://brucewar.cn/tags/redux-thunk/"/>
    
      <category term="thunk" scheme="http://brucewar.cn/tags/thunk/"/>
    
  </entry>
  
  <entry>
    <title>2017：清白之年</title>
    <link href="http://brucewar.cn/2017/12/30/2017%EF%BC%9A%E6%B8%85%E7%99%BD%E4%B9%8B%E5%B9%B4/"/>
    <id>http://brucewar.cn/2017/12/30/2017：清白之年/</id>
    <published>2017-12-30T07:51:37.000Z</published>
    <updated>2017-12-30T08:03:42.467Z</updated>
    
    <content type="html"><![CDATA[<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width="330" height="86" src="//music.163.com/outchain/player?type=2&amp;id=487590187&amp;auto=1&amp;height=66"></iframe><p>&#x8F6C;&#x773C;&#x53C8;&#x5230;&#x4E86;&#x5E74;&#x7EC8;&#xFF0C;&#x6211;&#x539F;&#x672C;&#x4E0D;&#x60F3;&#x5199;&#x4ECA;&#x5E74;&#x7684;&#x603B;&#x7ED3;&#xFF0C;&#x56E0;&#x4E3A;&#x4E0D;&#x60F3;&#x8BA9;&#x81EA;&#x5DF1;&#x5185;&#x5FC3;&#x518D;&#x7ECF;&#x5386;&#x8FD9;&#x4E00;&#x6BB5;&#x75DB;&#x82E6;&#x7684;&#x56DE;&#x5FC6;&#x3002;</p><p>&#x8FD9;&#x4E00;&#x5E74;&#xFF0C;&#x7ECF;&#x5386;&#x4E86;&#x592A;&#x591A;&#xFF0C;&#x4E5F;&#x5931;&#x53BB;&#x592A;&#x591A;&#x3002;2016&#x5E74;12&#x6708;&#x5E95;&#xFF0C;&#x6211;&#x548C;&#x670B;&#x53CB;&#x5B9A;&#x597D;&#x4E86;&#x5143;&#x65E6;&#x53BB;&#x9EC4;&#x5C71;&#x770B;&#x65B0;&#x5E74;&#x65E5;&#x51FA;&#xFF0C;&#x7A81;&#x5982;&#x5176;&#x6765;&#x7684;&#x5669;&#x8017;&#xFF0C;&#x8BA9;&#x6211;&#x4E0D;&#x77E5;&#x6240;&#x63AA;&#x3002;&#x5802;&#x59D0;&#x544A;&#x8BC9;&#x6211;&#xFF0C;&#x7236;&#x4EB2;&#x5F97;&#x4E86;&#x5F88;&#x91CD;&#x7684;&#x75C5;&#xFF0C;&#x5F53;&#x65F6;&#xFF0C;&#x6211;&#x8111;&#x5B50;&#x4E00;&#x7247;&#x7A7A;&#x767D;&#x3002;&#x540E;&#x6765;&#x6211;&#x6253;&#x7535;&#x8BDD;&#x95EE;&#x6211;&#x59D0;&#x5177;&#x4F53;&#x7684;&#x60C5;&#x51B5;&#xFF0C;&#x7535;&#x8BDD;&#x4E2D;&#xFF0C;&#x6211;&#x6CA1;&#x63A7;&#x5236;&#x4F4F;&#x81EA;&#x5DF1;&#x7684;&#x60C5;&#x7EEA;&#xFF0C;&#x59D0;&#x5B89;&#x6170;&#x6211;&#x8BF4;&#xFF0C;&#x8981;&#x7B49;&#x660E;&#x5929;&#x53BB;&#x53BF;&#x533B;&#x9662;&#x7684;&#x68C0;&#x67E5;&#x7ED3;&#x679C;&#x3002;&#x90A3;&#x4E00;&#x665A;&#xFF0C;&#x6211;&#x4E00;&#x76F4;&#x7948;&#x7977;&#x4E8B;&#x60C5;&#x6CA1;&#x90A3;&#x4E48;&#x7CDF;&#x3002;&#x7B2C;&#x4E8C;&#x5929;&#x68C0;&#x67E5;&#x5B8C;&#xFF0C;&#x59D0;&#x59D0;&#x8BA9;&#x6211;&#x5B9A;&#x597D;&#x6C5F;&#x82CF;&#x7701;&#x80BF;&#x7624;&#x533B;&#x9662;&#x9644;&#x8FD1;&#x7684;&#x5BBE;&#x9986;&#xFF0C;&#x6211;&#x5C31;&#x611F;&#x89C9;&#x5230;&#x7236;&#x4EB2;&#x7684;&#x75C5;&#x60C5;&#x5F88;&#x4E0D;&#x597D;&#x3002;&#x5F53;&#x665A;&#xFF0C;&#x7238;&#x5988;&#x3001;&#x59D0;&#x59D0;&#x3001;&#x4E8C;&#x53D4;&#x4E00;&#x8D77;&#x5230;&#x4E86;&#x5357;&#x4EAC;&#xFF0C;&#x6211;&#x770B;&#x5230;&#x53BF;&#x57CE;&#x533B;&#x9662;&#x6838;&#x78C1;&#x68C0;&#x67E5;&#x62A5;&#x544A;&#xFF1A;&#x80F0;&#x817A;&#x764C;&#x665A;&#x671F;&#xFF0C;&#x6700;&#x4E25;&#x91CD;&#x7684;&#x764C;&#x75C7;&#xFF0C;&#x8FD9;&#x5BF9;&#x4E8E;&#x6211;&#x4EEC;&#x5168;&#x5BB6;&#x662F;&#x4E00;&#x6B21;&#x6C89;&#x91CD;&#x7684;&#x6253;&#x51FB;&#x3002;1&#x6708;4&#x53F7;&#xFF0C;&#x7236;&#x4EB2;&#x63A5;&#x53D7;&#x4E86;&#x624B;&#x672F;&#x6CBB;&#x7597;&#xFF0C;&#x624B;&#x672F;&#x5F88;&#x6210;&#x529F;&#x3002;&#x4ECE;&#x90A3;&#x5F00;&#x59CB;&#xFF0C;&#x6211;&#x767D;&#x5929;&#x5728;&#x516C;&#x53F8;&#x5DE5;&#x4F5C;&#xFF0C;&#x665A;&#x4E0A;&#x56DE;&#x533B;&#x9662;&#x966A;&#x62A4;&#xFF0C;&#x5DE5;&#x4F5C;&#x7684;&#x65F6;&#x5019;&#x4E5F;&#x4E0D;&#x5728;&#x72B6;&#x6001;&#xFF0C;&#x8FD8;&#x4E00;&#x76F4;&#x5B89;&#x6170;&#x81EA;&#x5DF1;&#xFF0C;&#x201C;&#x4E00;&#x5207;&#x90FD;&#x4F1A;&#x597D;&#x8D77;&#x6765;&#x201D;&#x3002;&#x5C31;&#x5728;&#x6211;&#x4EE5;&#x4E3A;&#x4E00;&#x5207;&#x771F;&#x7684;&#x4F1A;&#x597D;&#x8D77;&#x6765;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x6BCD;&#x4EB2;&#x7684;&#x80C3;&#x75BC;&#x7684;&#x8D8A;&#x6765;&#x8D8A;&#x4E25;&#x91CD;&#xFF0C;&#x6211;&#x966A;&#x5979;&#x53BB;&#x9F13;&#x697C;&#x533B;&#x9662;&#x505A;&#x4E86;&#x80C3;&#x955C;&#x68C0;&#x67E5;&#xFF0C;&#x7ED3;&#x679C;&#x5F88;&#x4E0D;&#x7406;&#x60F3;&#xFF0C;&#x201D;&#x6000;&#x7591;&#x80C3;Ca&#x201D;&#xFF0C;&#x4F46;&#x8FD8;&#x9700;&#x8981;&#x7B49;&#x75C5;&#x7406;&#x62A5;&#x544A;&#x3002;&#x63D0;&#x7740;&#x5FC3;&#x8FC7;&#x4E86;&#x4E00;&#x5468;&#xFF0C;&#x75C5;&#x7406;&#x62A5;&#x544A;&#x786E;&#x8BCA;&#xFF0C;&#x8D76;&#x7D27;&#x5E26;&#x7740;&#x6BCD;&#x4EB2;&#x53BB;&#x9F13;&#x697C;&#x533B;&#x9662;&#x627E;&#x533B;&#x751F;&#x3002;&#x56E0;&#x4E3A;&#x533B;&#x9662;&#x9700;&#x8981;&#x5BB6;&#x5C5E;&#x7B7E;&#x5B57;&#xFF0C;&#x6240;&#x4EE5;&#x4F5C;&#x4E3A;&#x513F;&#x5B50;&#x7684;&#x6211;&#xFF0C;&#x62C5;&#x8D77;&#x7167;&#x987E;&#x6BCD;&#x4EB2;&#x7684;&#x8D23;&#x4EFB;&#xFF0C;&#x59D0;&#x59D0;&#x7559;&#x4E0B;&#x6765;&#x7167;&#x987E;&#x7236;&#x4EB2;&#x3002;1&#x6708;22&#x53F7;&#xFF0C;&#x6BCD;&#x4EB2;&#x63A5;&#x53D7;&#x624B;&#x672F;&#x6CBB;&#x7597;&#xFF0C;&#x56E0;&#x4E3A;&#x6B63;&#x597D;&#x5FEB;&#x8981;&#x8FC7;&#x5E74;&#xFF0C;&#x6BCD;&#x4EB2;&#x521A;&#x505A;&#x5B8C;&#x624B;&#x672F;&#xFF0C;&#x6240;&#x4EE5;&#x6211;&#x966A;&#x7740;&#x6BCD;&#x4EB2;&#x5728;&#x9F13;&#x697C;&#x533B;&#x9662;&#x8FC7;&#x4E86;&#x4E00;&#x4E2A;&#x4ECA;&#x751F;&#x96BE;&#x5FD8;&#x7684;&#x5E74;&#x3002;</p><p><img src="/2017/12/30/2017&#xFF1A;&#x6E05;&#x767D;&#x4E4B;&#x5E74;/gulou.JPG" alt="&#x9F13;&#x697C;&#x533B;&#x9662;&#x5927;&#x5385;&#x770B;&#x5230;&#x7684;&#x5929;&#x7A7A;"></p><p>&#x7236;&#x6BCD;&#x672F;&#x540E;&#x8EAB;&#x4F53;&#x6E10;&#x6E10;&#x6062;&#x590D;&#xFF0C;&#x4E3A;&#x4E86;&#x80FD;&#x7167;&#x987E;&#x5230;&#x4ED6;&#x4EEC;&#xFF0C;&#x529D;&#x4ED6;&#x4EEC;&#x53BB;&#x59D0;&#x59D0;&#x5BB6;&#x4F4F;&#x6BB5;&#x65F6;&#x95F4;&#xFF0C;&#x4ED6;&#x4EEC;&#x6700;&#x7EC8;&#x4E5F;&#x63A5;&#x53D7;&#x4E86;&#x3002;&#x4ECE;&#x8FD9;&#x4E4B;&#x540E;&#xFF0C;&#x6211;&#x767D;&#x5929;&#x52AA;&#x529B;&#x96C6;&#x4E2D;&#x7CBE;&#x529B;&#x5DE5;&#x4F5C;&#xFF0C;&#x867D;&#x7136;&#x4EBA;&#x5076;&#x5C14;&#x8FD8;&#x662F;&#x4F1A;&#x4E0D;&#x5728;&#x72B6;&#x6001;&#x3002;&#x6BCF;&#x5929;&#x665A;&#x4E0A;&#x6211;&#x90FD;&#x4F1A;&#x7ED9;&#x4ED6;&#x4EEC;&#x6253;&#x4E00;&#x4E2A;&#x7535;&#x8BDD;&#xFF0C;&#x542C;&#x5230;&#x4ED6;&#x4EEC;&#x7684;&#x58F0;&#x97F3;&#xFF0C;&#x6211;&#x7684;&#x5FC3;&#x624D;&#x80FD;&#x5E73;&#x9759;&#x3002;&#x9F13;&#x697C;&#x533B;&#x9662;&#x7684;&#x533B;&#x751F;&#x8BA9;&#x6211;&#x8054;&#x7CFB;&#x7701;&#x80BF;&#x7624;&#x533B;&#x9662;&#x4E3A;&#x6211;&#x5988;&#x5B89;&#x6392;&#x5316;&#x7597;&#xFF0C;&#x800C;&#x6211;&#x7238;&#x7684;&#x4E3B;&#x6CBB;&#x533B;&#x751F;&#x4E0D;&#x5EFA;&#x8BAE;&#x7ED9;&#x6211;&#x7238;&#x5316;&#x7597;&#xFF0C;&#x867D;&#x7136;&#x4E0D;&#x613F;&#x63A5;&#x53D7;&#x8FD9;&#x4E2A;&#x73B0;&#x5B9E;&#xFF0C;&#x4F46;&#x771F;&#x7684;&#x53EA;&#x80FD;&#x542C;&#x5929;&#x7531;&#x547D;&#x3002;&#x6BCF;&#x6B21;&#x6765;&#x5357;&#x4EAC;&#x5316;&#x7597;&#xFF0C;&#x6211;&#x90FD;&#x4F1A;&#x65E9;&#x65E9;&#x5730;&#x7AD9;&#x5728;&#x533B;&#x9662;&#x90A3;&#x8FB9;&#x7684;&#x8DEF;&#x53E3;&#x7B49;&#x5979;&#xFF0C;&#x6BCF;&#x6B21;&#x770B;&#x5230;&#x5979;&#xFF0C;&#x6211;&#x90FD;&#x96BE;&#x63A9;&#x5FC3;&#x4E2D;&#x7684;&#x6CEA;&#x6C34;&#x3002;&#x770B;&#x5230;&#x533B;&#x9662;&#x90A3;&#x4E48;&#x591A;&#x63A5;&#x53D7;&#x5316;&#x7597;&#x7684;&#x75C5;&#x4EBA;&#xFF0C;&#x6211;&#x80FD;&#x4F53;&#x4F1A;&#x5230;&#x90A3;&#x79CD;&#x75DB;&#x82E6;&#xFF0C;&#x5403;&#x4E0D;&#x4E0B;&#x4E1C;&#x897F;&#x3001;&#x5455;&#x5410;&#xFF0C;&#x5E38;&#x4EBA;&#x4E5F;&#x65E0;&#x6CD5;&#x5FCD;&#x53D7;&#x3002;</p><p>&#x56DB;&#x6708;&#x4EFD;&#x5F00;&#x59CB;&#xFF0C;&#x7236;&#x4EB2;&#x6E10;&#x6E10;&#x611F;&#x89C9;&#x8179;&#x90E8;&#x5F00;&#x59CB;&#x75BC;&#x75DB;&#xFF0C;&#x56E0;&#x4E3A;&#x5F53;&#x65F6;&#x624B;&#x672F;&#x7684;&#x65F6;&#x5019;&#x5C31;&#x5DF2;&#x7ECF;&#x786E;&#x5B9A;&#x8F6C;&#x79FB;&#x4E86;&#xFF0C;&#x6211;&#x77E5;&#x9053;&#x5E94;&#x8BE5;&#x662F;&#x590D;&#x53D1;&#x4E86;&#xFF0C;&#x6211;&#x4EEC;&#x4E5F;&#x5B89;&#x6170;&#x4ED6;&#xFF0C;&#x8BF4;&#x662F;&#x672F;&#x540E;&#x708E;&#x75C7;&#xFF0C;&#x5E26;&#x4ED6;&#x53BB;&#x6302;&#x4E86;&#x6D88;&#x708E;&#x6C34;&#x3002;&#x7136;&#x800C;&#xFF0C;&#x75BC;&#x75DB;&#x8FD8;&#x662F;&#x4F1A;&#x8BA9;&#x4ED6;&#x5403;&#x4E0D;&#x4E0B;&#x996D;&#xFF0C;&#x6E10;&#x6E10;&#x7684;&#xFF0C;&#x4EBA;&#x8D8A;&#x6765;&#x8D8A;&#x6D88;&#x7626;&#xFF0C;&#x6211;&#x56E0;&#x4E3A;&#x5DE5;&#x4F5C;&#xFF0C;&#x4E5F;&#x5F88;&#x5C11;&#x56DE;&#x53BB;&#x770B;&#x4ED6;&#xFF0C;&#x4ED6;&#x4E5F;&#x4E0D;&#x8BA9;&#x6BCD;&#x4EB2;&#x548C;&#x4E8C;&#x53D4;&#x6253;&#x7535;&#x8BDD;&#x7ED9;&#x6211;&#x3002;&#x6BCF;&#x6B21;&#x63A5;&#x5B8C;&#x5BB6;&#x91CC;&#x7684;&#x7535;&#x8BDD;&#xFF0C;&#x6211;&#x90FD;&#x63A7;&#x5236;&#x4E0D;&#x4F4F;&#x81EA;&#x5DF1;&#x7684;&#x60C5;&#x7EEA;&#xFF0C;&#x56E0;&#x4E3A;&#x6211;&#x89C9;&#x5F97;&#x5BF9;&#x4E0D;&#x8D77;&#x4ED6;&#x4EEC;&#xFF0C;&#x6CA1;&#x5C3D;&#x5230;&#x505A;&#x513F;&#x5B50;&#x7684;&#x8D23;&#x4EFB;&#xFF0C;&#x5E73;&#x65F6;&#x5BF9;&#x4ED6;&#x4EEC;&#x7684;&#x5173;&#x5FC3;&#x592A;&#x5C11;&#x3002;</p><p>9&#x6708;23&#x53F7;&#x665A;&#x4E0A;&#x7236;&#x4EB2;&#x79BB;&#x5F00;&#x4E86;&#x6211;&#x4EEC;&#xFF0C;&#x6211;&#x4E5F;&#x4E0D;&#x80FD;&#x518D;&#x53EB;&#x4ED6;&#x4E00;&#x58F0;&#x7238;&#x7238;&#xFF0C;&#x4F46;&#x6211;&#x6C38;&#x8FDC;&#x8BB0;&#x5F97;&#x7236;&#x4EB2;&#x8D70;&#x4E4B;&#x524D;&#x4EA4;&#x4EE3;&#x7ED9;&#x6211;&#x7684;&#x4E24;&#x4EF6;&#x4E8B;&#x3002;&#x6811;&#x6B32;&#x9759;&#x800C;&#x98CE;&#x4E0D;&#x6B62;&#xFF0C;&#x5B50;&#x6B32;&#x517B;&#x800C;&#x4EB2;&#x4E0D;&#x5F85;&#x3002;&#x73B0;&#x5728;&#x56DE;&#x60F3;&#xFF0C;&#x5931;&#x53BB;&#x4E86;&#x624D;&#x77E5;&#x9053;&#x75DB;&#x7684;&#x6ECB;&#x5473;&#xFF0C;&#x9057;&#x61BE;&#x592A;&#x591A;&#xFF0C;&#x8FD9;&#x4E9B;&#x9057;&#x61BE;&#x4E5F;&#x4F1A;&#x8DDF;&#x7740;&#x6211;&#x4E00;&#x8F88;&#x5B50;&#xFF0C;&#x6211;&#x6240;&#x80FD;&#x505A;&#x7684;&#xFF0C;&#x5C31;&#x662F;&#x597D;&#x597D;&#x7167;&#x987E;&#x6211;&#x7684;&#x6BCD;&#x4EB2;&#xFF0C;&#x5C3D;&#x6211;&#x6700;&#x5927;&#x7684;&#x52AA;&#x529B;&#x3002;</p><p>&#x867D;&#x7136;&#x4ECA;&#x5E74;&#x7ECF;&#x5386;&#x4E86;&#x592A;&#x591A;&#x75DB;&#x82E6;&#xFF0C;&#x4F46;&#x4ED6;&#x4EEC;&#x4E0D;&#x662F;&#x6211;&#x9893;&#x7684;&#x7406;&#x7531;&#x3002;&#x4E66;&#x6CA1;&#x8BFB;&#x51E0;&#x672C;&#xFF0C;&#x65B0;&#x77E5;&#x8BC6;&#x4E5F;&#x6CA1;&#x5B66;&#x591A;&#x5C11;&#xFF0C;&#x53D1;&#x73B0;&#x81EA;&#x5DF1;&#x8D8A;&#x6765;&#x8D8A;&#x5931;&#x53BB;&#x7ADE;&#x4E89;&#x529B;&#xFF0C;&#x4E5F;&#x65F6;&#x5E38;&#x81EA;&#x6211;&#x53CD;&#x7701;&#x3002;&#x5BF9;&#x6211;&#x6765;&#x8BF4;&#xFF0C;2018&#x5E74;&#x4F1A;&#x662F;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x5F00;&#x59CB;&#xFF0C;&#x6211;&#x8981;&#x4EE5;&#x5168;&#x65B0;&#x7684;&#x59FF;&#x6001;&#xFF0C;&#x52E4;&#x594B;&#x5DE5;&#x4F5C;&#xFF0C;&#x575A;&#x6301;&#x5B66;&#x4E60;&#xFF0C;&#x52AA;&#x529B;&#x8D5A;&#x94B1;&#xFF0C;&#x4EE5;&#x79EF;&#x6781;&#x7684;&#x6001;&#x5EA6;&#x9762;&#x5BF9;&#x751F;&#x6D3B;&#x3002;</p>]]></content>
    
    <summary type="html">
    
      &lt;iframe frameborder=&quot;no&quot; border=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; width=&quot;330&quot; height=&quot;86&quot; src=&quot;//music.163.com/outchain/player?type=2&amp;amp
    
    </summary>
    
      <category term="随笔" scheme="http://brucewar.cn/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
      <category term="年终总结" scheme="http://brucewar.cn/tags/%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%93/"/>
    
  </entry>
  
  <entry>
    <title>flexbox布局的响应式表格</title>
    <link href="http://brucewar.cn/2017/07/06/flexbox%E5%B8%83%E5%B1%80%E7%9A%84%E5%93%8D%E5%BA%94%E5%BC%8F%E8%A1%A8%E6%A0%BC/"/>
    <id>http://brucewar.cn/2017/07/06/flexbox布局的响应式表格/</id>
    <published>2017-07-06T00:57:19.000Z</published>
    <updated>2017-07-06T02:40:10.997Z</updated>
    
    <content type="html"><![CDATA[<p>HTML <code>table</code>&#x5143;&#x7D20;&#x505A;&#x54CD;&#x5E94;&#x5F0F;&#x8868;&#x683C;&#x662F;&#x975E;&#x5E38;&#x96BE;&#x7528;&#x7684;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x5927;&#x91CF;&#x7684;&#x6837;&#x677F;&#x548C;&#x5D4C;&#x5957;&#x7684;HTML&#x6765;&#x89E3;&#x51B3;&#x8FD9;&#x6837;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x95EE;&#x9898;&#x3002;&#x6211;&#x4EEC;&#x6765;&#x63A2;&#x8BA8;&#x4E00;&#x79CD;&#x4F7F;&#x7528;<code>div</code>&#x548C;<a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Using_CSS_flexible_boxes" target="_blank" rel="external">Flexbox</a>&#x7684;&#x66FF;&#x4EE3;&#x65B9;&#x6CD5;&#x3002;&#x8FD9;&#x5C06;&#x7ED9;&#x6211;&#x4EEC;&#x5E26;&#x6765;&#x7684;&#x597D;&#x5904;&#x662F;&#x80FD;&#x591F;&#x521B;&#x5EFA;&#x5728;&#x6240;&#x6709;&#x5C3A;&#x5BF8;&#x5C4F;&#x5E55;&#x4E0A;&#x90FD;&#x770B;&#x8D77;&#x6765;&#x5F88;&#x68D2;&#x7684;&#x54CD;&#x5E94;&#x5F0F;&#x8868;&#x683C;&#x3002;</p><p>&#x9996;&#x5148;&#xFF0C;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#x5C06;&#x4F7F;&#x7528;<a href="http://inlehmansterms.net/2014/08/25/modular-css-with-suitcss/" target="_blank" rel="external">SUIT CSS</a>&#x4EE5;&#x6A21;&#x5757;&#x5316;&#x65B9;&#x5F0F;&#x5199;&#x5165;<a href="http://sass-lang.com/" target="_blank" rel="external">Sass</a>&#x3002;&#x6211;&#x4EEC;&#x5C06;&#x4F7F;&#x7528;&#x4E00;&#x4E9B;Sass&#x5E93;&#x5E2E;&#x52A9;&#x6211;&#x4EEC;&#x5B8C;&#x6210;&#x4EFB;&#x52A1;&#x3002;<a href="https://autoprefixer.github.io/" target="_blank" rel="external">autoprefixer</a>&#x7528;&#x4E8E;&#x5E2E;&#x52A9;&#x6211;&#x4EEC;&#x751F;&#x6210;&#x5FC5;&#x8981;&#x7684;Flexbox CSS&#x4F9B;&#x5E94;&#x5546;&#x524D;&#x7F00;&#xFF0C;&#x4EE5;&#x53CA;<a href="http://breakpoint-sass.com/" target="_blank" rel="external">Breakpoint</a>&#x6765;&#x5E2E;&#x52A9;&#x6211;&#x4EEC;&#x505A;media query&#x3002;&#x5982;&#x679C;&#x4F60;&#x559C;&#x6B22;&#x7528;CSS&#xFF0C;&#x8BF7;&#x968F;&#x65F6;&#x5C06;&#x751F;&#x6210;&#x7684;CSS&#x4ECE;&#x94FE;&#x63A5;&#x590D;&#x5236;&#x5230;<a href="http://sassmeister.com/gist/b38aca96fc6024a28514" target="_blank" rel="external">Sassmeister</a>&#x793A;&#x4F8B;&#x3002;</p><p>&#x6211;&#x4EEC;&#x9700;&#x8981;&#x7684;&#x662F;&#x6784;&#x5EFA;<code>Table</code>&#x7EC4;&#x4EF6;&#x7684;3&#x4E2A;&#x57FA;&#x672C;&#x7C7B;&#x3002;&#x9996;&#x5148;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;<code>Table</code>&#x7C7B;&#xFF0C;&#x5B83;&#x5C06;&#x4F7F;&#x7528;Flexbox&#x6765;&#x4F7F;&#x6240;&#x6709;&#x7684;&#x5B50;&#x8282;&#x70B9;&#xFF08;&#x884C;&#xFF09;&#x6309;&#x5217;&#x5E03;&#x5C40;&#x3002;&#x63A5;&#x4E0B;&#x6765;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x4E00;&#x4E2A;<code>Table-row</code>&#x7C7B;&#xFF0C;&#x5B83;&#x5C06;&#x4F7F;&#x7528;Flexbox&#x6765;&#x4F7F;&#x5176;&#x6240;&#x6709;&#x7684;&#x5B50;&#x8282;&#x70B9;&#xFF08;&#x884C;/&#x5217;&#xFF09;&#x6309;&#x884C;&#x6392;&#x5217;&#xFF0C;&#x800C;&#x4E0D;&#x9700;&#x8981;&#x5305;&#x88C5;&#x3002;&#x6700;&#x540E;&#x6211;&#x4EEC;&#x9700;&#x8981;<code>Table-row-item</code>&#xFF0C;&#x5B83;&#x57FA;&#x672C;&#x4E0A;&#x662F;&#x8868;&#x683C;&#x7EC4;&#x4EF6;&#x7684;&#x4E00;&#x4E2A;&#x5355;&#x5143;&#x683C;&#x3002;&#x73B0;&#x5728;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x7684;&#x662F;&#x4E00;&#x4E2A;<code>Table-header</code>&#x7C7B;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x6DFB;&#x52A0;&#x5230;&#x4EFB;&#x4F55;&#x884C;&#x5143;&#x7D20;&#xFF0C;&#x4EE5;&#x7ED9;&#x5B83;&#x4E00;&#x4E2A;&#x6807;&#x9898;&#x7684;&#x6837;&#x5F0F;&#x3002;&#x6839;&#x636E;&#x8FD9;&#x4E9B;&#x6807;&#x51C6;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x4E3A;&#x6211;&#x4EEC;&#x7684;&#x7EC4;&#x4EF6;&#x7F16;&#x5199;HTML&#x548C;Sass&#xFF0C;&#x5982;&#x4E0B;&#x6240;&#x793A;&#x3002;</p><p><img src="/2017/07/06/flexbox&#x5E03;&#x5C40;&#x7684;&#x54CD;&#x5E94;&#x5F0F;&#x8868;&#x683C;/table1.png" alt="&#x5217;&#x7B49;&#x5BBD;&#x8868;&#x683C;"></p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row Table-header&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span>&gt;</span>Header1<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span>&gt;</span>Header2<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span>&gt;</span>Header3<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span>&gt;</span>Header4<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header1&quot;</span>&gt;</span>row1 col1<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header2&quot;</span>&gt;</span>row1 col2<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header3&quot;</span>&gt;</span>row1 col3<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header4&quot;</span>&gt;</span>row1 col4<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header1&quot;</span>&gt;</span>row2 col1<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header2&quot;</span>&gt;</span>row2 col2<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header3&quot;</span>&gt;</span>row2 col3<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header4&quot;</span>&gt;</span>row2 col4<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight scss"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">@import</span> <span class="string">&quot;breakpoint&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.Table</span> {</span><br><span class="line">  <span class="variable">$light-color</span>: <span class="number">#ffffff</span>;</span><br><span class="line">  <span class="variable">$dark-color</span>: <span class="number">#f2f2f2</span>;</span><br><span class="line">  <span class="variable">$md</span>: <span class="number">500px</span>;</span><br><span class="line"></span><br><span class="line">  <span class="attribute">display</span>: flex;</span><br><span class="line">  <span class="attribute">flex-flow</span>: column nowrap;</span><br><span class="line">  <span class="attribute">justify-content</span>: space-between;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">1px</span> solid <span class="variable">$dark-color</span>;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">1rem</span>;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">0.5rem</span>;</span><br><span class="line">  <span class="attribute">line-height</span>: <span class="number">1.5</span>;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// .Table-header</span></span><br><span class="line">  &amp;-<span class="selector-tag">header</span> {</span><br><span class="line">    <span class="attribute">display</span>: none;</span><br><span class="line">    <span class="keyword">@include</span> breakpoint(<span class="variable">$md</span>) {</span><br><span class="line">      <span class="attribute">font-weight</span>: <span class="number">700</span>;</span><br><span class="line">      <span class="attribute">background-color</span>: <span class="variable">$dark-color</span>;</span><br><span class="line">    }</span><br><span class="line">  }</span><br><span class="line">  <span class="comment">// .Table-row</span></span><br><span class="line">  &amp;-row {</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">    &amp;<span class="selector-pseudo">:nth-of-type</span>(even) { <span class="attribute">background-color</span>: <span class="variable">$dark-color</span>; }</span><br><span class="line">     &amp;<span class="selector-pseudo">:nth-of-type</span>(odd) { <span class="attribute">background-color</span>: <span class="variable">$light-color</span>; }</span><br><span class="line">    <span class="keyword">@include</span> breakpoint(<span class="variable">$md</span>) {</span><br><span class="line">      <span class="attribute">display</span>: flex;</span><br><span class="line">      <span class="attribute">flex-flow</span>: row nowrap;</span><br><span class="line">      &amp;<span class="selector-pseudo">:nth-of-type</span>(even) { <span class="attribute">background-color</span>: <span class="variable">$light-color</span>; }</span><br><span class="line">      &amp;<span class="selector-pseudo">:nth-of-type</span>(odd) { <span class="attribute">background-color</span>: <span class="variable">$dark-color</span>; }</span><br><span class="line">    }</span><br><span class="line">    <span class="comment">// .Table-row-item</span></span><br><span class="line">    &amp;-item {</span><br><span class="line">      <span class="attribute">display</span>: flex;</span><br><span class="line">      <span class="attribute">flex-flow</span>: row nowrap;</span><br><span class="line">      <span class="attribute">flex-grow</span>: <span class="number">1</span>;</span><br><span class="line">      <span class="attribute">flex-basis</span>: <span class="number">0</span>;</span><br><span class="line">      <span class="attribute">padding</span>: <span class="number">0.5em</span>;</span><br><span class="line">      <span class="attribute">word-break</span>: break-word;</span><br><span class="line">      &amp;<span class="selector-pseudo">:before</span> {</span><br><span class="line">        <span class="attribute">content</span>: attr(data-header);</span><br><span class="line">        <span class="attribute">width</span>: <span class="number">30%</span>;</span><br><span class="line">        <span class="attribute">font-weight</span>: <span class="number">700</span>;</span><br><span class="line">      }</span><br><span class="line">      <span class="keyword">@include</span> breakpoint(<span class="variable">$md</span>) {</span><br><span class="line">        <span class="attribute">border</span>: <span class="number">1px</span> solid <span class="variable">$light-color</span>;</span><br><span class="line">        <span class="attribute">padding</span>: <span class="number">0.5em</span>;</span><br><span class="line">        &amp;<span class="selector-pseudo">:before</span> { <span class="attribute">content</span>: none; }</span><br><span class="line">      }</span><br><span class="line">    }</span><br><span class="line">  }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><a href="http://sassmeister.com/gist/b38aca96fc6024a28514" target="_blank" rel="external">&#x5728;Sassmeister&#x5C1D;&#x8BD5;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;</a></p><p>&#x6839;&#x636E;&#x6B64;&#x5B9E;&#x73B0;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x8F7B;&#x677E;&#x521B;&#x5EFA;&#x54CD;&#x5E94;&#x5F0F;&#x8868;&#x683C;&#x3002;&#x6BCF;&#x884C;&#x7B80;&#x5355;&#x5730;&#x5C06;&#x9879;&#x76EE;&#x7684;&#x6570;&#x91CF;&#x5206;&#x89E3;&#x6210;&#x7B49;&#x4E8E;&#x5217;&#x3002;&#x8FD9;&#x4F7F;&#x6211;&#x4EEC;&#x80FD;&#x591F;&#x7075;&#x6D3B;&#x5730;&#x521B;&#x5EFA;&#x5177;&#x6709;&#x4E0D;&#x540C;&#x5217;&#x6570;&#x7684;&#x8868;&#x683C;&#x3002;&#x7136;&#x800C;&#xFF0C;&#x540C;&#x6837;&#x7684;&#x597D;&#x5904;&#x4E5F;&#x6709;&#x7F3A;&#x70B9;&#x3002;</p><p>&#x6211;&#x4EEC;&#x7684;&#x8868;&#x683C;&#x7EC4;&#x4EF6;&#x7684;&#x95EE;&#x9898;&#x662F;&#x6BCF;&#x4E2A;&#x5217;&#x7684;&#x5BBD;&#x5EA6;&#x76F8;&#x540C;&#x3002;&#x5982;&#x679C;&#x6211;&#x4EEC;&#x6709;&#x7684;&#x5217;&#x5305;&#x542B;&#x7684;&#x6570;&#x636E;&#x6BD4;&#x5176;&#x4ED6;&#x5217;&#x66F4;&#x5BBD;&#x6216;&#x66F4;&#x7A84;&#x4F1A;&#x53D1;&#x751F;&#x4EC0;&#x4E48;&#x5462;&#xFF1F;&#x5E78;&#x8FD0;&#x7684;&#x662F;&#xFF0C;Flexbox&#x4E5F;&#x4F7F;&#x5F97;&#x8FD9;&#x4E2A;&#x5F88;&#x5BB9;&#x6613;&#x5B9E;&#x73B0;&#x3002;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x7B80;&#x5355;&#x5730;&#x6DFB;&#x52A0;&#x4E00;&#x4E9B;&#x5B9E;&#x7528;&#x7684;&#x5DE5;&#x5177;&#x7C7B;&#x6765;&#x8BBE;&#x7F6E;&#x4E0D;&#x540C;&#x5217;&#x7684;Flexbox&#x589E;&#x957F;&#x7387;&#x3002;</p><p><img src="/2017/07/06/flexbox&#x5E03;&#x5C40;&#x7684;&#x54CD;&#x5E94;&#x5F0F;&#x8868;&#x683C;/table2.png" alt="&#x5217;&#x4E0D;&#x7B49;&#x5BBD;&#x8868;&#x683C;"></p><figure class="highlight scss"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// generate Flexbox grow-rate utility classes</span></span><br><span class="line"><span class="keyword">@for</span> <span class="variable">$i</span> from <span class="number">1</span> through <span class="number">10</span> {</span><br><span class="line">  <span class="selector-class">.u-Flex-grow</span>#{<span class="variable">$i</span>} {</span><br><span class="line">    <span class="attribute">flex-grow</span>: i;</span><br><span class="line">  }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row Table-header&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item u-Flex-grow2&quot;</span>&gt;</span>Long Header1<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span>&gt;</span>Header2<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span>&gt;</span>Header3<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span>&gt;</span>Header4<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item u-Flex-grow3&quot;</span>&gt;</span>Longer Header5<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span>&gt;</span>Header6<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span>&gt;</span>Header7<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item u-Flex-grow2&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header1&quot;</span>&gt;</span>row1 col1<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header2&quot;</span>&gt;</span>row1 col2<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header3&quot;</span>&gt;</span>row1 col3<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header4&quot;</span>&gt;</span>row1 col4<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item u-Flex-grow3&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header5&quot;</span>&gt;</span>row1 col5<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header6&quot;</span>&gt;</span>row1 col6<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header7&quot;</span>&gt;</span>row1 col7<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item u-Flex-grow2&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header1&quot;</span>&gt;</span>row2 col1<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header2&quot;</span>&gt;</span>row2 col2<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header3&quot;</span>&gt;</span>row2 col3<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header4&quot;</span>&gt;</span>row2 col4<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item u-Flex-grow3&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header5&quot;</span>&gt;</span>row2 col5<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header6&quot;</span>&gt;</span>row2 col6<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header7&quot;</span>&gt;</span>row2 col7<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item u-Flex-grow2&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header1&quot;</span>&gt;</span>row3 col1<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header2&quot;</span>&gt;</span>row3 col2<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header3&quot;</span>&gt;</span>row3 col3<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header4&quot;</span>&gt;</span>row3 col4<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item u-Flex-grow3&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header5&quot;</span>&gt;</span>row3 col5<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header6&quot;</span>&gt;</span>row3 col6<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;Table-row-item&quot;</span> <span class="attr">data-header</span>=<span class="string">&quot;Header7&quot;</span>&gt;</span>row3 col7<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><p><a href="http://sassmeister.com/gist/de4eab2113204729ea50" target="_blank" rel="external">&#x5728;Sassmeister&#x5C1D;&#x8BD5;&#x8FD9;&#x4E2A;&#x4F8B;&#x5B50;</a></p><blockquote><p>&#x672C;&#x6587;&#x7FFB;&#x8BD1;&#x81EA;<a href="http://inlehmansterms.net/2014/10/11/responsive-tables-with-flexbox/" target="_blank" rel="external">http://inlehmansterms.net/2014/10/11/responsive-tables-with-flexbox/</a></p></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;HTML &lt;code&gt;table&lt;/code&gt;&amp;#x5143;&amp;#x7D20;&amp;#x505A;&amp;#x54CD;&amp;#x5E94;&amp;#x5F0F;&amp;#x8868;&amp;#x683C;&amp;#x662F;&amp;#x975E;&amp;#x5E38;&amp;#x96BE;&amp;#x7528;&amp;#x7684;&amp;#
    
    </summary>
    
      <category term="前端开发" scheme="http://brucewar.cn/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    
      <category term="CSS" scheme="http://brucewar.cn/tags/CSS/"/>
    
      <category term="flex" scheme="http://brucewar.cn/tags/flex/"/>
    
  </entry>
  
  <entry>
    <title>理解AngularJS Providers</title>
    <link href="http://brucewar.cn/2017/05/27/%E7%90%86%E8%A7%A3AngularJS-Providers/"/>
    <id>http://brucewar.cn/2017/05/27/理解AngularJS-Providers/</id>
    <published>2017-05-27T06:17:30.000Z</published>
    <updated>2017-05-27T10:19:37.083Z</updated>
    
    <content type="html"><![CDATA[<p>AngularJS 1.x&#x63D0;&#x4F9B;&#x4E86;&#x5982;&#x4E0B;5&#x4E2A;provider&#x65B9;&#x6CD5;&#xFF0C;&#x4F7F;&#x7528;&#x8FD9;&#x4E9B;&#x65B9;&#x6CD5;&#x80FD;&#x521B;&#x5EFA;&#x53EF;&#x88AB;&#x6CE8;&#x5165;&#x7684;&#x670D;&#x52A1;&#x3002;&#x4F46;&#x662F;&#x5982;&#x4F55;&#x4F7F;&#x7528;&#x8FD9;&#x4E9B;&#x65B9;&#x6CD5;&#xFF0C;&#x4EE5;&#x53CA;&#x8FD9;&#x4E9B;&#x65B9;&#x6CD5;&#x4E4B;&#x95F4;&#x6709;&#x4EC0;&#x4E48;&#x533A;&#x522B;&#x5462;&#xFF1F;&#x6240;&#x4EE5;&#x8FD9;&#x7BC7;&#x535A;&#x5BA2;&#x91CD;&#x70B9;&#x8BB0;&#x5F55;&#x4E0B;&#x8FD9;&#x4E9B;&#x65B9;&#x6CD5;&#x7684;&#x533A;&#x522B;&#xFF0C;&#x6765;&#x5E2E;&#x52A9;&#x81EA;&#x5DF1;&#x7406;&#x89E3;&#x5B83;&#x4EEC;&#x3002;</p><ul><li><a href="#value">value</a></li><li><a href="#factory">factory</a></li><li><a href="#service">service</a></li><li><a href="#constant">provider</a></li><li><a href="#constant">constant</a></li></ul><h1 id="value"><a href="#value" class="headerlink" title="value"></a>value</h1><p>&#x8FD9;&#x4E2A;&#x65B9;&#x6CD5;&#x7528;&#x6765;&#x5B9A;&#x4E49;&#x5E38;&#x91CF;&#xFF0C;&#x5E76;&#x4E14;&#x80FD;&#x5728;&#x8FD0;&#x884C;&#x9636;&#x6BB5;&#x6CE8;&#x5165;Controller&#x4E2D;&#x3002;&#x6BD4;&#x5982;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x670D;&#x52A1;&#x53EB;&#x201D;clientId&#x201D;&#xFF0C;&#x5E76;&#x63D0;&#x4F9B;&#x4E00;&#x4E2A;&#x7528;&#x4E8E;&#x8EAB;&#x4EFD;&#x9A8C;&#x8BC1;&#x7684;id&#x3002;</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> myApp = angular.module(<span class="string">&apos;myApp&apos;</span>, []);</span><br><span class="line">myApp.value(<span class="string">&apos;clientId&apos;</span>, <span class="string">&apos;12345678&apos;</span>);</span><br><span class="line"></span><br><span class="line">myApp.controller(<span class="string">&apos;DemoController&apos;</span>, [<span class="string">&apos;clientId&apos;</span>, <span class="function"><span class="keyword">function</span> <span class="title">DemoController</span>(<span class="params">clientId</span>) </span>{</span><br><span class="line">  <span class="keyword">this</span>.clientId = clientId;</span><br><span class="line">}]);</span><br></pre></td></tr></table></figure><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">ng-app</span>=<span class="string">&quot;myApp&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">body</span> <span class="attr">ng-controller</span>=<span class="string">&quot;DemoController as demo&quot;</span>&gt;</span></span><br><span class="line">    Client ID: {{demo.clientId}}</span><br><span class="line">  <span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><p>&#x6CE8;&#xFF1A;&#x5E38;&#x91CF;&#x503C;&#x53EF;&#x4EE5;&#x4E3A;JS&#x7684;&#x4EFB;&#x610F;&#x57FA;&#x672C;&#x7C7B;&#x578B;</p><h1 id="factory"><a href="#factory" class="headerlink" title="factory"></a>factory</h1><p><code>value</code>&#x65B9;&#x6CD5;&#x975E;&#x5E38;&#x7B80;&#x5355;&#xFF0C;&#x4F46;&#x7F3A;&#x5C11;&#x521B;&#x5EFA;&#x670D;&#x52A1;&#x65F6;&#x5E38;&#x5E38;&#x9700;&#x8981;&#x7684;&#x4E00;&#x4E9B;&#x91CD;&#x8981;&#x529F;&#x80FD;&#x3002;&#x6240;&#x4EE5;<code>factory</code>&#x65B9;&#x6CD5;&#x589E;&#x52A0;&#x4E86;&#x4EE5;&#x4E0B;&#x529F;&#x80FD;&#xFF1A;</p><ul><li>&#x4F7F;&#x7528;&#x5176;&#x4ED6;&#x670D;&#x52A1;&#x7684;&#x80FD;&#x529B;</li><li>&#x670D;&#x52A1;&#x521D;&#x59CB;&#x5316;</li><li>&#x5EF6;&#x65F6;&#x521D;&#x59CB;&#x5316;</li></ul><p><code>factory</code>&#x65B9;&#x6CD5;&#x4F7F;&#x7528;0&#x4E2A;&#x6216;&#x591A;&#x4E2A;&#x53C2;&#x6570;&#xFF08;&#x5176;&#x4ED6;&#x670D;&#x52A1;&#xFF09;&#x7684;&#x51FD;&#x6570;&#x6784;&#x5EFA;&#x65B0;&#x7684;&#x670D;&#x52A1;&#xFF0C;&#x5E76;&#x4E14;&#x6B64;&#x51FD;&#x6570;&#x7684;&#x8FD4;&#x56DE;&#x503C;&#x4E3A;&#x5DE5;&#x5382;&#x65B9;&#x6CD5;&#x521B;&#x5EFA;&#x7684;&#x670D;&#x52A1;&#x5B9E;&#x4F8B;&#x3002;</p><p>&#x6CE8;&#xFF1A;AngularJS&#x4E2D;&#x6240;&#x6709;&#x7684;&#x670D;&#x52A1;&#x90FD;&#x662F;&#x5355;&#x4F8B;&#xFF0C;&#x6CE8;&#x5C04;&#x5668;injector&#x6700;&#x591A;&#x4F7F;&#x7528;&#x8FD9;&#x4E9B;provider&#x65B9;&#x6CD5;&#x4E00;&#x6B21;&#x6765;&#x521B;&#x5EFA;&#x670D;&#x52A1;&#x5BF9;&#x8C61;&#xFF0C;&#x5E76;&#x5C06;&#x5B83;&#x4EEC;&#x7F13;&#x5B58;&#x4E0B;&#x6765;&#x3002;</p><p>&#x540C;&#x6837;&#x7684;&#x4F8B;&#x5B50;&#xFF0C;&#x6211;&#x4EEC;&#x901A;&#x8FC7;<code>factory</code>&#x5B9E;&#x73B0;&#x4E00;&#x4E0B;&#xFF1A;</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">myApp.factory(<span class="string">&apos;clientId&apos;</span>, <span class="function"><span class="keyword">function</span> <span class="title">clientIdFactory</span>(<span class="params"></span>) </span>{</span><br><span class="line">  <span class="keyword">return</span> <span class="string">&apos;12345678&apos;</span>;</span><br><span class="line">});</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x8FD9;&#x91CC;&#x53EA;&#x662F;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x5B57;&#x7B26;&#x4E32;&#xFF0C;&#x53EF;&#x80FD;&#x7528;value&#x66F4;&#x597D;&#x70B9;&#x3002;&#x5982;&#x679C;&#x9700;&#x8981;&#x8FD0;&#x7B97;&#xFF0C;&#x53EF;&#x4EE5;&#x8FD9;&#x6837;&#x5199;</span></span><br><span class="line">myApp.factory(<span class="string">&apos;apiToken&apos;</span>, [<span class="string">&apos;clientId&apos;</span>, <span class="function"><span class="keyword">function</span> <span class="title">apiTokenFactory</span>(<span class="params">clientId</span>) </span>{</span><br><span class="line">  <span class="keyword">var</span> encrypt = <span class="function"><span class="keyword">function</span>(<span class="params">data1, data2</span>) </span>{</span><br><span class="line">    <span class="keyword">return</span> (data1 + <span class="string">&apos;:&apos;</span> + data2).toUpperCase();</span><br><span class="line">  };</span><br><span class="line"></span><br><span class="line">  <span class="keyword">var</span> secret = <span class="built_in">window</span>.localStorage.getItem(<span class="string">&apos;myApp.secret&apos;</span>);</span><br><span class="line">  <span class="keyword">var</span> apiToken = encrpty(clientId, secret);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> apiToken;</span><br><span class="line">}]);</span><br></pre></td></tr></table></figure><p><code>factory</code>&#x65B9;&#x6CD5;&#x53EF;&#x4EE5;&#x521B;&#x5EFA;&#x4EFB;&#x4F55;&#x7C7B;&#x578B;&#x7684;&#x670D;&#x52A1;&#xFF0C;&#x6BD4;&#x5982;JavaScript&#x57FA;&#x672C;&#x7C7B;&#x578B;&#xFF0C;&#x5BF9;&#x8C61;&#x5B57;&#x9762;&#x91CF;&#xFF0C;&#x51FD;&#x6570;&#x6216;&#x8005;&#x81EA;&#x5B9A;&#x4E49;&#x7C7B;&#x578B;&#x7684;&#x5B9E;&#x4F8B;&#x3002;</p><h1 id="service"><a href="#service" class="headerlink" title="service"></a>service</h1><p>&#x53EF;&#x80FD;&#x6211;&#x4EEC;&#x7ECF;&#x5E38;&#x9700;&#x8981;&#x4F7F;&#x7528;&#x81EA;&#x5B9A;&#x4E49;&#x7C7B;&#x578B;&#x7F16;&#x5199;&#x9762;&#x5411;&#x5BF9;&#x8C61;&#x7684;&#x4EE3;&#x7801;&#x3002;</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">UnicornLauncher</span>(<span class="params">apiToken</span>) </span>{</span><br><span class="line">  <span class="keyword">this</span>.launchedCount = <span class="number">0</span>;</span><br><span class="line">  <span class="keyword">this</span>.launch = <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>{</span><br><span class="line">    <span class="keyword">this</span>.lanuchedCount++;</span><br><span class="line">  };</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">myApp.factory(<span class="string">&apos;unicornLauncher&apos;</span>, [<span class="string">&apos;apiToken&apos;</span>, <span class="function"><span class="keyword">function</span>(<span class="params">apiToken</span>) </span>{</span><br><span class="line">  <span class="keyword">return</span> <span class="keyword">new</span> UnicornLauncher(apiToken);</span><br><span class="line">}]);</span><br></pre></td></tr></table></figure><p>&#x4E0A;&#x9762;&#x662F;&#x901A;&#x8FC7;<code>factory</code>&#x5B9E;&#x73B0;&#x5BF9;&#x8C61;&#x5B9E;&#x4F8B;&#x5316;&#xFF0C;&#x7136;&#x800C;&#x8FD9;&#x91CC;&#x9700;&#x8981;&#x6211;&#x4EEC;&#x81EA;&#x5DF1;&#x521D;&#x59CB;&#x5316;&#x5B9E;&#x4F8B;&#xFF0C;&#x6240;&#x4EE5;Angular&#x63D0;&#x4F9B;&#x4E86;<code>service</code>&#x8FD9;&#x4E2A;&#x65B9;&#x6CD5;&#xFF0C;&#x5B83;&#x63A5;&#x53D7;&#x4E00;&#x4E2A;&#x6784;&#x9020;&#x51FD;&#x6570;&#x4F5C;&#x4E3A;&#x53C2;&#x6570;&#x3002;</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">myApp.service(<span class="string">&apos;unicornLauncher&apos;</span>, [<span class="string">&apos;apiToken&apos;</span>, UnicornLauncher]);</span><br></pre></td></tr></table></figure><h1 id="provider"><a href="#provider" class="headerlink" title="provider"></a>provider</h1><p><code>provider</code>&#x662F;&#x6838;&#x5FC3;&#x65B9;&#x6CD5;&#xFF0C;&#x5176;&#x4ED6;&#x65B9;&#x6CD5;&#x90FD;&#x662F;&#x5728;&#x57FA;&#x4E8E;&#x5B83;&#x7684;&#x8BED;&#x6CD5;&#x7CD6;&#x3002;&#x5B83;&#x7684;&#x4F5C;&#x7528;&#x662F;&#x5728;&#x5E94;&#x7528;&#x542F;&#x52A8;&#x524D;&#x63D0;&#x4F9B;&#x53EF;&#x914D;&#x7F6E;&#x7684;API&#x3002;&#x901A;&#x5E38;&#x7528;&#x5728;&#x4E00;&#x4E9B;&#x53EF;&#x91CD;&#x7528;&#x7684;&#x670D;&#x52A1;&#xFF0C;&#x5E76;&#x4E14;&#x8FD9;&#x4E9B;&#x670D;&#x52A1;&#x5728;&#x4E0D;&#x540C;&#x7684;&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x4E4B;&#x95F4;&#x9700;&#x8981;&#x4E0D;&#x540C;&#x914D;&#x7F6E;&#x3002;</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">myApp.provider(<span class="string">&apos;unicornLauncher&apos;</span>, <span class="function"><span class="keyword">function</span> <span class="title">UnicornLauncherProvider</span>(<span class="params"></span>) </span>{</span><br><span class="line">  <span class="keyword">var</span> useTinfoilShielding = <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">this</span>.useTinfoilShielding = <span class="function"><span class="keyword">function</span>(<span class="params">value</span>) </span>{</span><br><span class="line">    useTinfoilShielding = !!value;</span><br><span class="line">  };</span><br><span class="line"></span><br><span class="line">  <span class="keyword">this</span>.$<span class="keyword">get</span> = [&quot;apiToken&quot;, function unicornLauncherFactory(apiToken) {</span><br><span class="line"></span><br><span class="line">    <span class="comment">// let&apos;s assume that the UnicornLauncher constructor was also changed to</span></span><br><span class="line">    <span class="comment">// accept and use the useTinfoilShielding argument</span></span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">new</span> UnicornLauncher(apiToken, useTinfoilShielding);</span><br><span class="line">  }];</span><br><span class="line">});</span><br><span class="line"></span><br><span class="line">myApp.config([<span class="string">&quot;unicornLauncherProvider&quot;</span>, <span class="function"><span class="keyword">function</span>(<span class="params">unicornLauncherProvider</span>) </span>{</span><br><span class="line">  unicornLauncherProvider.useTinfoilShielding(<span class="literal">true</span>);</span><br><span class="line">}]);</span><br></pre></td></tr></table></figure><p>&#x5728;&#x5E94;&#x7528;&#x542F;&#x52A8;&#x4E4B;&#x524D;&#xFF0C;AngularJS&#x8C03;&#x7528;<code>config</code>&#x65B9;&#x6CD5;&#x5BF9;&#x670D;&#x52A1;&#x5B8C;&#x6210;&#x914D;&#x7F6E;&#xFF0C;&#x8FD0;&#x884C;&#x9636;&#x6BB5;&#x4F1A;&#x521D;&#x59CB;&#x5316;&#x6240;&#x6709;&#x7684;&#x670D;&#x52A1;&#xFF0C;&#x6240;&#x4EE5;&#xFF0C;&#x5728;&#x914D;&#x7F6E;&#x9636;&#x6BB5;&#x662F;&#x8BBF;&#x95EE;&#x4E0D;&#x5230;&#x670D;&#x52A1;&#xFF0C;&#x5373;&#x4E0D;&#x53EF;&#x6CE8;&#x5165;&#x3002;&#x4E00;&#x65E6;&#x914D;&#x7F6E;&#x9636;&#x6BB5;&#x7ED3;&#x675F;&#xFF0C;&#x5C31;&#x4E0D;&#x80FD;&#x4E0E;provider&#x4EA4;&#x4E92;&#x3002;</p><h1 id="constant"><a href="#constant" class="headerlink" title="constant"></a>constant</h1><p>&#x7531;&#x4E8E;<code>config</code>&#x51FD;&#x6570;&#x5728;&#x6CA1;&#x6709;&#x670D;&#x52A1;&#x53EF;&#x7528;&#x7684;&#x914D;&#x7F6E;&#x9636;&#x6BB5;&#x8FD0;&#x884C;&#xFF0C;&#x6240;&#x4EE5;<code>value</code>&#x65B9;&#x6CD5;&#x521B;&#x5EFA;&#x7684;&#x503C;&#x6216;&#x5BF9;&#x8C61;&#x4E5F;&#x65E0;&#x6CD5;&#x8BBF;&#x95EE;&#x3002;&#x6240;&#x4EE5;&#x4E3A;&#x4E86;&#x5728;&#x914D;&#x7F6E;&#x9636;&#x6BB5;&#x80FD;&#x8BBF;&#x95EE;&#x5230;&#x4E00;&#x4E9B;&#x5E38;&#x91CF;&#xFF0C;&#x5F15;&#x5165;&#x4E86;<code>constant</code>&#x51FD;&#x6570;&#xFF0C;&#x7528;&#x6CD5;&#x548C;<code>value</code>&#x7C7B;&#x4F3C;&#x3002;</p><h1 id="&#x7279;&#x6B8A;&#x7528;&#x9014;&#x5BF9;&#x8C61;"><a href="#&#x7279;&#x6B8A;&#x7528;&#x9014;&#x5BF9;&#x8C61;" class="headerlink" title="&#x7279;&#x6B8A;&#x7528;&#x9014;&#x5BF9;&#x8C61;"></a>&#x7279;&#x6B8A;&#x7528;&#x9014;&#x5BF9;&#x8C61;</h1><p>&#x7531;<code>Controller</code>&#xFF0C;<code>Directive</code>&#xFF0C;<code>Filter</code>&#xFF0C;<code>Animation</code>&#x521B;&#x5EFA;&#x7684;&#x5BF9;&#x8C61;&#xFF0C;&#x548C;<code>factory</code>&#x5199;&#x6CD5;&#x7C7B;&#x4F3C;&#xFF0C;&#x5728;&#x51FD;&#x6570;&#x4E2D;&#x8FD4;&#x56DE;&#x5BF9;&#x8C61;&#x5B9E;&#x4F8B;&#xFF0C;Controller&#x5BF9;&#x8C61;&#x9664;&#x5916;&#x3002;</p><h1 id="&#x603B;&#x7ED3;"><a href="#&#x603B;&#x7ED3;" class="headerlink" title="&#x603B;&#x7ED3;"></a>&#x603B;&#x7ED3;</h1><ul><li>&#x6CE8;&#x5C04;&#x5668;&#x4F7F;&#x7528;&#x8FD9;&#x4E9B;&#x65B9;&#x6CD5;&#x521B;&#x5EFA;&#x4E24;&#x79CD;&#x7C7B;&#x578B;&#x7684;&#x5BF9;&#x8C61;&#xFF1A;&#x670D;&#x52A1;&#x548C;&#x7279;&#x6B8A;&#x7528;&#x9014;&#x5BF9;&#x8C61;</li><li>&#x4E94;&#x79CD;&#x65B9;&#x6CD5;&#x5B9A;&#x4E49;&#x5982;&#x4F55;&#x521B;&#x5EFA;&#x5BF9;&#x8C61;&#xFF1A;value&#xFF0C;factory&#xFF0C;service&#xFF0C;provider&#xFF0C;constant</li><li>factory&#x548C;service&#x662F;&#x6700;&#x5E38;&#x7528;&#x7684;&#x65B9;&#x6CD5;&#xFF0C;&#x5B83;&#x4EEC;&#x4E4B;&#x95F4;&#x552F;&#x4E00;&#x7684;&#x533A;&#x522B;&#x662F;&#xFF0C;service&#x5BF9;&#x4E8E;&#x521B;&#x5EFA;&#x81EA;&#x5B9A;&#x4E49;&#x7C7B;&#x578B;&#x7684;&#x5BF9;&#x8C61;&#x66F4;&#x597D;&#xFF0C;&#x800C;factory&#x65B9;&#x6CD5;&#x53EF;&#x7528;&#x751F;&#x6210;JavaScript&#x57FA;&#x672C;&#x7C7B;&#x578B;&#x548C;&#x51FD;&#x6570;</li><li>provider&#x662F;&#x6838;&#x5FC3;&#x65B9;&#x6CD5;&#xFF0C;&#x5176;&#x4ED6;&#x6240;&#x6709;&#x65B9;&#x6CD5;&#x53EA;&#x662F;&#x5176;&#x4E0A;&#x7684;&#x8BED;&#x6CD5;&#x7CD6;</li><li>provider&#x662F;&#x6700;&#x590D;&#x6742;&#x7684;&#x65B9;&#x6CD5;&#xFF0C;&#x9664;&#x975E;&#x4F60;&#x9700;&#x8981;&#x6784;&#x5EFA;&#x53EF;&#x91CD;&#x7528;&#x7684;&#x4EE3;&#x7801;&#x5757;&#xFF0C;&#x5426;&#x5219;&#x6700;&#x597D;&#x522B;&#x7528;&#x5B83;</li><li>&#x9664;Controller&#x4E4B;&#x5916;&#xFF0C;&#x6240;&#x6709;&#x7279;&#x6B8A;&#x7528;&#x9014;&#x7684;&#x5BF9;&#x8C61;&#x5747;&#x901A;&#x8FC7;factory&#x65B9;&#x6CD5;&#x5B9A;&#x4E49;</li></ul>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;AngularJS 1.x&amp;#x63D0;&amp;#x4F9B;&amp;#x4E86;&amp;#x5982;&amp;#x4E0B;5&amp;#x4E2A;provider&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x4F7F;&amp;#x7528;&amp;#x8FD9;&amp;#x4E9B;&amp;#x65B9;&amp;#x
    
    </summary>
    
      <category term="前端开发" scheme="http://brucewar.cn/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    
      <category term="AngularJS" scheme="http://brucewar.cn/tags/AngularJS/"/>
    
      <category term="Provider" scheme="http://brucewar.cn/tags/Provider/"/>
    
  </entry>
  
  <entry>
    <title>青岛三日游攻略</title>
    <link href="http://brucewar.cn/2017/05/13/%E9%9D%92%E5%B2%9B%E4%B8%89%E6%97%A5%E6%B8%B8%E6%94%BB%E7%95%A5/"/>
    <id>http://brucewar.cn/2017/05/13/青岛三日游攻略/</id>
    <published>2017-05-13T01:48:21.000Z</published>
    <updated>2017-05-14T06:41:13.636Z</updated>
    
    <content type="html"><![CDATA[<h1 id="&#x5E02;&#x5357;&#x533A;"><a href="#&#x5E02;&#x5357;&#x533A;" class="headerlink" title="&#x5E02;&#x5357;&#x533A;"></a>&#x5E02;&#x5357;&#x533A;</h1><p>&#x6808;&#x6865;&#x3001;&#x6D77;&#x519B;&#x535A;&#x7269;&#x9986;&#x3001;&#x9C81;&#x8FC5;&#x516C;&#x56ED;&#x3001;&#x5C0F;&#x9752;&#x5C9B;&#x3001;&#x7B2C;&#x4E00;&#x6D77;&#x6C34;&#x6D74;&#x573A;&#x3001;&#x516B;&#x5927;&#x5173;&#x3001;&#x97F3;&#x4E50;&#x5E7F;&#x573A;&#x3001;&#x4E94;&#x56DB;&#x5E7F;&#x573A;&#x3001;&#x9752;&#x5C9B;&#x5965;&#x6797;&#x5339;&#x514B;&#x5E06;&#x8239;&#x4E2D;&#x5FC3;</p><h1 id="&#x5E02;&#x5317;&#x533A;"><a href="#&#x5E02;&#x5317;&#x533A;" class="headerlink" title="&#x5E02;&#x5317;&#x533A;"></a>&#x5E02;&#x5317;&#x533A;</h1><p>&#x5564;&#x9152;&#x4E00;&#x6761;&#x8857;&#x3001;&#x9752;&#x5C9B;&#x5564;&#x9152;&#x535A;&#x7269;&#x9986;&#x3001;&#x5929;&#x5E55;&#x57CE;&#x3001;&#x5288;&#x67F4;&#x9662;&#x3001;&#x5D02;&#x5C71;</p><h1 id="Day1"><a href="#Day1" class="headerlink" title="Day1"></a>Day1</h1><p>&#x5982;&#x679C;&#x5230;&#x9152;&#x5E97;&#x8FD8;&#x65E9;&#xFF0C;&#x5C31;&#x53BB;&#x767B;&#x5DDE;&#x8DEF;&#x548C;&#x6216;&#x8005;&#x53F0;&#x4E1C;&#x6B65;&#x884C;&#x8857;&#x8F6C;&#x8F6C;</p><h2 id="&#x767B;&#x5DDE;&#x8DEF;"><a href="#&#x767B;&#x5DDE;&#x8DEF;" class="headerlink" title="&#x767B;&#x5DDE;&#x8DEF;"></a>&#x767B;&#x5DDE;&#x8DEF;</h2><p>&#x5564;&#x9152;&#x4E00;&#x6761;&#x8857;&#x3001;&#x9752;&#x5C9B;&#x5564;&#x9152;&#x535A;&#x7269;&#x9986;&#x3001;&#x5929;&#x5E55;&#x57CE;</p><h1 id="Day2"><a href="#Day2" class="headerlink" title="Day2"></a>Day2</h1><h2 id="&#x5D02;&#x5C71;"><a href="#&#x5D02;&#x5C71;" class="headerlink" title="&#x5D02;&#x5C71;"></a>&#x5D02;&#x5C71;</h2><p>&#x5357;&#x7EBF;&#xFF1A;&#x9999;&#x6E2F;&#x4E1C;&#x8DEF;&#x6216;&#x4E1C;&#x6D77;&#x4E1C;&#x8DEF; &#x2014;&#x2014;&gt; &#x6C99;&#x5B50;&#x53E3; &#x2014;&#x2014;&gt; &#x767B;&#x8D62; &#x2014;&#x2014;&gt; &#x6D41;&#x6E05;&#x6CB3; &#x2014;&#x2014;&gt; &#x592A;&#x6E05;&#x5BAB; &#x2014;&#x2014;&gt; &#x4E0A;&#x6E05;&#x666F;&#x533A;&#x6216;&#x5DE8;&#x5CF0;&#x666F;&#x533A;&#xFF08;&#x65F6;&#x95F4;&#x5141;&#x8BB8;&#xFF09;</p><p>&#x4EA4;&#x901A;&#xFF1A;&#x65C5;&#x6E38;&#x4E13;&#x7EBF;&#x3001;&#x516C;&#x4EA4;104&#x3001;113&#x3001;304</p><p>&#x5982;&#x679C;&#x56DE;&#x6765;&#x6BD4;&#x8F83;&#x65E9;&#xFF0C;&#x53EF;&#x4EE5;&#x53BB;&#x4E94;&#x56DB;&#x5E7F;&#x573A;&#x3001;&#x5965;&#x6797;&#x5339;&#x514B;&#x5E06;&#x8239;&#x4E2D;&#x5FC3;<br>&#x9999;&#x6E2F;&#x4E2D;&#x8DEF;&#xFF1A;&#x5BB6;&#x4E50;&#x798F;&#x3001;&#x4F73;&#x4E16;&#x5BA2; &#x5BB6;&#x4E50;&#x798F;&#x5BF9;&#x9762;&#x9633;&#x5149;&#x767E;&#x8D27;&#x3001;&#x4F73;&#x4E16;&#x5BA2;&#x540E;&#x9762;&#x6D77;&#x4FE1;&#x5E7F;&#x573A;&#xFF0C;&#x767E;&#x4E3D;&#x5E7F;&#x573A;</p><h1 id="Day3"><a href="#Day3" class="headerlink" title="Day3"></a>Day3</h1><p>&#x6D77;&#x5E95;&#x4E16;&#x754C;&#x3001;&#x516B;&#x5927;&#x5173;&#x3001;&#x6808;&#x6865;&#x3001;&#x4E2D;&#x5C71;&#x8DEF;&#x3001;&#x5288;&#x67F4;&#x9662;</p><p>&#x6C11;&#x4FD7;&#x5C0F;&#x5403;&#x8857;&#xFF0C;&#x738B;&#x59D0;&#x70E7;&#x70E4;&#xFF0C;&#x9AD8;&#x5BB6;&#x9505;&#x8D34;&#xFF0C;<br>&#x5546;&#x4E1A;&#x8857;&#xFF1A;&#x53F0;&#x4E1C;&#x5546;&#x4E1A;&#x533A;&#x3001;&#x9999;&#x6E2F;&#x4E2D;&#x8DEF;&#x3001;&#x4E2D;&#x5C71;&#x8DEF;&#x5546;&#x4E1A;&#x533A;&#x3001;&#x674E;&#x6751;&#x5546;&#x4E1A;&#x533A;<br>&#x4E2D;&#x5C71;&#x8DEF;&#x591C;&#x666F;&#x5F88;&#x7F8E;<br>&#x4E2D;&#x5C71;&#x8DEF;&#xFF08;&#x7F8E;&#x8FBE;&#x5C14;&#x70E7;&#x70E4;&#xFF09;&#x3001;&#x5723;&#x5F25;&#x989D;&#x5C14;&#x6559;&#x5802;</p>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;&amp;#x5E02;&amp;#x5357;&amp;#x533A;&quot;&gt;&lt;a href=&quot;#&amp;#x5E02;&amp;#x5357;&amp;#x533A;&quot; class=&quot;headerlink&quot; title=&quot;&amp;#x5E02;&amp;#x5357;&amp;#x533A;&quot;&gt;&lt;/a&gt;&amp;#x5E02;&amp;#x535
    
    </summary>
    
      <category term="旅行" scheme="http://brucewar.cn/categories/%E6%97%85%E8%A1%8C/"/>
    
    
      <category term="青岛" scheme="http://brucewar.cn/tags/%E9%9D%92%E5%B2%9B/"/>
    
      <category term="自由行" scheme="http://brucewar.cn/tags/%E8%87%AA%E7%94%B1%E8%A1%8C/"/>
    
      <category term="旅游攻略" scheme="http://brucewar.cn/tags/%E6%97%85%E6%B8%B8%E6%94%BB%E7%95%A5/"/>
    
  </entry>
  
  <entry>
    <title>RESTful web API文档生成器</title>
    <link href="http://brucewar.cn/2017/05/10/RESTful-web-API%E6%96%87%E6%A1%A3%E7%94%9F%E6%88%90%E5%99%A8/"/>
    <id>http://brucewar.cn/2017/05/10/RESTful-web-API文档生成器/</id>
    <published>2017-05-10T05:45:49.000Z</published>
    <updated>2017-05-10T16:11:48.016Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>&#x95EE;&#xFF1A;&#x5F00;&#x53D1;&#x4E1A;&#x52A1;&#x6A21;&#x5757;&#x4EE3;&#x7801;&#x6700;&#x91CD;&#x8981;&#x7684;&#x662F;&#x4EC0;&#x4E48;&#xFF1F;<br>&#x7B54;&#xFF1A;API&#x63A5;&#x53E3;&#x6587;&#x6863;</p></blockquote><p>&#x5982;&#x679C;&#x4F60;&#x662F;&#x540E;&#x53F0;&#x5F00;&#x53D1;&#xFF0C;&#x662F;&#x5426;&#x4F1A;&#x6709;&#x4EE5;&#x4E0B;&#x56F0;&#x6270;&#xFF1A;</p><ul><li>&#x5F00;&#x53D1;API&#x63A5;&#x53E3;&#xFF0C;&#x8FD8;&#x8981;&#x901A;&#x8FC7;wiki&#x5199;&#x63A5;&#x53E3;&#x6587;&#x6863;&#xFF0C;&#x4E25;&#x91CD;&#x5F71;&#x54CD;&#x6548;&#x7387;</li><li>&#x63A5;&#x53E3;&#x4E0D;&#x662F;&#x4E00;&#x6B21;&#x5C31;&#x80FD;&#x5B9A;&#x4E0B;&#x6765;&#x7684;&#xFF0C;&#x540E;&#x7EED;&#x53EF;&#x80FD;&#x8FD8;&#x8981;&#x7EF4;&#x62A4;&#xFF0C;&#x6240;&#x4EE5;&#x8FD8;&#x9700;&#x8981;&#x53BB;&#x4FEE;&#x6539;&#x6587;&#x6863;</li></ul><p>&#x5982;&#x679C;&#x4F60;&#x662F;&#x524D;&#x7AEF;&#x5DE5;&#x7A0B;&#x5E08;&#xFF0C;&#x662F;&#x5426;&#x6709;&#x8FC7;&#x4E0B;&#x9762;&#x7684;&#x56F0;&#x6270;&#xFF1A;</p><ul><li>&#x8FD4;&#x56DE;&#x7684;&#x6570;&#x636E;&#x600E;&#x4E48;&#x5C11;&#x5B57;&#x6BB5;&#xFF0C;&#x540E;&#x53F0;&#x4EC0;&#x4E48;&#x65F6;&#x5019;&#x6539;&#x4E86;&#x63A5;&#x53E3;</li></ul><p>&#x6211;&#x4EEC;&#x603B;&#x662F;&#x5410;&#x69FD;&#x6587;&#x6863;&#x4E0D;&#x5168;&#xFF0C;&#x6587;&#x6863;&#x5199;&#x7684;&#x4E0D;&#x597D;&#xFF0C;&#x7136;&#x800C;&#x5374;&#x6CA1;&#x6709;&#x60F3;&#x5230;&#x5F00;&#x53D1;&#x7684;&#x540C;&#x65F6;&#x987A;&#x4FBF;&#x628A;&#x6587;&#x6863;&#x4E5F;&#x5199;&#x4E86;&#x3002;&#x8FD9;&#x7BC7;&#x535A;&#x6587;&#x7684;&#x91CD;&#x70B9;&#x5C31;&#x662F;&#x4E3A;&#x5927;&#x5BB6;&#x4ECB;&#x7ECD;&#x4E00;&#x6B3E;&#x751F;&#x6210;RESTful web API&#x6587;&#x6863;&#x7684;&#x795E;&#x5668;&#x2014;&#x2014;<a href="http://apidocjs.com" target="_blank" rel="external">apidoc</a>&#xFF0C;GitHub 4000&#x591A;star&#x3002;&#x8FD9;&#x6B3E;&#x795E;&#x5668;&#x901A;&#x8FC7;&#x6E90;&#x4EE3;&#x7801;&#x4E2D;&#x7684;&#x6CE8;&#x91CA;&#x751F;&#x6210;&#x6700;&#x7EC8;&#x7684;&#x6587;&#x6863;&#xFF0C;&#x6240;&#x4EE5;&#x9700;&#x8981;&#x6309;&#x7167;&#x89C4;&#x8303;&#x7F16;&#x5199;&#x6CE8;&#x91CA;&#x3002;</p><h1 id="&#x5B89;&#x88C5;&#x548C;&#x4F7F;&#x7528;"><a href="#&#x5B89;&#x88C5;&#x548C;&#x4F7F;&#x7528;" class="headerlink" title="&#x5B89;&#x88C5;&#x548C;&#x4F7F;&#x7528;"></a>&#x5B89;&#x88C5;&#x548C;&#x4F7F;&#x7528;</h1><h2 id="&#x524D;&#x8A00;"><a href="#&#x524D;&#x8A00;" class="headerlink" title="&#x524D;&#x8A00;"></a>&#x524D;&#x8A00;</h2><p>&#x6587;&#x4E2D;&#x7684;&#x4F8B;&#x5B50;&#x5168;&#x90E8;&#x4F7F;&#x7528;Javadoc-Style&#x7F16;&#x5199;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x5728;&#x6240;&#x6709;&#x652F;&#x6301;Javadoc&#x7684;&#x8BED;&#x8A00;&#xFF08;&#x5982;C#, Go, Dart, Java, JavaScript, PHP, TypeScript&#x7B49;&#xFF09;&#x4E2D;&#x4F7F;&#x7528;&#x3002;&#x5176;&#x4ED6;&#x8BED;&#x8A00;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x5B83;&#x4EEC;&#x7279;&#x5B9A;&#x7684;&#x591A;&#x884C;&#x6CE8;&#x91CA;&#x3002;</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span><br><span class="line"> * This is a comment.</span><br><span class="line"> */</span></span><br></pre></td></tr></table></figure><h2 id="&#x5B89;&#x88C5;"><a href="#&#x5B89;&#x88C5;" class="headerlink" title="&#x5B89;&#x88C5;"></a>&#x5B89;&#x88C5;</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install apidoc -g</span><br></pre></td></tr></table></figure><h2 id="&#x4F7F;&#x7528;"><a href="#&#x4F7F;&#x7528;" class="headerlink" title="&#x4F7F;&#x7528;"></a>&#x4F7F;&#x7528;</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">apidoc -i myapp/ -o apidoc/ -t mytemplate/</span><br></pre></td></tr></table></figure><p>&#x4F7F;&#x7528;<code>mytemplate/</code>&#x4E0B;&#x7684;&#x6A21;&#x677F;&#x6587;&#x4EF6;&#xFF0C;&#x4E3A;<code>myapp/</code>&#x76EE;&#x5F55;&#x4E0B;&#x7684;&#x6240;&#x6709;&#x6587;&#x4EF6;&#x521B;&#x5EFA;api&#x6587;&#x6863;&#xFF0C;&#x5E76;&#x4FDD;&#x5B58;&#x5728;<code>apidoc/</code>&#x76EE;&#x5F55;&#x4E0B;&#x3002;&#x5982;&#x679C;&#x4E0D;&#x5E26;&#x4EFB;&#x4F55;&#x53C2;&#x6570;&#xFF0C;apiDoc&#x4E3A;&#x5F53;&#x524D;&#x76EE;&#x5F55;&#x4EE5;&#x53CA;&#x5B50;&#x76EE;&#x5F55;&#x4E0B;&#x7684;&#x6240;&#x6709;<code>.cs</code>, <code>.dart</code>, <code>.erl</code>, <code>.go</code>, <code>.java</code>, <code>.js</code>, <code>.php</code>, <code>.py</code>, <code>.rb</code>, <code>.ts</code>&#x6587;&#x4EF6;&#x521B;&#x5EFA;&#x6587;&#x6863;&#xFF0C;&#x5E76;&#x4FDD;&#x5B58;&#x5728;<code>./doc/</code>&#x76EE;&#x5F55;&#x3002;</p><h2 id="&#x547D;&#x4EE4;&#x884C;&#x53C2;&#x6570;"><a href="#&#x547D;&#x4EE4;&#x884C;&#x53C2;&#x6570;" class="headerlink" title="&#x547D;&#x4EE4;&#x884C;&#x53C2;&#x6570;"></a>&#x547D;&#x4EE4;&#x884C;&#x53C2;&#x6570;</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># &#x67E5;&#x770B;&#x547D;&#x4EE4;&#x884C;&#x53C2;&#x6570;</span></span><br><span class="line">apidoc -h</span><br></pre></td></tr></table></figure><p>&#x5217;&#x51FA;&#x90E8;&#x5206;&#x91CD;&#x8981;&#x53C2;&#x6570;&#xFF1A;</p><table><thead><tr><th>&#x53C2;&#x6570;</th><th>&#x63CF;&#x8FF0;</th><th>&#x793A;&#x4F8B;</th></tr></thead><tbody><tr><td>-f, &#x2013;file-filters</td><td>&#x901A;&#x8FC7;&#x6B63;&#x5219;&#x8FC7;&#x6EE4;&#x51FA;&#x9700;&#x8981;&#x89E3;&#x6790;&#x7684;&#x6587;&#x4EF6;&#xFF08;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x591A;&#x4E2A;-f&#xFF09;&#x3002;&#x9ED8;&#x8BA4;&#x4E3A;<code>.cs</code>, <code>.dart</code>, <code>.erl</code>, <code>.go</code>, <code>.java</code>, <code>.js</code>, <code>.php</code>, <code>.py</code>, <code>.rb</code>, <code>.ts</code>&#x3002;</td><td>&#x4EC5;&#x89E3;&#x6790;.js&#x548C;.ts&#x6587;&#x4EF6;&#xFF1A;<br><code>apidoc -f &quot;.*\\.js$&quot; -f &quot;.*\\.ts$&quot;</code></td></tr><tr><td>-i, &#x2013;input</td><td>&#x6E90;&#x6587;&#x4EF6;&#x6216;&#x9879;&#x76EE;&#x76EE;&#x5F55;</td><td><code>apidoc -i myapp/</code></td></tr><tr><td>-o, &#x2013;output</td><td>&#x5B58;&#x653E;&#x751F;&#x6210;&#x7684;&#x6587;&#x6863;&#x7684;&#x76EE;&#x5F55;</td><td><code>apidoc -o apidoc/</code></td></tr><tr><td>-t, &#x2013;template</td><td>&#x4E3A;&#x751F;&#x6210;&#x7684;&#x6587;&#x6863;&#x4F7F;&#x7528;&#x6A21;&#x677F;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x521B;&#x5EFA;&#x548C;&#x4F7F;&#x7528;&#x81EA;&#x5DF1;&#x7684;&#x6A21;&#x677F;</td><td><code>apidoc -t mytemplate/</code></td></tr></tbody></table><h2 id="Grunt&#x6A21;&#x5757;"><a href="#Grunt&#x6A21;&#x5757;" class="headerlink" title="Grunt&#x6A21;&#x5757;"></a>Grunt&#x6A21;&#x5757;</h2><p>&#x4F5C;&#x8005;&#x4E5F;&#x4E3A;&#x5927;&#x5BB6;&#x5F00;&#x53D1;&#x4E86;&#x4E00;&#x6B3E;grunt&#x7684;&#x6253;&#x5305;&#x5DE5;&#x5177;<a href="http://github.com/apidoc/grunt-apidoc" target="_blank" rel="external">http://github.com/apidoc/grunt-apidoc</a>&#x3002;</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install grunt-apidoc --save-dev</span><br></pre></td></tr></table></figure><h2 id="&#x6A21;&#x677F;"><a href="#&#x6A21;&#x677F;" class="headerlink" title="&#x6A21;&#x677F;"></a>&#x6A21;&#x677F;</h2><p>apiDoc&#x9ED8;&#x8BA4;&#x6A21;&#x677F;&#xFF1A;&#x4F7F;&#x7528;&#x4E86;<a href="http://handlebarsjs.com/" target="_blank" rel="external">handlebars</a>&#xFF0C;<a href="http://twitter.github.io/bootstrap/" target="_blank" rel="external">Bootstrap</a>&#xFF0C;<a href="http://requirejs.org/" target="_blank" rel="external">RequireJS</a>&#x548C;<a href="http://jquery.com/" target="_blank" rel="external">jQuery</a>&#x4E3A;&#x8F93;&#x51FA;&#x7684;<code>api_data.js</code>&#x548C;<code>api_project.js</code>&#x6587;&#x4EF6;&#x751F;&#x6210;html&#x9875;&#x9762;&#x3002;</p><p>apiDoc&#x9ED8;&#x8BA4;&#x4F7F;&#x7528;&#x4E00;&#x4E2A;&#x590D;&#x6742;&#x7684;&#x6A21;&#x677F;&#xFF0C;&#x652F;&#x6301;&#x5982;&#x4E0B;&#x529F;&#x80FD;&#xFF1A;</p><ul><li>&#x7248;&#x672C;&#x7BA1;&#x7406;&#xFF1A;&#x67E5;&#x770B;&#x4E0D;&#x540C;&#x7248;&#x672C;&#x7684;API</li><li>&#x6BD4;&#x8F83;&#xFF1A;&#x67E5;&#x770B;&#x4E00;&#x4E2A;API&#x7684;&#x4E24;&#x4E2A;&#x7248;&#x672C;&#x4E4B;&#x95F4;&#x7684;&#x533A;&#x522B;</li></ul><p>&#x4F60;&#x4E5F;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x81EA;&#x5DF1;&#x521B;&#x5EFA;&#x7684;&#x6A21;&#x677F;&#xFF0C;&#x4E3A;apiDoc&#x751F;&#x6210;&#x7684;&#x6587;&#x4EF6;<code>api_data.js</code>, <code>api_project.js</code>&#x6216;&#x8005;json&#x683C;&#x5F0F;&#x7684;&#x6587;&#x4EF6;<code>api_data.json</code>, <code>api_project.json</code>&#x3002;</p><p>&#x6A21;&#x677F;&#x6E90;&#x4EE3;&#x7801;&#xFF1A;<a href="https://github.com/apidoc/apidoc/tree/master/template" target="_blank" rel="external">https://github.com/apidoc/apidoc/tree/master/template</a></p><h2 id="&#x6269;&#x5C55;"><a href="#&#x6269;&#x5C55;" class="headerlink" title="&#x6269;&#x5C55;"></a>&#x6269;&#x5C55;</h2><p>apiDoc&#x4E5F;&#x53EF;&#x4EE5;&#x6269;&#x5C55;&#x81EA;&#x5DF1;&#x7684;&#x53C2;&#x6570;&#xFF0C;&#x5177;&#x4F53;&#x7EC6;&#x8282;&#x8BF7;&#x67E5;&#x770B;<a href="https://github.com/apidoc/apidoc-core" target="_blank" rel="external">apidoc/apidoc-core</a>&#x9879;&#x76EE;&#x7684;<code>lib/parsers/</code>, <code>lib/workers/</code>&#x76EE;&#x5F55;&#x3002;</p><h2 id="&#x914D;&#x7F6E;"><a href="#&#x914D;&#x7F6E;" class="headerlink" title="&#x914D;&#x7F6E;"></a>&#x914D;&#x7F6E;</h2><p>apiDoc&#x63D0;&#x4F9B;&#x4E86;&#x4E24;&#x79CD;&#x914D;&#x7F6E;&#x65B9;&#x5F0F;&#xFF0C;&#x8981;&#x4E48;&#x5728;&#x5DE5;&#x7A0B;&#x6839;&#x76EE;&#x5F55;&#x6DFB;&#x52A0;<code>apidoc.json</code>&#x6587;&#x4EF6;&#xFF0C;&#x8981;&#x4E48;&#x5728;<code>package.json</code>&#x4E2D;&#x6DFB;&#x52A0;<code>apidoc</code>&#x5B57;&#x6BB5;&#x3002;</p><p><code>apidoc.json</code></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">{</span><br><span class="line">  <span class="string">&quot;name&quot;</span>: <span class="string">&quot;example&quot;</span>,</span><br><span class="line">  <span class="string">&quot;version&quot;</span>: <span class="string">&quot;0.1.0&quot;</span>,</span><br><span class="line">  <span class="string">&quot;description&quot;</span>: <span class="string">&quot;apiDoc basic example&quot;</span>,</span><br><span class="line">  <span class="string">&quot;title&quot;</span>: <span class="string">&quot;Custom apiDoc browser title&quot;</span>,</span><br><span class="line">  <span class="string">&quot;url&quot;</span> : <span class="string">&quot;https://api.github.com/v1&quot;</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><code>package.json</code></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">{</span><br><span class="line">  <span class="string">&quot;name&quot;</span>: <span class="string">&quot;example&quot;</span>,</span><br><span class="line">  <span class="string">&quot;version&quot;</span>: <span class="string">&quot;0.1.0&quot;</span>,</span><br><span class="line">  <span class="string">&quot;description&quot;</span>: <span class="string">&quot;apiDoc basic example&quot;</span>,</span><br><span class="line">  <span class="string">&quot;apidoc&quot;</span>: {</span><br><span class="line">    <span class="string">&quot;title&quot;</span>: <span class="string">&quot;Custom apiDoc browser title&quot;</span>,</span><br><span class="line">    <span class="string">&quot;url&quot;</span> : <span class="string">&quot;https://api.github.com/v1&quot;</span></span><br><span class="line">  }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>apidoc.json&#x914D;&#x7F6E;&#x5B57;&#x6BB5;</p><table><thead><tr><th>&#x5B57;&#x6BB5;</th><th>&#x63CF;&#x8FF0;</th></tr></thead><tbody><tr><td>name</td><td>&#x5DE5;&#x7A0B;&#x540D;&#x79F0;&#x3002;&#x5982;&#x679C;<code>apidoc.json</code>&#x4E2D;&#x4E0D;&#x5305;&#x542B;&#x6B64;&#x5B57;&#x6BB5;&#xFF0C;&#x5219;&#x7531;<code>package.json&#x786E;&#x5B9A;</code></td></tr><tr><td>version</td><td>&#x5DE5;&#x7A0B;&#x7248;&#x672C;&#x53F7;&#x3002;&#x5982;&#x679C;<code>apidoc.json</code>&#x4E2D;&#x4E0D;&#x5305;&#x542B;&#x6B64;&#x5B57;&#x6BB5;&#xFF0C;&#x5219;&#x7531;<code>package.json&#x786E;&#x5B9A;</code></td></tr><tr><td>description</td><td>&#x5DE5;&#x7A0B;&#x63CF;&#x8FF0;&#x3002;&#x5982;&#x679C;<code>apidoc.json</code>&#x4E2D;&#x4E0D;&#x5305;&#x542B;&#x6B64;&#x5B57;&#x6BB5;&#xFF0C;&#x5219;&#x7531;<code>package.json&#x786E;&#x5B9A;</code></td></tr><tr><td>title</td><td>&#x6587;&#x6863;&#x9875;&#x9762;&#x6807;&#x9898;</td></tr><tr><td>url</td><td>api&#x524D;&#x7F00;&#xFF0C;&#x5982;&#xFF1A;<code>https://api/github.com/v1</code></td></tr><tr><td>sampleUrl</td><td>&#x6D4B;&#x8BD5;api&#x65B9;&#x6CD5;&#x7684;&#x8868;&#x5355;&#x8BF7;&#x6C42;&#x94FE;&#x63A5;&#x66F4;&#x591A;&#x7EC6;&#x8282;&#x8BF7;&#x67E5;&#x770B;<a href="#apiSampleRequest"><code>@apiSampleRequest</code></a></td></tr><tr><td>header</td><td></td></tr><tr><td>&#xA0;&#xA0;&#xA0;&#xA0;title</td><td>&#x88AB;&#x5305;&#x542B;&#x7684;header.md&#x6587;&#x4EF6;&#x7684;&#x5BFC;&#x822A;&#x6587;&#x672C;&#xFF08;&#x67E5;&#x770B;<a href="#header-footer">Header/Footer</a>&#xFF09;</td></tr><tr><td>&#xA0;&#xA0;&#xA0;&#xA0;filename</td><td>&#x88AB;&#x5305;&#x542B;&#x7684;header.md&#x6587;&#x4EF6;&#xFF08;&#x5FC5;&#x987B;&#x4E3A;markdown&#x6587;&#x4EF6;&#xFF09;&#x7684;&#x6587;&#x4EF6;&#x540D;</td></tr><tr><td>footer</td><td></td></tr><tr><td>&#xA0;&#xA0;&#xA0;&#xA0;title</td><td>&#x88AB;&#x5305;&#x542B;&#x7684;footer.md&#x6587;&#x4EF6;&#x7684;&#x5BFC;&#x822A;&#x6587;&#x672C;</td></tr><tr><td>&#xA0;&#xA0;&#xA0;&#xA0;filename</td><td>&#x88AB;&#x5305;&#x542B;&#x7684;footer.md&#x6587;&#x4EF6;&#xFF08;&#x5FC5;&#x987B;&#x4E3A;markdown&#x6587;&#x4EF6;&#xFF09;&#x7684;&#x6587;&#x4EF6;&#x540D;</td></tr><tr><td>order</td><td>&#x8F93;&#x51FA;&#x7684;api&#x540D;&#x548C;api&#x5206;&#x7EC4;&#x540D;&#x7684;&#x987A;&#x5E8F;&#x5217;&#x8868;&#xFF0C;&#x672A;&#x5B9A;&#x4E49;&#x540D;&#x79F0;&#x7684;api&#x81EA;&#x52A8;&#x5728;&#x540E;&#x9762;&#x5C55;&#x793A;&#x3002;<br><code>&quot;order&quot;: [&quot;Error&quot;, &quot;Define&quot;, &quot;PostTitleAndError&quot;, &quot;PostError&quot;]</code></td></tr></tbody></table><p>apiDoc&#x9ED8;&#x8BA4;&#x6A21;&#x677F;&#x7279;&#x5B9A;&#x7684;&#x914D;&#x7F6E;&#x5B57;&#x6BB5;</p><table><thead><tr><th>&#x5B57;&#x6BB5;</th><th>&#x7C7B;&#x578B;</th><th>&#x63CF;&#x8FF0;</th></tr></thead><tbody><tr><td>template</td><td></td><td></td></tr><tr><td>forceLanguage</td><td>String</td><td>&#x7981;&#x7528;&#x6D4F;&#x89C8;&#x5668;&#x81EA;&#x52A8;&#x8BED;&#x8A00;&#x68C0;&#x6D4B;&#xFF0C;&#x5E76;&#x8BBE;&#x7F6E;&#x4E00;&#x4E2A;&#x7279;&#x5B9A;&#x7684;&#x8BED;&#x8A00;&#x3002;&#x4F8B;&#x5982;&#xFF1A;<code>de</code>, <code>en</code>&#x3002;<a href="https://github.com/apidoc/apidoc/tree/master/template/locales" target="_blank" rel="external">&#x53EF;&#x9009;&#x8BED;&#x8A00;</a></td></tr><tr><td>withCompare</td><td>Boolean</td><td>&#x5F00;&#x542F;&#x4E0E;&#x65E7;&#x7248;&#x672C;API&#x6BD4;&#x8F83;&#xFF0C;&#x9ED8;&#x8BA4;<code>true</code></td></tr><tr><td>withGenerator</td><td>Boolean</td><td>&#x5728;&#x9875;&#x5C3E;&#x8F93;&#x51FA;&#x751F;&#x6210;&#x4FE1;&#x606F;&#xFF0C;&#x9ED8;&#x8BA4;<code>true</code></td></tr><tr><td>jQueryAjaxSetup</td><td>Object</td><td>&#x4E3A;Ajax&#x8BF7;&#x6C42;&#x8BBE;&#x7F6E;<a href="http://api.jquery.com/jquery.ajaxsetup/" target="_blank" rel="external">&#x9ED8;&#x8BA4;&#x53C2;&#x6570;</a></td></tr></tbody></table><h2 id="Header-Footer"><a href="#Header-Footer" class="headerlink" title="Header/Footer"></a>Header/Footer</h2><p>&#x5728;<code>apidoc.json</code>&#x6DFB;&#x52A0;header&#x548C;footer&#x3002;</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">{</span><br><span class="line">  <span class="string">&quot;header&quot;</span>: {</span><br><span class="line">    <span class="string">&quot;title&quot;</span>: <span class="string">&quot;My own header title&quot;</span>,</span><br><span class="line">    <span class="string">&quot;filename&quot;</span>: <span class="string">&quot;header.md&quot;</span></span><br><span class="line">  },</span><br><span class="line">  <span class="string">&quot;footer&quot;</span>: {</span><br><span class="line">    <span class="string">&quot;title&quot;</span>: <span class="string">&quot;My own footer title&quot;</span>,</span><br><span class="line">    <span class="string">&quot;filename&quot;</span>: <span class="string">&quot;footer.md&quot;</span></span><br><span class="line">  }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h1 id="&#x793A;&#x4F8B;"><a href="#&#x793A;&#x4F8B;" class="headerlink" title="&#x793A;&#x4F8B;"></a>&#x793A;&#x4F8B;</h1><h2 id="&#x7EE7;&#x627F;"><a href="#&#x7EE7;&#x627F;" class="headerlink" title="&#x7EE7;&#x627F;"></a>&#x7EE7;&#x627F;</h2><p>&#x4F60;&#x53EF;&#x4EE5;&#x5C06;&#x6587;&#x6863;&#x4E2D;&#x591A;&#x6B21;&#x4F7F;&#x7528;&#x7684;&#x90E8;&#x5206;&#x653E;&#x5230;&#x4E00;&#x4E2A;&#x5B9A;&#x4E49;&#x4E2D;&#x3002;&#x5982;&#x4E0B;&#xFF1A;</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@apiDefine <span class="variable">UserNotFoundError</span></span></span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@apiError </span>UserNotFound The id of the User was not found.</span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@apiErrorExample <span class="variable">Error</span></span>-Response:</span><br><span class="line"> *     HTTP/1.1 404 Not Found</span><br><span class="line"> *     {</span><br><span class="line"> *       &quot;error&quot;: &quot;UserNotFound&quot;</span><br><span class="line"> *     }</span><br><span class="line"> */</span></span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{get}</span> </span>/user/:id Request User information</span><br><span class="line"> * <span class="doctag">@apiName <span class="variable">GetUser</span></span></span><br><span class="line"> * <span class="doctag">@apiGroup <span class="variable">User</span></span></span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@apiParam <span class="type">{Number}</span> </span>id Users unique ID.</span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@apiSuccess <span class="type">{String}</span> </span>firstname Firstname of the User.</span><br><span class="line"> * <span class="doctag">@apiSuccess <span class="type">{String}</span> </span>lastname  Lastname of the User.</span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@apiSuccessExample <span class="variable">Success</span></span>-Response:</span><br><span class="line"> *     HTTP/1.1 200 OK</span><br><span class="line"> *     {</span><br><span class="line"> *       &quot;firstname&quot;: &quot;John&quot;,</span><br><span class="line"> *       &quot;lastname&quot;: &quot;Doe&quot;</span><br><span class="line"> *     }</span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@apiUse <span class="variable">UserNotFoundError</span></span></span><br><span class="line"> */</span></span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{put}</span> </span>/user/ Modify User information</span><br><span class="line"> * <span class="doctag">@apiName <span class="variable">PutUser</span></span></span><br><span class="line"> * <span class="doctag">@apiGroup <span class="variable">User</span></span></span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@apiParam <span class="type">{Number}</span> </span>id          Users unique ID.</span><br><span class="line"> * <span class="doctag">@apiParam <span class="type">{String}</span> </span>[firstname] Firstname of the User.</span><br><span class="line"> * <span class="doctag">@apiParam <span class="type">{String}</span> </span>[lastname]  Lastname of the User.</span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@apiSuccessExample <span class="variable">Success</span></span>-Response:</span><br><span class="line"> *     HTTP/1.1 200 OK</span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@apiUse <span class="variable">UserNotFoundError</span></span></span><br><span class="line"> */</span></span><br></pre></td></tr></table></figure><p><strong>&#x7EE7;&#x627F;&#x53EA;&#x80FD;&#x5305;&#x542B;&#x4E00;&#x5C42;</strong>&#xFF0C;&#x591A;&#x5C42;&#x7EA7;&#x5C06;&#x4F1A;&#x964D;&#x4F4E;&#x884C;&#x5185;&#x4EE3;&#x7801;&#x7684;&#x53EF;&#x8BFB;&#x6027;&#xFF0C;&#x589E;&#x52A0;&#x590D;&#x6742;&#x5EA6;&#x3002;</p><h2 id="&#x7248;&#x672C;&#x63A7;&#x5236;"><a href="#&#x7248;&#x672C;&#x63A7;&#x5236;" class="headerlink" title="&#x7248;&#x672C;&#x63A7;&#x5236;"></a>&#x7248;&#x672C;&#x63A7;&#x5236;</h2><p>&#x4FDD;&#x5B58;&#x4E4B;&#x524D;&#x5B9A;&#x4E49;&#x7684;&#x6587;&#x6863;&#x5757;&#xFF0C;&#x7528;&#x4E8E;&#x4E0D;&#x540C;&#x7248;&#x672C;&#x7684;&#x63A5;&#x53E3;&#x6BD4;&#x8F83;&#xFF0C;&#x56E0;&#x6B64;&#x524D;&#x7AEF;&#x5F00;&#x53D1;&#x5F88;&#x5BB9;&#x6613;&#x770B;&#x5230;&#x54EA;&#x4E9B;&#x5730;&#x65B9;&#x6709;&#x53D8;&#x5316;&#x3002;</p><p>&#x5728;&#x4FEE;&#x6539;&#x63A5;&#x53E3;&#x6587;&#x6863;&#x4E4B;&#x524D;&#xFF0C;&#x5C06;&#x5386;&#x53F2;&#x6587;&#x6863;&#x5757;&#x590D;&#x5236;&#x5230;&#x6587;&#x4EF6;<code>_apidoc.js</code>&#x3002;</p><p>&#x6240;&#x4EE5;&#x5728;&#x6BCF;&#x4E2A;&#x6587;&#x6863;&#x5757;&#x8BBE;&#x7F6E;<a href="#apiVersion"><code>@apiVersion</code></a>&#x975E;&#x5E38;&#x91CD;&#x8981;&#x3002;</p><h1 id="apiDoc&#x53C2;&#x6570;"><a href="#apiDoc&#x53C2;&#x6570;" class="headerlink" title="apiDoc&#x53C2;&#x6570;"></a>apiDoc&#x53C2;&#x6570;</h1><p>&#x7ED3;&#x6784;&#x4F53;&#x53C2;&#x6570;<a href="#apiDefine"><code>@apiDefine</code></a>&#x7528;&#x4E8E;&#x5C06;&#x6587;&#x6863;&#x5757;&#x5B9A;&#x4E49;&#x4E3A;&#x53EF;&#x590D;&#x7528;&#x7684;&#x6574;&#x4F53;&#xFF0C;&#x5E76;&#x4E14;&#x53EF;&#x4EE5;&#x5305;&#x542B;&#x5728;api&#x6587;&#x6863;&#x5757;&#x4E2D;&#x3002;</p><p>&#x9664;&#x4E86;&#x5176;&#x5B83;&#x5B9A;&#x4E49;&#x5757;&#xFF0C;&#x4E00;&#x4E2A;&#x5B9A;&#x4E49;&#x7684;&#x5757;&#x4E2D;&#x53EF;&#x4EE5;&#x5305;&#x542B;&#x6240;&#x6709;&#x7684;&#x53C2;&#x6570;&#xFF08;&#x5982;<a href="#apiParam"><code>@apiParam</code></a>&#xFF09;&#x3002;</p><h2 id="api"><a href="#api" class="headerlink" title="@api"></a>@api</h2><p>&#x5FC5;&#x987B;&#x5305;&#x542B;&#x8FD9;&#x4E2A;&#x6807;&#x8BB0;&#xFF0C;&#x5426;&#x5219;apiDoc&#x5C06;&#x4F1A;&#x5FFD;&#x7565;&#x6587;&#x6863;&#x5757;&#x3002;&#x5B9A;&#x4E49;&#x5757;<a href="#apiDefine"><code>@apiDefine</code></a>&#x4E0D;&#x9700;&#x8981;<code>@api</code>&#x3002;</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@api {method} path [title]</span><br></pre></td></tr></table></figure><table><thead><tr><th>&#x5B57;&#x6BB5;</th><th>&#x63CF;&#x8FF0;</th></tr></thead><tbody><tr><td>method</td><td>&#x8BF7;&#x6C42;&#x65B9;&#x6CD5;&#x540D;&#xFF1A;<code>DELETE</code>, <code>GET</code>, <code>POST</code>, <code>PUT</code>, &#x2026;&#x3002;&#x66F4;&#x591A;&#x4FE1;&#x606F;&#x8BF7;&#x67E5;&#x770B;<a href="https://zh.wikipedia.org/wiki/%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE#.E8.AF.B7.E6.B1.82.E6.96.B9.E6.B3.95" target="_blank" rel="external">Wikipedia HTTP&#x8BF7;&#x6C42;&#x65B9;&#x6CD5;</a></td></tr><tr><td>path</td><td>&#x8BF7;&#x6C42;&#x8DEF;&#x5F84;</td></tr><tr><td>title <code>&#x53EF;&#x9009;</code></td><td>&#x7528;&#x4E8E;&#x5BFC;&#x822A;&#x7684;&#x7B80;&#x79F0;</td></tr></tbody></table><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{get}</span> </span>/user/:id</span><br><span class="line"> */</span></span><br></pre></td></tr></table></figure><h2 id="apiDefine"><a href="#apiDefine" class="headerlink" title="@apiDefine"></a>@apiDefine</h2><p>&#x5B9A;&#x4E49;&#x4E00;&#x4E2A;&#x901A;&#x7528;&#x5757;&#x6216;&#x8005;&#x6743;&#x9650;&#x5757;&#xFF0C;&#x6BCF;&#x4E2A;&#x5757;&#x4E2D;&#x53EA;&#x80FD;&#x6709;&#x4E00;&#x4E2A;<code>@apiDefine</code>&#xFF0C;&#x4F7F;&#x7528;<a href="#apiUser"><code>@apiUse</code></a>&#x5BFC;&#x5165;&#x901A;&#x7528;&#x5757;&#x3002;</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">@apiDefine name [title]</span><br><span class="line">    [description]</span><br></pre></td></tr></table></figure><table><thead><tr><th>&#x5B57;&#x6BB5;</th><th>&#x63CF;&#x8FF0;</th></tr></thead><tbody><tr><td>name</td><td>&#x5757;&#x6216;&#x503C;&#x7684;&#x552F;&#x4E00;&#x540D;&#x79F0;</td></tr><tr><td>title <code>&#x53EF;&#x9009;</code></td><td>&#x7B80;&#x79F0;&#xFF0C;&#x53EA;&#x7528;&#x5728;&#x547D;&#x540D;&#x51FD;&#x6570;&#x4E2D;&#xFF0C;&#x5982;<a href="#apiPermission"><code>@apiPermission</code></a>&#x548C;<a href="#apiParam"><code>@apiParam(name)</code></a></td></tr><tr><td>description <code>&#x53EF;&#x9009;</code></td><td>&#x4E0B;&#x4E00;&#x884C;&#x5F00;&#x59CB;&#x7684;&#x8BE6;&#x7EC6;&#x8BF4;&#x660E;&#xFF0C;&#x53EF;&#x4EE5;&#x591A;&#x884C;&#xFF0C;&#x4EC5;&#x7528;&#x5728;&#x547D;&#x540D;&#x51FD;&#x6570;&#xFF0C;&#x5982;<a href="#apiPermission"><code>@apiPermission</code></a></td></tr></tbody></table><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@apiDefine <span class="variable">MyError</span></span></span><br><span class="line"> * <span class="doctag">@apiError </span>UserNotFound The &lt;code&gt;id&lt;/code&gt; of the User was not found.</span><br><span class="line"> */</span></span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{get}</span> </span>/user/:id</span><br><span class="line"> * <span class="doctag">@apiUse <span class="variable">MyError</span></span></span><br><span class="line"> */</span></span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@apiDefine </span>admin User access only</span><br><span class="line"> * This optional description belong to to the group admin.</span><br><span class="line"> */</span></span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{get}</span> </span>/user/:id</span><br><span class="line"> * <span class="doctag">@apiPermission <span class="variable">admin</span></span></span><br><span class="line"> */</span></span><br></pre></td></tr></table></figure><h2 id="apiDeprecated"><a href="#apiDeprecated" class="headerlink" title="@apiDeprecated"></a>@apiDeprecated</h2><p>&#x6807;&#x8BB0;&#x5E9F;&#x5F03;&#x7684;API</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@apiDeprecated [text]</span><br></pre></td></tr></table></figure><table><thead><tr><th>&#x5B57;&#x6BB5;</th><th>&#x63CF;&#x8FF0;</th></tr></thead><tbody><tr><td>text</td><td>&#x591A;&#x884C;&#x6587;&#x672C;</td></tr></tbody></table><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@apiDeprecated </span>*/</span></span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@apiDeprecated </span>use now (#Group:Name).</span><br><span class="line"> *</span><br><span class="line"> * Example: to set a link to the GetDetails method of your group User</span><br><span class="line"> * write (#User:GetDetails)</span><br><span class="line"> */</span></span><br></pre></td></tr></table></figure><h2 id="apiDescription"><a href="#apiDescription" class="headerlink" title="@apiDescription"></a>@apiDescription</h2><p>API&#x7684;&#x8BE6;&#x7EC6;&#x63CF;&#x8FF0;</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@apiDescription text</span><br></pre></td></tr></table></figure><table><thead><tr><th>&#x5B57;&#x6BB5;</th><th>&#x63CF;&#x8FF0;</th></tr></thead><tbody><tr><td>text</td><td>&#x591A;&#x884C;&#x63CF;&#x8FF0;&#x6587;&#x672C;</td></tr></tbody></table><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@apiDescription </span>This is the Description.</span><br><span class="line"> * It is multiline capable.</span><br><span class="line"> *</span><br><span class="line"> * Last line of Description.</span><br><span class="line"> */</span></span><br></pre></td></tr></table></figure><h2 id="apiError"><a href="#apiError" class="headerlink" title="@apiError"></a>@apiError</h2><p>&#x8FD4;&#x56DE;&#x7684;&#x9519;&#x8BEF;&#x53C2;&#x6570;</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@apiError [(group)] [{type}] field [description]</span><br></pre></td></tr></table></figure><table><thead><tr><th>&#x5B57;&#x6BB5;</th><th>&#x63CF;&#x8FF0;</th></tr></thead><tbody><tr><td>(group) <code>&#x53EF;&#x9009;</code></td><td>&#x6240;&#x6709;&#x53C2;&#x6570;&#x6309;&#x8FD9;&#x4E2A;&#x540D;&#x79F0;&#x5206;&#x7EC4;&#xFF0C;&#x5982;&#x679C;&#x672A;&#x8BBE;&#x7F6E;&#x6B64;&#x5B57;&#x6BB5;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A;<code>Error 4xx</code>&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;<a href="#apiDefine"><code>@apiDefine</code></a>&#x8BBE;&#x7F6E;&#x6807;&#x9898;&#x548C;&#x63CF;&#x8FF0;</td></tr><tr><td>{type} <code>&#x53EF;&#x9009;</code></td><td>&#x8FD4;&#x56DE;&#x7C7B;&#x578B;&#xFF0C;&#x4F8B;&#x5982;&#xFF1A;<code>{Boolean}</code>&#xFF0C;<code>{Number}</code>&#xFF0C;<code>{String}</code>&#xFF0C;<code>{Object}</code>&#xFF0C;<code>{String[]}</code>&#xFF08;&#x5B57;&#x7B26;&#x4E32;&#x6570;&#x7EC4;&#xFF09;&#x7B49;</td></tr><tr><td>field</td><td>&#x8FD4;&#x56DE;&#x7684;&#x6807;&#x8BC6;&#x7B26;</td></tr><tr><td>description</td><td>&#x5B57;&#x6BB5;&#x63CF;&#x8FF0;</td></tr></tbody></table><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{get}</span> </span>/user/:id</span><br><span class="line"> * <span class="doctag">@apiError </span>UserNotFound The &lt;code&gt;id&lt;/code&gt; of the User was not found.</span><br><span class="line"> */</span></span><br></pre></td></tr></table></figure><h2 id="apiErrorExample"><a href="#apiErrorExample" class="headerlink" title="@apiErrorExample"></a>@apiErrorExample</h2><p>&#x8FD4;&#x56DE;&#x7684;&#x9519;&#x8BEF;&#x793A;&#x4F8B;&#xFF0C;&#x8F93;&#x51FA;&#x4E3A;&#x683C;&#x5F0F;&#x5316;&#x7684;&#x4EE3;&#x7801;</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">@apiErrorExample [{type}] [title]</span><br><span class="line">    example</span><br></pre></td></tr></table></figure><table><thead><tr><th>&#x5B57;&#x6BB5;</th><th>&#x63CF;&#x8FF0;</th></tr></thead><tbody><tr><td>type <code>&#x53EF;&#x9009;</code></td><td>&#x54CD;&#x5E94;&#x683C;&#x5F0F;</td></tr><tr><td>title <code>&#x53EF;&#x9009;</code></td><td>&#x793A;&#x4F8B;&#x7B80;&#x79F0;</td></tr><tr><td>example</td><td>&#x8BE6;&#x7EC6;&#x793A;&#x4F8B;&#xFF0C;&#x652F;&#x6301;&#x591A;&#x884C;&#x6587;&#x672C;</td></tr></tbody></table><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{get}</span> </span>/user/:id</span><br><span class="line"> * <span class="doctag">@apiErrorExample <span class="type">{json}</span> <span class="variable">Error</span></span>-Response:</span><br><span class="line"> * HTTP/1.1 404 Not Found</span><br><span class="line"> * {</span><br><span class="line"> *   &quot;error&quot;: &quot;UserNotFound&quot;</span><br><span class="line"> * }</span><br><span class="line"> */</span></span><br></pre></td></tr></table></figure><h2 id="apiExample"><a href="#apiExample" class="headerlink" title="@apiExample"></a>@apiExample</h2><p>API&#x7684;&#x4F7F;&#x7528;&#x793A;&#x4F8B;&#xFF0C;&#x8F93;&#x51FA;&#x4E3A;&#x683C;&#x5F0F;&#x5316;&#x7684;&#x4EE3;&#x7801;</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">@apiExample [{type}] title</span><br><span class="line">    example</span><br></pre></td></tr></table></figure><table><thead><tr><th>&#x5B57;&#x6BB5;</th><th>&#x63CF;&#x8FF0;</th></tr></thead><tbody><tr><td>type <code>&#x53EF;&#x9009;</code></td><td>&#x4EE3;&#x7801;&#x8BED;&#x8A00;</td></tr><tr><td>title</td><td>&#x793A;&#x4F8B;&#x7B80;&#x79F0;</td></tr><tr><td>example</td><td>&#x8BE6;&#x7EC6;&#x793A;&#x4F8B;&#xFF0C;&#x652F;&#x6301;&#x591A;&#x884C;&#x6587;&#x672C;</td></tr></tbody></table><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{get}</span> </span>/user/:id</span><br><span class="line"> * <span class="doctag">@apiExample <span class="type">{curl}</span> </span>Example usage:</span><br><span class="line"> * curl -i http://localhost/user/4711</span><br><span class="line"> */</span></span><br></pre></td></tr></table></figure><h2 id="apiGroup"><a href="#apiGroup" class="headerlink" title="@apiGroup"></a>@apiGroup</h2><p>&#x5E94;&#x8BE5;&#x4E00;&#x76F4;&#x4F7F;&#x7528;&#xFF0C;&#x5B9A;&#x4E49;API&#x6587;&#x6863;&#x5757;&#x6240;&#x5C5E;&#x7684;&#x5206;&#x7EC4;&#x3002;&#x5206;&#x7EC4;&#x7528;&#x4E8E;&#x751F;&#x6210;&#x8F93;&#x51FA;&#x4E2D;&#x7684;&#x4E3B;&#x5BFC;&#x822A;&#xFF0C;&#x7ED3;&#x6784;&#x5B9A;&#x4E49;&#x4E0D;&#x9700;&#x8981;<code>@apiGroup</code></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@apiGroup name</span><br></pre></td></tr></table></figure><table><thead><tr><th>&#x5B57;&#x6BB5;</th><th>&#x63CF;&#x8FF0;</th></tr></thead><tbody><tr><td>name</td><td>&#x5206;&#x7EC4;&#x540D;&#x79F0;&#xFF0C;&#x4E5F;&#x7528;&#x4F5C;&#x5BFC;&#x822A;&#x540D;&#x79F0;</td></tr></tbody></table><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{get}</span> </span>/user/:id</span><br><span class="line"> * <span class="doctag">@apiGroup <span class="variable">User</span></span></span><br><span class="line"> */</span></span><br></pre></td></tr></table></figure><h2 id="apiHeader"><a href="#apiHeader" class="headerlink" title="@apiHeader"></a>@apiHeader</h2><p>&#x63CF;&#x8FF0;&#x4F20;&#x9012;&#x7ED9;API&#x7684;&#x8BF7;&#x6C42;&#x5934;&#xFF0C;&#x7C7B;&#x4F3C;<a href="#apiParam"><code>@apiParam</code></a>&#xFF0C;&#x53EA;&#x4E0D;&#x8FC7;&#x8F93;&#x51FA;&#x6587;&#x6863;&#x5728;&#x53C2;&#x6570;&#x4E4B;&#x4E0A;&#x3002;</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@apiHeader [(group)] [{type}] [field=defaultValue] [description]</span><br></pre></td></tr></table></figure><table><thead><tr><th>&#x5B57;&#x6BB5;</th><th>&#x63CF;&#x8FF0;</th></tr></thead><tbody><tr><td>(group) <code>&#x53EF;&#x9009;</code></td><td>&#x6240;&#x6709;&#x53C2;&#x6570;&#x6309;&#x6B64;&#x540D;&#x79F0;&#x5206;&#x7EC4;&#xFF0C;&#x5982;&#x679C;&#x672A;&#x8BBE;&#x7F6E;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A;<code>Parameter</code>&#xFF0C;&#x4F60;&#x4E5F;&#x53EF;&#x4EE5;&#x5728;<a href="#apiDefine"><code>@apiDefine</code></a>&#x4E2D;&#x5B9A;&#x4E49;&#x540D;&#x79F0;&#x548C;&#x63CF;&#x8FF0;</td></tr><tr><td>{type} <code>&#x53EF;&#x9009;</code></td><td>&#x53C2;&#x6570;&#x7C7B;&#x578B;&#xFF0C;&#x4F8B;&#x5982;&#xFF1A;<code>{Boolean}</code>&#xFF0C;<code>{Number}</code>&#xFF0C;<code>{String}</code>&#xFF0C;<code>{Object}</code>&#xFF0C;<code>{String[]}</code>&#xFF08;&#x5B57;&#x7B26;&#x4E32;&#x6570;&#x7EC4;&#xFF09;&#x7B49;</td></tr><tr><td>field</td><td>&#x53D8;&#x91CF;&#x540D;</td></tr><tr><td>[field]</td><td>&#x5E26;&#x62EC;&#x53F7;&#x6807;&#x8BC6;&#x6B64;&#x53C2;&#x6570;&#x53EF;&#x9009;</td></tr><tr><td>=defaultValue <code>&#x53EF;&#x9009;</code></td><td>&#x53C2;&#x6570;&#x9ED8;&#x8BA4;&#x503C;</td></tr><tr><td>&#x63CF;&#x8FF0; <code>&#x53EF;&#x9009;</code></td><td>&#x5B57;&#x6BB5;&#x63CF;&#x8FF0;</td></tr></tbody></table><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{get}</span> </span>/user/:id</span><br><span class="line"> * <span class="doctag">@apiHeader <span class="type">{String}</span> <span class="variable">access</span></span>-key Users unique access-key.</span><br><span class="line"> */</span></span><br></pre></td></tr></table></figure><h2 id="apiHeaderExample"><a href="#apiHeaderExample" class="headerlink" title="@apiHeaderExample"></a>@apiHeaderExample</h2><p>&#x8BF7;&#x6C42;&#x5934;&#x53C2;&#x6570;&#x793A;&#x4F8B;</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">@apiHeaderExample [{type}] [title]</span><br><span class="line">    example</span><br></pre></td></tr></table></figure><table><thead><tr><th>&#x5B57;&#x6BB5;</th><th>&#x63CF;&#x8FF0;</th></tr></thead><tbody><tr><td>type <code>&#x53EF;&#x9009;</code></td><td>&#x8BF7;&#x6C42;&#x683C;&#x5F0F;</td></tr><tr><td>title <code>&#x53EF;&#x9009;</code></td><td>&#x793A;&#x4F8B;&#x7B80;&#x79F0;</td></tr><tr><td>example</td><td>&#x8BE6;&#x7EC6;&#x793A;&#x4F8B;&#xFF0C;&#x652F;&#x6301;&#x591A;&#x884C;&#x6587;&#x672C;</td></tr></tbody></table><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{get}</span> </span>/user/:id</span><br><span class="line"> * <span class="doctag">@apiHeaderExample <span class="type">{json}</span> <span class="variable">Header</span></span>-Example:</span><br><span class="line"> * {</span><br><span class="line"> *   &quot;Accept-Encoding&quot;: &quot;Accept-Encoding: gzip, deflate&quot;</span><br><span class="line"> * }</span><br><span class="line"> */</span></span><br></pre></td></tr></table></figure><h2 id="apiIgnore"><a href="#apiIgnore" class="headerlink" title="@apiIgnore"></a>@apiIgnore</h2><p><code>@apiIgnore</code>&#x5757;&#x4E0D;&#x4F1A;&#x88AB;&#x89E3;&#x6790;&#xFF0C;&#x5982;&#x679C;&#x4F60;&#x5728;&#x6E90;&#x4EE3;&#x7801;&#x4E2D;&#x7559;&#x4E0B;&#x8FC7;&#x671F;&#x6216;&#x8005;&#x672A;&#x5B8C;&#x6210;&#x7684;api&#xFF0C;&#x5E76;&#x4E14;&#x4E0D;&#x60F3;&#x5C06;&#x5176;&#x53D1;&#x5E03;&#x5230;&#x6587;&#x6863;&#x4E2D;&#xFF0C;&#x8FD9;&#x4E2A;&#x6807;&#x8BC6;&#x7B26;&#x975E;&#x5E38;&#x6709;&#x7528;&#x3002;</p><p><strong>&#x5C06;&#x5176;&#x653E;&#x5728;&#x5757;&#x7684;&#x9876;&#x90E8;</strong></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@apiIgnore [hint]</span><br></pre></td></tr></table></figure><table><thead><tr><th>&#x5B57;&#x6BB5;</th><th>&#x63CF;&#x8FF0;</th></tr></thead><tbody><tr><td>hint <code>&#x53EF;&#x9009;</code></td><td>&#x5FFD;&#x7565;&#x539F;&#x56E0;&#x7684;&#x7B80;&#x77ED;&#x4FE1;&#x606F;</td></tr></tbody></table><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@apiIgnore </span>Not finished Method</span><br><span class="line"> * <span class="doctag">@api <span class="type">{get}</span> </span>/user/:id</span><br><span class="line"> */</span></span><br></pre></td></tr></table></figure><h2 id="apiName"><a href="#apiName" class="headerlink" title="@apiName"></a>@apiName</h2><p>&#x5E94;&#x8BE5;&#x6C38;&#x8FDC;&#x4F7F;&#x7528;&#xFF0C;&#x5B9A;&#x4E49;API&#x6587;&#x6863;&#x5757;&#x7684;&#x540D;&#x79F0;&#xFF0C;&#x540D;&#x79F0;&#x5C06;&#x7528;&#x4E8E;&#x751F;&#x6210;&#x8F93;&#x51FA;&#x6587;&#x6863;&#x4E2D;&#x7684;&#x5B50;&#x5BFC;&#x822A;&#x3002;&#x7ED3;&#x6784;&#x5B9A;&#x4E49;&#x4E0D;&#x9700;&#x8981;<code>@apiName</code></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@apiName name</span><br></pre></td></tr></table></figure><table><thead><tr><th>&#x5B57;&#x6BB5;</th><th>&#x63CF;&#x8FF0;</th></tr></thead><tbody><tr><td>name</td><td>API&#x7684;&#x552F;&#x4E00;&#x540D;&#x79F0;&#xFF0C;&#x53EF;&#x4EE5;&#x4E3A;&#x4E0D;&#x540C;&#x7684;<a href="#apiVersion"><code>@apiVersion</code></a>&#x5B9A;&#x4E49;&#x76F8;&#x540C;&#x7684;&#x540D;&#x79F0;</td></tr></tbody></table><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{get}</span> </span>/user/:id</span><br><span class="line"> * <span class="doctag">@apiName <span class="variable">GetUser</span></span></span><br><span class="line"> */</span></span><br></pre></td></tr></table></figure><h2 id="apiParam"><a href="#apiParam" class="headerlink" title="@apiParam"></a>@apiParam</h2><p>&#x5B9A;&#x4E49;&#x4F20;&#x9012;&#x7ED9;API&#x7684;&#x53C2;&#x6570;</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@apiParam [(group)] [{type}] [field=defultValue] [description]</span><br></pre></td></tr></table></figure><table><thead><tr><th>&#x5B57;&#x6BB5;</th><th>&#x63CF;&#x8FF0;</th></tr></thead><tbody><tr><td>(group) <code>&#x53EF;&#x9009;</code></td><td>&#x6240;&#x6709;&#x53C2;&#x6570;&#x6309;&#x6B64;&#x540D;&#x79F0;&#x5206;&#x7EC4;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A;<code>Parameter</code>&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x5728;<a href="#apiDefine"><code>@apiDefine</code></a>&#x4E2D;&#x5B9A;&#x4E49;&#x540D;&#x79F0;&#x548C;&#x63CF;&#x8FF0;</td></tr><tr><td>{type} <code>&#x53EF;&#x9009;</code></td><td>&#x53C2;&#x6570;&#x7C7B;&#x578B;&#xFF0C;&#x4F8B;&#x5982;&#xFF1A;<code>{Boolean}</code>&#xFF0C;<code>{Number}</code>&#xFF0C;<code>{String}</code>&#xFF0C;<code>{Object}</code>&#xFF0C;<code>{String[]}</code>&#xFF08;&#x5B57;&#x7B26;&#x4E32;&#x6570;&#x7EC4;&#xFF09;&#x7B49;</td></tr><tr><td>{type{size}} <code>&#x53EF;&#x9009;</code></td><td>&#x53D8;&#x91CF;&#x5927;&#x5C0F;&#x4FE1;&#x606F;<br><code>{string{..5}}</code> &#x6700;&#x591A;5&#x4E2A;&#x5B57;&#x7B26;&#x7684;&#x5B57;&#x7B26;&#x4E32;<br><code>{string{2..5}}</code> &#x6700;&#x5C11;2&#x4E2A;&#x5B57;&#x7B26;&#xFF0C;&#x6700;&#x591A;5&#x4E2A;&#x5B57;&#x7B26;&#x7684;&#x5B57;&#x7B26;&#x4E32;<br><code>{Number{100-999}}</code> &#x4ECB;&#x4E8E;100&#x548C;999&#x4E4B;&#x95F4;&#x7684;&#x6570;&#x5B57;</td></tr><tr><td>{type=allowedValues} <code>&#x53EF;&#x9009;</code></td><td>&#x53D8;&#x91CF;&#x5141;&#x8BB8;&#x7684;&#x503C;<br><code>{string=&quot;small&quot;}</code> &#x53EA;&#x80FD;&#x5305;&#x542B;&#x201D;small&#x201D;&#x7684;&#x5B57;&#x7B26;&#x4E32;<br><code>{string=&quot;small&quot;,&quot;huge&quot;}</code> &#x5305;&#x542B;&#x201D;small&#x201D;&#x6216;&#x201D;huge&#x201D;&#x7684;&#x5B57;&#x7B26;&#x4E32;<br><code>{number=1,2,3,99}</code> &#x5141;&#x8BB8;&#x4E3A;1,2,3,99&#x4E2D;&#x7684;&#x4E00;&#x4E2A;&#x503C;<br><code>{string {..5}=&quot;small&quot;,&quot;huge&quot;}</code> &#x6700;&#x591A;5&#x4E2A;&#x5B57;&#x7B26;&#x7684;&#x5B57;&#x7B26;&#x4E32;&#xFF0C;&#x5E76;&#x4E14;&#x53EA;&#x80FD;&#x5305;&#x542B;&#x201D;small&#x201D;&#x548C;&#x201D;huge&#x201D;</td></tr><tr><td>field</td><td>&#x53C2;&#x6570;&#x540D;</td></tr><tr><td>[field]</td><td>&#x5E26;&#x62EC;&#x53F7;&#x6807;&#x8BC6;&#x6B64;&#x53C2;&#x6570;&#x53EF;&#x9009;</td></tr><tr><td>=defaultValue <code>&#x53EF;&#x9009;</code></td><td>&#x53C2;&#x6570;&#x9ED8;&#x8BA4;&#x503C;</td></tr><tr><td>description <code>&#x53EF;&#x9009;</code></td><td>&#x53C2;&#x6570;&#x63CF;&#x8FF0;</td></tr></tbody></table><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{get}</span> </span>/user/:id</span><br><span class="line"> * <span class="doctag">@apiParam <span class="type">{Number}</span> </span>id Users unique ID.</span><br><span class="line"> */</span></span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{post}</span> </span>/user/</span><br><span class="line"> * <span class="doctag">@apiParam <span class="type">{String}</span> </span>[firstname] Optional Firstname of the User.</span><br><span class="line"> * <span class="doctag">@apiParam <span class="type">{String}</span> </span>lastname Mandatory Lastname.</span><br><span class="line"> * <span class="doctag">@apiParam <span class="type">{String}</span> </span>country=&quot;DE&quot; Mandatory with default value &quot;DE&quot;.</span><br><span class="line"> * <span class="doctag">@apiParam <span class="type">{Number}</span> </span>[age=18] Optional Age with default 18.</span><br><span class="line"> *</span><br><span class="line"> * <span class="doctag">@apiParam </span>(Login) {String} pass Only logged in users can post this.</span><br><span class="line"> *        In generated documentation a separate</span><br><span class="line"> *        &quot;Login&quot; Block will be generated.</span><br><span class="line"> */</span></span><br></pre></td></tr></table></figure><h2 id="apiParamExample"><a href="#apiParamExample" class="headerlink" title="@apiParamExample"></a>@apiParamExample</h2><p>&#x8BF7;&#x6C42;&#x53C2;&#x6570;&#x793A;&#x4F8B;</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">@apiParamExample [{type}] [title]</span><br><span class="line">    example</span><br></pre></td></tr></table></figure><table><thead><tr><th>&#x5B57;&#x6BB5;</th><th>&#x63CF;&#x8FF0;</th></tr></thead><tbody><tr><td>type <code>&#x53EF;&#x9009;</code></td><td>&#x8BF7;&#x6C42;&#x683C;&#x5F0F;</td></tr><tr><td>title <code>&#x53EF;&#x9009;</code></td><td>&#x793A;&#x4F8B;&#x7B80;&#x79F0;</td></tr><tr><td>example</td><td>&#x8BE6;&#x7EC6;&#x793A;&#x4F8B;&#xFF0C;&#x652F;&#x6301;&#x591A;&#x884C;&#x6587;&#x672C;</td></tr></tbody></table><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{get}</span> </span>/user/:id</span><br><span class="line"> * <span class="doctag">@apiParamExample <span class="type">{json}</span> <span class="variable">Request</span></span>-Example:</span><br><span class="line"> * {</span><br><span class="line"> *   &quot;id&quot;: 4711</span><br><span class="line"> * }</span><br><span class="line"> */</span></span><br></pre></td></tr></table></figure><h2 id="apiPermission"><a href="#apiPermission" class="headerlink" title="@apiPermission"></a>@apiPermission</h2><p>&#x6743;&#x9650;&#x540D;&#x79F0;&#xFF0C;&#x5982;&#x679C;&#x7528;<a href="#apiDefine"><code>@apiDefine</code></a>&#x5B9A;&#x4E49;&#x540D;&#x79F0;&#xFF0C;&#x751F;&#x6210;&#x7684;&#x6587;&#x6863;&#x5C06;&#x4F1A;&#x5305;&#x542B;&#x989D;&#x5916;&#x7684;&#x540D;&#x79F0;&#x548C;&#x63CF;&#x8FF0;</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@apiPermission name</span><br></pre></td></tr></table></figure><table><thead><tr><th>&#x5B57;&#x6BB5;</th><th>&#x63CF;&#x8FF0;</th></tr></thead><tbody><tr><td>name</td><td>&#x6743;&#x9650;&#x552F;&#x4E00;&#x7684;&#x540D;&#x79F0;</td></tr></tbody></table><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{get}</span> </span>/user/:id</span><br><span class="line"> * <span class="doctag">@apiPermission <span class="variable">none</span></span></span><br><span class="line"> */</span></span><br></pre></td></tr></table></figure><h2 id="apiSampleRequest"><a href="#apiSampleRequest" class="headerlink" title="@apiSampleRequest"></a>@apiSampleRequest</h2><p>&#x6B64;&#x53C2;&#x6570;&#x914D;&#x5408;<code>apidoc.json</code>&#x914D;&#x7F6E;&#x4E2D;&#x7684;<code>sampleUrl</code>&#x53C2;&#x6570;&#x4F7F;&#x7528;&#xFF0C;&#x5982;&#x679C;&#x914D;&#x7F6E;&#x4E86;<code>sampleUrl</code>&#xFF0C;&#x6240;&#x6709;API&#x65B9;&#x6CD5;&#x90FD;&#x5C06;&#x6709;api&#x6D4B;&#x8BD5;&#x8868;&#x5355;&#xFF0C;&#x5E76;&#x8FFD;&#x52A0;&#x5728;<a href="#api"><code>@api</code></a>&#x7ED3;&#x675F;&#x4F4D;&#x7F6E;&#x3002;&#x5982;&#x679C;&#x672A;&#x914D;&#x7F6E;<code>sampleUrl</code>&#xFF0C;&#x4EC5;&#x5305;&#x542B;<code>@apiSampleRequest</code>&#x7684;&#x65B9;&#x6CD5;&#x6709;&#x6D4B;&#x8BD5;&#x8868;&#x5355;&#x3002;<br>&#x5982;&#x679C;&#x5728;&#x65B9;&#x6CD5;&#x5757;&#x4E2D;&#x914D;&#x7F6E;&#x4E86;<code>@apiSampleRequest url</code>&#xFF0C;&#x8FD9;&#x4E2A;url&#x4F5C;&#x4E3A;&#x8BF7;&#x6C42;&#x5730;&#x5740;&#xFF08;&#x5F53;&#x5B83;&#x4EE5;http&#x5F00;&#x5934;&#xFF0C;&#x4F1A;&#x8986;&#x76D6;<code>sampleUrl</code>&#xFF09;<br>&#x5982;&#x679C;&#x914D;&#x7F6E;&#x4E86;<code>sampleUrl</code>&#xFF0C;&#x5E76;&#x4E14;&#x60F3;&#x5728;&#x6307;&#x5B9A;&#x65B9;&#x6CD5;&#x4E0D;&#x5305;&#x542B;&#x6D4B;&#x8BD5;&#x8868;&#x5355;&#xFF0C;&#x53EF;&#x4EE5;&#x5728;&#x6587;&#x6863;&#x5757;&#x4E2D;&#x914D;&#x7F6E;<code>@apiSampleRequest off</code>&#x3002;</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@apiSampleRequest url</span><br></pre></td></tr></table></figure><table><thead><tr><th>&#x5B57;&#x6BB5;</th><th>&#x63CF;&#x8FF0;</th></tr></thead><tbody><tr><td>url</td><td>&#x6D4B;&#x8BD5;api&#x670D;&#x52A1;&#x5730;&#x5740;<br><code>@apiSampleRequest http://www.example.com</code><br><code>@apiSampleRequest /my_test_path</code><br><code>@apiSampleRequest off</code></td></tr></tbody></table><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Configuration parameter sampleUrl: &quot;http://api.github.com&quot;</span></span><br><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{get}</span> </span>/user/:id</span><br><span class="line"> */</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Configuration parameter sampleUrl: &quot;http://api.github.com&quot;</span></span><br><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{get}</span> </span>/user/:id</span><br><span class="line"> * <span class="doctag">@apiSampleRequest </span>http://test.github.com/some_path/</span><br><span class="line"> */</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Configuration parameter sampleUrl: &quot;http://api.github.com&quot;</span></span><br><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{get}</span> </span>/user/:id</span><br><span class="line"> * <span class="doctag">@apiSampleRequest </span>/test</span><br><span class="line"> */</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Configuration parameter sampleUrl: &quot;http://api.github.com&quot;</span></span><br><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{get}</span> </span>/user/:id</span><br><span class="line"> * <span class="doctag">@apiSampleRequest <span class="variable">off</span></span></span><br><span class="line"> */</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Configuration parameter sampleUrl is not set</span></span><br><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{get}</span> </span>/user/:id</span><br><span class="line"> * <span class="doctag">@apiSampleRequest </span>http://api.github.com/some_path/</span><br><span class="line"> */</span></span><br></pre></td></tr></table></figure><h2 id="apiSuccess"><a href="#apiSuccess" class="headerlink" title="@apiSuccess"></a>@apiSuccess</h2><p>&#x6210;&#x529F;&#x8FD4;&#x56DE;&#x7684;&#x53C2;&#x6570;</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@apiSuccess [(group)] [{type}] field [description]</span><br></pre></td></tr></table></figure><table><thead><tr><th>&#x5B57;&#x6BB5;</th><th>&#x63CF;&#x8FF0;</th></tr></thead><tbody><tr><td>(group) <code>&#x53EF;&#x9009;</code></td><td>&#x6240;&#x6709;&#x53C2;&#x6570;&#x6309;&#x6B64;&#x540D;&#x79F0;&#x5206;&#x7EC4;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A;<code>Success 200</code>&#xFF0C;&#x53EF;&#x4EE5;&#x5728;<a href="#apiDefine"><code>@apiDefine</code></a>&#x4E2D;&#x5B9A;&#x4E49;&#x540D;&#x79F0;&#x548C;&#x63CF;&#x8FF0;</td></tr><tr><td>{type} <code>&#x53EF;&#x9009;</code></td><td>&#x8FD4;&#x56DE;&#x7C7B;&#x578B;&#xFF0C;&#x4F8B;&#x5982;&#xFF1A;<code>{Boolean}</code>&#xFF0C;<code>{Number}</code>&#xFF0C;<code>{String}</code>&#xFF0C;<code>{Object}</code>&#xFF0C;<code>{String[]}</code>&#xFF08;&#x5B57;&#x7B26;&#x4E32;&#x6570;&#x7EC4;&#xFF09;&#x7B49;</td></tr><tr><td>field</td><td>&#x8FD4;&#x56DE;&#x6807;&#x8BC6;&#x5B57;&#x6BB5;</td></tr><tr><td>description <code>&#x53EF;&#x9009;</code></td><td>&#x5B57;&#x6BB5;&#x63CF;&#x8FF0;</td></tr></tbody></table><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{get}</span> </span>/user/:id</span><br><span class="line"> * <span class="doctag">@apiSuccess <span class="type">{String}</span> </span>firstname Firstname of the User.</span><br><span class="line"> * <span class="doctag">@apiSuccess <span class="type">{String}</span> </span>lastname Lastname of the User.</span><br><span class="line"> */</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x5E26;(group)&#x793A;&#x4F8B;</span></span><br><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{get}</span> </span>/user/:id</span><br><span class="line"> * <span class="doctag">@apiSuccess </span>(200) {String} firstname Firstname of the User.</span><br><span class="line"> * <span class="doctag">@apiSuccess </span>(200) {String} lastname Lastname of the User.</span><br><span class="line"> */</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x5E26;&#x5BF9;&#x8C61;&#x793A;&#x4F8B;</span></span><br><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{get}</span> </span>/user/:id</span><br><span class="line"> * <span class="doctag">@apiSuccess <span class="type">{Boolean}</span> </span>active Specify if the account is active.</span><br><span class="line"> * <span class="doctag">@apiSuccess <span class="type">{Object}</span> </span>profile User profile information.</span><br><span class="line"> * <span class="doctag">@apiSuccess <span class="type">{Number}</span> </span>profile.age Users age.</span><br><span class="line"> * <span class="doctag">@apiSuccess <span class="type">{String}</span> </span>profile.image Avatar-Image.</span><br><span class="line"> */</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x5E26;&#x6570;&#x7EC4;&#x793A;&#x4F8B;</span></span><br><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{get}</span> </span>/users</span><br><span class="line"> * <span class="doctag">@apiSuccess <span class="type">{Object[]}</span> </span>profiles List of user profiles.</span><br><span class="line"> * <span class="doctag">@apiSuccess <span class="type">{Number}</span> </span>profiles.age Users age.</span><br><span class="line"> * <span class="doctag">@apiSuccess <span class="type">{String}</span> </span>profiles.image Avatar-Image.</span><br><span class="line"> */</span></span><br></pre></td></tr></table></figure><h2 id="apiSuccessExample"><a href="#apiSuccessExample" class="headerlink" title="@apiSuccessExample"></a>@apiSuccessExample</h2><p>&#x6210;&#x529F;&#x54CD;&#x5E94;&#x7684;&#x4FE1;&#x606F;&#xFF0C;&#x6309;&#x683C;&#x5F0F;&#x5316;&#x4EE3;&#x7801;&#x8F93;&#x51FA;</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">@apiSuccessExample [{type}] [title]</span><br><span class="line">    example</span><br></pre></td></tr></table></figure><table><thead><tr><th>&#x5B57;&#x6BB5;</th><th>&#x63CF;&#x8FF0;</th></tr></thead><tbody><tr><td>type <code>&#x53EF;&#x9009;</code></td><td>&#x54CD;&#x5E94;&#x683C;&#x5F0F;</td></tr><tr><td>title <code>&#x53EF;&#x9009;</code></td><td>&#x793A;&#x4F8B;&#x7B80;&#x79F0;</td></tr><tr><td>example</td><td>&#x8BE6;&#x7EC6;&#x793A;&#x4F8B;&#xFF0C;&#x652F;&#x6301;&#x591A;&#x884C;&#x6587;&#x672C;</td></tr></tbody></table><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{get}</span> </span>/user/:id</span><br><span class="line"> * <span class="doctag">@apiSuccessExample <span class="type">{json}</span> <span class="variable">Success</span></span>-Response:</span><br><span class="line"> * HTTP/1.1 200 OK</span><br><span class="line"> * {</span><br><span class="line"> *   &quot;firstname&quot;: &quot;John&quot;,</span><br><span class="line"> *   &quot;lastname&quot;: &quot;Doe&quot;</span><br><span class="line"> * }</span><br><span class="line"> */</span></span><br></pre></td></tr></table></figure><h2 id="apiUse"><a href="#apiUse" class="headerlink" title="@apiUse"></a>@apiUse</h2><p>&#x5305;&#x542B;&#x4E00;&#x4E2A;<a href="#apiDefine"><code>@apiDefine</code></a>&#x5B9A;&#x4E49;&#x7684;&#x5757;&#x3002;&#x5982;&#x679C;&#x4E0E;<a href="#apiVersion"><code>@apiVersion</code></a>&#x4E00;&#x8D77;&#x4F7F;&#x7528;&#xFF0C;&#x5C06;&#x5305;&#x542B;&#x76F8;&#x540C;&#x7684;&#x6216;&#x6700;&#x8FD1;&#x7684;&#x4E00;&#x4E2A;</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@apiUse name</span><br></pre></td></tr></table></figure><table><thead><tr><th>&#x5B57;&#x6BB5;</th><th>&#x63CF;&#x8FF0;</th></tr></thead><tbody><tr><td>name</td><td>&#x5B9A;&#x4E49;&#x5757;&#x7684;&#x540D;&#x79F0;</td></tr></tbody></table><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@apiDefine <span class="variable">MySuccess</span></span></span><br><span class="line"> * <span class="doctag">@apiSuccess <span class="type">{string}</span> </span>firstname The users firstname.</span><br><span class="line"> * <span class="doctag">@apiSuccess <span class="type">{number}</span> </span>age The users age.</span><br><span class="line"> */</span></span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{get}</span> </span>/user/:id</span><br><span class="line"> * <span class="doctag">@apiUse <span class="variable">MySuccess</span></span></span><br><span class="line"> */</span></span><br></pre></td></tr></table></figure><h2 id="apiVersion"><a href="#apiVersion" class="headerlink" title="@apiVersion"></a>@apiVersion</h2><p>&#x914D;&#x7F6E;&#x6587;&#x6863;&#x5757;&#x7684;&#x7248;&#x672C;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x5728;<a href="#apiDefine"><code>@apiDefine</code></a>&#x4E2D;&#x4F7F;&#x7528;&#xFF0C;&#x5177;&#x6709;&#x76F8;&#x540C;&#x7EC4;&#x548C;&#x540D;&#x79F0;&#x7684;API&#xFF0C;&#x53EF;&#x4EE5;&#x5728;&#x751F;&#x6210;&#x7684;&#x6587;&#x6863;&#x4E2D;&#x6BD4;&#x8F83;&#x4E0D;&#x540C;&#x7684;&#x7248;&#x672C;&#xFF0C;&#x56E0;&#x6B64;&#x4F60;&#x6216;&#x524D;&#x7AEF;&#x5F00;&#x53D1;&#x4EBA;&#x5458;&#x53EF;&#x4EE5;&#x56DE;&#x6EAF;&#x81EA;&#x4E0A;&#x4E00;&#x4E2A;&#x7248;&#x672C;&#x4EE5;&#x6765;API&#x4E2D;&#x7684;&#x66F4;&#x6539;</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@apiVersion version</span><br></pre></td></tr></table></figure><table><thead><tr><th>&#x5B57;&#x6BB5;</th><th>&#x63CF;&#x8FF0;</th></tr></thead><tbody><tr><td>version</td><td>&#x652F;&#x6301;&#x7B80;&#x5355;&#x7684;&#x7248;&#x672C;&#x63A7;&#x5236;&#xFF08;&#x4E3B;&#x7248;&#x672C;&#x53F7;.&#x6B21;&#x7248;&#x672C;&#x53F7;.&#x8865;&#x4E01;&#x53F7;&#xFF09;&#x3002;&#x66F4;&#x591A;&#x4FE1;&#x606F;&#x8BF7;&#x53C2;&#x8003;<a href="http://semver.org/" target="_blank" rel="external">http://semver.org/</a></td></tr></tbody></table><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span><br><span class="line"> * <span class="doctag">@api <span class="type">{get}</span> </span>/user/:id</span><br><span class="line"> * <span class="doctag">@apiVersion </span>1.6.2</span><br><span class="line"> */</span></span><br></pre></td></tr></table></figure><p>&#x5230;&#x6B64;&#x4E3A;&#x6B62;&#xFF0C;&#x4F60;&#x5E94;&#x8BE5;&#x5BF9;apidoc&#x719F;&#x6089;&#x4E86;&#x4E00;&#x5927;&#x534A;&#x4E86;&#x5427;&#xFF01;&#x5176;&#x5B9E;&#x4F5C;&#x4E3A;&#x5F00;&#x53D1;&#x8005;&#xFF0C;&#x4E00;&#x5B9A;&#x8981;&#x517B;&#x6210;&#x5199;&#x6CE8;&#x91CA;&#x3001;&#x5199;&#x6587;&#x6863;&#x7684;&#x4E60;&#x60EF;&#xFF0C;&#x4E5F;&#x662F;&#x7A0B;&#x5E8F;&#x5458;&#x8FDB;&#x9636;&#x7684;&#x5FC5;&#x8981;&#x6761;&#x4EF6;&#x3002;</p><blockquote><p>&#x8C28;&#x4EE5;&#x6B64;&#x6587;&#x97AD;&#x7B56;&#x81EA;&#x5DF1;&#x3002;</p></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;&lt;p&gt;&amp;#x95EE;&amp;#xFF1A;&amp;#x5F00;&amp;#x53D1;&amp;#x4E1A;&amp;#x52A1;&amp;#x6A21;&amp;#x5757;&amp;#x4EE3;&amp;#x7801;&amp;#x6700;&amp;#x91CD;&amp;#x8981;&amp;#x7684;&amp;#x662F;&amp;#x4E
    
    </summary>
    
      <category term="Node.js" scheme="http://brucewar.cn/categories/Node-js/"/>
    
    
      <category term="apidoc" scheme="http://brucewar.cn/tags/apidoc/"/>
    
      <category term="RESTful API" scheme="http://brucewar.cn/tags/RESTful-API/"/>
    
      <category term="文档" scheme="http://brucewar.cn/tags/%E6%96%87%E6%A1%A3/"/>
    
  </entry>
  
  <entry>
    <title>Node.js aes-128-cbc加密和解密</title>
    <link href="http://brucewar.cn/2017/05/06/Node-js-aes-128-cbc%E5%8A%A0%E5%AF%86%E5%92%8C%E8%A7%A3%E5%AF%86/"/>
    <id>http://brucewar.cn/2017/05/06/Node-js-aes-128-cbc加密和解密/</id>
    <published>2017-05-06T03:31:52.000Z</published>
    <updated>2017-05-06T03:58:06.787Z</updated>
    
    <content type="html"><![CDATA[<p>Java&#x7A0B;&#x5E8F;&#x4E2D;&#x7ECF;&#x5E38;&#x4F7F;&#x7528;&#x7684;AES&#x52A0;&#x5BC6;&#x6A21;&#x5F0F;&#x662F;<strong>AES/CBC/PKCS5Padding</strong>&#xFF0C;&#x5728;Node.js&#x4E2D;&#x5BF9;&#x5E94;&#x7684;&#x662F;<strong>aes-128-cbc</strong>&#x52A0;&#x5BC6;&#x7B97;&#x6CD5;&#x3002;</p><p>&#x4E3A;&#x6B64;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x5F15;&#x5165;Node.js&#x7684;<em>crypto</em>&#x6A21;&#x5757;&#xFF0C;&#x8BE6;&#x7EC6;&#x8BF4;&#x660E;&#x8BF7;&#x67E5;&#x770B;<a href="https://nodejs.org/dist/latest-v6.x/docs/api/crypto.html" target="_blank" rel="external">&#x5B98;&#x65B9;&#x6587;&#x6863;</a>&#x3002;</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&apos;use strict&apos;</span>;</span><br><span class="line"><span class="keyword">const</span> crypto = <span class="built_in">require</span>(<span class="string">&apos;crypto&apos;</span>);</span><br><span class="line"><span class="keyword">const</span> ALG_STRING = <span class="string">&apos;aes-128-cbc&apos;</span>,</span><br><span class="line">  KEY = <span class="string">&apos;wjl891014#gmail.com&apos;</span>,</span><br><span class="line">  IV = [ <span class="number">0xcb</span>, <span class="number">0x53</span>, <span class="number">0x03</span>, <span class="number">0x0f</span>, <span class="number">0xe0</span>, <span class="number">0x79</span>, <span class="number">0x9d</span>, <span class="number">0xdc</span>, <span class="number">0x80</span>, <span class="number">0xa9</span>, <span class="number">0x83</span>, <span class="number">0xf1</span>, <span class="number">0x03</span>, <span class="number">0xb6</span>, <span class="number">0x59</span>, <span class="number">0x83</span> ];</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> md5sum = <span class="function"><span class="params">str</span> =&gt;</span> {</span><br><span class="line">  <span class="keyword">return</span> crypto.createHash(<span class="string">&apos;md5&apos;</span>)</span><br><span class="line">    .update(str)</span><br><span class="line">    .digest()</span><br><span class="line">    .slice(<span class="number">0</span>, <span class="number">16</span>);</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> encrypt = <span class="function"><span class="params">str</span> =&gt;</span> {</span><br><span class="line">  <span class="keyword">const</span> key = md5sum(KEY);</span><br><span class="line">  <span class="comment">// key&#x548C;IV &#x5FC5;&#x987B;&#x662F;16&#x4F4D;&#x6216;32&#x4F4D;</span></span><br><span class="line">  <span class="keyword">const</span> cipher = crypto.createCipheriv(ALG_STRING, key, Buffer.from(IV));</span><br><span class="line">  cipher.setAutoPadding(<span class="literal">true</span>);</span><br><span class="line">  <span class="keyword">const</span> cipherChunks = [];</span><br><span class="line">  cipherChunks.push(cipher.update(str, <span class="string">&apos;utf8&apos;</span>, <span class="string">&apos;binary&apos;</span>));</span><br><span class="line">  cipherChunks.push(cipher.final(<span class="string">&apos;binary&apos;</span>));</span><br><span class="line">  <span class="keyword">return</span> Buffer.from(cipherChunks.join(<span class="string">&apos;&apos;</span>), <span class="string">&apos;binary&apos;</span>).toString(<span class="string">&apos;base64&apos;</span>);</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> decrypt = <span class="function"><span class="params">str</span> =&gt;</span> {</span><br><span class="line">  <span class="keyword">const</span> key = md5sum(KEY);</span><br><span class="line">  <span class="keyword">const</span> decipher = crypto.createDecipheriv(ALG_STRING, key, Buffer.from(IV));</span><br><span class="line">  decipher.setAutoPadding(<span class="literal">true</span>);</span><br><span class="line">  <span class="keyword">const</span> cipherChunks = [];</span><br><span class="line">  cipherChunks.push(decipher.update(Buffer.from(str, <span class="string">&apos;base64&apos;</span>).toString(<span class="string">&apos;binary&apos;</span>), <span class="string">&apos;binary&apos;</span>, <span class="string">&apos;utf8&apos;</span>));</span><br><span class="line">  cipherChunks.push(decipher.final(<span class="string">&apos;utf8&apos;</span>));</span><br><span class="line">  <span class="keyword">return</span> cipherChunks.join(<span class="string">&apos;&apos;</span>);</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> data = <span class="string">&apos;bd2983b21dd2aeb1e1453ab0273b4dc&apos;</span>;</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">`&#x52A0;&#x5BC6;&#x524D;&#xFF1A;<span class="subst">${data}</span>`</span>);</span><br><span class="line"><span class="keyword">const</span> encryptData = encrypt(data);</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">`&#x52A0;&#x5BC6;&#x540E;&#xFF1A;<span class="subst">${encryptData}</span>`</span>);</span><br><span class="line"><span class="keyword">const</span> decryptData = decrypt(encryptData);</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">`&#x89E3;&#x5BC6;&#x540E;&#xFF1A;<span class="subst">${decryptData}</span>`</span>);</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;Java&amp;#x7A0B;&amp;#x5E8F;&amp;#x4E2D;&amp;#x7ECF;&amp;#x5E38;&amp;#x4F7F;&amp;#x7528;&amp;#x7684;AES&amp;#x52A0;&amp;#x5BC6;&amp;#x6A21;&amp;#x5F0F;&amp;#x662F;&lt;strong&gt;AES/CBC/PKCS5Paddi
    
    </summary>
    
      <category term="Node.js" scheme="http://brucewar.cn/categories/Node-js/"/>
    
    
      <category term="AES" scheme="http://brucewar.cn/tags/AES/"/>
    
      <category term="aes-128-cbc" scheme="http://brucewar.cn/tags/aes-128-cbc/"/>
    
  </entry>
  
  <entry>
    <title>CentOS ftp服务搭建</title>
    <link href="http://brucewar.cn/2017/05/04/CentOS-ftp%E6%9C%8D%E5%8A%A1%E6%90%AD%E5%BB%BA/"/>
    <id>http://brucewar.cn/2017/05/04/CentOS-ftp服务搭建/</id>
    <published>2017-05-04T03:33:03.000Z</published>
    <updated>2017-05-04T03:49:39.295Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>&#x597D;&#x8BB0;&#x6027;&#x4E0D;&#x5982;&#x70C2;&#x7B14;&#x5934;</p></blockquote><p>&#x6BCF;&#x6B21;&#x60F3;&#x8981;windows&#x548C;linux&#x4E92;&#x4F20;&#x6587;&#x4EF6;&#x65F6;&#xFF0C;&#x90FD;&#x5F97;&#x53BB;&#x641C;&#x7D22;<em>&#x201C;Linux ftp&#x670D;&#x52A1;&#x5B89;&#x88C5;&#x914D;&#x7F6E;&#x201D;</em>&#xFF0C;&#x91CD;&#x590D;&#x7684;&#x6B21;&#x6570;&#x592A;&#x591A;&#xFF0C;&#x8FD8;&#x662F;&#x628A;&#x5B83;&#x8BB0;&#x5F55;&#x4E0B;&#x6765;&#x5427;&#xFF01;&#xFF01;&#xFF01;</p><ol><li><p>&#x5B89;&#x88C5;vsftpd ftp</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum -y install ftp vsftpd</span><br></pre></td></tr></table></figure></li><li><p>&#x5907;&#x4EFD;vsftpd&#x539F;&#x6709;&#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /etc/vsftpd/</span><br><span class="line">cp vsftpd.conf vsftpd.conf.origin</span><br></pre></td></tr></table></figure></li><li><p>&#x521B;&#x5EFA;&#x5BC6;&#x7801;&#x660E;&#x6587;&#x6587;&#x4EF6;</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/vsftpd/vftpuser.txt</span><br><span class="line"><span class="comment"># brucewar</span></span><br><span class="line"><span class="comment"># password</span></span><br></pre></td></tr></table></figure></li><li><p>&#x6839;&#x636E;&#x660E;&#x6587;&#x521B;&#x5EFA;&#x5BC6;&#x7801;DB&#x6587;&#x4EF6;</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">db_load -T -t <span class="built_in">hash</span> -f /etc/vsftpd/vftpuser.txt /etc/vsftpd/vftpuser.db</span><br></pre></td></tr></table></figure></li><li><p>&#x67E5;&#x770B;&#x5BC6;&#x7801;&#x6570;&#x636E;&#x6587;&#x4EF6;</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">file /etc/vsftpd/vftpuser.db</span><br><span class="line"><span class="comment"># /etc/vsftpd/vftpuser.db: Berkeley DB(Hash,version9,native byte-order)</span></span><br></pre></td></tr></table></figure></li><li><p>&#x521B;&#x5EFA;vftpd&#x7684;guest&#x8D26;&#x6237;</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">useradd -d /ftp/private -s /sbin/nologin vftpuser</span><br></pre></td></tr></table></figure><p><strong>Note</strong>&#xFF1A;&#x8FD9;&#x4E00;&#x6B65;&#x53EF;&#x80FD;&#x4F1A;&#x521B;&#x5EFA;<em>/ftp/private</em>&#x5931;&#x8D25;&#xFF0C;&#x53EF;&#x4EE5;&#x624B;&#x52A8;&#x521B;&#x5EFA;&#x6587;&#x4EF6;&#x5939;&#xFF0C;&#x5E76;&#x5C06;&#x5B83;&#x7684;&#x6743;&#x9650;&#x8D4B;&#x4E88;vftpuser</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">mkdir -p /ftp/private</span><br><span class="line">chown -R vftpuser.vftpuser /ftp</span><br></pre></td></tr></table></figure></li><li><p>&#x6253;&#x5F00;<em>/etc/pam.d/vsftpd</em>, &#x5C06;<code>auth</code>&#x53CA;<code>account</code>&#x7684;&#x6240;&#x6709;&#x914D;&#x7F6E;&#x884C;&#x90FD;&#x6CE8;&#x91CA;&#x6389;&#xFF0C;&#x6DFB;&#x52A0;&#x5982;&#x4E0B;&#x5185;&#x5BB9;&#xFF1A;</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">auth required pam_userdb.so db=/etc/vsftpd/vftpuser</span><br><span class="line">account required pam_userdb.so db=/etc/vsftpd/vftpuser</span><br></pre></td></tr></table></figure></li><li><p>&#x6253;&#x5F00;<em>/etc/vsftpd/vsftpd.conf</em>&#xFF0C;&#x5C06;<code>anonymous_enable=YES</code>&#x6539;&#x4E3A;<code>anonymous_enable=NO</code>&#xFF0C;&#x5728;&#x6700;&#x4E0B;&#x9762;&#x6DFB;&#x52A0;&#x5982;&#x4E0B;&#x5185;&#x5BB9;&#xFF1A;</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">virtual_use_local_privs=YES</span><br><span class="line">guest_enable=YES</span><br><span class="line">guest_username=vftpuser</span><br><span class="line">chroot_local_user=YES</span><br><span class="line">allow_writeable_chroot=YES</span><br></pre></td></tr></table></figure></li><li><p>&#x8BBE;&#x7F6E;vsftpd&#x5F00;&#x673A;&#x542F;&#x52A8;</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl <span class="built_in">enable</span> vsftpd</span><br></pre></td></tr></table></figure></li><li><p>&#x91CD;&#x542F;vsftpd&#x670D;&#x52A1;</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl restart vsftpd</span><br></pre></td></tr></table></figure></li><li><p>&#x914D;&#x7F6E;&#x9632;&#x706B;&#x5899;&#x548C;SELinux</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">firewall-cmd --permanent --zone=public --add-service=ftp</span><br><span class="line">firewall-cmd --reload</span><br><span class="line"></span><br><span class="line">getsebool -a | grep ftp</span><br><span class="line">setsebool -P ftpd_full_access on</span><br></pre></td></tr></table></figure></li><li><p>&#x67E5;&#x770B;vsftpd&#x670D;&#x52A1;&#x72B6;&#x6001;</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl status vsftpd</span><br></pre></td></tr></table></figure></li></ol>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;&lt;p&gt;&amp;#x597D;&amp;#x8BB0;&amp;#x6027;&amp;#x4E0D;&amp;#x5982;&amp;#x70C2;&amp;#x7B14;&amp;#x5934;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;#x6BCF;&amp;#x6B21;&amp;#x60F3;&amp;#x8981;windows&amp;#
    
    </summary>
    
      <category term="Linux" scheme="http://brucewar.cn/categories/Linux/"/>
    
    
      <category term="Linux" scheme="http://brucewar.cn/tags/Linux/"/>
    
      <category term="CentOS" scheme="http://brucewar.cn/tags/CentOS/"/>
    
      <category term="ftp" scheme="http://brucewar.cn/tags/ftp/"/>
    
  </entry>
  
  <entry>
    <title>细胞卫士</title>
    <link href="http://brucewar.cn/2017/03/30/%E7%BB%86%E8%83%9E%E5%8D%AB%E5%A3%AB/"/>
    <id>http://brucewar.cn/2017/03/30/细胞卫士/</id>
    <published>2017-03-29T23:50:51.000Z</published>
    <updated>2017-03-30T00:17:53.836Z</updated>
    
    <content type="html"><![CDATA[<p>&#x6700;&#x8FD1;&#x8EAB;&#x4F53;&#x4E0D;&#x8212;&#x670D;&#xFF0C;&#x5565;&#x4E8B;&#x4E0D;&#x60F3;&#x505A;&#xFF0C;&#x4E0E;&#x8840;&#x5E38;&#x89C4;&#x68C0;&#x67E5;&#x63A5;&#x89E6;&#x7684;&#x4E5F;&#x591A;&#x3002;&#x53D1;&#x73B0;&#x81EA;&#x5DF1;&#x628A;&#x9AD8;&#x4E2D;&#x5B66;&#x7684;&#x751F;&#x7269;&#x77E5;&#x8BC6;&#x90FD;&#x8FD8;&#x7ED9;&#x8001;&#x5E08;&#x4E86;&#x3002;</p><p>&#x6240;&#x4EE5;&#x6709;&#x5FC5;&#x8981;&#x6765;&#x666E;&#x53CA;&#x4E00;&#x4E0B;&#x8840;&#x6DB2;&#x4E2D;&#x91CD;&#x8981;&#x7684;&#x7EC6;&#x80DE;&#x7684;&#x4F5C;&#x7528;&#x3002;</p><ul><li><p>&#x767D;&#x7EC6;&#x80DE;&#xFF1A;&#x6740;&#x706D;&#x7EC6;&#x83CC;&#x548C;&#x75C5;&#x6BD2;&#x5E76;&#x76D1;&#x63A7;&#x8EAB;&#x4F53;&#x7684;&#x7A33;&#x5B9A;&#xFF0C;&#x767D;&#x7EC6;&#x80DE;&#x53C8;&#x5206;&#x4E3A;&#x4E0B;&#x9762;4&#x9879;</p><ul><li>&#x4E2D;&#x6027;&#x7C92;&#x7EC6;&#x80DE;&#xFF1A;&#x767D;&#x7EC6;&#x80DE;&#x4E2D;&#x6700;&#x91CD;&#x8981;&#x7684;&#x6210;&#x5206;&#xFF0C;&#x8D77;&#x541E;&#x566C;&#x548C;&#x6740;&#x83CC;&#x4F5C;&#x7528;</li><li>&#x6DCB;&#x5DF4;&#x7EC6;&#x80DE;&#xFF1A;&#x4E13;&#x95E8;&#x5BF9;&#x4ED8;&#x96BE;&#x7F20;&#x7684;&#x75C5;&#x6BD2;&#xFF0C;&#x75C5;&#x6BD2;&#x611F;&#x67D3;&#x65F6;&#xFF0C;&#x6DCB;&#x5DF4;&#x7EC6;&#x80DE;&#x4E00;&#x822C;&#x4F1A;&#x5347;&#x9AD8;</li><li>&#x55DC;&#x78B1;&#x6027;&#x7C92;&#x7EC6;&#x80DE;&#xFF1A;&#x673A;&#x4F53;&#x8FC7;&#x654F;&#x65F6;&#xFF0C;&#x727A;&#x7272;&#x81EA;&#x5DF1;&#x5206;&#x6CCC;&#x5927;&#x91CF;&#x7684;&#x8D8B;&#x5316;&#x56E0;&#x5B50;&#xFF0C;&#x5F15;&#x8D77;&#x8FC7;&#x654F;&#x53CD;&#x5E94;</li><li>&#x55DC;&#x9178;&#x6027;&#x7C92;&#x7EC6;&#x80DE;&#xFF1A;&#x6291;&#x5236;&#x8FC7;&#x654F;&#x4EA7;&#x751F;&#x7684;&#x526F;&#x4F5C;&#x7528;</li></ul></li><li><p>&#x7EA2;&#x7EC6;&#x80DE;&#xFF1A;&#x8FD0;&#x8F93;&#x6C27;&#x6C14;&#x548C;&#x8425;&#x517B;&#x5230;&#x5168;&#x8EAB;&#x5668;&#x5B98;&#xFF0C;&#x518D;&#x628A;&#x8EAB;&#x4F53;&#x5185;&#x7684;&#x5E9F;&#x7269;&#x8FD0;&#x51FA;&#x53BB;</p><p>&#x8840;&#x7EA2;&#x86CB;&#x767D;&#x662F;&#x7EA2;&#x7EC6;&#x80DE;&#x4E2D;&#x7684;&#x4E00;&#x79CD;&#x86CB;&#x767D;&#xFF0C;&#x4E13;&#x95E8;&#x8D1F;&#x8D23;&#x8FD0;&#x8F93;&#x6C27;&#x6C14;&#xFF0C;&#x8840;&#x7EA2;&#x86CB;&#x767D;&#x964D;&#x4F4E;&#xFF0C;&#x610F;&#x5473;&#x7740;&#x8D2B;&#x8840;&#x3002;</p></li><li><p>&#x8840;&#x5C0F;&#x677F;&#xFF1A;&#x51DD;&#x8840;&#xFF0C;&#x6B62;&#x8840;</p></li></ul><blockquote><p>&#x8EAB;&#x4F53;&#x5065;&#x5EB7;&#x662F;&#x6700;&#x91CD;&#x8981;&#x7684;&#xFF0C;&#x8BF7;&#x7231;&#x60DC;&#x81EA;&#x5DF1;&#xFF01;</p></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&amp;#x6700;&amp;#x8FD1;&amp;#x8EAB;&amp;#x4F53;&amp;#x4E0D;&amp;#x8212;&amp;#x670D;&amp;#xFF0C;&amp;#x5565;&amp;#x4E8B;&amp;#x4E0D;&amp;#x60F3;&amp;#x505A;&amp;#xFF0C;&amp;#x4E0E;&amp;#x8840;&amp;#x5E38;&amp;
    
    </summary>
    
      <category term="生活" scheme="http://brucewar.cn/categories/%E7%94%9F%E6%B4%BB/"/>
    
    
      <category term="常识" scheme="http://brucewar.cn/tags/%E5%B8%B8%E8%AF%86/"/>
    
  </entry>
  
  <entry>
    <title>仿知乎头像上传</title>
    <link href="http://brucewar.cn/2017/02/09/%E4%BB%BF%E7%9F%A5%E4%B9%8E%E5%A4%B4%E5%83%8F%E4%B8%8A%E4%BC%A0/"/>
    <id>http://brucewar.cn/2017/02/09/仿知乎头像上传/</id>
    <published>2017-02-09T09:47:47.000Z</published>
    <updated>2017-02-09T10:21:16.014Z</updated>
    
    <content type="html"><![CDATA[<p>&#x5565;&#x90FD;&#x4E0D;&#x8BF4;&#xFF0C; &#x76F4;&#x63A5;&#x5148;&#x6765;&#x4E00;&#x5F20;&#x6548;&#x679C;&#x56FE;&#x2026;&#x2026;</p><p><img src="/2017/02/09/&#x4EFF;&#x77E5;&#x4E4E;&#x5934;&#x50CF;&#x4E0A;&#x4F20;/avatar-upload.png" alt="&#x5934;&#x50CF;&#x4E0A;&#x4F20;&#x6548;&#x679C;&#x56FE;"></p><p>&#x5C0F;&#x4F19;&#x4F34;&#x4EEC;&#xFF0C;&#x522B;&#x6025;&#xFF0C;&#x54B1;&#x4EEC;&#x5148;&#x6765;&#x5206;&#x6790;&#x4E00;&#x4E0B;&#x4E3B;&#x8981;&#x529F;&#x80FD;&#x70B9;&#xFF1A;</p><ol><li>&#x56FE;&#x7247;&#x9884;&#x89C8;</li><li>&#x56FE;&#x7247;&#x62D6;&#x62FD;</li><li>&#x56FE;&#x7247;&#x7F29;&#x653E;</li><li>&#x56FE;&#x7247;&#x88C1;&#x526A;</li></ol><h3 id="&#x56FE;&#x7247;&#x9884;&#x89C8;"><a href="#&#x56FE;&#x7247;&#x9884;&#x89C8;" class="headerlink" title="&#x56FE;&#x7247;&#x9884;&#x89C8;"></a>&#x56FE;&#x7247;&#x9884;&#x89C8;</h3><p>&#x56FE;&#x7247;&#x9884;&#x89C8;&#x7684;&#x529F;&#x80FD;&#x6280;&#x672F;&#x65B9;&#x6848;&#x662F;&#x5C06;&#x7528;&#x6237;&#x7684;&#x56FE;&#x7247;&#x6587;&#x4EF6;&#x8F6C;&#x6210;Base64&#x7F16;&#x7801;&#x5E76;&#x8BBE;&#x7F6E;&#x5230;<code>&lt;img&gt;</code>&#x6807;&#x7B7E;&#x7684;<code>src</code>&#x5C5E;&#x6027;&#xFF0C;&#x83B7;&#x53D6;&#x56FE;&#x7247;&#x6587;&#x4EF6;&#x7684;Base64&#x7F16;&#x7801;&#x9700;&#x8981;&#x901A;&#x8FC7;HTML5&#x7684;&#x65B0;&#x7279;&#x6027;<a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReader" target="_blank" rel="external">FileReader</a>&#xFF0C;&#x5177;&#x4F53;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#xFF1A;</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">getImgBase64: <span class="function"><span class="keyword">function</span>(<span class="params">imgFile, cb</span>)</span>{</span><br><span class="line">  <span class="keyword">if</span>(!<span class="built_in">window</span>.FileReader){</span><br><span class="line">    alert(<span class="string">&apos;&#x7CFB;&#x7EDF;&#x6682;&#x4E0D;&#x652F;&#x6301;&#x9488;&#x5BF9;&#x4F60;&#x7684;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x6587;&#x4EF6;&#x4E0A;&#x4F20;&#x529F;&#x80FD;&#xFF0C;&#x5EFA;&#x8BAE;&#x4F7F;&#x7528;&#x6700;&#x65B0;&#x7248;&#x7684;Chrome&#xFF01;&apos;</span>);</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">  }</span><br><span class="line">  <span class="keyword">var</span> reader = <span class="keyword">new</span> FileReader();</span><br><span class="line">  reader.onload = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{</span><br><span class="line">    cb &amp;&amp; cb(reader.result);</span><br><span class="line">  };</span><br><span class="line">  reader.readAsDataURL(imgFile);</span><br><span class="line">  <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="&#x56FE;&#x7247;&#x62D6;&#x62FD;"><a href="#&#x56FE;&#x7247;&#x62D6;&#x62FD;" class="headerlink" title="&#x56FE;&#x7247;&#x62D6;&#x62FD;"></a>&#x56FE;&#x7247;&#x62D6;&#x62FD;</h3><p>&#x56FE;&#x7247;&#x62D6;&#x62FD;&#x7684;&#x529F;&#x80FD;&#x9700;&#x8981;&#x501F;&#x52A9;&#x9F20;&#x6807;&#x4E8B;&#x4EF6;<code>mousedown, mousemove, mouseup</code>&#xFF0C;&#x8FD9;&#x91CC;&#x8D34;&#x51FA;mousemove&#x91CC;&#x7684;&#x5904;&#x7406;&#xFF1A;</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line">$(<span class="built_in">document</span>).on(<span class="string">&apos;mousemove&apos;</span>, <span class="function"><span class="keyword">function</span>(<span class="params">e</span>)</span>{</span><br><span class="line">  e.preventDefault();</span><br><span class="line">  <span class="keyword">var</span> $thumb = $(<span class="string">&apos;.slider-thumb&apos;</span>);</span><br><span class="line">  <span class="keyword">if</span>($thumb.hasClass(<span class="string">&apos;moving&apos;</span>)){</span><br><span class="line">    <span class="comment">// &#x8C03;&#x6574;&#x5927;&#x5C0F;</span></span><br><span class="line">    <span class="keyword">var</span> left = <span class="built_in">parseFloat</span>($thumb.css(<span class="string">&apos;left&apos;</span>));</span><br><span class="line">    <span class="keyword">if</span>(self.lastPosition){</span><br><span class="line">      <span class="keyword">var</span> max = $thumb.siblings(<span class="string">&apos;.line&apos;</span>).width() - $thumb.width();</span><br><span class="line">      (e.pageX &gt;= self.lastPosition.x)</span><br><span class="line">      ? (left &gt;= max ? left = max : left += (e.pageX - self.lastPosition.x))</span><br><span class="line">      : (left &lt;= <span class="number">0</span> ? left = <span class="number">0</span> : left += (e.pageX - self.lastPosition.x));</span><br><span class="line">      $thumb.css(<span class="string">&apos;left&apos;</span>, left);</span><br><span class="line">    }</span><br><span class="line">    self.currentRadio = left / $thumb.siblings(<span class="string">&apos;.line&apos;</span>).width() + <span class="number">1</span>;</span><br><span class="line">    self.resizeImg(self.currentRadio);</span><br><span class="line">  }</span><br><span class="line">  <span class="keyword">var</span> $imgs = $(<span class="string">&apos;#avatarEditorDialog&apos;</span>).find(<span class="string">&apos;img&apos;</span>);</span><br><span class="line">  <span class="keyword">if</span>($imgs.hasClass(<span class="string">&apos;moving&apos;</span>)){</span><br><span class="line">    <span class="comment">// &#x79FB;&#x52A8;&#x56FE;&#x7247;&#x4F4D;&#x7F6E;</span></span><br><span class="line">    <span class="keyword">var</span> left = <span class="built_in">parseFloat</span>($imgs.css(<span class="string">&apos;left&apos;</span>));</span><br><span class="line">    <span class="keyword">var</span> top = <span class="built_in">parseFloat</span>($imgs.css(<span class="string">&apos;top&apos;</span>));</span><br><span class="line">    <span class="keyword">var</span> width = <span class="built_in">parseFloat</span>($imgs.css(<span class="string">&apos;width&apos;</span>));</span><br><span class="line">    <span class="keyword">var</span> height = <span class="built_in">parseFloat</span>($imgs.css(<span class="string">&apos;height&apos;</span>));</span><br><span class="line">    <span class="keyword">if</span>(self.lastPosition){</span><br><span class="line">      <span class="keyword">var</span> leftMin = -(width - BASE - <span class="number">30</span>);</span><br><span class="line">      <span class="keyword">var</span> topMin = -(height - BASE - <span class="number">30</span>);</span><br><span class="line">      (e.pageX &lt; self.lastPosition.x)</span><br><span class="line">      ? (left &lt;= leftMin ? left = leftMin : left += (e.pageX - self.lastPosition.x))</span><br><span class="line">      : (left &gt;= <span class="number">30</span> ? left = <span class="number">30</span> : left += (e.pageX - self.lastPosition.x));</span><br><span class="line">      (e.pageY &lt; self.lastPosition.y)</span><br><span class="line">      ? (top &lt;= topMin ? top = topMin : top += (e.pageY - self.lastPosition.y))</span><br><span class="line">      : (top &gt;= <span class="number">30</span> ? top = <span class="number">30</span> : top += (e.pageY - self.lastPosition.y));</span><br><span class="line">      $imgs.css({</span><br><span class="line">        <span class="attr">left</span>: left,</span><br><span class="line">        <span class="attr">top</span>: top</span><br><span class="line">      });</span><br><span class="line">    }</span><br><span class="line">  }</span><br><span class="line">  self.lastPosition = {</span><br><span class="line">    <span class="attr">x</span>: e.pageX,</span><br><span class="line">    <span class="attr">y</span>: e.pageY</span><br><span class="line">  };</span><br><span class="line">});</span><br></pre></td></tr></table></figure><p>&#x4EE3;&#x7801;&#x4E2D;&#x53EF;&#x4EE5;&#x770B;&#x51FA;&#xFF0C;&#x56FE;&#x7247;&#x62D6;&#x62FD;&#x4E5F;&#x662F;&#x6709;&#x8FB9;&#x754C;&#x7684;&#xFF0C;&#x8BA1;&#x7B97;&#x6700;&#x5C0F;&#x7684;<code>left</code>&#x548C;<code>top</code>&#x503C;&#x3002;</p><h3 id="&#x56FE;&#x7247;&#x7F29;&#x653E;"><a href="#&#x56FE;&#x7247;&#x7F29;&#x653E;" class="headerlink" title="&#x56FE;&#x7247;&#x7F29;&#x653E;"></a>&#x56FE;&#x7247;&#x7F29;&#x653E;</h3><p>&#x56FE;&#x7247;&#x7F29;&#x653E;&#x5F88;&#x7B80;&#x5355;&#xFF0C;&#x4E3B;&#x8981;&#x5728;&#x5BBD;&#x9AD8;&#x6BD4;&#x56FA;&#x5B9A;&#x7684;&#x6761;&#x4EF6;&#x4E0B;&#xFF0C;&#x8C03;&#x6574;&#x56FE;&#x7247;&#x7684;&#x5BBD;&#x5EA6;&#x548C;&#x9AD8;&#x5EA6;&#x3002;</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">resizeImg: <span class="function"><span class="keyword">function</span>(<span class="params">radio</span>)</span>{</span><br><span class="line">  <span class="keyword">var</span> $imgs = $(<span class="string">&apos;#avatarEditorDialog&apos;</span>).find(<span class="string">&apos;img&apos;</span>);</span><br><span class="line">  <span class="keyword">var</span> height = $imgs.height();</span><br><span class="line">  <span class="keyword">var</span> width = $imgs.width();</span><br><span class="line">  <span class="keyword">if</span>(height &gt; width){</span><br><span class="line">    $imgs.css({</span><br><span class="line">      <span class="attr">width</span>: BASE * radio,</span><br><span class="line">      <span class="attr">height</span>: (BASE * height / width) * radio,</span><br><span class="line">      <span class="attr">top</span>: -((BASE * height / width) * radio - <span class="number">310</span>) / <span class="number">2</span>,</span><br><span class="line">      <span class="attr">left</span>: -(BASE * radio - <span class="number">310</span>) / <span class="number">2</span></span><br><span class="line">    });</span><br><span class="line">  }<span class="keyword">else</span>{</span><br><span class="line">    $imgs.css({</span><br><span class="line">      <span class="attr">height</span>: BASE * radio,</span><br><span class="line">      <span class="attr">width</span>: (BASE * width / height) * radio,</span><br><span class="line">      <span class="attr">top</span>: -(BASE * radio - <span class="number">310</span>) / <span class="number">2</span>,</span><br><span class="line">      <span class="attr">left</span> : -((BASE * width / height) * radio - <span class="number">310</span>) / <span class="number">2</span></span><br><span class="line">    });</span><br><span class="line">  }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="&#x56FE;&#x7247;&#x88C1;&#x526A;"><a href="#&#x56FE;&#x7247;&#x88C1;&#x526A;" class="headerlink" title="&#x56FE;&#x7247;&#x88C1;&#x526A;"></a>&#x56FE;&#x7247;&#x88C1;&#x526A;</h3><p>&#x8FD9;&#x91CC;&#x7684;&#x88C1;&#x526A;&#x5DE5;&#x4F5C;&#x662F;&#x5728;&#x524D;&#x7AEF;&#x5B8C;&#x6210;&#x7684;&#xFF0C;&#x9700;&#x8981;&#x501F;&#x52A9;Canvas&#x7684;&#x4E00;&#x4E9B;&#x63A5;&#x53E3;&#x3002;</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> canvas = <span class="built_in">document</span>.createElement(<span class="string">&apos;canvas&apos;</span>);</span><br><span class="line">canvas.id = <span class="string">&apos;avatarCanvas&apos;</span>;</span><br><span class="line"><span class="keyword">var</span> ctx = canvas.getContext(<span class="string">&apos;2d&apos;</span>);</span><br><span class="line"><span class="keyword">var</span> $img = $(<span class="string">&apos;.avatar-editor-window-inner img&apos;</span>);</span><br><span class="line"><span class="keyword">var</span> originalWidth = <span class="built_in">parseFloat</span>($img.attr(<span class="string">&apos;data-original-width&apos;</span>));</span><br><span class="line"><span class="keyword">var</span> originalHeight = <span class="built_in">parseFloat</span>($img.attr(<span class="string">&apos;data-original-height&apos;</span>));</span><br><span class="line"><span class="keyword">var</span> nWidth = $img.width();</span><br><span class="line"><span class="keyword">var</span> nHeight = $img.height();</span><br><span class="line"><span class="keyword">var</span> x = (<span class="number">30</span> - <span class="built_in">parseFloat</span>($img.css(<span class="string">&apos;left&apos;</span>))) * originalWidth / nWidth;</span><br><span class="line"><span class="keyword">var</span> y = (<span class="number">30</span> - <span class="built_in">parseFloat</span>($img.css(<span class="string">&apos;top&apos;</span>))) * originalHeight / nHeight;</span><br><span class="line">canvas.width = BASE * originalWidth / nWidth;</span><br><span class="line">canvas.style.width = canvas.width;</span><br><span class="line">canvas.height = BASE * originalHeight / nHeight;</span><br><span class="line">canvas.style.height = canvas.height;</span><br><span class="line">ctx.drawImage($img[<span class="number">0</span>], x, y, canvas.width, canvas.height, <span class="number">0</span>, <span class="number">0</span>, canvas.width, canvas.height);</span><br><span class="line"><span class="keyword">var</span> avatar = canvas.toDataURL($img.attr(<span class="string">&apos;src&apos;</span>).match(<span class="regexp">/data:(.*);base64/</span>)[<span class="number">1</span>] || <span class="string">&apos;image/jpg&apos;</span>);</span><br></pre></td></tr></table></figure><p><code>drawImage</code>&#x65B9;&#x6CD5;&#x7684;&#x529F;&#x80FD;&#x662F;&#x5C06;&#x56FE;&#x7247;&#x4E0A;&#x7684;&#x67D0;&#x4E2A;&#x70B9;&#x4F5C;&#x4E3A;&#x951A;&#x70B9;&#xFF0C;&#x7ED8;&#x5236;&#x6307;&#x5B9A;&#x7684;&#x5BBD;&#x5EA6;&#x548C;&#x9AD8;&#x5EA6;&#x5230;Canvas&#x6807;&#x7B7E;&#x3002;</p><blockquote><p>&#x5B8C;&#x6574;&#x7684;demo&#x4EE3;&#x7801;&#x8BF7;&#x79FB;&#x6B65;&#x81F3;<a href="https://github.com/brucewar/avatar-upload" target="_blank" rel="external">brucewar/avatar-upload</a></p></blockquote><p>&#x6709;&#x5FC3;&#x7684;&#x8BFB;&#x8005;&#x53EF;&#x80FD;&#x5DF2;&#x7ECF;&#x53D1;&#x73B0;&#xFF0C;&#x77E5;&#x4E4E;&#x7684;&#x5934;&#x50CF;&#x4E0A;&#x4F20;&#x529F;&#x80FD;&#x5DF2;&#x7ECF;&#x6362;&#x4E86;&#x4E00;&#x79CD;&#x5B9E;&#x73B0;&#x65B9;&#x6848;&#x3002;&#x4E0D;&#x9519;&#xFF0C;&#x8FD9;&#x8FD8;&#x662F;&#x4E4B;&#x524D;&#x7684;&#x65B9;&#x6848;&#xFF0C;&#x901A;&#x8FC7;&#x4E0A;&#x4E0B;&#x4E24;&#x5F20;&#x56FE;&#x7247;&#x5B9E;&#x73B0;&#x9884;&#x89C8;&#x65F6;&#x7684;&#x8FB9;&#x754C;&#x534A;&#x900F;&#x660E;&#x6548;&#x679C;&#x3002;</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&amp;#x5565;&amp;#x90FD;&amp;#x4E0D;&amp;#x8BF4;&amp;#xFF0C; &amp;#x76F4;&amp;#x63A5;&amp;#x5148;&amp;#x6765;&amp;#x4E00;&amp;#x5F20;&amp;#x6548;&amp;#x679C;&amp;#x56FE;&amp;#x2026;&amp;#x2026;&lt;/p&gt;&lt;p&gt;&lt;
    
    </summary>
    
      <category term="前端开发" scheme="http://brucewar.cn/categories/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/"/>
    
    
      <category term="JavaScript" scheme="http://brucewar.cn/tags/JavaScript/"/>
    
      <category term="头像上传" scheme="http://brucewar.cn/tags/%E5%A4%B4%E5%83%8F%E4%B8%8A%E4%BC%A0/"/>
    
  </entry>
  
  <entry>
    <title> windows下node版本管理:nvm-windows</title>
    <link href="http://brucewar.cn/2017/01/13/windows%E4%B8%8Bnode%E7%89%88%E6%9C%AC%E7%AE%A1%E7%90%86-nvm-windows/"/>
    <id>http://brucewar.cn/2017/01/13/windows下node版本管理-nvm-windows/</id>
    <published>2017-01-13T01:18:18.000Z</published>
    <updated>2017-05-06T03:36:19.617Z</updated>
    
    <content type="html"><![CDATA[<p>&#x6700;&#x8FD1;&#x5DE5;&#x4F5C;&#x4E0A;&#x63A5;&#x624B;&#x4E86;&#x4E24;&#x4E2A;&#x9879;&#x76EE;&#xFF0C;&#x53EF;&#x5B83;&#x4EEC;&#x4F9D;&#x8D56;&#x7684;node&#x7248;&#x672C;&#x4E0D;&#x540C;&#xFF0C;&#x4E8E;&#x662F;&#x60F3;&#x5230;&#x4E86;&#x4E4B;&#x524D;&#x7528;&#x7684;<strong>nvm</strong>&#xFF08;Node Version Manager&#xFF09;&#x3002;</p><blockquote><p><a href="https://github.com/creationix/nvm" target="_blank" rel="external">https://github.com/creationix/nvm</a></p></blockquote><p>&#x4E4B;&#x524D;&#x5B89;&#x88C5;nvm&#x7684;&#x65B9;&#x5F0F;&#x662F;&#x901A;&#x8FC7;<code>npm install nvm</code>&#xFF0C;&#x800C;&#x65B0;&#x7248;&#x672C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x811A;&#x672C;&#x6216;&#x8005;&#x624B;&#x52A8;&#x5B89;&#x88C5;&#x3002;&#x76EE;&#x524D;&#xFF0C;nvm&#x6CA1;&#x6709;&#x63D0;&#x4F9B;windows&#x7684;&#x652F;&#x6301;&#xFF0C;&#x4F46;&#x662F;&#x5728;&#x5176;&#x6587;&#x6863;&#x4E2D;&#x63D0;&#x5230;&#x4E86;<strong>nvm-windows</strong>&#x8FD9;&#x4E2A;&#x5DE5;&#x5177;&#x3002;</p><blockquote><p><a href="https://github.com/coreybutler/nvm-windows" target="_blank" rel="external">https://github.com/coreybutler/nvm-windows</a></p></blockquote><h3 id="&#x5B89;&#x88C5;"><a href="#&#x5B89;&#x88C5;" class="headerlink" title="&#x5B89;&#x88C5;"></a>&#x5B89;&#x88C5;</h3><p>&#x5728;&#x5B89;&#x88C5;nvm-windows&#x524D;&#xFF0C;&#x9700;&#x8981;&#x505A;&#x4EE5;&#x4E0B;&#x6B65;&#x9AA4;&#xFF1A;</p><ol><li>&#x5378;&#x8F7D;&#x7CFB;&#x7EDF;&#x4E2D;&#x5DF2;&#x6709;&#x7684;node.js</li><li>&#x5220;&#x9664;node.js&#x5B89;&#x88C5;&#x76EE;&#x5F55;&#xFF08;&#x4F8B;&#x5982;<code>C:\Program Files\nodejs</code>&#xFF09;</li><li>&#x5220;&#x9664;npm&#x5305;&#x7684;&#x76EE;&#x5F55;&#xFF08;&#x4F8B;&#x5982;<code>C:\Users&lt;user&gt;\AppData\Roaming\npm</code>&#xFF09;</li></ol><p><img src="/2017/01/13/windows&#x4E0B;node&#x7248;&#x672C;&#x7BA1;&#x7406;-nvm-windows/release.png" alt="&#x6253;&#x5F00;release&#x9875;&#x9762;"></p><p>&#x6253;&#x5F00;release&#x9875;&#x9762;&#xFF0C;&#x4E0B;&#x8F7D;&#x6700;&#x65B0;&#x7248;&#x672C;&#x7684;&#x5B89;&#x88C5;&#x5305;&#x3002;</p><p><img src="/2017/01/13/windows&#x4E0B;node&#x7248;&#x672C;&#x7BA1;&#x7406;-nvm-windows/install.png" alt="&#x5B89;&#x88C5;"></p><h3 id="&#x66F4;&#x65B0;"><a href="#&#x66F4;&#x65B0;" class="headerlink" title="&#x66F4;&#x65B0;"></a>&#x66F4;&#x65B0;</h3><p>&#x66F4;&#x65B0;&#x4E5F;&#x5F88;&#x7B80;&#x5355;&#xFF0C;&#x76F4;&#x63A5;&#x4E0B;&#x8F7D;&#x6700;&#x65B0;&#x7248;&#x7684;nvm-windows&#x5B89;&#x88C5;&#x5373;&#x53EF;&#x3002;&#x5B83;&#x5C06;&#x5B89;&#x5168;&#x7684;&#x8986;&#x76D6;&#x6587;&#x4EF6;&#x3002;</p><h3 id="&#x4F7F;&#x7528;&#x65B9;&#x6CD5;"><a href="#&#x4F7F;&#x7528;&#x65B9;&#x6CD5;" class="headerlink" title="&#x4F7F;&#x7528;&#x65B9;&#x6CD5;"></a>&#x4F7F;&#x7528;&#x65B9;&#x6CD5;</h3><ul><li><code>nvm install &lt;version&gt; [arch]</code>&#xFF1A;version&#x53EF;&#x4EE5;&#x662F;&#x6307;&#x5B9A;&#x7684;node.js&#x7248;&#x672C;&#x6216;&#x8005;<code>latest</code>&#xFF08;&#x6700;&#x65B0;&#x7248;&#xFF09;&#xFF0C;arch&#x53EF;&#x4EE5;&#x662F;<code>32</code>&#x3001;<code>64</code>&#x6216;&#x8005;<code>all</code></li><li><code>nvm list [available]</code>&#xFF1A;&#x5217;&#x51FA;&#x5F53;&#x524D;&#x5DF2;&#x7ECF;&#x5B89;&#x88C5;&#x7684;node.js&#x7248;&#x672C;&#xFF0C;<code>available</code>&#x53C2;&#x6570;&#x5217;&#x51FA;&#x53EF;&#x5B89;&#x88C5;&#x7248;&#x672C;</li><li><code>nvm use &lt;version&gt; [arch]</code>&#xFF1A;&#x5207;&#x6362;node.js&#x7248;&#x672C;</li></ul><p>&#x8FD9;&#x91CC;&#x5C31;&#x4ECB;&#x7ECD;&#x51E0;&#x4E2A;&#x5E38;&#x7528;&#x547D;&#x4EE4;&#xFF0C;&#x66F4;&#x591A;&#x547D;&#x4EE4;&#x8BF7;&#x81EA;&#x884C;&#x770B;&#x6587;&#x6863;&#x3002;</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&amp;#x6700;&amp;#x8FD1;&amp;#x5DE5;&amp;#x4F5C;&amp;#x4E0A;&amp;#x63A5;&amp;#x624B;&amp;#x4E86;&amp;#x4E24;&amp;#x4E2A;&amp;#x9879;&amp;#x76EE;&amp;#xFF0C;&amp;#x53EF;&amp;#x5B83;&amp;#x4EEC;&amp;#x4F9D;&amp;
    
    </summary>
    
      <category term="Node.js" scheme="http://brucewar.cn/categories/Node-js/"/>
    
    
      <category term="nvm" scheme="http://brucewar.cn/tags/nvm/"/>
    
      <category term="node.js" scheme="http://brucewar.cn/tags/node-js/"/>
    
      <category term="nvm-windows" scheme="http://brucewar.cn/tags/nvm-windows/"/>
    
  </entry>
  
  <entry>
    <title>2016年终总结</title>
    <link href="http://brucewar.cn/2016/12/25/2016%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%93/"/>
    <id>http://brucewar.cn/2016/12/25/2016年终总结/</id>
    <published>2016-12-24T16:00:00.000Z</published>
    <updated>2016-12-25T01:46:19.161Z</updated>
    
    <content type="html"><![CDATA[<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width="330" height="86" src="//music.163.com/outchain/player?type=2&amp;id=29750099&amp;auto=0&amp;height=66"></iframe><p>&#x53C8;&#x5230;&#x4E86;&#x4E00;&#x5E74;&#x4E00;&#x5EA6;&#x7684;&#x5723;&#x8BDE;&#x8282;&#xFF0C;&#x6BCF;&#x5F53;&#x5230;&#x4E86;&#x8FD9;&#x5929;&#x5C31;&#x610F;&#x5473;&#x7740;&#x8FD9;&#x4E00;&#x5E74;&#x5C31;&#x8981;&#x7ED3;&#x675F;&#x4E86;&#xFF0C;&#x4E5F;&#x610F;&#x5473;&#x7740;&#x53C8;&#x957F;&#x4E86;&#x4E00;&#x5C81;&#x3002;&#x5176;&#x5B9E;&#x6211;&#x4E0D;&#x662F;&#x4E00;&#x4E2A;&#x7279;&#x522B;&#x559C;&#x6B22;&#x5199;&#x5E74;&#x7EC8;&#x603B;&#x7ED3;&#x7684;&#x4EBA;&#xFF0C;&#x4F46;&#x5BF9;&#x4E8E;&#x6211;&#x6765;&#x8BF4;&#xFF0C;2016&#x662F;&#x201C;&#x4E0D;&#x5B89;&#x5206;&#x201D;&#x7684;&#x4E00;&#x5E74;&#x3002;&#x5F53;&#x7136;&#x8FD9;&#x91CC;&#x7684;<em>&#x4E0D;&#x5B89;&#x5206;</em>&#x52A0;&#x4E86;&#x5F15;&#x53F7;&#xFF0C;&#x56E0;&#x4E3A;&#x6211;&#x4ECA;&#x5E74;&#x7ECF;&#x5386;&#x4E86;&#x633A;&#x591A;&#x4E8B;&#xFF0C;&#x4E5F;&#x6210;&#x957F;&#x4E86;&#x5F88;&#x591A;&#xFF0C;&#x6211;&#x7528;&#x4E0B;&#x9762;&#x51E0;&#x4E2A;&#x8BCD;&#x6765;&#x603B;&#x7ED3;&#x6211;&#x7684;2016&#xFF1A;</p><ul><li>&#x8BFB;&#x4E66;</li><li>&#x8FD0;&#x52A8;</li><li>&#x623F;&#x5974;</li><li>&#x8DF3;&#x69FD;</li><li>&#x604B;&#x7231;&#x548C;&#x5206;&#x624B;</li><li>Be myself</li></ul><p>2015&#x5E74;&#x672B;&#xFF0C;&#x6211;&#x8FD8;&#x6CA1;&#x6709;&#x4E70;&#x623F;&#x7684;&#x6253;&#x7B97;&#xFF0C;&#x5728;&#x5BB6;&#x4EBA;&#x7684;&#x50AC;&#x4FC3;&#x4E0B;&#xFF0C;&#x6211;&#x5F00;&#x59CB;&#x770B;&#x4E86;&#x51E0;&#x4E2A;&#x697C;&#x76D8;&#xFF0C;&#x4F46;&#x662F;&#x4E5F;&#x6CA1;&#x6709;&#x592A;&#x8FC7;&#x8BA4;&#x771F;&#x5BF9;&#x5F85;&#x8FD9;&#x4EF6;&#x4E8B;&#x3002;&#x518D;&#x540E;&#x6765;&#xFF0C;&#x6211;&#x5988;&#x548C;&#x6211;&#x59D0;&#x6765;&#x5357;&#x4EAC;&#x4E5F;&#x4E00;&#x8D77;&#x770B;&#x4E86;&#x51E0;&#x4E2A;&#x5C0F;&#x533A;&#xFF0C;&#x6700;&#x7EC8;&#x5728;2016&#x5E74;&#x7684;&#x7B2C;&#x4E00;&#x5929;&#x5B9A;&#x4E0B;&#x4E86;&#x623F;&#x5B50;&#xFF0C;&#x4E5F;&#x7B97;&#x5728;&#x5357;&#x4EAC;&#x624E;&#x6839;&#x4E86;&#xFF01;&#x5F53;&#x7136;&#xFF0C;&#x975E;&#x5E38;&#x611F;&#x8C22;&#x6211;&#x59D0;&#x7684;&#x679C;&#x65AD;&#xFF0C;&#x4E5F;&#x611F;&#x8C22;&#x4EB2;&#x621A;&#x7684;&#x5E2E;&#x52A9;&#x3002;&#x8BF4;&#x5B9E;&#x8BDD;&#xFF0C;&#x5C31;&#x5728;&#x90A3;&#x5929;&#x6211;&#x8111;&#x5B50;&#x91CC;&#x8F6C;&#x7684;&#x662F;&#xFF0C;&#x201C;&#x55EF;&#xFF0C;&#x6709;&#x4E86;&#x5B83;&#x5C31;&#x610F;&#x5473;&#x7740;&#x6211;&#x80A9;&#x4E0A;&#x7684;&#x8D23;&#x4EFB;&#x66F4;&#x5927;&#x4E86;&#xFF0C;&#x6211;&#x4E5F;&#x5C06;&#x8FC8;&#x5165;<strong>&#x623F;&#x5974;</strong>&#x7684;&#x751F;&#x6D3B;&#x2026;&#x201D;&#x3002;&#x8FD9;&#x4E9B;&#x60F3;&#x6CD5;&#x8BA9;&#x5F53;&#x65F6;&#x7684;&#x6211;&#x6709;&#x70B9;&#x61F5;&#xFF0C;&#x4F46;&#x662F;&#x4EBA;&#x603B;&#x8981;&#x6210;&#x957F;&#xFF0C;&#x603B;&#x8981;&#x9762;&#x5BF9;&#x8FD9;&#x4E9B;&#x95EE;&#x9898;&#xFF0C;&#x800C;&#x4E0D;&#x80FD;&#x603B;&#x60F3;&#x7740;&#x9003;&#x907F;&#x3002;</p><p>&#x8FD8;&#x8BB0;&#x5F97;&#x4E8C;&#x6708;&#x4EFD;&#xFF0C;&#x7B1B;&#x98CE;&#x7814;&#x53D1;&#x90E8;&#x5206;&#x7EC4;&#xFF0C;&#x201C;&#x6709;&#x5E78;&#x201D;&#xFF08;&#x5F53;&#x7136;&#x8FD9;&#x4E9B;&#x4E8B;&#x5927;&#x5BB6;&#x90FD;&#x5FC3;&#x7167;&#x4E0D;&#x5BA3;&#xFF09;&#x52A0;&#x5165;&#x857E;&#x7237;&#x7684;&#x7B1B;&#x98CE;CRM&#x5F00;&#x53D1;&#x7EC4;&#xFF0C;&#x8D1F;&#x8D23;CRM&#x7684;&#x524D;&#x7AEF;&#x5F00;&#x53D1;&#x5DE5;&#x4F5C;&#xFF0C;&#x548C;&#x857E;&#x7237;&#x5408;&#x4F5C;&#x7684;&#x5F88;&#x5F00;&#x5FC3;&#xFF01;&#x5E76;&#x4E14;&#x4E5F;&#x548C;&#x51E0;&#x4E2A;&#x5C0F;&#x4F19;&#x4F34;&#x5F00;&#x59CB;&#x4E86;&#x9A6C;&#x62C9;&#x677E;&#x7684;&#x51C6;&#x5907;&#xFF0C;&#x5927;&#x5BB6;&#x4E92;&#x76F8;&#x9F13;&#x52B1;&#x548C;&#x76D1;&#x7763;&#xFF0C;&#x4E00;&#x76F4;&#x575A;&#x6301;&#x8DD1;&#x6B65;&#x3002;&#x81EA;&#x4ECE;&#x8DD1;&#x6B65;&#x540E;&#xFF0C;&#x540C;&#x4E8B;&#x8BF4;&#x6211;&#x6C14;&#x8272;&#x5F88;&#x597D;&#xFF08;&#x4E0D;&#x7BA1;&#x662F;&#x4E0D;&#x662F;&#x771F;&#x7684;&#xFF0C;&#x5185;&#x5FC3;&#x90FD;&#x662F;&#x6FC0;&#x52A8;&#x7684;&#xFF09;&#xFF0C;&#x5F53;&#x7136;&#xFF0C;&#x6211;&#x81EA;&#x5DF1;&#x4E5F;&#x4F1A;&#x611F;&#x89C9;&#x5230;&#x6BD4;&#x4EE5;&#x524D;&#x66F4;&#x81EA;&#x4FE1;&#x3001;&#x66F4;&#x6709;&#x7CBE;&#x795E;&#x3002;&#x611F;&#x8C22;&#x5728;&#x7B1B;&#x98CE;&#x8BA4;&#x8BC6;&#x7684;&#x8FD9;&#x4E9B;&#x5C0F;&#x4F19;&#x4F34;&#xFF01;</p><blockquote><p>&#x5708;&#x5B50;&#x51B3;&#x5B9A;&#x4EBA;&#x751F;&#xFF0C;&#x63A5;&#x8FD1;&#x4EC0;&#x4E48;&#x6837;&#x7684;&#x4EBA;&#xFF0C;&#x5C31;&#x4F1A;&#x8D70;&#x4EC0;&#x4E48;&#x6837;&#x7684;&#x8DEF;&#xFF0C;&#x6240;&#x8C13;&#x7269;&#x4EE5;&#x7C7B;&#x805A;&#xFF0C;&#x4EBA;&#x4EE5;&#x7FA4;&#x5206;&#x3002;&#x724C;&#x53CB;&#x53EA;&#x4F1A;&#x50AC;&#x4F60;&#x6253;&#x724C;&#xFF1B;&#x9152;&#x53CB;&#x53EA;&#x4F1A;&#x50AC;&#x4F60;&#x5E72;&#x676F;&#xFF1B;&#x800C;&#x9760;&#x8C31;&#x7684;&#x4EBA;&#x5374;&#x4F1A;&#x611F;&#x67D3;&#x4F60;&#x5982;&#x4F55; &#x53D6;&#x5F97;&#x8FDB;&#x6B65;&#xFF01;</p></blockquote><p>&#x53EF;&#x80FD;&#x4E0A;&#x534A;&#x5E74;&#x592A;&#x8FC7;&#x6D6E;&#x8E81;&#xFF0C;&#x6240;&#x4EE5;&#x4ECA;&#x5E74;&#x4E5F;&#x6CA1;&#x8BFB;&#x51E0;&#x672C;&#x4E66;&#x3002;&#x5F53;&#x7136;&#xFF0C;&#x4EC0;&#x4E48;&#x65F6;&#x5019;&#x8BFB;&#x4E66;&#x90FD;&#x4E0D;&#x665A;&#xFF0C;&#x53EA;&#x6015;&#x4F60;&#x7F3A;&#x4E4F;&#x91CD;&#x65B0;&#x5F00;&#x59CB;&#x7684;&#x52C7;&#x6C14;&#x3002;&#x6240;&#x4EE5;&#xFF0C;&#x5728;&#x8FD9;&#x91CC;&#x7ED9;&#x5927;&#x5BB6;&#x63A8;&#x8350;&#x51E0;&#x672C;&#x4E0D;&#x9519;&#x7684;&#x4E66;&#x2014;&#x2014;&#x300A;&#x89E3;&#x5FE7;&#x6742;&#x8D27;&#x5E97;&#x300B;&#x3001;&#x300A;&#x6C9F;&#x901A;&#x7684;&#x827A;&#x672F;&#x300B;&#x3001;&#x300A;&#x5F53;&#x6211;&#x8C08;&#x8DD1;&#x6B65;&#x65F6;&#x6211;&#x8C08;&#x4E9B;&#x4EC0;&#x4E48;&#x300B;&#x3001;&#x300A;&#x4EBA;&#x7C7B;&#x7B80;&#x53F2;&#x300B;&#x3002;&#x6700;&#x8FD1;&#x521A;&#x770B;&#x5B8C;&#x300A;&#x4EBA;&#x7C7B;&#x7B80;&#x53F2;&#x300B;&#x8FD9;&#x672C;&#x4E66;&#xFF0C;&#x4F5C;&#x8005;&#x5BF9;&#x4EBA;&#x7C7B;&#x7684;&#x5386;&#x53F2;&#x8FDB;&#x7A0B;&#x6709;&#x7740;&#x6DF1;&#x523B;&#x7684;&#x4E2A;&#x4EBA;&#x7406;&#x89E3;&#x3002;&#x540C;&#x65F6;&#xFF0C;&#x4E5F;&#x8BA9;&#x6211;&#x5BF9;&#x5386;&#x53F2;&#x8D8A;&#x6765;&#x8D8A;&#x611F;&#x5174;&#x8DA3;&#x3002;&#x5E38;&#x8A00;&#x9053;&#xFF0C;&#x8BFB;&#x53F2;&#x53EF;&#x4EE5;&#x660E;&#x5FD7;&#x3002;</p><blockquote class="blockquote-center">&#x552F;&#x8BFB;&#x4E66;&#x548C;&#x8DD1;&#x6B65;&#x4E0D;&#x53EF;&#x8F9C;&#x8D1F;&#x3002;</blockquote><p>&#x65E5;&#x590D;&#x4E00;&#x65E5;&#x7684;&#x5DE5;&#x4F5C;&#xFF0C;&#x6211;&#x8FD9;&#x9897;&#x6D6E;&#x8E81;&#x7684;&#x5FC3;&#x7EC8;&#x4E8E;&#x6309;&#x637A;&#x4E0D;&#x4F4F;&#x4E86;&#xFF0C;&#x4E8E;&#x662F;&#x4E5D;&#x6708;&#x4EFD;&#x9F13;&#x8D77;&#x5F88;&#x5927;&#x7684;&#x52C7;&#x6C14;&#x63D0;&#x4E86;&#x79BB;&#x804C;&#xFF0C;&#x4E5F;&#x662F;&#x4EBA;&#x751F;&#x4E2D;&#x7B2C;&#x4E00;&#x4EFD;&#x6B63;&#x5F0F;&#x5DE5;&#x4F5C;&#x7684;&#x7ED3;&#x675F;&#x3002;&#x5F53;&#x7136;&#xFF0C;&#x975E;&#x5E38;&#x611F;&#x8C22;&#x7B1B;&#x98CE;&#x5047;&#x671F;&#x7684;&#x540C;&#x4E8B;&#xFF0C;&#x5927;&#x5BB6;&#x5728;&#x4E00;&#x8D77;&#x5171;&#x4E8B;&#x5F88;&#x6109;&#x5FEB;&#xFF01;&#x7B2C;&#x4E8C;&#x4EFD;&#x5DE5;&#x4F5C;&#xFF0C;&#x6211;&#x6311;&#x4E86;&#x4E00;&#x4E2A;&#x5F88;&#x6709;&#x610F;&#x4E49;&#x7684;&#x5165;&#x804C;&#x65E5;&#x671F;&#xFF08;10&#x6708;10&#x53F7;&#xFF0C;1010&#xFF0C;&#x7A0B;&#x5E8F;&#x733F;&#x90FD;&#x61C2;&#xFF09;&#xFF0C;&#x6B63;&#x5F0F;&#x5F00;&#x59CB;&#x4E86;&#x6211;&#x5DE5;&#x4F5C;&#x751F;&#x6DAF;&#x65B0;&#x7684;&#x7BC7;&#x7AE0;&#x3002;&#x4E0D;&#x77E5;&#x4E0D;&#x89C9;&#xFF0C;&#x5165;&#x804C;<a href="http://www.hansight.com" target="_blank" rel="external">HanSight&#x701A;&#x601D;</a>&#x5FEB;&#x4E09;&#x4E2A;&#x6708;&#x4E86;&#xFF0C;&#x5728;&#x8FD9;&#x91CC;&#x4E0E;&#x65B0;&#x540C;&#x4E8B;&#x5DE5;&#x4F5C;&#x7684;&#x975E;&#x5E38;&#x6109;&#x5FEB;&#x3002;&#x867D;&#x7136;&#x6BCF;&#x5929;&#x90FD;&#x5F97;&#x6324;&#x5730;&#x94C1;&#xFF0C;&#x4E0D;&#x8FC7;&#xFF0C;&#x6211;&#x4E5F;&#x80FD;&#x9759;&#x4E0B;&#x5FC3;&#x6765;&#x597D;&#x597D;&#x5229;&#x7528;&#x8FD9;&#x4E9B;&#x788E;&#x7247;&#x65F6;&#x95F4;&#xFF0C;&#x770B;&#x770B;&#x4E66;&#xFF0C;&#x601D;&#x8003;&#x601D;&#x8003;&#x4EBA;&#x751F;&#xFF08;&#x54C8;&#x54C8;&#xFF09;&#x3002;&#x987A;&#x4FBF;&#x5E2E;&#x516C;&#x53F8;&#x505A;&#x4E2A;&#x5BA3;&#x4F20;&#xFF0C;HanSight&#x5357;&#x4EAC;&#x7814;&#x53D1;&#x4E2D;&#x5FC3;&#x62DB;&#x4EBA;&#xFF0C;&#x6709;&#x610F;&#x5411;&#x7684;&#x6B22;&#x8FCE;&#x6295;&#x7B80;&#x5386;&#x5230;&#x6211;&#x7684;&#x5DE5;&#x4F5C;&#x90AE;&#x7BB1;<a href="mailto:**jinlong_wang@hansight.com" target="_blank" rel="external">**jinlong_wang@hansight.com</a>**&#x3002;</p><p>&#x5728;&#x5165;&#x804C;&#x65B0;&#x516C;&#x53F8;&#x7684;&#x540C;&#x65F6;&#xFF0C;&#x6211;&#x4E5F;&#x5F00;&#x59CB;&#x4E86;&#x4EBA;&#x751F;&#x4E2D;&#x7B2C;&#x4E00;&#x6BB5;&#x611F;&#x60C5;&#xFF0C;10&#x6708;15&#x65E5;&#x4E0E;&#x5979;&#x6B63;&#x5F0F;&#x786E;&#x8BA4;&#x5173;&#x7CFB;&#xFF0C;&#x4E00;&#x4E2A;&#x6708;&#x4E0D;&#x5230;&#x53C8;&#x5206;&#x624B;&#x3002;&#x5F53;&#x7136;&#xFF0C;&#x8FC7;&#x53BB;&#x7684;&#x5DF2;&#x6210;&#x8FC7;&#x53BB;&#xFF0C;&#x4F60;&#x6211;&#x90FD;&#x8981;&#x7EE7;&#x7EED;&#x5F80;&#x524D;&#x8D70;&#xFF0C;&#x4E5F;&#x611F;&#x8C22;&#x8FD9;&#x6BB5;&#x7ECF;&#x5386;&#x5E26;&#x7ED9;&#x6211;&#x7684;&#x6210;&#x957F;&#x3002;</p><p>&#x4E0D;&#x77E5;&#x4E0D;&#x89C9;&#xFF0C;&#x591C;&#x5DF2;&#x6DF1;&#xFF0C;&#x53EF;&#x80FD;&#x771F;&#x7684;&#x53EA;&#x6709;&#x591C;&#x6DF1;&#x4EBA;&#x9759;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x624D;&#x80FD;&#x597D;&#x597D;&#x6574;&#x7406;&#x81EA;&#x5DF1;&#x7684;&#x601D;&#x7EEA;&#x3002;&#x65B0;&#x7684;&#x4E00;&#x5E74;&#xFF0C;&#x4E5F;&#x4E3A;&#x81EA;&#x5DF1;&#x5B9A;&#x4E0B;&#x76EE;&#x6807;&#xFF1A;&#x505A;&#x81EA;&#x5DF1;&#xFF08;Be myself&#xFF09;&#x3002;&#x7EE7;&#x7EED;&#x575A;&#x6301;&#x8DD1;&#x6B65;&#x3001;&#x575A;&#x6301;&#x8BFB;&#x4E66;&#x3001;&#x575A;&#x6301;&#x65E9;&#x7761;&#x65E9;&#x8D77;&#x7684;&#x4E60;&#x60EF;&#x3001;&#x5728;&#x6280;&#x672F;&#x4E0A;&#x5BF9;&#x81EA;&#x5DF1;&#x8981;&#x6C42;&#x66F4;&#x4E25;&#x683C;&#x3001;&#x9759;&#x4E0B;&#x5FC3;&#x6765;&#x6DF1;&#x5165;&#x524D;&#x7AEF;&#x9886;&#x57DF;&#xFF08;&#x4E3B;&#x8981;&#x662F;React&#x6280;&#x672F;&#x6808;&#xFF09;&#x3002;</p><p>&#x6700;&#x540E;&#xFF0C;&#x9001;&#x7ED9;&#x81EA;&#x5DF1;&#x4E00;&#x53E5;&#x8BDD;&#xFF1A;&#x4F46;&#x613F;&#x6211;&#x4ECE;&#x4E0D;&#x7F3A;&#x4E4F;&#x91CD;&#x65B0;&#x5F00;&#x59CB;&#x7684;&#x52C7;&#x6C14;&#x3002;</p>]]></content>
    
    <summary type="html">
    
      &lt;iframe frameborder=&quot;no&quot; border=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; width=&quot;330&quot; height=&quot;86&quot; src=&quot;//music.163.com/outchain/player?type=2&amp;amp
    
    </summary>
    
      <category term="随笔" scheme="http://brucewar.cn/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
      <category term="2016" scheme="http://brucewar.cn/tags/2016/"/>
    
      <category term="年终总结" scheme="http://brucewar.cn/tags/%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%93/"/>
    
  </entry>
  
  <entry>
    <title>npm3.0新的依赖解决方案</title>
    <link href="http://brucewar.cn/2016/12/20/npm3-0%E6%96%B0%E7%9A%84%E4%BE%9D%E8%B5%96%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/"/>
    <id>http://brucewar.cn/2016/12/20/npm3-0新的依赖解决方案/</id>
    <published>2016-12-20T15:02:20.000Z</published>
    <updated>2017-05-06T03:35:50.303Z</updated>
    
    <content type="html"><![CDATA[<p>&#x6700;&#x8FD1;&#x7ED9;&#x6211;&#x7684;&#x88C5;&#x5907;&#xFF08;<em>Thinkpad S3-s431</em>&#xFF09;&#x5347;&#x4E86;&#x4E00;&#x4E0B;&#x7EA7;&#xFF0C;&#x5C06;&#x539F;&#x672C;&#x7528;&#x6765;&#x52A0;&#x901F;&#x7F13;&#x5B58;&#x7684;<code>24G</code>&#x56FA;&#x6001;&#x786C;&#x76D8;&#x6362;&#x6210;&#x4E86;<code>128G</code>&#x3002;&#x6240;&#x4EE5;&#x5F97;&#x91CD;&#x88C5;&#x7CFB;&#x7EDF;&#xFF0C;&#x7136;&#x540E;&#x4E00;&#x5806;&#x8F6F;&#x4EF6;&#x4E5F;&#x5F97;&#x91CD;&#x88C5;&#x3002;&#x5305;&#x62EC;Node.js&#x3002;</p><p>&#x5B89;&#x88C5;&#x4E86;&#x6700;&#x65B0;&#x7684;Node.js&#xFF08;v6.9.2&#xFF09;,npm&#xFF08;v3.10.9&#xFF09;&#x3002;&#x7531;&#x4E8E;<code>node_modules</code>&#x91CC;&#x7684;&#x6587;&#x4EF6;&#x5939;&#x7ED3;&#x6784;&#x592A;&#x6DF1;&#xFF0C;&#x65E0;&#x6CD5;&#x79FB;&#x52A8;&#xFF0C;&#x53EA;&#x80FD;&#x53BB;&#x9879;&#x76EE;&#x4E2D;&#x4F7F;&#x7528;<code>npm install</code>&#x91CD;&#x65B0;&#x5B89;&#x88C5;&#x4F9D;&#x8D56;&#xFF0C;&#x7136;&#x540E;&#x53D1;&#x73B0;<code>node_modules</code>&#x6587;&#x4EF6;&#x5939;&#x7ED3;&#x6784;&#x662F;&#x8FD9;&#x6837;&#x7684;&#xFF1A;</p><p><img src="/2016/12/20/npm3-0&#x65B0;&#x7684;&#x4F9D;&#x8D56;&#x89E3;&#x51B3;&#x65B9;&#x6848;/npmv3.png" alt="npm v3"></p><p>&#x4E00;&#x4E2A;&#x6A21;&#x5757;&#x88AB;&#x5206;&#x5728;&#x4E86;&#x4E0D;&#x540C;&#x6587;&#x4EF6;&#x5939;&#x4E0B;&#xFF0C;&#x6EE1;&#x8DB3;&#x4E0B;&#x597D;&#x5947;&#x5FC3;&#xFF0C;&#x53BB;&#x770B;&#x4E86;<a href="https://docs.npmjs.com/how-npm-works/npm3#npm-v3-dependency-resolution" target="_blank" rel="external">npm&#x7684;&#x5B98;&#x65B9;&#x6587;&#x6863;</a>&#x3002;</p><p>&#x679C;&#x7136;NPM&#x5F00;&#x53D1;&#x56E2;&#x961F;&#x8FD8;&#x662F;&#x89E3;&#x51B3;&#x4E86;&#x8FD9;&#x4E2A;&#x5305;&#x5197;&#x4F59;&#x548C;&#x5305;&#x7ED3;&#x6784;&#x592A;&#x6DF1;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x4E0B;&#x9762;&#x6211;&#x4EEC;&#x6765;&#x770B;&#x770B;&#x4ED6;&#x4EEC;&#x662F;&#x5982;&#x4F55;&#x505A;&#x7684;&#x3002;</p><p>npm2&#x4EE5;&#x4E00;&#x79CD;&#x5D4C;&#x5957;&#x7684;&#x65B9;&#x5F0F;&#x5B89;&#x88C5;&#x6240;&#x6709;&#x7684;&#x4F9D;&#x8D56;&#xFF0C;&#x800C;npm3&#x5C06;&#x6240;&#x6709;&#x4F9D;&#x8D56;&#x90FD;&#x5B89;&#x88C5;&#x5728;&#x4E3B;&#x76EE;&#x5F55;&#x7684;<code>node_modules</code>&#x4E0B;&#x3002;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#xFF1A;</p><p><img src="/2016/12/20/npm3-0&#x65B0;&#x7684;&#x4F9D;&#x8D56;&#x89E3;&#x51B3;&#x65B9;&#x6848;/npm3deps2.png" alt="npm2&#x548C;npm3&#x6BD4;&#x8F83;"></p><p>APP&#x4F9D;&#x8D56;&#x6A21;&#x5757;A&#xFF0C;&#x800C;&#x6A21;&#x5757;A&#x53C8;&#x4F9D;&#x8D56;&#x6A21;&#x5757;B&#xFF0C;npm2&#x7684;&#x65B9;&#x6848;&#x662F;&#x5C06;&#x6A21;&#x5757;B&#x5B89;&#x88C5;&#x5728;&#x6A21;&#x5757;A&#x7684;<code>node_modules</code>&#x3002;npm3&#x5C06;&#x6A21;&#x5757;A&#x548C;&#x6A21;&#x5757;B&#x90FD;&#x5B89;&#x88C5;&#x5728;APP&#x7684;<code>node_modules</code>&#x4E2D;&#x3002;&#x5047;&#x5982;APP&#x4F9D;&#x8D56;&#x53E6;&#x4E00;&#x4E2A;&#x6A21;&#x5757;C&#xFF0C;&#x800C;&#x6A21;&#x5757;C&#x53C8;&#x4F9D;&#x8D56;&#x53E6;&#x4E00;&#x4E2A;&#x7248;&#x672C;&#x7684;&#x6A21;&#x5757;B&#xFF0C;&#x6211;&#x4EEC;&#x770B;&#x5B83;&#x4EEC;&#x53C8;&#x6709;&#x54EA;&#x4E9B;&#x533A;&#x522B;&#xFF1A;</p><p><img src="/2016/12/20/npm3-0&#x65B0;&#x7684;&#x4F9D;&#x8D56;&#x89E3;&#x51B3;&#x65B9;&#x6848;/npm3deps4.png" alt="npm2&#x548C;npm3&#x4E0D;&#x540C;&#x7248;&#x672C;&#x6A21;&#x5757;&#x7BA1;&#x7406;&#x6BD4;&#x8F83;"></p><p>npm2&#x4E2D;&#xFF0C;&#x4F1A;&#x5728;&#x6A21;&#x5757;A&#x548C;C&#x7684;<code>node_modules</code>&#x4E0B;&#x5B89;&#x88C5;&#x4E0D;&#x540C;&#x7248;&#x672C;&#x7684;&#x6A21;&#x5757;B&#xFF0C;&#x800C;npm3&#x5148;&#x5B89;&#x88C5;&#x6A21;&#x5757;A&#x7684;&#x540C;&#x65F6;&#xFF0C;&#x5C06;&#x5176;&#x4F9D;&#x8D56;&#x7684;&#x6A21;&#x5757;B&#x7684;1.0&#x7248;&#x672C;&#x5B89;&#x88C5;&#x5728;APP&#x6A21;&#x5757;&#x4E0B;&#xFF0C;&#x4E3A;&#x4E86;&#x9632;&#x6B62;&#x6A21;&#x5757;&#x51B2;&#x7A81;&#xFF0C;&#x540C;npm2&#x7684;&#x505A;&#x6CD5;&#x7C7B;&#x4F3C;&#xFF0C;&#x5C06;&#x6A21;&#x5757;C&#x4F9D;&#x8D56;&#x7684;&#x6A21;&#x5757;B2.0&#x5B89;&#x88C5;&#x5728;&#x6A21;&#x5757;C&#x4E0B;&#x3002;</p><p>&#x901A;&#x8FC7;<code>npm ls</code>&#x547D;&#x4EE4;&#xFF0C;&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x6A21;&#x5757;&#x4F9D;&#x8D56;&#x5173;&#x7CFB;&#x7684;&#x6811;&#x5F62;&#x7ED3;&#x6784;&#x56FE;&#x3002;&#x5982;&#x679C;&#x60F3;&#x770B;&#x9879;&#x76EE;&#x4E3B;&#x76EE;&#x5F55;&#x7684;&#x4F9D;&#x8D56;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x5982;&#x4E0B;&#x547D;&#x4EE4;&#xFF1A;</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm ls --depth=0</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&amp;#x6700;&amp;#x8FD1;&amp;#x7ED9;&amp;#x6211;&amp;#x7684;&amp;#x88C5;&amp;#x5907;&amp;#xFF08;&lt;em&gt;Thinkpad S3-s431&lt;/em&gt;&amp;#xFF09;&amp;#x5347;&amp;#x4E86;&amp;#x4E00;&amp;#x4E0B;&amp;#x7EA7;
    
    </summary>
    
      <category term="Node.js" scheme="http://brucewar.cn/categories/Node-js/"/>
    
    
      <category term="npm" scheme="http://brucewar.cn/tags/npm/"/>
    
      <category term="v3" scheme="http://brucewar.cn/tags/v3/"/>
    
  </entry>
  
  <entry>
    <title>GitBook平台发布教程</title>
    <link href="http://brucewar.cn/2016/12/05/GitBook%E5%B9%B3%E5%8F%B0%E5%8F%91%E5%B8%83%E6%95%99%E7%A8%8B/"/>
    <id>http://brucewar.cn/2016/12/05/GitBook平台发布教程/</id>
    <published>2016-12-05T09:11:25.000Z</published>
    <updated>2016-12-06T02:06:40.861Z</updated>
    
    <content type="html"><![CDATA[<p>&#x6700;&#x8FD1;&#x5174;&#x8DA3;&#x6240;&#x81F4;&#x7FFB;&#x8BD1;&#x4E86;&#x4E00;&#x672C;&#x82F1;&#x6587;&#x7684;SVG&#x6559;&#x7A0B;&#xFF0C;&#x5E76;&#x5C06;&#x5176;&#x6258;&#x7BA1;&#x5728;<strong>GitHub</strong>&#xFF0C;&#x90E8;&#x7F72;&#x4E8E;<strong>GitBook</strong>&#x3002;&#x4E3A;&#x4E86;&#x7ED9;&#x5927;&#x5BB6;&#x6700;&#x76F4;&#x89C2;&#x7684;&#x6548;&#x679C;&#xFF0C;&#x732E;&#x4E0A;&#x6559;&#x7A0B;&#x90E8;&#x7F72;&#x5730;&#x5740;&#xFF1A;<a href="https://svg.brucewar.me" target="_blank" rel="external">https://svg.brucewar.me</a>&#x3002;&#x8FD9;&#x4E5F;&#x662F;&#x6211;&#x7B2C;&#x4E00;&#x6B21;&#x7FFB;&#x8BD1;&#x82F1;&#x6587;&#x6587;&#x6863;&#xFF0C;&#x4E5F;&#x662F;&#x6211;&#x7B2C;&#x4E00;&#x6B21;&#x4F7F;&#x7528;GitBook&#x90E8;&#x7F72;&#x7535;&#x5B50;&#x4E66;&#x3002;&#x6559;&#x7A0B;&#x867D;&#x7136;&#x7B80;&#x5355;&#xFF0C;&#x4F46;&#x57FA;&#x672C;&#x6D89;&#x53CA;&#x4E86;SVG&#x7684;&#x6240;&#x6709;&#x77E5;&#x8BC6;&#x70B9;&#x3002;</p><blockquote><p>&#x5582;&#x5582;&#x5582;&#xFF0C;&#x8DD1;&#x9898;&#x4E86;&#x554A;&#xFF01;</p></blockquote><p>&#x56DE;&#x5230;&#x6B63;&#x9898;&#xFF0C;&#x56E0;&#x4E3A;&#x90E8;&#x7F72;&#x7535;&#x5B50;&#x4E66;&#x6D89;&#x53CA;&#x7684;&#x5DE5;&#x5177;&#x6BD4;&#x8F83;&#x591A;&#xFF0C;&#x4E0D;&#x5FC5;&#x62C5;&#x5FC3;&#xFF0C;&#x6211;&#x5C06;&#x6309;&#x4EE5;&#x4E0B;&#x6D41;&#x7A0B;&#x6765;&#x5404;&#x4E2A;&#x51FB;&#x7834;&#xFF1A;</p><ul><li>&#x672C;&#x5730;&#x751F;&#x6210;&#x7535;&#x5B50;&#x4E66;</li><li>&#x6258;&#x7BA1;GitHub</li><li>&#x53D1;&#x5E03;&#x5230;GitBook</li><li>&#x7ED1;&#x5B9A;&#x81EA;&#x5B9A;&#x4E49;&#x57DF;&#x540D;</li></ul><h2 id="&#x672C;&#x5730;&#x751F;&#x6210;&#x7535;&#x5B50;&#x4E66;"><a href="#&#x672C;&#x5730;&#x751F;&#x6210;&#x7535;&#x5B50;&#x4E66;" class="headerlink" title="&#x672C;&#x5730;&#x751F;&#x6210;&#x7535;&#x5B50;&#x4E66;"></a>&#x672C;&#x5730;&#x751F;&#x6210;&#x7535;&#x5B50;&#x4E66;</h2><p>GitBook&#x5B98;&#x65B9;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x4E2A;&#x547D;&#x4EE4;&#x884C;&#x5DE5;&#x5177;&#xFF08;gitbook&#xFF09;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;git&#x548C;markdown&#x5236;&#x4F5C;&#x672C;&#x5730;&#x7535;&#x5B50;&#x4E66;&#x5E76;&#x652F;&#x6301;&#x9884;&#x89C8;&#x7B49;&#x529F;&#x80FD;&#x3002;&#x5728;&#x5B89;&#x88C5;&#x8FD9;&#x4E2A;&#x547D;&#x4EE4;&#x884C;&#x5DE5;&#x5177;&#x4E4B;&#x524D;&#xFF0C;&#x4F60;&#x9700;&#x8981;&#x5B89;&#x88C5;<a href="https://nodejs.org/zh-cn/" target="_blank" rel="external">Node.js</a>&#xFF0C;&#x5B98;&#x7F51;&#x5DF2;&#x7ECF;&#x63D0;&#x4F9B;&#x4E86;&#x5B89;&#x88C5;&#x5305;&#xFF0C;&#x8FD9;&#x91CC;&#x5C31;&#x4E0D;&#x8BE6;&#x7EC6;&#x8BF4;&#x660E;Node.js&#x7684;&#x5B89;&#x88C5;&#x65B9;&#x6CD5;&#x4E86;&#x3002;&#x7136;&#x540E;&#x4FBF;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;Node.js&#x63D0;&#x4F9B;&#x7684;&#x5305;&#x7BA1;&#x7406;&#x5DE5;&#x5177;<code>npm</code>&#x5B89;&#x88C5;gitbook&#x4E86;&#x3002;</p><h3 id="&#x5B89;&#x88C5;gitbook"><a href="#&#x5B89;&#x88C5;gitbook" class="headerlink" title="&#x5B89;&#x88C5;gitbook"></a>&#x5B89;&#x88C5;gitbook</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install gitbook-cli -g</span><br></pre></td></tr></table></figure><p>&#x7B49;&#x5F85;&#x7247;&#x523B;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x4E0B;&#x9762;&#x547D;&#x4EE4;&#x786E;&#x8BA4;&#x662F;&#x5426;&#x5B89;&#x88C5;&#x6210;&#x529F;&#xFF1A;</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">gitbook -V</span><br><span class="line"></span><br><span class="line"><span class="comment"># result:</span></span><br><span class="line"><span class="comment"># CLI version: 2.3.0</span></span><br><span class="line"><span class="comment"># GitBook version: 3.2.2</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># &#x67E5;&#x770B;gitbook&#x63D0;&#x4F9B;&#x7684;&#x4E00;&#x4E9B;&#x547D;&#x4EE4;</span></span><br><span class="line">gitbook -h</span><br></pre></td></tr></table></figure><h3 id="&#x521D;&#x59CB;&#x5316;&#x7535;&#x5B50;&#x4E66;"><a href="#&#x521D;&#x59CB;&#x5316;&#x7535;&#x5B50;&#x4E66;" class="headerlink" title="&#x521D;&#x59CB;&#x5316;&#x7535;&#x5B50;&#x4E66;"></a>&#x521D;&#x59CB;&#x5316;&#x7535;&#x5B50;&#x4E66;</h3><p>&#x9996;&#x5148;&#x4E3A;&#x7535;&#x5B50;&#x4E66;&#x5EFA;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#x5939;&#xFF0C;&#x7136;&#x540E;&#x901A;&#x8FC7;&#x547D;&#x4EE4;&#x884C;&#x5DE5;&#x5177;&#x521D;&#x59CB;&#x5316;&#x7535;&#x5B50;&#x4E66;&#xFF1A;</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">mkdir ebook &amp;&amp; <span class="built_in">cd</span> ebook</span><br><span class="line">gitbook init</span><br></pre></td></tr></table></figure><p>&#x6700;&#x7EC8;&#x4F1A;&#x5728;&#x6587;&#x4EF6;&#x5939;&#x4E0B;&#x751F;&#x6210;&#x4E24;&#x4E2A;&#x6587;&#x4EF6;&#xFF1A;<code>README.md</code>&#x548C;<code>SUMMARY.md</code>&#x3002;&#x524D;&#x8005;&#x4E3B;&#x8981;&#x662F;&#x5173;&#x4E8E;&#x4F60;&#x7684;&#x4E66;&#x7684;&#x4ECB;&#x7ECD;&#xFF0C;&#x540E;&#x8005;&#x5305;&#x542B;&#x4E66;&#x7684;&#x76EE;&#x5F55;&#xFF0C;&#x5373;&#x7AE0;&#x8282;&#x7ED3;&#x6784;&#xFF0C;&#x683C;&#x5F0F;&#x5982;&#x4E0B;&#xFF1A;</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">* [&#x7B2C;&#x4E00;&#x7AE0;](chapter1.md)</span><br><span class="line">	* [&#x7B2C;&#x4E00;&#x8282;](chapter1_section1.md)</span><br><span class="line">	* [&#x7B2C;&#x4E8C;&#x8282;](chapter1_section2.md)</span><br><span class="line">* [&#x7B2C;&#x4E8C;&#x7AE0;](chapter2.md)</span><br></pre></td></tr></table></figure><p>&#x4E0B;&#x9762;&#x4F60;&#x5C31;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;markdown&#x8BED;&#x6CD5;&#x7F16;&#x5199;&#x7535;&#x5B50;&#x4E66;&#x5566;&#xFF01;&#x5982;&#x679C;&#x4F60;&#x60F3;&#x9884;&#x89C8;&#x7535;&#x5B50;&#x4E66;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x4E0B;&#x9762;&#x547D;&#x4EE4;&#xFF1A;</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gitbook serve</span><br></pre></td></tr></table></figure><p>&#x7B2C;&#x4E00;&#x6B21;&#x4F7F;&#x7528;&#x8FD9;&#x4E2A;&#x547D;&#x4EE4;&#x4F1A;&#x6709;&#x70B9;&#x6162;&#xFF0C;&#x5B83;&#x4F1A;&#x5B89;&#x88C5;gitbook&#x7684;&#x4E00;&#x4E9B;&#x989D;&#x5916;&#x5DE5;&#x5177;&#x3002;&#x7B49;&#x5F85;&#x4E00;&#x4F1A;&#x513F;&#xFF0C;&#x4F1A;&#x51FA;&#x73B0;&#x63D0;&#x793A;&#xFF08;Serving book on <a href="http://localhost:4000" target="_blank" rel="external">http://localhost:4000</a>&#xFF09;&#xFF0C;&#x6253;&#x5F00;&#x94FE;&#x63A5;&#x4FBF;&#x53EF;&#x9884;&#x89C8;&#x4F60;&#x521B;&#x5EFA;&#x7684;&#x7535;&#x5B50;&#x4E66;&#x5566;&#xFF01;&#x8FD0;&#x884C;&#x8BE5;&#x547D;&#x4EE4;&#x4F1A;&#x5728;&#x7535;&#x5B50;&#x4E66;&#x7684;&#x6587;&#x4EF6;&#x5939;&#x4E0B;&#x751F;&#x6210;&#x4E00;&#x4E2A;<code>_book</code>&#x6587;&#x4EF6;&#x5939;&#xFF0C;&#x91CC;&#x9762;&#x7684;&#x5185;&#x5BB9;&#x5C31;&#x662F;&#x751F;&#x6210;&#x7684;HTML&#x6587;&#x4EF6;&#x3002;</p><h3 id="&#x9AD8;&#x7EA7;&#x914D;&#x7F6E;"><a href="#&#x9AD8;&#x7EA7;&#x914D;&#x7F6E;" class="headerlink" title="&#x9AD8;&#x7EA7;&#x914D;&#x7F6E;"></a>&#x9AD8;&#x7EA7;&#x914D;&#x7F6E;</h3><p>gitbook&#x4E5F;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x4E9B;&#x9AD8;&#x7EA7;&#x914D;&#x7F6E;&#x4FE1;&#x606F;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5728;&#x7535;&#x5B50;&#x4E66;&#x6587;&#x4EF6;&#x5939;&#x4E0B;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A;<code>book.json</code>&#x6587;&#x4EF6;&#x4E3A;&#x5176;&#x6DFB;&#x52A0;&#x4E00;&#x4E9B;&#x9AD8;&#x7EA7;&#x914D;&#x7F6E;&#xFF0C;&#x4E3B;&#x8981;&#x7684;&#x914D;&#x7F6E;&#x4FE1;&#x606F;&#x5982;&#x4E0B;&#xFF1A;</p><ul><li>title&#xFF1A;&#x7535;&#x5B50;&#x4E66;&#x7684;&#x540D;&#x79F0;</li><li>author&#xFF1A;&#x4F5C;&#x8005;</li><li>description&#xFF1A;&#x672C;&#x4E66;&#x7684;&#x7B80;&#x5355;&#x63CF;&#x8FF0;</li><li>language&#xFF1A;gitbook&#x4F7F;&#x7528;&#x7684;&#x8BED;&#x8A00;</li><li>links&#xFF1A;&#x5DE6;&#x4FA7;&#x5BFC;&#x822A;&#x680F;&#x6DFB;&#x52A0;&#x7684;&#x94FE;&#x63A5;</li><li>styles&#xFF1A;&#x81EA;&#x5B9A;&#x4E49;&#x9875;&#x9762;&#x6837;&#x5F0F;</li><li>plugins&#xFF1A;&#x914D;&#x7F6E;&#x4F7F;&#x7528;&#x7684;&#x63D2;&#x4EF6;</li><li>pluginsConfig&#xFF1A;&#x5404;&#x4E2A;&#x63D2;&#x4EF6;&#x5BF9;&#x5E94;&#x7684;&#x914D;&#x7F6E;</li><li>gitbook&#xFF1A;&#x6307;&#x5B9A;&#x4F7F;&#x7528;gitbook&#x7248;&#x672C;</li></ul><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line">{</span><br><span class="line">	<span class="string">&quot;title&quot;</span>: <span class="string">&quot;SVG&#x6559;&#x7A0B;&#xFF08;&#x4E2D;&#x6587;&#x7FFB;&#x8BD1;&#x7248;&#xFF09;&quot;</span>,</span><br><span class="line">	<span class="string">&quot;author&quot;</span>: <span class="string">&quot;brucewar &lt;wjl891014@gmail.com&gt;&quot;</span>,</span><br><span class="line">	<span class="string">&quot;description&quot;</span>: <span class="string">&quot;SVG&#x6559;&#x7A0B;&#x4E2D;&#x6587;&#x7FFB;&#x8BD1;&#x7248;&#xFF0C;&#x4E5F;&#x662F;&#x672C;&#x4EBA;&#x7B2C;&#x4E00;&#x6B21;&#x7FFB;&#x8BD1;&#x82F1;&#x6587;&#x6559;&#x7A0B;&#x3002;&quot;</span>,</span><br><span class="line">	<span class="string">&quot;links&quot;</span>: {</span><br><span class="line">		<span class="string">&quot;sidebar&quot;</span>: {</span><br><span class="line">			<span class="string">&quot;&#x535A;&#x5BA2;&quot;</span>: <span class="string">&quot;http://brucewar.me&quot;</span>,</span><br><span class="line">			<span class="string">&quot;&#x6253;&#x8D4F;&quot;</span>: <span class="string">&quot;http://brucewar.me/donate/&quot;</span>,</span><br><span class="line">			<span class="string">&quot;View on GitHub&quot;</span>: <span class="string">&quot;https://github.com/brucewar/svg-tutorial&quot;</span></span><br><span class="line">		}</span><br><span class="line">	},</span><br><span class="line">	<span class="string">&quot;plugins&quot;</span>: [</span><br><span class="line">		<span class="string">&quot;duoshuo&quot;</span>,	<span class="comment">// &#x591A;&#x8BF4;&#x8BC4;&#x8BBA;</span></span><br><span class="line">		<span class="string">&quot;github&quot;</span>,	<span class="comment">// &#x5C55;&#x793A;github&#x56FE;&#x6807;</span></span><br><span class="line">		<span class="string">&quot;ga&quot;</span>,	<span class="comment">// google analytics</span></span><br><span class="line">		<span class="string">&quot;ba&quot;</span>	<span class="comment">// &#x767E;&#x5EA6;&#x7EDF;&#x8BA1;</span></span><br><span class="line">	],</span><br><span class="line">	<span class="string">&quot;pluginsConfig&quot;</span>: {</span><br><span class="line">		<span class="string">&quot;duoshuo&quot;</span>: {</span><br><span class="line">			<span class="string">&quot;short_name&quot;</span>: <span class="string">&quot;brucewar&quot;</span>,</span><br><span class="line">			<span class="string">&quot;theme&quot;</span>: <span class="string">&quot;default&quot;</span></span><br><span class="line">		},</span><br><span class="line">		<span class="string">&quot;github&quot;</span>: {</span><br><span class="line">			<span class="string">&quot;url&quot;</span>: <span class="string">&quot;https://github.com/brucewar&quot;</span></span><br><span class="line">		},</span><br><span class="line">		<span class="string">&quot;ga&quot;</span>: {</span><br><span class="line">			<span class="string">&quot;token&quot;</span>: <span class="string">&quot;UA-87259783-2&quot;</span></span><br><span class="line">		},</span><br><span class="line">		<span class="string">&quot;ba&quot;</span>: {</span><br><span class="line">			<span class="string">&quot;token&quot;</span>: <span class="string">&quot;80f89a3fe34a9f8e22c53f85908e2d6&quot;</span></span><br><span class="line">		}</span><br><span class="line">	}</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>&#x4E0A;&#x9762;&#x662F;&#x6211;&#x4F7F;&#x7528;&#x7684;&#x4E00;&#x4E9B;&#x914D;&#x7F6E;&#x3002;&#x5982;&#x679C;&#x5728;&#x4F60;&#x7684;&#x914D;&#x7F6E;&#x4E2D;&#x6DFB;&#x52A0;&#x4E86;&#x63D2;&#x4EF6;&#xFF0C;&#x6267;&#x884C;<code>gitbook serve</code>&#x524D;&#xFF0C;&#x9700;&#x8981;&#x901A;&#x8FC7;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#x5B89;&#x88C5;&#x8FD9;&#x4E9B;&#x63D2;&#x4EF6;&#x3002;</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gitbook install</span><br></pre></td></tr></table></figure><p>gitbook&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x4E2A;&#x63D2;&#x4EF6;&#x5E73;&#x53F0;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x53BB;&#x641C;&#x7D22;&#x4F60;&#x60F3;&#x8981;&#x7684;&#x63D2;&#x4EF6;&#xFF0C;&#x5F53;&#x7136;&#xFF0C;&#x4F60;&#x4E5F;&#x53EF;&#x4EE5;&#x4E3A;&#x5176;&#x8D21;&#x732E;&#x63D2;&#x4EF6;&#x3002;</p><h2 id="&#x6258;&#x7BA1;GitHub"><a href="#&#x6258;&#x7BA1;GitHub" class="headerlink" title="&#x6258;&#x7BA1;GitHub"></a>&#x6258;&#x7BA1;GitHub</h2><p>&#x9996;&#x5148;&#xFF0C;&#x4F60;&#x9700;&#x8981;&#x6709;&#x4E00;&#x4E2A;<a href="https://github.com" target="_blank" rel="external">GitHub</a>&#x8D26;&#x53F7;&#x3002;&#x7136;&#x540E;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x516C;&#x6709;&#x4ED3;&#x5E93;&#x3002;&#x7136;&#x540E;&#xFF0C;&#x56DE;&#x5230;&#x7535;&#x5B50;&#x4E66;&#x76EE;&#x5F55;&#x4E0B;&#xFF0C;&#x4F7F;&#x7528;git&#x5DE5;&#x5177;&#x521D;&#x59CB;&#x5316;&#x4E00;&#x4E2A;&#x4ED3;&#x5E93;&#x3002;&#x5E76;&#x5C06;&#x672C;&#x5730;&#x4ED3;&#x5E93;&#x548C;&#x8FDC;&#x7A0B;GitHub&#x4ED3;&#x5E93;&#x5173;&#x8054;&#x3002;</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">git init</span><br><span class="line">git remote add origin &#x4F60;&#x7684;&#x8FDC;&#x7A0B;&#x4ED3;&#x5E93;&#x5730;&#x5740;&#xFF08;&#x6BD4;&#x5982;https://github.com/brucewar/svg-tutorial&#xFF09;</span><br><span class="line"></span><br><span class="line">// &#x63D0;&#x4EA4;&#x7535;&#x5B50;&#x4E66;</span><br><span class="line">git add .</span><br><span class="line">git commit -m <span class="string">&quot;publish&quot;</span></span><br><span class="line">git push origin master</span><br></pre></td></tr></table></figure><h2 id="&#x53D1;&#x5E03;&#x5230;GitBook"><a href="#&#x53D1;&#x5E03;&#x5230;GitBook" class="headerlink" title="&#x53D1;&#x5E03;&#x5230;GitBook"></a>&#x53D1;&#x5E03;&#x5230;GitBook</h2><p>&#x5982;&#x679C;&#x6CA1;&#x6709;<a href="https://www.gitbook.com" target="_blank" rel="external">GitBook</a>&#x8D26;&#x53F7;&#xFF0C;&#x53EF;&#x4EE5;&#x5148;&#x6CE8;&#x518C;&#x4E00;&#x4E2A;&#x3002;&#x7136;&#x540E;&#x5728;&#x65B0;&#x5EFA;&#x4E00;&#x672C;book&#x3002;&#x7136;&#x540E;&#x9700;&#x8981;&#x505A;&#x7684;&#x5C31;&#x662F;&#x5C06;GitBook&#x548C;GitHub&#x8FDB;&#x884C;&#x5173;&#x8054;&#x3002;</p><p><img src="/2016/12/05/GitBook&#x5E73;&#x53F0;&#x53D1;&#x5E03;&#x6559;&#x7A0B;/gitbook2github.jpg" alt="GitBook&#x5173;&#x8054;GitHub&#x6B65;&#x9AA4;"></p><p>&#x4F46;&#x662F;&#xFF0C;&#x8FD9;&#x8FD8;&#x4E0D;&#x591F;&#xFF0C;&#x56E0;&#x4E3A;GitBook&#x4E0D;&#x77E5;&#x9053;&#x4F55;&#x65F6;&#x6784;&#x5EFA;&#x4F60;&#x7684;&#x7535;&#x5B50;&#x4E66;&#xFF0C;&#x6240;&#x4EE5;&#x8FD9;&#x91CC;&#x6211;&#x4EEC;&#x5C31;&#x8981;&#x7528;&#x5230;GitHub&#x7684;<em>webhook</em>&#x529F;&#x80FD;&#x3002;&#x901A;&#x4FD7;&#x70B9;&#x8BB2;&#xFF0C;&#x5C31;&#x662F;&#x5728;GitHub&#x63D0;&#x4EA4;&#x7535;&#x5B50;&#x4E66;&#x7684;&#x540C;&#x65F6;&#xFF0C;&#x8BA9;GitHub&#x544A;&#x8BC9;GitBook&#xFF0C;&#x6709;&#x66F4;&#x65B0;&#x4E86;&#xFF0C;&#x4F60;&#x91CD;&#x65B0;&#x6784;&#x5EFA;&#x4E0B;&#x3002;&#x5177;&#x4F53;&#x64CD;&#x4F5C;&#x5982;&#x4E0B;&#xFF1A;</p><p>&#x5173;&#x8054;&#x5B8C;GitHub&#x4ED3;&#x5E93;&#x540E;&#xFF0C;&#x4F1A;&#x51FA;&#x73B0;&#x5982;&#x4E0B;&#x754C;&#x9762;&#xFF0C;&#x590D;&#x5236;webhook url&#xFF1A;</p><p><img src="/2016/12/05/GitBook&#x5E73;&#x53F0;&#x53D1;&#x5E03;&#x6559;&#x7A0B;/webhook_url.jpg" alt="&#x590D;&#x5236;Webhook URL"></p><p>&#x6253;&#x5F00;GitHub&#x4ED3;&#x5E93;&#x7684;&#x8BBE;&#x7F6E;&#x9875;&#x9762;&#xFF0C;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A;webhook&#xFF1A;</p><p><img src="/2016/12/05/GitBook&#x5E73;&#x53F0;&#x53D1;&#x5E03;&#x6559;&#x7A0B;/webhook_add.jpg" alt="&#x5728;GitHub&#x6DFB;&#x52A0;webhook"></p><h2 id="&#x7ED1;&#x5B9A;&#x81EA;&#x5B9A;&#x4E49;&#x57DF;&#x540D;"><a href="#&#x7ED1;&#x5B9A;&#x81EA;&#x5B9A;&#x4E49;&#x57DF;&#x540D;" class="headerlink" title="&#x7ED1;&#x5B9A;&#x81EA;&#x5B9A;&#x4E49;&#x57DF;&#x540D;"></a>&#x7ED1;&#x5B9A;&#x81EA;&#x5B9A;&#x4E49;&#x57DF;&#x540D;</h2><p>&#x6B64;&#x65F6;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;GitBook&#x63D0;&#x4F9B;&#x7684;&#x57DF;&#x540D;&#x8BBF;&#x95EE;&#x4F60;&#x521A;&#x624D;&#x521B;&#x5EFA;&#x7684;&#x7535;&#x5B50;&#x4E66;&#x5566;&#xFF01;&#x4E00;&#x822C;&#x57DF;&#x540D;&#x683C;&#x5F0F;&#x662F;http://{author}.gitbooks.io/{book}/content&#xFF0C;&#x4F46;&#x662F;&#x4F60;&#x4E5F;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x81EA;&#x5B9A;&#x4E49;&#x7684;&#x57DF;&#x540D;&#xFF08;&#x9996;&#x5148;&#x4F60;&#x5F97;&#x4E70;&#x4E2A;&#x57DF;&#x540D;&#xFF09;&#x3002;</p><p><img src="/2016/12/05/GitBook&#x5E73;&#x53F0;&#x53D1;&#x5E03;&#x6559;&#x7A0B;/custom_domain.jpg" alt="&#x7ED1;&#x5B9A;&#x57DF;&#x540D;"></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&amp;#x6700;&amp;#x8FD1;&amp;#x5174;&amp;#x8DA3;&amp;#x6240;&amp;#x81F4;&amp;#x7FFB;&amp;#x8BD1;&amp;#x4E86;&amp;#x4E00;&amp;#x672C;&amp;#x82F1;&amp;#x6587;&amp;#x7684;SVG&amp;#x6559;&amp;#x7A0B;&amp;#xFF0
    
    </summary>
    
      <category term="GitBook" scheme="http://brucewar.cn/categories/GitBook/"/>
    
    
      <category term="gitbook" scheme="http://brucewar.cn/tags/gitbook/"/>
    
      <category term="电子书" scheme="http://brucewar.cn/tags/%E7%94%B5%E5%AD%90%E4%B9%A6/"/>
    
      <category term="教程" scheme="http://brucewar.cn/tags/%E6%95%99%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>跑步带给了我什么</title>
    <link href="http://brucewar.cn/2016/11/29/%E8%B7%91%E6%AD%A5%E5%B8%A6%E7%BB%99%E4%BA%86%E6%88%91%E4%BB%80%E4%B9%88/"/>
    <id>http://brucewar.cn/2016/11/29/跑步带给了我什么/</id>
    <published>2016-11-29T07:40:11.000Z</published>
    <updated>2016-11-29T09:50:16.599Z</updated>
    
    <content type="html"><![CDATA[<p>&#x4ECE;&#x5E74;&#x521D;2&#x6708;&#x4EFD;&#x5230;&#x73B0;&#x5728;&#xFF0C;&#x6211;&#x5DF2;&#x7ECF;&#x575A;&#x6301;&#x8DD1;&#x6B65;&#x5927;&#x534A;&#x5E74;&#x4E86;&#xFF0C;&#x867D;&#x7136;&#x9891;&#x7387;&#x4E0D;&#x9AD8;&#xFF08;&#x5E73;&#x5747;&#x4E00;&#x5468;&#x8DD1;&#x4E09;&#x6B21;&#xFF0C;&#x6BCF;&#x6B21;5&#x516C;&#x91CC;&#xFF09;&#xFF0C;&#x59D1;&#x4E14;&#x7B97;&#x662F;&#x575A;&#x6301;&#x4E0B;&#x6765;&#x4E86;&#x3002;&#x8FD8;&#x8BB0;&#x5F97;&#x521A;&#x5F00;&#x59CB;&#x662F;&#x56E0;&#x4E3A;&#x524D;&#x540C;&#x4E8B;&#xFF08;<strong>&#x857E;&#x7237;</strong>&#x548C;<strong>&#x963F;&#x6C64;</strong>&#xFF09;&#x7684;&#x6002;&#x607F;&#xFF0C;&#x8BA9;&#x6211;&#x4E00;&#x8D77;&#x62A5;&#x540D;&#x53C2;&#x52A0;&#x4E0A;&#x6D77;&#x677E;&#x6C5F;&#x7684;&#x9996;&#x5C4A;&#x534A;&#x7A0B;&#x9A6C;&#x62C9;&#x677E;&#x6BD4;&#x8D5B;&#xFF0C;&#x4E0D;&#x8FC7;&#x56E0;&#x4E3A;&#x5927;&#x5BB6;&#x90FD;&#x662F;&#x7B2C;&#x4E00;&#x6B21;&#x8DD1;&#xFF0C;&#x6240;&#x4EE5;&#x6CA1;&#x6562;&#x62A5;&#x534A;&#x7A0B;&#xFF0C;&#x6700;&#x7EC8;&#x62A5;&#x7684;&#x662F;<code>12km</code>&#x5065;&#x5EB7;&#x8DD1;&#x3002;&#x4E5F;&#x662F;&#x5F53;&#x65F6;&#x8111;&#x5B50;&#x4E00;&#x70ED;&#xFF0C;&#x8BA9;&#x6211;&#x5C06;&#x8DD1;&#x6B65;&#x575A;&#x6301;&#x4E86;&#x8FD9;&#x4E48;&#x4E45;&#xFF0C;&#x5E76;&#x4E14;&#x53C2;&#x52A0;&#x4E86;&#x4ECA;&#x5E74;&#x5357;&#x4EAC;&#x7684;&#x9A6C;&#x62C9;&#x677E;&#xFF0C;&#x4E0D;&#x8FC7;&#x8DD1;&#x7684;&#x662F;5&#x516C;&#x91CC;&#x3002;</p><p><img src="http://brucewar.qiniudn.com/642380720289764615.jpg" alt="&#x4E0A;&#x6D77;&#x677E;&#x6C5F;&#x534A;&#x7A0B;&#x9A6C;&#x62C9;&#x677E;"></p><p>&#x9898;&#x5916;&#x8BDD;&#xFF1A;&#x6CA1;&#x9519;&#xFF0C;&#x4F60;&#x770B;&#x5230;&#x5C31;&#x662F;&#x848B;&#x52B2;&#x592B;&#xFF0C;&#x4ED6;&#x4E5F;&#x662F;&#x4E00;&#x4E2A;&#x575A;&#x6301;&#x8FD0;&#x52A8;&#x7684;&#x4EBA;&#xFF0C;&#x6700;&#x8FD1;&#x770B;&#x7684;&#x4E00;&#x6863;&#x8282;&#x76EE;&#x300A;&#x771F;&#x6B63;&#x7684;&#x7537;&#x5B50;&#x6C49;&#x300B;&#x4E5F;&#x5BF9;&#x4ED6;&#x6709;&#x6240;&#x5173;&#x6CE8;&#x3002;</p><p><img src="http://brucewar.qiniudn.com/sj-marathon2.jpg" alt="&#x677E;&#x6C5F;12km&#x5B8C;&#x8D5B;&#x7167;"></p><p><img src="http://brucewar.qiniudn.com/nj-marathon1.JPG" alt="2016&#x5357;&#x4EAC;&#x9A6C;&#x62C9;&#x677E;"></p><p>&#x77E5;&#x4E4E;&#x91CC;&#x5E38;&#x5E38;&#x770B;&#x5230;&#x4E00;&#x4E9B;&#x5173;&#x4E8E;&#x8DD1;&#x6B65;&#x7684;&#x8BDD;&#x9898;&#xFF0C;&#x5982;<a href="https://www.zhihu.com/question/28656794" target="_blank" rel="external">&#x201C;&#x575A;&#x6301;&#x8DD1;&#x6B65;&#x5230;&#x5E95;&#x6709;&#x4EC0;&#x4E48;&#x6539;&#x53D8;&#xFF1F;&#x201D;</a>&#x3002;&#x6240;&#x4EE5;&#x6211;&#x6709;&#x65F6;&#x4E5F;&#x4F1A;&#x60F3;&#x95EE;&#x95EE;&#x81EA;&#x5DF1;&#xFF0C;&#x575A;&#x6301;&#x8DD1;&#x6B65;&#x7ED9;&#x6211;&#x5E26;&#x6765;&#x4E86;&#x4EC0;&#x4E48;&#x6539;&#x53D8;&#xFF0C;&#x4E5F;&#x5C31;&#x6709;&#x4E86;&#x8FD9;&#x7BC7;&#x6587;&#x7AE0;&#x3002;&#x5148;&#x8BF4;&#x8BF4;&#x751F;&#x7406;&#x4E0A;&#x53D8;&#x5316;&#x5427;&#xFF01;&#x6211;&#x89C9;&#x5F97;&#x6700;&#x5927;&#x7684;&#x6539;&#x53D8;&#x5C31;&#x662F;&#x6574;&#x4E2A;&#x4EBA;&#x7684;&#x7CBE;&#x795E;&#x9762;&#x8C8C;&#x4E0D;&#x4E00;&#x6837;&#x4E86;&#xFF0C;&#x4F5C;&#x4E3A;&#x7A0B;&#x5E8F;&#x5458;&#x7684;&#x4E00;&#x5458;&#xFF0C;&#x6BCF;&#x5929;&#x5750;&#x7740;&#x7684;&#x65F6;&#x95F4;&#x6BD4;&#x7AD9;&#x7740;&#x7684;&#x65F6;&#x95F4;&#x591A;&#x5F97;&#x591A;&#xFF0C;&#x800C;&#x4E14;&#x6574;&#x5929;&#x9762;&#x5BF9;&#x7740;&#x7535;&#x8111;&#xFF0C;&#x4E00;&#x5929;&#x4E0B;&#x6765;&#x90FD;&#x662F;&#x6CB9;&#x5149;&#x6EE1;&#x9762;&#xFF0C;&#x63D0;&#x4E0D;&#x8D77;&#x7CBE;&#x795E;&#x3002;&#x81EA;&#x4ECE;&#x8DD1;&#x6B65;&#x540E;&#xFF0C;&#x5468;&#x56F4;&#x7684;&#x540C;&#x4E8B;&#x90FD;&#x8BF4;&#x6211;&#x201C;&#x5BB9;&#x5149;&#x7115;&#x53D1;&#x201D;&#x3002;&#x5F53;&#x7136;&#xFF0C;&#x8FD8;&#x6709;&#x4E00;&#x4E9B;&#x9644;&#x5E26;&#x7684;&#x53D8;&#x5316;&#x5C31;&#x662F;&#x809A;&#x5B50;&#x4E0A;&#x7684;&#x8D58;&#x8089;&#x4E5F;&#x5C11;&#x4E86;&#xFF08;&#x989D;&#xFF0C;&#x8FD8;&#x662F;&#x6709;&#x70B9;&#x7684;&#xFF09;&#xFF0C;&#x7761;&#x7720;&#x8D28;&#x91CF;&#x63D0;&#x9AD8;&#xFF0C;&#x4E5F;&#x5F88;&#x5C11;&#x751F;&#x75C5;&#x4E86;&#x3002;</p><p>&#x4F46;&#x662F;&#xFF0C;&#x8FD9;&#x4E9B;&#x751F;&#x7406;&#x4E0A;&#x7684;&#x53D8;&#x5316;&#x5FAE;&#x4E4E;&#x5176;&#x5FAE;&#xFF0C;&#x575A;&#x6301;&#x8DD1;&#x6B65;&#x8D35;&#x5728;<strong>&#x575A;&#x6301;</strong>&#xFF0C;&#x5B83;&#x771F;&#x6B63;&#x5E26;&#x7ED9;&#x6211;&#x7684;&#x662F;&#x751F;&#x6D3B;&#x548C;&#x5DE5;&#x4F5C;&#x4E0A;&#x7684;&#x53D8;&#x5316;&#x3002;&#x56E0;&#x4E3A;&#x8DD1;&#x6B65;&#xFF0C;&#x6211;&#x8BA4;&#x8BC6;&#x4E86;&#x8BB8;&#x591A;&#x540C;&#x6837;&#x628A;&#x8DD1;&#x6B65;&#x771F;&#x6B63;&#x575A;&#x6301;&#x4E0B;&#x6765;&#x7684;&#x4EBA;&#xFF0C;&#x6709;&#x65F6;&#x5927;&#x5BB6;&#x4E5F;&#x4F1A;&#x7EA6;&#x7740;&#x4E00;&#x8D77;&#x5728;&#x5495;&#x549A;APP&#x4E0A;&#x753B;&#x5708;&#x3002;</p><p><img src="http://brucewar.qiniudn.com/xuanwuhu.png" alt="&#x6700;&#x5927;&#x7684;&#x5708;-&#x7384;&#x6B66;&#x6E56;"></p><p>&#x8DD1;&#x6B65;&#x4E5F;&#x8BA9;&#x6211;&#x7684;&#x751F;&#x6D3B;&#x66F4;&#x52A0;&#x89C4;&#x5F8B;&#xFF0C;&#x65E9;&#x7761;&#x65E9;&#x8D77;&#x5DF2;&#x7136;&#x6210;&#x4E3A;&#x6211;&#x7684;&#x4E60;&#x60EF;&#x3002;&#x6BCF;&#x5F53;&#x65E9;&#x4E0A;&#x8D56;&#x5E8A;&#x65F6;&#xFF0C;&#x6211;&#x4F1A;&#x60F3;&#x5230;&#xFF0C;&#x201C;&#x8DD1;&#x6B65;&#x65F6;&#x4E5F;&#x6709;&#x8FC7;&#x771F;&#x7684;&#x575A;&#x6301;&#x4E0D;&#x4E0B;&#x53BB;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x6211;&#x4F1A;&#x544A;&#x8BC9;&#x81EA;&#x5DF1;&#xFF0C;&#x4F60;&#x8FD8;&#x53EF;&#x4EE5;&#x518D;&#x8DD1;1&#x516C;&#x91CC;&#x201D;&#xFF0C;&#x6211;&#x8FD8;&#x4F1A;&#x60F3;&#x5230;&#xFF0C;&#x575A;&#x6301;&#x8DD1;&#x6B65;&#x8FD9;&#x4E48;&#x96BE;&#x7684;&#x4E60;&#x60EF;&#xFF0C;&#x6211;&#x90FD;&#x575A;&#x6301;&#x4E0B;&#x6765;&#x4E86;&#xFF0C;&#x8FD8;&#x6709;&#x4EC0;&#x4E48;&#x4E60;&#x60EF;&#x4E0D;&#x80FD;&#x575A;&#x6301;&#x3002;&#x575A;&#x6301;&#x8DD1;&#x6B65;&#x7ED9;&#x6211;&#x5E26;&#x6765;&#x4E86;&#x81EA;&#x5236;&#x529B;&#xFF0C;&#x4E5F;&#x7ED9;&#x4E86;&#x6211;&#x8BA4;&#x771F;&#x5BF9;&#x5F85;&#x751F;&#x6D3B;&#x7684;&#x6001;&#x5EA6;&#x3002;&#x6211;&#x5F88;&#x4EAB;&#x53D7;&#x8DD1;&#x6B65;&#x8FC7;&#x7A0B;&#xFF0C;&#x4E00;&#x6B65;&#x4E00;&#x4E2A;&#x811A;&#x5370;&#xFF0C;&#x4E0D;&#x65AD;&#x7ED9;&#x81EA;&#x5DF1;&#x8BBE;&#x7ACB;&#x65B0;&#x7684;&#x76EE;&#x6807;&#x3002;</p><blockquote><p>&#x8FDD;&#x80CC;&#x4E86;&#x81EA;&#x5DF1;&#x5B9A;&#x4E0B;&#x7684;&#x539F;&#x5219;&#xFF0C;&#x54EA;&#x6015;&#x53EA;&#x6709;&#x4E00;&#x6B21;&#xFF0C;&#x4EE5;&#x540E;&#x5C31;&#x5C06;&#x8FDD;&#x80CC;&#x66F4;&#x591A;&#x7684;&#x539F;&#x5219;&#x3002; &#x2014;&#x2014; &#x6751;&#x4E0A;&#x6625;&#x6811; &#x300A;&#x5F53;&#x6211;&#x8C08;&#x8DD1;&#x6B65;&#x65F6;&#x6211;&#x8C08;&#x4E9B;&#x4EC0;&#x4E48;&#x300B;</p></blockquote><p>&#x6B64;&#x5916;&#xFF0C;&#x8DD1;&#x6B65;&#x4E5F;&#x8BA9;&#x6211;&#x53D8;&#x7684;&#x66F4;&#x81EA;&#x4FE1;&#x4E86;&#x3002;&#x9762;&#x5BF9;&#x5DE5;&#x4F5C;&#x548C;&#x751F;&#x6D3B;&#x4E2D;&#x9047;&#x5230;&#x7684;&#x4E00;&#x4E9B;&#x95EE;&#x9898;&#xFF0C;&#x6211;&#x80FD;&#x4ECE;&#x5BB9;&#x5730;&#x9762;&#x5BF9;&#x5E76;&#x89E3;&#x51B3;&#x5B83;&#x4EEC;&#x3002;&#x4E5F;&#x6B63;&#x662F;&#x56E0;&#x4E3A;&#x8DD1;&#x6B65;&#xFF0C;&#x7761;&#x7720;&#x8D28;&#x91CF;&#x63D0;&#x9AD8;&#x4E86;&#xFF0C;&#x6240;&#x4EE5;&#x767D;&#x5929;&#x5DE5;&#x4F5C;&#x7684;&#x7CBE;&#x795E;&#x72B6;&#x6001;&#x5F88;&#x597D;&#xFF0C;&#x80FD;&#x66F4;&#x4E13;&#x6CE8;&#x7684;&#x5DE5;&#x4F5C;&#x548C;&#x5B66;&#x4E60;&#x3002;</p><p>&#x73B0;&#x5728;&#xFF0C;&#x6211;&#x53C8;&#x6709;&#x4E86;&#x4E24;&#x4EF6;&#x575A;&#x6301;&#x505A;&#x7684;&#x4E8B;&#xFF0C;&#x6211;&#x89C9;&#x5F97;&#x8FD9;&#x4E5F;&#x662F;&#x8DD1;&#x6B65;&#x5E26;&#x7ED9;&#x6211;&#xFF0C;&#x4E00;&#x662F;&#x575A;&#x6301;&#x770B;&#x4E66;&#xFF0C;&#x7B2C;&#x4E8C;&#x4EF6;&#x4E5F;&#x5C31;&#x662F;&#x575A;&#x6301;&#x5199;&#x535A;&#x5BA2;&#x3002;&#x8DD1;&#x6B65;&#x7ED9;&#x6211;&#x5E26;&#x6765;&#x7684;&#x662F;&#x8EAB;&#x4F53;&#x5065;&#x5EB7;&#x7684;&#x5EF6;&#x7EED;&#xFF0C;&#x800C;&#x770B;&#x4E66;&#x5199;&#x535A;&#x5BA2;&#x5219;&#x7ED9;&#x6211;&#x5E26;&#x6765;&#x7684;&#x662F;&#x7CBE;&#x795E;&#x4E0A;&#x79EF;&#x7D2F;&#x548C;&#x6C89;&#x6DC0;&#x3002;&#x6211;&#x76F8;&#x4FE1;&#xFF0C;&#x6211;&#x4F1A;&#x50CF;&#x575A;&#x6301;&#x8DD1;&#x6B65;&#x4E00;&#x6837;&#xFF0C;&#x628A;&#x8FD9;&#x4E24;&#x4EF6;&#x4E8B;&#x575A;&#x6301;&#x4E0B;&#x53BB;&#xFF0C;&#x540C;&#x6837;&#x4E5F;&#x4F1A;&#x7EE7;&#x7EED;&#x5C06;&#x8DD1;&#x6B65;&#x575A;&#x6301;&#x4E0B;&#x53BB;&#x3002;</p><blockquote><p>&#x4E00;&#x751F;&#x505A;&#x597D;&#x4E00;&#x4EF6;&#x4E8B;&#xFF0C;&#x4E00;&#x5929;&#x770B;&#x4E00;&#x4E2A;&#x5C0F;&#x65F6;&#x4E66;&#xFF0C;&#x8FD9;&#x5C31;&#x591F;&#x4E86;&#x3002;</p></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&amp;#x4ECE;&amp;#x5E74;&amp;#x521D;2&amp;#x6708;&amp;#x4EFD;&amp;#x5230;&amp;#x73B0;&amp;#x5728;&amp;#xFF0C;&amp;#x6211;&amp;#x5DF2;&amp;#x7ECF;&amp;#x575A;&amp;#x6301;&amp;#x8DD1;&amp;#x6B65;&amp;#x5927;
    
    </summary>
    
      <category term="生活" scheme="http://brucewar.cn/categories/%E7%94%9F%E6%B4%BB/"/>
    
    
      <category term="跑步" scheme="http://brucewar.cn/tags/%E8%B7%91%E6%AD%A5/"/>
    
      <category term="坚持" scheme="http://brucewar.cn/tags/%E5%9D%9A%E6%8C%81/"/>
    
      <category term="生活态度" scheme="http://brucewar.cn/tags/%E7%94%9F%E6%B4%BB%E6%80%81%E5%BA%A6/"/>
    
  </entry>
  
  <entry>
    <title>D3.js（Draggable and Scalable Tree）</title>
    <link href="http://brucewar.cn/2016/10/27/D3.js-Draggable%20and%20Scalable%20Tree/"/>
    <id>http://brucewar.cn/2016/10/27/D3.js-Draggable and Scalable Tree/</id>
    <published>2016-10-27T05:32:26.000Z</published>
    <updated>2016-10-27T07:20:01.755Z</updated>
    
    <content type="html"><![CDATA[<p>&#x56E0;&#x4E3A;&#x6700;&#x8FD1;&#x624B;&#x4E0A;&#x6709;&#x4E2A;&#x5C0F;&#x7684;&#x9700;&#x6C42;&#xFF0C;&#x8BBE;&#x8BA1;&#x4E00;&#x4E2A;&#x53EF;&#x7F29;&#x653E;&#x548C;&#x53EF;&#x62D6;&#x62FD;&#x7684;&#x6811;&#x5F62;&#x7ED3;&#x6784;&#xFF0C;&#x6211;&#x4FBF;&#x53BB;&#x7814;&#x8BFB;&#x4E86;D3&#x5B98;&#x7F51;&#x7ED9;&#x7684;&#x4E00;&#x4E2A;&#x6811;&#x5F62;&#x7684;&#x4F8B;&#x5B50;&#x3002;</p><h3 id="&#x5E03;&#x5C40;&#xFF08;Layout&#xFF09;"><a href="#&#x5E03;&#x5C40;&#xFF08;Layout&#xFF09;" class="headerlink" title="&#x5E03;&#x5C40;&#xFF08;Layout&#xFF09;"></a>&#x5E03;&#x5C40;&#xFF08;Layout&#xFF09;</h3><p>&#x539F;&#x672C;&#x6211;&#x4EE5;&#x4E3A;&#x7406;&#x89E3;&#x4E86;&#x57FA;&#x672C;&#x7684;&#x9009;&#x62E9;&#x5668;&#x3001;&#x5143;&#x7D20;&#x64CD;&#x4F5C;&#x3001;Enter&#x3001;Exit&#x5C31;&#x80FD;&#x53BB;&#x770B;&#x5B9E;&#x4F8B;&#x7684;&#x4EE3;&#x7801;&#x4E86;&#xFF0C;&#x540E;&#x6765;&#x53D1;&#x73B0;&#x6211;&#x9519;&#x4E86;&#xFF0C;&#x6240;&#x4EE5;&#x8FD9;&#x91CC;&#x9700;&#x8981;&#x7406;&#x89E3;&#x4E00;&#x4E0B;D3&#x4E2D;&#x5E03;&#x5C40;&#xFF08;Layout&#xFF09;&#x7684;&#x6982;&#x5FF5;&#x3002;&#x5E03;&#x5C40;&#x662F;D3&#x4E2D;&#x4E00;&#x4E2A;&#x5341;&#x5206;&#x91CD;&#x8981;&#x7684;&#x6982;&#x5FF5;&#xFF0C;&#x4ECE;&#x5E03;&#x5C40;&#x884D;&#x751F;&#x51FA;&#x5F88;&#x591A;&#x56FE;&#x8868;&#x3002;&#x4F8B;&#x5982;&#xFF1A;&#x997C;&#x72B6;&#x56FE;&#xFF08;pie&#xFF09;&#x3001;&#x529B;&#x5BFC;&#x5411;&#x56FE;&#xFF08;force&#xFF09;&#xFF0C;&#x6811;&#x72B6;&#x56FE;&#xFF08;tree&#xFF09;&#x7B49;&#x7B49;&#xFF0C;&#x57FA;&#x672C;&#x5B9E;&#x73B0;&#x4E86;&#x5F88;&#x591A;&#x5F00;&#x6E90;&#x7684;&#x53EF;&#x89C6;&#x5316;&#x5DE5;&#x5177;&#x63D0;&#x4F9B;&#x7684;&#x56FE;&#x8868;&#x3002;&#x4F46;&#x662F;&#x5B83;&#x53C8;&#x548C;&#x5F88;&#x591A;&#x53EF;&#x89C6;&#x5316;&#x5DE5;&#x5177;&#xFF08;&#x5982;Echarts&#xFF09;&#x6709;&#x5F88;&#x5927;&#x7684;&#x4E0D;&#x540C;&#x3002;</p><p>&#x76F8;&#x5BF9;&#x4E8E;&#x5176;&#x5B83;&#x5DE5;&#x5177;&#x6765;&#x8BF4;&#xFF0C;D3&#x8F83;&#x5E95;&#x5C42;&#x4E00;&#x70B9;&#xFF0C;&#x6240;&#x4EE5;&#x521D;&#x5B66;&#x8005;&#x53EF;&#x80FD;&#x4F1A;&#x89C9;&#x5F97;&#x6709;&#x70B9;&#x56F0;&#x96BE;&#xFF0C;&#x4F46;&#x662F;&#x4E00;&#x65E6;&#x7406;&#x89E3;&#x4E86;D3&#x5E03;&#x5C40;&#x7684;&#x601D;&#x60F3;&#xFF0C;&#x4F7F;&#x7528;&#x8D77;&#x6765;&#xFF0C;&#x4F1A;&#x6BD4;&#x5176;&#x5B83;&#x5DE5;&#x5177;&#x66F4;&#x52A0;&#x5F97;&#x5FC3;&#x5E94;&#x624B;&#x3002;&#x9996;&#x5148;&#xFF0C;&#x6211;&#x9610;&#x91CA;&#x4E0B;D3&#x548C;&#x5927;&#x90E8;&#x5206;&#x53EF;&#x89C6;&#x5316;&#x5DE5;&#x5177;&#x6570;&#x636E;&#x5230;&#x56FE;&#x8868;&#x7684;&#x6D41;&#x7A0B;&#xFF1A;</p><ul><li>&#x5927;&#x90E8;&#x5206;&#x53EF;&#x89C6;&#x5316;&#x5DE5;&#x5177;&#xFF1A;&#x6570;&#x636E; =&gt; &#x5C01;&#x88C5;&#x597D;&#x7684;&#x7ED8;&#x56FE;&#x51FD;&#x6570; =&gt; &#x56FE;&#x8868;</li><li>D3&#xFF1A;&#x6570;&#x636E; =&gt; Layout =&gt; &#x7ED8;&#x56FE;&#x6240;&#x9700;&#x7684;&#x6570;&#x636E; =&gt; &#x7ED8;&#x5236;&#x56FE;&#x5F62; =&gt; &#x56FE;&#x8868;</li></ul><p>&#x53EF;&#x4EE5;&#x770B;&#x51FA;&#xFF0C;D3&#x9700;&#x8981;&#x81EA;&#x5DF1;&#x53BB;&#x7ED8;&#x5236;&#x56FE;&#x5F62;&#xFF0C;&#x4F46;&#x662F;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x5E03;&#x5C40;&#x51FD;&#x6570;&#x83B7;&#x5F97;&#x7ED8;&#x56FE;&#x6240;&#x9700;&#x8981;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x574F;&#x5904;&#x662F;&#x5BF9;&#x521D;&#x5B66;&#x8005;&#x662F;&#x4E00;&#x4E2A;&#x5F88;&#x5927;&#x7684;&#x8003;&#x9A8C;&#xFF0C;&#x597D;&#x5904;&#x662F;&#x5B83;&#x80FD;&#x5E2E;&#x52A9;&#x6211;&#x4EEC;&#x5236;&#x4F5C;&#x51FA;&#x66F4;&#x52A0;&#x7CBE;&#x5BC6;&#x7684;&#x56FE;&#x5F62;&#x3002;</p><h3 id="&#x6811;&#x72B6;&#x56FE;"><a href="#&#x6811;&#x72B6;&#x56FE;" class="headerlink" title="&#x6811;&#x72B6;&#x56FE;"></a>&#x6811;&#x72B6;&#x56FE;</h3><p>&#x56DE;&#x5F52;&#x6B63;&#x9898;&#xFF0C;&#x5982;&#x4F55;&#x8BBE;&#x8BA1;&#x4E00;&#x4E2A;&#x6811;&#x5F62;&#x7ED3;&#x6784;&#xFF0C;&#x6211;&#x5C06;&#x4ECE;D3&#x5B98;&#x7F51;&#x63D0;&#x4F9B;&#x7684;&#x793A;&#x4F8B;&#x4EE3;&#x7801;&#x5206;&#x6790;&#x3002;</p><p>&#x9875;&#x9762;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#xFF1A;</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="meta-keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">&quot;en&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;utf-8&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">title</span>&gt;</span>tree<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line">	<span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="css"></span><br><span class="line">	<span class="selector-tag">body</span>{</span><br><span class="line">		<span class="attribute">margin</span>: <span class="number">0</span>;</span><br><span class="line">	}</span><br><span class="line">	<span class="selector-tag">svg</span>{</span><br><span class="line">		<span class="attribute">background-color</span>: <span class="number">#eee</span>;</span><br><span class="line">	}</span><br><span class="line">	<span class="selector-class">.node</span> <span class="selector-tag">circle</span> {</span><br><span class="line">	  <span class="attribute">cursor</span>: pointer;</span><br><span class="line">	  <span class="attribute">fill</span>: <span class="number">#fff</span>;</span><br><span class="line">	  <span class="attribute">stroke</span>: steelblue;</span><br><span class="line">	  <span class="attribute">stroke-width</span>: <span class="number">1.5px</span>;</span><br><span class="line">	}</span><br><span class="line">	<span class="selector-class">.node</span> <span class="selector-tag">text</span> {</span><br><span class="line">	  <span class="attribute">font-size</span>: <span class="number">11px</span>;</span><br><span class="line">	}</span><br><span class="line">	<span class="selector-tag">path</span><span class="selector-class">.link</span> {</span><br><span class="line">	  <span class="attribute">fill</span>: none;</span><br><span class="line">	  <span class="attribute">stroke</span>: <span class="number">#ccc</span>;</span><br><span class="line">	  <span class="attribute">stroke-width</span>: <span class="number">1.5px</span>;</span><br><span class="line">	}</span><br><span class="line">	<span class="selector-tag">g</span><span class="selector-class">.detail</span> <span class="selector-tag">rect</span>{</span><br><span class="line">		<span class="attribute">fill</span>: <span class="number">#000</span>;</span><br><span class="line">		<span class="attribute">fill-opacity</span>: .<span class="number">6</span>;</span><br><span class="line">		<span class="attribute">rx</span>: <span class="number">5</span>;</span><br><span class="line">		<span class="attribute">ry</span>: <span class="number">5</span>;</span><br><span class="line">	}</span><br><span class="line">	<span class="selector-tag">g</span><span class="selector-class">.detail</span> <span class="selector-tag">text</span>{</span><br><span class="line">		<span class="attribute">fill</span>: <span class="number">#fff</span>;</span><br><span class="line">	}</span><br><span class="line">	</span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">	<span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;treeContainer&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;./dist/tree.bundle.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><p>&#x56E0;&#x4E3A;D3&#x793A;&#x4F8B;&#x4EE3;&#x7801;&#x662F;&#x540C;&#x6B65;&#x7684;&#x5F62;&#x5F0F;&#x8BFB;&#x51FA;&#x6574;&#x4E2A;&#x6811;&#x5F62;&#x6570;&#x636E;&#x7ED3;&#x6784;&#xFF0C;&#x6211;&#x5BF9;&#x5176;&#x8FDB;&#x884C;&#x4E86;&#x6539;&#x9020;&#xFF0C;&#x6A21;&#x62DF;&#x5F02;&#x6B65;&#x6570;&#x636E;&#xFF08;async_city.json&#xFF09;&#x3002;</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br></pre></td><td class="code"><pre><span class="line">{</span><br><span class="line">	<span class="string">&quot;root&quot;</span>: {</span><br><span class="line">		<span class="string">&quot;name&quot;</span>: <span class="string">&quot;&#x4E2D;&#x56FD;&quot;</span></span><br><span class="line">	},</span><br><span class="line">	<span class="string">&quot;&#x4E2D;&#x56FD;&quot;</span>: {</span><br><span class="line">		<span class="string">&quot;name&quot;</span>: <span class="string">&quot;&#x4E2D;&#x56FD;&quot;</span>,</span><br><span class="line">		<span class="string">&quot;children&quot;</span>: [</span><br><span class="line">			{<span class="string">&quot;name&quot;</span>: <span class="string">&quot;&#x6D59;&#x6C5F;&quot;</span>},</span><br><span class="line">			{<span class="string">&quot;name&quot;</span>: <span class="string">&quot;&#x5E7F;&#x897F;&quot;</span>},</span><br><span class="line">			{<span class="string">&quot;name&quot;</span>: <span class="string">&quot;&#x9ED1;&#x9F99;&#x6C5F;&quot;</span>},</span><br><span class="line">			{<span class="string">&quot;name&quot;</span>: <span class="string">&quot;&#x65B0;&#x7586;&quot;</span>}</span><br><span class="line">		]</span><br><span class="line">	},</span><br><span class="line">	<span class="string">&quot;&#x6D59;&#x6C5F;&quot;</span>: {</span><br><span class="line">		<span class="string">&quot;name&quot;</span>: <span class="string">&quot;&#x6D59;&#x6C5F;&quot;</span>,</span><br><span class="line">		<span class="string">&quot;children&quot;</span>: [</span><br><span class="line">			{<span class="string">&quot;name&quot;</span>: <span class="string">&quot;&#x676D;&#x5DDE;&quot;</span>},</span><br><span class="line">			{<span class="string">&quot;name&quot;</span>: <span class="string">&quot;&#x5B81;&#x6CE2;&quot;</span>},</span><br><span class="line">			{<span class="string">&quot;name&quot;</span>:<span class="string">&quot;&#x6E29;&#x5DDE;&quot;</span> },</span><br><span class="line">			{<span class="string">&quot;name&quot;</span>:<span class="string">&quot;&#x7ECD;&#x5174;&quot;</span> }</span><br><span class="line">		]</span><br><span class="line">	},</span><br><span class="line">	<span class="string">&quot;&#x5E7F;&#x897F;&quot;</span>: {</span><br><span class="line">		<span class="string">&quot;name&quot;</span>: <span class="string">&quot;&#x5E7F;&#x897F;&quot;</span>,</span><br><span class="line">		<span class="string">&quot;children&quot;</span>: [</span><br><span class="line">			{<span class="string">&quot;name&quot;</span>: <span class="string">&quot;&#x6842;&#x6797;&quot;</span>},</span><br><span class="line">			{<span class="string">&quot;name&quot;</span>: <span class="string">&quot;&#x5357;&#x5B81;&quot;</span>},</span><br><span class="line">			{<span class="string">&quot;name&quot;</span>: <span class="string">&quot;&#x67F3;&#x5DDE;&quot;</span>},</span><br><span class="line">			{<span class="string">&quot;name&quot;</span>: <span class="string">&quot;&#x9632;&#x57CE;&#x6E2F;&quot;</span>}</span><br><span class="line">		]</span><br><span class="line">	},</span><br><span class="line">	<span class="string">&quot;&#x6842;&#x6797;&quot;</span>: {</span><br><span class="line">		<span class="string">&quot;name&quot;</span>: <span class="string">&quot;&#x6842;&#x6797;&quot;</span>,</span><br><span class="line">		<span class="string">&quot;children&quot;</span>: [</span><br><span class="line">			{<span class="string">&quot;name&quot;</span>:<span class="string">&quot;&#x79C0;&#x5CF0;&#x533A;&quot;</span>},</span><br><span class="line">			{<span class="string">&quot;name&quot;</span>:<span class="string">&quot;&#x53E0;&#x5F69;&#x533A;&quot;</span>},</span><br><span class="line">			{<span class="string">&quot;name&quot;</span>:<span class="string">&quot;&#x8C61;&#x5C71;&#x533A;&quot;</span>},</span><br><span class="line">			{<span class="string">&quot;name&quot;</span>:<span class="string">&quot;&#x4E03;&#x661F;&#x533A;&quot;</span>}</span><br><span class="line">		]</span><br><span class="line">	},</span><br><span class="line">	<span class="string">&quot;&#x9ED1;&#x9F99;&#x6C5F;&quot;</span>: {</span><br><span class="line">			<span class="string">&quot;name&quot;</span>:<span class="string">&quot;&#x9ED1;&#x9F99;&#x6C5F;&quot;</span>,</span><br><span class="line">			<span class="string">&quot;children&quot;</span>:</span><br><span class="line">			[</span><br><span class="line">					{<span class="string">&quot;name&quot;</span>:<span class="string">&quot;&#x54C8;&#x5C14;&#x6EE8;&quot;</span>},</span><br><span class="line">					{<span class="string">&quot;name&quot;</span>:<span class="string">&quot;&#x9F50;&#x9F50;&#x54C8;&#x5C14;&quot;</span>},</span><br><span class="line">					{<span class="string">&quot;name&quot;</span>:<span class="string">&quot;&#x7261;&#x4E39;&#x6C5F;&quot;</span>},</span><br><span class="line">					{<span class="string">&quot;name&quot;</span>:<span class="string">&quot;&#x5927;&#x5E86;&quot;</span>}</span><br><span class="line">			]</span><br><span class="line">	},</span><br><span class="line">	<span class="string">&quot;&#x65B0;&#x7586;&quot;</span> : {</span><br><span class="line">			<span class="string">&quot;name&quot;</span>:<span class="string">&quot;&#x65B0;&#x7586;&quot;</span> ,</span><br><span class="line">			<span class="string">&quot;children&quot;</span>:</span><br><span class="line">			[</span><br><span class="line">					{<span class="string">&quot;name&quot;</span>:<span class="string">&quot;&#x4E4C;&#x9C81;&#x6728;&#x9F50;&quot;</span>},</span><br><span class="line">					{<span class="string">&quot;name&quot;</span>:<span class="string">&quot;&#x514B;&#x62C9;&#x739B;&#x4F9D;&quot;</span>},</span><br><span class="line">					{<span class="string">&quot;name&quot;</span>:<span class="string">&quot;&#x5410;&#x9C81;&#x756A;&quot;</span>},</span><br><span class="line">					{<span class="string">&quot;name&quot;</span>:<span class="string">&quot;&#x54C8;&#x5BC6;&quot;</span>}</span><br><span class="line">			]</span><br><span class="line">	}</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h4 id="&#x753B;&#x5E03;"><a href="#&#x753B;&#x5E03;" class="headerlink" title="&#x753B;&#x5E03;"></a>&#x753B;&#x5E03;</h4><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> margin = {</span><br><span class="line">	<span class="attr">top</span>: <span class="number">20</span>,</span><br><span class="line">	<span class="attr">left</span>: <span class="number">50</span>,</span><br><span class="line">	<span class="attr">right</span>: <span class="number">50</span>,</span><br><span class="line">	<span class="attr">bottom</span>: <span class="number">20</span></span><br><span class="line">};</span><br><span class="line"><span class="keyword">var</span> width = $(<span class="built_in">document</span>).width(),</span><br><span class="line">	height = $(<span class="built_in">document</span>).height(),</span><br><span class="line">	i = <span class="number">0</span>,</span><br><span class="line">	limit = <span class="number">2</span>,</span><br><span class="line">	root;</span><br><span class="line"></span><br><span class="line">	<span class="comment">// draggable and scalable</span></span><br><span class="line">	<span class="keyword">var</span> zoomListener = d3.behavior.zoom().scaleExtent([<span class="number">0.1</span>, <span class="number">3</span>]).on(<span class="string">&apos;zoom&apos;</span>, zoom);</span><br><span class="line">	<span class="function"><span class="keyword">function</span> <span class="title">zoom</span>(<span class="params"></span>)</span>{</span><br><span class="line">		d3.select(<span class="string">&apos;svg&apos;</span>).select(<span class="string">&apos;g&apos;</span>).attr(<span class="string">&apos;transform&apos;</span>, <span class="string">&apos;translate(&apos;</span> + d3.event.translate + <span class="string">&apos;)scale(&apos;</span> + d3.event.scale + <span class="string">&apos;)&apos;</span>);</span><br><span class="line">	}</span><br><span class="line"></span><br><span class="line">	<span class="keyword">var</span> svg = d3.select(<span class="string">&quot;#treeContainer&quot;</span>).append(<span class="string">&quot;svg&quot;</span>)</span><br><span class="line">			.attr(<span class="string">&quot;width&quot;</span>, width - margin.left - margin.right)</span><br><span class="line">			.attr(<span class="string">&quot;height&quot;</span>, height - margin.top - margin.bottom)</span><br><span class="line">			.call(zoomListener)</span><br><span class="line">		.append(<span class="string">&quot;g&quot;</span>)</span><br><span class="line">			.attr(<span class="string">&quot;transform&quot;</span>, <span class="string">&quot;translate(&quot;</span> + margin.left + <span class="string">&quot;,&quot;</span> + margin.top + <span class="string">&quot;)&quot;</span>);</span><br></pre></td></tr></table></figure><h4 id="&#x83B7;&#x53D6;&#x5F02;&#x6B65;&#x6570;&#x636E;"><a href="#&#x83B7;&#x53D6;&#x5F02;&#x6B65;&#x6570;&#x636E;" class="headerlink" title="&#x83B7;&#x53D6;&#x5F02;&#x6B65;&#x6570;&#x636E;"></a>&#x83B7;&#x53D6;&#x5F02;&#x6B65;&#x6570;&#x636E;</h4><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x5F02;&#x6B65;&#x83B7;&#x53D6;&#x6570;&#x636E;</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">getData</span>(<span class="params">sd, cb</span>)</span>{</span><br><span class="line">	d3.json(<span class="string">&apos;data/async_city.json&apos;</span>, <span class="function"><span class="keyword">function</span>(<span class="params">err, json</span>)</span>{</span><br><span class="line">		<span class="comment">// &#x901A;&#x8FC7;callback&#x8FD4;&#x56DE;&#x90E8;&#x5206;&#x6570;&#x636E;</span></span><br><span class="line">		cb &amp;&amp; cb(json[sd.name]);</span><br><span class="line">	});</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h4 id="&#x6784;&#x9020;&#x6811;"><a href="#&#x6784;&#x9020;&#x6811;" class="headerlink" title="&#x6784;&#x9020;&#x6811;"></a>&#x6784;&#x9020;&#x6811;</h4><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x83B7;&#x53D6;&#x6811;&#x7684;root</span></span><br><span class="line">getData({<span class="attr">name</span>: <span class="string">&apos;root&apos;</span>}, <span class="function"><span class="keyword">function</span>(<span class="params">json</span>)</span>{</span><br><span class="line">	root = json;</span><br><span class="line">	root.x0 = height / <span class="number">2</span>;</span><br><span class="line">	root.y0 = width / <span class="number">2</span>;</span><br><span class="line"></span><br><span class="line">	<span class="comment">// &#x521D;&#x59CB;&#x5316;&#x6811;&#x6839;</span></span><br><span class="line">	update(root);</span><br><span class="line">});</span><br></pre></td></tr></table></figure><p>&#x4ECE;&#x4E0A;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x53EF;&#x4EE5;&#x770B;&#x51FA;&#x6784;&#x9020;&#x6811;&#x7684;&#x6838;&#x5FC3;&#x4EE3;&#x7801;&#x5C31;&#x662F;&#x8FD9;&#x4E2A;update&#x51FD;&#x6570;&#xFF0C;&#x4E0B;&#x9762;&#x4EE5;&#x6CE8;&#x91CA;&#x7684;&#x5F62;&#x5F0F;&#x6DF1;&#x5165;&#x7406;&#x89E3;&#x6811;&#x5F62;&#x7684;&#x6784;&#x9020;&#x3002;</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x65B0;&#x5EFA;&#x4E00;&#x4E2A;&#x6811;&#x7684;&#x5E03;&#x5C40;</span></span><br><span class="line"><span class="keyword">var</span> tree = d3.layout.tree()</span><br><span class="line">		.size([height - margin.top - margin.bottom, width - margin.left - margin.right]);</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x56E0;&#x4E3A;&#x9ED8;&#x8BA4;&#x7684;&#x6811;&#x5E03;&#x5C40;&#x662F;&#x81EA;&#x4E0A;&#x800C;&#x4E0B;&#x7684;&#xFF0C;&#x8FD9;&#x91CC;&#x6784;&#x5EFA;&#x4E00;&#x4E2A;&#x81EA;&#x5DE6;&#x5411;&#x53F3;&#x7684;&#x6811;&#xFF0C;&#x6545;&#x9700;&#x8981;&#x4E00;&#x4E2A;&#x8F6C;&#x6362;x&#x548C;y&#x5750;&#x6807;&#x7684;&#x51FD;&#x6570;</span></span><br><span class="line"><span class="keyword">var</span> diagonal = d3.svg.diagonal()</span><br><span class="line">		.projection(<span class="function"><span class="keyword">function</span>(<span class="params">d</span>) </span>{ <span class="keyword">return</span> [d.y, d.x]; });</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">update</span>(<span class="params">source</span>) </span>{</span><br><span class="line">	<span class="keyword">var</span> duration = d3.event &amp;&amp; d3.event.altKey ? <span class="number">5000</span> : <span class="number">500</span>;</span><br><span class="line"></span><br><span class="line">	<span class="comment">/**</span><br><span class="line">	* &#x8FD9;&#x91CC;&#x5B9E;&#x9645;&#x4E0A;&#x662F;&#x901A;&#x8FC7;tree&#x7684;nodes&#x51FD;&#x6570;&#x83B7;&#x5F97;&#x6811;&#x5F62;&#x7ED3;&#x6784;&#x7684;&#x6BCF;&#x4E2A;&#x8282;&#x70B9;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x5305;&#x62EC;&#x4F4D;&#x7F6E;&#x4FE1;&#x606F;&#x548C;&#x6DF1;&#x5EA6;</span><br><span class="line">	* &#x8FD4;&#x56DE;&#x7684;&#x6570;&#x636E;&#x7ED3;&#x6784;&#x5982;&#x4E0B;&#xFF1A;</span><br><span class="line">	* [{depth: 0, name: &quot;&#x4E2D;&#x56FD;&quot;, children: [], x: 380, y: 0}]</span><br><span class="line">	*/</span></span><br><span class="line">	<span class="keyword">var</span> nodes = tree.nodes(root).reverse();</span><br><span class="line"></span><br><span class="line">	<span class="comment">// &#x4E3A;&#x4E86;&#x8BA9;&#x5F53;&#x524D;&#x8282;&#x70B9;&#x5C45;&#x4E2D;&#xFF0C;&#x6545;&#x66F4;&#x5177;&#x5F53;&#x524D;&#x8282;&#x70B9;&#x7684;depth&#x6765;&#x8BA1;&#x7B97;&#x5404;&#x8282;&#x70B9;&#x7684;y&#x5750;&#x6807;&#xFF08;&#x5373;&#x6A2A;&#x5411;&#x4F4D;&#x7F6E;&#xFF09;</span></span><br><span class="line">	<span class="keyword">var</span> srcDepth = source.depth;</span><br><span class="line">	nodes.forEach(<span class="function"><span class="keyword">function</span>(<span class="params">d</span>)</span>{</span><br><span class="line">		d.y = height / <span class="number">2</span> + <span class="number">180</span> * (d.depth - srcDepth);</span><br><span class="line">	});</span><br><span class="line"></span><br><span class="line">	<span class="comment">// Update the nodes&#x2026;</span></span><br><span class="line">	<span class="keyword">var</span> node = svg.selectAll(<span class="string">&quot;g.node&quot;</span>)</span><br><span class="line">			.data(nodes, <span class="function"><span class="keyword">function</span>(<span class="params">d</span>) </span>{ <span class="keyword">return</span> d.id || (d.id = ++i); });</span><br><span class="line"></span><br><span class="line">	<span class="comment">// Enter any new nodes at the parent&apos;s previous position.</span></span><br><span class="line">	<span class="keyword">var</span> nodeEnter = node.enter().append(<span class="string">&quot;g&quot;</span>)</span><br><span class="line">			.attr(<span class="string">&quot;class&quot;</span>, <span class="string">&quot;node&quot;</span>)</span><br><span class="line">			.attr(<span class="string">&quot;transform&quot;</span>, <span class="function"><span class="keyword">function</span>(<span class="params">d</span>) </span>{ <span class="keyword">return</span> <span class="string">&quot;translate(&quot;</span> + source.y0 + <span class="string">&quot;,&quot;</span> + source.x0 + <span class="string">&quot;)&quot;</span>; })</span><br><span class="line">			.on(<span class="string">&quot;click&quot;</span>, click)</span><br><span class="line">			.on(<span class="string">&apos;mouseover&apos;</span>, <span class="function"><span class="keyword">function</span>(<span class="params">d</span>)</span>{</span><br><span class="line">				<span class="keyword">if</span>(d.name == <span class="string">&apos;more&apos;</span>) <span class="keyword">return</span>;</span><br><span class="line">				<span class="comment">// &#x9F20;&#x6807;hover&#x67D0;&#x4E2A;&#x8282;&#x70B9;&#x65F6;&#xFF0C;&#x663E;&#x793A;&#x4E00;&#x4E2A;&#x8BE6;&#x7EC6;&#x4FE1;&#x606F;&#x7684;&#x5F39;&#x5C42;</span></span><br><span class="line">				<span class="keyword">var</span> detail = d3.select(<span class="keyword">this</span>).append(<span class="string">&apos;g&apos;</span>)</span><br><span class="line">						.attr(<span class="string">&apos;class&apos;</span>, <span class="string">&apos;detail&apos;</span>)</span><br><span class="line">						.attr(<span class="string">&apos;dx&apos;</span>, d3.event.x)</span><br><span class="line">						.attr(<span class="string">&apos;dy&apos;</span>, d3.event.y + <span class="number">10</span>);</span><br><span class="line">				detail.append(<span class="string">&apos;rect&apos;</span>)</span><br><span class="line">						.attr(<span class="string">&apos;width&apos;</span>, <span class="number">100</span>)</span><br><span class="line">						.attr(<span class="string">&apos;height&apos;</span>, <span class="number">100</span>);</span><br><span class="line">				detail.append(<span class="string">&apos;text&apos;</span>)</span><br><span class="line">						.attr(<span class="string">&apos;dx&apos;</span>, <span class="string">&apos;.35em&apos;</span>)</span><br><span class="line">						.attr(<span class="string">&apos;dy&apos;</span>, <span class="string">&apos;2em&apos;</span>)</span><br><span class="line">						.attr(<span class="string">&apos;text-anchor&apos;</span>, <span class="string">&apos;start&apos;</span>)</span><br><span class="line">						.text(<span class="function"><span class="keyword">function</span>(<span class="params">d</span>)</span>{</span><br><span class="line">							<span class="keyword">return</span> <span class="string">&apos;name: &apos;</span> + d.name;</span><br><span class="line">						});</span><br><span class="line">			})</span><br><span class="line">			.on(<span class="string">&apos;mousemove&apos;</span>, <span class="function"><span class="keyword">function</span>(<span class="params">d</span>)</span>{</span><br><span class="line">				<span class="keyword">var</span> detail = d3.select(<span class="keyword">this</span>).select(<span class="string">&apos;.detail&apos;</span>);</span><br><span class="line">				detail.attr(<span class="string">&apos;x&apos;</span>, d3.event.x)</span><br><span class="line">						.attr(<span class="string">&apos;y&apos;</span>, d3.event.y);</span><br><span class="line">			})</span><br><span class="line">			.on(<span class="string">&apos;mouseout&apos;</span>, <span class="function"><span class="keyword">function</span>(<span class="params">d</span>)</span>{</span><br><span class="line">				<span class="keyword">if</span>(d.name == <span class="string">&apos;more&apos;</span>) <span class="keyword">return</span>;</span><br><span class="line">				d3.select(<span class="keyword">this</span>).select(<span class="string">&apos;.detail&apos;</span>).remove();</span><br><span class="line">			});</span><br><span class="line"></span><br><span class="line">	nodeEnter.append(<span class="string">&quot;circle&quot;</span>)</span><br><span class="line">			.attr(<span class="string">&quot;r&quot;</span>, <span class="number">1e-6</span>)</span><br><span class="line">			.style(<span class="string">&quot;fill&quot;</span>, <span class="function"><span class="keyword">function</span>(<span class="params">d</span>)</span>{ <span class="keyword">return</span> !d.isExpand ? <span class="string">&quot;lightsteelblue&quot;</span> : <span class="string">&quot;#fff&quot;</span>; });</span><br><span class="line"></span><br><span class="line">	nodeEnter.append(<span class="string">&quot;text&quot;</span>)</span><br><span class="line">			.attr(<span class="string">&quot;x&quot;</span>, <span class="number">-10</span>)</span><br><span class="line">			.attr(<span class="string">&quot;dy&quot;</span>, <span class="string">&quot;.35em&quot;</span>)</span><br><span class="line">			.attr(<span class="string">&quot;text-anchor&quot;</span>, <span class="string">&quot;end&quot;</span>)</span><br><span class="line">			.text(<span class="function"><span class="keyword">function</span>(<span class="params">d</span>) </span>{ <span class="keyword">return</span> d.name; })</span><br><span class="line">			.style(<span class="string">&quot;fill-opacity&quot;</span>, <span class="number">1e-6</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">	<span class="comment">// Transition nodes to their new position.</span></span><br><span class="line">	<span class="keyword">var</span> nodeUpdate = node.transition()</span><br><span class="line">			.duration(duration)</span><br><span class="line">			.attr(<span class="string">&quot;transform&quot;</span>, <span class="function"><span class="keyword">function</span>(<span class="params">d</span>) </span>{ <span class="keyword">return</span> <span class="string">&quot;translate(&quot;</span> + d.y + <span class="string">&quot;,&quot;</span> + d.x + <span class="string">&quot;)&quot;</span>; });</span><br><span class="line"></span><br><span class="line">	nodeUpdate.select(<span class="string">&quot;circle&quot;</span>)</span><br><span class="line">			.attr(<span class="string">&quot;r&quot;</span>, <span class="number">10</span>)</span><br><span class="line">			.style(<span class="string">&quot;fill&quot;</span>, <span class="function"><span class="keyword">function</span>(<span class="params">d</span>)</span>{ <span class="keyword">return</span> !d.isExpand ? <span class="string">&quot;lightsteelblue&quot;</span> : <span class="string">&quot;#fff&quot;</span>; });</span><br><span class="line"></span><br><span class="line">	nodeUpdate.select(<span class="string">&quot;text&quot;</span>)</span><br><span class="line">			.style(<span class="string">&quot;fill-opacity&quot;</span>, <span class="number">1</span>);</span><br><span class="line"></span><br><span class="line">	<span class="comment">// Transition exiting nodes to the parent&apos;s new position.</span></span><br><span class="line">	<span class="keyword">var</span> nodeExit = node.exit().transition()</span><br><span class="line">			.duration(duration)</span><br><span class="line">			.attr(<span class="string">&quot;transform&quot;</span>, <span class="function"><span class="keyword">function</span>(<span class="params">d</span>) </span>{</span><br><span class="line">				<span class="keyword">if</span>(d.name == <span class="string">&apos;more&apos;</span>) <span class="keyword">this</span>.remove();</span><br><span class="line">				<span class="keyword">return</span> <span class="string">&quot;translate(&quot;</span> + source.y + <span class="string">&quot;,&quot;</span> + source.x + <span class="string">&quot;)&quot;</span>;</span><br><span class="line">			})</span><br><span class="line">			.remove();</span><br><span class="line"></span><br><span class="line">	nodeExit.select(<span class="string">&quot;circle&quot;</span>)</span><br><span class="line">			.attr(<span class="string">&quot;r&quot;</span>, <span class="number">1e-6</span>);</span><br><span class="line"></span><br><span class="line">	nodeExit.select(<span class="string">&quot;text&quot;</span>)</span><br><span class="line">			.style(<span class="string">&quot;fill-opacity&quot;</span>, <span class="number">1e-6</span>);</span><br><span class="line"></span><br><span class="line">	<span class="comment">/** Update the links...</span><br><span class="line">	* tree.links&#x65B9;&#x6CD5;&#x83B7;&#x53D6;&#x8FDE;&#x7EBF;&#x8282;&#x70B9;&#x4E4B;&#x95F4;&#x7684;&#x6620;&#x5C04;&#xFF0C;&#x8FD4;&#x56DE;&#x7684;&#x6570;&#x636E;&#x7ED3;&#x6784;&#x5982;&#x4E0B;&#xFF1A;</span><br><span class="line">	* [{source: {}, target: {}}]</span><br><span class="line">	*/</span></span><br><span class="line">	<span class="keyword">var</span> link = svg.selectAll(<span class="string">&quot;path.link&quot;</span>)</span><br><span class="line">			.data(tree.links(nodes), <span class="function"><span class="keyword">function</span>(<span class="params">d</span>) </span>{ <span class="keyword">return</span> d.target.id; });</span><br><span class="line"></span><br><span class="line">	<span class="comment">// Enter any new links at the parent&apos;s previous position.</span></span><br><span class="line">	link.enter().insert(<span class="string">&quot;path&quot;</span>, <span class="string">&quot;g&quot;</span>)</span><br><span class="line">			.attr(<span class="string">&quot;class&quot;</span>, <span class="string">&quot;link&quot;</span>)</span><br><span class="line">			.attr(<span class="string">&quot;d&quot;</span>, <span class="function"><span class="keyword">function</span>(<span class="params">d</span>) </span>{</span><br><span class="line">				<span class="keyword">var</span> o = {<span class="attr">x</span>: source.x0, <span class="attr">y</span>: source.y0};</span><br><span class="line">				<span class="keyword">return</span> diagonal({<span class="attr">source</span>: o, <span class="attr">target</span>: o});</span><br><span class="line">			})</span><br><span class="line">		.transition()</span><br><span class="line">			.duration(duration)</span><br><span class="line">			.attr(<span class="string">&quot;d&quot;</span>, diagonal);</span><br><span class="line"></span><br><span class="line">	<span class="comment">// Transition links to their new position.</span></span><br><span class="line">	link.transition()</span><br><span class="line">			.duration(duration)</span><br><span class="line">			.attr(<span class="string">&quot;d&quot;</span>, diagonal);</span><br><span class="line"></span><br><span class="line">	<span class="comment">// Transition exiting nodes to the parent&apos;s new position.</span></span><br><span class="line">	link.exit().transition()</span><br><span class="line">			.duration(duration)</span><br><span class="line">			.attr(<span class="string">&quot;d&quot;</span>, <span class="function"><span class="keyword">function</span>(<span class="params">d</span>) </span>{</span><br><span class="line">				<span class="keyword">if</span>(d.target.name == <span class="string">&apos;more&apos;</span>) <span class="keyword">this</span>.remove();</span><br><span class="line">				<span class="keyword">var</span> o = {<span class="attr">x</span>: source.x, <span class="attr">y</span>: source.y};</span><br><span class="line">				<span class="keyword">return</span> diagonal({<span class="attr">source</span>: o, <span class="attr">target</span>: o});</span><br><span class="line">			})</span><br><span class="line">			.remove();</span><br><span class="line"></span><br><span class="line">	<span class="comment">// Stash the old positions for transition.</span></span><br><span class="line">	<span class="comment">// &#x8BB0;&#x5F55;&#x5F53;&#x524D;&#x8282;&#x70B9;&#x6240;&#x5728;&#x7684;&#x4F4D;&#x7F6E;&#xFF0C;&#x4E3A;node update&#x63D0;&#x4F9B;&#x4F4D;&#x79FB;&#x52A8;&#x753B;</span></span><br><span class="line">	nodes.forEach(<span class="function"><span class="keyword">function</span>(<span class="params">d</span>) </span>{</span><br><span class="line">		d.x0 = d.x;</span><br><span class="line">		d.y0 = d.y;</span><br><span class="line">	});</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">collapse</span>(<span class="params">d</span>)</span>{</span><br><span class="line">	<span class="keyword">delete</span> d._children;</span><br><span class="line">	<span class="keyword">delete</span> d.isExpand;</span><br><span class="line">	<span class="keyword">delete</span> d.children;</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">expand</span>(<span class="params">d</span>)</span>{</span><br><span class="line">	getData({<span class="attr">name</span>: d.name}, <span class="function"><span class="keyword">function</span>(<span class="params">json</span>)</span>{</span><br><span class="line">		<span class="keyword">if</span>(json &amp;&amp; json.children){</span><br><span class="line">			<span class="comment">// &#x83B7;&#x53D6;&#x5230;&#x6B64;&#x8282;&#x70B9;&#x6709;&#x5B50;&#x8282;&#x70B9;</span></span><br><span class="line">			d._children = json.children;</span><br><span class="line">			d.children = d._children.slice(<span class="number">0</span>, limit);</span><br><span class="line">			<span class="keyword">if</span>(d._children.length &gt; d.children.length){</span><br><span class="line">				d.children.push({<span class="string">&apos;name&apos;</span>: <span class="string">&apos;more&apos;</span>});</span><br><span class="line">			}</span><br><span class="line">		}</span><br><span class="line">		d.isExpand = <span class="literal">true</span>;</span><br><span class="line">		update(d);</span><br><span class="line">	});</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x5F02;&#x6B65;&#x83B7;&#x53D6;&#x6570;&#x636E;</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">getData</span>(<span class="params">sd, cb</span>)</span>{</span><br><span class="line">	d3.json(<span class="string">&apos;data/async_city.json&apos;</span>, <span class="function"><span class="keyword">function</span>(<span class="params">err, json</span>)</span>{</span><br><span class="line">		cb &amp;&amp; cb(json[sd.name]);</span><br><span class="line">	});</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">click</span>(<span class="params">d</span>)</span>{</span><br><span class="line">	<span class="keyword">if</span>(d.name == <span class="string">&apos;more&apos;</span>){</span><br><span class="line">		<span class="comment">// &#x70B9;&#x51FB;&#x66F4;&#x591A;</span></span><br><span class="line">		d.parent.children = d.parent._children.slice(<span class="number">0</span>, (d.parent.children.length - <span class="number">1</span>) + limit);</span><br><span class="line">		<span class="keyword">if</span>(d.parent._children.length &gt; d.parent.children.length){</span><br><span class="line">			d.parent.children.push({<span class="string">&apos;name&apos;</span>: <span class="string">&apos;more&apos;</span>});</span><br><span class="line">		}</span><br><span class="line">		update(d.parent);</span><br><span class="line">	}<span class="keyword">else</span> <span class="keyword">if</span>(d.isExpand &amp;&amp; d.children){</span><br><span class="line">		<span class="comment">// &#x70B9;&#x51FB;&#x5C55;&#x5F00;&#x7684;&#x8282;&#x70B9;</span></span><br><span class="line">		collapse(d);</span><br><span class="line">		update(d);</span><br><span class="line">	}<span class="keyword">else</span>{</span><br><span class="line">		<span class="comment">// &#x70B9;&#x51FB;&#x672A;&#x5C55;&#x5F00;&#x7684;&#x70B9;</span></span><br><span class="line">		expand(d);</span><br><span class="line">	}</span><br><span class="line">}</span><br></pre></td></tr></table></figure><blockquote><p>&#x53EF;&#x4EE5;&#x4ECE;<a href="https://github.com/brucewar/practice-in-D3" target="_blank" rel="external">https://github.com/brucewar/practice-in-D3</a>&#x83B7;&#x53D6;&#x793A;&#x4F8B;&#x4EE3;&#x7801;</p></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&amp;#x56E0;&amp;#x4E3A;&amp;#x6700;&amp;#x8FD1;&amp;#x624B;&amp;#x4E0A;&amp;#x6709;&amp;#x4E2A;&amp;#x5C0F;&amp;#x7684;&amp;#x9700;&amp;#x6C42;&amp;#xFF0C;&amp;#x8BBE;&amp;#x8BA1;&amp;#x4E00;&amp;#x4E2A;&amp;
    
    </summary>
    
      <category term="D3.js" scheme="http://brucewar.cn/categories/D3-js/"/>
    
    
      <category term="D3" scheme="http://brucewar.cn/tags/D3/"/>
    
      <category term="树状图" scheme="http://brucewar.cn/tags/%E6%A0%91%E7%8A%B6%E5%9B%BE/"/>
    
  </entry>
  
  <entry>
    <title>D3.js（完整的柱状图）</title>
    <link href="http://brucewar.cn/2016/10/25/D3.js-%E5%AE%8C%E6%95%B4%E7%9A%84%E6%9F%B1%E7%8A%B6%E5%9B%BE/"/>
    <id>http://brucewar.cn/2016/10/25/D3.js-完整的柱状图/</id>
    <published>2016-10-25T02:59:26.000Z</published>
    <updated>2016-10-27T06:18:29.403Z</updated>
    
    <content type="html"><![CDATA[<p>&#x9996;&#x5148;&#xFF0C;&#x6211;&#x4EEC;&#x5148;&#x770B;&#x4E00;&#x4E0B;&#x6700;&#x7EC8;&#x7684;&#x67F1;&#x72B6;&#x56FE;&#x6548;&#x679C;&#x5C55;&#x793A;&#x3002;&#x5982;&#x4E0B;&#x56FE;&#x6240;&#x793A;&#xFF0C;&#x4E00;&#x4E2A;&#x5B8C;&#x6574;&#x7684;&#x67F1;&#x72B6;&#x56FE;&#x9700;&#x8981;&#x5305;&#x542B;&#x4E09;&#x4E2A;&#x90E8;&#x5206;&#xFF1A;&#x77E9;&#x5F62;&#x3001;&#x6587;&#x5B57;&#x3001;&#x5750;&#x6807;&#x8F74;&#x3002;</p><p><img src="http://brucewar.qiniudn.com/chart.png" alt="&#x67F1;&#x72B6;&#x56FE;"></p><h3 id="&#x6DFB;&#x52A0;SVG&#x753B;&#x5E03;"><a href="#&#x6DFB;&#x52A0;SVG&#x753B;&#x5E03;" class="headerlink" title="&#x6DFB;&#x52A0;SVG&#x753B;&#x5E03;"></a>&#x6DFB;&#x52A0;SVG&#x753B;&#x5E03;</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x753B;&#x5E03;&#x5927;&#x5C0F;</span></span><br><span class="line"><span class="keyword">var</span> width = <span class="number">400</span>,</span><br><span class="line">height = <span class="number">400</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x753B;&#x5E03;&#x56DB;&#x4E2A;&#x65B9;&#x5411;&#x4E0A;&#x7684;&#x7559;&#x767D;</span></span><br><span class="line"><span class="keyword">var</span> margin = {</span><br><span class="line">	<span class="attr">top</span>: <span class="number">20</span>,</span><br><span class="line">	<span class="attr">right</span>: <span class="number">30</span>,</span><br><span class="line">	<span class="attr">bottom</span>: <span class="number">20</span>,</span><br><span class="line">	<span class="attr">left</span>: <span class="number">30</span></span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> chart = d3.select(<span class="string">&apos;.chart&apos;</span>)</span><br><span class="line">.attr(<span class="string">&apos;width&apos;</span>, width)</span><br><span class="line">.attr(<span class="string">&apos;height&apos;</span>, height)</span><br><span class="line">.append(<span class="string">&apos;g&apos;</span>);</span><br></pre></td></tr></table></figure><h3 id="&#x5B9A;&#x4E49;&#x6BD4;&#x4F8B;&#x5C3A;"><a href="#&#x5B9A;&#x4E49;&#x6BD4;&#x4F8B;&#x5C3A;" class="headerlink" title="&#x5B9A;&#x4E49;&#x6BD4;&#x4F8B;&#x5C3A;"></a>&#x5B9A;&#x4E49;&#x6BD4;&#x4F8B;&#x5C3A;</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// define x,y point rule</span></span><br><span class="line"><span class="keyword">var</span> x = d3.scale.ordinal()</span><br><span class="line">.rangeRoundBands([<span class="number">0</span>, width - margin.left - margin.right]);</span><br><span class="line"><span class="keyword">var</span> y = d3.scale.linear()</span><br><span class="line">.range([height - margin.top - margin.bottom, <span class="number">0</span>]);</span><br></pre></td></tr></table></figure><h3 id="&#x6DFB;&#x52A0;&#x77E9;&#x5F62;&#x53CA;&#x6587;&#x5B57;"><a href="#&#x6DFB;&#x52A0;&#x77E9;&#x5F62;&#x53CA;&#x6587;&#x5B57;" class="headerlink" title="&#x6DFB;&#x52A0;&#x77E9;&#x5F62;&#x53CA;&#x6587;&#x5B57;"></a>&#x6DFB;&#x52A0;&#x77E9;&#x5F62;&#x53CA;&#x6587;&#x5B57;</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x77E9;&#x5F62;&#x4E4B;&#x95F4;&#x7684;&#x7A7A;&#x767D;</span></span><br><span class="line"><span class="keyword">var</span> barPadding = <span class="number">4</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span><br><span class="line">* &#x8FD9;&#x91CC;&#x7528;&#x5230;&#x4E86;d3&#x5F02;&#x6B65;&#x8BFB;&#x53D6;&#x6570;&#x636E;&#x7684;&#x63A5;&#x53E3;csv</span><br><span class="line">* chart.csv&#x7684;&#x6587;&#x4EF6;&#x5185;&#x5BB9;&#x5982;&#x4E0B;&#xFF1A;</span><br><span class="line">* name,value</span><br><span class="line">* Locke,4</span><br><span class="line">* Reyes,8</span><br><span class="line">* Ford,15</span><br><span class="line">* Jarrah,16</span><br><span class="line">* Shephard,23</span><br><span class="line">* Kwon,42</span><br><span class="line">*/</span></span><br><span class="line">d3.csv(<span class="string">&apos;data/chart.csv&apos;</span>, type, <span class="function"><span class="keyword">function</span>(<span class="params">err, data</span>)</span>{</span><br><span class="line">	x.domain(data.map(<span class="function"><span class="keyword">function</span>(<span class="params">d</span>)</span>{ <span class="keyword">return</span> d.name; }));</span><br><span class="line">	y.domain([<span class="number">0</span>, d3.max(data, <span class="function"><span class="keyword">function</span>(<span class="params">d</span>)</span>{</span><br><span class="line">		<span class="keyword">return</span> d.value;</span><br><span class="line">	})]);</span><br><span class="line"></span><br><span class="line">	<span class="comment">// append rect</span></span><br><span class="line">	chart.selectAll(<span class="string">&apos;.bar&apos;</span>)</span><br><span class="line">	.data(data)</span><br><span class="line">	.enter().append(<span class="string">&apos;rect&apos;</span>)</span><br><span class="line">	.attr(<span class="string">&apos;class&apos;</span>, <span class="string">&apos;bar&apos;</span>)</span><br><span class="line">	.attr(<span class="string">&apos;transform&apos;</span>, <span class="string">&apos;translate(&apos;</span> + margin.left + <span class="string">&apos;,&apos;</span> + margin.top + <span class="string">&apos;)&apos;</span>)</span><br><span class="line">	.attr(<span class="string">&apos;x&apos;</span>, <span class="function"><span class="keyword">function</span>(<span class="params">d</span>)</span>{ <span class="keyword">return</span> x(d.name) + barPadding / <span class="number">2</span>; })</span><br><span class="line">	.attr(<span class="string">&apos;y&apos;</span>, <span class="function"><span class="keyword">function</span>(<span class="params">d</span>)</span>{ <span class="keyword">return</span> y(d.value); })</span><br><span class="line">	.attr(<span class="string">&apos;height&apos;</span>, <span class="function"><span class="keyword">function</span>(<span class="params">d</span>)</span>{ <span class="keyword">return</span> height - margin.top - margin.bottom - y(d.value); })</span><br><span class="line">	.attr(<span class="string">&apos;width&apos;</span>, x.rangeBand() - barPadding);</span><br><span class="line"></span><br><span class="line">	<span class="comment">// append text</span></span><br><span class="line">	chart.selectAll(<span class="string">&apos;.text&apos;</span>)</span><br><span class="line">	.data(data)</span><br><span class="line">	.enter()</span><br><span class="line">	.append(<span class="string">&apos;text&apos;</span>)</span><br><span class="line">	.attr(<span class="string">&apos;class&apos;</span>, <span class="string">&apos;text&apos;</span>)</span><br><span class="line">	.attr(<span class="string">&apos;transform&apos;</span>, <span class="string">&apos;translate(&apos;</span> + margin.left + <span class="string">&apos;,&apos;</span> + margin.top + <span class="string">&apos;)&apos;</span>)</span><br><span class="line">	.attr(<span class="string">&apos;x&apos;</span>, <span class="function"><span class="keyword">function</span>(<span class="params">d</span>)</span>{</span><br><span class="line">		<span class="keyword">return</span> x(d.name) + barPadding / <span class="number">2</span>;</span><br><span class="line">	}).attr(<span class="string">&apos;y&apos;</span>, <span class="function"><span class="keyword">function</span>(<span class="params">d</span>)</span>{</span><br><span class="line">		<span class="keyword">return</span> y(d.value);</span><br><span class="line">	}).attr(<span class="string">&apos;dx&apos;</span>, <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{</span><br><span class="line">		<span class="keyword">return</span> (x.rangeBand() - barPadding) / <span class="number">2</span>;</span><br><span class="line">	}).attr(<span class="string">&apos;dy&apos;</span>, <span class="number">20</span>)</span><br><span class="line">	.text(<span class="function"><span class="keyword">function</span>(<span class="params">d</span>)</span>{</span><br><span class="line">		<span class="keyword">return</span> d.value;</span><br><span class="line">	});</span><br><span class="line">});</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">type</span>(<span class="params">d</span>)</span>{</span><br><span class="line">	d.value = +d.value;</span><br><span class="line">	<span class="keyword">return</span> d;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="&#x5B9A;&#x4E49;&#x5E76;&#x6DFB;&#x52A0;&#x5750;&#x6807;&#x8F74;"><a href="#&#x5B9A;&#x4E49;&#x5E76;&#x6DFB;&#x52A0;&#x5750;&#x6807;&#x8F74;" class="headerlink" title="&#x5B9A;&#x4E49;&#x5E76;&#x6DFB;&#x52A0;&#x5750;&#x6807;&#x8F74;"></a>&#x5B9A;&#x4E49;&#x5E76;&#x6DFB;&#x52A0;&#x5750;&#x6807;&#x8F74;</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// define axis</span></span><br><span class="line"><span class="keyword">var</span> xAxis = d3.svg.axis()</span><br><span class="line">.scale(x)</span><br><span class="line">.orient(<span class="string">&apos;bottom&apos;</span>);</span><br><span class="line"><span class="keyword">var</span> yAxis = d3.svg.axis()</span><br><span class="line">.scale(y)</span><br><span class="line">.orient(<span class="string">&apos;left&apos;</span>)</span><br><span class="line">.ticks(<span class="number">10</span>);	<span class="comment">//&#x663E;&#x793A;&#x7684;&#x523B;&#x5EA6;&#x503C;&#x4E2A;&#x6570;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// append x axis</span></span><br><span class="line">chart.append(<span class="string">&apos;g&apos;</span>)</span><br><span class="line">.attr(<span class="string">&apos;class&apos;</span>, <span class="string">&apos;x axis&apos;</span>)</span><br><span class="line">.attr(<span class="string">&apos;transform&apos;</span>, <span class="string">&apos;translate(&apos;</span> + margin.left + <span class="string">&apos;, &apos;</span> + (height - margin.bottom) + <span class="string">&apos;)&apos;</span>)</span><br><span class="line">.call(xAxis);</span><br><span class="line"></span><br><span class="line"><span class="comment">// append y axis</span></span><br><span class="line">chart.append(<span class="string">&apos;g&apos;</span>)</span><br><span class="line">.attr(<span class="string">&apos;class&apos;</span>, <span class="string">&apos;y axis&apos;</span>)</span><br><span class="line">.attr(<span class="string">&apos;transform&apos;</span>, <span class="string">&apos;translate(&apos;</span> + margin.left + <span class="string">&apos;,&apos;</span> + margin.top + <span class="string">&apos;)&apos;</span>)</span><br><span class="line">.call(yAxis)</span><br><span class="line">.append(<span class="string">&apos;text&apos;</span>)</span><br><span class="line">.attr(<span class="string">&apos;transform&apos;</span>, <span class="string">&apos;rotate(-90)&apos;</span>)</span><br><span class="line">.attr(<span class="string">&apos;y&apos;</span>, <span class="number">6</span>)</span><br><span class="line">.attr(<span class="string">&apos;dy&apos;</span>, <span class="string">&apos;.71em&apos;</span>)</span><br><span class="line">.style(<span class="string">&apos;text-anchor&apos;</span>, <span class="string">&apos;end&apos;</span>)</span><br><span class="line">.text(<span class="string">&apos;value&apos;</span>);</span><br></pre></td></tr></table></figure><blockquote><p>&#x53EF;&#x4EE5;&#x4ECE;<a href="https://github.com/brucewar/practice-in-D3" target="_blank" rel="external">https://github.com/brucewar/practice-in-D3</a>&#x83B7;&#x53D6;&#x793A;&#x4F8B;&#x4EE3;&#x7801;</p></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&amp;#x9996;&amp;#x5148;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5148;&amp;#x770B;&amp;#x4E00;&amp;#x4E0B;&amp;#x6700;&amp;#x7EC8;&amp;#x7684;&amp;#x67F1;&amp;#x72B6;&amp;#x56FE;&amp;#x6548;&amp;#x679C;&amp;
    
    </summary>
    
      <category term="D3.js" scheme="http://brucewar.cn/categories/D3-js/"/>
    
    
      <category term="D3" scheme="http://brucewar.cn/tags/D3/"/>
    
      <category term="柱状图" scheme="http://brucewar.cn/tags/%E6%9F%B1%E7%8A%B6%E5%9B%BE/"/>
    
  </entry>
  
  <entry>
    <title>D3.js（入门篇）</title>
    <link href="http://brucewar.cn/2016/10/24/D3.js-%E5%85%A5%E9%97%A8%E7%AF%87/"/>
    <id>http://brucewar.cn/2016/10/24/D3.js-入门篇/</id>
    <published>2016-10-24T08:26:58.000Z</published>
    <updated>2016-10-25T03:00:41.326Z</updated>
    
    <content type="html"><![CDATA[<h4 id="&#x7B80;&#x4ECB;"><a href="#&#x7B80;&#x4ECB;" class="headerlink" title="&#x7B80;&#x4ECB;"></a>&#x7B80;&#x4ECB;</h4><p>D3.js&#xFF08;&#x540E;&#x9762;&#x7B80;&#x79F0;D3&#xFF0C;&#x5B98;&#x65B9;&#x9996;&#x9875;<a href="https://d3js.org/" target="_blank" rel="external">https://d3js.org/</a>&#xFF09;&#x662F;&#x57FA;&#x4E8E;JavaScript&#x5F00;&#x53D1;&#x7684;&#x4E00;&#x5957;&#x7528;&#x4E8E;&#x6570;&#x636E;&#x53EF;&#x89C6;&#x5316;&#x5DE5;&#x5177;&#xFF0C;&#x9879;&#x76EE;&#x5F00;&#x6E90;&#x5728;GitHub&#xFF0C;&#x9879;&#x76EE;&#x6392;&#x540D;&#x9760;&#x524D;&#x3002;&#x5B83;&#x63D0;&#x4F9B;&#x4E86;&#x5F88;&#x591A;API&#xFF0C;&#x5982;DOM&#xFF08;<code>Document Object Model</code>&#xFF09;&#x7684;&#x4E00;&#x4E9B;&#x64CD;&#x4F5C;&#xFF0C;&#x7ED8;&#x5236;&#x56FE;&#x5F62;&#x7B49;&#x3002;&#x622A;&#x6B62;&#x672C;&#x6587;&#x53D1;&#x8868;&#x65F6;&#x95F4;&#xFF0C;D3&#x5DF2;&#x66F4;&#x65B0;&#x5230;v4&#xFF0C;v4&#x5728;v3&#x7684;&#x57FA;&#x7840;&#x4E0A;&#xFF0C;&#x6709;&#x4E86;&#x5F88;&#x5927;&#x7684;&#x6539;&#x53D8;&#xFF08;&#x56E0;&#x4E3A;v3&#x53EA;&#x652F;&#x6301;&#x901A;&#x8FC7;svg&#x548C;dom&#x6784;&#x56FE;&#xFF0C;&#x6240;&#x4EE5;v4&#x5728;v3&#x7684;&#x57FA;&#x7840;&#x4E0A;&#x589E;&#x52A0;&#x4E86;&#x5BF9;Canvas&#x7684;&#x652F;&#x6301;&#x4EE5;&#x53CA;API&#x7684;&#x4FEE;&#x6539;&#xFF09;,&#x672C;&#x6587;&#x4F7F;&#x7528;&#x7684;&#x7248;&#x672C;&#x4E3A;v3&#x7684;API&#x3002;</p><h4 id="Hello-World"><a href="#Hello-World" class="headerlink" title="Hello World"></a>Hello World</h4><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="meta-keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">		<span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;utf-8&quot;</span>&gt;</span></span><br><span class="line">		<span class="tag">&lt;<span class="name">title</span>&gt;</span>D3.js Hello World<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line">		<span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;https://d3js.org/d3.v3.min.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line">	<span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line">	<span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">		<span class="tag">&lt;<span class="name">p</span>&gt;</span>first text<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">		<span class="tag">&lt;<span class="name">p</span>&gt;</span>second text<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">		<span class="tag">&lt;<span class="name">p</span>&gt;</span>third text<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">		<span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="javascript"></span><br><span class="line">		<span class="keyword">var</span> p = d3.select(<span class="string">&apos;body&apos;</span>).selectAll(<span class="string">&apos;p&apos;</span>)</span><br><span class="line">		.attr(<span class="string">&apos;color&apos;</span>, <span class="string">&apos;red&apos;</span>)</span><br><span class="line">		.attr(<span class="string">&apos;font-size&apos;</span>, <span class="string">&apos;72px&apos;</span>)</span><br><span class="line">		.text(<span class="string">&apos;brucewar&apos;</span>);</span><br><span class="line">		</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line">	<span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><p>&#x4E0A;&#x9762;&#x4EE3;&#x7801;&#x5C55;&#x793A;&#x4E86;&#x57FA;&#x672C;&#x7684;DOM&#x64CD;&#x4F5C;&#xFF0C;&#x6709;&#x8FC7;jQuery&#x5F00;&#x53D1;&#x7ECF;&#x5386;&#x7684;&#x4EBA;&#x4F1A;&#x53D1;&#x73B0;&#x5176;&#x8BED;&#x6CD5;&#x548C;jQuery&#x5F88;&#x76F8;&#x4F3C;&#xFF0C;&#x4E3B;&#x8981;&#x662F;&#x4EE5;&#x4E0B;&#x4E24;&#x70B9;&#xFF1A;</p><ul><li>&#x652F;&#x6301;&#x5143;&#x7D20;&#x9009;&#x62E9;&#x5668;</li><li>&#x94FE;&#x5F0F;&#x8BED;&#x6CD5;&#x7ED3;&#x6784;</li></ul><h5 id="&#x63D2;&#x5165;&#x5143;&#x7D20;"><a href="#&#x63D2;&#x5165;&#x5143;&#x7D20;" class="headerlink" title="&#x63D2;&#x5165;&#x5143;&#x7D20;"></a>&#x63D2;&#x5165;&#x5143;&#x7D20;</h5><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x672B;&#x5C3E;&#x63D2;&#x5165;p&#x5143;&#x7D20;</span></span><br><span class="line">d3.select(<span class="string">&apos;body&apos;</span>).append(<span class="string">&apos;p&apos;</span>).text(<span class="string">&apos;append new prograph&apos;</span>);</span><br><span class="line"><span class="comment">// &#x5728;&#x7B2C;&#x4E00;&#x4E2A;p&#x5143;&#x7D20;&#x4E4B;&#x524D;&#x63D2;&#x5165;p</span></span><br><span class="line">d3.select(<span class="string">&apos;p&apos;</span>).insert(<span class="string">&apos;p&apos;</span>).text(<span class="string">&apos;insert new prograph&apos;</span>);</span><br></pre></td></tr></table></figure><h5 id="&#x5220;&#x9664;&#x5143;&#x7D20;"><a href="#&#x5220;&#x9664;&#x5143;&#x7D20;" class="headerlink" title="&#x5220;&#x9664;&#x5143;&#x7D20;"></a>&#x5220;&#x9664;&#x5143;&#x7D20;</h5><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">d3.select(<span class="string">&apos;p&apos;</span>).remove();</span><br></pre></td></tr></table></figure><h4 id="&#x6570;&#x636E;&#x7ED1;&#x5B9A;"><a href="#&#x6570;&#x636E;&#x7ED1;&#x5B9A;" class="headerlink" title="&#x6570;&#x636E;&#x7ED1;&#x5B9A;"></a>&#x6570;&#x636E;&#x7ED1;&#x5B9A;</h4><p>&#x5728;D3&#x4E2D;&#xFF0C;&#x9009;&#x62E9;&#x5668;&#x901A;&#x5E38;&#x548C;&#x6570;&#x636E;&#x7ED1;&#x5B9A;&#x4E00;&#x8D77;&#x4F7F;&#x7528;&#xFF0C;&#x8FD9;&#x91CC;&#x7684;<strong>&#x6570;&#x636E;&#x7ED1;&#x5B9A;</strong>&#x7684;&#x610F;&#x601D;&#x662F;&#x5C06;DOM&#x5143;&#x7D20;&#x4E0E;&#x6570;&#x636E;&#x8FDB;&#x884C;&#x7ED1;&#x5B9A;&#xFF0C;&#x5F53;&#x9700;&#x8981;&#x4F9D;&#x9760;&#x6570;&#x636E;&#x64CD;&#x4F5C;&#x5143;&#x7D20;&#x4F1A;&#x975E;&#x5E38;&#x65B9;&#x4FBF;&#x3002;<br></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> arr = [<span class="string">&apos;a&apos;</span>, <span class="string">&apos;b&apos;</span>, <span class="string">&apos;c&apos;</span>];</span><br><span class="line">p.data(arr).text(<span class="function"><span class="keyword">function</span>(<span class="params">d, i</span>)</span>{</span><br><span class="line">	<span class="comment">// d: &#x6570;&#x636E; i: &#x5143;&#x7D20;&#x7D22;&#x5F15;</span></span><br><span class="line">	<span class="keyword">return</span> d;</span><br><span class="line">});</span><br></pre></td></tr></table></figure><p></p><h4 id="&#x7ED8;&#x5236;&#x7B80;&#x5355;&#x7684;&#x6A2A;&#x5411;&#x67F1;&#x72B6;&#x56FE;"><a href="#&#x7ED8;&#x5236;&#x7B80;&#x5355;&#x7684;&#x6A2A;&#x5411;&#x67F1;&#x72B6;&#x56FE;" class="headerlink" title="&#x7ED8;&#x5236;&#x7B80;&#x5355;&#x7684;&#x6A2A;&#x5411;&#x67F1;&#x72B6;&#x56FE;"></a>&#x7ED8;&#x5236;&#x7B80;&#x5355;&#x7684;&#x6A2A;&#x5411;&#x67F1;&#x72B6;&#x56FE;</h4><ol><li><p>&#x6DFB;&#x52A0;svg&#x753B;&#x5E03;</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> width = <span class="number">300</span>;</span><br><span class="line"><span class="keyword">var</span> height = <span class="number">300</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> svg = d3.select(<span class="string">&apos;body&apos;</span>)</span><br><span class="line">.append(<span class="string">&apos;svg&apos;</span>)</span><br><span class="line">.attr(<span class="string">&apos;width&apos;</span>. width)</span><br><span class="line">.attr(<span class="string">&apos;height&apos;</span>, height);</span><br></pre></td></tr></table></figure></li><li><p>&#x7ED8;&#x5236;&#x77E9;&#x5F62;</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> data = [<span class="number">250</span>, <span class="number">210</span>, <span class="number">170</span>, <span class="number">130</span>, <span class="number">90</span>]; <span class="comment">// &#x8868;&#x793A;&#x77E9;&#x5F62;&#x7684;&#x5BBD;&#x5EA6;</span></span><br><span class="line"><span class="keyword">var</span> rectHeight = <span class="number">25</span>;</span><br><span class="line"></span><br><span class="line">svg.selectAll(<span class="string">&apos;rect&apos;</span>)</span><br><span class="line">.data(data)</span><br><span class="line">.enter()	<span class="comment">// &#x5F53;&#x5143;&#x7D20;&#x4E2A;&#x6570;&#x4E0D;&#x8DB3;&#x6570;&#x636E;&#x4E2A;&#x6570;&#x65F6;&#xFF0C;&#x81EA;&#x52A8;&#x8865;&#x5168;</span></span><br><span class="line">.append(<span class="string">&apos;rect&apos;</span>)</span><br><span class="line">.attr(<span class="string">&apos;x&apos;</span>, <span class="number">20</span>)</span><br><span class="line">.attr(<span class="string">&apos;y&apos;</span>, <span class="function"><span class="keyword">function</span>(<span class="params">d, i</span>)</span>{</span><br><span class="line">	<span class="keyword">return</span> i * rectHeight;</span><br><span class="line">})</span><br><span class="line">.attr(<span class="string">&apos;width&apos;</span>, <span class="function"><span class="keyword">function</span>(<span class="params">d</span>)</span>{</span><br><span class="line">	<span class="keyword">return</span> d;</span><br><span class="line">})</span><br><span class="line">.attr(<span class="string">&apos;height&apos;</span>, rectHeight - <span class="number">2</span>)</span><br><span class="line">.attr(<span class="string">&apos;fill&apos;</span>, <span class="string">&apos;steelblue&apos;</span>);</span><br></pre></td></tr></table></figure><p>&#x4ECE;&#x4E0A;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x53EF;&#x4EE5;&#x770B;&#x51FA;&#x5F53;<code>data</code>&#x4E2D;&#x7684;&#x6570;&#x636E;&#x5927;&#x4E8E;&#x753B;&#x5E03;&#x7684;&#x5BBD;&#x5EA6;&#x65F6;&#xFF0C;&#x7ED8;&#x5236;&#x7684;&#x77E9;&#x5F62;&#x4F1A;&#x8D85;&#x51FA;&#x753B;&#x5E03;&#xFF0C;&#x6240;&#x4EE5;&#x9700;&#x8981;&#x5F15;&#x5165;<em>&#x6BD4;&#x4F8B;&#x5C3A;</em>&#xFF08;Scale&#xFF09;&#x7684;&#x6982;&#x5FF5;&#x3002;&#x6BD4;&#x4F8B;&#x5C3A;&#x7684;&#x6982;&#x5FF5;&#x7C7B;&#x4F3C;&#x6570;&#x5B66;&#x4E2D;&#x7684;&#x4E00;&#x5143;&#x4E8C;&#x6B21;&#x51FD;&#x6570;&#xFF0C;&#x6709;x&#x548C;y&#x4E24;&#x4E2A;&#x672A;&#x77E5;&#x6570;&#xFF0C;&#x5F53;x&#x7684;&#x503C;&#x786E;&#x5B9A;&#x65F6;&#xFF0C;y&#x7684;&#x503C;&#x4E5F;&#x5C31;&#x786E;&#x5B9A;&#x4E86;&#xFF0C;x&#x8303;&#x56F4;&#x88AB;&#x79F0;&#x4E3A;&#x5B9A;&#x4E49;&#x57DF;&#xFF0C;y&#x7684;&#x8303;&#x56F4;&#x4E3A;&#x503C;&#x57DF;&#xFF0C;&#x5BF9;&#x5E94;&#x4E8E;D3&#x6BD4;&#x4F8B;&#x5C3A;&#x4E2D;&#x7684;domain&#x548C;range&#x3002;D3&#x4E3A;&#x6211;&#x4EEC;&#x63D0;&#x4F9B;&#x4E86;&#x5F88;&#x591A;&#x6BD4;&#x4F8B;&#x5C3A;&#xFF0C;&#x8FD9;&#x91CC;&#x4E3B;&#x8981;&#x8BB2;&#x8FD9;&#x91CC;&#x67F1;&#x72B6;&#x56FE;&#x6240;&#x8981;&#x4F7F;&#x7528;&#x7684;&#x7EBF;&#x6027;&#x6BD4;&#x4F8B;&#x5C3A;&#x3002;</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> min = d3.min(data);</span><br><span class="line"><span class="keyword">var</span> max = d3.max(data);</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> linear = d3.scale.linear()</span><br><span class="line">.domain([min, max])</span><br><span class="line">.range([<span class="number">0</span>, <span class="number">300</span>]);</span><br></pre></td></tr></table></figure></li><li><p>&#x7ED8;&#x5236;&#x5750;&#x6807;&#x8F74;</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//&#x6570;&#x636E;</span></span><br><span class="line"><span class="keyword">var</span> dataset = [ <span class="number">2.5</span> , <span class="number">2.1</span> , <span class="number">1.7</span> , <span class="number">1.3</span> , <span class="number">0.9</span> ];</span><br><span class="line"><span class="comment">//&#x5B9A;&#x4E49;&#x6BD4;&#x4F8B;&#x5C3A;</span></span><br><span class="line"><span class="keyword">var</span> linear = d3.scale.linear()</span><br><span class="line"> .domain([<span class="number">0</span>, d3.max(dataset)])</span><br><span class="line"> .range([<span class="number">0</span>, <span class="number">250</span>]);</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> axisX = d3.svg.axis()</span><br><span class="line"> .scale(linear)      <span class="comment">//&#x6307;&#x5B9A;&#x6BD4;&#x4F8B;&#x5C3A;</span></span><br><span class="line"> .orient(<span class="string">&quot;bottom&quot;</span>)   <span class="comment">//&#x6307;&#x5B9A;&#x523B;&#x5EA6;&#x7684;&#x65B9;&#x5411;</span></span><br><span class="line"> .ticks(<span class="number">7</span>);          <span class="comment">//&#x6307;&#x5B9A;&#x523B;&#x5EA6;&#x7684;&#x6570;&#x91CF;</span></span><br></pre></td></tr></table></figure><p>&#x5B9A;&#x4E49;&#x4E86;&#x5750;&#x6807;&#x8F74;&#x4E4B;&#x540E;&#xFF0C;&#x53EA;&#x8981;&#x5728;svg&#x4E2D;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A;&#x5206;&#x7EC4;&#x5143;&#x7D20;&#xFF0C;&#x518D;&#x5C06;&#x5750;&#x6807;&#x8F74;&#x7684;&#x5176;&#x4ED6;&#x5143;&#x7D20;&#x6DFB;&#x52A0;&#x5230;&#x5206;&#x7EC4;&#x5373;&#x53EF;&#x3002;</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">svg.append(<span class="string">&apos;g&apos;</span>)</span><br><span class="line">.attr(<span class="string">&apos;class&apos;</span>, <span class="string">&apos;axis&apos;</span>)</span><br><span class="line">.attr(<span class="string">&apos;transform&apos;</span>, <span class="string">&apos;translate(20, 130)&apos;</span>)</span><br><span class="line">.call(axisX);</span><br></pre></td></tr></table></figure><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/** &#x4FEE;&#x6539;&#x5750;&#x6807;&#x8F74;&#x6837;&#x5F0F; */</span></span><br><span class="line"><span class="selector-class">.axis</span> <span class="selector-tag">path</span>,</span><br><span class="line"><span class="selector-class">.axis</span> <span class="selector-tag">line</span>{</span><br><span class="line">	<span class="attribute">fill</span>: none;</span><br><span class="line">	<span class="attribute">stroke</span>: black;</span><br><span class="line">	<span class="attribute">shape-rendering</span>: crispEdges;</span><br><span class="line">}</span><br><span class="line"><span class="selector-class">.axis</span> <span class="selector-tag">text</span>{</span><br><span class="line">	<span class="attribute">font-family</span>: sans-serif;</span><br><span class="line">	<span class="attribute">font-size</span>: <span class="number">11px</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li></ol>]]></content>
    
    <summary type="html">
    
      &lt;h4 id=&quot;&amp;#x7B80;&amp;#x4ECB;&quot;&gt;&lt;a href=&quot;#&amp;#x7B80;&amp;#x4ECB;&quot; class=&quot;headerlink&quot; title=&quot;&amp;#x7B80;&amp;#x4ECB;&quot;&gt;&lt;/a&gt;&amp;#x7B80;&amp;#x4ECB;&lt;/h4&gt;&lt;p&gt;D3.js&amp;#xFF08;&amp;
    
    </summary>
    
      <category term="D3.js" scheme="http://brucewar.cn/categories/D3-js/"/>
    
    
      <category term="D3" scheme="http://brucewar.cn/tags/D3/"/>
    
      <category term="JavaScript" scheme="http://brucewar.cn/tags/JavaScript/"/>
    
  </entry>
  
  <entry>
    <title>答利器上的六个问题</title>
    <link href="http://brucewar.cn/2016/09/29/%E7%AD%94%E5%88%A9%E5%99%A8%E4%B8%8A%E7%9A%84%E5%85%AD%E4%B8%AA%E9%97%AE%E9%A2%98/"/>
    <id>http://brucewar.cn/2016/09/29/答利器上的六个问题/</id>
    <published>2016-09-29T08:18:27.000Z</published>
    <updated>2016-11-29T07:41:31.087Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://7pumxs.com1.z0.glb.clouddn.com/IMG_1186.JPG" alt="brucewar"></p><h3 id="&#x4ECB;&#x7ECD;&#x4E00;&#x4E0B;&#x4F60;&#x81EA;&#x5DF1;&#x548C;&#x6240;&#x505A;&#x7684;&#x5DE5;&#x4F5C;"><a href="#&#x4ECB;&#x7ECD;&#x4E00;&#x4E0B;&#x4F60;&#x81EA;&#x5DF1;&#x548C;&#x6240;&#x505A;&#x7684;&#x5DE5;&#x4F5C;" class="headerlink" title="&#x4ECB;&#x7ECD;&#x4E00;&#x4E0B;&#x4F60;&#x81EA;&#x5DF1;&#x548C;&#x6240;&#x505A;&#x7684;&#x5DE5;&#x4F5C;"></a>&#x4ECB;&#x7ECD;&#x4E00;&#x4E0B;&#x4F60;&#x81EA;&#x5DF1;&#x548C;&#x6240;&#x505A;&#x7684;&#x5DE5;&#x4F5C;</h3><p>&#x6211;&#x53EB;&#x738B;&#x91D1;&#x9F99;&#xFF0C;&#x662F;&#x4E00;&#x540D;&#x521D;&#x7EA7;&#xFF08;&#x6309;&#x7167;&#x5DE5;&#x4F5C;&#x5E74;&#x9650;&#x6765;&#x8BF4;&#x7684;&#x8BDD;&#xFF09;Web&#x524D;&#x7AEF;&#x5F00;&#x53D1;&#xFF0C;&#x4F46;&#x662F;&#x4EE5;&#x5F00;&#x53D1;&#x7ECF;&#x5386;&#x6765;&#x8BF4;&#xFF0C;&#x6211;&#x81F3;&#x5C11;&#x5E94;&#x8BE5;&#x7B97;&#x4E00;&#x540D;&#x5408;&#x683C;&#x7684;&#x524D;&#x7AEF;&#x653B;&#x57CE;&#x72EE;&#x3002;&#x76EE;&#x524D;&#x5728;&#x9014;&#x725B;&#x65C5;&#x6E38;&#x7F51;&#x5DE5;&#x4F5C;&#xFF08;&#x5DF2;&#x7ECF;&#x5BFB;&#x627E;&#x5230;&#x65B0;&#x7684;&#x8FFD;&#x6C42;&#xFF09;&#x3002;&#x8BFB;&#x4E66;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x63A5;&#x89E6;&#x7684;&#x4E1C;&#x897F;&#x6BD4;&#x8F83;&#x5C11;&#xFF0C;&#x5FC3;&#x91CC;&#x6240;&#x60F3;&#x552F;&#x6709;&#x5B66;&#x4E60;&#xFF0C;&#x6240;&#x4EE5;&#x4E5F;&#x5C31;&#x6CA1;&#x57F9;&#x517B;&#x4EFB;&#x4F55;&#x4E00;&#x6837;&#x5174;&#x8DA3;&#xFF0C;&#x5076;&#x5C14;&#x4F1A;&#x548C;&#x540C;&#x5B66;&#x4E00;&#x8D77;&#x8E22;&#x8E22;&#x7403;&#xFF1B;&#x5DE5;&#x4F5C;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x624D;&#x9010;&#x6E10;&#x57F9;&#x517B;&#x4E86;&#x4E00;&#x4E9B;&#x5174;&#x8DA3;&#x7231;&#x597D;&#xFF0C;&#x5982;&#x8DF3;&#x821E;&#x3001;&#x5531;&#x6B4C;&#x7B49;&#xFF0C;&#x8DF3;&#x821E;&#x662F;&#x4ECA;&#x5E74;&#x624D;&#x57F9;&#x517B;&#x8D77;&#x6765;&#x7684;&#x4E00;&#x4E2A;&#x5174;&#x8DA3;&#xFF0C;&#x4F46;&#x662F;&#x56E0;&#x4E3A;&#x5DE5;&#x4F5C;&#x7684;&#x5173;&#x7CFB;&#xFF0C;&#x57FA;&#x672C;&#x6CA1;&#x4EC0;&#x4E48;&#x65F6;&#x95F4;&#x7EC3;&#x821E;&#xFF0C;&#x6240;&#x4EE5;&#x8DF3;&#x7684;&#x975E;&#x5E38;&#x975E;&#x5E38;&#x4E00;&#x822C;&#x3002;15&#x5E74;&#x7814;&#x7A76;&#x751F;&#x6BD5;&#x4E1A;&#x540E;&#xFF0C;&#x5DE5;&#x4F5C;&#x4E5F;&#x6709;&#x4E00;&#x5E74;&#x534A;&#x4E86;&#xFF0C;&#x800C;&#x4E14;&#x516C;&#x53F8;&#x662F;&#x4E1A;&#x52A1;&#x9A71;&#x52A8;&#x5F00;&#x53D1;&#xFF0C;&#x6240;&#x4EE5;&#x4EE3;&#x7801;&#x4E5F;&#x5199;&#x4E86;&#x4E0D;&#x5C11;&#xFF0C;&#x53EF;&#x662F;&#x81EA;&#x8EAB;&#x80FD;&#x529B;&#x7684;&#x63D0;&#x5347;&#x5374;&#x6CA1;&#x770B;&#x51FA;&#x6765;&#x3002;</p><h3 id="&#x4F60;&#x90FD;&#x5728;&#x4F7F;&#x7528;&#x54EA;&#x4E9B;&#x786C;&#x4EF6;"><a href="#&#x4F60;&#x90FD;&#x5728;&#x4F7F;&#x7528;&#x54EA;&#x4E9B;&#x786C;&#x4EF6;" class="headerlink" title="&#x4F60;&#x90FD;&#x5728;&#x4F7F;&#x7528;&#x54EA;&#x4E9B;&#x786C;&#x4EF6;"></a>&#x4F60;&#x90FD;&#x5728;&#x4F7F;&#x7528;&#x54EA;&#x4E9B;&#x786C;&#x4EF6;</h3><p><img src="http://7pumxs.com1.z0.glb.clouddn.com/keycool.jpg" alt="keycool&#x7EA2;&#x8F74;"></p><p>&#x8FD9;&#x6B3E;&#x673A;&#x68B0;&#x952E;&#x76D8;&#x662F;&#x5DE5;&#x4F5C;&#x6CA1;&#x591A;&#x4E45;&#x4E4B;&#x540E;&#x4E70;&#x7684;&#x3002;&#x8BDD;&#x8BF4;&#xFF0C;&#x5F53;&#x65F6;&#x770B;&#x5230;&#x540C;&#x7EC4;&#x7684;&#x4E00;&#x4F4D;&#x8001;&#x7A0B;&#x5E8F;&#x5458;&#xFF08;&#x7B80;&#x79F0;&#x658C;&#x54E5;&#xFF0C;&#x540E;&#x6765;&#x4ED6;&#x4EEC;&#x7EC4;&#x4ECE;&#x6211;&#x4EEC;&#x90E8;&#x95E8;&#x5206;&#x51FA;&#x53BB;&#x5566;&#xFF09;&#x7528;&#x7684;&#x673A;&#x68B0;&#x952E;&#x76D8;&#xFF0C;&#x9ED1;&#x8272;&#x952E;&#x5E3D;&#x914D;&#x4E0A;&#x5F69;&#x8679;&#x952E;&#x5E3D;&#xFF0C;&#x89C9;&#x5F97;&#x5F88;&#x597D;&#x770B;&#xFF0C;&#x6240;&#x4EE5;&#x4E00;&#x65F6;&#x51B2;&#x52A8;&#x60F3;&#x4E70;&#x4E00;&#x628A;&#x673A;&#x68B0;&#x952E;&#x76D8;&#x3002;</p><blockquote><p>&#x505A;&#x4EC0;&#x4E48;&#x4E8B;&#x90FD;&#x8981;&#x8FC7;&#x4E00;&#x4E0B;&#x8111;&#x5B50;</p></blockquote><p>&#x4E0A;&#x9762;&#x8FD9;&#x53E5;&#x8BDD;&#xFF0C;&#x5370;&#x8C61;&#x5F88;&#x6DF1;&#x523B;&#xFF0C;&#x56E0;&#x4E3A;&#x6211;&#x5BF9;&#x673A;&#x68B0;&#x952E;&#x76D8;&#x7684;&#x77E5;&#x8BC6;&#x4E00;&#x7247;&#x7A7A;&#x767D;&#xFF0C;&#x6240;&#x4EE5;&#x5FC5;&#x987B;&#x901A;&#x8FC7;&#x5404;&#x65B9;&#x9762;&#x7684;&#x4E86;&#x89E3;&#xFF0C;&#x9996;&#x5148;&#x4ECE;&#x767E;&#x5EA6;&#x767E;&#x79D1;&#x8BCD;&#x6761;<a href="http://baike.baidu.com/link?url=sKWDdw44eHxUdTb40AbNYLSzOgKJx7xB-FN4uucHCr_FvNreuWYWlgjwDCULDpM4hje9YDkS_8jZwazXiRJl3O-nJ1AaP_pZDoFOw_X4uBOVoSoHaFHOI5pV2SWOq7hn" target="_blank" rel="external">&#x673A;&#x68B0;&#x952E;&#x76D8;</a>&#x5B66;&#x4E60;&#x4E86;&#x57FA;&#x672C;&#x7684;&#x77E5;&#x8BC6;&#xFF0C;&#x7136;&#x540E;&#x53BB;&#x95EE;&#x7B54;&#x7F51;&#x7AD9;&#xFF08;&#x77E5;&#x4E4E;&#xFF09;&#x5173;&#x6CE8;&#x4E86;&#x8BDD;&#x9898;<em>&#x673A;&#x68B0;&#x952E;&#x76D8;</em>&#xFF0C;&#x53D1;&#x73B0;&#x6B64;&#x8BDD;&#x9898;&#x4E0B;&#xFF0C;&#x6709;&#x5F88;&#x591A;&#x95EE;&#x9898;&#x662F;&#x201C;&#x7A0B;&#x5E8F;&#x5458;&#x7537;&#x670B;&#x53CB;&#x751F;&#x65E5;&#xFF0C;&#x60F3;&#x9001;&#x673A;&#x68B0;&#x952E;&#x76D8;&#xFF0C;&#x6709;&#x63A8;&#x8350;&#x7684;&#x5417;&#xFF1F;&#x201D;&#x3002;&#x989D;&#xFF01;&#xFF01;&#xFF01;&#x88AB;&#x5404;&#x79CD;&#x8650;&#xFF0C;&#x5FC3;&#x60F3;&#x4E3A;&#x5565;&#x6CA1;&#x6709;&#x59B9;&#x5B50;&#x9001;&#x6211;&#x3002;&#x4E0D;&#x8FC7;&#xFF0C;&#x8FD8;&#x662F;&#x6709;&#x5F88;&#x591A;&#x4EBA;&#x63A8;&#x8350;&#x4E86;&#x4E0D;&#x9519;&#x7684;&#x673A;&#x68B0;&#x952E;&#x76D8;&#x3002;&#x4E2A;&#x4EBA;&#x611F;&#x89C9;&#x5F88;&#x559C;&#x6B22;<strong>Filco&#x5723;&#x624B;&#x4E8C;&#x4EE3;</strong>&#xFF0C;&#x4F46;&#x662F;&#x8FEB;&#x4E8E;&#x7ECF;&#x6D4E;&#x80FD;&#x529B;&#x6709;&#x9650;&#xFF0C;&#x6700;&#x7EC8;&#x8FD8;&#x662F;&#x4E70;&#x4E86;&#x4E00;&#x628A;&#x56FD;&#x4EA7;&#x7684;&#x7EA2;&#x8F74;&#xFF0C;&#x7528;&#x8D77;&#x6765;&#x771F;&#x7684;&#x5F88;&#x8212;&#x670D;&#xFF08;PS&#xFF1A;&#x597D;&#x591A;&#x540C;&#x4E8B;&#x8BD5;&#x73A9;&#x540E;&#x90FD;&#x89C9;&#x5F97;&#x4E0D;&#x9519;&#xFF09;&#x3002;</p><p><img src="http://7pumxs.com1.z0.glb.clouddn.com/akg.jpg" alt="AKG K450"></p><blockquote><p>&#x821E;&#x8E48;&#x914D;&#x4E0A;&#x97F3;&#x4E50;&#x4E4B;&#x540E;&#xFF0C;&#x624D;&#x6709;&#x4E86;&#x7075;&#x9B42;</p></blockquote><p>&#x5982;&#x679C;&#x4E00;&#x4E2A;&#x821E;&#x8005;&#x5728;&#x6CA1;&#x6709;&#x80CC;&#x666F;&#x4E50;&#x7684;&#x73AF;&#x5883;&#x4E0B;&#x821E;&#x52A8;&#x81EA;&#x5DF1;&#x7684;&#x8EAB;&#x4F53;&#xFF0C;&#x975E;&#x4E13;&#x4E1A;&#x89C2;&#x8005;&#x53EF;&#x80FD;&#x4F1A;&#x89C9;&#x5F97;&#x770B;&#x4E0D;&#x61C2;&#xFF0C;&#x4E13;&#x4E1A;&#x7684;&#x4EBA;&#x4E5F;&#x53EA;&#x80FD;&#x4ECE;&#x4E13;&#x4E1A;&#x6280;&#x5DE7;&#x4E0A;&#x52A0;&#x4EE5;&#x8BC4;&#x4EF7;&#x3002;&#x6709;&#x4E86;&#x97F3;&#x4E50;&#x540E;&#xFF0C;&#x821E;&#x8005;&#x4F1A;&#x968F;&#x7740;&#x97F3;&#x4E50;&#x7684;&#x8F7B;&#x91CD;&#x7F13;&#x6025;&#x8868;&#x8FBE;&#x81EA;&#x5DF1;&#x7684;&#x60C5;&#x7EEA;&#xFF0C;&#x8FD9;&#x624D;&#x6709;&#x4E86;&#x821E;&#x9B42;&#x3002;<br>&#x7A0B;&#x5E8F;&#x5458;&#x5199;&#x4EE3;&#x7801;&#x65F6;&#x7684;&#x624B;&#x6307;&#x5C31;&#x5982;&#x540C;&#x8FD9;&#x821E;&#x8005;&#xFF0C;&#x5728;&#x952E;&#x76D8;&#x8FD9;&#x4E2A;&#x821E;&#x53F0;&#x4E0A;&#x8868;&#x6F14;&#xFF0C;&#x914D;&#x5408;&#x97F3;&#x4E50;&#x7684;&#x8282;&#x594F;&#xFF0C;&#x7A0B;&#x5E8F;&#x4FBF;&#x6709;&#x4E86;&#x5B83;&#x7684;&#x7075;&#x9B42;&#xFF08;PS&#xFF1A;&#x6211;&#x5199;&#x7A0B;&#x5E8F;&#x65F6;&#x542C;&#x7684;&#x6B4C;&#x5355;<a href="http://music.163.com/#/m/playlist?id=159311553&amp;userid=85782250" target="_blank" rel="external">dance</a>&#xFF09;&#x3002;AKG&#x7684;&#x8FD9;&#x4E2A;&#x7ECF;&#x5178;&#x6B3E;&#x7684;&#x8033;&#x673A;&#x662F;<strong>&#x660A;&#x54E5;</strong>&#x63A8;&#x8350;&#x7684;&#xFF0C;&#x6027;&#x4EF7;&#x6BD4;&#x975E;&#x5E38;&#x9AD8;&#xFF08;&#x975E;&#x5E7F;&#x544A;&#xFF09;&#x3002;</p><p><img src="http://7pumxs.com1.z0.glb.clouddn.com/samsung.jpg" alt="&#x4E09;&#x661F;S24D360HL"></p><p>&#x663E;&#x793A;&#x5668;&#x6CA1;&#x4EC0;&#x4E48;&#x53EF;&#x4EE5;&#x8BF4;&#x7684;&#xFF0C;&#x505A;&#x4E3A;Web&#x524D;&#x7AEF;&#x5F00;&#x53D1;&#xFF0C;&#x4E24;&#x4E2A;&#x663E;&#x793A;&#x5668;&#x662F;&#x5FC5;&#x5907;&#x7684;&#xFF0C;&#x4E00;&#x4E2A;&#x653E;IDE&#xFF0C;&#x4E00;&#x4E2A;&#x653E;&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x5BF9;&#x4E8E;&#x5F00;&#x53D1;&#x6548;&#x7387;&#x6709;&#x975E;&#x5E38;&#x5927;&#x7684;&#x63D0;&#x5347;&#x3002;</p><h3 id="&#x8F6F;&#x4EF6;&#x5462;"><a href="#&#x8F6F;&#x4EF6;&#x5462;" class="headerlink" title="&#x8F6F;&#x4EF6;&#x5462;"></a>&#x8F6F;&#x4EF6;&#x5462;</h3><p>&#x4F5C;&#x4E3A;Linux&#x7684;&#x62E5;&#x62A4;&#x8005;&#xFF0C;&#x5FC5;&#x987B;&#x5411;&#x5927;&#x5BB6;&#x63A8;&#x8350;Vim&#x7F16;&#x8F91;&#x5668;&#xFF0C;&#x6211;&#x89C9;&#x5F97;&#x5B83;&#x80FD;&#x8BA9;&#x4F60;&#x8131;&#x79BB;&#x4E0D;&#x5FC5;&#x8981;&#x7684;&#x9F20;&#x6807;&#x64CD;&#x4F5C;&#xFF0C;&#x5927;&#x5927;&#x63D0;&#x9AD8;&#x5DE5;&#x4F5C;&#x6548;&#x7387;&#xFF0C;&#x5F88;&#x60ED;&#x6127;&#xFF0C;Vim&#x65B0;&#x624B;&#x9636;&#x6BB5;&#xFF0C;&#x7528;&#x7684;&#x4E0D;&#x662F;&#x5F88;&#x719F;&#xFF0C;&#x53EA;&#x4E86;&#x89E3;&#x4E00;&#x4E9B;&#x7B80;&#x5355;&#x7684;&#x7F16;&#x8F91;&#x547D;&#x4EE4;&#x3002;&#x987A;&#x5E26;&#x5B89;&#x5229;&#x4E00;&#x6B3E;Chrome&#x63D2;&#x4EF6;<a href="https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb" target="_blank" rel="external">Vimium</a>&#xFF08;&#x7528;Vim&#x547D;&#x4EE4;&#x64CD;&#x4F5C;&#x6D4F;&#x89C8;&#x5668;&#x73AF;&#x5883;&#xFF09;&#x3002;</p><h3 id="&#x4F60;&#x6700;&#x7406;&#x60F3;&#x7684;&#x5DE5;&#x4F5C;&#x73AF;&#x5883;&#x662F;&#x4EC0;&#x4E48;"><a href="#&#x4F60;&#x6700;&#x7406;&#x60F3;&#x7684;&#x5DE5;&#x4F5C;&#x73AF;&#x5883;&#x662F;&#x4EC0;&#x4E48;" class="headerlink" title="&#x4F60;&#x6700;&#x7406;&#x60F3;&#x7684;&#x5DE5;&#x4F5C;&#x73AF;&#x5883;&#x662F;&#x4EC0;&#x4E48;"></a>&#x4F60;&#x6700;&#x7406;&#x60F3;&#x7684;&#x5DE5;&#x4F5C;&#x73AF;&#x5883;&#x662F;&#x4EC0;&#x4E48;</h3><p>&#x5927;&#x684C;&#x5B50;&#xFF08;&#x5706;&#x5F27;&#x578B;&#xFF09;&#xFF0C;&#x4E24;&#x53F0;&#x663E;&#x793A;&#x5668;&#xFF0C;&#x4E00;&#x53F0;&#x7B14;&#x8BB0;&#x672C;&#xFF0C;&#x7F51;&#x7EDC;&#x4E00;&#x5B9A;&#x8981;&#x597D;&#xFF08;&#x81EA;&#x5E26;&#x7FFB;&#x5899;&#xFF0C;Youtube 1080P&#x4E0D;&#x5361;&#x987F;&#xFF09;&#xFF0C;&#x7EFF;&#x690D;&#x56F4;&#x7ED5;&#xFF0C;&#x5468;&#x56F4;&#x5750;&#x7740;&#x8C26;&#x865A;&#x8010;&#x5FC3;&#x7684;&#x725B;&#x4EBA;&#xFF0C;&#x5927;&#x5BB6;&#x4E00;&#x8D77;&#x5E72;&#x7740;&#x4E00;&#x4EF6;&#x6709;&#x610F;&#x4E49;&#xFF08;&#x6539;&#x53D8;&#x4E16;&#x754C;&#xFF0C;&#x54C8;&#x54C8;&#xFF0C;&#x8FD9;&#x4E2A;&#x592A;&#x5927;&#xFF09;&#x7684;&#x4E8B;&#x3002;</p><h3 id="&#x4F60;&#x5E73;&#x65F6;&#x83B7;&#x5F97;&#x5DE5;&#x4F5C;&#x7075;&#x611F;&#x7684;&#x65B9;&#x5F0F;&#x6709;&#x54EA;&#x4E9B;"><a href="#&#x4F60;&#x5E73;&#x65F6;&#x83B7;&#x5F97;&#x5DE5;&#x4F5C;&#x7075;&#x611F;&#x7684;&#x65B9;&#x5F0F;&#x6709;&#x54EA;&#x4E9B;" class="headerlink" title="&#x4F60;&#x5E73;&#x65F6;&#x83B7;&#x5F97;&#x5DE5;&#x4F5C;&#x7075;&#x611F;&#x7684;&#x65B9;&#x5F0F;&#x6709;&#x54EA;&#x4E9B;"></a>&#x4F60;&#x5E73;&#x65F6;&#x83B7;&#x5F97;&#x5DE5;&#x4F5C;&#x7075;&#x611F;&#x7684;&#x65B9;&#x5F0F;&#x6709;&#x54EA;&#x4E9B;</h3><p>&#x901B;&#x5404;&#x79CD;&#x7F51;&#x7AD9;&#xFF0C;&#x77E5;&#x4E4E;&#xFF0C;&#x7B80;&#x4E66;&#x7B49;&#xFF1B;&#x73A9;&#x5404;&#x79CD;&#x6D41;&#x884C;&#x7684;APP&#xFF0C;&#x5FAE;&#x4FE1;&#xFF0C;Instagram&#x7B49;&#xFF0C;&#x4EFB;&#x4F55;&#x4E00;&#x4E2A;&#x597D;&#x7684;&#x4EA7;&#x54C1;&#xFF0C;&#x81EA;&#x6709;&#x5B83;&#x7684;&#x72EC;&#x7279;&#x7684;&#x4E00;&#x9762;&#xFF0C;&#x6211;&#x89C9;&#x5F97;&#x4F5C;&#x4E3A;&#x524D;&#x7AEF;&#x5F00;&#x53D1;&#xFF0C;&#x4E5F;&#x9700;&#x8981;&#x6709;&#x4E00;&#x4E9B;&#x8BBE;&#x8BA1;&#x7684;&#x60F3;&#x6CD5;&#xFF0C;&#x6211;&#x5F00;&#x53D1;&#x8FC7;&#x7684;&#x9879;&#x76EE;&#x4E2D;&#x90FD;&#x66FE;&#x501F;&#x9274;&#x8FC7;&#x8FD9;&#x4E9B;&#x5E94;&#x7528;&#x3002;</p><h3 id="&#x63A8;&#x8350;&#x4E00;&#x4EF6;&#x751F;&#x6D3B;&#x4E2D;&#x7684;&#x5229;&#x5668;&#x7ED9;&#x5927;&#x5BB6;"><a href="#&#x63A8;&#x8350;&#x4E00;&#x4EF6;&#x751F;&#x6D3B;&#x4E2D;&#x7684;&#x5229;&#x5668;&#x7ED9;&#x5927;&#x5BB6;" class="headerlink" title="&#x63A8;&#x8350;&#x4E00;&#x4EF6;&#x751F;&#x6D3B;&#x4E2D;&#x7684;&#x5229;&#x5668;&#x7ED9;&#x5927;&#x5BB6;"></a>&#x63A8;&#x8350;&#x4E00;&#x4EF6;&#x751F;&#x6D3B;&#x4E2D;&#x7684;&#x5229;&#x5668;&#x7ED9;&#x5927;&#x5BB6;</h3><p>VPN&#xFF0C;&#x5F3A;&#x70C8;&#x63A8;&#x8350;&#x6211;&#x7528;&#x7684;&#x8FD9;&#x6B3E;&#xFF0C;&#x4F46;&#x662F;&#x8FD9;&#x91CC;&#x4E0D;&#x65B9;&#x4FBF;&#x8D34;&#x94FE;&#x63A5;&#xFF0C;&#x6709;&#x9700;&#x8981;&#x7684;&#x79C1;&#x4FE1;&#x6211;&#x3002;</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://7pumxs.com1.z0.glb.clouddn.com/IMG_1186.JPG&quot; alt=&quot;brucewar&quot;&gt;&lt;/p&gt;&lt;h3 id=&quot;&amp;#x4ECB;&amp;#x7ECD;&amp;#x4E00;&amp;#x4E0B;&amp;#x4F60;&amp;#x81EA;
    
    </summary>
    
      <category term="随笔" scheme="http://brucewar.cn/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
      <category term="利器" scheme="http://brucewar.cn/tags/%E5%88%A9%E5%99%A8/"/>
    
  </entry>
  
</feed>
