<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>tanglijun&#39;s blog</title>
  
  
  <link href="https://tanglj.cn/atom.xml" rel="self"/>
  
  <link href="https://tanglj.cn/"/>
  <updated>2025-03-09T10:21:52.735Z</updated>
  <id>https://tanglj.cn/</id>
  
  <author>
    <name>tanglijun</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>vue 与 react 之间的对比</title>
    <link href="https://tanglj.cn/2021/04/10/vue-react-comparison/"/>
    <id>https://tanglj.cn/2021/04/10/vue-react-comparison/</id>
    <published>2021-04-10T11:44:43.000Z</published>
    <updated>2025-03-09T10:21:52.735Z</updated>
    
    <content type="html"><![CDATA[<p>vue 和 react 是前端主流的两款框架，文本主要来聊聊他们之间的共同点和不同点</p><a id="more"></a><h3 id="共同点"><a href="#共同点" class="headerlink" title="共同点"></a>共同点</h3><ul><li>使用 Virtual DOM</li><li>提供了响应式（Reactive）和组件化（Composable）的视图组件</li><li>将注意力集中保持在核心库，而将其他功能如路由和全局状态管理交给相关的库</li></ul><h3 id="不同点"><a href="#不同点" class="headerlink" title="不同点"></a>不同点</h3><h4 id="渲染优化"><a href="#渲染优化" class="headerlink" title="渲染优化"></a>渲染优化</h4><p>react 组件的状态发生变化时会以该组件为根重新渲染整个组件子树。一般为了避免不必要的子组件的重新渲染，需要使用 <code>PureComponent</code> 或者手动实现 <code>shouldComponentUpdate</code> 方法</p><p>vue 组件的依赖是在渲染过程中自动追踪的，所以系统能精确知晓哪个组件确实需要被重新渲染</p><p>vue 相比 react 在渲染优化方面开发者无需有过多的考虑</p><h4 id="HTML-amp-CSS"><a href="#HTML-amp-CSS" class="headerlink" title="HTML &amp; CSS"></a>HTML &amp; CSS</h4><p>react 中一切都是 javascript，HTML 也好、CSS 也好都可以在 javascript 中处理</p><p>vue 的整体思想是拥抱经典的 web 技术，并进行相应扩展</p><h4 id="JSX-vs-Templates"><a href="#JSX-vs-Templates" class="headerlink" title="JSX vs Templates"></a>JSX vs Templates</h4><p>react 中使用 JSX（一种使用 XML 语法编写 javascript 的语法糖），JSX 的优势如下</p><ul><li>可以使用完整的 javascript 语言来构建视图页面，例如变量、流程控制、作用域等</li><li>开发工具对 JSX 的支持较 vue 模版更成熟（例如 linting、类型检查、自动补充等）</li></ul><p>vue 默认推荐使用模版（vue 本身提供了渲染函数，甚至支持 JSX），使用 vue 模版的优势如下</p><ul><li>对于习惯 HTML 的开发者，vue 模版比 JSX 读写更自然。虽然这有主观偏好的因素，但如果这种差异能导致开发效率的提升，那么它就有客观的价值存在</li><li>基于 HTML 的模版使得将已有的应用逐步迁移到 vue 更加容易</li><li>对于设计师以及刚入门的开发者能够更容易的理解和参与到项目中</li><li>vue 模版支持第三方的模版预处理器（例如 pug、ejs）</li></ul><p>vue 官方认为组件有两类：</p><ul><li>偏视图表现的（presentational）</li><li>偏逻辑的（logical）</li></ul><p>对于偏视图表现的组件推荐使用模版，对于偏逻辑的组件推荐使用 JSX 或渲染函数，总的来看表现类组件是要多余逻辑类组件的</p><h4 id="组件作用域内的-css"><a href="#组件作用域内的-css" class="headerlink" title="组件作用域内的 css"></a>组件作用域内的 css</h4><p>react 通过 css-in-js 实现 css 作用域，vue 是通过 style 标签</p><p>相比之下 vue 的方式更加自然和灵活</p><h4 id="向上扩展"><a href="#向上扩展" class="headerlink" title="向上扩展"></a>向上扩展</h4><p>vue 和 react 都提供了强大的路由来应对大型应用。react 有 flux、redux，vue 有 vuex（vue 也可以很容易集成 redux）</p><p>vue 的路由库和状态管理库都是由官方维护支持并且与核心库同步更新的。react 则把这些问题交给社区维护，因此创建了一个更分散的生态系统。这也使得 react 的生态系统比 vue 更繁荣</p><p>vue 提供了 vue-cli 工具，可以通过交互式的脚手架引导快速构建项目。react 提供了 create-react-app，由于两者设计理念之间的差异而存在一些局限性</p><ul><li>它不允许在项目生成时进行任何配置，而 vue-cli 运行于可升级的运行时依赖之上，该运行时可以通过插件进行扩展</li><li>它只提供一个构建单页面应用的默认选项，而 vue 提供了各种用途的模版</li><li>它不能用用户自建的预设配置构建项目，这对企业环境下预先建立约定是特别有用的</li></ul><h4 id="向下扩展"><a href="#向下扩展" class="headerlink" title="向下扩展"></a>向下扩展</h4><p>react 学习曲线陡峭，在学习 react 之前需要了解 JSX、ES2015、构建系统。vue 向上扩展好比 react，向下扩展类似 jQuery，只需要引入</p><pre class=" language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>https://cdn.jsdelivr.net/npm/vue<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script language-javascript"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></code></pre><p>vue 在起步阶段无需学习 JSX、ES2015 和构建系统，所以开发者可以快速上手</p><h4 id="原生渲染"><a href="#原生渲染" class="headerlink" title="原生渲染"></a>原生渲染</h4><p>react 方面对于原生 app（ios 和 android）可以用 react native。vue 则是和 weex 合作来开发原生 ios 和 android app，单从成熟度来说 react native 要胜过 weex</p><h4 id="mobx"><a href="#mobx" class="headerlink" title="mobx"></a>mobx</h4><p>mobx 在 react 社区很流行，而 vue 实际上也采用了几乎相同的反映系统。react + mobx 也可看作是更繁琐的 vue</p><h4 id="preact-和其他类-react-库"><a href="#preact-和其他类-react-库" class="headerlink" title="preact 和其他类 react 库"></a>preact 和其他类 react 库</h4><p>类 react 库往往尽可能地与 react 共享 api 和生态，因此上述比较对它们同样适用。它们与 react 的不同在于更小的生态，由于无法 100% 兼容 react 生态中的全部，一些工具和辅助库可能无法使用，或多或少会出现兼容问题</p><h3 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h3><ul><li><a href="https://cn.vuejs.org/v2/guide/comparison.html" target="_blank" rel="noopener">https://cn.vuejs.org/v2/guide/comparison.html</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;vue 和 react 是前端主流的两款框架，文本主要来聊聊他们之间的共同点和不同点&lt;/p&gt;</summary>
    
    
    
    <category term="architect" scheme="https://tanglj.cn/categories/architect/"/>
    
    
    <category term="vue" scheme="https://tanglj.cn/tags/vue/"/>
    
    <category term="react" scheme="https://tanglj.cn/tags/react/"/>
    
  </entry>
  
  <entry>
    <title>CSS 处理文本溢出</title>
    <link href="https://tanglj.cn/2020/02/24/how-to-handle-text-overflow-with-css/"/>
    <id>https://tanglj.cn/2020/02/24/how-to-handle-text-overflow-with-css/</id>
    <published>2020-02-24T10:04:23.000Z</published>
    <updated>2025-03-09T10:21:52.464Z</updated>
    
    <content type="html"><![CDATA[<p>日常开发中，我们经常会遇到文本超出容器的情况。通常我们会考虑限制文字字数，通过 JS 截取指定字符数，当然也可以通过 CSS 来处理文本溢出。</p><a id="more"></a><h1 id="单行文本溢出"><a href="#单行文本溢出" class="headerlink" title="单行文本溢出"></a>单行文本溢出</h1><p>相关样式</p><pre class=" language-css"><code class="language-css"><span class="token selector">p </span><span class="token punctuation">{</span>  <span class="token property">white-space</span><span class="token punctuation">:</span> nowrap<span class="token punctuation">;</span>  <span class="token property">overflow</span><span class="token punctuation">:</span> hidden<span class="token punctuation">;</span>  <span class="token property">text-overflow</span><span class="token punctuation">:</span> ellipsis<span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><p>效果演示：</p><div style="padding-right:20px;padding-left:20px;border:1px solid #eee"><p style="overflow:hidden;text-overflow:ellipsis;white-space:nowrap">那时我懂了，我们尽管是再合适不过的旅伴，但归根结蒂仍不过是描绘各自轨迹的两个孤独的金属块儿。远看如流星一般美丽，而实际上我们不外乎是被幽禁在里面的、哪里也去不了的囚徒。当两颗卫星的轨道偶尔交叉时，我们便这样相会了。也可能两颗心相碰，但不过一瞬之间。下一瞬间就重新陷入绝对的孤独中。总有一天会化为灰烬。</p></div><h1 id="多行文本溢出"><a href="#多行文本溢出" class="headerlink" title="多行文本溢出"></a>多行文本溢出</h1><p>相关样式</p><pre class=" language-css"><code class="language-css"><span class="token selector">p </span><span class="token punctuation">{</span>  <span class="token property">display</span><span class="token punctuation">:</span> -webkit-box<span class="token punctuation">;</span>  <span class="token property">-webkit-box-orient</span><span class="token punctuation">:</span> vertical<span class="token punctuation">;</span>  <span class="token property">-webkit-line-clamp</span><span class="token punctuation">:</span> <span class="token number">2</span><span class="token punctuation">;</span>  <span class="token property">overflow</span><span class="token punctuation">:</span> hidden<span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><p>效果演示：</p><div style="width:100%;padding-right:20px;padding-left:20px;border:1px solid #eee"><p style="display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden">那时我懂了，我们尽管是再合适不过的旅伴，但归根结蒂仍不过是描绘各自轨迹的两个孤独的金属块儿。远看如流星一般美丽，而实际上我们不外乎是被幽禁在里面的、哪里也去不了的囚徒。当两颗卫星的轨道偶尔交叉时，我们便这样相会了。也可能两颗心相碰，但不过一瞬之间。下一瞬间就重新陷入绝对的孤独中。总有一天会化为灰烬。</p></div><h1 id="兼容-IE"><a href="#兼容-IE" class="headerlink" title="兼容 IE"></a>兼容 IE</h1><p>相关样式</p><pre class=" language-css"><code class="language-css"><span class="token selector">p </span><span class="token punctuation">{</span>  <span class="token property">position</span><span class="token punctuation">:</span> relative<span class="token punctuation">;</span>  <span class="token property">line-height</span><span class="token punctuation">:</span> <span class="token number">1.4</span>em<span class="token punctuation">;</span>  <span class="token property">height</span><span class="token punctuation">:</span> <span class="token number">2.8</span>em<span class="token punctuation">;</span>  <span class="token property">overflow</span><span class="token punctuation">:</span> hidden<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token selector">p > span </span><span class="token punctuation">{</span>  <span class="token property">position</span><span class="token punctuation">:</span> <span class="token property">absolute</span><span class="token punctuation">:</span>  <span class="token property">right</span><span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">;</span>  <span class="token property">bottom</span><span class="token punctuation">:</span> <span class="token number">0</span><span class="token punctuation">;</span>  <span class="token property">display</span><span class="token punctuation">:</span> block<span class="token punctuation">;</span>  <span class="token property">padding-left</span><span class="token punctuation">:</span> <span class="token number">40</span>px<span class="token punctuation">;</span>  <span class="token property">background-image</span><span class="token punctuation">:</span> <span class="token url">url('./ellipsis.png')</span><span class="token punctuation">;</span>  <span class="token property">background-size</span><span class="token punctuation">:</span> cover<span class="token punctuation">;</span>  <span class="token property">background-position</span><span class="token punctuation">:</span> center<span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><blockquote><p>注意：行高与高度的比例；span 元素需要一个渐变背景图片过渡。</p></blockquote><p>效果演示：</p><div style="width:100%;padding-right:20px;padding-left:20px;border:1px solid #eee"><p style="position:relative;line-height:1.4em;height:2.8em;overflow:hidden">那时我懂了，我们尽管是再合适不过的旅伴，但归根结蒂仍不过是描绘各自轨迹的两个孤独的金属块儿。远看如流星一般美丽，而实际上我们不外乎是被幽禁在里面的、哪里也去不了的囚徒。当两颗卫星的轨道偶尔交叉时，我们便这样相会了。也可能两颗心相碰，但不过一瞬之间。下一瞬间就重新陷入绝对的孤独中。总有一天会化为灰烬。<span style="position:absolute;right:0;bottom:0;display:block;padding-left:40px;background-image:url(ellipsis.png);background-size:cover;background-position:center">...</span></p></div><h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><ul><li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/text-overflow" target="_blank" rel="noopener">https://developer.mozilla.org/en-US/docs/Web/CSS/text-overflow</a></li><li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/-webkit-line-clamp" target="_blank" rel="noopener">https://developer.mozilla.org/en-US/docs/Web/CSS/-webkit-line-clamp</a></li><li><a href="https://segmentfault.com/a/1190000008921613" target="_blank" rel="noopener">https://segmentfault.com/a/1190000008921613</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;日常开发中，我们经常会遇到文本超出容器的情况。通常我们会考虑限制文字字数，通过 JS 截取指定字符数，当然也可以通过 CSS 来处理文本溢出。&lt;/p&gt;</summary>
    
    
    
    <category term="css" scheme="https://tanglj.cn/categories/css/"/>
    
    
    <category term="css3" scheme="https://tanglj.cn/tags/css3/"/>
    
  </entry>
  
  <entry>
    <title>使用 cypress 做 E2E 测试</title>
    <link href="https://tanglj.cn/2020/01/20/e2e-test-by-cypress/"/>
    <id>https://tanglj.cn/2020/01/20/e2e-test-by-cypress/</id>
    <published>2020-01-20T09:22:57.000Z</published>
    <updated>2025-03-09T10:21:52.315Z</updated>
    
    <content type="html"><![CDATA[<p>E2E 测试即 End to End，也就是端到端测试，属于黑盒测试。通过编写测试用例，自动化模拟用户操作，确保应用程序能够如期运行。以 <a href="https://github.com/cntanglijun/web-building-boilerplates/tree/master/react-multi-page" target="_blank" rel="noopener">react-multi-page</a> 模版为例，谈谈如何使用 cypress 做 E2E 测试</p><a id="more"></a><h2 id="技术栈"><a href="#技术栈" class="headerlink" title="技术栈"></a>技术栈</h2><ul><li>cypress[3.8.2]</li><li>eslint-plugin-cypress[2.8.1]</li></ul><h2 id="如何配置"><a href="#如何配置" class="headerlink" title="如何配置"></a>如何配置</h2><p>安装 cypress</p><pre><code>npm i cypress eslint-plugin-cypress -D</code></pre><p>设置 npm 脚本命令</p><pre class=" language-json"><code class="language-json"><span class="token punctuation">{</span>  <span class="token property">"scripts"</span><span class="token operator">:</span> <span class="token punctuation">{</span>    <span class="token property">"test:e2e"</span><span class="token operator">:</span> <span class="token string">"cypress open"</span>  <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p>运行 cypress</p><pre><code>node_modules/.bin/cypress open</code></pre><p><img src="./1.png"></p><p>cypress 启动后，会在根目录看到 <code>cypress</code> 目录，里面存放了运行 <code>cypress</code> 相关的配置资料，为了分类处理目录结构，可以约定将测试相关的资料统一放在 <code>test</code> 目录中。那么在根目录建立 <code>test/e2e</code> 目录用于存放 E2E 测试相关资料，并把 <code>cypress</code> 目录中的资料转移到 <code>test/e2e</code> 目录中</p><pre class=" language-txt"><code class="language-txt"><root>  |__ test    |__ e2e      |__ fixtures      |__ integration      |__ plugins      |__ support</code></pre><p>在根目录创建 <code>cypress.json</code>，配置相关目录指向 <code>test/e2e</code> 文件夹</p><pre class=" language-json"><code class="language-json"><span class="token punctuation">{</span>  <span class="token property">"baseUrl"</span><span class="token operator">:</span> <span class="token string">"http://localhost:3000/"</span><span class="token punctuation">,</span>  <span class="token property">"fixturesFolder"</span><span class="token operator">:</span> <span class="token string">"test/e2e/fixtures"</span><span class="token punctuation">,</span>  <span class="token property">"integrationFolder"</span><span class="token operator">:</span> <span class="token string">"test/e2e/integration"</span><span class="token punctuation">,</span>  <span class="token property">"pluginsFile"</span><span class="token operator">:</span> <span class="token string">"test/e2e/plugins/index.js"</span><span class="token punctuation">,</span>  <span class="token property">"screenshotsFolder"</span><span class="token operator">:</span> <span class="token string">"test/e2e/screenshots"</span><span class="token punctuation">,</span>  <span class="token property">"supportFile"</span><span class="token operator">:</span> <span class="token string">"test/e2e/support/index.js"</span><span class="token punctuation">,</span>  <span class="token property">"videosFolder"</span><span class="token operator">:</span> <span class="token string">"test/e2e/videos"</span><span class="token punctuation">,</span>  <span class="token property">"video"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">}</span></code></pre><blockquote><p>其中 <code>baseUr</code> 根据实际网站域名端口自行配置，<code>video</code> 默认是启用状态，我这里设置关闭即不保存测试录屏文件</p></blockquote><h2 id="编写测试用例"><a href="#编写测试用例" class="headerlink" title="编写测试用例"></a>编写测试用例</h2><p>现在我们可以来编写一些简单的测试用例，来测试我们的 APP 的运行是否按预期执行</p><p><img src="./2.png"></p><p>假设我们的测试点有：</p><ul><li>首页包含 <code>Index</code> 文字</li><li>首页包含 <code>Link To Home</code> 文字</li><li>可以点击 <code>Link To Home</code> 文字</li><li>点击 <code>Link To Home</code> 文字后进入新页面，新页面 url 中包含 <code>home</code> 文字</li></ul><p>编写成对应的 E2E 测试用例如下：</p><pre class=" language-js"><code class="language-js"><span class="token comment" spellcheck="true">// test/e2e/integration/Index.spec.js</span><span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'The Home Page'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>  <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'successfully loads'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    cy<span class="token punctuation">.</span><span class="token function">visit</span><span class="token punctuation">(</span><span class="token string">'/'</span><span class="token punctuation">)</span>    cy<span class="token punctuation">.</span><span class="token function">contains</span><span class="token punctuation">(</span><span class="token string">'Index'</span><span class="token punctuation">)</span>    cy<span class="token punctuation">.</span><span class="token function">contains</span><span class="token punctuation">(</span><span class="token string">'Link To Home'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">click</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    cy<span class="token punctuation">.</span><span class="token function">url</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">should</span><span class="token punctuation">(</span><span class="token string">'include'</span><span class="token punctuation">,</span> <span class="token string">'home'</span><span class="token punctuation">)</span>  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">)</span></code></pre><h2 id="运行结果"><a href="#运行结果" class="headerlink" title="运行结果"></a>运行结果</h2><p>重新启动 <code>cypress</code>，选择 <code>Index.spec.js</code>，可以看到完整的测试流程，并显示测试已经通过</p><p><img src="./3.png"></p><h2 id="持续集成"><a href="#持续集成" class="headerlink" title="持续集成"></a>持续集成</h2><p>上面我们通过 <code>cypress open</code> 命令手动测试，但在实际工作中可能需要在持续集成环境中运行 E2E 测试，可以使用 <code>cypress run</code> 命令</p><pre class=" language-json"><code class="language-json"><span class="token punctuation">{</span>  <span class="token property">"scripts"</span><span class="token operator">:</span> <span class="token punctuation">{</span>    <span class="token property">"test:e2e"</span><span class="token operator">:</span> <span class="token string">"npm run serve &amp;&amp; cypress run"</span>  <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p>但是很快就发现问题了，执行 <code>npm run serve</code> 后终端被服务器进程挂起，无法执行后面的 <code>cypress run</code> 命令，于是我引入 <a href="https://github.com/bahmutov/start-server-and-test" target="_blank" rel="noopener">start-server-and-test</a> 来处理 <code>npm run serve</code> 的阻塞问题，也可以使用官方文档中的 <a href="https://github.com/jeffbski/wait-on" target="_blank" rel="noopener">wait-on</a></p><pre class=" language-json"><code class="language-json"><span class="token punctuation">{</span>  <span class="token property">"scripts"</span><span class="token operator">:</span> <span class="token punctuation">{</span>    <span class="token property">"cypress:open"</span><span class="token operator">:</span> <span class="token string">"cypress open"</span><span class="token punctuation">,</span>    <span class="token property">"cypress:run"</span><span class="token operator">:</span> <span class="token string">"cypress run"</span><span class="token punctuation">,</span>    <span class="token property">"serve"</span><span class="token operator">:</span> <span class="token string">"node prod.server.js"</span><span class="token punctuation">,</span>    <span class="token property">"test:e2e"</span><span class="token operator">:</span> <span class="token string">"start-server-and-test serve http://localhost:3000 cypress:open"</span><span class="token punctuation">,</span>    <span class="token property">"test-ci:e2e"</span><span class="token operator">:</span> <span class="token string">"start-server-and-test serve http://localhost:3000  cypress:run"</span>  <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p>现在 <code>npm run serve</code> 不会阻塞后面的任务了，终端运行结果如下</p><pre class=" language-txt"><code class="language-txt">====================================================================================================  (Run Starting)  ┌────────────────────────────────────────────────────────────────────────────────────────────────┐  │ Cypress:    3.8.2                                                                              │  │ Browser:    Electron 78 (headless)                                                             │  │ Specs:      1 found (Index.spec.js)                                                            │  └────────────────────────────────────────────────────────────────────────────────────────────────┘────────────────────────────────────────────────────────────────────────────────────────────────────  Running:  Index.spec.js                                                                   (1 of 1)undefined  The Home Page    √ successfully loads (1395ms)undefinedundefined  1 passing (2s)undefined  (Results)  ┌────────────────────────────────────────────────────────────────────────────────────────────────┐  │ Tests:        1                                                                                │  │ Passing:      1                                                                                │  │ Failing:      0                                                                                │  │ Pending:      0                                                                                │  │ Skipped:      0                                                                                │  │ Screenshots:  0                                                                                │  │ Video:        false                                                                            │  │ Duration:     1 second                                                                         │  │ Spec Ran:     Index.spec.js                                                                    │  └────────────────────────────────────────────────────────────────────────────────────────────────┘====================================================================================================  (Run Finished)       Spec                                              Tests  Passing  Failing  Pending  Skipped  ┌────────────────────────────────────────────────────────────────────────────────────────────────┐  │ √  Index.spec.js                            00:01        1        1        -        -        - │  └────────────────────────────────────────────────────────────────────────────────────────────────┘    √  All specs passed!                        00:01        1        1        -        -        -</code></pre><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><ul><li><a href="https://docs.cypress.io/zh-cn/guides/overview/why-cypress.html" target="_blank" rel="noopener">https://docs.cypress.io/zh-cn/guides/overview/why-cypress.html</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;E2E 测试即 End to End，也就是端到端测试，属于黑盒测试。通过编写测试用例，自动化模拟用户操作，确保应用程序能够如期运行。以 &lt;a href=&quot;https://github.com/cntanglijun/web-building-boilerplates/tree/master/react-multi-page&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;react-multi-page&lt;/a&gt; 模版为例，谈谈如何使用 cypress 做 E2E 测试&lt;/p&gt;</summary>
    
    
    
    <category term="architect" scheme="https://tanglj.cn/categories/architect/"/>
    
    
    <category term="e2e test" scheme="https://tanglj.cn/tags/e2e-test/"/>
    
  </entry>
  
  <entry>
    <title>VUE 单元测试</title>
    <link href="https://tanglj.cn/2020/01/03/vue-unit-test/"/>
    <id>https://tanglj.cn/2020/01/03/vue-unit-test/</id>
    <published>2020-01-03T07:44:19.000Z</published>
    <updated>2025-03-09T10:21:52.736Z</updated>
    
    <content type="html"><![CDATA[<p>养成良好的编码习惯，一个合格的程序员需要掌握一些编写单元测试的能力。单元测试也可以整体上提升我们的代码质量，这里介绍下 VUE 组件的单元测试。</p><a id="more"></a><blockquote><p>如果想直接通过 Demo 学习，可以跳过下面的内容，<a href="https://github.com/cntanglijun/vue-boilerplate/archive/master.zip" target="_blank" rel="noopener">点击这里下载示例</a></p></blockquote><h2 id="技术栈"><a href="#技术栈" class="headerlink" title="技术栈"></a>技术栈</h2><ul><li>@vue/test-utils[1.0.0-beta.30]</li><li>istanbul-instrumenter-loader[3.0.1]</li><li>karma[4.4.1]</li><li>karma-chrome-launcher[3.1.0]</li><li>karma-mocha[1.3.0]</li><li>karma-sourcemap-loader[0.3.7]</li><li>karma-coverage-istanbul-reporter[2.1.1]</li><li>karma-webpack[4.0.2]</li><li>webpack[4.41.5]</li></ul><h2 id="定义配置文件"><a href="#定义配置文件" class="headerlink" title="定义配置文件"></a>定义配置文件</h2><p><code>karma.conf.js</code> 文件用于 <code>karma</code> 的配置，使用 <code>node_modules/.bin/karma init</code> 命令创建该文件，我们定义如下配置：</p><pre class=" language-js"><code class="language-js"><span class="token comment" spellcheck="true">// Karma configuration</span><span class="token keyword">const</span> webpackConfig <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'./config/webpack.test.config.js'</span><span class="token punctuation">)</span>module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span>config<span class="token punctuation">)</span> <span class="token punctuation">{</span>  config<span class="token punctuation">.</span><span class="token keyword">set</span><span class="token punctuation">(</span><span class="token punctuation">{</span>    <span class="token comment" spellcheck="true">// base path that will be used to resolve all patterns (eg. files, exclude)</span>    basePath<span class="token punctuation">:</span> <span class="token string">'.'</span><span class="token punctuation">,</span>    <span class="token comment" spellcheck="true">// frameworks to use</span>    <span class="token comment" spellcheck="true">// available frameworks: https://npmjs.org/browse/keyword/karma-adapter</span>    frameworks<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">'mocha'</span> <span class="token punctuation">]</span><span class="token punctuation">,</span>    <span class="token comment" spellcheck="true">// list of files / patterns to load in the browser</span>    files<span class="token punctuation">:</span> <span class="token punctuation">[</span>      <span class="token string">'test/**/*.spec.js'</span>    <span class="token punctuation">]</span><span class="token punctuation">,</span>    <span class="token comment" spellcheck="true">// preprocess matching files before serving them to the browser</span>    <span class="token comment" spellcheck="true">// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor</span>    preprocessors<span class="token punctuation">:</span> <span class="token punctuation">{</span>      <span class="token string">'test/**/*.spec.js'</span><span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">'webpack'</span><span class="token punctuation">,</span> <span class="token string">'sourcemap'</span> <span class="token punctuation">]</span>    <span class="token punctuation">}</span><span class="token punctuation">,</span>    <span class="token comment" spellcheck="true">// webpack config</span>    webpack<span class="token punctuation">:</span> webpackConfig<span class="token punctuation">,</span>    webpackMiddleware<span class="token punctuation">:</span> <span class="token punctuation">{</span>      stats<span class="token punctuation">:</span> <span class="token string">'errors-only'</span>    <span class="token punctuation">}</span><span class="token punctuation">,</span>    <span class="token comment" spellcheck="true">// web server port</span>    port<span class="token punctuation">:</span> <span class="token number">9876</span><span class="token punctuation">,</span>    <span class="token comment" spellcheck="true">// enable / disable colors in the output (reporters and logs)</span>    colors<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>    <span class="token comment" spellcheck="true">// level of logging</span>    <span class="token comment" spellcheck="true">// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG</span>    logLevel<span class="token punctuation">:</span> config<span class="token punctuation">.</span>LOG_INFO<span class="token punctuation">,</span>    <span class="token comment" spellcheck="true">// enable / disable watching file and executing tests whenever any file changes</span>    autoWatch<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>    <span class="token comment" spellcheck="true">// start these browsers</span>    <span class="token comment" spellcheck="true">// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher</span>    browsers<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">'Chrome'</span> <span class="token punctuation">]</span><span class="token punctuation">,</span>    <span class="token comment" spellcheck="true">// Continuous Integration mode</span>    <span class="token comment" spellcheck="true">// if true, Karma captures browsers, runs the tests and exits</span>    singleRun<span class="token punctuation">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>    <span class="token comment" spellcheck="true">// Concurrency level</span>    <span class="token comment" spellcheck="true">// how many browser should be started simultaneous</span>    concurrency<span class="token punctuation">:</span> <span class="token number">Infinity</span>  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">}</span></code></pre><ul><li>设置 <code>frameworks</code> 为 <code>[&#39;mocha&#39;]</code>，即使用 <code>mocha</code> 测试框架</li><li>设置 <code>files</code> 为 <code>[&#39;test/**/*.spec.js&#39;]</code>，即对 <code>test</code> 目录下所有的后缀为 <code>.spec.js</code> 文件测试</li><li>设置 <code>preprocessors</code> 为 <code>{&#39;**/*.spec.js&#39;: [&#39;webpack&#39;, &#39;sourcemap&#39;]}</code>，即使用 <code>webpack</code>，<code>sourcemap</code> 对所有的测试文件进行 webpack 打包</li><li>设置 <code>browsers</code> 为 <code>Chrome</code>，即使用 Chrome 浏览器作为测试浏览器</li></ul><h2 id="编写测试用例"><a href="#编写测试用例" class="headerlink" title="编写测试用例"></a>编写测试用例</h2><p>详细的关于 <code>@vue/test-utils</code> 用法，查看 <a href="https://vue-test-utils.vuejs.org/zh/" target="_blank" rel="noopener">https://vue-test-utils.vuejs.org/zh/</a></p><pre class=" language-js"><code class="language-js"><span class="token keyword">import</span> <span class="token punctuation">{</span> expect <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'chai'</span><span class="token keyword">import</span> <span class="token punctuation">{</span> shallowMount <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'@vue/test-utils'</span><span class="token keyword">import</span> Header <span class="token keyword">from</span> <span class="token string">'../src/components/Header'</span><span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'Header'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>  <span class="token keyword">const</span> wrapper <span class="token operator">=</span> <span class="token function">shallowMount</span><span class="token punctuation">(</span>Header<span class="token punctuation">)</span>  <span class="token keyword">const</span> header <span class="token operator">=</span> wrapper<span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token string">'header'</span><span class="token punctuation">)</span>  <span class="token keyword">const</span> h1 <span class="token operator">=</span> wrapper<span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token string">'h1'</span><span class="token punctuation">)</span>  <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'有 header 标签'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>    <span class="token function">expect</span><span class="token punctuation">(</span>header<span class="token punctuation">.</span><span class="token function">exists</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>to<span class="token punctuation">.</span>be<span class="token punctuation">.</span><span class="token boolean">true</span>  <span class="token punctuation">}</span><span class="token punctuation">)</span>  <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'有 h1 标签'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>    <span class="token function">expect</span><span class="token punctuation">(</span>h1<span class="token punctuation">.</span><span class="token function">exists</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>to<span class="token punctuation">.</span>be<span class="token punctuation">.</span><span class="token boolean">true</span>  <span class="token punctuation">}</span><span class="token punctuation">)</span>  <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'h1 的文案为“VUE 单页模版”'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>    <span class="token function">expect</span><span class="token punctuation">(</span>h1<span class="token punctuation">.</span><span class="token function">text</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>to<span class="token punctuation">.</span><span class="token function">equal</span><span class="token punctuation">(</span><span class="token string">'VUE 单页模版'</span><span class="token punctuation">)</span>  <span class="token punctuation">}</span><span class="token punctuation">)</span>  <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'h1 标签在 header 标签中'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token punctuation">{</span>    <span class="token function">expect</span><span class="token punctuation">(</span>header<span class="token punctuation">.</span><span class="token function">contains</span><span class="token punctuation">(</span><span class="token string">'h1'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span>to<span class="token punctuation">.</span>be<span class="token punctuation">.</span><span class="token boolean">true</span>  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">)</span></code></pre><p>这里我引用 <a href="https://github.com/cntanglijun/web-building-boilerplates/blob/master/vue-single-page/src/components/Header/index.vue" target="_blank" rel="noopener">vue-single-page</a> 的 <code>Header</code> 组件测试用例</p><ul><li>首先通过 <code>shallowMount</code> 获取 <code>wrapper</code></li><li>使用 <code>chai</code> 断言库编写相关的测试用例</li></ul><h2 id="运行结果"><a href="#运行结果" class="headerlink" title="运行结果"></a>运行结果</h2><pre class=" language-txt"><code class="language-txt">i ｢wdm｣: Compiled successfully.15 01 2020 18:28:13.799:INFO [karma-server]: Karma v4.4.1 server started at http://0.0.0.0:9876/15 01 2020 18:28:13.813:INFO [launcher]: Launching browsers Chrome with concurrency unlimited15 01 2020 18:28:13.820:INFO [launcher]: Starting browser Chrome15 01 2020 18:28:17.075:INFO [Chrome 79.0.3945 (Windows 10.0.0)]: Connected on socket PUKPz4iBuFzeVNSsAAAA with id 91716917TOTAL: 4 SUCCESS</code></pre><p>可以看到我们的单元测试已经通过了</p><h2 id="测试覆盖率报告"><a href="#测试覆盖率报告" class="headerlink" title="测试覆盖率报告"></a>测试覆盖率报告</h2><p>测试完成后，我们需要查看测试覆盖率报告。这需要在 <code>webpack.test.config.js</code> 和 <code>karma.conf.js</code> 中做一些配置修改</p><h3 id="webpack-test-config-js"><a href="#webpack-test-config-js" class="headerlink" title="webpack.test.config.js"></a>webpack.test.config.js</h3><pre class=" language-js"><code class="language-js"><span class="token keyword">const</span> merge <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'webpack-merge'</span><span class="token punctuation">)</span><span class="token keyword">const</span> path <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'path'</span><span class="token punctuation">)</span><span class="token keyword">const</span> webpackCommonConfig <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'./webpack.common.config'</span><span class="token punctuation">)</span><span class="token keyword">const</span> testConfig <span class="token operator">=</span> <span class="token punctuation">{</span>  devtool<span class="token punctuation">:</span> <span class="token string">'inline-source-map'</span><span class="token punctuation">,</span>  mode<span class="token punctuation">:</span> <span class="token string">'none'</span><span class="token punctuation">,</span>  module<span class="token punctuation">:</span> <span class="token punctuation">{</span>    rules<span class="token punctuation">:</span> <span class="token punctuation">[</span>      <span class="token punctuation">{</span>        test<span class="token punctuation">:</span> <span class="token regex">/\.spec.js$/i</span><span class="token punctuation">,</span>        enforce<span class="token punctuation">:</span> <span class="token string">'pre'</span><span class="token punctuation">,</span>        use<span class="token punctuation">:</span> <span class="token punctuation">[</span>          <span class="token punctuation">{</span>            loader<span class="token punctuation">:</span> <span class="token string">'istanbul-instrumenter-loader'</span><span class="token punctuation">,</span>            options<span class="token punctuation">:</span> <span class="token punctuation">{</span>              esModules<span class="token punctuation">:</span> <span class="token boolean">true</span>            <span class="token punctuation">}</span>          <span class="token punctuation">}</span>        <span class="token punctuation">]</span>      <span class="token punctuation">}</span>    <span class="token punctuation">]</span>  <span class="token punctuation">}</span><span class="token punctuation">}</span>module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token function">merge</span><span class="token punctuation">(</span>webpackCommonConfig<span class="token punctuation">,</span> testConfig<span class="token punctuation">)</span></code></pre><ul><li>添加一个优先执行的编译 <code>.spec.js</code> 文件的 <code>rules</code>，<code>loader</code> 使用 <code>istanbul-instrumenter-loader</code> 并开启 <code>esModules</code> 模式</li></ul><h3 id="karma-conf-js"><a href="#karma-conf-js" class="headerlink" title="karma.conf.js"></a>karma.conf.js</h3><pre class=" language-js"><code class="language-js">module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span>config<span class="token punctuation">)</span> <span class="token punctuation">{</span>  config<span class="token punctuation">.</span><span class="token keyword">set</span><span class="token punctuation">(</span><span class="token punctuation">{</span>    <span class="token comment" spellcheck="true">// ...</span>    coverageIstanbulReporter<span class="token punctuation">:</span> <span class="token punctuation">{</span>      reports<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">'html'</span><span class="token punctuation">,</span> <span class="token string">'text'</span> <span class="token punctuation">]</span><span class="token punctuation">,</span>      fixWebpackSourcePaths<span class="token punctuation">:</span> <span class="token boolean">true</span>    <span class="token punctuation">}</span><span class="token punctuation">,</span>    reporters<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">'coverage-istanbul'</span> <span class="token punctuation">]</span>    <span class="token comment" spellcheck="true">//...</span>  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">}</span></code></pre><ul><li>设置 <code>reporters</code> 为 <code>[ &#39;coverage-istanbul&#39; ]</code>，即使用 <code>coverage-istanbul</code> reporters</li><li><code>coverageIstanbulReporter</code> 配置项用于设置 <code>coverage-istanbul</code> 的参数，详细的参数可以参考 <a href="https://github.com/mattlewis92/karma-coverage-istanbul-reporter#configuration" target="_blank" rel="noopener">这里</a></li></ul><h3 id="运行结果-1"><a href="#运行结果-1" class="headerlink" title="运行结果"></a>运行结果</h3><p>再次执行单元测试，我们会看到测试覆盖率的相关信息</p><pre class=" language-txt"><code class="language-txt">----------------|----------|----------|----------|----------|-------------------|File            |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |----------------|----------|----------|----------|----------|-------------------|All files       |      100 |      100 |      100 |      100 |                   | Header.spec.js |      100 |      100 |      100 |      100 |                   |----------------|----------|----------|----------|----------|-------------------|</code></pre><p>也可以通过生成到 <code>coverage</code> 目录下的网页文件，在浏览器中查看</p><p><img src="./coverage.png"></p><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><ul><li><a href="https://vue-test-utils.vuejs.org/zh/" target="_blank" rel="noopener">https://vue-test-utils.vuejs.org/zh/</a></li><li><a href="https://github.com/mattlewis92/karma-coverage-istanbul-reporter" target="_blank" rel="noopener">https://github.com/mattlewis92/karma-coverage-istanbul-reporter</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;养成良好的编码习惯，一个合格的程序员需要掌握一些编写单元测试的能力。单元测试也可以整体上提升我们的代码质量，这里介绍下 VUE 组件的单元测试。&lt;/p&gt;</summary>
    
    
    
    <category term="architect" scheme="https://tanglj.cn/categories/architect/"/>
    
    
    <category term="unit test" scheme="https://tanglj.cn/tags/unit-test/"/>
    
  </entry>
  
  <entry>
    <title>Docker In WSL</title>
    <link href="https://tanglj.cn/2019/07/16/docker-in-wsl/"/>
    <id>https://tanglj.cn/2019/07/16/docker-in-wsl/</id>
    <published>2019-07-16T09:00:14.000Z</published>
    <updated>2025-03-09T10:21:52.301Z</updated>
    
    <content type="html"><![CDATA[<p>WSL 虽说可以让我们在 Windows 中运行 Linux，但是它对 Docker 的支持还并不完美</p><h1 id="Docker-In-WSL"><a href="#Docker-In-WSL" class="headerlink" title="Docker In WSL"></a>Docker In WSL</h1><p>Windows 的 WSL 功能允许在 Windows 中运行 Linux 子系统，但是 WSL 不支持 Docker Daemon，因此虽然 <code>docker -v</code> 可以正常执行，但是 <code>docker run hello-world</code> 报错 <code>docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.</code></p><p><img src="./1.png"></p><h2 id="安装-Docker-For-Windows"><a href="#安装-Docker-For-Windows" class="headerlink" title="安装 Docker For Windows"></a>安装 Docker For Windows</h2><p>没有办法，那么我们就在宿主机上安装 <a href="https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.exe" target="_blank" rel="noopener">Docker For Windows</a>，在设置里面勾选 <code>Expose daemon on tcp://localhost:2375 without TLS</code></p><p><img src="./2.png"></p><h2 id="配置-bashrc"><a href="#配置-bashrc" class="headerlink" title="配置 .bashrc"></a>配置 .bashrc</h2><p>为了每次打开 WSL 终端自动连接宿主机上的 Docker，需要在 <code>.bashrc</code> 文件中做相关配置</p><p><img src="./3.png"></p><h2 id="今晚吃鸡"><a href="#今晚吃鸡" class="headerlink" title="今晚吃鸡"></a>今晚吃鸡</h2><p>好了，现在是到了见证奇迹的时候了，打开 Windows Terminal 输入 <code>docker run hello-world</code></p><p><img src="./4.png"></p><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><ul><li><a href="https://my.oschina.net/u/3628490/blog/1865780" target="_blank" rel="noopener">https://my.oschina.net/u/3628490/blog/1865780</a></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;WSL 虽说可以让我们在 Windows 中运行 Linux，但是它对 Docker 的支持还并不完美&lt;/p&gt;&lt;h1 id=&quot;Docker-In-WSL&quot;&gt;&lt;a href=&quot;#Docker-In-WSL&quot; class=&quot;headerlink&quot; title=&quot;Docker I</summary>
      
    
    
    
    <category term="windows" scheme="https://tanglj.cn/categories/windows/"/>
    
    
    <category term="docker" scheme="https://tanglj.cn/tags/docker/"/>
    
    <category term="wsl" scheme="https://tanglj.cn/tags/wsl/"/>
    
    <category term="terminal" scheme="https://tanglj.cn/tags/terminal/"/>
    
  </entry>
  
  <entry>
    <title>Windows Terminal</title>
    <link href="https://tanglj.cn/2019/07/14/windows-terminal/"/>
    <id>https://tanglj.cn/2019/07/14/windows-terminal/</id>
    <published>2019-07-13T19:22:39.000Z</published>
    <updated>2025-03-09T10:21:52.739Z</updated>
    
    <content type="html"><![CDATA[<p>Windows Terminal 的采坑记录</p><a id="more"></a><h1 id="Windows-Terminal"><a href="#Windows-Terminal" class="headerlink" title="Windows Terminal"></a>Windows Terminal</h1><p><img src="./2.png"></p><p>Windows Terminal 是一个全新的、流行的、功能强大的命令行终端工具。包含很多来社区呼声很高的特性，例如：多 Tab 支持、富文本、多语言支持、可配置、主题和样式，支持 emoji 和基于 GPU 运算的文本渲染等等</p><p>同时该终端依然符合我们的目标和要求，以确保它保持快速、高效，并且不会消耗大量内存和电源</p><h2 id="安装-Windows-Terminal"><a href="#安装-Windows-Terminal" class="headerlink" title="安装 Windows Terminal"></a>安装 Windows Terminal</h2><p>我们可以通过 Microsoft Store 安装 Windows Terminal，也可以通过官方仓库手动编译 Windows Terminal。我推荐在 Microsoft Store 安装，因为这种方式最方便 (1)</p><p><img src="./3.png"></p><h2 id="WSL"><a href="#WSL" class="headerlink" title="WSL"></a>WSL</h2><p>Windows Subsystem for Linux(简称 WSL) 是一个在 Windows 10 上能够运行原生 Linux 二进制可执行文件 (ELF 格式) 的兼容层。它是由微软与 Canonical 公司合作开发，其目标是使纯正的 Ubuntu 14.04 “Trusty Tahr” 映像能下载和解压到用户的本地计算机，并且映像内的工具和实用工具能在此子系统上原生运行 (2)</p><h3 id="开启-WSL-功能"><a href="#开启-WSL-功能" class="headerlink" title="开启 WSL 功能"></a>开启 WSL 功能</h3><p>进入控制面板，添加程序功能 <code>Windows Subsystem for Linux</code> 并重启电脑</p><p><img src="./1.png"></p><h3 id="安装-Ubuntu"><a href="#安装-Ubuntu" class="headerlink" title="安装 Ubuntu"></a>安装 Ubuntu</h3><p>那么我们以 Ubuntu 为例，来演示如何在 Windows 10 中运行 Linux 系统，同样我们在 Microsoft Store 安装 Ubuntu</p><p><img src="./4.png"></p><h2 id="配置-WT"><a href="#配置-WT" class="headerlink" title="配置 WT"></a>配置 WT</h2><p>在 WT 的 Tab 下拉菜单中选择 Setting，打开 profiles.json (3)</p><p><img src="./5.png"></p><p>添加关于 Ubuntu 的配置</p><pre class=" language-json"><code class="language-json"><span class="token punctuation">{</span>    <span class="token property">"acrylicOpacity"</span> <span class="token operator">:</span> <span class="token number">0.75</span><span class="token punctuation">,</span>    <span class="token property">"closeOnExit"</span> <span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>    <span class="token property">"colorScheme"</span> <span class="token operator">:</span> <span class="token string">"One Half Dark"</span><span class="token punctuation">,</span>    <span class="token property">"commandline"</span> <span class="token operator">:</span> <span class="token string">"ubuntu.exe"</span><span class="token punctuation">,</span>    <span class="token property">"cursorColor"</span> <span class="token operator">:</span> <span class="token string">"#FFFFFF"</span><span class="token punctuation">,</span>    <span class="token property">"cursorShape"</span> <span class="token operator">:</span> <span class="token string">"bar"</span><span class="token punctuation">,</span>    <span class="token property">"fontFace"</span> <span class="token operator">:</span> <span class="token string">"Consolas"</span><span class="token punctuation">,</span>    <span class="token property">"fontSize"</span> <span class="token operator">:</span> <span class="token number">14</span><span class="token punctuation">,</span>    <span class="token property">"guid"</span> <span class="token operator">:</span> <span class="token string">"{f36bcc90-c0a1-48fb-9a11-6b1099c060a2}"</span><span class="token punctuation">,</span>    <span class="token property">"historySize"</span> <span class="token operator">:</span> <span class="token number">9001</span><span class="token punctuation">,</span>    <span class="token property">"icon"</span> <span class="token operator">:</span> <span class="token string">"ms-appdata:///Roaming/{f36bcc90-c0a1-48fb-9a11-6b1099c060a2}.png"</span><span class="token punctuation">,</span>    <span class="token property">"name"</span> <span class="token operator">:</span> <span class="token string">"Ubuntu"</span><span class="token punctuation">,</span>    <span class="token property">"padding"</span> <span class="token operator">:</span> <span class="token string">"0, 0, 0, 0"</span><span class="token punctuation">,</span>    <span class="token property">"snapOnInput"</span> <span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>    <span class="token property">"startingDirectory"</span> <span class="token operator">:</span> <span class="token string">"%USERPROFILE%"</span><span class="token punctuation">,</span>    <span class="token property">"useAcrylic"</span> <span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">}</span></code></pre><p><img src="./6.png"></p><p>注意：guid 需要在 PowerShell 中执行 <code>new-guid</code> 命令</p><p><img src="./7.png"></p><h2 id="WT-相关资源存储路径"><a href="#WT-相关资源存储路径" class="headerlink" title="WT 相关资源存储路径"></a>WT 相关资源存储路径</h2><p><code>profiles.json</code> 存放在 <code>$env:LocalAppData\Packages\Microsoft.WindowsTerminal_&lt;randomString&gt;\RoamingState\profiles.json</code>(对应 ms-appdata:///Roaming/)，官方建议配置资源都存放到 <code>RoamingState</code> 目录，方便管理维护，即与 <code>profiles.json</code> 同级目录中，例如上面 Ubuntu 的 <code>icon</code> 配置项 <code>ms-appdata:///Roaming/{f36bcc90-c0a1-48fb-9a11-6b1099c060a2}.png</code></p><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><ul><li><a href="https://github.com/microsoft/terminal/blob/master/doc/user-docs/index.md" target="_blank" rel="noopener">https://github.com/microsoft/terminal/blob/master/doc/user-docs/index.md</a> (1)</li><li><a href="https://baike.baidu.com/item/wsl/20359185?fr=aladdin#1" target="_blank" rel="noopener">https://baike.baidu.com/item/wsl/20359185?fr=aladdin#1</a> (2)</li><li><a href="https://github.com/microsoft/terminal/blob/master/doc/cascadia/SettingsSchema.md" target="_blank" rel="noopener">https://github.com/microsoft/terminal/blob/master/doc/cascadia/SettingsSchema.md</a> (3)</li><li><a href="https://github.com/microsoft/terminal/blob/master/doc/user-docs/UsingJsonSettings.md" target="_blank" rel="noopener">https://github.com/microsoft/terminal/blob/master/doc/user-docs/UsingJsonSettings.md</a> (3)</li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;Windows Terminal 的采坑记录&lt;/p&gt;</summary>
    
    
    
    <category term="windows" scheme="https://tanglj.cn/categories/windows/"/>
    
    
    <category term="terminal" scheme="https://tanglj.cn/tags/terminal/"/>
    
  </entry>
  
  <entry>
    <title>Web 前端 Ajax 单元测试</title>
    <link href="https://tanglj.cn/2019/05/19/unit-test-about-ajax/"/>
    <id>https://tanglj.cn/2019/05/19/unit-test-about-ajax/</id>
    <published>2019-05-19T04:55:46.000Z</published>
    <updated>2025-03-09T10:21:52.723Z</updated>
    
    <content type="html"><![CDATA[<p>Web 前端与后端交互一般通过 <code>Ajax</code> 技术，那么 Ajax 如何来做单元测试呢？</p><a id="more"></a><h1 id="环境与框架"><a href="#环境与框架" class="headerlink" title="环境与框架"></a>环境与框架</h1><p>首先我们要进行技术选型，确定单元测试运行环境和技术栈框架</p><h2 id="环境"><a href="#环境" class="headerlink" title="环境"></a>环境</h2><ul><li><a href="https://nodejs.org/en/" target="_blank" rel="noopener">nodejs</a> - 10.15.1</li></ul><h2 id="技术栈框架"><a href="#技术栈框架" class="headerlink" title="技术栈框架"></a>技术栈框架</h2><ul><li><a href="https://karma-runner.github.io/latest/index.html" target="_blank" rel="noopener">karma</a> - 4.1.0<ul><li>karma-babel-preprocessor - 8.0.0</li><li>karma-mocha - 1.3.0</li><li>karma-mocha-reporter - 2.2.5</li><li>karma-webpack - 3.0.5</li><li>karma-phantomjs-launcher - 1.0.4</li></ul></li><li><a href="https://mochajs.org/" target="_blank" rel="noopener">mocha</a> - 6.1.4</li><li><a href="https://webpack.js.org/" target="_blank" rel="noopener">webpack</a> - 4.31.0</li><li><a href="https://babeljs.io/" target="_blank" rel="noopener">babel</a><ul><li>@babel/core - 7.4.4</li><li>@babel/preset-env - 7.4.4</li><li>@babel/polyfill - 7.4.4</li><li>@babel/plugin-transform-async-to-generator - 7.4.4</li></ul></li><li><a href="https://www.chaijs.com/" target="_blank" rel="noopener">chai</a> - 4.2.0</li><li><a href="https://github.com/axios/axios" target="_blank" rel="noopener">axios</a> - 0.18.0</li></ul><h1 id="演示项目"><a href="#演示项目" class="headerlink" title="演示项目"></a>演示项目</h1><p>我们测试获取 <code>Github</code> 上星星数大于 20 万的仓库的接口返回数据，已知接口返回格式如下：</p><pre class=" language-js"><code class="language-js"><span class="token punctuation">{</span>  incomplete_results<span class="token punctuation">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>  items<span class="token punctuation">:</span> <span class="token punctuation">[</span>    <span class="token punctuation">{</span>      <span class="token comment" spellcheck="true">// ...</span>    <span class="token punctuation">}</span><span class="token punctuation">,</span>    <span class="token punctuation">{</span>      <span class="token comment" spellcheck="true">// ...</span>    <span class="token punctuation">}</span>  <span class="token punctuation">]</span><span class="token punctuation">,</span>  total_count<span class="token punctuation">:</span> <span class="token number">2</span><span class="token punctuation">}</span></code></pre><p>我们需要关注的是：</p><ul><li>接口返回数据中是否包含 <code>items</code>，<code>total_count</code> 字段</li><li><code>items</code> 是一个数组</li><li><code>total_count</code> 是一个数字</li><li><code>items</code> 的数组长度等于 <code>total_count</code> 的值</li></ul><h2 id="package-json"><a href="#package-json" class="headerlink" title="package.json"></a>package.json</h2><p><code>npm init -y</code> 创建 <code>package.json</code> 文件并在 <code>package.json</code> 中添加依赖包</p><pre class=" language-json"><code class="language-json"><span class="token property">"scripts"</span><span class="token operator">:</span> <span class="token punctuation">{</span>  <span class="token property">"test"</span><span class="token operator">:</span> <span class="token string">"karma start"</span><span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token property">"devDependencies"</span><span class="token operator">:</span> <span class="token punctuation">{</span>  <span class="token property">"@babel/core"</span><span class="token operator">:</span> <span class="token string">"^7.4.4"</span><span class="token punctuation">,</span>  <span class="token property">"@babel/plugin-transform-async-to-generator"</span><span class="token operator">:</span> <span class="token string">"^7.4.4"</span><span class="token punctuation">,</span>  <span class="token property">"@babel/preset-env"</span><span class="token operator">:</span> <span class="token string">"^7.4.4"</span><span class="token punctuation">,</span>  <span class="token property">"babel-loader"</span><span class="token operator">:</span> <span class="token string">"^8.0.6"</span><span class="token punctuation">,</span>  <span class="token property">"chai"</span><span class="token operator">:</span> <span class="token string">"^4.2.0"</span><span class="token punctuation">,</span>  <span class="token property">"karma"</span><span class="token operator">:</span> <span class="token string">"^4.1.0"</span><span class="token punctuation">,</span>  <span class="token property">"karma-babel-preprocessor"</span><span class="token operator">:</span> <span class="token string">"^8.0.0"</span><span class="token punctuation">,</span>  <span class="token property">"karma-mocha"</span><span class="token operator">:</span> <span class="token string">"^1.3.0"</span><span class="token punctuation">,</span>  <span class="token property">"karma-mocha-reporter"</span><span class="token operator">:</span> <span class="token string">"^2.2.5"</span><span class="token punctuation">,</span>  <span class="token property">"karma-phantomjs-launcher"</span><span class="token operator">:</span> <span class="token string">"^1.0.4"</span><span class="token punctuation">,</span>  <span class="token property">"karma-webpack"</span><span class="token operator">:</span> <span class="token string">"^3.0.5"</span><span class="token punctuation">,</span>  <span class="token property">"mocha"</span><span class="token operator">:</span> <span class="token string">"^6.1.4"</span><span class="token punctuation">,</span>  <span class="token property">"webpack"</span><span class="token operator">:</span> <span class="token string">"^4.31.0"</span><span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token property">"dependencies"</span><span class="token operator">:</span> <span class="token punctuation">{</span>  <span class="token property">"@babel/polyfill"</span><span class="token operator">:</span> <span class="token string">"^7.4.4"</span><span class="token punctuation">}</span></code></pre><h2 id="karma-conf-js"><a href="#karma-conf-js" class="headerlink" title="karma.conf.js"></a>karma.conf.js</h2><p>运行 <code>node_modules/.bin/karma init</code> 创建 <code>karma.conf.js</code></p><pre class=" language-js"><code class="language-js"><span class="token comment" spellcheck="true">// Karma configuration</span><span class="token comment" spellcheck="true">// Generated on Sat May 18 2019 22:16:40 GMT+0800 (China Standard Time)</span>module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span>config<span class="token punctuation">)</span> <span class="token punctuation">{</span>  config<span class="token punctuation">.</span><span class="token keyword">set</span><span class="token punctuation">(</span><span class="token punctuation">{</span>    <span class="token comment" spellcheck="true">// base path that will be used to resolve all patterns (eg. files, exclude)</span>    basePath<span class="token punctuation">:</span> <span class="token string">'.'</span><span class="token punctuation">,</span>    <span class="token comment" spellcheck="true">// frameworks to use</span>    <span class="token comment" spellcheck="true">// available frameworks: https://npmjs.org/browse/keyword/karma-adapter</span>    frameworks<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">'mocha'</span> <span class="token punctuation">]</span><span class="token punctuation">,</span>    <span class="token comment" spellcheck="true">// list of files / patterns to load in the browser</span>    files<span class="token punctuation">:</span> <span class="token punctuation">[</span>      <span class="token string">'node_modules/@babel/polyfill/dist/polyfill.js'</span><span class="token punctuation">,</span>      <span class="token string">'test/test.*.js'</span>    <span class="token punctuation">]</span><span class="token punctuation">,</span>    <span class="token comment" spellcheck="true">// preprocess matching files before serving them to the browser</span>    <span class="token comment" spellcheck="true">// available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor</span>    preprocessors<span class="token punctuation">:</span> <span class="token punctuation">{</span>      <span class="token string">'test/test.*.js'</span><span class="token punctuation">:</span> <span class="token punctuation">[</span>        <span class="token string">'webpack'</span>      <span class="token punctuation">]</span>    <span class="token punctuation">}</span><span class="token punctuation">,</span>    webpack<span class="token punctuation">:</span> <span class="token punctuation">{</span>      devtool<span class="token punctuation">:</span> <span class="token string">'inline-source-map'</span><span class="token punctuation">,</span>      mode<span class="token punctuation">:</span> <span class="token string">'development'</span><span class="token punctuation">,</span>      stats<span class="token punctuation">:</span> <span class="token string">'none'</span><span class="token punctuation">,</span>      module<span class="token punctuation">:</span> <span class="token punctuation">{</span>        rules<span class="token punctuation">:</span> <span class="token punctuation">[</span>          <span class="token punctuation">{</span>            test<span class="token punctuation">:</span> <span class="token regex">/\.js$/</span><span class="token punctuation">,</span>            exclude<span class="token punctuation">:</span> <span class="token regex">/node_modules/</span><span class="token punctuation">,</span>            use<span class="token punctuation">:</span> <span class="token punctuation">{</span>              loader<span class="token punctuation">:</span> <span class="token string">'babel-loader'</span>            <span class="token punctuation">}</span>          <span class="token punctuation">}</span>        <span class="token punctuation">]</span>      <span class="token punctuation">}</span>    <span class="token punctuation">}</span><span class="token punctuation">,</span>    <span class="token comment" spellcheck="true">// test results reporter to use</span>    <span class="token comment" spellcheck="true">// possible values: 'dots', 'progress'</span>    <span class="token comment" spellcheck="true">// available reporters: https://npmjs.org/browse/keyword/karma-reporter</span>    reporters<span class="token punctuation">:</span> <span class="token punctuation">[</span>      <span class="token string">'mocha'</span>    <span class="token punctuation">]</span><span class="token punctuation">,</span>    <span class="token comment" spellcheck="true">// web server port</span>    port<span class="token punctuation">:</span> <span class="token number">8080</span><span class="token punctuation">,</span>    <span class="token comment" spellcheck="true">// enable / disable colors in the output (reporters and logs)</span>    colors<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>    <span class="token comment" spellcheck="true">// level of logging</span>    <span class="token comment" spellcheck="true">// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG</span>    logLevel<span class="token punctuation">:</span> config<span class="token punctuation">.</span>LOG_INFO<span class="token punctuation">,</span>    <span class="token comment" spellcheck="true">// enable / disable watching file and executing tests whenever any file changes</span>    autoWatch<span class="token punctuation">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>    <span class="token comment" spellcheck="true">// start these browsers</span>    <span class="token comment" spellcheck="true">// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher</span>    browsers<span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">'PhantomJS'</span> <span class="token punctuation">]</span><span class="token punctuation">,</span>    <span class="token comment" spellcheck="true">// Continuous Integration mode</span>    <span class="token comment" spellcheck="true">// if true, Karma captures browsers, runs the tests and exits</span>    singleRun<span class="token punctuation">:</span> <span class="token boolean">true</span><span class="token punctuation">,</span>    <span class="token comment" spellcheck="true">// Concurrency level</span>    <span class="token comment" spellcheck="true">// how many browser should be started simultaneous</span>    concurrency<span class="token punctuation">:</span> <span class="token number">Infinity</span>  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">}</span></code></pre><p><code>preprocessors</code> 使用 <code>webpack</code> 打包整个依赖链生成浏览器可以运行的测试代码。</p><p><code>singleRun</code> 设置为 <code>true</code> 测试运行结束后自动退出。</p><h2 id="babel-config-js"><a href="#babel-config-js" class="headerlink" title="babel.config.js"></a>babel.config.js</h2><p>创建 <code>babel.config.js</code>，配置如下</p><pre class=" language-js"><code class="language-js">module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token punctuation">{</span>  presets<span class="token punctuation">:</span> <span class="token punctuation">[</span>    <span class="token punctuation">[</span>      <span class="token string">'@babel/preset-env'</span><span class="token punctuation">,</span>      <span class="token punctuation">{</span>        modules<span class="token punctuation">:</span> <span class="token boolean">false</span>      <span class="token punctuation">}</span>    <span class="token punctuation">]</span>  <span class="token punctuation">]</span><span class="token punctuation">,</span>  plugins<span class="token punctuation">:</span> <span class="token punctuation">[</span>    <span class="token string">'@babel/plugin-transform-async-to-generator'</span>  <span class="token punctuation">]</span><span class="token punctuation">}</span></code></pre><p><code>@babel/plugin-transform-async-to-generator</code> 用于对 <code>async</code>，<code>await</code> 进行转码</p><h2 id="test-ajax-js"><a href="#test-ajax-js" class="headerlink" title="test.ajax.js"></a>test.ajax.js</h2><p>一般我们将测试文件放在 <code>test</code> 文件夹中，创建 <code>test</code> 文件夹并新建 <code>test.ajax.js</code></p><pre class=" language-js"><code class="language-js"><span class="token keyword">import</span> axios <span class="token keyword">from</span> <span class="token string">'axios'</span><span class="token keyword">import</span> <span class="token punctuation">{</span> expect <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'chai'</span><span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'Testing about geting the repositories that stars greater than 200000'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>  <span class="token keyword">const</span> apiUrl <span class="token operator">=</span> <span class="token string">'https://api.github.com/search/repositories'</span>  <span class="token keyword">let</span> res <span class="token operator">=</span> <span class="token keyword">null</span>  <span class="token function">before</span><span class="token punctuation">(</span><span class="token keyword">async</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>JSON<span class="token punctuation">.</span><span class="token function">stringify</span><span class="token punctuation">(</span><span class="token punctuation">{</span>      incomplete_results<span class="token punctuation">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>      total_count<span class="token punctuation">:</span> <span class="token number">2</span><span class="token punctuation">,</span>      items<span class="token punctuation">:</span> <span class="token punctuation">[</span>        <span class="token punctuation">{</span>          <span class="token comment" spellcheck="true">// ...</span>        <span class="token punctuation">}</span><span class="token punctuation">,</span>        <span class="token punctuation">{</span>          <span class="token comment" spellcheck="true">// ...</span>        <span class="token punctuation">}</span>      <span class="token punctuation">]</span>    <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span>    res <span class="token operator">=</span> <span class="token keyword">await</span> axios<span class="token punctuation">.</span><span class="token keyword">get</span><span class="token punctuation">(</span>apiUrl<span class="token punctuation">,</span> <span class="token punctuation">{</span>      params<span class="token punctuation">:</span> <span class="token punctuation">{</span>        q<span class="token punctuation">:</span> <span class="token string">'stars:>200000'</span>      <span class="token punctuation">}</span>    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">then</span><span class="token punctuation">(</span>res <span class="token operator">=</span><span class="token operator">></span> res<span class="token punctuation">.</span>data<span class="token punctuation">)</span>  <span class="token punctuation">}</span><span class="token punctuation">)</span>  <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'Check the response data'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'Should be an object'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>      <span class="token function">expect</span><span class="token punctuation">(</span>res<span class="token punctuation">)</span><span class="token punctuation">.</span>to<span class="token punctuation">.</span>be<span class="token punctuation">.</span><span class="token function">a</span><span class="token punctuation">(</span><span class="token string">'object'</span><span class="token punctuation">)</span>    <span class="token punctuation">}</span><span class="token punctuation">)</span>    <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'Should have property total_count'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>      <span class="token function">expect</span><span class="token punctuation">(</span>res<span class="token punctuation">)</span><span class="token punctuation">.</span>to<span class="token punctuation">.</span>have<span class="token punctuation">.</span><span class="token function">property</span><span class="token punctuation">(</span><span class="token string">'total_count'</span><span class="token punctuation">)</span>    <span class="token punctuation">}</span><span class="token punctuation">)</span>    <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'Should have property items'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>      <span class="token function">expect</span><span class="token punctuation">(</span>res<span class="token punctuation">)</span><span class="token punctuation">.</span>to<span class="token punctuation">.</span>have<span class="token punctuation">.</span><span class="token function">property</span><span class="token punctuation">(</span><span class="token string">'items'</span><span class="token punctuation">)</span>    <span class="token punctuation">}</span><span class="token punctuation">)</span>    <span class="token function">describe</span><span class="token punctuation">(</span><span class="token string">'Check the property total_count &amp; items'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>      <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'Should be a number'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>        <span class="token function">expect</span><span class="token punctuation">(</span>res<span class="token punctuation">.</span>total_count<span class="token punctuation">)</span><span class="token punctuation">.</span>to<span class="token punctuation">.</span>be<span class="token punctuation">.</span><span class="token function">a</span><span class="token punctuation">(</span><span class="token string">'number'</span><span class="token punctuation">)</span>      <span class="token punctuation">}</span><span class="token punctuation">)</span>      <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'Should be a array'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>        <span class="token function">expect</span><span class="token punctuation">(</span>res<span class="token punctuation">.</span>items<span class="token punctuation">)</span><span class="token punctuation">.</span>to<span class="token punctuation">.</span>be<span class="token punctuation">.</span><span class="token function">a</span><span class="token punctuation">(</span><span class="token string">'array'</span><span class="token punctuation">)</span>      <span class="token punctuation">}</span><span class="token punctuation">)</span>      <span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'The length of items should equal total_count'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>        <span class="token function">expect</span><span class="token punctuation">(</span>res<span class="token punctuation">.</span>items<span class="token punctuation">.</span>length<span class="token punctuation">)</span><span class="token punctuation">.</span>to<span class="token punctuation">.</span><span class="token function">equal</span><span class="token punctuation">(</span>res<span class="token punctuation">.</span>total_count<span class="token punctuation">)</span>      <span class="token punctuation">}</span><span class="token punctuation">)</span>    <span class="token punctuation">}</span><span class="token punctuation">)</span>  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">)</span></code></pre><h2 id="测试结果"><a href="#测试结果" class="headerlink" title="测试结果"></a>测试结果</h2><pre><code>START:(node:57604) DeprecationWarning: Tapable.plugin is deprecated. Use new API on `.hooks` insteadi ｢wdm｣: Hash: 9d2c943b68425fd58dd0Version: webpack 4.31.0Time: 11109msBuilt at: 05/19/2019 12:45:44 PMi ｢wdm｣: Compiled successfully.i ｢wdm｣: Compiling...i ｢wdm｣: Hash: c71383ea847fa44c764dVersion: webpack 4.31.0Time: 13238msBuilt at: 05/19/2019 12:45:46 PM            Asset      Size          Chunks             Chunk Namestest\test.ajax.js  1.03 MiB  test\test.ajax  [emitted]  test\test.ajaxEntrypoint test\test.ajax = test\test.ajax.js[./node_modules/assertion-error/index.js] 2.37 KiB {test\test.ajax} [built][./node_modules/axios/index.js] 40 bytes {test\test.ajax} [built][./node_modules/axios/lib/axios.js] 1.34 KiB {test\test.ajax} [built][./node_modules/axios/lib/cancel/Cancel.js] 385 bytes {test\test.ajax} [built][./node_modules/axios/lib/cancel/CancelToken.js] 1.21 KiB {test\test.ajax} [built][./node_modules/axios/lib/cancel/isCancel.js] 102 bytes {test\test.ajax} [built][./node_modules/axios/lib/core/Axios.js] 2.14 KiB {test\test.ajax} [built][./node_modules/axios/lib/defaults.js] 2.38 KiB {test\test.ajax} [built][./node_modules/axios/lib/helpers/bind.js] 256 bytes {test\test.ajax} [built][./node_modules/axios/lib/helpers/spread.js] 564 bytes {test\test.ajax} [built][./node_modules/axios/lib/utils.js] 7.36 KiB {test\test.ajax} [built][./node_modules/chai/index.js] 40 bytes {test\test.ajax} [built][./node_modules/chai/lib/chai.js] 1.23 KiB {test\test.ajax} [built][./node_modules/chai/lib/chai/assertion.js] 5.59 KiB {test\test.ajax} [built][./test/test.ajax.js] 2.27 KiB {test\test.ajax} [built]    + 52 hidden modulesi ｢wdm｣: Compiled successfully.19 05 2019 12:45:46.787:INFO [karma-server]: Karma v4.1.0 server started at http://0.0.0.0:8080/19 05 2019 12:45:46.789:INFO [launcher]: Launching browsers PhantomJS with concurrency unlimited19 05 2019 12:45:46.847:INFO [launcher]: Starting browser PhantomJS19 05 2019 12:45:50.080:INFO [PhantomJS 2.1.1 (Windows 8.0.0)]: Connected on socket JZtc4FkMxDeeNP59AAAA with id 19235176  Testing about geting the repositories that stars greater than 200000    Check the response data      √ Should be an object      √ Should have property total_count      √ Should have property items      Check the property total_count &amp; items        √ Should be a number        √ Should be a array        √ The length of items should equal total_countFinished in 0.954 secs / 0.007 secs @ 12:45:52 GMT+0800 (China Standard Time)SUMMARY:√ 6 tests completed</code></pre><h1 id="完整-Demo-下载"><a href="#完整-Demo-下载" class="headerlink" title="完整 Demo 下载"></a>完整 Demo 下载</h1><p>下载 <a href="/downloads/ajax-unit-test-demo.zip">ajax-unit-test-demo</a></p><h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><ul><li><a href="https://karma-runner.github.io/latest/index.html" target="_blank" rel="noopener">https://karma-runner.github.io/latest/index.html</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;Web 前端与后端交互一般通过 &lt;code&gt;Ajax&lt;/code&gt; 技术，那么 Ajax 如何来做单元测试呢？&lt;/p&gt;</summary>
    
    
    
    <category term="architect" scheme="https://tanglj.cn/categories/architect/"/>
    
    
    <category term="unit test" scheme="https://tanglj.cn/tags/unit-test/"/>
    
  </entry>
  
  <entry>
    <title>构建 Flutter 开发环境</title>
    <link href="https://tanglj.cn/2019/02/07/how-to-building-flutter-environment/"/>
    <id>https://tanglj.cn/2019/02/07/how-to-building-flutter-environment/</id>
    <published>2019-02-07T10:03:07.000Z</published>
    <updated>2025-03-09T10:21:52.432Z</updated>
    
    <content type="html"><![CDATA[<p>本文纪录不使用 Android Studio 构建 Flutter 开发环境，通过命令行工具更灵活。</p><a id="more"></a><h1 id="获取-Flutter-SDK"><a href="#获取-Flutter-SDK" class="headerlink" title="获取 Flutter SDK"></a>获取 Flutter SDK</h1><p>我们先到 <a href="https://flutter.io/docs/get-started/install" target="_blank" rel="noopener">Flutter 官网</a> 下载对应的 SDK。</p><ul><li><a href="https://flutter.io/docs/get-started/install/windows" target="_blank" rel="noopener">Windows</a></li><li><a href="https://flutter.io/docs/get-started/install/windows" target="_blank" rel="noopener">Mac</a></li><li><a href="https://flutter.io/docs/get-started/install/linux" target="_blank" rel="noopener">Linux</a></li></ul><h1 id="获取-Android-SDK"><a href="#获取-Android-SDK" class="headerlink" title="获取 Android SDK"></a>获取 Android SDK</h1><p>然后到安卓官网，<a href="https://developer.android.com/studio/" target="_blank" rel="noopener">下载 Android SDK</a>，根据你的系统安装对应的 SDK 包。</p><blockquote><p>注意：下载命令行工具</p></blockquote><h1 id="设置环境变量"><a href="#设置环境变量" class="headerlink" title="设置环境变量"></a>设置环境变量</h1><p>现在我们需要设置环境变量以便在控制台使用 SDK 相关的命令。</p><h2 id="Windows"><a href="#Windows" class="headerlink" title="Windows"></a>Windows</h2><p>打开 <code>cmd</code> 执行下面的命令</p><pre><code>setx ANDROID_HOME &quot;C:\Android&quot;setx JAVA_HOME &quot;C:\Java\jdk1.8.0_202&quot;setx PATH &quot;%PATH%C:\flutter\bin&quot;setx PATH &quot;%PATH%%ANDROID_HOME%\tools\bin&quot;</code></pre><blockquote><p>注意：AMD CPU 的电脑需要启动 Control Panel -&gt; Programs -&gt; Hyper-V &amp; Windows Hypervisor Platform，否则会报以下错误</p><p>emulator: ERROR: x86_64 emulation currently requires hardware acceleration! Please ensure Windows Hypervisor Platform (WHPX) is properly installed and usable. CPU acceleration status: Android Emulator requires an Intel processor with VT-x and NX support. Your CPU: ‘AuthenticAMD’</p></blockquote><h2 id="Mac"><a href="#Mac" class="headerlink" title="Mac"></a>Mac</h2><p>在 <code>$HOME/.bash_profile</code> 中添加以下内容</p><pre><code>export ANDROID_HOME=~/androidexport PATH=${PATH}:${ANDROID_HOME}/toolsexport PATH=${PATH}:${ANDROID_HOME}/tools/binexport PATH=${PATH}:$HOME/flutter/bin</code></pre><h2 id="Linux"><a href="#Linux" class="headerlink" title="Linux"></a>Linux</h2><p>在 <code>$HOME/.bash_profile</code> 中添加以下内容</p><pre><code>export ANDROID_HOME=$HOME/Documents/androidexport JAVA_HOME=/usr/java/jdk1.8.0_202-amd64export PATH=$PATH:$HOME/Documents/flutter/binexport PATH=$PATH:$HOME/Documents/android/toolsexport PATH=$PATH:$HOME/Documents/android/tools/bin</code></pre><h2 id="测试-Flutter-可以使用"><a href="#测试-Flutter-可以使用" class="headerlink" title="测试 Flutter 可以使用"></a>测试 Flutter 可以使用</h2><pre><code>flutter --versionFlutter 1.0.0 • channel stable • https://github.com/flutter/flutter.gitFramework • revision 5391447fae (10 weeks ago) • 2018-11-29 19:41:26 -0800Engine • revision 7375a0f414Tools • Dart 2.1.0 (build 2.1.0-dev.9.4 f9ebf21297)</code></pre><h2 id="测试-sdkmanager-可以使用"><a href="#测试-sdkmanager-可以使用" class="headerlink" title="测试 sdkmanager 可以使用"></a>测试 sdkmanager 可以使用</h2><pre><code>sdkmanager --version26.1.1</code></pre><h1 id="创建模拟器"><a href="#创建模拟器" class="headerlink" title="创建模拟器"></a>创建模拟器</h1><p>在开发项目之前我们还需要安装模拟器。</p><h2 id="Android"><a href="#Android" class="headerlink" title="Android"></a>Android</h2><p>开发安卓我们需要安装这些模块</p><ul><li>build-tools;28.0.3</li><li>emulator</li><li>platform-tools</li><li>platforms;android-28</li><li>system-images;android-28;default;x86_64</li></ul><p>使用 <code>sdkmanager &quot;&lt;item&gt;&quot;</code> 安装，安装完毕后我们用以下命令创建一个安卓模拟器</p><pre><code>avdmanager create avd -n ryuu -k &quot;system-images;android-28;default;x86_64&quot; -d 29</code></pre><p>查看安卓模拟器是否创建成功</p><pre><code>flutter emulators1 available emulator:ryuu • 4.65in 720p (Galaxy Nexus) • GenericTo run an emulator, run &#39;flutter emulators --launch &lt;emulator id&gt;&#39;.To create a new emulator, run &#39;flutter emulators --create [--name xyz]&#39;.You can find more information on managing emulators at the links below:  https://developer.android.com/studio/run/managing-avds  https://developer.android.com/studio/command-line/avdmanager</code></pre><p>然后执行下面的命令运行安卓模拟器</p><pre><code>flutter emulators --launch ryuu</code></pre><p>模拟器界面如下</p><p><img src="./android-emulator.png" alt="android-emulator"></p><h2 id="IOS"><a href="#IOS" class="headerlink" title="IOS"></a>IOS</h2><p>我们先到官网下载 <a href="https://developer.apple.com/xcode/download/" target="_blank" rel="noopener">Xcode</a> 并安装，然后根据 <code>fluter doctor</code> 的提示安装相应模块</p><pre><code>brew updatebrew install --HEAD usbmuxdbrew link usbmuxdbrew install --HEAD libimobiledevicebrew install ideviceinstallerbrew install ios-deploybrew install cocoapodspod setup</code></pre><p>模块安装好之后，我们可以用以下命令打开 IOS 模拟器</p><pre><code>open -a Simulator</code></pre><p>模拟器界面如下</p><p><img src="./ios-emulator.png" alt="ios-emulator"></p><h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><ul><li><a href="https://flutter.io/" target="_blank" rel="noopener">https://flutter.io/</a></li><li><a href="https://developer.android.com/studio/#downloads" target="_blank" rel="noopener">https://developer.android.com/studio/#downloads</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文纪录不使用 Android Studio 构建 Flutter 开发环境，通过命令行工具更灵活。&lt;/p&gt;</summary>
    
    
    
    <category term="dart" scheme="https://tanglj.cn/categories/dart/"/>
    
    
    <category term="flutter" scheme="https://tanglj.cn/tags/flutter/"/>
    
    <category term="android" scheme="https://tanglj.cn/tags/android/"/>
    
  </entry>
  
  <entry>
    <title>IOS 微信 webview 中 overflow 值 auto 不能正常工作</title>
    <link href="https://tanglj.cn/2018/11/29/ios-webview-overflow-auto-is-not-work/"/>
    <id>https://tanglj.cn/2018/11/29/ios-webview-overflow-auto-is-not-work/</id>
    <published>2018-11-29T04:40:28.000Z</published>
    <updated>2025-03-09T10:21:52.471Z</updated>
    
    <content type="html"><![CDATA[<p>在 IOS 系统中，微信 webview 中有时候页面加载完成，但是 <code>overflow: auto</code> 属性失效。</p><a id="more"></a><h1 id="问题描述"><a href="#问题描述" class="headerlink" title="问题描述"></a>问题描述</h1><h2 id="Safari-浏览器的渲染流程"><a href="#Safari-浏览器的渲染流程" class="headerlink" title="Safari 浏览器的渲染流程"></a>Safari 浏览器的渲染流程</h2><ol><li>构建 DOM Tree</li><li>构建 CSS Rule Tree</li><li>根据 DOM 和 CSS Tree 来构建 Render Tree</li><li>根据 Render Tree 计算页面的 Layout</li><li>Render 页面</li></ol><p>在第三步和第四部的时候，Safari 浏览器在构建 Render Tree 的时候，会预先找到相应的 <code>overflow: scroll</code> 元素，在计算页面 <code>Layout</code> 的时候，会计算父元素的高度与子元素的高度，若子元素高于父元素，则在 Render 页面时为其建立一个原生的 ScrollView。 也就是说在计算页面 <code>Layout</code> 的时候，子元素高度小于父元素高度则不会建立 ScrollView，也就不会有滚动条。</p><p><img src="./problem.gif" alt="problem"></p><h1 id="解决方法"><a href="#解决方法" class="headerlink" title="解决方法"></a>解决方法</h1><p>根据上述原理，得出解决方案，即在计算页面 <code>Layout</code> 时让子元素的高度大于父元素的高度，使其建立 ScrollView。</p><pre class=" language-html"><code class="language-html">Layout  .index    .inner      ...      div(style="height: calc(.5rem)")</code></pre><p>由于我的 <code>.inner</code> 元素高度为 <code>100%</code>，内部有许多异步渲染组件，由于数据返回延迟导致计算页面 <code>Layout</code> 时子元素高度小于等于父元素高度，无法建立 ScrollView。因此我在最后面加入一个临时元素设置一个高度，使其在组件渲染前将 <code>.inner</code> 的高度撑开并建立 ScrollView。</p><p><img src="./solve.gif" alt="solve"></p><h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><ul><li><a href="https://segmentfault.com/a/1190000016408566" target="_blank" rel="noopener">https://segmentfault.com/a/1190000016408566</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;在 IOS 系统中，微信 webview 中有时候页面加载完成，但是 &lt;code&gt;overflow: auto&lt;/code&gt; 属性失效。&lt;/p&gt;</summary>
    
    
    
    <category term="web" scheme="https://tanglj.cn/categories/web/"/>
    
    
    <category term="wechat" scheme="https://tanglj.cn/tags/wechat/"/>
    
  </entry>
  
  <entry>
    <title>IOS 微信 webview 中使用 alert 时不显示当前域名</title>
    <link href="https://tanglj.cn/2018/11/28/do-not-show-host-in-ios-wx-webview-with-alert/"/>
    <id>https://tanglj.cn/2018/11/28/do-not-show-host-in-ios-wx-webview-with-alert/</id>
    <published>2018-11-28T09:47:24.000Z</published>
    <updated>2025-03-09T10:21:52.295Z</updated>
    
    <content type="html"><![CDATA[<p>在 IOS 微信中，系统 alert 会在对话框上自动添加网址，对于用户体验不是很友好。</p><a id="more"></a><h1 id="问题描述"><a href="#问题描述" class="headerlink" title="问题描述"></a>问题描述</h1><p>调用系统 alert 时，系统默认带上当前网址的域名，用户体验不好</p><p><img src="./before.gif" alt="before"></p><h1 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h1><p>我们可以重写 <code>alert</code> 方法，利用 iframe 中子 <code>window</code> 的 <code>alert</code> 方法</p><pre class=" language-js"><code class="language-js">window<span class="token punctuation">.</span>alert <span class="token operator">=</span> <span class="token keyword">function</span><span class="token punctuation">(</span>name<span class="token punctuation">)</span><span class="token punctuation">{</span>  <span class="token keyword">var</span> iframe <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">createElement</span><span class="token punctuation">(</span><span class="token string">"iframe"</span><span class="token punctuation">)</span>  iframe<span class="token punctuation">.</span>style<span class="token punctuation">.</span>display <span class="token operator">=</span> <span class="token string">'none'</span>  iframe<span class="token punctuation">.</span><span class="token function">setAttribute</span><span class="token punctuation">(</span><span class="token string">'src'</span><span class="token punctuation">,</span> <span class="token string">'data:text/plain'</span><span class="token punctuation">)</span>  document<span class="token punctuation">.</span>body<span class="token punctuation">.</span><span class="token function">appendChild</span><span class="token punctuation">(</span>iframe<span class="token punctuation">)</span>  frames<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>window<span class="token punctuation">.</span><span class="token function">alert</span><span class="token punctuation">(</span>name<span class="token punctuation">)</span>  iframe<span class="token punctuation">.</span>parentNode<span class="token punctuation">.</span><span class="token function">removeChild</span><span class="token punctuation">(</span>iframe<span class="token punctuation">)</span><span class="token punctuation">}</span></code></pre><p><img src="./after.gif" alt="after"></p><h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><ul><li><a href="https://blog.csdn.net/kirsten_z/article/details/79696220" target="_blank" rel="noopener">https://blog.csdn.net/kirsten_z/article/details/79696220</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;在 IOS 微信中，系统 alert 会在对话框上自动添加网址，对于用户体验不是很友好。&lt;/p&gt;</summary>
    
    
    
    <category term="web" scheme="https://tanglj.cn/categories/web/"/>
    
    
    <category term="wechat" scheme="https://tanglj.cn/tags/wechat/"/>
    
  </entry>
  
  <entry>
    <title>IOS 中 input 输入框的一些怪异行为</title>
    <link href="https://tanglj.cn/2018/11/23/some-quirks-of-ios-input/"/>
    <id>https://tanglj.cn/2018/11/23/some-quirks-of-ios-input/</id>
    <published>2018-11-23T09:26:40.000Z</published>
    <updated>2025-03-09T10:21:52.716Z</updated>
    
    <content type="html"><![CDATA[<p>最近有一些项目在 IOS 系统中出现了一些奇怪的问题，这些问题是关于 &lt;input&gt; 标签的一些怪异行为。</p><a id="more"></a><h1 id="IOS-键盘左上角切换表单元素"><a href="#IOS-键盘左上角切换表单元素" class="headerlink" title="IOS 键盘左上角切换表单元素"></a>IOS 键盘左上角切换表单元素</h1><p>IOS 会自动检测页面的表单元素自动并分配 tabindex 索引让用户可以快速切换表单元素，但这也会造成一些网页开发上的问题。</p><h2 id="问题描述"><a href="#问题描述" class="headerlink" title="问题描述"></a>问题描述</h2><p>页面中存在表单元素</p><p><img src="./form.png" alt="form"></p><p>页面浮层也是一个表单</p><p><img src="./modalbox-focus.png" alt="modalbox-focus"></p><p>这时候点击左上角的 <code>上</code> <code>下</code> 按钮</p><p><img src="./keyboard.png" alt="keyboard"></p><p>产生光标定位到下层表单元素中</p><p><img src="./modalbox.png" alt="modalbox"></p><h2 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h2><p>经过搜索资料后，得出解决方案，<em>在表单元素上面添加 <code>tabindex=&quot;-1&quot;</code> 属性</em></p><pre class=" language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>text<span class="token punctuation">"</span></span> <span class="token attr-name">tabindex</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>-1<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></code></pre><p>这样 IOS 左上角的 <code>上</code> <code>下</code> 箭头就被禁用了，也就修复了该问题</p><p><img src="./ios-input-quirks-fixed.png" alt="ios-input-quirks-fixed"></p><h1 id="IOS-禁止输入中文"><a href="#IOS-禁止输入中文" class="headerlink" title="IOS 禁止输入中文"></a>IOS 禁止输入中文</h1><p>我们在做验证码的时候，希望用户只能输入英文和数字，但在 IOS 中并不能很好的实现这个功能。</p><h2 id="问题描述-1"><a href="#问题描述-1" class="headerlink" title="问题描述"></a>问题描述</h2><p>页面中 <code>&lt;input&gt;</code> 设置了 <code>maxlength</code> 限制 4 个字符，<code>oninput</code> 事件中用于移除中文字符，但是在 IOS 中没有效果</p><p><img src="./can-input-chinese.png" alt="can-input-chinese"></p><h2 id="解决方案-1"><a href="#解决方案-1" class="headerlink" title="解决方案"></a>解决方案</h2><p>利用 <code>compositionstart</code>，<code>compositionend</code>，<code>input</code></p><pre class=" language-js"><code class="language-js">inputElement<span class="token punctuation">.</span><span class="token function">addEventListener</span><span class="token punctuation">(</span><span class="token string">'compositionstart'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>  <span class="token keyword">this</span><span class="token punctuation">.</span>lock <span class="token operator">=</span> <span class="token boolean">true</span>  <span class="token keyword">this</span><span class="token punctuation">.</span>regExpRule <span class="token operator">=</span> <span class="token regex">/[^0-9a-zA-Z]/g</span><span class="token punctuation">}</span><span class="token punctuation">)</span>inputElement<span class="token punctuation">.</span><span class="token function">addEventListener</span><span class="token punctuation">(</span><span class="token string">'compositionend'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>  <span class="token keyword">this</span><span class="token punctuation">.</span>lock <span class="token operator">=</span> <span class="token boolean">false</span>  <span class="token keyword">this</span><span class="token punctuation">.</span>value <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>value<span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>regExpRule<span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">)</span>inputElement<span class="token punctuation">.</span><span class="token function">addEventListener</span><span class="token punctuation">(</span><span class="token string">'input'</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>  <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">this</span><span class="token punctuation">.</span>lock<span class="token punctuation">)</span> <span class="token punctuation">{</span>    <span class="token keyword">this</span><span class="token punctuation">.</span>value <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>value<span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>regExpRule<span class="token punctuation">,</span> <span class="token string">''</span><span class="token punctuation">)</span>  <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">)</span></code></pre>]]></content>
    
    
    <summary type="html">&lt;p&gt;最近有一些项目在 IOS 系统中出现了一些奇怪的问题，这些问题是关于 &amp;lt;input&amp;gt; 标签的一些怪异行为。&lt;/p&gt;</summary>
    
    
    
    <category term="html" scheme="https://tanglj.cn/categories/html/"/>
    
    
    <category term="input" scheme="https://tanglj.cn/tags/input/"/>
    
  </entry>
  
  <entry>
    <title>移动端设置了 autofocus 属性的 input 标签无法打开输入法键盘</title>
    <link href="https://tanglj.cn/2018/08/23/fail-to-open-keyboard-with-autofocus-of-input/"/>
    <id>https://tanglj.cn/2018/08/23/fail-to-open-keyboard-with-autofocus-of-input/</id>
    <published>2018-08-22T16:51:54.000Z</published>
    <updated>2025-03-09T10:21:52.355Z</updated>
    
    <content type="html"><![CDATA[<p>众所周知 <code>input</code> 标签有一个 <code>autofocus</code> 属性，用于对 <code>input</code> 标签执行自动获取焦点的行为。但是在移动端，由于移动设备的行为设计，设置了 <code>autofocus</code> 属性的 <code>input</code> 标签并不能如预期的那样自动获取焦点并弹出输入法键盘，在 iphone 手机中甚至无法自动获取焦点。</p><a id="more"></a><h1 id="失败的案例"><a href="#失败的案例" class="headerlink" title="失败的案例"></a>失败的案例</h1><p><img src="./android-wechat-webview.jpg" alt="Android-Wechat-Webview"></p><p>我们可以看到在 Android 中虽然 <code>input</code> 标签自动获取了焦点，但是并没有自动弹出输入框。演示代码如下：</p><pre class=" language-html"><code class="language-html"><span class="token doctype">&lt;!DOCTYPE html></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>en<span class="token punctuation">"</span></span> <span class="token attr-name">dir</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>ltr<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>utf-8<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>viewport<span class="token punctuation">"</span></span> <span class="token attr-name">content</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>width<span class="token punctuation">=</span>device-width, initial-scale<span class="token punctuation">=</span>1, maximum-scale<span class="token punctuation">=</span>1, user-scalable<span class="token punctuation">=</span>no<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>移动端设置了 autofocus 属性的 input 标签无法打开输入法键盘<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>myInput<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>password<span class="token punctuation">"</span></span> <span class="token attr-name">placeholder</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>输入密码<span class="token punctuation">"</span></span> <span class="token attr-name">autofocus</span> <span class="token punctuation">/></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></code></pre><h1 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h1><p>我的解决方案是通过用户行为来触发 <code>input</code> 标签的焦点事件，从而正确弹出输入框。</p><p><img src="./success-demo-android-wechat-webview.jpg" alt="success-demo-android-wechat-webview"></p><p>当用户点击 <code>重新输入密码</code> 时即可弹出输入框了。</p><p><img src="./success-demo-android-wechat-webview-2.jpg" alt="success-demo-android-wechat-webview-2"></p><p>演示代码如下：</p><pre class=" language-html"><code class="language-html"><span class="token doctype">&lt;!DOCTYPE html></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>en<span class="token punctuation">"</span></span> <span class="token attr-name">dir</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>ltr<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>utf-8<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>viewport<span class="token punctuation">"</span></span> <span class="token attr-name">content</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>width<span class="token punctuation">=</span>device-width, initial-scale<span class="token punctuation">=</span>1, maximum-scale<span class="token punctuation">=</span>1, user-scalable<span class="token punctuation">=</span>no<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>https://res.wx.qq.com/open/libs/weui/1.1.3/weui.min.css<span class="token punctuation">"</span></span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>input</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>myInput<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>password<span class="token punctuation">"</span></span> <span class="token attr-name">placeholder</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>输入密码<span class="token punctuation">"</span></span> <span class="token attr-name">autofocus</span> <span class="token punctuation">/></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>https://res.wx.qq.com/open/libs/weuijs/1.1.4/weui.min.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script language-javascript"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script language-javascript">      <span class="token keyword">var</span> myInput <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">'myInput'</span><span class="token punctuation">)</span>      weui<span class="token punctuation">.</span><span class="token function">confirm</span><span class="token punctuation">(</span><span class="token string">'只有用户行为才能在 input 元素触发 focus() 事件时调起键盘'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>        title<span class="token punctuation">:</span> <span class="token string">'提示：'</span><span class="token punctuation">,</span>        buttons<span class="token punctuation">:</span> <span class="token punctuation">[</span>          <span class="token punctuation">{</span>            label<span class="token punctuation">:</span> <span class="token string">'我知道了'</span><span class="token punctuation">,</span>            type<span class="token punctuation">:</span> <span class="token string">'default'</span>          <span class="token punctuation">}</span><span class="token punctuation">,</span>          <span class="token punctuation">{</span>            label<span class="token punctuation">:</span> <span class="token string">'重新输入密码'</span><span class="token punctuation">,</span>            onClick<span class="token punctuation">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>              myInput<span class="token punctuation">.</span><span class="token function">focus</span><span class="token punctuation">(</span><span class="token punctuation">)</span>            <span class="token punctuation">}</span>          <span class="token punctuation">}</span>        <span class="token punctuation">]</span>      <span class="token punctuation">}</span><span class="token punctuation">)</span>    </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></code></pre><h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><ul><li><a href="https://stackoverflow.com/questions/23722816/autofocus-text-field-on-mobile-but-no-keyboard" target="_blank" rel="noopener">https://stackoverflow.com/questions/23722816/autofocus-text-field-on-mobile-but-no-keyboard</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;众所周知 &lt;code&gt;input&lt;/code&gt; 标签有一个 &lt;code&gt;autofocus&lt;/code&gt; 属性，用于对 &lt;code&gt;input&lt;/code&gt; 标签执行自动获取焦点的行为。但是在移动端，由于移动设备的行为设计，设置了 &lt;code&gt;autofocus&lt;/code&gt; 属性的 &lt;code&gt;input&lt;/code&gt; 标签并不能如预期的那样自动获取焦点并弹出输入法键盘，在 iphone 手机中甚至无法自动获取焦点。&lt;/p&gt;</summary>
    
    
    
    <category term="html" scheme="https://tanglj.cn/categories/html/"/>
    
    
    <category term="input" scheme="https://tanglj.cn/tags/input/"/>
    
  </entry>
  
  <entry>
    <title>解读 Layabox 示例 10</title>
    <link href="https://tanglj.cn/2018/06/21/read-layabox-demo-10/"/>
    <id>https://tanglj.cn/2018/06/21/read-layabox-demo-10/</id>
    <published>2018-06-21T02:50:32.000Z</published>
    <updated>2025-03-09T10:21:52.611Z</updated>
    
    <content type="html"><![CDATA[<p>本文解读第十个 layabox 引擎示例（<code>切换纹理</code>）</p><a id="more"></a><h1 id="示例效果"><a href="#示例效果" class="headerlink" title="示例效果"></a>示例效果</h1><p><img src="./result.gif" alt="result"></p><h1 id="概念简介"><a href="#概念简介" class="headerlink" title="概念简介"></a>概念简介</h1><p>本示例中的概念均在示例一中描述。<a href="/2018/05/25/read-layabox-demo-1/#%E6%A6%82%E5%BF%B5%E7%AE%80%E4%BB%8B">查看</a></p><h1 id="示例代码"><a href="#示例代码" class="headerlink" title="示例代码"></a>示例代码</h1><pre class=" language-html"><code class="language-html"><span class="token doctype">&lt;!DOCTYPE html></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">'</span>en<span class="token punctuation">'</span></span> <span class="token attr-name">dir</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">'</span>ltr<span class="token punctuation">'</span></span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">'</span>utf-8<span class="token punctuation">'</span></span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>切换纹理<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">'</span>./LayaAirJS_1.7.19.1_beta/js/libs/laya.core.js<span class="token punctuation">'</span></span><span class="token punctuation">></span></span><span class="token script language-javascript"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">'</span>./LayaAirJS_1.7.19.1_beta/js/libs/laya.webgl.js<span class="token punctuation">'</span></span><span class="token punctuation">></span></span><span class="token script language-javascript"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script language-javascript">      <span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>        <span class="token keyword">var</span> Sprite <span class="token operator">=</span> Laya<span class="token punctuation">.</span>Sprite        <span class="token keyword">var</span> Stage <span class="token operator">=</span> Laya<span class="token punctuation">.</span>Stage        <span class="token keyword">var</span> Texture <span class="token operator">=</span> Laya<span class="token punctuation">.</span>Texture        <span class="token keyword">var</span> Browser <span class="token operator">=</span> Laya<span class="token punctuation">.</span>Browser        <span class="token keyword">var</span> Handler <span class="token operator">=</span> Laya<span class="token punctuation">.</span>Handler        <span class="token keyword">var</span> WebGL <span class="token operator">=</span> Laya<span class="token punctuation">.</span>WebGL        <span class="token keyword">var</span> texture1 <span class="token operator">=</span> <span class="token string">'./res/apes/monkey2.png'</span>        <span class="token keyword">var</span> texture2 <span class="token operator">=</span> <span class="token string">'./res/apes/monkey3.png'</span>        <span class="token keyword">var</span> flag <span class="token operator">=</span> <span class="token boolean">false</span>        <span class="token keyword">var</span> ape        <span class="token punctuation">;</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>          <span class="token comment" spellcheck="true">// 不支持WebGL时自动切换至Canvas</span>          Laya<span class="token punctuation">.</span><span class="token function">init</span><span class="token punctuation">(</span>Browser<span class="token punctuation">.</span>clientWidth<span class="token punctuation">,</span> Browser<span class="token punctuation">.</span>clientHeight<span class="token punctuation">,</span> WebGL<span class="token punctuation">)</span>          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>alignV <span class="token operator">=</span> Stage<span class="token punctuation">.</span>ALIGN_MIDDLE          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>alignH <span class="token operator">=</span> Stage<span class="token punctuation">.</span>ALIGN_CENTER          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>scaleMode <span class="token operator">=</span> <span class="token string">'showall'</span>          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>bgColor <span class="token operator">=</span> <span class="token string">'#232628'</span>          <span class="token comment" spellcheck="true">// 加载资源</span>          Laya<span class="token punctuation">.</span>loader<span class="token punctuation">.</span><span class="token function">load</span><span class="token punctuation">(</span><span class="token punctuation">[</span> texture1<span class="token punctuation">,</span> texture2 <span class="token punctuation">]</span><span class="token punctuation">,</span> Handler<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">,</span> onAssetsLoaded<span class="token punctuation">)</span><span class="token punctuation">)</span>        <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">function</span> <span class="token function">onAssetsLoaded</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>          <span class="token comment" spellcheck="true">// 实例化一个猩猩</span>          ape <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Sprite</span><span class="token punctuation">(</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 设置轴心点</span>          ape<span class="token punctuation">.</span><span class="token function">pivot</span><span class="token punctuation">(</span><span class="token number">55</span><span class="token punctuation">,</span> <span class="token number">72</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 设置坐标位置</span>          ape<span class="token punctuation">.</span><span class="token function">pos</span><span class="token punctuation">(</span>Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>width <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">,</span> Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>height <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 添加到舞台中</span>          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span><span class="token function">addChild</span><span class="token punctuation">(</span>ape<span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 显示默认纹理</span>          <span class="token function">switchTexture</span><span class="token punctuation">(</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 点击时切换纹理</span>          ape<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'click'</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">,</span> switchTexture<span class="token punctuation">)</span>        <span class="token punctuation">}</span>        <span class="token keyword">function</span> <span class="token function">switchTexture</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>          <span class="token keyword">var</span> textureUrl <span class="token operator">=</span> <span class="token punctuation">(</span>flag <span class="token operator">=</span> <span class="token operator">!</span>flag<span class="token punctuation">)</span> <span class="token operator">?</span> texture1 <span class="token punctuation">:</span> texture2          <span class="token comment" spellcheck="true">// 清空上一次绘制的图像</span>          ape<span class="token punctuation">.</span>graphics<span class="token punctuation">.</span><span class="token function">clear</span><span class="token punctuation">(</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 加载新图像</span>          <span class="token keyword">var</span> texture <span class="token operator">=</span> Laya<span class="token punctuation">.</span>loader<span class="token punctuation">.</span><span class="token function">getRes</span><span class="token punctuation">(</span>textureUrl<span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 绘制纹理</span>          ape<span class="token punctuation">.</span>graphics<span class="token punctuation">.</span><span class="token function">drawTexture</span><span class="token punctuation">(</span>texture<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 重置绘制图像的宽高</span>          ape<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span>texture<span class="token punctuation">.</span>width<span class="token punctuation">,</span> texture<span class="token punctuation">.</span>height<span class="token punctuation">)</span>        <span class="token punctuation">}</span>      <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>    </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></code></pre><h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><ul><li><a href="https://www.layabox.com/" target="_blank" rel="noopener">https://www.layabox.com</a></li><li><a href="https://layaair.ldc.layabox.com/demo/?category=2d&group=Sprite&name=SwitchTexture" target="_blank" rel="noopener">https://layaair.ldc.layabox.com/demo/?category=2d&amp;group=Sprite&amp;name=SwitchTexture</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文解读第十个 layabox 引擎示例（&lt;code&gt;切换纹理&lt;/code&gt;）&lt;/p&gt;</summary>
    
    
    
    <category term="layabox" scheme="https://tanglj.cn/categories/layabox/"/>
    
    
    <category term="es5" scheme="https://tanglj.cn/tags/es5/"/>
    
  </entry>
  
  <entry>
    <title>解读 Layabox 示例 09</title>
    <link href="https://tanglj.cn/2018/06/21/read-layabox-demo-9/"/>
    <id>https://tanglj.cn/2018/06/21/read-layabox-demo-9/</id>
    <published>2018-06-21T02:38:18.000Z</published>
    <updated>2025-03-09T10:21:52.697Z</updated>
    
    <content type="html"><![CDATA[<p>本文解读第八个 layabox 引擎示例（<code>轴心点</code>）</p><a id="more"></a><h1 id="示例效果"><a href="#示例效果" class="headerlink" title="示例效果"></a>示例效果</h1><p><img src="./result.gif" alt="result"></p><h1 id="概念简介"><a href="#概念简介" class="headerlink" title="概念简介"></a>概念简介</h1><p>本示例中的概念均在示例一中描述。<a href="/2018/05/25/read-layabox-demo-1/#%E6%A6%82%E5%BF%B5%E7%AE%80%E4%BB%8B">查看</a></p><h1 id="示例代码"><a href="#示例代码" class="headerlink" title="示例代码"></a>示例代码</h1><pre class=" language-html"><code class="language-html"><span class="token doctype">&lt;!DOCTYPE html></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">'</span>en<span class="token punctuation">'</span></span> <span class="token attr-name">dir</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">'</span>ltr<span class="token punctuation">'</span></span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">'</span>utf-8<span class="token punctuation">'</span></span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>轴心点<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">'</span>./LayaAirJS_1.7.19.1_beta/js/libs/laya.core.js<span class="token punctuation">'</span></span><span class="token punctuation">></span></span><span class="token script language-javascript"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">'</span>./LayaAirJS_1.7.19.1_beta/js/libs/laya.webgl.js<span class="token punctuation">'</span></span><span class="token punctuation">></span></span><span class="token script language-javascript"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script language-javascript">      <span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>        <span class="token keyword">var</span> Sprite <span class="token operator">=</span> Laya<span class="token punctuation">.</span>Sprite        <span class="token keyword">var</span> Stage <span class="token operator">=</span> Laya<span class="token punctuation">.</span>Stage        <span class="token keyword">var</span> Browser <span class="token operator">=</span> Laya<span class="token punctuation">.</span>Browser        <span class="token keyword">var</span> WebGL <span class="token operator">=</span> Laya<span class="token punctuation">.</span>WebGL        <span class="token keyword">var</span> sp1<span class="token punctuation">,</span> sp2        <span class="token punctuation">;</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>          <span class="token comment" spellcheck="true">// 不支持WebGL时自动切换至Canvas</span>          Laya<span class="token punctuation">.</span><span class="token function">init</span><span class="token punctuation">(</span>Browser<span class="token punctuation">.</span>clientWidth<span class="token punctuation">,</span> Browser<span class="token punctuation">.</span>clientHeight<span class="token punctuation">,</span> WebGL<span class="token punctuation">)</span>          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>alignV <span class="token operator">=</span> Stage<span class="token punctuation">.</span>ALIGN_MIDDLE          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>alignH <span class="token operator">=</span> Stage<span class="token punctuation">.</span>ALIGN_CENTER          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>scaleMode <span class="token operator">=</span> <span class="token string">'showall'</span>          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>bgColor <span class="token operator">=</span> <span class="token string">'#232628'</span>          <span class="token function">createApes</span><span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">function</span> <span class="token function">createApes</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>          <span class="token comment" spellcheck="true">// 设置间隔距离 300</span>          <span class="token keyword">var</span> gap <span class="token operator">=</span> <span class="token number">300</span>          <span class="token comment" spellcheck="true">// 加载猩猩 1，并设置轴心点</span>          sp1 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Sprite</span><span class="token punctuation">(</span><span class="token punctuation">)</span>          sp1<span class="token punctuation">.</span><span class="token function">loadImage</span><span class="token punctuation">(</span><span class="token string">'./res/apes/monkey2.png'</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span>          sp1<span class="token punctuation">.</span><span class="token function">pos</span><span class="token punctuation">(</span><span class="token punctuation">(</span>Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>width <span class="token operator">-</span> gap<span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">,</span> Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>height <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">)</span>          sp1<span class="token punctuation">.</span><span class="token function">pivot</span><span class="token punctuation">(</span><span class="token number">55</span><span class="token punctuation">,</span> <span class="token number">72</span><span class="token punctuation">)</span>          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span><span class="token function">addChild</span><span class="token punctuation">(</span>sp1<span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 加载猩猩 2，不设置轴心点，默认为左上角</span>          sp2 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Sprite</span><span class="token punctuation">(</span><span class="token punctuation">)</span>          sp2<span class="token punctuation">.</span><span class="token function">loadImage</span><span class="token punctuation">(</span><span class="token string">'./res/apes/monkey2.png'</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span>          sp2<span class="token punctuation">.</span><span class="token function">pos</span><span class="token punctuation">(</span><span class="token punctuation">(</span>Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>width <span class="token operator">+</span> gap<span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">,</span> Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>height <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">)</span>          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span><span class="token function">addChild</span><span class="token punctuation">(</span>sp2<span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 添加逐帧动画</span>          Laya<span class="token punctuation">.</span>timer<span class="token punctuation">.</span><span class="token function">frameLoop</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">,</span> animate<span class="token punctuation">)</span>        <span class="token punctuation">}</span>        <span class="token keyword">function</span> <span class="token function">animate</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span> <span class="token punctuation">{</span>          <span class="token comment" spellcheck="true">// 以轴心点旋转</span>          sp1<span class="token punctuation">.</span>rotation <span class="token operator">+</span><span class="token operator">=</span> <span class="token number">2</span>          <span class="token comment" spellcheck="true">// 以左上角旋转</span>          sp2<span class="token punctuation">.</span>rotation <span class="token operator">+</span><span class="token operator">=</span> <span class="token number">2</span>        <span class="token punctuation">}</span>      <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>    </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></code></pre><h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><ul><li><a href="https://www.layabox.com/" target="_blank" rel="noopener">https://www.layabox.com</a></li><li><a href="https://layaair.ldc.layabox.com/demo/?category=2d&group=Sprite&name=Pivot" target="_blank" rel="noopener">https://layaair.ldc.layabox.com/demo/?category=2d&amp;group=Sprite&amp;name=Pivot</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文解读第八个 layabox 引擎示例（&lt;code&gt;轴心点&lt;/code&gt;）&lt;/p&gt;</summary>
    
    
    
    <category term="layabox" scheme="https://tanglj.cn/categories/layabox/"/>
    
    
    <category term="es5" scheme="https://tanglj.cn/tags/es5/"/>
    
  </entry>
  
  <entry>
    <title>解读 Layabox 示例 08</title>
    <link href="https://tanglj.cn/2018/06/21/read-layabox-demo-8/"/>
    <id>https://tanglj.cn/2018/06/21/read-layabox-demo-8/</id>
    <published>2018-06-20T17:09:19.000Z</published>
    <updated>2025-03-09T10:21:52.682Z</updated>
    
    <content type="html"><![CDATA[<p>本文解读第八个 layabox 引擎示例（<code>节点控制</code>）</p><a id="more"></a><h1 id="示例效果"><a href="#示例效果" class="headerlink" title="示例效果"></a>示例效果</h1><p><img src="./result.gif" alt="result"></p><h1 id="概念简介"><a href="#概念简介" class="headerlink" title="概念简介"></a>概念简介</h1><p>本示例中的概念均在示例一中描述。<a href="/2018/05/25/read-layabox-demo-1/#%E6%A6%82%E5%BF%B5%E7%AE%80%E4%BB%8B">查看</a></p><h1 id="示例代码"><a href="#示例代码" class="headerlink" title="示例代码"></a>示例代码</h1><pre class=" language-html"><code class="language-html"><span class="token doctype">&lt;!DOCTYPE html></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">'</span>en<span class="token punctuation">'</span></span> <span class="token attr-name">dir</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">'</span>ltr<span class="token punctuation">'</span></span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">'</span>utf-8<span class="token punctuation">'</span></span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>节点控制<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">'</span>./LayaAirJS_1.7.19.1_beta/js/libs/laya.core.js<span class="token punctuation">'</span></span><span class="token punctuation">></span></span><span class="token script language-javascript"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">'</span>./LayaAirJS_1.7.19.1_beta/js/libs/laya.webgl.js<span class="token punctuation">'</span></span><span class="token punctuation">></span></span><span class="token script language-javascript"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script language-javascript">      <span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>        <span class="token keyword">var</span> Sprite <span class="token operator">=</span> Laya<span class="token punctuation">.</span>Sprite        <span class="token keyword">var</span> Stage <span class="token operator">=</span> Laya<span class="token punctuation">.</span>Stage        <span class="token keyword">var</span> Browser <span class="token operator">=</span> Laya<span class="token punctuation">.</span>Browser        <span class="token keyword">var</span> WebGL <span class="token operator">=</span> Laya<span class="token punctuation">.</span>WebGL        <span class="token keyword">var</span> ape1        <span class="token keyword">var</span> ape2        <span class="token punctuation">;</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>          <span class="token comment" spellcheck="true">// 不支持WebGL时自动切换至Canvas</span>          Laya<span class="token punctuation">.</span><span class="token function">init</span><span class="token punctuation">(</span>Browser<span class="token punctuation">.</span>clientWidth<span class="token punctuation">,</span> Browser<span class="token punctuation">.</span>clientHeight<span class="token punctuation">,</span> WebGL<span class="token punctuation">)</span>          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>alignV <span class="token operator">=</span> Stage<span class="token punctuation">.</span>ALIGN_MIDDLE          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>alignH <span class="token operator">=</span> Stage<span class="token punctuation">.</span>ALIGN_CENTER          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>scaleMode <span class="token operator">=</span> <span class="token string">'showall'</span>          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>bgColor <span class="token operator">=</span> <span class="token string">'#232628'</span>          <span class="token function">createApes</span><span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">function</span> <span class="token function">createApes</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>          <span class="token comment" spellcheck="true">// 加载两只猩猩</span>          ape1 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Sprite</span><span class="token punctuation">(</span><span class="token punctuation">)</span>          ape2 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Sprite</span><span class="token punctuation">(</span><span class="token punctuation">)</span>          ape1<span class="token punctuation">.</span><span class="token function">loadImage</span><span class="token punctuation">(</span><span class="token string">'./res/apes/monkey2.png'</span><span class="token punctuation">)</span>          ape2<span class="token punctuation">.</span><span class="token function">loadImage</span><span class="token punctuation">(</span><span class="token string">'./res/apes/monkey2.png'</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 设置中心点为 55, 72，即图像大小的 1/2</span>          ape1<span class="token punctuation">.</span><span class="token function">pivot</span><span class="token punctuation">(</span><span class="token number">55</span><span class="token punctuation">,</span> <span class="token number">72</span><span class="token punctuation">)</span>          ape2<span class="token punctuation">.</span><span class="token function">pivot</span><span class="token punctuation">(</span><span class="token number">55</span><span class="token punctuation">,</span> <span class="token number">72</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 猩猩 1 放在舞台中间位置</span>          ape1<span class="token punctuation">.</span><span class="token function">pos</span><span class="token punctuation">(</span>Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>width <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">,</span> Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>height <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 猩猩 2 放在 x 轴 200，y 轴 0 的位置</span>          ape2<span class="token punctuation">.</span><span class="token function">pos</span><span class="token punctuation">(</span><span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 猩猩 1 添加到舞台中</span>          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span><span class="token function">addChild</span><span class="token punctuation">(</span>ape1<span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 猩猩 2 添加为猩猩 1 的子集</span>          ape1<span class="token punctuation">.</span><span class="token function">addChild</span><span class="token punctuation">(</span>ape2<span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 添加逐帧动画</span>          Laya<span class="token punctuation">.</span>timer<span class="token punctuation">.</span><span class="token function">frameLoop</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">,</span> animate<span class="token punctuation">)</span>        <span class="token punctuation">}</span>        <span class="token keyword">function</span> <span class="token function">animate</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span> <span class="token punctuation">{</span>          <span class="token comment" spellcheck="true">// 由于 ape2 是 ape1 的子集，所以 ape1 旋转时 ape2 跟着一起旋转</span>          ape1<span class="token punctuation">.</span>rotation <span class="token operator">+</span><span class="token operator">=</span> <span class="token number">2</span>          <span class="token comment" spellcheck="true">// ape2 旋转不影响 ape1</span>          ape2<span class="token punctuation">.</span>rotation <span class="token operator">-</span><span class="token operator">=</span> <span class="token number">4</span>        <span class="token punctuation">}</span>      <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>    </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></code></pre><h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><ul><li><a href="https://www.layabox.com/" target="_blank" rel="noopener">https://www.layabox.com</a></li><li><a href="https://layaair.ldc.layabox.com/demo/?category=2d&group=Sprite&name=NodeControl" target="_blank" rel="noopener">https://layaair.ldc.layabox.com/demo/?category=2d&amp;group=Sprite&amp;name=NodeControl</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文解读第八个 layabox 引擎示例（&lt;code&gt;节点控制&lt;/code&gt;）&lt;/p&gt;</summary>
    
    
    
    <category term="layabox" scheme="https://tanglj.cn/categories/layabox/"/>
    
    
    <category term="es5" scheme="https://tanglj.cn/tags/es5/"/>
    
  </entry>
  
  <entry>
    <title>解读 Layabox 示例 07</title>
    <link href="https://tanglj.cn/2018/06/19/read-layabox-demo-7/"/>
    <id>https://tanglj.cn/2018/06/19/read-layabox-demo-7/</id>
    <published>2018-06-19T06:15:14.000Z</published>
    <updated>2025-03-09T10:21:52.674Z</updated>
    
    <content type="html"><![CDATA[<p>本文解读第七个 layabox 引擎示例（<code>缓存为静态图像</code>）</p><a id="more"></a><h1 id="示例效果"><a href="#示例效果" class="headerlink" title="示例效果"></a>示例效果</h1><p><img src="./result.png" alt="result"></p><h1 id="概念简介"><a href="#概念简介" class="headerlink" title="概念简介"></a>概念简介</h1><h2 id="Text-类"><a href="#Text-类" class="headerlink" title="Text 类"></a>Text 类</h2><p>Text 类用于创建显示对象以显示文本。<a href="https://layaair.ldc.layabox.com/api/?category=Core&class=laya.display.Text" target="_blank" rel="noopener">API 详情</a></p><h2 id="Stat-类"><a href="#Stat-类" class="headerlink" title="Stat 类"></a>Stat 类</h2><p>Stat 类是一个性能统计面板，可以实时更新相关的性能参数。<a href="https://layaair.ldc.layabox.com/api/?category=Core&class=laya.utils.Stat" target="_blank" rel="noopener">API 详情</a></p><h2 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h2><p>其余概念均在示例一中描述。<a href="/2018/05/25/read-layabox-demo-1/#%E6%A6%82%E5%BF%B5%E7%AE%80%E4%BB%8B">查看</a></p><h1 id="示例代码"><a href="#示例代码" class="headerlink" title="示例代码"></a>示例代码</h1><pre class=" language-html"><code class="language-html"><span class="token doctype">&lt;!DOCTYPE html></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">'</span>en<span class="token punctuation">'</span></span> <span class="token attr-name">dir</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">'</span>ltr<span class="token punctuation">'</span></span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">'</span>utf-8<span class="token punctuation">'</span></span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>缓存为静态图像<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">'</span>./LayaAirJS_1.7.19.1_beta/js/libs/laya.core.js<span class="token punctuation">'</span></span><span class="token punctuation">></span></span><span class="token script language-javascript"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">'</span>./LayaAirJS_1.7.19.1_beta/js/libs/laya.webgl.js<span class="token punctuation">'</span></span><span class="token punctuation">></span></span><span class="token script language-javascript"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script language-javascript">      <span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>        <span class="token keyword">var</span> Sprite <span class="token operator">=</span> Laya<span class="token punctuation">.</span>Sprite        <span class="token keyword">var</span> Stage <span class="token operator">=</span> Laya<span class="token punctuation">.</span>Stage        <span class="token keyword">var</span> Text <span class="token operator">=</span> Laya<span class="token punctuation">.</span>Text        <span class="token keyword">var</span> Stat <span class="token operator">=</span> Laya<span class="token punctuation">.</span>Stat        <span class="token keyword">var</span> WebGL <span class="token operator">=</span> Laya<span class="token punctuation">.</span>WebGL        <span class="token keyword">var</span> sp        <span class="token punctuation">;</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>          <span class="token comment" spellcheck="true">// 不支持WebGL时自动切换至Canvas</span>          Laya<span class="token punctuation">.</span><span class="token function">init</span><span class="token punctuation">(</span><span class="token number">800</span><span class="token punctuation">,</span> <span class="token number">600</span><span class="token punctuation">,</span> WebGL<span class="token punctuation">)</span>          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>alignV <span class="token operator">=</span> Stage<span class="token punctuation">.</span>ALIGN_MIDDLE          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>alignH <span class="token operator">=</span> Stage<span class="token punctuation">.</span>ALIGN_CENTER          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>scaleMode <span class="token operator">=</span> <span class="token string">'showall'</span>          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>bgColor <span class="token operator">=</span> <span class="token string">'#232628'</span>          <span class="token comment" spellcheck="true">// 显示性能统计信息</span>          Stat<span class="token punctuation">.</span><span class="token function">show</span><span class="token punctuation">(</span><span class="token punctuation">)</span>          <span class="token function">setup</span><span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">function</span> <span class="token function">setup</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>          <span class="token keyword">var</span> textBox <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Sprite</span><span class="token punctuation">(</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 随机摆放 1000 个文本</span>          <span class="token keyword">var</span> text          <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> <span class="token number">1000</span><span class="token punctuation">;</span> i <span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>            text <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Text</span><span class="token punctuation">(</span><span class="token punctuation">)</span>            <span class="token comment" spellcheck="true">// 设置文本字体大小为 20 px</span>            text<span class="token punctuation">.</span>fontSize <span class="token operator">=</span> <span class="token number">20</span>            <span class="token comment" spellcheck="true">// 设置文本内容为随机整数</span>            text<span class="token punctuation">.</span>text <span class="token operator">=</span> <span class="token punctuation">(</span>Math<span class="token punctuation">.</span><span class="token function">random</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toFixed</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span>            <span class="token comment" spellcheck="true">// 设置文本旋转角度为随机角度</span>            text<span class="token punctuation">.</span>rotation <span class="token operator">=</span> Math<span class="token punctuation">.</span><span class="token function">random</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">360</span>            <span class="token comment" spellcheck="true">// 设置文本颜色</span>            text<span class="token punctuation">.</span>color <span class="token operator">=</span> <span class="token string">'#CCCCCC'</span>            text<span class="token punctuation">.</span>x <span class="token operator">=</span> Math<span class="token punctuation">.</span><span class="token function">random</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span> Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>width            text<span class="token punctuation">.</span>y <span class="token operator">=</span> Math<span class="token punctuation">.</span><span class="token function">random</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span> Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>height            textBox<span class="token punctuation">.</span><span class="token function">addChild</span><span class="token punctuation">(</span>text<span class="token punctuation">)</span>          <span class="token punctuation">}</span>          <span class="token comment" spellcheck="true">// 缓存为静态图像</span>          textBox<span class="token punctuation">.</span>cacheAsBitmap <span class="token operator">=</span> <span class="token boolean">true</span>          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span><span class="token function">addChild</span><span class="token punctuation">(</span>textBox<span class="token punctuation">)</span>        <span class="token punctuation">}</span>      <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>    </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></code></pre><h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><ul><li><a href="https://www.layabox.com/" target="_blank" rel="noopener">https://www.layabox.com</a></li><li><a href="https://layaair.ldc.layabox.com/demo/?category=2d&group=Sprite&name=Cache" target="_blank" rel="noopener">https://layaair.ldc.layabox.com/demo/?category=2d&amp;group=Sprite&amp;name=Cache</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文解读第七个 layabox 引擎示例（&lt;code&gt;缓存为静态图像&lt;/code&gt;）&lt;/p&gt;</summary>
    
    
    
    <category term="layabox" scheme="https://tanglj.cn/categories/layabox/"/>
    
    
    <category term="es5" scheme="https://tanglj.cn/tags/es5/"/>
    
  </entry>
  
  <entry>
    <title>解读 Layabox 示例 06</title>
    <link href="https://tanglj.cn/2018/06/14/read-layabox-demo-6/"/>
    <id>https://tanglj.cn/2018/06/14/read-layabox-demo-6/</id>
    <published>2018-06-14T15:46:23.000Z</published>
    <updated>2025-03-09T10:21:52.669Z</updated>
    
    <content type="html"><![CDATA[<p>本文解读第六个 layabox 引擎示例（<code>绘制各种形状</code>）</p><a id="more"></a><h1 id="示例效果"><a href="#示例效果" class="headerlink" title="示例效果"></a>示例效果</h1><p><img src="./result.png" alt="result"></p><h1 id="概念简介"><a href="#概念简介" class="headerlink" title="概念简介"></a>概念简介</h1><p>本示例中的概念均在示例一中描述。<a href="/2018/05/25/read-layabox-demo-1/#%E6%A6%82%E5%BF%B5%E7%AE%80%E4%BB%8B">查看</a></p><h1 id="示例代码"><a href="#示例代码" class="headerlink" title="示例代码"></a>示例代码</h1><pre class=" language-html"><code class="language-html"><span class="token doctype">&lt;!DOCTYPE html></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">'</span>en<span class="token punctuation">'</span></span> <span class="token attr-name">dir</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">'</span>ltr<span class="token punctuation">'</span></span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">'</span>utf-8<span class="token punctuation">'</span></span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>遮罩-绘制各种形状<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">'</span>./LayaAirJS_1.7.19.1_beta/js/libs/laya.core.js<span class="token punctuation">'</span></span><span class="token punctuation">></span></span><span class="token script language-javascript"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">'</span>./LayaAirJS_1.7.19.1_beta/js/libs/laya.webgl.js<span class="token punctuation">'</span></span><span class="token punctuation">></span></span><span class="token script language-javascript"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script language-javascript">      <span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>        <span class="token keyword">var</span> Sprite <span class="token operator">=</span> Laya<span class="token punctuation">.</span>Sprite        <span class="token keyword">var</span> Stage <span class="token operator">=</span> Laya<span class="token punctuation">.</span>Stage        <span class="token keyword">var</span> WebGL <span class="token operator">=</span> Laya<span class="token punctuation">.</span>WebGL        <span class="token keyword">var</span> sp        <span class="token punctuation">;</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>          <span class="token comment" spellcheck="true">// 不支持WebGL时自动切换至Canvas</span>          Laya<span class="token punctuation">.</span><span class="token function">init</span><span class="token punctuation">(</span><span class="token number">740</span><span class="token punctuation">,</span> <span class="token number">400</span><span class="token punctuation">,</span> WebGL<span class="token punctuation">)</span>          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>alignV <span class="token operator">=</span> Stage<span class="token punctuation">.</span>ALIGN_MIDDLE          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>alignH <span class="token operator">=</span> Stage<span class="token punctuation">.</span>ALIGN_CENTER          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>scaleMode <span class="token operator">=</span> <span class="token string">'showall'</span>          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>bgColor <span class="token operator">=</span> <span class="token string">'#232628'</span>          <span class="token function">drawSomething</span><span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">function</span> <span class="token function">drawSomething</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>          sp <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Sprite</span><span class="token punctuation">(</span><span class="token punctuation">)</span>          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span><span class="token function">addChild</span><span class="token punctuation">(</span>sp<span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 画线</span>          sp<span class="token punctuation">.</span>graphics<span class="token punctuation">.</span><span class="token function">drawLine</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">58</span><span class="token punctuation">,</span> <span class="token number">146</span><span class="token punctuation">,</span> <span class="token number">58</span><span class="token punctuation">,</span> <span class="token string">'#ff0000'</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 画连续直线</span>          sp<span class="token punctuation">.</span>graphics<span class="token punctuation">.</span><span class="token function">drawLines</span><span class="token punctuation">(</span><span class="token number">176</span><span class="token punctuation">,</span> <span class="token number">58</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">39</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">50</span><span class="token punctuation">,</span> <span class="token number">78</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">117</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">,</span> <span class="token number">156</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string">'#ff0000'</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 画曲线</span>          sp<span class="token punctuation">.</span>graphics<span class="token punctuation">.</span><span class="token function">drawCurves</span><span class="token punctuation">(</span><span class="token number">352</span><span class="token punctuation">,</span> <span class="token number">58</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">19</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">39</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">58</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">78</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">97</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">117</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">136</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">156</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string">'#ff0000'</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 画矩形</span>          sp<span class="token punctuation">.</span>graphics<span class="token punctuation">.</span><span class="token function">drawRect</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">166</span><span class="token punctuation">,</span> <span class="token number">166</span><span class="token punctuation">,</span> <span class="token number">90</span><span class="token punctuation">,</span> <span class="token string">'#ffff00'</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 画多边形</span>          sp<span class="token punctuation">.</span>graphics<span class="token punctuation">.</span><span class="token function">drawPoly</span><span class="token punctuation">(</span><span class="token number">264</span><span class="token punctuation">,</span> <span class="token number">166</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">60</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">78.48</span><span class="token punctuation">,</span> <span class="token number">57</span><span class="token punctuation">,</span> <span class="token number">30</span><span class="token punctuation">,</span> <span class="token number">93.48</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">18.48</span><span class="token punctuation">,</span> <span class="token number">57</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string">'#ffff00'</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 画三角形</span>          sp<span class="token punctuation">.</span>graphics<span class="token punctuation">.</span><span class="token function">drawPoly</span><span class="token punctuation">(</span><span class="token number">400</span><span class="token punctuation">,</span> <span class="token number">166</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string">'#ffff00'</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 画圆</span>          sp<span class="token punctuation">.</span>graphics<span class="token punctuation">.</span><span class="token function">drawCircle</span><span class="token punctuation">(</span><span class="token number">98</span><span class="token punctuation">,</span> <span class="token number">332</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">,</span> <span class="token string">'#00ffff'</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 画扇形</span>          sp<span class="token punctuation">.</span>graphics<span class="token punctuation">.</span><span class="token function">drawPie</span><span class="token punctuation">(</span><span class="token number">240</span><span class="token punctuation">,</span> <span class="token number">290</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">60</span><span class="token punctuation">,</span> <span class="token string">'#00ffff'</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 绘制圆角矩形，自定义路径</span>          sp<span class="token punctuation">.</span>graphics<span class="token punctuation">.</span><span class="token function">drawPath</span><span class="token punctuation">(</span><span class="token number">400</span><span class="token punctuation">,</span> <span class="token number">310</span><span class="token punctuation">,</span> <span class="token punctuation">[</span>            <span class="token punctuation">[</span> <span class="token string">'moveTo'</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">]</span><span class="token punctuation">,</span>            <span class="token punctuation">[</span> <span class="token string">'lineTo'</span><span class="token punctuation">,</span> <span class="token number">105</span><span class="token punctuation">,</span> <span class="token number">0</span> <span class="token punctuation">]</span><span class="token punctuation">,</span>            <span class="token punctuation">[</span> <span class="token string">'arcTo'</span><span class="token punctuation">,</span> <span class="token number">110</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">110</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">5</span> <span class="token punctuation">]</span><span class="token punctuation">,</span>            <span class="token punctuation">[</span> <span class="token string">'lineTo'</span><span class="token punctuation">,</span> <span class="token number">110</span><span class="token punctuation">,</span> <span class="token number">55</span> <span class="token punctuation">]</span><span class="token punctuation">,</span>            <span class="token punctuation">[</span> <span class="token string">'arcTo'</span><span class="token punctuation">,</span> <span class="token number">110</span><span class="token punctuation">,</span> <span class="token number">60</span><span class="token punctuation">,</span> <span class="token number">105</span><span class="token punctuation">,</span> <span class="token number">60</span><span class="token punctuation">,</span> <span class="token number">5</span> <span class="token punctuation">]</span><span class="token punctuation">,</span>            <span class="token punctuation">[</span> <span class="token string">'lineTo'</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">60</span> <span class="token punctuation">]</span><span class="token punctuation">,</span>            <span class="token punctuation">[</span> <span class="token string">'arcTo'</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">60</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">55</span><span class="token punctuation">,</span> <span class="token number">5</span> <span class="token punctuation">]</span><span class="token punctuation">,</span>            <span class="token punctuation">[</span> <span class="token string">'lineTo'</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">5</span> <span class="token punctuation">]</span><span class="token punctuation">,</span>            <span class="token punctuation">[</span> <span class="token string">'arcTo'</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">5</span> <span class="token punctuation">]</span><span class="token punctuation">,</span>            <span class="token punctuation">[</span> <span class="token string">'closePath'</span> <span class="token punctuation">]</span>          <span class="token punctuation">]</span><span class="token punctuation">,</span>          <span class="token punctuation">{</span>            fillStyle<span class="token punctuation">:</span> <span class="token string">'#00ffff'</span>          <span class="token punctuation">}</span><span class="token punctuation">)</span>        <span class="token punctuation">}</span>      <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>    </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></code></pre><h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><ul><li><a href="https://www.layabox.com/" target="_blank" rel="noopener">https://www.layabox.com</a></li><li><a href="https://layaair.ldc.layabox.com/demo/?category=2d&group=Sprite&name=DrawShapes" target="_blank" rel="noopener">https://layaair.ldc.layabox.com/demo/?category=2d&amp;group=Sprite&amp;name=DrawShapes</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文解读第六个 layabox 引擎示例（&lt;code&gt;绘制各种形状&lt;/code&gt;）&lt;/p&gt;</summary>
    
    
    
    <category term="layabox" scheme="https://tanglj.cn/categories/layabox/"/>
    
    
    <category term="es5" scheme="https://tanglj.cn/tags/es5/"/>
    
  </entry>
  
  <entry>
    <title>Fedora 系统中安装 travis</title>
    <link href="https://tanglj.cn/2018/06/13/install-travis-on-fedora/"/>
    <id>https://tanglj.cn/2018/06/13/install-travis-on-fedora/</id>
    <published>2018-06-12T16:35:09.000Z</published>
    <updated>2025-03-09T10:21:52.469Z</updated>
    
    <content type="html"><![CDATA[<p>在 fedora 系统中安装 travis-cli 时报错，本文记录下解决方案</p><a id="more"></a><h1 id="安装-ruby"><a href="#安装-ruby" class="headerlink" title="安装 ruby"></a>安装 ruby</h1><p>根据官方文档说明，安装 travis 需要安装 ruby，ruby-devel</p><pre class=" language-bash"><code class="language-bash"><span class="token function">sudo</span> dnf <span class="token function">install</span> -y ruby ruby-develruby -v</code></pre><h1 id="安装-travis"><a href="#安装-travis" class="headerlink" title="安装 travis"></a>安装 travis</h1><p>根据官方文档安装 travis</p><pre class=" language-bash"><code class="language-bash">gem <span class="token function">install</span> travis -v 1.8.8 --no-rdoc --no-ri</code></pre><p>这时候会报一个关于 <a href="https://github.com/travis-ci/travis.rb/issues/558" target="_blank" rel="noopener"><code>Failed to build gem native extension</code></a> 的错误。</p><pre class=" language-bash"><code class="language-bash">Building native extensions. This could take a while<span class="token punctuation">..</span>.ERROR:  Error installing travis:ERROR: Failed to build gem native extension.<span class="token punctuation">..</span><span class="token punctuation">..</span><span class="token punctuation">..</span></code></pre><p>我们通过安装 <code>libffi-devel</code> 和 <code>redhat-rpm-config</code> 来解决这个问题</p><pre class=" language-bash"><code class="language-bash"><span class="token function">sudo</span> dnf <span class="token function">install</span> libffi-devel redhat-rpm-config</code></pre><p>再次安装 travis，结果如下</p><pre class=" language-bash"><code class="language-bash">gem <span class="token function">install</span> travis -v 1.8.8 --no-rdoc --no-riFetching: travis-1.8.8.gem <span class="token punctuation">(</span>100%<span class="token punctuation">)</span>Successfully installed travis-1.8.81 gem installed</code></pre><h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><ul><li><a href="https://github.com/travis-ci/travis.rb/issues/602" target="_blank" rel="noopener">https://github.com/travis-ci/travis.rb/issues/602</a></li><li><a href="https://github.com/travis-ci/travis.rb/issues/558" target="_blank" rel="noopener">https://github.com/travis-ci/travis.rb/issues/558</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;在 fedora 系统中安装 travis-cli 时报错，本文记录下解决方案&lt;/p&gt;</summary>
    
    
    
    <category term="linux" scheme="https://tanglj.cn/categories/linux/"/>
    
    
    <category term="fedora" scheme="https://tanglj.cn/tags/fedora/"/>
    
  </entry>
  
  <entry>
    <title>解读 Layabox 示例 05</title>
    <link href="https://tanglj.cn/2018/06/09/read-layabox-demo-5/"/>
    <id>https://tanglj.cn/2018/06/09/read-layabox-demo-5/</id>
    <published>2018-06-09T01:46:55.000Z</published>
    <updated>2025-03-09T10:21:52.641Z</updated>
    
    <content type="html"><![CDATA[<p>本文解读第五个 layabox 引擎示例（<code>遮罩放大镜</code>）</p><a id="more"></a><h1 id="示例效果"><a href="#示例效果" class="headerlink" title="示例效果"></a>示例效果</h1><p><img src="./result.gif" alt="result"></p><h1 id="概念简介"><a href="#概念简介" class="headerlink" title="概念简介"></a>概念简介</h1><p>本示例中的概念均在示例一中描述。<a href="/2018/05/25/read-layabox-demo-1/#%E6%A6%82%E5%BF%B5%E7%AE%80%E4%BB%8B">查看</a></p><h1 id="示例代码"><a href="#示例代码" class="headerlink" title="示例代码"></a>示例代码</h1><pre class=" language-html"><code class="language-html"><span class="token doctype">&lt;!DOCTYPE html></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>en<span class="token punctuation">"</span></span> <span class="token attr-name">dir</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>ltr<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>utf-8<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>遮罩-放大镜<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>./LayaAirJS_1.7.19.1_beta/js/libs/laya.core.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script language-javascript"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>./LayaAirJS_1.7.19.1_beta/js/libs/laya.webgl.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script language-javascript"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script language-javascript">      <span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>        <span class="token keyword">var</span> Sprite <span class="token operator">=</span> Laya<span class="token punctuation">.</span>Sprite        <span class="token keyword">var</span> Stage <span class="token operator">=</span> Laya<span class="token punctuation">.</span>Stage        <span class="token keyword">var</span> Browser <span class="token operator">=</span> Laya<span class="token punctuation">.</span>Browser        <span class="token keyword">var</span> Handler <span class="token operator">=</span> Laya<span class="token punctuation">.</span>Handler        <span class="token keyword">var</span> WebGL <span class="token operator">=</span> Laya<span class="token punctuation">.</span>WebGL        <span class="token keyword">var</span> maskSp        <span class="token keyword">var</span> bg2        <span class="token punctuation">;</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>          <span class="token comment" spellcheck="true">// 不支持WebGL时自动切换至Canvas</span>          Laya<span class="token punctuation">.</span><span class="token function">init</span><span class="token punctuation">(</span><span class="token number">1136</span><span class="token punctuation">,</span> <span class="token number">640</span><span class="token punctuation">,</span> WebGL<span class="token punctuation">)</span>          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>alignV <span class="token operator">=</span> Stage<span class="token punctuation">.</span>ALIGN_MIDDLE          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>alignH <span class="token operator">=</span> Stage<span class="token punctuation">.</span>ALIGN_CENTER          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>scaleMode <span class="token operator">=</span> <span class="token string">"showall"</span>          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>bgColor <span class="token operator">=</span> <span class="token string">"#232628"</span>          <span class="token comment" spellcheck="true">// 加载背景</span>          Laya<span class="token punctuation">.</span>loader<span class="token punctuation">.</span><span class="token function">load</span><span class="token punctuation">(</span><span class="token string">'./res/bg2.png'</span><span class="token punctuation">,</span> Handler<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">,</span> setup<span class="token punctuation">)</span><span class="token punctuation">)</span>        <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">function</span> <span class="token function">setup</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>          <span class="token comment" spellcheck="true">// 定义背景实例</span>          <span class="token keyword">var</span> bg <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Sprite</span><span class="token punctuation">(</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 加载背景图片</span>          bg<span class="token punctuation">.</span><span class="token function">loadImage</span><span class="token punctuation">(</span><span class="token string">'./res/bg2.png'</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 添加背景到舞台中</span>          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span><span class="token function">addChild</span><span class="token punctuation">(</span>bg<span class="token punctuation">)</span><span class="token punctuation">;</span>          <span class="token comment" spellcheck="true">// 定义背景 2 实例</span>          bg2 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Sprite</span><span class="token punctuation">(</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 加载背景图片</span>          bg2<span class="token punctuation">.</span><span class="token function">loadImage</span><span class="token punctuation">(</span><span class="token string">'./res/bg2.png'</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 添加背景 2 到舞台中</span>          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span><span class="token function">addChild</span><span class="token punctuation">(</span>bg2<span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 设置背景 2 的比例</span>          bg2<span class="token punctuation">.</span><span class="token function">scale</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 创建mask</span>          maskSp <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Sprite</span><span class="token punctuation">(</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 加载 mask 图片</span>          maskSp<span class="token punctuation">.</span><span class="token function">loadImage</span><span class="token punctuation">(</span><span class="token string">'./res/mask.png'</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 设置 maskSp 中心点（mask.png 100 * 100）</span>          maskSp<span class="token punctuation">.</span><span class="token function">pivot</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 设置 bg2 的 mask 遮罩为 maskSp</span>          <span class="token comment" spellcheck="true">// mask 的详细介绍：https://layaair.ldc.layabox.com/api/?category=Core&amp;class=laya.display.Sprite#mask</span>          bg2<span class="token punctuation">.</span>mask <span class="token operator">=</span> maskSp          <span class="token comment" spellcheck="true">// 监听舞台的 mousemove 事件</span>          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">"mousemove"</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">,</span> onMouseMove<span class="token punctuation">)</span>        <span class="token punctuation">}</span>        <span class="token keyword">function</span> <span class="token function">onMouseMove</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>          <span class="token comment" spellcheck="true">// 设置 bg2 坐标，偏移基数为 （bg2 scale 基数 - 1）即 (3 - 1) = 2</span>          bg2<span class="token punctuation">.</span>x <span class="token operator">=</span> <span class="token operator">-</span>Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>mouseX <span class="token operator">*</span> <span class="token number">2</span>          bg2<span class="token punctuation">.</span>y <span class="token operator">=</span> <span class="token operator">-</span>Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>mouseY <span class="token operator">*</span> <span class="token number">2</span>          <span class="token comment" spellcheck="true">// 设置遮罩坐标</span>          maskSp<span class="token punctuation">.</span>x <span class="token operator">=</span> Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>mouseX          maskSp<span class="token punctuation">.</span>y <span class="token operator">=</span> Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>mouseY        <span class="token punctuation">}</span>      <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>    </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></code></pre><h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><ul><li><a href="https://www.layabox.com/" target="_blank" rel="noopener">https://www.layabox.com</a></li><li><a href="https://layaair.ldc.layabox.com/demo/?category=2d&group=Sprite&name=MagnifyingGlass" target="_blank" rel="noopener">https://layaair.ldc.layabox.com/demo/?category=2d&amp;group=Sprite&amp;name=MagnifyingGlass</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文解读第五个 layabox 引擎示例（&lt;code&gt;遮罩放大镜&lt;/code&gt;）&lt;/p&gt;</summary>
    
    
    
    <category term="layabox" scheme="https://tanglj.cn/categories/layabox/"/>
    
    
    <category term="es5" scheme="https://tanglj.cn/tags/es5/"/>
    
  </entry>
  
  <entry>
    <title>解读 Layabox 示例 04</title>
    <link href="https://tanglj.cn/2018/06/09/read-layabox-demo-4/"/>
    <id>https://tanglj.cn/2018/06/09/read-layabox-demo-4/</id>
    <published>2018-06-09T01:46:50.000Z</published>
    <updated>2025-03-09T10:21:52.640Z</updated>
    
    <content type="html"><![CDATA[<p>本文记录第四个 layabox 引擎示例（<code>根据数据绘制路径</code>）</p><a id="more"></a><h1 id="示例效果"><a href="#示例效果" class="headerlink" title="示例效果"></a>示例效果</h1><p><img src="./result.gif" alt="result"></p><h1 id="概念简介"><a href="#概念简介" class="headerlink" title="概念简介"></a>概念简介</h1><p>本示例中的概念均在示例一中描述。<a href="/2018/05/25/read-layabox-demo-1/#%E6%A6%82%E5%BF%B5%E7%AE%80%E4%BB%8B">查看</a></p><h1 id="示例代码"><a href="#示例代码" class="headerlink" title="示例代码"></a>示例代码</h1><pre class=" language-html"><code class="language-html"><span class="token doctype">&lt;!DOCTYPE html></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>en<span class="token punctuation">"</span></span> <span class="token attr-name">dir</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>ltr<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>utf-8<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>./LayaAirJS_1.7.19.1_beta/js/libs/laya.core.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script language-javascript"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>./LayaAirJS_1.7.19.1_beta/js/libs/laya.webgl.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script language-javascript"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span>    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span><span class="token punctuation">></span></span><span class="token script language-javascript">      <span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>        <span class="token keyword">var</span> Sprite  <span class="token operator">=</span> Laya<span class="token punctuation">.</span>Sprite        <span class="token keyword">var</span> Stage   <span class="token operator">=</span> Laya<span class="token punctuation">.</span>Stage        <span class="token keyword">var</span> Browser <span class="token operator">=</span> Laya<span class="token punctuation">.</span>Browser        <span class="token keyword">var</span> WebGL   <span class="token operator">=</span> Laya<span class="token punctuation">.</span>WebGL        <span class="token punctuation">;</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>          <span class="token comment" spellcheck="true">// 不支持WebGL时自动切换至Canvas</span>          Laya<span class="token punctuation">.</span><span class="token function">init</span><span class="token punctuation">(</span>Browser<span class="token punctuation">.</span>clientWidth<span class="token punctuation">,</span> Browser<span class="token punctuation">.</span>clientHeight<span class="token punctuation">,</span> WebGL<span class="token punctuation">)</span>          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>alignV <span class="token operator">=</span> Stage<span class="token punctuation">.</span>ALIGN_MIDDLE          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>alignH <span class="token operator">=</span> Stage<span class="token punctuation">.</span>ALIGN_CENTER          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>scaleMode <span class="token operator">=</span> <span class="token string">"showall"</span>          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>bgColor <span class="token operator">=</span> <span class="token string">"#232628"</span>          <span class="token function">drawPentagram</span><span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>        <span class="token keyword">function</span> <span class="token function">drawPentagram</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>          <span class="token comment" spellcheck="true">// 创建图形实例</span>          <span class="token keyword">var</span> canvas <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Sprite</span><span class="token punctuation">(</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 把图形添加到舞台中</span>          Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span><span class="token function">addChild</span><span class="token punctuation">(</span>canvas<span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 定义路径数据</span>          <span class="token keyword">var</span> path <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>          <span class="token comment" spellcheck="true">// 添加路径坐标集合</span>          path<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">130</span><span class="token punctuation">)</span>          path<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token number">33</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">33</span><span class="token punctuation">)</span>          path<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token number">137</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">30</span><span class="token punctuation">)</span>          path<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token number">55</span><span class="token punctuation">,</span> <span class="token number">32</span><span class="token punctuation">)</span>          path<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token number">85</span><span class="token punctuation">,</span> <span class="token number">130</span><span class="token punctuation">)</span>          path<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">73</span><span class="token punctuation">)</span>          path<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">85</span><span class="token punctuation">,</span> <span class="token number">130</span><span class="token punctuation">)</span>          path<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">55</span><span class="token punctuation">,</span> <span class="token number">32</span><span class="token punctuation">)</span>          path<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">137</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">30</span><span class="token punctuation">)</span>          path<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">33</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">33</span><span class="token punctuation">)</span>          <span class="token comment" spellcheck="true">// 从舞台中心点，绘制多边形（五角星）</span>          <span class="token comment" spellcheck="true">// drawPoly 方法详情：https://layaair.ldc.layabox.com/api/?category=Core&amp;class=laya.display.Graphics#drawPoly()</span>          canvas<span class="token punctuation">.</span>graphics<span class="token punctuation">.</span><span class="token function">drawPoly</span><span class="token punctuation">(</span>Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>width <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">,</span> Laya<span class="token punctuation">.</span>stage<span class="token punctuation">.</span>height <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">,</span> path<span class="token punctuation">,</span> <span class="token string">'#FF7F50'</span><span class="token punctuation">)</span>        <span class="token punctuation">}</span>      <span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>    </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></code></pre><h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><ul><li><a href="https://www.layabox.com/" target="_blank" rel="noopener">https://www.layabox.com</a></li><li><a href="https://layaair.ldc.layabox.com/demo/?category=2d&group=Sprite&name=DrawPath" target="_blank" rel="noopener">https://layaair.ldc.layabox.com/demo/?category=2d&amp;group=Sprite&amp;name=DrawPath</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文记录第四个 layabox 引擎示例（&lt;code&gt;根据数据绘制路径&lt;/code&gt;）&lt;/p&gt;</summary>
    
    
    
    <category term="layabox" scheme="https://tanglj.cn/categories/layabox/"/>
    
    
    <category term="es5" scheme="https://tanglj.cn/tags/es5/"/>
    
  </entry>
  
</feed>
