<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>空谷幽兰</title>
  
  <subtitle>小隐于野，大隐于市，神隐于网络</subtitle>
  <link href="//atom.xml" rel="self"/>
  
  <link href="https://blog.whyoop.com/"/>
  <updated>2019-06-24T11:57:37.840Z</updated>
  <id>https://blog.whyoop.com/</id>
  
  <author>
    <name>cnwhy</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>一个 javascript 的 Base64转换库 @cnwhy/base64</title>
    <link href="https://blog.whyoop.com/2019/06/03/new-base64/"/>
    <id>https://blog.whyoop.com/2019/06/03/new-base64/</id>
    <published>2019-06-03T03:05:54.000Z</published>
    <updated>2019-06-24T11:57:37.840Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>项目要用到 Base64, 在网上找了好几个用着都者不是特别爽, 索性写一个.</p></blockquote><a id="more"></a><h2 id="项目地址"><a href="#项目地址" class="headerlink" title="项目地址"></a>项目地址</h2><p>GitHub: <a href="https://github.com/cnwhy/Base64.js" target="_blank" rel="noopener">cnwhy/Base64.js</a></p><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><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">npm i @cnwhy/base64</span><br></pre></td></tr></table></figure><h2 id="为何重复造轮子"><a href="#为何重复造轮子" class="headerlink" title="为何重复造轮子?"></a>为何重复造轮子?</h2><ol><li><code>btoa</code> , <code>atob</code> 只支持 <code>Latin1</code> 字符.</li><li><code>Base64</code>编/解码本该与字符串无关, 但几乎所有 Base64 的<code>decode</code>方法都输出字符串, 限制了使用场景.<blockquote><p>本库的 <code>decode()</code> 方法单纯将 Base64 字符串解析为<code>Uint8Array</code>; 但重写了返回字节数组的<code>toString()</code>方法, 默认以<code>UTF-8</code>编码解析为字符串(类似 <code>nodejs</code> 中 <code>buffer</code> 对像的<code>toString()</code>).</p></blockquote></li><li><p>++常用的的 Base64 编码库处理 javascript 字符串时会<strong>主动</strong>替换错误(空)编码字符, 导致解码的数据与原数据不一至.++<br><strong>比如用 <code>nodejs</code> 中的 <code>Buffer</code>:</strong></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"><span class="keyword">var</span> s = <span class="string">'\ud800'</span>; <span class="comment">//U+d800 属于代理区, 是一个空码, 如果从utf16来看,是一个4字节字符的一半.</span></span><br><span class="line"><span class="keyword">var</span> b64 = Buffer.from(s).toString(<span class="string">'base64'</span>);</span><br><span class="line"><span class="keyword">var</span> _s = Buffer.from(b64, <span class="string">'base64'</span>).toString();</span><br><span class="line"><span class="built_in">console</span>.log(s == _s); <span class="comment">//false</span></span><br></pre></td></tr></table></figure><blockquote><p>本库对于字符串的转换默认用<code>UTF-8</code>编码, 但无视无效符(解码按同一规则), 保证 js 的字符串(<a href="https://zh.wikipedia.org/wiki/UTF-16#UTF-16%E8%88%87UCS-2%E7%9A%84%E9%97%9C%E4%BF%82" target="_blank" rel="noopener">UCS-2</a>)可以无损转换.</p></blockquote></li><li>其它 Base64 库 固定了 Base64 编码表, 与字符串的编码方式;<blockquote><p>本库抽象出 Base64 算法, 支持自定义的 编码表 和 字符串编码方式, 适应更多特殊场景;</p></blockquote></li><li>多数项目只需要 <code>encode</code> 或 <code>decode</code> , 而我又不想copy代码.<blockquote><p>本库有ES6风格模块文件, 利用 <code>webpack</code> 或 <code>rollup</code> 可打出最简包.</p></blockquote></li></ol><h2 id="兼容性"><a href="#兼容性" class="headerlink" title="兼容性"></a>兼容性</h2><p>nodejs , 浏览器通用;  </p><blockquote><p>不支持<code>ArrayBuffer</code>的环境将会用<code>Array</code>代替<code>Uint8Array</code>.</p></blockquote><h2 id="demo"><a href="#demo" class="headerlink" title="demo"></a>demo</h2><h3 id="字符串-编码-解码"><a href="#字符串-编码-解码" class="headerlink" title="字符串 编码,解码"></a>字符串 编码,解码</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; encode, decode &#125; <span class="keyword">from</span> <span class="string">'@cnwhy/base64'</span>;</span><br><span class="line"><span class="keyword">let</span> str = <span class="string">'中国\u&#123;10121&#125;美国'</span>; <span class="comment">//中国𐄡美国 注: 𐄡是一个4字节字符</span></span><br><span class="line"><span class="keyword">let</span> b64_str = encode(str);</span><br><span class="line"><span class="keyword">let</span> _str = decode(b64_str).toString();</span><br><span class="line"><span class="built_in">console</span>.log([str, b64_str, str == _str].join(<span class="string">'\n'</span>));</span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">中国𐄡美国</span></span><br><span class="line"><span class="comment">5Lit5Zu98JCEoee+juWbvQ==</span></span><br><span class="line"><span class="comment">true</span></span><br><span class="line"><span class="comment">*/</span></span><br></pre></td></tr></table></figure><h3 id="编码-Uint8Array-ArrayBuffer"><a href="#编码-Uint8Array-ArrayBuffer" class="headerlink" title="编码 Uint8Array ArrayBuffer"></a>编码 Uint8Array ArrayBuffer</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="keyword">import</span> &#123; encode, decode &#125; <span class="keyword">from</span> <span class="string">'@cnwhy/base64'</span>;</span><br><span class="line"><span class="keyword">let</span> arr = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>];</span><br><span class="line"><span class="keyword">let</span> bytes = <span class="keyword">new</span> <span class="built_in">Uint8Array</span>([<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]);</span><br><span class="line"><span class="keyword">let</span> buffer = Buffer.from([<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]);</span><br><span class="line">[arr,bytes,buffer,].forEach(<span class="function">(<span class="params">v</span>)=&gt;</span>&#123;</span><br><span class="line"><span class="keyword">let</span> b64 = encode(v);</span><br><span class="line"><span class="keyword">let</span> u8 = decode(b64);</span><br><span class="line"><span class="built_in">console</span>.log(<span class="built_in">Array</span>.from(v).toString());</span><br><span class="line"><span class="built_in">console</span>.log(b64.toString());</span><br><span class="line"><span class="built_in">console</span>.log(<span class="built_in">Array</span>.from(u8).toString());</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">'--'</span>);</span><br><span class="line">&#125;)</span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">1,2,3,4,5</span></span><br><span class="line"><span class="comment">AQIDBAU=</span></span><br><span class="line"><span class="comment">1,2,3,4,5</span></span><br><span class="line"><span class="comment">--</span></span><br><span class="line"><span class="comment">1,2,3,4,5</span></span><br><span class="line"><span class="comment">AQIDBAU=</span></span><br><span class="line"><span class="comment">1,2,3,4,5</span></span><br><span class="line"><span class="comment">--</span></span><br><span class="line"><span class="comment">1,2,3,4,5</span></span><br><span class="line"><span class="comment">AQIDBAU=</span></span><br><span class="line"><span class="comment">1,2,3,4,5</span></span><br><span class="line"><span class="comment">--</span></span><br><span class="line"><span class="comment">*/</span></span><br></pre></td></tr></table></figure><blockquote><p><code>decode</code> 函数始终 <code>Uint8Array</code> 对像,不支持 <code>Uint8Array</code> 的环境返回 <code>Array</code></p></blockquote><h3 id="自定义码表与字符串编码方式"><a href="#自定义码表与字符串编码方式" class="headerlink" title="自定义码表与字符串编码方式"></a>自定义码表与字符串编码方式</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></pre></td><td class="code"><pre><span class="line"><span class="comment">// 定义一个看起来乱码的 Base64 转换方法, 并且 字符串用 UTF16 编码;</span></span><br><span class="line"><span class="keyword">import</span> &#123; createEncode , createDecode &#125; <span class="keyword">from</span> <span class="string">'@cnwhy/base64'</span>;</span><br><span class="line"><span class="keyword">const</span> TABLE = <span class="string">'xQh&#125;s7*y~A|nkj4Bf%z1R,P+)mMS&#123;(&amp;EWCKegp6r!OX&lt;/LuY-l9^ZJ#cTU[vHda$'</span>; <span class="comment">// base64码表, 不重复的64个ascii字符</span></span><br><span class="line"><span class="keyword">const</span> PAD = <span class="string">'.'</span>; <span class="comment">// 补位符, 一个ascii字符</span></span><br><span class="line"><span class="keyword">const</span> Utf16Encode = <span class="function"><span class="keyword">function</span>(<span class="params">str</span>) </span>&#123;</span><br><span class="line"><span class="keyword">let</span> cods = str.split(<span class="string">''</span>).map(<span class="function"><span class="params">s</span> =&gt;</span> s.charCodeAt(<span class="number">0</span>));</span><br><span class="line"><span class="keyword">return</span> <span class="keyword">new</span> <span class="built_in">Uint8Array</span>(<span class="keyword">new</span> <span class="built_in">Uint16Array</span>(cods).buffer);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">const</span> Utf16Decode = <span class="function"><span class="keyword">function</span>(<span class="params">arr</span>) </span>&#123;</span><br><span class="line"><span class="keyword">let</span> u16 = <span class="built_in">Array</span>.from(<span class="keyword">new</span> <span class="built_in">Uint16Array</span>(arr.buffer));</span><br><span class="line"><span class="keyword">return</span> u16.map(<span class="function"><span class="params">c</span> =&gt;</span> <span class="built_in">String</span>.fromCharCode(c)).join(<span class="string">''</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//自定义base64 转换方法</span></span><br><span class="line"><span class="keyword">const</span> myEncode = createEncode(TABLE,PAD,Utf16Encode);</span><br><span class="line"><span class="keyword">const</span> myDecode = createDecode(TABLE,PAD,Utf16Decode);</span><br><span class="line"><span class="keyword">let</span> str = <span class="string">'中国\u&#123;10121&#125;美国'</span>;</span><br><span class="line"><span class="keyword">let</span> b64_str = myEncode(str);</span><br><span class="line"><span class="keyword">let</span> _str = myDecode(b64_str).toString();</span><br><span class="line"><span class="built_in">console</span>.log([str, b64_str, str == _str].join(<span class="string">'\n'</span>));</span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">中国𐄡美国</span></span><br><span class="line"><span class="comment">nRvd,W&#125;)~(#4E$JP</span></span><br><span class="line"><span class="comment">true</span></span><br><span class="line"><span class="comment">*/</span></span><br></pre></td></tr></table></figure><h2 id="API"><a href="#API" class="headerlink" title="API"></a>API</h2><figure class="highlight ts"><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></pre></td><td class="code"><pre><span class="line">Base64 = &#123;</span><br><span class="line">BASE64_TABLE: <span class="string">"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"</span>;</span><br><span class="line">BASE64_URL_TABLE: <span class="string">"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"</span>;</span><br><span class="line">PAD: <span class="string">"="</span>;</span><br><span class="line"><span class="comment">// UTF8 编码 解码; 可做为 strEncode strDecode 参数;</span></span><br><span class="line">utf8Encode(str:<span class="built_in">string</span>):<span class="built_in">Uint8Array</span>|<span class="built_in">number</span>[];</span><br><span class="line">utf8Decode(utf8arr:<span class="built_in">Uint8Array</span>|<span class="built_in">number</span>[]):<span class="built_in">string</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//Base64 编码 解码</span></span><br><span class="line">encode(input:<span class="built_in">string</span>|<span class="built_in">ArrayBuffer</span>|<span class="built_in">Uint8Array</span>|<span class="built_in">number</span>[]):<span class="built_in">string</span>;</span><br><span class="line">decode(base64str: <span class="built_in">string</span>) =&gt; <span class="built_in">number</span>[]|<span class="built_in">Uint8Array</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//适用于URL的Base64 编码 解码( "_" "-" 替换 "/" "+");</span></span><br><span class="line">encodeURL(input:<span class="built_in">string</span>|<span class="built_in">ArrayBuffer</span>|<span class="built_in">Uint8Array</span>|<span class="built_in">number</span>[]):<span class="built_in">string</span>;</span><br><span class="line">decodeURL(base64str: <span class="built_in">string</span>) =&gt; <span class="built_in">number</span>[]|<span class="built_in">Uint8Array</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//创建自定义Base64 encode , decode 函数</span></span><br><span class="line">createEncode(strEncode: <span class="built_in">Function</span>): <span class="function">(<span class="params">input: <span class="built_in">any</span></span>) =&gt;</span> <span class="built_in">string</span>;</span><br><span class="line">createEncode(table?: <span class="built_in">string</span>[] | <span class="built_in">string</span>, pad?: <span class="built_in">string</span>, strEncode?: <span class="built_in">Function</span>): <span class="function">(<span class="params">input: <span class="built_in">any</span></span>) =&gt;</span> <span class="built_in">string</span>;</span><br><span class="line">createDecode(strDecode: <span class="built_in">Function</span>): <span class="function">(<span class="params">base64str: <span class="built_in">string</span></span>) =&gt;</span> <span class="built_in">Uint8Array</span> | <span class="built_in">number</span>[];</span><br><span class="line">createDecode(table?: <span class="built_in">string</span>[] | <span class="built_in">string</span>, pad?: <span class="built_in">string</span>, strDecode?: <span class="built_in">Function</span>): <span class="function">(<span class="params">base64str: <span class="built_in">string</span></span>) =&gt;</span> <span class="built_in">Uint8Array</span> | <span class="built_in">number</span>[];</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;项目要用到 Base64, 在网上找了好几个用着都者不是特别爽, 索性写一个.&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="My Projects" scheme="https://blog.whyoop.com/categories/My-Projects/"/>
    
      <category term="重造轮子" scheme="https://blog.whyoop.com/categories/My-Projects/%E9%87%8D%E9%80%A0%E8%BD%AE%E5%AD%90/"/>
    
    
      <category term="javascript" scheme="https://blog.whyoop.com/tags/javascript/"/>
    
      <category term="base64" scheme="https://blog.whyoop.com/tags/base64/"/>
    
  </entry>
  
  <entry>
    <title>一行代码解决 termtosvg录制的SVG 对中文显示不友好的问题</title>
    <link href="https://blog.whyoop.com/2019/03/12/termtosvg-fix/"/>
    <id>https://blog.whyoop.com/2019/03/12/termtosvg-fix/</id>
    <published>2019-03-12T09:30:52.000Z</published>
    <updated>2019-06-24T11:57:52.553Z</updated>
    
    <content type="html"><![CDATA[<p><a href="https://github.com/nbedos/termtosvg" target="_blank" rel="noopener">termtosvg</a> 是一个可以把终端会话录制成SVG动画的工具, 非常有想法的一个项目;<br>不过使用的时候发现 如果有中文字符, 显示的时候会有点问题, 文字被挤到了一起;<br><a id="more"></a><br>比如:<br><img src="./cli.svg" alt="img"></p><p>这么好无的东西,不支持中文 不能忍;<br>捣鼓半天 找到一个 可以转成正常的角本, 不过作者弄成一个框架的插件. 用起来有点麻烦.  </p><p>索性重新写了个: <a href="https://gist.github.com/cnwhy/7cad3be853a188823c077df1182f6b1a" target="_blank" rel="noopener">https://gist.github.com/cnwhy/7cad3be853a188823c077df1182f6b1a</a>  </p><p>用法很简单,如果你用node,一行代码的事:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx https://gist.github.com/cnwhy/7cad3be853a188823c077df1182f6b1a &lt;svgfile&gt;</span><br></pre></td></tr></table></figure><p>这是转完后的效果:<br><img src="./convert-cli.svg" alt="img"></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;a href=&quot;https://github.com/nbedos/termtosvg&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;termtosvg&lt;/a&gt; 是一个可以把终端会话录制成SVG动画的工具, 非常有想法的一个项目;&lt;br&gt;不过使用的时候发现 如果有中文字符, 显示的时候会有点问题, 文字被挤到了一起;&lt;br&gt;
    
    </summary>
    
      <category term="My Projects" scheme="https://blog.whyoop.com/categories/My-Projects/"/>
    
      <category term="工具" scheme="https://blog.whyoop.com/categories/My-Projects/%E5%B7%A5%E5%85%B7/"/>
    
    
      <category term="termtosvg" scheme="https://blog.whyoop.com/tags/termtosvg/"/>
    
      <category term="中文" scheme="https://blog.whyoop.com/tags/%E4%B8%AD%E6%96%87/"/>
    
  </entry>
  
  <entry>
    <title>javascript中 非严格等号(==)运算符的比较规则</title>
    <link href="https://blog.whyoop.com/2019/02/15/js-Equality-rule/"/>
    <id>https://blog.whyoop.com/2019/02/15/js-Equality-rule/</id>
    <published>2019-02-15T09:19:23.000Z</published>
    <updated>2019-06-24T11:57:08.829Z</updated>
    
    <content type="html"><![CDATA[<p>javascript中的 <code>非严格等号(==)</code>运算符对于不同数据类型的比较, 会对运算符两边进行 <strong>隐式转换</strong>, 这篇文章将总结一下, 以便应对项(mian)目(shi)中的奇怪现象.<br><a id="more"></a></p><h2 id="非严格等号比较规则"><a href="#非严格等号比较规则" class="headerlink" title="非严格等号比较规则"></a>非严格等号比较规则</h2><p>javascript 使用 <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3" target="_blank" rel="noopener">Abstract Equality Comparison Algorithm</a> 规则进行比较</p><p><strong>总结如下:</strong></p><table><thead><tr><th>-</th><th>比较场景</th><th>结果</th><th>说明</th></tr></thead><tbody><tr><td>1</td><td>两边类型相同</td><td>同全等(===)规则</td><td>(值类型)类型相同,值相等为true;<br>(引用类型)引用同一对像才为true;</td></tr><tr><td>2</td><td><code>null</code> 与 <code>undefined</code></td><td><code>true</code></td><td></td></tr><tr><td>3</td><td><code>Number</code> 与 <code>String</code></td><td>number == <code>toNumber(string)</code></td><td><code>0 == &quot;&quot;</code>  //true <br> <code>&quot;01&quot; == 1</code> //true</td></tr><tr><td>4</td><td><code>Boolean</code> 与 <code>(any)</code></td><td><code>toNumber(bool)</code> == (any)</td><td><code>true == 1</code> //true <br> <code>false == 0</code> // true <br> <code>false == &#39;&#39;</code> // true</td></tr><tr><td>5</td><td><code>String</code> / <code>Number</code>    与 <code>Object</code></td><td>x == <code>toPrimitive(object)</code></td><td><code>&quot;[object Object]&quot; == {}</code> // true <br> <code>1 == {valueOf : function(){ return &quot;1&quot; }}</code> //true</td></tr><tr><td>6</td><td>其它情况</td><td><code>false</code></td><td><code>0 == null</code> <br> <code>&quot;&quot; == undefined</code> <br> <code>undefined == {}</code></td></tr></tbody></table><blockquote><p>toPrimitive 规则:<br>优先调用对像的 <code>valueOf</code> 方法转换;<br>如果对像没有 <code>valueOf</code> 方法, 或者 <code>valueOf</code> 方法返回的值不是原数据类型,<br>则调用 <code>toString</code> 方法转换;</p></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;javascript中的 &lt;code&gt;非严格等号(==)&lt;/code&gt;运算符对于不同数据类型的比较, 会对运算符两边进行 &lt;strong&gt;隐式转换&lt;/strong&gt;, 这篇文章将总结一下, 以便应对项(mian)目(shi)中的奇怪现象.&lt;br&gt;
    
    </summary>
    
      <category term="常用整理" scheme="https://blog.whyoop.com/categories/%E5%B8%B8%E7%94%A8%E6%95%B4%E7%90%86/"/>
    
    
      <category term="javascript" scheme="https://blog.whyoop.com/tags/javascript/"/>
    
  </entry>
  
  <entry>
    <title>javascript 错误对像</title>
    <link href="https://blog.whyoop.com/2019/02/15/js-Errors/"/>
    <id>https://blog.whyoop.com/2019/02/15/js-Errors/</id>
    <published>2019-02-15T05:48:39.000Z</published>
    <updated>2019-06-24T11:57:13.773Z</updated>
    
    <content type="html"><![CDATA[<table><thead><tr><th style="text-align:right">ErrorClass</th><th>说明</th><th>补充</th></tr></thead><tbody><tr><td style="text-align:right"><code>Error</code></td><td>错误类</td><td>以下错误类型均继承此类</td></tr><tr><td style="text-align:right"><code>EvalError</code></td><td>eval 函数错误</td><td>此异常不再会被JavaScript抛出，但是<code>EvalError</code>对象仍然保持兼容性.</td></tr><tr><td style="text-align:right"><code>InternalError</code></td><td>JavaScript引擎内部的错误</td><td>非标准错误</td></tr><tr><td style="text-align:right"><code>RangeError</code></td><td>数值变量或参数超出其有效范围</td><td></td></tr><tr><td style="text-align:right"><code>ReferenceError</code></td><td>无效引用</td><td></td></tr><tr><td style="text-align:right"><code>SyntaxError</code></td><td>语法错误</td><td></td></tr><tr><td style="text-align:right"><code>TypeError</code></td><td>变量或参数不属于有效类型</td><td></td></tr><tr><td style="text-align:right"><code>URIError</code></td><td>全局URI处理函数而产生地板</td><td></td></tr></tbody></table>]]></content>
    
    <summary type="html">
    
      javascript 内置错误对像 copy 自 MDN
    
    </summary>
    
      <category term="常用整理" scheme="https://blog.whyoop.com/categories/%E5%B8%B8%E7%94%A8%E6%95%B4%E7%90%86/"/>
    
    
      <category term="javascript" scheme="https://blog.whyoop.com/tags/javascript/"/>
    
  </entry>
  
  <entry>
    <title>axios-extra 支持并发及自动重试功能的 axios</title>
    <link href="https://blog.whyoop.com/2019/01/10/axios-extra/"/>
    <id>https://blog.whyoop.com/2019/01/10/axios-extra/</id>
    <published>2019-01-10T11:25:08.000Z</published>
    <updated>2019-06-24T12:07:08.241Z</updated>
    
    <content type="html"><![CDATA[<p><code>axios</code> 是基于 <code>promise</code> 用于 浏览器 和 node.js 的 <code>http</code> 客户端;<br>但在一个高并发请项目中, 如爬虫项目, 稍不注意, 可能因并发请求过多导致 程序卡死 甚至崩溃.<br><code>axios-extra</code> 则是扩展了 <code>axios</code> 让其拥有<strong>并发控制</strong>以及<strong>重试</strong>的能力;<br>如果你是一正在使用 <code>axios</code> 只要修改一行代码立即拥有</p><a id="more"></a><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><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">npm i axios-extra</span><br></pre></td></tr></table></figure><h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><blockquote><p>默认最大 10 并发, 0 重试;<br><figure class="highlight js"><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">//const axios = require('axios'); </span></span><br><span class="line"><span class="keyword">const</span> axios = <span class="built_in">require</span>(<span class="string">'axios-extra'</span>); <span class="comment">//修改一行代码 无感使用 axios-extra</span></span><br></pre></td></tr></table></figure></p></blockquote><h3 id="设置并发数-及重试次数"><a href="#设置并发数-及重试次数" class="headerlink" title="设置并发数,及重试次数"></a>设置并发数,及重试次数</h3><h4 id="方式一-用-axios-defaults-修改默认配制"><a href="#方式一-用-axios-defaults-修改默认配制" class="headerlink" title="方式一: 用 axios.defaults 修改默认配制"></a>方式一: 用 <code>axios.defaults</code> 修改默认配制</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> axios = <span class="built_in">require</span>(<span class="string">'axios-extra'</span>);</span><br><span class="line">axios.defaults.maxConcurrent = <span class="number">1</span>; <span class="comment">//修改并发为1</span></span><br><span class="line">axios.defaults.queueOptions.retry = <span class="number">2</span>; <span class="comment">//修改默认重试次数为2</span></span><br></pre></td></tr></table></figure><h4 id="方式二-用-axios-create-config-创建新的-axios"><a href="#方式二-用-axios-create-config-创建新的-axios" class="headerlink" title="方式二: 用 axios.create(config) 创建新的 axios"></a>方式二: 用 <code>axios.create(config)</code> 创建新的 <code>axios</code></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></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> axios = <span class="built_in">require</span>(<span class="string">'axios-extra'</span>);</span><br><span class="line"><span class="keyword">let</span> axios1 = axios.create(&#123;</span><br><span class="line">maxConcurrent: <span class="number">1</span>, <span class="comment">//并发为1</span></span><br><span class="line">queueOptions: &#123;</span><br><span class="line">retry: <span class="number">3</span>, <span class="comment">//请求失败时,最多会重试3次</span></span><br><span class="line">retryIsJump: <span class="literal">true</span> <span class="comment">//是否立即重试, 否则将在请求队列尾部插入重试请求</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><h4 id="方式三-为某一次特殊请求单独设置重试"><a href="#方式三-为某一次特殊请求单独设置重试" class="headerlink" title="方式三: 为某一次特殊请求单独设置重试"></a>方式三: 为某一次特殊请求单独设置重试</h4><p>设置<code>config</code>参数的<code>queueOptions</code>属性即可;<br><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">const</span> axios = <span class="built_in">require</span>(<span class="string">'axios-extra'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">//本次get请求若不成功,将重试3次</span></span><br><span class="line">axios.get(<span class="string">'http://xxx'</span>,&#123;</span><br><span class="line">queueOptions: &#123;<span class="attr">retry</span>: <span class="number">3</span>&#125;</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure></p><p><code>axios</code> 的发送请求方法均可使用:</p><ul><li><code>axios(config)</code></li><li><code>axios.request(config)</code></li><li><code>axios.get(url[, config])</code></li><li><code>axios.delete(url[, config])</code></li><li><code>axios.head(url[, config])</code></li><li><code>axios.options(url[, config])</code></li><li><code>axios.post(url[, data[, config]])</code></li><li><code>axios.put(url[, data[, config]])</code></li><li><code>axios.patch(url[, data[, config]])</code></li></ul><h2 id="补充"><a href="#补充" class="headerlink" title="补充"></a>补充</h2><p><code>axios-extra</code>利用<strong>ES6</strong>的<code>Proxy</code>对<code>axios</code>进行扩展, 请注意兼容.</p><p>并发与重试都是基于队列实现的, 默人重试是在队列的最后重新插入请求.<br><code>retryIsJump</code> 设置为<code>true</code>最会在队列头部插入请求, 实现<strong>立即重试</strong></p><blockquote><p>更多 queueOptions 配制可参看<a href="https://github.com/cnwhy/promise-queue-plus#queuepushpromisefun-args-options" target="_blank" rel="noopener">这里</a></p></blockquote>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;code&gt;axios&lt;/code&gt; 是基于 &lt;code&gt;promise&lt;/code&gt; 用于 浏览器 和 node.js 的 &lt;code&gt;http&lt;/code&gt; 客户端;&lt;br&gt;但在一个高并发请项目中, 如爬虫项目, 稍不注意, 可能因并发请求过多导致 程序卡死 甚至崩溃.&lt;br&gt;&lt;code&gt;axios-extra&lt;/code&gt; 则是扩展了 &lt;code&gt;axios&lt;/code&gt; 让其拥有&lt;strong&gt;并发控制&lt;/strong&gt;以及&lt;strong&gt;重试&lt;/strong&gt;的能力;&lt;br&gt;如果你是一正在使用 &lt;code&gt;axios&lt;/code&gt; 只要修改一行代码立即拥有&lt;/p&gt;
    
    </summary>
    
      <category term="My Projects" scheme="https://blog.whyoop.com/categories/My-Projects/"/>
    
    
      <category term="axios" scheme="https://blog.whyoop.com/tags/axios/"/>
    
  </entry>
  
  <entry>
    <title>javascript对像之属性遍历</title>
    <link href="https://blog.whyoop.com/2019/01/02/%E5%B1%9E%E6%80%A7%E9%81%8D%E5%8E%86%E6%B1%87%E6%80%BB/"/>
    <id>https://blog.whyoop.com/2019/01/02/属性遍历汇总/</id>
    <published>2019-01-02T07:47:22.000Z</published>
    <updated>2019-06-24T12:02:05.301Z</updated>
    
    <content type="html"><![CDATA[<p>javascript 检索属性的API的检索范围老记不住, 做个表格, 记录一下.<br><a id="more"></a></p><h2 id="属性遍历-检查"><a href="#属性遍历-检查" class="headerlink" title="属性遍历/检查"></a>属性遍历/检查</h2><table><thead><tr><th>语法/运算符</th><th>普通属性</th><th>原型链</th><th>不可枚举</th><th>Symbol</th><th>说明</th></tr></thead><tbody><tr><td><code>in</code></td><td>✔</td><td>✔</td><td>✔</td><td>✔</td><td>会检查对像属性及其原型链</td></tr><tr><td><code>for...in</code></td><td>✔</td><td>✔</td><td>✘</td><td>✘</td><td>会访问原型链</td></tr><tr><td>Object.keys(obj)</td><td>✔</td><td>✘</td><td>✘</td><td>✘</td><td><code>[name1,name2]</code></td></tr><tr><td>Object.getOwnPropertyNames(obj)</td><td>✔</td><td>✘</td><td>✔</td><td>✘</td><td>会列出不可枚举属性</td></tr><tr><td>Object.getOwnPropertySymbols(obj)</td><td>✘</td><td>✘</td><td>✘</td><td>✔</td><td></td></tr><tr><td>Reflect.ownKeys(obj)</td><td>✔</td><td>✘</td><td>✔</td><td>✔</td><td></td></tr><tr><td>Object.entries(obj)</td><td>✔</td><td>✘</td><td>✘</td><td>✘</td><td>规则同<code>keys</code><br><code>[[name1,value1],[name2,value2]]</code></td></tr></tbody></table><blockquote><p>“普通属性” 指可枚举的自有属性, 检索不会区分 “数据属性” 和 “访问器属性”;<br><code>__proto__</code> 非常特殊,常见JS引擎下除了 <code>in</code> 运算符都不会检出;</p></blockquote><h2 id="附-属性描述符说明"><a href="#附-属性描述符说明" class="headerlink" title="附:属性描述符说明"></a>附:属性描述符说明</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><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">&#123;</span><br><span class="line"><span class="string">"configurable"</span>: <span class="literal">false</span>, <span class="comment">//为 true 时，该属性描述符才能够被改变，同时该属性也能从对应的对象上被删除。默认为 false。</span></span><br><span class="line"><span class="string">"enumerable"</span>: <span class="literal">false</span>,   <span class="comment">//为true时，该属性才能够出现在对象的枚举属性中。默认为 false。</span></span><br><span class="line"><span class="comment">//数据描述符(数据属性)同时具有以下可选键值：</span></span><br><span class="line"><span class="string">"value"</span>: <span class="literal">undefined</span>, <span class="comment">//该属性对应的值。可以是任何有效的 JavaScript 值（数值，对象，函数等）。默认为 undefined。</span></span><br><span class="line"><span class="string">"writable"</span>: <span class="literal">false</span>,  <span class="comment">//为true时，value才能被赋值运算符改变。默认为 false。</span></span><br><span class="line"><span class="comment">//存取描述符(访问器属性)同时具有以下可选键值：</span></span><br><span class="line"><span class="string">"get"</span>: <span class="literal">undefined</span>, <span class="comment">//一个给属性提供 getter 的方法，默认为 undefined。</span></span><br><span class="line"><span class="string">"set"</span>: <span class="literal">undefined</span>, <span class="comment">//一个给属性提供 setter 的方法，默认为 undefined。</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;javascript 检索属性的API的检索范围老记不住, 做个表格, 记录一下.&lt;br&gt;
    
    </summary>
    
      <category term="常用整理" scheme="https://blog.whyoop.com/categories/%E5%B8%B8%E7%94%A8%E6%95%B4%E7%90%86/"/>
    
    
      <category term="javascript" scheme="https://blog.whyoop.com/tags/javascript/"/>
    
  </entry>
  
  <entry>
    <title>JavaScript中的this概念梳理</title>
    <link href="https://blog.whyoop.com/2018/12/07/javascript-this/"/>
    <id>https://blog.whyoop.com/2018/12/07/javascript-this/</id>
    <published>2018-12-07T10:08:19.000Z</published>
    <updated>2019-06-24T11:58:42.449Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p><code>this</code>算是<code>javascript</code>中又爱又恨的东西了. 其实<code>this</code>的概念并没有多少, 本文将把<code>this</code>的概念用示例梳理一次.<br><a id="more"></a></p></blockquote><h1 id="最基本的this概念"><a href="#最基本的this概念" class="headerlink" title="最基本的this概念"></a>最基本的<code>this</code>概念</h1><h2 id="指向globe的this"><a href="#指向globe的this" class="headerlink" title="指向globe的this"></a>指向<code>globe</code>的<code>this</code></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><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">//浏览器内 落单的this, 普通调用的函数中的this 都指向windows对像;</span></span><br><span class="line"><span class="keyword">this</span> === <span class="built_in">window</span>; <span class="comment">//true</span></span><br><span class="line">(<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123; <span class="keyword">return</span> <span class="keyword">this</span>; &#125;)() === <span class="built_in">window</span>; <span class="comment">//true</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">A</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line"><span class="keyword">return</span> <span class="keyword">this</span>;</span><br><span class="line">&#125;</span><br><span class="line">A() === <span class="built_in">window</span>; <span class="comment">//true</span></span><br><span class="line"><span class="comment">// node 中则指向 globe</span></span><br></pre></td></tr></table></figure><h2 id="对像属性函数中的this指向父对像"><a href="#对像属性函数中的this指向父对像" class="headerlink" title="对像属性函数中的this指向父对像"></a>对像属性函数中的<code>this</code>指向父对像</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><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"><span class="function"><span class="keyword">function</span> <span class="title">This</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line"><span class="keyword">return</span> <span class="keyword">this</span>;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="keyword">var</span> obj = &#123;</span><br><span class="line">A: <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;<span class="keyword">return</span> <span class="keyword">this</span>&#125;,</span><br><span class="line">B: This,</span><br><span class="line">C: &#123;</span><br><span class="line">CA: This</span><br><span class="line">&#125;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="built_in">console</span>.log(This() === windows); <span class="comment">//true</span></span><br><span class="line"><span class="built_in">console</span>.log(obj.A() === obj); <span class="comment">//true</span></span><br><span class="line"><span class="built_in">console</span>.log(obj.B() === obj); <span class="comment">//true</span></span><br><span class="line"><span class="built_in">console</span>.log(obj.C.CA() === obj); <span class="comment">//false</span></span><br><span class="line"><span class="built_in">console</span>.log(obj.C.CA() === obj.C); <span class="comment">//true</span></span><br></pre></td></tr></table></figure><h2 id="构建函数中的this指向实例化对像"><a href="#构建函数中的this指向实例化对像" class="headerlink" title="构建函数中的this指向实例化对像"></a>构建函数中的<code>this</code>指向实例化对像</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><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">C</span>(<span class="params">name</span>)</span>&#123;</span><br><span class="line"><span class="keyword">this</span>.name = name;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">var</span> a = <span class="keyword">new</span> C(<span class="string">'a'</span>);</span><br><span class="line"><span class="built_in">console</span>.log(a.name); <span class="comment">// a;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//ES6</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">C1</span></span>&#123;</span><br><span class="line"><span class="keyword">constructor</span>(name)&#123;</span><br><span class="line"><span class="keyword">this</span>.name = name;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">var</span> b = <span class="keyword">new</span> C1(<span class="string">'b'</span>);</span><br><span class="line"><span class="built_in">console</span>.log(b.name); <span class="comment">// b</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//父类构建函数中的`this`也指向实例化的对像</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">C2</span> <span class="keyword">extends</span> <span class="title">C1</span></span>&#123;</span><br><span class="line"><span class="keyword">constructor</span>(name,age)&#123;</span><br><span class="line"><span class="keyword">super</span>(name);</span><br><span class="line"><span class="keyword">this</span>.age = age;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">var</span> c = <span class="keyword">new</span> C2(<span class="string">'c'</span>,<span class="number">10</span>);</span><br><span class="line"><span class="built_in">console</span>.log(c.name); <span class="comment">// c</span></span><br><span class="line"><span class="built_in">console</span>.log(c.age); <span class="comment">// 10</span></span><br></pre></td></tr></table></figure><h1 id="call-apply-改变this指向"><a href="#call-apply-改变this指向" class="headerlink" title="call, apply 改变this指向"></a><code>call</code>, <code>apply</code> 改变this指向</h1><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="function"><span class="keyword">function</span> <span class="title">D</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">'D:'</span> + <span class="keyword">this</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">var</span> Obj = &#123;</span><br><span class="line">name : <span class="string">'obj'</span>,</span><br><span class="line">show : <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">'name:'</span> + <span class="keyword">this</span>.name);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//call , apply 会执行函数并改变this的指向</span></span><br><span class="line">D.call(<span class="string">'call'</span>); <span class="comment">// D:call</span></span><br><span class="line">D.apply(<span class="string">'apply'</span>); <span class="comment">// D:apply</span></span><br><span class="line">Obj.show(); <span class="comment">// name:obj</span></span><br><span class="line">Obj.show.call(&#123;<span class="attr">name</span>:<span class="string">'call'</span>&#125;); <span class="comment">// name:call</span></span><br><span class="line">Obj.show.apply(&#123;<span class="attr">name</span>:<span class="string">'apply'</span>&#125;); <span class="comment">// name:apply</span></span><br></pre></td></tr></table></figure><h1 id="bind-方法会生成一个绑定了this的新函数"><a href="#bind-方法会生成一个绑定了this的新函数" class="headerlink" title="bind 方法会生成一个绑定了this的新函数"></a><code>bind</code> 方法会生成一个绑定了this的新函数</h1><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> D = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">'D:'</span> + <span class="keyword">this</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> DBind = D.bind(<span class="string">'bind'</span>);</span><br><span class="line">DBind(); <span class="comment">// D:bind</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// call,apply不能改变this指向, 再使用bind定也无法改变</span></span><br><span class="line">DBind.call(<span class="string">'call'</span>); <span class="comment">// D:bind</span></span><br><span class="line">DBind.apply(<span class="string">'apply'</span>); <span class="comment">// D:bind</span></span><br><span class="line">DBind.bind(<span class="string">'bind1'</span>)(); <span class="comment">// D:bind</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//但不会改变 new 运算符执函时 this 的指向.</span></span><br><span class="line"><span class="keyword">new</span> DBind(); <span class="comment">// D:[object Object]</span></span><br></pre></td></tr></table></figure><h1 id="箭头函数-this指向不变"><a href="#箭头函数-this指向不变" class="headerlink" title="箭头函数 this指向不变"></a>箭头函数 this指向不变</h1><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">//箭头函数中的this指上下文的this, 无法用 call/apply 和 bind改变;</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">getShow</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line"><span class="keyword">return</span> <span class="function"><span class="params">()</span>=&gt;</span>&#123;</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">"this:"</span> + <span class="keyword">this</span>);</span><br><span class="line">&#125;;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">var</span> show = getShow.call(<span class="string">'a'</span>);</span><br><span class="line">show(); <span class="comment">// this:a</span></span><br><span class="line">show.call(<span class="string">'b'</span>); <span class="comment">// this:a</span></span><br><span class="line">show.apply(<span class="string">'c'</span>); <span class="comment">// this:a</span></span><br><span class="line">show.bind(<span class="string">'d'</span>)(); <span class="comment">// this:a</span></span><br></pre></td></tr></table></figure><h1 id="实用-示例"><a href="#实用-示例" class="headerlink" title="实用 示例"></a>实用 示例</h1><ol><li><p>类型判断</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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">getType</span>(<span class="params">obj</span>)</span>&#123;</span><br><span class="line"><span class="keyword">return</span> <span class="built_in">Object</span>.prototype.toString.call(obj).slice(<span class="number">8</span>,<span class="number">-1</span>).toLowerCase();</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></li><li><p>arguments 转 array</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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">fn</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line"><span class="keyword">var</span> args = [].slice.call(<span class="built_in">arguments</span>,<span class="number">0</span>)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ol>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;this&lt;/code&gt;算是&lt;code&gt;javascript&lt;/code&gt;中又爱又恨的东西了. 其实&lt;code&gt;this&lt;/code&gt;的概念并没有多少, 本文将把&lt;code&gt;this&lt;/code&gt;的概念用示例梳理一次.&lt;br&gt;
    
    </summary>
    
      <category term="常用整理" scheme="https://blog.whyoop.com/categories/%E5%B8%B8%E7%94%A8%E6%95%B4%E7%90%86/"/>
    
    
      <category term="javascript" scheme="https://blog.whyoop.com/tags/javascript/"/>
    
      <category term="this" scheme="https://blog.whyoop.com/tags/this/"/>
    
  </entry>
  
  <entry>
    <title>前端模块化标准对比 iife amd cmd cjs umd es6</title>
    <link href="https://blog.whyoop.com/2018/08/01/js-modules/"/>
    <id>https://blog.whyoop.com/2018/08/01/js-modules/</id>
    <published>2018-08-01T02:46:07.000Z</published>
    <updated>2019-07-02T06:17:39.647Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>前端组件的模块化己发展了很久 这篇文章将对 <code>iife</code> <code>amd</code> <code>cmd</code> <code>cjs</code> <code>umd</code> 和 <code>es6</code> 做一个介绍</p></blockquote><a id="more"></a><h2 id="IIFE"><a href="#IIFE" class="headerlink" title="IIFE"></a>IIFE</h2><p><code>IIFE</code> 其实在大家应该都用过,只不过没想到还有个名字;<br><code>IIFE</code> 标准简单说就是执行一个匿名函数, 模块代码放入匿名函数中, 隔离变量作用域,内存释放等问题;<br><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="function"><span class="keyword">function</span>(<span class="params">global</span>)</span>&#123;</span><br><span class="line">    <span class="comment">// code</span></span><br><span class="line">&#125;)(<span class="keyword">this</span>);</span><br></pre></td></tr></table></figure></p><h2 id="AMD-和-CMD"><a href="#AMD-和-CMD" class="headerlink" title="AMD 和 CMD"></a>AMD 和 CMD</h2><p>介绍 <code>AMD</code> 不得不说 <a href="http://requirejs.org/" target="_blank" rel="noopener">RequireJS</a>, 它的出现解决了模块依赖的问题, 使得前端模块化进程加速发展, <a href="https://github.com/amdjs/amdjs-api/wiki/AMD-(%E4%B8%AD%E6%96%87%E7%89%88" target="_blank" rel="noopener">AMD规范</a>) 其实是<code>RequireJS</code>出来之后再提出来的.<br><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">define(<span class="string">'module1'</span>,<span class="string">'module2'</span>],<span class="function"><span class="keyword">function</span>(<span class="params">m1,m2</span>)</span>&#123;    </span><br><span class="line">    <span class="built_in">require</span>([<span class="string">'module3'</span>],<span class="function"><span class="keyword">function</span>(<span class="params">m3</span>)</span>&#123;</span><br><span class="line"></span><br><span class="line">    &#125;)</span><br><span class="line">&#125;);</span><br><span class="line"><span class="comment">// commonjs 风格:</span></span><br><span class="line">define(<span class="function"><span class="keyword">function</span>(<span class="params">require, exports, module</span>)</span>&#123;</span><br><span class="line">    <span class="keyword">var</span> m1 = <span class="built_in">require</span>(<span class="string">'module1'</span>);</span><br><span class="line">    <span class="keyword">var</span> m2 = <span class="built_in">require</span>(<span class="string">'module2'</span>);</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure></p><p><code>SeaJS</code>最初以 <code>就近加载</code> 以及支持 <code>加载 CSS</code> 等特点吸引了很多用户, 并提出了 <a href="https://github.com/cmdjs/specification/blob/master/draft/module.md" target="_blank" rel="noopener">CMD规范</a>. 但在 <code>RequireJS</code> 也支持这些特性之后, 渐渐淡出;<br>虽然 <code>SeaJS</code> 没有明显的缺点,但统一标准未尝不是一件好事;<br><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">define(<span class="function"><span class="keyword">function</span>(<span class="params">require, exports, module</span>) </span>&#123;</span><br><span class="line">    <span class="comment">//同步加载</span></span><br><span class="line">    <span class="keyword">var</span> m1 = <span class="built_in">require</span>(<span class="string">'module1'</span>);</span><br><span class="line"></span><br><span class="line">    <span class="comment">//异步加载</span></span><br><span class="line">    <span class="built_in">require</span>.async(<span class="string">'module2'</span>,<span class="function"><span class="keyword">function</span>(<span class="params">m2</span>)</span>&#123;</span><br><span class="line"></span><br><span class="line">    &#125;)</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure></p><h2 id="CJS"><a href="#CJS" class="headerlink" title="CJS"></a>CJS</h2><p><code>CJS</code> 其实应该叫 <code>CommonJS</code>;<br><code>CommonJS</code>是<code>nodejs</code>也就是服务器端广泛使用的模块化机制。该规范的主要内容是，模块必须通过 <code>module.exports</code> 导出对外的变量或接口，通过 <code>require()</code> 来导入其他模块的输出到当前模块作用域中。<br><code>CommonJS</code> 中的模块加载是同步的, 不适合在浏览器中使用;<br><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="keyword">var</span> m1 = <span class="built_in">require</span>(<span class="string">'module1'</span>);</span><br><span class="line"><span class="comment">//code</span></span><br><span class="line"><span class="built_in">module</span>.exports = &#123;&#125;</span><br></pre></td></tr></table></figure></p><h2 id="UMD"><a href="#UMD" class="headerlink" title="UMD"></a>UMD</h2><p><code>UMD</code> 其实不是什么标准, 可以看成是 <code>IIFE</code> <code>amd</code> + <code>cjs</code> 的兼容版.<br>也就是一个js文件, 可以用 <code>script</code> 标签引用加载, 用 <code>RequireJS</code> 加载, 也可以在 <code>node</code> 当成 <code>CommonJS</code> 模块加载;<br><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="params">global, factory</span>) </span>&#123;</span><br><span class="line"><span class="keyword">typeof</span> exports === <span class="string">'object'</span> &amp;&amp; <span class="keyword">typeof</span> <span class="built_in">module</span> !== <span class="string">'undefined'</span> ? <span class="built_in">module</span>.exports = factory() :</span><br><span class="line"><span class="keyword">typeof</span> define === <span class="string">'function'</span> &amp;&amp; define.amd ? define(factory) :</span><br><span class="line">(global.NAME = factory());</span><br><span class="line">&#125;(<span class="keyword">this</span>, (<span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span><br><span class="line">    <span class="comment">//code</span></span><br><span class="line">    <span class="keyword">return</span> obj;</span><br><span class="line">&#125;)));</span><br></pre></td></tr></table></figure></p><blockquote><p>如果还想兼容 <code>CMD</code> 判断一下 <code>define.cmd</code> 即可;</p></blockquote><h2 id="ES6"><a href="#ES6" class="headerlink" title="ES6"></a>ES6</h2><p><code>ES6</code> 模块其实是 <strong>ECMAScript 2015 标准</strong> 在语言层面上,实现了模块功能;<br><code>ES6</code> 而且实现得相当简单，<code>import</code> 引入 <code>export</code> 导出.<br><code>ES6</code> 模块的设计思想是尽量的静态化，使得编译时就能确定模块的依赖关系，以及输入和输出的变量。<br>现在许多打包工具利用 <code>ES6</code> 的特点, 按需提取代码, 打出的包更加精简.<br><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></span><br><span class="line"><span class="keyword">import</span> &#123; stat, exists, readFile &#125; <span class="keyword">from</span> <span class="string">'fs'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//暴露接口</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> obj; <span class="comment">// 默认对外接口</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">var</span> foo = <span class="string">'str'</span>; <span class="comment">// 名称为`foo`的对外接口</span></span><br></pre></td></tr></table></figure></p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><blockquote><p><code>iife</code> 的方便会让其长期存在<br><code>amd</code> 在浏览器端还是霸主阶段<br>在服务端 <code>es6</code> 标准化取代 <code>cjs</code> 是一种趋势, 但<code>cjs</code>标准的庞大类库,会让它暂时难以取代.</p></blockquote><table><thead><tr><th>标准</th><th>变量问题</th><th>依赖</th><th>动态 加载</th><th>静态分析</th></tr></thead><tbody><tr><td>iife</td><td>✔</td><td>✘</td><td>✘</td><td>✘</td></tr><tr><td>amd</td><td>✔</td><td>✔</td><td>✔</td><td>✘</td></tr><tr><td>cmd</td><td>✔</td><td>✔</td><td>✔</td><td>✘</td></tr><tr><td>cjs</td><td>✔</td><td>✔</td><td>✘</td><td>✘</td></tr><tr><td>es6</td><td>✔</td><td>✔</td><td>✘</td><td>✔</td></tr></tbody></table><h2 id="延伸"><a href="#延伸" class="headerlink" title="延伸"></a>延伸</h2><p><a href="https://github.com/systemjs/systemjs" target="_blank" rel="noopener">systemjs</a> 加载器可以加载上述所有标准的模块.<br><a href="https://github.com/rollup/rollup" target="_blank" rel="noopener">rollup</a> 可以把 <code>es6</code>/<code>cjs</code> 打包成各种标准的文件.</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;前端组件的模块化己发展了很久 这篇文章将对 &lt;code&gt;iife&lt;/code&gt; &lt;code&gt;amd&lt;/code&gt; &lt;code&gt;cmd&lt;/code&gt; &lt;code&gt;cjs&lt;/code&gt; &lt;code&gt;umd&lt;/code&gt; 和 &lt;code&gt;es6&lt;/code&gt; 做一个介绍&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="常用整理" scheme="https://blog.whyoop.com/categories/%E5%B8%B8%E7%94%A8%E6%95%B4%E7%90%86/"/>
    
    
      <category term="javascript" scheme="https://blog.whyoop.com/tags/javascript/"/>
    
      <category term="模块化" scheme="https://blog.whyoop.com/tags/%E6%A8%A1%E5%9D%97%E5%8C%96/"/>
    
  </entry>
  
  <entry>
    <title>javascript 一个很小的GBK库(gbk,gb2312)</title>
    <link href="https://blog.whyoop.com/2018/05/02/gbk-js/"/>
    <id>https://blog.whyoop.com/2018/05/02/gbk-js/</id>
    <published>2018-05-02T06:45:52.000Z</published>
    <updated>2019-06-24T11:55:40.313Z</updated>
    
    <content type="html"><![CDATA[<p>现在的新项目应该很少再使用 <code>gbk</code> 或 <code>gb2312</code> 了, 但还是有不少老项目在使用;<br>而新项目免不了要与老项目有一些”沟通”;<br>这样的项目, 尤其是一些web项目, 常常需要考虑到底是前端引一个GBK库, 还是在服务端处理GBK的问题, 因为web端使用GBK库一般会比较大, 而在服务端处理又有些麻烦;<br>如果有一个超小的GBK库就方便了;<br><a id="more"></a></p><h2 id="项目地址"><a href="#项目地址" class="headerlink" title="项目地址:"></a>项目地址:</h2><p><a href="https://github.com/cnwhy/GBK.js" target="_blank" rel="noopener">https://github.com/cnwhy/GBK.js</a>  </p><h2 id="特性"><a href="#特性" class="headerlink" title="特性"></a>特性</h2><ul><li>就是比一般的GBK库要小, 主要是改进了之前网上流传的一个GBK库, 大概50几K, 改进后的库31k, 而正常的GBK编码表就要到200k了;</li><li>增加了 <code>URI</code> 相关的函数;</li><li>项目中包含了压缩GBK编码表整套方案,方便自行优化,生成更小的库文件.</li></ul><h2 id="API"><a href="#API" class="headerlink" title="API"></a>API</h2><h3 id="GBK-encode-string-解码GBK为一个字节数组"><a href="#GBK-encode-string-解码GBK为一个字节数组" class="headerlink" title="GBK.encode({string}) 解码GBK为一个字节数组"></a>GBK.encode({string}) 解码GBK为一个字节数组</h3><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">GBK.encode(&apos;时顺地?abc地&apos;)</span><br><span class="line">&gt; [ 202, 177, 203, 179, 181, 216, 63, 97, 98, 99, 181, 216 ]</span><br></pre></td></tr></table></figure><h3 id="GBK-decode-BbyteArry-解码GBK编码的字节数组-返回字符串"><a href="#GBK-decode-BbyteArry-解码GBK编码的字节数组-返回字符串" class="headerlink" title="GBK.decode({BbyteArry}) 解码GBK编码的字节数组 返回字符串"></a>GBK.decode({BbyteArry}) 解码GBK编码的字节数组 返回字符串</h3><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">GBK.decode([ 202, 177, 203, 179, 181, 216, 63, 97, 98, 99, 181, 216 ])</span><br><span class="line">&gt; 时顺地?abc地;</span><br></pre></td></tr></table></figure><h3 id="URI相关函数"><a href="#URI相关函数" class="headerlink" title="URI相关函数"></a>URI相关函数</h3><h4 id="GBK-URI-encodeURI-String-转换规则和-encodeURI-函数一至"><a href="#GBK-URI-encodeURI-String-转换规则和-encodeURI-函数一至" class="headerlink" title="GBK.URI.encodeURI({String})  转换规则和 encodeURI 函数一至"></a>GBK.URI.encodeURI({String})  转换规则和 <code>encodeURI</code> 函数一至</h4><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">GBK.URI.encodeURI(&apos;https://abc.com/?kk=abv&amp;bb=火车头#top&apos;)</span><br><span class="line">&gt; https://abc.com/?kk=abv&amp;bb=%BB%F0%B3%B5%CD%B7#top</span><br></pre></td></tr></table></figure><h4 id="GBK-URI-decodeURI-String-转换规则和-decodeURI-函数一至"><a href="#GBK-URI-decodeURI-String-转换规则和-decodeURI-函数一至" class="headerlink" title="GBK.URI.decodeURI({String})  转换规则和 decodeURI 函数一至"></a>GBK.URI.decodeURI({String})  转换规则和 <code>decodeURI</code> 函数一至</h4><h4 id="GBK-URI-encodeURIComponent-String-转换规则和-encodeURIComponent-函数一至"><a href="#GBK-URI-encodeURIComponent-String-转换规则和-encodeURIComponent-函数一至" class="headerlink" title="GBK.URI.encodeURIComponent({String})  转换规则和 encodeURIComponent 函数一至"></a>GBK.URI.encodeURIComponent({String})  转换规则和 <code>encodeURIComponent</code> 函数一至</h4><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">GBK.URI.encodeURIComponent(&apos;https://abc.com/?kk=abv&amp;bb=火车头#top&apos;)</span><br><span class="line">&gt; https%3A%2F%2Fabc.com%2F%3Fkk%3Dabv%26bb%3D%BB%F0%B3%B5%CD%B7%23top</span><br></pre></td></tr></table></figure><h4 id="GBK-URI-decodeURIComponent-String-转换规则和-decodeURIComponent-函数一至"><a href="#GBK-URI-decodeURIComponent-String-转换规则和-decodeURIComponent-函数一至" class="headerlink" title="GBK.URI.decodeURIComponent({String})  转换规则和 decodeURIComponent 函数一至"></a>GBK.URI.decodeURIComponent({String})  转换规则和 <code>decodeURIComponent</code> 函数一至</h4>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;现在的新项目应该很少再使用 &lt;code&gt;gbk&lt;/code&gt; 或 &lt;code&gt;gb2312&lt;/code&gt; 了, 但还是有不少老项目在使用;&lt;br&gt;而新项目免不了要与老项目有一些”沟通”;&lt;br&gt;这样的项目, 尤其是一些web项目, 常常需要考虑到底是前端引一个GBK库, 还是在服务端处理GBK的问题, 因为web端使用GBK库一般会比较大, 而在服务端处理又有些麻烦;&lt;br&gt;如果有一个超小的GBK库就方便了;&lt;br&gt;
    
    </summary>
    
      <category term="My Projects" scheme="https://blog.whyoop.com/categories/My-Projects/"/>
    
      <category term="重造轮子" scheme="https://blog.whyoop.com/categories/My-Projects/%E9%87%8D%E9%80%A0%E8%BD%AE%E5%AD%90/"/>
    
    
      <category term="gbk" scheme="https://blog.whyoop.com/tags/gbk/"/>
    
      <category term="gb2312" scheme="https://blog.whyoop.com/tags/gb2312/"/>
    
      <category term="javascript" scheme="https://blog.whyoop.com/tags/javascript/"/>
    
  </entry>
  
  <entry>
    <title>垂直居中方法汇总</title>
    <link href="https://blog.whyoop.com/2017/11/02/%E5%9E%82%E7%9B%B4%E5%B1%85%E4%B8%AD%E6%96%B9%E6%B3%95%E6%B1%87%E6%80%BB/"/>
    <id>https://blog.whyoop.com/2017/11/02/垂直居中方法汇总/</id>
    <published>2017-11-01T16:34:43.000Z</published>
    <updated>2019-01-11T09:51:35.120Z</updated>
    
    <content type="html"><![CDATA[<p>为了方便代码演示，容器 <code>.box</code> 等样式如下：</p><style>    .box {        border: 1px solid #999;        height: 200px;        width: 300px;        position: relative;    }    .box>div {        width: 90px;        height: 90px;        border: 1px solid #000;        transition: all 0.3s;    }    .box>div:hover {        width: 150px;        height: 150px;    }    .line-height {        height: 100px;        line-height: 100px;        text-align: center;    }    .table {        display: table-cell;        text-align: center;        vertical-align: middle;    }    .table>div {        display: inline-block;        vertical-align: middle;    }    .vertical-align {        text-align: center;    }    .vertical-align::before {        content: "";        display: inline-block;        height: 100%;        width: 0;        vertical-align: middle;    }    .vertical-align>div {        display: inline-block;        vertical-align: middle;    }    .absolute-margin>div {        position: absolute;        left: 50%;        top: 50%;        width:100px;        height:100px;        border:1px solid #000;        margin-left: -51px;        margin-top: -51px;    }    .absolute-translate>div {        position: absolute;        left: 50%;        top: 50%;        transform: translate(-50%, -50%);    }    .absolute-auto>div {        position: absolute;        left: 0;        right: 0;        top: 0;        bottom: 0;        margin: auto;    }    .fixed-auto>div {        position: fixed;        left: 0;        right: 0;        top: 0;        bottom: 0;        margin: auto;    }    .flex {        display: flex;        flex-wrap: wrap;        justify-content: center;        align-items: center;        align-content: center;    }    .flex>div {        width: 50px;        height: 50px;        margin: 5px;        display: inline-flex;    }    .flex>div:hover {        width: 60px;        height: 60px;    }    .grid {        display: grid;        grid-template-columns: auto;        grid-template-rows: auto;        justify-items: center;        align-items: center;        justify-self: center;        align-self: center;    }    .grid>div {        /* display: inline-block; */    }</style><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><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"><span class="selector-class">.box</span> &#123;</span><br><span class="line"><span class="attribute">border</span>: <span class="number">1px</span> solid <span class="number">#999</span>;</span><br><span class="line"><span class="attribute">height</span>: <span class="number">200px</span>;</span><br><span class="line"><span class="attribute">width</span>: <span class="number">300px</span>;</span><br><span class="line"><span class="attribute">position</span>: relative;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.box</span>&gt;<span class="selector-tag">div</span> &#123;</span><br><span class="line"><span class="attribute">width</span>: <span class="number">90px</span>;</span><br><span class="line"><span class="attribute">height</span>: <span class="number">90px</span>;</span><br><span class="line"><span class="attribute">border</span>: <span class="number">1px</span> solid <span class="number">#000</span>;</span><br><span class="line"><span class="attribute">transition</span>: all <span class="number">0.3s</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.box</span>&gt;<span class="selector-tag">div</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line"><span class="attribute">width</span>: <span class="number">150px</span>;</span><br><span class="line"><span class="attribute">height</span>: <span class="number">150px</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="不脱离文档流"><a href="#不脱离文档流" class="headerlink" title="不脱离文档流"></a>不脱离文档流</h1><h2 id="利用line-height"><a href="#利用line-height" class="headerlink" title="利用line-height"></a>利用line-height</h2><p>此方法关键是把<strong>行高设置成和容器高度相同</strong></p><div class="box line-height">aaaaa</div><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></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="undefined"></span></span><br><span class="line"><span class="css"><span class="selector-class">.line-height</span> &#123;</span></span><br><span class="line"><span class="undefined">text-align: center;</span></span><br><span class="line"><span class="undefined">height: 100px;</span></span><br><span class="line"><span class="undefined">line-height: 100px;</span></span><br><span class="line"><span class="undefined">&#125;</span></span><br><span class="line"><span class="undefined"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"box line-height"</span>&gt;</span>aaaaa<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><blockquote><p>优点：简单，方便，兼容所有浏览器。<br>缺点：只支持单行，主要适用于单行文本。</p></blockquote><h2 id="table-方式"><a href="#table-方式" class="headerlink" title="table 方式"></a>table 方式</h2><p><code>table</code> 的单元格是天生支持垂直居中的容器，其它标签可以设置 <code>display</code> 达到相同效果</p><div class="box table">sdfsdfd1111111111111s<br>sdfsdfds<br>sdfsdfds<br><div></div></div><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></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="undefined"></span></span><br><span class="line"><span class="css"><span class="selector-class">.table</span> &#123;</span></span><br><span class="line"><span class="undefined">display: table-cell;</span></span><br><span class="line"><span class="undefined">text-align: center;</span></span><br><span class="line"><span class="undefined">vertical-align: middle;</span></span><br><span class="line"><span class="undefined">&#125;</span></span><br><span class="line"><span class="undefined"></span></span><br><span class="line"><span class="css"><span class="selector-class">.table</span>&gt;<span class="selector-tag">div</span> &#123;</span></span><br><span class="line"><span class="undefined">display: inline-block;</span></span><br><span class="line"><span class="undefined">vertical-align: middle;</span></span><br><span class="line"><span class="undefined">&#125;</span></span><br><span class="line"><span class="undefined"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"box table"</span>&gt;</span></span><br><span class="line">sdfsdfd1111111111111s<span class="tag">&lt;<span class="name">br</span>&gt;</span>sdfsdfds<span class="tag">&lt;<span class="name">br</span>&gt;</span>sdfsdfds<span class="tag">&lt;<span class="name">br</span>&gt;</span><span class="tag">&lt;<span class="name">div</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">div</span>&gt;</span></span><br></pre></td></tr></table></figure><blockquote><p>优点：支持多行，兼容所有浏览器。<br>缺点：IE7以下要用 <code>table</code> 标签,嵌套太多; 单元格属性与普通容器行为有差异。</p></blockquote><h2 id="vertical-align"><a href="#vertical-align" class="headerlink" title="vertical-align"></a>vertical-align</h2><div class="box vertical-align"><div></div>1212</div><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></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="undefined"></span></span><br><span class="line"><span class="css"><span class="selector-class">.vertical-align</span> &#123;</span></span><br><span class="line"><span class="undefined">text-align: center;</span></span><br><span class="line"><span class="undefined">&#125;</span></span><br><span class="line"><span class="undefined"></span></span><br><span class="line"><span class="css"><span class="selector-class">.vertical-align</span><span class="selector-pseudo">::before</span> &#123; </span></span><br><span class="line"><span class="undefined">content: "";</span></span><br><span class="line"><span class="undefined">display: inline-block;</span></span><br><span class="line"><span class="undefined">height: 100%;</span></span><br><span class="line"><span class="undefined">width: 0;</span></span><br><span class="line"><span class="undefined">vertical-align: middle;</span></span><br><span class="line"><span class="undefined">&#125;</span></span><br><span class="line"><span class="undefined"></span></span><br><span class="line"><span class="css"><span class="selector-class">.vertical-align</span>&gt;<span class="selector-tag">div</span> &#123;</span></span><br><span class="line"><span class="undefined">display: inline-block;</span></span><br><span class="line"><span class="undefined">vertical-align: middle;</span></span><br><span class="line"><span class="undefined">&#125;</span></span><br><span class="line"><span class="undefined"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"box vertical-align"</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span>1212</span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><blockquote><p>优点：文本和其它内联元素混排时，垂直居中效果好；兼容所有浏览器;<br>缺点：不支持多行；IE8以下需要添加一个额外的空标签（替代伪元素）才能达到最好效果；</p></blockquote><h2 id="flex-box-布局"><a href="#flex-box-布局" class="headerlink" title="flex-box 布局"></a>flex-box 布局</h2><p>css3 中新增的布局方式, 解决了很多css2布局中的痛点, 垂直居中只是小意思</p><div class="box flex"><br>    1111<br>    <div></div><br>    <div style="height:80px;"></div><br>    aaaaaaa<br>    <div></div><br>    <div></div><br></div><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></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="undefined"></span></span><br><span class="line"><span class="css"><span class="selector-class">.flex</span> &#123;</span></span><br><span class="line"><span class="undefined">display: flex;</span></span><br><span class="line"><span class="undefined">flex-wrap: wrap;</span></span><br><span class="line"><span class="undefined">justify-content: center;</span></span><br><span class="line"><span class="undefined">align-items: center;</span></span><br><span class="line"><span class="undefined">align-content: center;</span></span><br><span class="line"><span class="undefined">&#125;</span></span><br><span class="line"><span class="undefined"></span></span><br><span class="line"><span class="css"><span class="selector-class">.flex</span>&gt;<span class="selector-tag">div</span> &#123;</span></span><br><span class="line"><span class="undefined">width: 50px;</span></span><br><span class="line"><span class="undefined">height: 50px;</span></span><br><span class="line"><span class="undefined">margin: 5px;</span></span><br><span class="line"><span class="undefined">display: inline-flex;</span></span><br><span class="line"><span class="undefined">&#125;</span></span><br><span class="line"><span class="undefined"></span></span><br><span class="line"><span class="css"><span class="selector-class">.flex</span>&gt;<span class="selector-tag">div</span><span class="selector-pseudo">:hover</span> &#123;</span></span><br><span class="line"><span class="undefined">width: 60px;</span></span><br><span class="line"><span class="undefined">height: 60px;</span></span><br><span class="line"><span class="undefined">&#125;</span></span><br><span class="line"><span class="undefined"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"box flex"</span>&gt;</span></span><br><span class="line">1111</span><br><span class="line"><span class="tag">&lt;<span class="name">div</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">div</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">div</span> <span class="attr">style</span>=<span class="string">"height:80px;"</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">div</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">div</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">div</span>&gt;</span></span><br></pre></td></tr></table></figure><blockquote><p>优点：支持多行，flex布局是一种趋势，并有很多新特性；<br>缺点：IE10+才支持flex布局</p></blockquote><h2 id="grid-布局"><a href="#grid-布局" class="headerlink" title="grid 布局"></a>grid 布局</h2><p>一种网格思维的新布局方式, 垂直居中同样没问题, <code>grid</code> 还处于草案阶段</p><div class="box grid"><div></div></div><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></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="undefined"></span></span><br><span class="line"><span class="css"><span class="selector-class">.grid</span> &#123;</span></span><br><span class="line"><span class="undefined">display: grid;</span></span><br><span class="line"><span class="undefined">grid-template-columns: auto;</span></span><br><span class="line"><span class="undefined">grid-template-rows: auto;</span></span><br><span class="line"><span class="undefined">justify-items: center;</span></span><br><span class="line"><span class="undefined">align-items: center;</span></span><br><span class="line"><span class="undefined">&#125;</span></span><br><span class="line"><span class="undefined"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"box grid"</span>&gt;</span><span class="tag">&lt;<span class="name">div</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><blockquote><p>优点：支持多行，并有很多新特性；<br>缺点：兼容性差，<code>grid</code> 还处于草案阶段</p></blockquote><h1 id="脱离文档流"><a href="#脱离文档流" class="headerlink" title="脱离文档流"></a>脱离文档流</h1><p>这里只演示 <code>absolute</code> 定位的元素，同样适用 <code>fixed</code> 定位的元素</p><h2 id="margin负值"><a href="#margin负值" class="headerlink" title="margin负值"></a>margin负值</h2><div class="box absolute-margin"><div></div></div><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></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="undefined"></span></span><br><span class="line"><span class="css"><span class="selector-class">.absolute-margin</span>&gt;<span class="selector-tag">div</span> &#123;</span></span><br><span class="line"><span class="undefined">position: absolute;</span></span><br><span class="line"><span class="undefined">left: 50%;</span></span><br><span class="line"><span class="undefined">top: 50%;</span></span><br><span class="line"><span class="css"><span class="selector-tag">width</span><span class="selector-pseudo">:100px</span>;</span></span><br><span class="line"><span class="css"><span class="selector-tag">height</span><span class="selector-pseudo">:100px</span>;</span></span><br><span class="line"><span class="css"><span class="selector-tag">border</span><span class="selector-pseudo">:1px</span> <span class="selector-tag">solid</span> <span class="selector-id">#000</span>;</span></span><br><span class="line"><span class="undefined">margin-left: -51px;</span></span><br><span class="line"><span class="undefined">margin-top: -51px;</span></span><br><span class="line"><span class="undefined">&#125;</span></span><br><span class="line"><span class="undefined"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"box absolute-margin"</span>&gt;</span><span class="tag">&lt;<span class="name">div</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><blockquote><p>优点：兼容好；<br>缺点：元素需要固定尺寸；</p></blockquote><h2 id="CSS3移位法"><a href="#CSS3移位法" class="headerlink" title="CSS3移位法"></a>CSS3移位法</h2><div class="box absolute-translate"><div></div></div><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></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="undefined"></span></span><br><span class="line"><span class="css"><span class="selector-class">.absolute-translate</span>&gt;<span class="selector-tag">div</span> &#123;</span></span><br><span class="line"><span class="undefined">position: absolute;</span></span><br><span class="line"><span class="undefined">left: 50%;</span></span><br><span class="line"><span class="undefined">top: 50%;</span></span><br><span class="line"><span class="undefined">transform: translate(-50%, -50%);</span></span><br><span class="line"><span class="undefined">&#125;</span></span><br><span class="line"><span class="undefined"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"box absolute-translate"</span>&gt;</span><span class="tag">&lt;<span class="name">div</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><blockquote><p>优点：元素可以不定宽高；<br>缺点：用到CSS3；可能会碰到渲染模糊的情况；</p></blockquote><h2 id="margin-auto"><a href="#margin-auto" class="headerlink" title="margin auto"></a>margin auto</h2><p>普通块元素可以用 <code>margin: 0 auto;</code> 实现水平居中，现在用同样的原理来垂直居中，因为要配 <code>right</code> <code>bottom</code>，所以不支持IE6</p><div class="box absolute-auto"><div></div></div><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></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="undefined"></span></span><br><span class="line"><span class="css"><span class="selector-class">.absolute-auto</span>&gt;<span class="selector-tag">div</span> &#123;</span></span><br><span class="line"><span class="undefined">position: absolute;</span></span><br><span class="line"><span class="undefined">left: 0;</span></span><br><span class="line"><span class="undefined">right: 0;</span></span><br><span class="line"><span class="undefined">top: 0;</span></span><br><span class="line"><span class="undefined">bottom: 0;</span></span><br><span class="line"><span class="undefined">margin: auto;</span></span><br><span class="line"><span class="undefined">&#125;</span></span><br><span class="line"><span class="undefined"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"box absolute-auto"</span>&gt;</span><span class="tag">&lt;<span class="name">div</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><blockquote><p>优点：居中效果，兼容好；<br>缺点：需要标明尺寸，不支持被内容撑大的容器；极限情况下（元素比容器大时），元素不居中；</p></blockquote><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><table><thead><tr><th>方法</th><th>脱离文档流</th><th>多行支持</th><th>尺寸变化支持</th><th>兼容性</th><th>使用</th></tr></thead><tbody><tr><td>利用line-height</td><td>✘</td><td>✘</td><td>✔</td><td>all</td><td>常用</td></tr><tr><td>table</td><td>✘</td><td>✔</td><td>✔</td><td>all</td><td>不常用</td></tr><tr><td>vertical-align</td><td>✘</td><td>✔</td><td>✔</td><td>all</td><td><strong>推荐</strong></td></tr><tr><td>flex</td><td>flex流</td><td>✔</td><td>✔</td><td>IE10+</td><td><strong>推荐</strong></td></tr><tr><td>grid</td><td>grid流</td><td>✔</td><td>✔</td><td>IE10+</td><td>不推荐</td></tr><tr><td>margin负值</td><td>✔</td><td>✘</td><td>✘</td><td>all</td><td>常用</td></tr><tr><td>CSS3移位法</td><td>✔</td><td>✘</td><td>✔</td><td>IE9+</td><td>常用</td></tr><tr><td>margin auto</td><td>✔</td><td>✘</td><td>✔</td><td>IE7+</td><td><strong>推荐</strong></td></tr></tbody></table>]]></content>
    
    <summary type="html">
    
      CSS布局经常需要居中，水平居中还好，垂直居中稍显麻烦，这里只做总结了一些方法，仅供参考。
    
    </summary>
    
      <category term="常用整理" scheme="https://blog.whyoop.com/categories/%E5%B8%B8%E7%94%A8%E6%95%B4%E7%90%86/"/>
    
      <category term="前端" scheme="https://blog.whyoop.com/categories/%E5%B8%B8%E7%94%A8%E6%95%B4%E7%90%86/%E5%89%8D%E7%AB%AF/"/>
    
    
      <category term="垂直居中" scheme="https://blog.whyoop.com/tags/%E5%9E%82%E7%9B%B4%E5%B1%85%E4%B8%AD/"/>
    
      <category term="CSS" scheme="https://blog.whyoop.com/tags/CSS/"/>
    
  </entry>
  
  <entry>
    <title>git 制作增量包（差异包）</title>
    <link href="https://blog.whyoop.com/2017/09/28/git-%E5%88%B6%E4%BD%9C%E5%A2%9E%E9%87%8F%E5%8C%85%EF%BC%88%E5%B7%AE%E5%BC%82%E5%8C%85%EF%BC%89/"/>
    <id>https://blog.whyoop.com/2017/09/28/git-制作增量包（差异包）/</id>
    <published>2017-09-28T08:52:00.000Z</published>
    <updated>2019-06-24T11:55:46.819Z</updated>
    
    <content type="html"><![CDATA[<p>打增量包无非 “选文件”, “打包” 两个操作</p><h2 id="1-筛选差异文件"><a href="#1-筛选差异文件" class="headerlink" title="1.筛选差异文件"></a>1.筛选差异文件</h2><p><code>git</code> 比较差异当然是 <code>git diff</code> 命令了</p><p>语法如下：</p><figure class="highlight shell"><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">git diff [options] [&lt;commit&gt;] [--] [&lt;path&gt;…​]</span><br><span class="line">git diff [options] --cached [&lt;commit&gt;] [--] [&lt;path&gt;…​]</span><br><span class="line">git diff [options] &lt;commit&gt; &lt;commit&gt; [--] [&lt;path&gt;…​]</span><br><span class="line">git diff [options] &lt;blob&gt; &lt;blob&gt;</span><br><span class="line">git diff [options] [--no-index] [--] &lt;path&gt; &lt;path&gt;</span><br></pre></td></tr></table></figure><p>options 有这么一个参数</p><figure class="highlight shell"><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">--name-only  </span><br><span class="line">    Show only names of changed files.</span><br></pre></td></tr></table></figure><p>可以试一下, 比较本地 <code>master</code> 和 <code>origin/master</code> 的差异</p><figure class="highlight shell"><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="meta">&gt;</span><span class="bash"> git diff master origin/master --name-only</span></span><br><span class="line">wp/wp-content/themes/alcatel/csr.php</span><br><span class="line">wp/wp-content/themes/alcatel/service_privacy_policy.php</span><br></pre></td></tr></table></figure><p>OK 这就是我们需要的</p><h2 id="2-打包"><a href="#2-打包" class="headerlink" title="2.打包"></a>2.打包</h2><p>有了文件列表，打包就好办了</p><p><strong>用 <code>tar</code> 命令打包</strong></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&gt;</span><span class="bash"> tar -zcvf diff.tar.gz $(git diff master origin/master --name-only)</span></span><br></pre></td></tr></table></figure><p><strong>用 <code>zip</code> 命令打包</strong></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&gt;</span><span class="bash"> zip -q -r diff.zip $(git diff master origin/master --name-only)</span></span><br></pre></td></tr></table></figure><p><strong>用 <code>git archive</code> 命令打包</strong></p><blockquote><p>其实最实用的还是直接用git的归档命令打包<br>好处就是不需要额外东西 windows下的 <code>PowerShell</code> 和 <code>git bash</code> 也能用</p></blockquote><p><strong>语法</strong></p><figure class="highlight shell"><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">git archive [&lt;options&gt;] &lt;tree-ish&gt; [&lt;path&gt;...]</span><br><span class="line">git archive --list</span><br><span class="line">git archive --remote &lt;repo&gt; [--exec &lt;cmd&gt;] [&lt;options&gt;] &lt;tree-ish&gt; [&lt;path&gt;...]</span><br><span class="line">git archive --remote &lt;repo&gt; [--exec &lt;cmd&gt;] --list</span><br><span class="line">    </span><br><span class="line">    --format &lt;fmt&gt;        archive format</span><br><span class="line">    --prefix &lt;prefix&gt;     prepend prefix to each pathname in the archive</span><br><span class="line">    -o, --output &lt;file&gt;   write the archive to this file</span><br><span class="line">    --worktree-attributes</span><br><span class="line">                          read .gitattributes in working directory</span><br><span class="line">    -v, --verbose         report archived files on stderr</span><br><span class="line">    -0                    store only</span><br><span class="line">    -1                    compress faster</span><br><span class="line">    -9                    compress better</span><br><span class="line"></span><br><span class="line">    -l, --list            list supported archive formats</span><br><span class="line"></span><br><span class="line">    --remote &lt;repo&gt;       retrieve the archive from remote repository &lt;repo&gt;</span><br><span class="line">    --exec &lt;command&gt;      path to the remote git-upload-archive command</span><br></pre></td></tr></table></figure><blockquote><p><code>archive</code> 命令支持的打包格式可以用 <code>git archive -l</code> 查看<br>正常情况可以省略 <code>--format</code> ,<code>git</code>会根据输出的文件名判断格式 </p></blockquote><p>打包代码如下:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&gt;</span><span class="bash"> git archive -o diff.zip master $(git diff master origin/master --name-only)</span></span><br></pre></td></tr></table></figure><blockquote><p>linux 还可以用上管道符号</p></blockquote><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&gt;</span><span class="bash"> git archive master $(git diff master origin/master --name-only) | gzip &gt; diff.zip</span></span><br></pre></td></tr></table></figure><p><strong>注意:如果 <code>diff</code> 命令结果是空 <code>archive</code> 会打包整个项目</strong></p><h2 id="3-常用增量包命令"><a href="#3-常用增量包命令" class="headerlink" title="3.常用增量包命令"></a>3.常用增量包命令</h2><h3 id="当前分支与master差异包"><a href="#当前分支与master差异包" class="headerlink" title="当前分支与master差异包"></a>当前分支与master差异包</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&gt;</span><span class="bash"> git archive -o update.zip HEAD $(git diff master --name-only)</span></span><br></pre></td></tr></table></figure><h3 id="最后一次commit差异包"><a href="#最后一次commit差异包" class="headerlink" title="最后一次commit差异包"></a>最后一次commit差异包</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&gt;</span><span class="bash"> git archive -o lastcommit.zip HEAD $(git diff HEAD^ --name-only)</span></span><br></pre></td></tr></table></figure><h3 id="从-x-中提取-x-与-y-的差异文件打包"><a href="#从-x-中提取-x-与-y-的差异文件打包" class="headerlink" title="从 x 中提取 x 与 y 的差异文件打包."></a>从 <code>x</code> 中提取 <code>x</code> 与 <code>y</code> 的差异文件打包.</h3><blockquote><p><code>x</code> , <code>y</code> 可以是 分支, tag, commit</p></blockquote><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&gt;</span><span class="bash"> git archive -o x_y.zip x $(git diff x y --name-only)</span></span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      最近工作老是需要打增量包，借机会整理一下利用git命令打增量包的方法
    
    </summary>
    
      <category term="常用整理" scheme="https://blog.whyoop.com/categories/%E5%B8%B8%E7%94%A8%E6%95%B4%E7%90%86/"/>
    
      <category term="工具" scheme="https://blog.whyoop.com/categories/%E5%B8%B8%E7%94%A8%E6%95%B4%E7%90%86/%E5%B7%A5%E5%85%B7/"/>
    
    
      <category term="git" scheme="https://blog.whyoop.com/tags/git/"/>
    
  </entry>
  
  <entry>
    <title>fs-extra模块简要使用说明</title>
    <link href="https://blog.whyoop.com/2017/09/01/fs-extra%E7%AE%80%E8%A6%81%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E/"/>
    <id>https://blog.whyoop.com/2017/09/01/fs-extra简要使用说明/</id>
    <published>2017-09-01T07:47:19.000Z</published>
    <updated>2019-06-24T12:00:14.372Z</updated>
    
    <content type="html"><![CDATA[<p><code>fs-extra</code> 是一个nodejs操作文件的模块，它继承了<code>fs</code>的所有API，并进一步封装了<code>fs</code>的异步API，支持<code>promise</code>返回，还集成了很多常用操作.<br><a id="more"></a></p><h2 id="fs-extra-v4-x"><a href="#fs-extra-v4-x" class="headerlink" title="fs-extra v4.x"></a>fs-extra v4.x</h2><h3 id="异步"><a href="#异步" class="headerlink" title="异步"></a>异步</h3><p>异步方法不传<code>callback</code>,都将返回Promise对像；</p><h4 id="copy"><a href="#copy" class="headerlink" title="copy"></a><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/copy.md" target="_blank" rel="noopener">copy</a></h4><p><code>copy(src, dest, [options, callback])</code> 复制文件/文件夹</p><h4 id="emptyDir"><a href="#emptyDir" class="headerlink" title="emptyDir"></a><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/emptyDir.md" target="_blank" rel="noopener">emptyDir</a></h4><p><code>emptyDir(dir, [callback])</code> 清空一个目录(删除目录中的所有文件), 如果目录结构不存在则创建它</p><blockquote><p>别名: <code>emptydir()</code></p></blockquote><h4 id="ensureFile"><a href="#ensureFile" class="headerlink" title="ensureFile"></a><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/ensureFile.md" target="_blank" rel="noopener">ensureFile</a></h4><p><code>ensureFile(file, [callback])</code> 确保文件存在。 如果文件不存在，则创建目录结构及文件</p><blockquote><p>别名: <code>createFile()</code></p></blockquote><h4 id="ensureDir"><a href="#ensureDir" class="headerlink" title="ensureDir"></a><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/ensureDir.md" target="_blank" rel="noopener">ensureDir</a></h4><ul><li><code>ensureDir(dir, [callback])</code> 确保目录存在。 如果目录结构不存在，则创建它<blockquote><p>别名: <code>mkdirs()</code>, <code>mkdirp()</code></p></blockquote></li></ul><h4 id="ensureLink"><a href="#ensureLink" class="headerlink" title="ensureLink"></a><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/ensureLink.md" target="_blank" rel="noopener">ensureLink</a></h4><p><code>ensureLink(srcpath, dstpath, [callback])</code> 确保链接(dstpath)存在。如果不存在，则创建它 (硬链)</p><h4 id="ensureSymlink"><a href="#ensureSymlink" class="headerlink" title="ensureSymlink"></a><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/ensureSymlink.md" target="_blank" rel="noopener">ensureSymlink</a></h4><p><code>ensureSymlink(srcpath, dstpath, [type, callback])</code> 确保符号链接(dstpath)存在。如果不存在，则创建它 (硬键)</p><h4 id="mkdirs"><a href="#mkdirs" class="headerlink" title="mkdirs"></a><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/ensureDir.md" target="_blank" rel="noopener">mkdirs</a></h4><p>同 <code>ensureDir</code></p><h4 id="move"><a href="#move" class="headerlink" title="move"></a><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/move.md" target="_blank" rel="noopener">move</a></h4><p><code>move(src, dest, [options, callback])</code> 移动文件或目录，甚至跨设备。</p><h4 id="outputFile"><a href="#outputFile" class="headerlink" title="outputFile"></a><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/outputFile.md" target="_blank" rel="noopener">outputFile</a></h4><p><code>outputFile(file, data, [options, callback])</code> 相当 <code>fs.writeFile</code> 方法的增强版，会自动创建目录结构</p><h4 id="outputJson"><a href="#outputJson" class="headerlink" title="outputJson"></a><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/outputJson.md" target="_blank" rel="noopener">outputJson</a></h4><p><code>outputJson(file, object, [options, callback])</code> 类似 <code>outputFile</code> 但会自动把object转成JSON字符串输出到文件</p><blockquote><p>别名: <code>outputJSON()</code></p></blockquote><h4 id="pathExists"><a href="#pathExists" class="headerlink" title="pathExists"></a><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/pathExists.md" target="_blank" rel="noopener">pathExists</a></h4><p><code>pathExists(file[, callback])</code> 检查文件是否存在</p><h4 id="readJson"><a href="#readJson" class="headerlink" title="readJson"></a><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/readJson.md" target="_blank" rel="noopener">readJson</a></h4><p><code>readJson(file, [options, callback])</code> 读取一个JSON文件，并解析成对像。</p><blockquote><p>别名: <code>readJSON()</code></p></blockquote><h4 id="remove"><a href="#remove" class="headerlink" title="remove"></a><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/remove.md" target="_blank" rel="noopener">remove</a></h4><p><code>remove(path, [callback])</code> 删除一个文件或目录，会自动递归删除目录内的文件。</p><h4 id="writeJson"><a href="#writeJson" class="headerlink" title="writeJson"></a><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/writeJson.md" target="_blank" rel="noopener">writeJson</a></h4><p><code>writeJson(file, object, [options, callback])</code> 将对像序列化为JSON字符串写入文件。</p><h3 id="同步"><a href="#同步" class="headerlink" title="同步"></a>同步</h3><ul><li><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/copy-sync.md" target="_blank" rel="noopener">copySync</a></li><li><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/emptyDir-sync.md" target="_blank" rel="noopener">emptyDirSync</a></li><li><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/ensureFile-sync.md" target="_blank" rel="noopener">ensureFileSync</a></li><li><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/ensureDir-sync.md" target="_blank" rel="noopener">ensureDirSync</a></li><li><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/ensureLink-sync.md" target="_blank" rel="noopener">ensureLinkSync</a></li><li><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/ensureSymlink-sync.md" target="_blank" rel="noopener">ensureSymlinkSync</a></li><li><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/ensureDir-sync.md" target="_blank" rel="noopener">mkdirsSync</a></li><li><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/move-sync.md" target="_blank" rel="noopener">moveSync</a></li><li><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/outputFile-sync.md" target="_blank" rel="noopener">outputFileSync</a></li><li><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/outputJson-sync.md" target="_blank" rel="noopener">outputJsonSync</a></li><li><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/pathExists-sync.md" target="_blank" rel="noopener">pathExistsSync</a></li><li><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/readJson-sync.md" target="_blank" rel="noopener">readJsonSync</a></li><li><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/remove-sync.md" target="_blank" rel="noopener">removeSync</a></li><li><a href="https://github.com/jprichardson/node-fs-extra/blob/master/docs/writeJson-sync.md" target="_blank" rel="noopener">writeJsonSync</a></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;code&gt;fs-extra&lt;/code&gt; 是一个nodejs操作文件的模块，它继承了&lt;code&gt;fs&lt;/code&gt;的所有API，并进一步封装了&lt;code&gt;fs&lt;/code&gt;的异步API，支持&lt;code&gt;promise&lt;/code&gt;返回，还集成了很多常用操作.&lt;br&gt;
    
    </summary>
    
      <category term="常用整理" scheme="https://blog.whyoop.com/categories/%E5%B8%B8%E7%94%A8%E6%95%B4%E7%90%86/"/>
    
      <category term="api" scheme="https://blog.whyoop.com/categories/%E5%B8%B8%E7%94%A8%E6%95%B4%E7%90%86/api/"/>
    
    
      <category term="nodejs" scheme="https://blog.whyoop.com/tags/nodejs/"/>
    
  </entry>
  
  <entry>
    <title>git常用命令整理</title>
    <link href="https://blog.whyoop.com/2017/07/10/git%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%E6%95%B4%E7%90%86/"/>
    <id>https://blog.whyoop.com/2017/07/10/git常用命令整理/</id>
    <published>2017-07-10T11:12:41.000Z</published>
    <updated>2019-06-03T03:31:28.020Z</updated>
    
    <content type="html"><![CDATA[<h2 id="术语"><a href="#术语" class="headerlink" title="术语"></a>术语</h2><h3 id="三个基本区域"><a href="#三个基本区域" class="headerlink" title="三个基本区域"></a>三个基本区域</h3><p><code>Staged Snapshot</code> : <code>index</code> , <code>暂存区</code> , <code>索引</code><br><code>Working Directory</code> : <code>工作区</code><br><code>Commit History</code> : <code>commit 历史</code> , <code>版本库</code></p><h2 id="初始化-克隆"><a href="#初始化-克隆" class="headerlink" title="初始化/克隆"></a>初始化/克隆</h2><ul><li><code>git init</code> 初始化仓库</li><li><code>git clone &lt;git仓库地址/路径&gt;</code> 克隆</li></ul><h2 id="修改和提交"><a href="#修改和提交" class="headerlink" title="修改和提交"></a>修改和提交</h2><h3 id="查看文件状态-比较差异-加入暂存区"><a href="#查看文件状态-比较差异-加入暂存区" class="headerlink" title="查看文件状态/比较差异/加入暂存区"></a>查看文件状态/比较差异/加入暂存区</h3><ul><li><code>git status</code> 显示仓库状态</li><li><code>git status -s</code> 简要显示仓库的状态</li><li><p><code>git diff</code> 比较变动 默认比较工作区的变动</p><ul><li><code>git diff &lt;branch1&gt; &lt;branch2&gt;</code> 比较两个分支</li><li><code>git diff &lt;hash1&gt; &lt;hash2&gt;</code>     比较两个指定hash</li></ul></li><li><p><code>git rm &lt;file&gt;</code> 删除文件,并添加到暂存区</p><ul><li><code>-r &lt;folder&gt;</code> 删除文件夹,并添加到暂存区</li><li><code>--cached</code> 不真正删除文件，只将删除操作添加到暂存区</li></ul></li><li><p><code>git add</code> 将变动添加到暂存区</p><ul><li><code>git add &lt;path&gt;</code> 添加指定路径的所有变动到暂存区, 在仓库根路径下执行<code>git add .</code> == <code>git add --all</code> </li><li><code>git add -A</code> 添加所有变动到暂存区</li><li><code>git add -u</code> 添加修改(modified)和删除(deleted)文件,不包括新(new)的文件</li><li><code>git add -i</code> 交互式操作暂存区</li></ul></li></ul><h3 id="提交"><a href="#提交" class="headerlink" title="提交"></a>提交</h3><ul><li><code>git commit -m &#39;log&#39;</code> 提交暂存区的变动<ul><li><code>git commit -am &#39;log&#39;</code> 添加已经在版本库控制的文件变动到暂存区,并提交</li><li><code>git commit --amend</code> 修改最后一次commit (不会增加新的commit信息)</li></ul></li></ul><h2 id="分支"><a href="#分支" class="headerlink" title="分支"></a>分支</h2><h3 id="分支基本操作"><a href="#分支基本操作" class="headerlink" title="分支基本操作"></a>分支基本操作</h3><ul><li><code>git branch</code> 查看本地分支<ul><li><code>-r</code> 查看远程分支</li><li><code>-a</code> 查看所有分支</li><li><code>-m &lt;新分支名&gt;</code> 修改分支名</li><li><code>-d/-D &lt;分支名&gt;</code> 删除/强制删除 本地分支</li></ul></li><li><code>git branch &lt;分支名&gt;</code> 创建新分支 </li><li><code>git checkout &lt;分支名|Tag名&gt;</code> 切换到分支|Tag<ul><li><code>-b &lt;新分支名&gt;</code> 创建并切换到新分支  </li></ul></li></ul><h3 id="合并分支"><a href="#合并分支" class="headerlink" title="合并分支"></a>合并分支</h3><ul><li><code>git merge &lt;分支名&gt;</code> //把分支合并到本分支<ul><li><code>--squash</code>  不自动提交,用把分支的多个提交合成一个并添加到暂存区,需要手动commit。</li><li><code>--on-ff</code>  可以快速合并的情况也添加合并日志,要配合<code>-m</code>使用</li></ul></li><li><code>git rebase &lt;分支名&gt;</code> 衍和分支(分支衍合不会保留合并的日志，不留痕迹),相当于本地修改</li></ul><h3 id="提取commit"><a href="#提取commit" class="headerlink" title="提取commit"></a>提取commit</h3><ul><li><code>git cherry-pick &lt;commit hash&gt;</code> 将别的分支的一个commit拉到本分支</li></ul><h2 id="远程操作"><a href="#远程操作" class="headerlink" title="远程操作"></a>远程操作</h2><h2 id="源操作"><a href="#源操作" class="headerlink" title="源操作"></a>源操作</h2><ul><li><code>git remote -v</code> 显示更详细的源信息</li><li><code>git remote add &lt;origin name&gt; &lt;GIT URL&gt;</code> 增加源</li><li><code>git remote set-url &lt;origin name&gt; &lt;GIT URL&gt;</code> 修改源</li><li><code>git remote remove &lt;origin name&gt;</code> 删除源</li></ul><h3 id="关联-推送"><a href="#关联-推送" class="headerlink" title="关联 推送"></a>关联 推送</h3><p>关联分支后 <code>pull</code> , <code>push</code> 等命令操作当前分支可省略 <code>&lt;origin&gt;/&lt;brnach&gt;</code>.</p><ul><li><p><code>git branch --set-upstream-to &lt;brnach&gt; &lt;origin&gt;/&lt;brnach&gt;</code> 关联 本地与远程 分支  </p></li><li><p><code>git push -u &lt;origin&gt; &lt;brnach&gt;</code> 推送并关联</p></li><li><code>git push -f</code> 强制用本地分支覆盖远程分支, 慎用</li></ul><h3 id="删除远程分支"><a href="#删除远程分支" class="headerlink" title="删除远程分支"></a>删除远程分支</h3><ul><li><code>git push origin :&lt;brnach&gt;</code> 删除本地分支后, 把空分支推送到远程分支，以删除远程端分支</li><li><code>git push origin --delete &lt;brnach&gt;</code> 删除远程分支git 1.7版本后支持</li></ul><h3 id="更新-同步"><a href="#更新-同步" class="headerlink" title="更新/同步"></a>更新/同步</h3><ul><li><code>git fetch</code> 更新更程所有分支的信息,但不影响本地代码<ul><li><code>git fetch -all</code> 同步所有分支信息</li><li><code>git fetch -p</code> 同步分支信息,分同步远程仓库分支,tag删除情况</li></ul></li><li><code>git pull</code> 更新分支 <code>git pull == git fetch + git merge</code></li><li><code>git pull --rebase</code> rebase方式合并</li></ul><h2 id="Tag"><a href="#Tag" class="headerlink" title="Tag"></a>Tag</h2><ul><li><code>git tag &lt;tagname&gt;</code> 新建tag</li><li><code>git tag -a &lt;tagname&gt; -m &#39;说明&#39;</code> 新建带说明的完整tag</li><li><code>git tag -d &lt;tagname&gt;</code> 删除tag</li><li><code>git push --tags</code> 推送所有本地tag到远程仓库</li><li><code>git push origin --delete tag &lt;tagname&gt;</code> 删除远程端的tag 1.7</li><li><code>git tag --sort=&quot;version:refname&quot;</code> 按版本号排序显示tag</li><li><code>git tag --sort=&quot;version:refname&quot; -l &#39;*.*.*&#39;</code> 增加筛选</li></ul><hr><h2 id="常规提交流程"><a href="#常规提交流程" class="headerlink" title="常规提交流程"></a>常规提交流程</h2><ul><li><code>git status</code></li><li><code>git diff</code> 比较差异</li><li><code>git add 1.txt</code> 把文件添加到git的仓库管理系统中</li><li><code>git add &lt;文件夹&gt;</code> 把文件夹添加到git的仓库管理系统中</li><li><code>git add --all</code> 提交所有修改到暂存</li><li><code>git rm 1.txt</code> 把文件从git的仓库管理系统中移除</li><li><code>git rm -r myFolder</code> 把文件夹从git的仓库管理系统中移除</li><li><code>git commit -m &#39;说明&#39;</code> 提交到仓库(本地)</li><li><code>git push</code> 推送到仓库</li><li><code>git push &lt;主机名&gt; &lt;分支名&gt;</code> 推送到指定远程分支</li><li><code>git push -u &lt;主机名&gt; &lt;分支名&gt;</code> 推送并关联远程分支</li></ul><h2 id="简单提交流程"><a href="#简单提交流程" class="headerlink" title="简单提交流程"></a>简单提交流程</h2><ol><li><code>git pull</code> 同步远程仓库到本地(非必须,如果远程有更新)</li><li><code>git add --all &amp;&amp; git commit -m &#39;提交说明&#39;</code> 添加所有修改并提交,</li><li><code>git push</code> 推送到远程</li></ol><h2 id="日志"><a href="#日志" class="headerlink" title="日志"></a>日志</h2><ul><li><code>git log</code><ul><li><code>-p</code> 提交的祥细内容</li><li><code>-p &lt;file&gt;</code> 指定文件的提交日志</li><li><code>-n</code> 查看最后n次提交的信息</li><li><code>--oneline</code> 简要列出commit记录 </li></ul></li><li><code>git blame &lt;file&gt;</code> 以列表方式查看提交历史</li></ul><h3 id="撤消"><a href="#撤消" class="headerlink" title="撤消"></a>撤消</h3><ul><li><code>git reset &lt;commit id&gt;</code> 清理暂存区，移动当分支的游标(HEAD)</li><li><code>git reset HEAD &lt;file&gt;...</code> 把暂存区的文件移出</li><li><code>git checkout &lt;path&gt;</code> 重新检出文件 (d)</li><li><p><code>git clean</code> 删除新增,还未add的文件</p><ul><li><code>-n</code>  预览要删除的文件和目录</li><li><code>-f</code>  删除 文件，</li><li><code>-df</code> 删除 文件 和 目录</li></ul></li><li><p><code>git reset --hard</code> 还原所有文件修改到HEAD</p></li><li><code>git reset --hard &lt;哈希值&gt;</code> 回退到指定版本 </li><li><code>git reset --hard HEAD^</code> 回退到上一个commit</li><li><code>git reset --hard HEAD~2</code> 放弃本地所有修改，回退到上上个commit</li><li><code>git reset --hard HEAD@{1}</code> 放弃本地所有修改，回退到HEAD前一次指向的commit <ul><li><code>git reflog</code> 显示 HEAD 移动路径</li></ul></li><li><code>git reset --hard ORIG_HEAD</code> 放弃本地所有修改，回退到上一次(合并等)操作前的版本</li></ul><ul><li><code>git revert &lt;commit id&gt;</code>  用一个新commit撤销commit操作，此次操作之前的commit都会被保留</li></ul><h2 id="本地跟踪忽略"><a href="#本地跟踪忽略" class="headerlink" title="本地跟踪忽略"></a>本地跟踪忽略</h2><ul><li><code>git update-index --assume-unchanged &lt;path&gt;</code>  忽略跟踪</li><li><code>git update-index --no-assume-unchanged &lt;path&gt;</code>  恢复跟踪</li></ul><h2 id="列出文件状态"><a href="#列出文件状态" class="headerlink" title="列出文件状态"></a>列出文件状态</h2><ul><li><code>git ls-files</code> 列出所有已缓存的文件<ul><li><code>-v</code> 用小写显示被<code>assume-unchanged</code>的文件</li></ul></li></ul><h2 id="嵌套仓库"><a href="#嵌套仓库" class="headerlink" title="嵌套仓库"></a>嵌套仓库</h2><ul><li><code>git submodule add &lt;仓库地址&gt; &lt;路径&gt;</code> 添加嵌套仓库</li><li><code>git submodule init</code> 初始化嵌套仓库</li><li><code>git submodule update</code> 更新嵌套仓库</li></ul><hr><h2 id="保存当前状态"><a href="#保存当前状态" class="headerlink" title="保存当前状态"></a>保存当前状态</h2><ul><li><code>git stash</code> 备份当前的工作区的内容，从最近的一次提交中读取相关内容，让工作区保证和上次提交的内容一致。同时，将当前的工作区内容保存到Git栈中。 可多次git stash</li><li><code>git stash pop</code> 从Git栈中读取最近一次保存的内容，恢复工作区的相关内容。</li><li><code>git stash pop stash@{num}</code> 如果有多个工作现场，num是工作现场的编号。使用pop命令恢复的工作现场，其对应的stash 在队列中删除。</li><li><code>git stash apply stash@{num}</code> 除了不在stash队列中删除外其他和<code>git stash pop</code>完全一样。</li><li><code>git stash list</code> 显示Git栈内的所有备份，可以利用这个列表来决定从那个地方恢复。</li><li><code>git stash clear</code> 清空Git栈。 </li></ul><h2 id="取消版本控制"><a href="#取消版本控制" class="headerlink" title="取消版本控制"></a>取消版本控制</h2><ul><li><code>git rm -r -n --cached &lt;path&gt;</code></li></ul><h2 id="git设置"><a href="#git设置" class="headerlink" title="git设置"></a>git设置</h2><ul><li><code>git config --global push.default current</code></li><li><code>git config --global pull.default current</code></li></ul>]]></content>
    
    <summary type="html">
    
      记录一些git的常用操作
    
    </summary>
    
      <category term="常用整理" scheme="https://blog.whyoop.com/categories/%E5%B8%B8%E7%94%A8%E6%95%B4%E7%90%86/"/>
    
      <category term="工具" scheme="https://blog.whyoop.com/categories/%E5%B8%B8%E7%94%A8%E6%95%B4%E7%90%86/%E5%B7%A5%E5%85%B7/"/>
    
    
      <category term="git" scheme="https://blog.whyoop.com/tags/git/"/>
    
  </entry>
  
  <entry>
    <title>mysql常用命令</title>
    <link href="https://blog.whyoop.com/2017/07/10/mysql%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/"/>
    <id>https://blog.whyoop.com/2017/07/10/mysql常用命令/</id>
    <published>2017-07-10T11:07:09.000Z</published>
    <updated>2019-06-24T11:54:36.401Z</updated>
    
    <content type="html"><![CDATA[<h2 id="mysql命令登录"><a href="#mysql命令登录" class="headerlink" title="mysql命令登录"></a>mysql命令登录</h2><p><code>&gt; mysql -uroot</code><br><code>&gt; mysql -h127.0.0.1 -P3306 -uUsername -pPassword</code></p><h3 id="常用参数"><a href="#常用参数" class="headerlink" title="常用参数"></a>常用参数</h3><ul><li><code>-u</code> 用户名</li><li><code>-p</code> 密码</li><li><code>-h</code> 服务器ip/域名</li><li><code>-P</code> 端口,默认3306</li></ul><h2 id="常用查看命令"><a href="#常用查看命令" class="headerlink" title="常用查看命令"></a>常用查看命令</h2><ul><li><code>status;</code> –显示当前状态</li><li><code>show databases;</code> –显示所有数据库</li><li><code>select database();</code> –当前使用的数据库</li><li><code>use databaseName;</code> –更换使用的数据库</li><li><code>show tables;</code> –显示当前数据库的表</li><li><code>show tables from databaseName;</code> –显示指定数据库的表</li><li><code>desc tableName;</code> –显示表结构</li></ul><h2 id="用户-权限-操作"><a href="#用户-权限-操作" class="headerlink" title="用户/权限 操作"></a>用户/权限 操作</h2><p><code>use mysql;</code></p><blockquote><p>先进入<code>mysql</code>数据库方便操作  </p></blockquote><h3 id="用户"><a href="#用户" class="headerlink" title="用户"></a>用户</h3><h4 id="查看用户"><a href="#查看用户" class="headerlink" title="查看用户"></a>查看用户</h4><p><code>select host,user,password from user;</code></p><blockquote><p>显示<code>user</code>表的<code>host,user,password</code>列</p></blockquote><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><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><br><span class="line">| host                  | user | password                                  |</span><br><span class="line">+-----------------------+------+-------------------------------------------+</span><br><span class="line">| localhost             | root |                                           |</span><br><span class="line">| localhost.localdomain | root |                                           |</span><br><span class="line">| 127.0.0.1             | root |                                           |</span><br><span class="line">| localhost             |      |                                           |</span><br><span class="line">| localhost.localdomain |      |                                           |</span><br><span class="line">| %                     | jira | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |</span><br><span class="line">| localhost             | jira |                                           |</span><br><span class="line">+-----------------------+------+-------------------------------------------+</span><br></pre></td></tr></table></figure><h4 id="添加用户"><a href="#添加用户" class="headerlink" title="添加用户"></a>添加用户</h4><p><code>create user new_user IDENTIFIED by &#39;xxxxx&#39;;</code></p><blockquote><p>identified by 会将纯文本密码加密作为散列值存储<br>默认创建的是远程用户<code>new_user@&#39;%&#39;</code><br><code>%</code> 通配所有IP,<code>localhost</code>不是IP</p></blockquote><p><code>create user new_user@localhost;</code> </p><blockquote><p>创建指定本地用户</p></blockquote><h4 id="修改用户"><a href="#修改用户" class="headerlink" title="修改用户"></a>修改用户</h4><p><code>RENAME USER old_user TO new_user;</code><br><code>RENAME USER &#39;jeffrey&#39;@&#39;localhost&#39; TO &#39;jeff&#39;@&#39;127.0.0.1&#39;;</code></p><blockquote><p>mysql 5之后可以使用，之前需要使用<code>update</code>更新<code>user</code>表</p></blockquote><h4 id="更改密码"><a href="#更改密码" class="headerlink" title="更改密码"></a>更改密码</h4><p><code>set password for root=password(&#39;xxxxxx&#39;);</code><br><code>set password for root@&#39;%&#39;=password(&#39;xxxxxx&#39;);</code><br><code>update mysql.user set password=password(&#39;xxxx&#39;) where user=&#39;root&#39;;</code></p><blockquote><p>改可以直接修改user表中的记录</p></blockquote><h4 id="删除用户"><a href="#删除用户" class="headerlink" title="删除用户"></a>删除用户</h4><p><code>drop user newuser;</code></p><blockquote><p>mysql5之前删除用户时必须先使用revoke 删除用户权限，然后删除用户，mysql5之后drop 命令可以删除用户的同时删除用户的相关权限</p></blockquote><h3 id="权限"><a href="#权限" class="headerlink" title="权限"></a>权限</h3><h4 id="常用权限说明"><a href="#常用权限说明" class="headerlink" title="常用权限说明"></a>常用权限说明</h4><ul><li><code>all</code> 所有权限;</li><li><code>select</code> , <code>update</code> , <code>delete</code> , <code>insert</code> 普通表操作权限</li><li><code>create</code> , <code>alter</code> , <code>drop</code> 创建、修改、删除 数据表结构权限</li><li><code>references</code> 外键权限 </li><li><code>create temporary</code> 临时表权限</li><li><code>index</code> 索引权限</li><li><code>create view</code> , <code>show view</code> 创建、查看视图权限</li><li><code>create routine</code> , <code>alter routine</code> , <code>execute</code> 创建,更改,执行存储过程权限</li><li><code>lock tables</code> 锁表</li><li><code>create user</code> 创建用户 </li></ul><h4 id="常用角色权限"><a href="#常用角色权限" class="headerlink" title="常用角色权限"></a>常用角色权限</h4><ul><li>普通用户 <code>grant select, insert, update, delete on testdb.* to test_user@&#39;%&#39;</code></li><li>普通开发人员 <code>grant all on testdb to dev@localhost</code></li><li>DBA <code>grant all on *.* to dba@localhost</code></li></ul><h4 id="查看用户权限"><a href="#查看用户权限" class="headerlink" title="查看用户权限"></a>查看用户权限</h4><p><code>show grants for jira;</code>  </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><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">+-----------------------------------------------------------------------------------------------------+</span><br><span class="line">| Grants for jira@%                                                                                   |</span><br><span class="line">+-----------------------------------------------------------------------------------------------------+</span><br><span class="line">| GRANT USAGE ON *.* TO &apos;jira&apos;@&apos;%&apos; IDENTIFIED BY PASSWORD &apos;*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9&apos; |</span><br><span class="line">| GRANT ALL PRIVILEGES ON `jira`.* TO &apos;jira&apos;@&apos;%&apos;                                                      |</span><br><span class="line">+-----------------------------------------------------------------------------------------------------+</span><br></pre></td></tr></table></figure><h4 id="赋予权限"><a href="#赋予权限" class="headerlink" title="赋予权限"></a>赋予权限</h4><p><code>grant select ON dmc_db.* TO zx_root;</code><br><code>grant all ON dmc_db.* TO zx_root;</code></p><h4 id="回收权限"><a href="#回收权限" class="headerlink" title="回收权限"></a>回收权限</h4><p><code>revoke select on dmc_db.*  from zx_root;</code></p><h4 id="更新权限缓存"><a href="#更新权限缓存" class="headerlink" title="更新权限缓存"></a>更新权限缓存</h4><p><code>flush  privileges ;</code></p><blockquote><p>修改权限后,立即生效(更新权限缓存)</p></blockquote>]]></content>
    
    <summary type="html">
    
      mysql 常用操作命令,如用户管理,权限管理等.
    
    </summary>
    
      <category term="常用整理" scheme="https://blog.whyoop.com/categories/%E5%B8%B8%E7%94%A8%E6%95%B4%E7%90%86/"/>
    
      <category term="数据库" scheme="https://blog.whyoop.com/categories/%E5%B8%B8%E7%94%A8%E6%95%B4%E7%90%86/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    
    
      <category term="mysql" scheme="https://blog.whyoop.com/tags/mysql/"/>
    
  </entry>
  
  <entry>
    <title>Hexo开启置顶功能</title>
    <link href="https://blog.whyoop.com/2017/06/07/Hexo%E5%BC%80%E5%90%AF%E7%BD%AE%E9%A1%B6%E5%8A%9F%E8%83%BD/"/>
    <id>https://blog.whyoop.com/2017/06/07/Hexo开启置顶功能/</id>
    <published>2017-06-07T11:23:39.000Z</published>
    <updated>2017-07-10T11:04:22.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="配置Hexo的-config-yml"><a href="#配置Hexo的-config-yml" class="headerlink" title="配置Hexo的_config.yml"></a>配置Hexo的_config.yml</h2><blockquote><p><code>index_generator</code> &gt; <code>order_by</code> 改为 <code>-top -date</code></p></blockquote><figure class="highlight yml"><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="attr">index_generator:</span></span><br><span class="line">  <span class="comment"># path: ''</span></span><br><span class="line">  <span class="comment"># per_page: 10</span></span><br><span class="line"><span class="attr">  order_by:</span> <span class="bullet">-top</span> <span class="bullet">-date</span></span><br></pre></td></tr></table></figure><h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><p>在文章的<code>front-matter</code>中增加<code>top</code>值, <code>top</code>值越大越靠前;</p><figure class="highlight md"><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><br><span class="line">title: 置顶文章</span><br><span class="line">date: 2017-06-07 19:23:39</span><br><span class="line">tags:</span><br><span class="line">categories:</span><br><span class="line">top: 100</span><br><span class="line">---</span><br><span class="line"><span class="section">## 置顶文章</span></span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;配置Hexo的-config-yml&quot;&gt;&lt;a href=&quot;#配置Hexo的-config-yml&quot; class=&quot;headerlink&quot; title=&quot;配置Hexo的_config.yml&quot;&gt;&lt;/a&gt;配置Hexo的_config.yml&lt;/h2&gt;&lt;blockquo
      
    
    </summary>
    
      <category term="Hexo" scheme="https://blog.whyoop.com/categories/Hexo/"/>
    
    
      <category term="Hexo" scheme="https://blog.whyoop.com/tags/Hexo/"/>
    
  </entry>
  
  <entry>
    <title>Hexo开启RSS</title>
    <link href="https://blog.whyoop.com/2017/06/07/Hexo%E5%BC%80%E5%90%AFRSS/"/>
    <id>https://blog.whyoop.com/2017/06/07/Hexo开启RSS/</id>
    <published>2017-06-07T11:15:05.000Z</published>
    <updated>2017-07-21T07:54:35.000Z</updated>
    
    <content type="html"><![CDATA[<p>开启Hexo可以用插件<code>hexo-generator-feed</code></p><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-generator-feed --save</span><br></pre></td></tr></table></figure><h3 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h3><p>hexo的_config.yml文件中，添加feed配置</p><figure class="highlight yml"><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="attr">feed:</span> </span><br><span class="line">  <span class="comment">#feed 类型 (atom/rss2)</span></span><br><span class="line"><span class="attr">  type:</span> <span class="string">atom</span>   </span><br><span class="line">  <span class="comment">#rss 路径</span></span><br><span class="line"><span class="attr">  path:</span> <span class="string">/atom.xml</span>  </span><br><span class="line">  <span class="comment">#在 rss 中最多生成的文章数(0显示所有)</span></span><br><span class="line"><span class="attr">  limit:</span> <span class="number">10</span></span><br></pre></td></tr></table></figure><p>在主题目的_config.yml文件中，添加RSS配置<br><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">rss:</span> <span class="string">/atom.xml</span></span><br></pre></td></tr></table></figure></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;开启Hexo可以用插件&lt;code&gt;hexo-generator-feed&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&quot;安装&quot;&gt;&lt;a href=&quot;#安装&quot; class=&quot;headerlink&quot; title=&quot;安装&quot;&gt;&lt;/a&gt;安装&lt;/h2&gt;&lt;figure class=&quot;highlig
      
    
    </summary>
    
      <category term="Hexo" scheme="https://blog.whyoop.com/categories/Hexo/"/>
    
    
      <category term="Hexo" scheme="https://blog.whyoop.com/tags/Hexo/"/>
    
      <category term="RSS" scheme="https://blog.whyoop.com/tags/RSS/"/>
    
  </entry>
  
  <entry>
    <title>hello word</title>
    <link href="https://blog.whyoop.com/2017/06/02/hello-word/"/>
    <id>https://blog.whyoop.com/2017/06/02/hello-word/</id>
    <published>2017-06-02T08:51:02.000Z</published>
    <updated>2017-07-21T07:54:21.000Z</updated>
    
    <content type="html"><![CDATA[<p><code>&lt;!--more--&gt;</code>之前的内容,里的内容会在首页显示, 如果设置了 <code>description</code> 则会优先使用 description<br><a id="more"></a></p><h1 id="H1"><a href="#H1" class="headerlink" title="H1"></a>H1</h1><h2 id="H2"><a href="#H2" class="headerlink" title="H2"></a>H2</h2><h3 id="H3"><a href="#H3" class="headerlink" title="H3"></a>H3</h3><h4 id="H4"><a href="#H4" class="headerlink" title="H4"></a>H4</h4><p>普通文本 , <em>斜体</em> , <strong>加粗</strong> , <code>行内代码</code> , <a href="#">连接</a></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="comment">//代码块</span></span><br><span class="line"><span class="keyword">var</span> abc = <span class="number">123</span>;</span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">fn</span>(<span class="params">x</span>)</span>&#123;</span><br><span class="line"><span class="keyword">return</span> x;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><blockquote><p>!引用</p></blockquote><blockquote class="blockquote-center"><p>居中引用</p></blockquote><div class="note class_name">            <p>Content (md partial supported) </p>          </div><ul><li>列表1</li><li>列表2</li><li>列表3<ul><li>列表3-1</li><li>列表3-2</li></ul></li><li>列表4</li></ul><ol><li>列表1</li><li>列表2</li><li>列表3<ol><li>列表3-1</li><li>列表3-2</li></ol></li><li>列表4</li></ol>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;code&gt;&amp;lt;!--more--&amp;gt;&lt;/code&gt;之前的内容,里的内容会在首页显示, 如果设置了 &lt;code&gt;description&lt;/code&gt; 则会优先使用 description&lt;br&gt;
    
    </summary>
    
      <category term="Hexo" scheme="https://blog.whyoop.com/categories/Hexo/"/>
    
    
      <category term="Hexo" scheme="https://blog.whyoop.com/tags/Hexo/"/>
    
      <category term="test" scheme="https://blog.whyoop.com/tags/test/"/>
    
  </entry>
  
</feed>
