<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>guchengf.me</title>
      <link>https://guchengf.me</link>
      <description>包括各类话题的相关文章、展示看过的书影音的由 gucheen 维护的个人网站。Web 开发技术相关的内容比较多，其次是其他软件开发技术和日常生活的内容，各种话题都会涉及。</description>
      <generator>Zola</generator>
      <language>zh_Hans</language>
      <atom:link href="https://guchengf.me/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Tue, 07 Apr 2026 03:19:03 +0000</lastBuildDate>
      <item>
          <title>使用 tinyfeed 来做 RSS 内容聚合</title>
          <pubDate>Tue, 07 Apr 2026 03:19:03 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/use-tinyfeed-to-aggregate-my-feeds/</link>
          <guid>https://guchengf.me/blog/use-tinyfeed-to-aggregate-my-feeds/</guid>
          <description xml:base="https://guchengf.me/blog/use-tinyfeed-to-aggregate-my-feeds/">&lt;p&gt;过去几年中我一直使用 miniflux 配合一些第三方 web ui 和 RSS 阅读工具作为自己的 RSS 订阅方案，现在我切换到了 tinyfeed。&lt;&#x2F;p&gt;
&lt;p&gt;最近在浏览 Reddit selfhost 频道时，看到有人推荐 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;TheBigRoomXXL&#x2F;tinyfeed&quot;&gt;tinyfeed&lt;&#x2F;a&gt; - 一个非常简单的将 feeds 内容聚合到一起并生成单个 HTML 文件的工具。&lt;&#x2F;p&gt;
&lt;p&gt;之前使用 miniflux 的时候我就在想，我其实只需要它的 feed 聚合能力。&lt;&#x2F;p&gt;
&lt;p&gt;搜索？我从来没有在我的 feed 流中搜索过内容。&lt;&#x2F;p&gt;
&lt;p&gt;收藏？我会用网页收藏工具（linkding）来收藏我觉得有价值的网页。&lt;&#x2F;p&gt;
&lt;p&gt;通知？对于我真的非常希望收到高优先级通知的 feed，我会把它加入 n8n 的 feed 工作流，不仅可以得到最及时的通知，还能享受完整的自动化能力。&lt;&#x2F;p&gt;
&lt;p&gt;我也没有需要处理 feed 内容的需求，我更喜欢查看原始的网页内容。&lt;&#x2F;p&gt;
&lt;p&gt;那么基于以上背景，tinyfeed 的功能就非常契合我的需求：将我的 feeds 订阅聚合到一起，按照更新时间排序，展示最新的那些内容，通过链接快速打开原始网页来阅读。&lt;&#x2F;p&gt;
&lt;p&gt;tinyfeed 的使用很简单，给他提供一个包含 feeds 列表的 txt 文件，指定输出目标，然后它就会生成一个 HTML 文件，你可以按照自己喜欢的方式托管。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;tinyfeed&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;-input&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; feeds.txt&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;-output&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; index.html&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;tinyfeed 目前还不支持使用 opml 作为数据来源，但是将 opml 转换成单纯的列表文本文件也很简单。&lt;&#x2F;p&gt;
&lt;p&gt;切换到这种简单的聚合入口模式之后，第三方 web ui 和 RSS 阅读工具也不再有意义，毕竟对于一个 HTML 文件，浏览器就是最好的访问工具，点击链接直接访问原始网页来阅读。&lt;&#x2F;p&gt;
&lt;p&gt;我订阅的绝大多数 feed 都提供了很好的网页阅读体验，远胜于 RSS 工具自带的阅读界面。毕竟他们都针对自己的内容做了针对性设计、优化。&lt;&#x2F;p&gt;
&lt;p&gt;你可以在我的&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;guchengf.me&#x2F;subscriptions.html&quot;&gt;网络订阅&lt;&#x2F;a&gt;页面体验一下，到目前为止，我很享受这种简单的内容聚合模式。&lt;&#x2F;p&gt;
&lt;p&gt;预览
&lt;img src=&quot;https:&#x2F;&#x2F;i.see.you&#x2F;2026&#x2F;04&#x2F;07&#x2F;9xQa&#x2F;guchengfme_subscriptionshtml.avif&quot; alt=&quot;网络订阅预览&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>2025年回顾：我的生活有哪些变化</title>
          <pubDate>Wed, 31 Dec 2025 01:27:43 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/2025-review-what-changed-in-my-life/</link>
          <guid>https://guchengf.me/blog/2025-review-what-changed-in-my-life/</guid>
          <description xml:base="https://guchengf.me/blog/2025-review-what-changed-in-my-life/">&lt;p&gt;年纪越大，时间过得越快，2025年已经走到了最后一天，照例进行年终回顾。今年准备精炼回顾内容，围绕“生活的变化”这个主题来总结，记录相对重要的内容。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;guan-zhu-jian-kang&quot;&gt;关注健康&lt;&#x2F;h2&gt;
&lt;p&gt;三十多岁开始养生也不算晚。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;zeng-jia-hu-wai-huo-dong&quot;&gt;增加户外活动&lt;&#x2F;h3&gt;
&lt;p&gt;我在不久前的&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;status.guchengf.me&#x2F;#1764663625218&quot;&gt;近况中写到：“感觉30-40岁是人最该注意身体健康的时间，最大的生活压力，最不易觉察的身体衰退，以及对健康最不以为意的心态”&lt;&#x2F;a&gt;。为了应对这个问题，2025年开始，我有意识地提升了自己的户外活动量，包括日常的站立、走动时间，到了周末，我会在家附近寻找公园、绿地溜达一圈。同时，拿着相机观察这个世界也是一件很有意思的事情，也许这才是摄影的乐趣所在。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;yin-shi-jian-kang&quot;&gt;饮食健康&lt;&#x2F;h3&gt;
&lt;p&gt;2025年继续精进厨艺，开始尝试各类菜肴，在保证口味的同时，努力兼顾观感、健康。中餐的大部分做法算不上健康，但是我在日常做饭过程中会注意低油低盐，减少高油温烹饪，也不会吃太烫的食物。饮食健康是一件很难的事情，因此也不需要过于担忧，愉悦的心情远比吃什么来得重要，如果某样食物能让你感到愉悦，那么就大胆去吃。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ying-dui-liu-gan&quot;&gt;应对流感&lt;&#x2F;h3&gt;
&lt;p&gt;今年我开始接种流感疫苗应对流感。以往每年的流感季我也都会被传染，在人群密集的办公室、公共交通工具中，很难避免被传染。我身边不少人每年都会接种流感疫苗，依据他们的经历，我认为流感疫苗还是很有用的，因此今年也接种了（为了避免误导大家，不公开我接种的具体疫苗信息）。11、12月上海经历了几次很严重的流感传播，在这几次传播中，我感染了一次，但仅两天就恢复了，并且症状轻微，我感觉应该是疫苗产生了作用，所以明年会继续接种。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;yu-qi-zi-liang-ge-ren-de-du-li-sheng-huo&quot;&gt;与妻子两个人的独立生活&lt;&#x2F;h2&gt;
&lt;p&gt;我和妻子去年9月结婚，之后从家里搬出来独立生活，今年是我们独立生活的第一个完整年。&lt;&#x2F;p&gt;
&lt;p&gt;我妻子结婚前是家里的小公主，几乎不管家事，岳父岳母总是替她准备好一切。我们结婚独立生活之后，她就必须得自己管理家事了。一年多时间她也学会了不少家务的处理方法，虽然还有生疏，但依旧是很大的成长。我也是一样，独立生活需要我肩负更多的责任，照顾好家人，生活确实要比结婚前紧凑很多。两个人一起摸索着在生活中前进。&lt;&#x2F;p&gt;
&lt;p&gt;虽然充满了各种意外，但是还是顺利地度过了一年。&lt;&#x2F;p&gt;
&lt;p&gt;到了周末我们就会回父母家放松一下，父母在，我们就永远是孩子。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;guan-zhu-zi-ji-de-bian-cheng-kai-fa-ji-shu&quot;&gt;关注自己的编程开发技术&lt;&#x2F;h2&gt;
&lt;p&gt;参加工作以来，我所从事的大部分是互联网 Web 开发工作。最近几年，实际参与的开发工作越来越少，逐渐转向到其他工作内容。这两年的就业市场情况相信大家也比较清楚，今年我也开始思考一个问题：如果我失去了现在的工作，后面会做什么？我认为以 Web 开发为主的编程开发依旧是我的核心技能，如果更换工作也仍然会寻找相关开发工作，因此不能荒废技术。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;shen-ru-tan-jiu-he-xin-ji-shu&quot;&gt;深入探究核心技术&lt;&#x2F;h3&gt;
&lt;p&gt;回顾十年多的工作经历，我接触的一些东西已被淘汰，十多年间发生了巨大的技术变化，但也有很多东西依然在迭代更新，继续使用。我称这些技术为“核心”，核心技术多半以基础为主。很多基础技术我虽然已经使用了很多年，并且经常会接触到，但是对于它的底层逻辑、设计思路却并不是很了解，2025年，我开始关注这些被我忽略的部分，当我再一次接触它们时，我会认真地去学习它们并“正确”地使用它们。我对自己的要求是：能够解答它们相关的问题。当我认为我已经掌握它们时，我就试着去解答一些它们相关的问题，来衡量自己的学习结果。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;duo-xue-duo-zuo&quot;&gt;多学多做&lt;&#x2F;h3&gt;
&lt;p&gt;如果脱离真正的开发工作，开发技能会很快退步，因此想要精进自己的技术，重新回归开发工作是必须的。2025年我增加了自己的编程开发工作量，参与日常业务开发工作，努力多学多做。编程开发其实是一件很纯粹快乐的事情，相比管理工作，编程开发其实更能让我投入。今年确实是我找回工作乐趣的一年，从开发工作中找到了不少成就感。编程开发就像是一种修行一般，也难怪很多编辑器会有一种叫“zen”（禅）的模式。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;chu-men-lv-xing&quot;&gt;出门旅行&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;xin-jiang-bei-jiang&quot;&gt;新疆（北疆）&lt;&#x2F;h3&gt;
&lt;p&gt;和妻子的蜜月旅行选择了北疆，只能说不虚此行，大美新疆。可以看我的新疆旅行记录&lt;a href=&quot;&#x2F;blog&#x2F;2025-travel-to-north-parts-of-xinjiang&#x2F;&quot;&gt;《5月（新疆）北疆行》&lt;&#x2F;a&gt;，还有&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;picwall.guchengf.me&#x2F;&quot;&gt;照片&lt;&#x2F;a&gt;。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;yi-xing&quot;&gt;宜兴&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;blog&#x2F;2025-01-30-travel-to-yixing&#x2F;&quot;&gt;1月春节中去了宜兴&lt;&#x2F;a&gt;，看了善卷洞和竹海，我上次去宜兴还是个小孩子，不由感慨时光荏苒。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;dong-wu-yuan&quot;&gt;动物园&lt;&#x2F;h3&gt;
&lt;p&gt;没错，&lt;a href=&quot;&#x2F;blog&#x2F;2025-01-20-half-day-in-shanghai-zoo&#x2F;&quot;&gt;1月我还去了一次动物园&lt;&#x2F;a&gt;，我很爱逛动物园，谁能拒绝可爱的动物呢？&lt;&#x2F;p&gt;
&lt;h3 id=&quot;zhang-jia-gang-dong-du-yuan-gu-huang-si-pu-yi-zhi&quot;&gt;张家港-东渡苑（古黄泗浦遗址）&lt;&#x2F;h3&gt;
&lt;p&gt;继续我们和鉴真和尚的奇妙缘分，国庆节假期我们去了张家港的东渡苑，这里是鉴真最后一次成功东渡日本的地方，古黄泗浦。东渡苑不大，其中最重要的是鉴真铜像，这个小小的地方，记录了一位一千多年前的伟人的伟大事业-东渡日本，虽小却令人感概。至此我们已经打卡了鉴真6次东渡中的五个地方，只剩下福州了，期待以后能够前往参观，完成我们和他的奇妙缘分。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;sheng-huo-zhong-de-xing-qu-ai-hao&quot;&gt;生活中的兴趣爱好&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;yin-liao-ping-ce&quot;&gt;饮料评测&lt;&#x2F;h3&gt;
&lt;p&gt;作为一名饮料爱好者，今年开始写一些主观的饮料评测文章，主要集中在上半年，选择一些相对少见的饮料来评测。做了一段时间之后，我感觉效果不是很好，因此准备先重新思考一下，希望明年可以继续这个评测系列。之前的评测可以在我的杂记列表中搜索“饮料评测”。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;he-cha&quot;&gt;喝茶&lt;&#x2F;h3&gt;
&lt;p&gt;我还算是一个比较喜欢喝茶的人，再加上岳父喜欢喝茶，今年有尝试了很多新茶叶，总体来说，今年觉得比较好的茶是雅安藏茶，雅安藏茶是一种黑茶，我觉得口感特色是淳。喜欢喝茶的可以一试，就是售卖渠道较少，价格差异大。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;mo-dao&quot;&gt;磨刀&lt;&#x2F;h3&gt;
&lt;p&gt;今年我开始自己磨菜刀，以往都是使用小区的公益磨刀服务或者宜家的快速磨刀器。今年购买了磨刀石和磨刀辅助器，慢慢练习磨刀，目前还没有特别熟练，但是应该会成为我的长久爱好。一把锋利的刀是厨房不可缺少的东西，自己磨刀既能满足做饭需求，还能作为放松身心的活动，颇有一种“禅”意。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;jin-nian-gou-mai-de-you-yong-hao-wu&quot;&gt;今年购买的有用好物&lt;&#x2F;h2&gt;
&lt;p&gt;今年购买的东西也不少，只推荐几样我真正觉得“好”且大家都能用到的东西。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hua-wang-xi-ji-jing&quot;&gt;花王洗洁精&lt;&#x2F;h3&gt;
&lt;figure&gt;
  &lt;img alt=&quot;花王洗洁精&quot; height=&quot;400&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;12&#x2F;31&#x2F;u219qMZrJAGaHpt.webp&quot;width=&quot;400&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;这款洗洁精其实我已经用了好几年，今年正式推荐它。本身它是浓缩型的，用量少，起泡多，易清洗，带除菌效果，搭配洗碗海绵很好用。我买的是微香型，还有其他香味可选。注意长时间接触使用推荐带手套。本身不贵，家用还有大瓶更实惠。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;song-xia-cm30-xiao-fang-he-ti-xu-dao&quot;&gt;松下 CM30 小方盒剃须刀&lt;&#x2F;h3&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;520&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;12&#x2F;31&#x2F;F1jRJdp9gM6HsnX.webp&quot;width=&quot;487&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;旅游用的剃须刀，体积小续航好，而且剃须非常干净高效，改变了我对小型剃须刀的认知。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;vixen-fang-da-jing-70mm-2-5bei&quot;&gt;vixen 放大镜 70mm 2.5倍&lt;&#x2F;h3&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;1440&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;12&#x2F;31&#x2F;cx3pAzMyQ2XRPNg.webp&quot;width=&quot;1463&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;给爸妈买的放大镜，年纪大了老花眼，日常生活经常要用放大镜阅读说明书之类的。这款放大镜的特点是使用了非球面镜片，因此失真和畸变都较小，并且握把和镜片都大，使用方便。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ge-chong-mei-li-nu-yang-mao-de-yi-fu&quot;&gt;各种美利奴羊毛的衣服&lt;&#x2F;h3&gt;
&lt;p&gt;美利奴羊毛制品是我在浏览其他博主的博文时了解到的，之前虽然知道这种材料，但是没有体验过，今年结合去新疆的旅行，购买了美利奴羊毛制成的内衬T恤、袜子，实际使用下来，确实发现它的吸湿透气性能很好，我本身是一个容易出汗的人，感觉美利奴羊毛特别适合我，现在国产的也有很多，价格合适。如果不放心的话，选择迪卡侬的相关产品也不错。另外美利奴羊毛的舒适性也不错。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;marna-fan-shao&quot;&gt;marna 饭勺&lt;&#x2F;h3&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;969&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;12&#x2F;31&#x2F;TQBoSgDiVkMLmZY.webp&quot;width=&quot;577&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;特点：真的不粘米粒。好用。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;yi-ben-hao-shu-ta-gai-bian-liao-zhong-guo-jiang-ze-min-chuan&quot;&gt;一本好书《他改变了中国：江泽民传》&lt;&#x2F;h2&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;596&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;12&#x2F;31&#x2F;Fue5js1YVhagJix.webp&quot;width=&quot;396&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;我不知道阅读本文的你对于他是一个什么样的看法，但我依然推荐这本书。我第一次阅读这本书已经是很久以前，第二次阅读是他去世之后，今年则是第三次阅读。&lt;&#x2F;p&gt;
&lt;p&gt;平心而论，我对于他的评价是积极的，而我对于这本书的总结：&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;一个优秀的人精彩的一生，一个伟大的国家一段波澜壮阔的历史。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;就像他自己说的：&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;一个人的命运当然要靠自我奋斗，但是也要考虑到历史的行程。&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;其余则留给大家自己评判。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;zai-jian-2025&quot;&gt;再见2025&lt;&#x2F;h2&gt;
&lt;p&gt;对于2025还有很多怀念和不舍，但是永远要继续向前，永远要有一颗前进的心。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>饮料评测：Laimon 莱檬柠檬汽水 500ml</title>
          <pubDate>Fri, 06 Jun 2025 09:43:32 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/review-laimon-fresh-drink-500-ml/</link>
          <guid>https://guchengf.me/blog/review-laimon-fresh-drink-500-ml/</guid>
          <description xml:base="https://guchengf.me/blog/review-laimon-fresh-drink-500-ml/">&lt;p&gt;最后评测于：2025年6月6日。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;1024&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;06&#x2F;06&#x2F;zRYGpbPjVXqeAlk.webp&quot;width=&quot;1024&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;评分（10分制）：&lt;strong&gt;7&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;这是一款来自俄罗斯的碳酸饮料（俗称汽水），是我去新疆旅游的时候，在霍尔果斯口岸的边境处，看到有人带了两大捆（没错，两大捆大瓶的）入境，就好奇这个汽水是不是非常好喝，以至于他们要带这么多。但是在霍尔果斯以及新疆其他地方并没有看到有卖这个汽水的店。回到上海之后我便在网上购买了一些 500 毫升塑料瓶装的。&lt;&#x2F;p&gt;
&lt;p&gt;从外观上来说，这个汽水肯定会让你联想到雪碧，我觉得他在俄罗斯的定位可能就类似于雪碧。不过实际这个饮料和雪碧差异还是挺大的。&lt;&#x2F;p&gt;
&lt;p&gt;首先作为汽水（碳酸饮料）来说，这款汽水的充气量不是很足，不知道是不是因为塑料瓶装的存在漏气的原因，总体上比雪碧或者七喜这样常见的柠檬汽水含气量要低不少。其次除柠檬味以外，它还添加了浓缩苹果汁，加得应该还挺多，你能够很明显地品尝出来。甜感我觉得和雪碧在伯仲之间，可能因为多了苹果汁，甜感更多的融入到苹果味里面了，直接性的甜味会轻一些。柠檬味也会更明显，可能也同样是因为更低的充气量导致的。总体上来说苹果汁和柠檬汁的配比还是不错的，不会觉得很酸，可以说恰到好处，如果你喜欢苹果配柠檬的组合，那应该会觉得很不错。&lt;&#x2F;p&gt;
&lt;p&gt;一定要比较的话，相对于雪碧，它其实更像七喜一点。如果想要把它当做雪碧的替代品的话，应该是不太行的，它和雪碧的差异还是蛮明显的。如果你相对“含气量”更在意苹果或者柠檬味的话，那这款汽水会比较适合你。我给它 7 分，从碳酸饮料的角度来说它是一款合格的产品，并且有自己的特色。不过没有在国内生产，价格偏贵。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>5月（新疆）北疆行</title>
          <pubDate>Mon, 26 May 2025 05:32:42 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/2025-travel-to-north-parts-of-xinjiang/</link>
          <guid>https://guchengf.me/blog/2025-travel-to-north-parts-of-xinjiang/</guid>
          <description xml:base="https://guchengf.me/blog/2025-travel-to-north-parts-of-xinjiang/">&lt;p&gt;“趁着年轻，和最爱的人一起去最美的新疆。”&lt;&#x2F;p&gt;
&lt;p&gt;结婚之后婚假一直没用，和老婆讨论过很多次去哪里休婚假，但是我们两个都有拖延症，所以迟迟未定。直到年初的时候，老婆的妹妹问我们要不要一起去新疆旅游，我们一讨论感觉去新疆旅游也很好，于是一拍即合。全程都是小姨子规划、带领，我们就跟着她就行。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;lv-you-lu-xian&quot;&gt;旅游路线&lt;&#x2F;h2&gt;
&lt;p&gt;我们旅游的时间是5月5日到15日，路线总体是经典的北疆自驾大环线，只是由于5月独库公路还没开，缺少了独库公路这一段路线。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;1440&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;05&#x2F;26&#x2F;XkJ4WIDmzsHOhFK.webp&quot;width=&quot;700&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;day-1-shang-hai-wu-lu-mu-qi&quot;&gt;Day 1 - 上海、乌鲁木齐&lt;&#x2F;h2&gt;
&lt;p&gt;上海到新疆（乌鲁木齐）的航班很多，我们选了早上的班次，出发的当天上海天气不太好，有小雨，好在航班没有受到影响，正常起飞。航班需要5个半小时，是在国内坐过的最长时间的航班。旅行的第一天总是充满了兴奋感，因此在航班上也没怎么睡觉。选择了左侧的座位，到达新疆上空时可以直接看到天山山脉，非常壮观。&lt;&#x2F;p&gt;
&lt;p&gt;乌鲁木齐应该是大部分游客的第一站，不管是从乌鲁木齐开始旅程还是中转到其他城市，都非常不错。我们到达乌鲁木齐的时候，当地天气非常好，出了机舱就感受到了充足的阳光。&lt;&#x2F;p&gt;
&lt;p&gt;计划中在乌鲁木齐的时间不多，趁着天色还早，抵达酒店安顿好之后，我们就出门去逛逛。乌鲁木齐比较有名的景点有和田二街、大巴扎等。所以我们选择打车到和田二街，然后步行前往大巴扎。&lt;&#x2F;p&gt;
&lt;p&gt;在和田二街品尝了特色小吃酸奶粽子和手抓包，酸奶粽子是白米粽子配上酸奶、果酱果干，手抓包感觉就是做法不太一样的小号烤包子（肉馅的烤馕）。还吃了一支牛奶雪糕。&lt;&#x2F;p&gt;
&lt;p&gt;穿过几条大小街道，来到了大巴扎。“巴扎”在在波斯语中的意思是“集市”，所以大巴扎就是一个很大的市场。能成为旅游景点是因为它里面有一些地标建筑，比如当地风格的建筑、阿凡提和驴的雕塑等等。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;1440&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;05&#x2F;30&#x2F;c6Z58OxyRQklaBS.webp&quot;width=&quot;2160&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;大巴扎的隔壁是金泉商城，算是小商品商城，但是我们到达的时候已经晚上8点多了，商场已经停止营业了，看着太阳还像下午的样子，实际却已经是北京时间的8点多，新疆的日落时间确实容易让人对时间产生误解。&lt;&#x2F;p&gt;
&lt;p&gt;晚饭选择了一家烧烤店，新疆烧烤的特点是分量很足，此外刚好遇到了民族歌舞表演。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;day-2-tu-lu-fan-huo-yan-shan-shan-shan-ku-mu-ta-ge-sha-mo&quot;&gt;Day 2 - 吐鲁番-火焰山、鄯善-库木塔格沙漠&lt;&#x2F;h2&gt;
&lt;p&gt;乌鲁木齐到吐鲁番和鄯善不算很远，所以我们选择高铁到吐鲁番，之前担心火焰山和库木塔格沙漠之间不好打车，刚好出租车司机问我们是否要包车，价格也比较合适，因此直接选择包车。&lt;&#x2F;p&gt;
&lt;p&gt;吐鲁番我们先去了博物馆，吐鲁番博物馆最大的特点是，它允许对展出的木乃伊、干尸拍照，这在国内是比较少见的。吐鲁番临近鄯善，在博物馆内能看到很多古楼兰国的出土文物，其中有镇馆之宝-伏羲女娲图。&lt;&#x2F;p&gt;
&lt;p&gt;博物馆出来我们在当地一家餐厅吃了午饭，还品尝了当地特色-薄荷茶（推荐！）。等到旅程结束的时候我们一致将这家餐厅评价为本次新疆之旅的最好餐厅，不管是菜品、服务、环境都极其优秀。&lt;&#x2F;p&gt;
&lt;p&gt;吃完午饭我们就前往火焰山。因为在西游记中有描述，大部分人应该都知道火焰山，它可能是吐鲁番地区最著名的景点。火焰山附近的气温确实很高，据说地表温度最高会超过75℃。景点中心有一个巨大的温度计展示当前地表温度，我们去的时候显示实时温度超过60℃。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;1440&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;05&#x2F;30&#x2F;wWBmHuKabsQgpqG.webp&quot;width=&quot;2160&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;之后我们继续乘坐出租车前往鄯善县的库木塔格沙漠，也是今天的重点。我们之前都没见过真实的沙漠，第一次见到沙漠只有“震撼”可以形容，据说库木塔格沙漠依然在流动，也就是说可能会继续变大。我们都说，我们在这看到的沙漠治理工程中的植物，可能就有我们通过蚂蚁森林种下的。&lt;&#x2F;p&gt;
&lt;p&gt;到了沙漠当然要体验骑骆驼。骆驼是种很神奇的动物，看着很温顺安静，趴在那里慢悠悠的吃东西，但据说它们也会发脾气，因此还是要有驯养的人带领才可以骑。骆驼站起或坐下的时候能感受到很大的加速度，巨大的惯性还是有点吓人的。骆驼很高，它们站起来之后可能接近两米，坐在上面视野很开阔，它们走路很稳，慢悠悠的，皮肤比较粗糙。一行人坐着骆驼在沙漠中行走，很有沙漠旅人的感觉，只是短短一段路我们便感觉到了穿越沙漠的艰难。&lt;&#x2F;p&gt;
&lt;p&gt;骑完骆驼，我们乘坐沙漠车前往更深处，这里的沙漠车也算是一个旅游项目，开得很快，并且拐来拐去的，经常有种快要翻车的感觉。到达一个比较高的沙丘之后，我们便下来徒步游玩。人在沙漠中显得特别渺小，即便只是在沙漠的边缘区域，也会有绝望孤独感。我们在这里拍照打卡，体验了滑沙，然后试着向更深处走去，但是很快起风了，飞沙的阻碍很大，我们无法继续前行，选择了返回。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;1440&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;05&#x2F;30&#x2F;SJVgiD4YjvRFZB6.webp&quot;width=&quot;2160&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;今天不算特别热，因此在沙漠中感受还行，当地人也建议我们，应该在早上来沙漠，避开最炎热的中午时分。&lt;&#x2F;p&gt;
&lt;p&gt;沙漠出来后，继续坐出租车前往鄯善县高铁站（感谢出租车司机一整天的等候），然后高铁回到乌鲁木齐。到达乌鲁木齐已经是晚上10点多，由于我们今天没带充电宝，导致回到乌鲁木齐的时候每个手机都电量告急，在高铁站卡着最后的电量取了租赁的车，回到了酒店。提醒大家在广袤的新疆，出行一定要带好充电宝，因为你的每一段路程都可能要很久。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;day-3-wu-lun-gu-hu-bu-er-jin-wu-cai-tan&quot;&gt;Day 3 - 乌伦古湖、布尔津-五彩滩&lt;&#x2F;h2&gt;
&lt;p&gt;第三天我们正式开始北疆自驾的旅程，从乌鲁木齐出发前往乌伦古湖。一路上我们经过了城市、郊野、草地、荒漠、沙漠、戈壁，见识到了大西北的各种地形，大开眼界。偶尔在路边的草地上看到牛羊马，在荒漠中看到骆驼，都会引起我们的惊叫，很符合没见识的外地旅客形象。&lt;&#x2F;p&gt;
&lt;p&gt;到达乌伦古湖也意味着我们已经正式进入阿勒泰地区，电视剧《我的阿勒泰》再次提高了这个地区的旅游热度。乌伦古湖有两个旅游区，一个是建成的旅游景点-乌伦古湖黄金海岸。乌伦古湖很大，远处能依稀看到雪山，天和水都是蓝色，真正意义上的海天相接，拍照蓝色会溢出。黄金海岸是建成旅游景点，因此有很多供游客打卡拍照的东西。与之相对的金沙滩景区，则是完全没有开发的原始景点，经过一段泥土路之后，可以到达乌伦古湖的另一侧，这里没有旅游设置，完全原始的景色，感觉比黄金海岸更好看，湖水冰凉，风景很美。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;1440&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;05&#x2F;30&#x2F;V5pcrEwUMOPzbBS.webp&quot;width=&quot;2160&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;离开乌伦古湖我们继续前往布尔津和下一个景点五彩滩。五彩滩有著名的雅丹地貌，因日落之时，阳光照在雅丹地貌上会呈现五彩之色而得名，我们看到了红色、绿色、黄色，其他颜色则难以分辨，属于可遇而不可求。除了五彩滩本身以外，这里的日落也非常美。雅丹地貌我上学时在课本上学到过，直到今天才有机会真正见到，属于现实中印证知识了。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;1440&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;05&#x2F;30&#x2F;vZtQWf4Fe59rC7A.webp&quot;width=&quot;2160&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;今天晚上我们的休息地是布尔津，一座著名的边境城市，因为临近边境，这里能看到很多俄罗斯、哈萨克族的人，再加上很浓的中亚、俄罗斯建筑风格，会让人误以为这是一座国外的城市。晚饭我们品尝了当地特色冷水鱼，冷水鱼的做法类似剁椒鱼，使用当地著名的“狗鱼”，肉质鲜美，但是鱼刺比较多。吃完饭我们又去了布尔津的著名打卡点-喀纳斯塔桥，这是一座哥特风格的塔桥，晚上开灯之后很奇幻。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;1440&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;05&#x2F;30&#x2F;juHPasTDliqM7w8.webp&quot;width=&quot;960&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;day-4-a-le-tai-ke-na-si&quot;&gt;Day 4 - 阿勒泰-喀纳斯&lt;&#x2F;h2&gt;
&lt;p&gt;第四天我们前往阿勒泰的核心地区-喀纳斯，也是阿勒泰最著名的景区。从喀纳斯开始，我们就要进入山区，蜿蜒的山路中空气清新，景色优美，离雪山也越来越近。喀纳斯比我们想象中更大，从景区门口坐两班区间车到观鱼台停车点，需要一个半小时，然后自行登山到观鱼台。观鱼台能看到整个喀纳斯湖，感觉是整个景区最好的观景位置，蓝色的喀纳斯湖如同蓝宝石镜面一般，搭配森林和远处的雪山，非常美丽。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;1440&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;05&#x2F;30&#x2F;KdywgIS1qEUe6JY.webp&quot;width=&quot;960&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;从观鱼台下来，坐区间车返回，中途在月亮湾下车，开始徒步到神仙湾，这是喀纳斯主要的一条徒步线路。月亮湾顾名思义，是一段月亮形状的弯曲溪流，和山顶喀纳斯湖呈现蓝色不同，这里的溪水呈现碧绿色，阳光照耀之下波光粼粼，有点像宝石。经过卧龙湾到神仙湾，一路景色都不负它们的美名。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;1440&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;05&#x2F;30&#x2F;TFnwB8Abrc3E5DC.webp&quot;width=&quot;960&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;从喀纳斯的核心景区出来依然回味无穷，但是我们必须快马加鞭赶往今天的住宿地-禾木村。禾木村离喀纳斯不算很远，但中间都是山路，因此需要花费较多的时间。进入阿勒泰之后，我们已经可以在路上遇到牛羊马群，开车需要多加注意，如果遇到牧群穿越马路，一定要等动物们通过之后再继续前进，不然动物们可能受惊乱跑。&lt;&#x2F;p&gt;
&lt;p&gt;到达禾木村的时候已经比较晚了，当地人说日落是禾木的重要景观，我们没能赶上日落，比较遗憾。禾木晚上的气温还是很低，屋内都要用地暖来供暖。在禾木我们品尝了正宗的（咸的）新疆奶茶，喜欢甜口的我们以前都选择甜奶茶，这次算是尝鲜，一开始会觉得比较奇怪，但是咸奶茶的特点就是越喝越上口，最后一壶都喝完了。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;day-5-a-le-tai-he-mu-cun&quot;&gt;Day 5 - 阿勒泰-禾木村&lt;&#x2F;h2&gt;
&lt;p&gt;今天我们正式开始禾木村之旅。我们主要去的景点是哈登观景台，中途先去了援疆桥，一坐很有特色的木质吊桥。看见“援疆桥”的石碑，你就可以感受到新疆与中国其他地区的紧密联系，事实上在新疆有很多这样子象征着新疆与其他地区友谊的建筑。禾木村旁的这条河流过整个村落，村民都需要通过这座吊桥前往河对岸的森林和草地，因此这座桥对他们的意义不言而喻。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;1440&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;05&#x2F;30&#x2F;HXAJOGBPYphnNFq.webp&quot;width=&quot;2160&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;哈登观景台建在禾木村旁的山腰上，需要经过一段不短的登山路。观景台可以俯瞰整个禾木村，这个景色让我想起了自己喜欢的一款游戏《牧场物语-矿石镇的伙伴》，也许禾木村就是矿石镇现实中的样子吧，河流穿过的小村落，大片的草地牧场，远处是雪山，宁静祥和的牧场生活，如同世外桃源。牧场里有很多白头牛，长相如同它的名称-整个头部都是白色，应该是特有品种。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;1440&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;05&#x2F;30&#x2F;dV4CeLryEOJoA1l.webp&quot;width=&quot;2160&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;从观景台上下来已经是午后，我们就在村里的农家餐馆吃饭，品尝了著名的红柳烤串，喝了山羊奶，红柳烤串给我的印象比较深刻，羊肉分量十足，并且烤得很入味。&lt;&#x2F;p&gt;
&lt;p&gt;吃完午饭稍作休整，我们就准备离开禾木村，同时也意味着我们即将和阿勒泰告别了，阿勒泰给我的感觉很好，除了美丽的景色，还有可爱的动物，令人向往的世外桃源般的生活。&lt;&#x2F;p&gt;
&lt;p&gt;我们今天的目的地是奎屯市，是去我们新疆之旅的核心-赛里木湖的中转站。从禾木村到奎屯路途遥远，为了尽可能利用有限的时间，我们在这段路程中间找了一个景点作为休息点，就是大名鼎鼎的“魔鬼城”，又一个我们在教科书上学到过的地方。魔鬼城也是雅丹地貌，但是和五彩滩不同，魔鬼城主要是欣赏风蚀地形塑造的象形地貌为主，有些象形地貌很容易分辨（比如狮子、老鹰、船、人脸），有些则需要充分发挥你的想象力。魔鬼城能让你感受到祖国的地大物博，在遥远的新疆，藏着这么壮观的地理样貌，这里也是电影《卧虎藏龙》《七剑下天山》的取景地。不过魔鬼城气候炎热，很难想象在炎热的旺季，大量的旅客在这里排队的场景（确实太魔鬼了）。&lt;&#x2F;p&gt;
&lt;p&gt;从魔鬼城出来继续前往奎屯市，中间会路过新疆的著名城市-克拉玛依。克拉玛依是写进历史书的地方，它见证了新中国石油产业的发展，如今克拉玛依已然是大城市，我们经过的时候能看到这里灯火通明，非常繁华。这两天见到了这么多书上的地方，我的满足感很强。&lt;&#x2F;p&gt;
&lt;p&gt;到达奎屯市的时候，已经是晚上10点多，但如同当地人所说“10点新疆的夜生活才刚刚开始”，奎屯市区依然非常热闹，甚至有一条街因为夜市而进行道路管控。今天的晚饭是新疆炒粉，我们也发现，新疆的很多饭菜都是辣的，这也让我们比较意外。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;day-6-sai-li-mu-hu-guo-zi-gou&quot;&gt;Day 6 - 赛里木湖、果子沟&lt;&#x2F;h2&gt;
&lt;p&gt;怀着激动的心情，我们早早出发，踏上了前往赛里木湖的旅程。赛里木湖声名远播，“大西洋的最后一滴眼泪”给了这个地方最高的赞美。今天我们主要行驶在连霍高速上，连霍高速连接西部口岸霍尔果斯和东部港口连云港，是一条重要的东西通道，因此车辆明显比之前经过的其他高速要多。可惜今天天公不作美，一路上就是阴天居多，虽然路边的雪山与云朵映照很有氛围，但我们不得不担心赛里木湖的天气是否适合游玩。&lt;&#x2F;p&gt;
&lt;p&gt;到达赛里木湖之后，天空已经很阴了，让我们感到很遗憾。天气不好，于是我们选择了一条特殊的路线，从赛里木湖东入口顺时针向南出口前进，如果天气突变，我们就能及时从南出口离开。阴天的赛里木湖也很特别，云层很低，湖面有不小的风浪，有种秘境般的沉浸感。我们经过南出口的时候，已经开始下雨了，试着向前继续行驶了一小段路，雨势加大，远处的群山倒是在云雾之中显得很壮观，但我们不得不离开景区，准备先吃饭再做打算。&lt;&#x2F;p&gt;
&lt;p&gt;从南出口离开景区，经过一个壮观的山门，到达了果子沟区域（赛里木湖的南出口出来就是果子沟）。我们就在附近的农家乐里吃了午饭（还尝了乌苏啤酒）。吃完饭发现雨已经基本停了，而路边的观景平台上很多人在看果子沟的风景，我们商议了一下，既然这个天气再进入赛里木湖的意义不大，不如继续向果子沟大桥前进。果子沟大桥同样很有名，作为中国首座大跨度公路钢桁梁斜拉桥，不管是从技术还是设计角度都有非常高的价值，值得去打卡一下。&lt;&#x2F;p&gt;
&lt;p&gt;我们首先在山顶平台远眺大桥，这里能看出这座大桥的建造难度和工程量，跨越了高山间的深谷，打通了群山内外。果子沟的山顶其实很适合打卡，自然景观和人文景观都有。在山顶欣赏完，我们继续驾车前行（司机没喝酒），这次我们将直接驶过果子沟大桥。不管是从下往上看大桥，还是从桥上经过，都是另一种很直接的震撼而壮观的感觉，对于我国的基建水平也有跟深刻的认知。经过大桥之后我们也算打卡了这个著名的景点，弥补了一些糟糕天气的遗憾。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;1440&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;05&#x2F;30&#x2F;LKdtCml6gHeZiNW.webp&quot;width=&quot;2160&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;看到天空没有转晴的趋势，我们就决定今天早点去酒店休息。再次路过赛里木湖的时候，乌云稍微露出了一些缝隙，阳光透出来照在湖面上，也是别样的风景。今天我们住宿的地方叫做星空营地，整个建筑、布局有点模仿科幻影片中的外星殖民营地，再配上今天阴暗昏黄的天气，一下子就有外星生存的感觉了。晚上我们看天气预报说赛里木湖第二天有较高概率是晴天，就决定第二天再次进入景区。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;day-7-sai-li-mu-hu-huo-er-guo-si-kou-an-te-ke-si&quot;&gt;Day 7 - 赛里木湖、霍尔果斯口岸、特克斯&lt;&#x2F;h2&gt;
&lt;p&gt;第二天我们刚起床，就发现门外来了特别的客人-一群羊，似乎是从旁边草地跑过来了，它们毫不见外地在门外吃草，和我们“合影”之后被主人叫了回去。今天天气意外的很好，阳光明媚，我们赶紧收拾好行李，驾车进入景区。&lt;&#x2F;p&gt;
&lt;p&gt;今天我们终于见到了最美的赛里木湖，乌伦古湖同样很美，但是没有赛里木湖这么完美，草地、湖泊、雪山，每样都很美，结合到一起只有“完美”两个字能形容，从进入景区开始，我们说的最多的话是“太好看了”，甚至想不到怎样形容这种美景。赛里木湖给人一种“神奇”的感觉，蔚蓝的湖、碧绿的草地、白皑皑的雪山，分开来都不算罕见，但是能这么完美地组合在一起的，真的就只有赛里木湖了，这也是它声名远播的原因。在湖边我们与天鹅合影，也会羡慕生活在这样美丽的地方的动物。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;1440&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;05&#x2F;30&#x2F;SVtLlQPspORTZ9N.webp&quot;width=&quot;2160&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;赛里木湖毫无疑问很出片，不管是被拍照的人还是拍照的人，都会感到很满足，你的照片无需任何加工，已经浑然天才，快门随便按都好看，只需要担心颜色溢出。我也不需要用很多的语言来赞美它，只能说：“不枉此行”，也为我们决定再次进入赛里木湖而感到庆幸。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;1440&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;05&#x2F;30&#x2F;DHp6EbBgAJ32tMw.webp&quot;width=&quot;2160&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;过了天鹅聚集的克勒涌珠，就到了松树头，登上松树头能看到最好最完整的赛里木湖景色，不过爬上去需要一个小时，但看到的景色不会让你失望。从松树头下来，我们就在景区吃了饭，带着无比满足和回味的心情，离开景区。&lt;&#x2F;p&gt;
&lt;p&gt;我们今天的住宿地是特克斯，然后我们根据路线，临时安排了去霍尔果斯口岸的行程（只需稍微岔开一个小时的路程），这应该是我们为数不多的走路出国的机会。霍尔果斯口岸是中国与哈萨克斯坦的国境口岸，这里的出境打卡很热门，在当地你能遇到很多给你兜售导游、打车服务的人，不要管他们，出境打卡你可以全程自己完成，如果你没带护照，可以在出入境管理局花费15元办理一张临时通行证。通过海关，你就来到了中立地带，首先乘坐中方一侧的公交车到国境线附近，在这里你能看到新国门，可以按照一些网上的教学拍照留念。5月还没有到旅游旺季，因此哈萨克斯坦一侧的旅游观光车还没有运营，就不能在他们那一侧逛一圈了。简单打卡逛了一下之后，我们就通过海关回到境内，说走就走的出国体验还是很奇特的。在海关这里你会遇到很多企图让你帮忙带东西过关的人，不要理他们，请牢记，在海关不要碰任何不属于自己的东西！&lt;&#x2F;p&gt;
&lt;p&gt;从霍尔果斯出来我们继续前往特克斯，到这里我们又会进入荒漠和山区。特克斯也叫“八卦城”，因为整个县城按照八卦的格局规划建造，没有红绿灯，全靠环岛、岔路控制交通，一开始我们觉得很神奇，但是分别作为司机和行人通行了几次之后，就觉得这样的设计可能弊大于利，不管是车辆还是行人都冒着比较高的风险在通行，虽然当地人可能已经习惯了。我们到特克斯的时候已经快晚上10点，再次体验到了在新疆10点夜生活才刚开始的感觉，我们吃饭的餐厅依然有很多顾客。吃完饭我们去了城中心，准备通过无人机一览八卦城全貌。在中心天坛飞起无人机，便能看到完整的八卦布局。如果你的无人机飞行高度不够的话，可以试着往八卦边缘飞去，然后掉头回来看这个县城，这样八卦会比较明显。晚上的八卦城还是比较好看的，灯光让八卦造型更加明显，让你不得不佩服设计者的奇思妙想，也让无人机的价值体现了那么一些。&lt;&#x2F;p&gt;
&lt;p&gt;可能是还没到旺季的原因，我们住宿的酒店价格很便宜，房间却很大（比绝大多数五星级酒店的房间还大）。但有个小缺陷是没到旺季，所以中央空调没开，只能通过冷风机制冷。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;day-8-ku-er-de-zhu&quot;&gt;Day 8 - 库尔德宁&lt;&#x2F;h2&gt;
&lt;p&gt;在北疆说到草原，大家首先想到的肯定是那拉提，然后可能会是库尔德宁、恰西等，因此我们规划了经由库尔德宁去那拉提的路线。这一带的草原实际都是山上草原，我们通过山路进入景区，在两边就能看到草地，山间草地的特点是，它会和树林相间，然后随着海拔的变化，草的颜色也会有变化。库尔德宁和我们想象中的云上草原不太一样，如果把它作为一个山景来看，可能更合适。云杉是库尔德宁的特色，这里能看到成片的云杉林，其中还藏着云杉王。博物馆的讲解员很热情，给我们介绍了库尔德宁的各种景色，包括一些我们没有去的地方。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;1440&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;05&#x2F;30&#x2F;3cughVSJk6xZ5Hr.webp&quot;width=&quot;2160&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;可能是由于前一天的赛里木湖太过于美丽，因此今天在库尔德宁没有觉得特别兴奋。所以赛里木湖一定得安排在你旅程的中后段，不然看完赛里木湖，你会觉得其他地方都一般。&lt;&#x2F;p&gt;
&lt;p&gt;从景区出来，经过一段崎岖的小路，就在我们怀疑是不是走错路的时候，峰回路转，突然出现了一大片真正意义上的云上草原，可以说是意外之喜。这里山顶的平地意外的大，草地覆盖整个山头，远处有一些牛羊马在悠闲地吃草，这应该是我们第一次看到如此开阔的山上草原，之前禾木村里虽然也有山上的草场，但是没这么大。这里是真的蓝天白云绿草，看到这些已经让我们对库尔德宁之行感到非常满足。&lt;&#x2F;p&gt;
&lt;p&gt;继续前行，我们在路边连续遇到了羊群和马群，羊群很可爱，一群挤在一起往前走，甚至走到了马路外，我们向它们“咩”了几下，很快整个羊群开始回应我们，“咩咩”声此起彼伏，还停下来看着我们。相比之下，马群的组织度就高了很多，它们有序地在路上通行，虽然依然会转头看我们，但是脚下丝毫不停留，很快就与我们擦肩而过。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;1440&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;05&#x2F;30&#x2F;nmiLWF8fq7KOU5s.webp&quot;width=&quot;960&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;1440&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;05&#x2F;30&#x2F;GwBQmtp8vY7EnKJ.webp&quot;width=&quot;960&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;离开库尔德宁我们继续前往那拉提，到达的时候还早，我们就先吃饭。东部地区的人在新疆有一个比较困惑的点就是-现在吃的这顿是早饭、午饭还是晚饭，感觉会比较错乱。不过在新疆的这么多餐，我们都没有踩雷，任何一家餐厅的菜都非常好吃，没有出现吃不惯或者不喜欢的问题，值得一提的是，新疆菜的肉做得都非常入味。&lt;&#x2F;p&gt;
&lt;p&gt;吃完饭到酒店安顿下来，刚好到了太阳落山的时间，我们先出门逛了逛，遇到了下班回家的羊群，体验了一次赶羊的感觉，还配合牧民调整羊群路线，让它们顺利回家，是意外的体验。&lt;&#x2F;p&gt;
&lt;p&gt;回到酒店在室外的吊椅上休息了一会儿，欣赏了晚霞，告别又一个美好的一天。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;day-9-na-la-ti&quot;&gt;Day 9 - 那拉提&lt;&#x2F;h2&gt;
&lt;p&gt;那拉提是我们新疆之旅中的最后一个核心景点，我们住的地方里景区很近，早早出发进入了景区，这里的游客明显多了起来（因为那拉提的草绿得更早，这时已经基本全绿了），部分游玩项目已经需要排队。那拉提比库尔德宁要大得多，并且山坡更平缓，视野更开阔。本来我们打算体验一下滑草，但是排队的人数过多，就放弃了。&lt;&#x2F;p&gt;
&lt;p&gt;经过山路进入到那拉提的核心地带，我们终于看到了真正意义上的云上草原，高山之上，有大片平坦的草地，旁边就是雪山，白云就在头顶的感觉。这里又是一个拍照的好地方，我们还尝试用无人机拍了“旱地拔葱”的视频，虽然不完美，但是已经很满足了。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;1440&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;05&#x2F;30&#x2F;6FaHdTmbxR51w2r.webp&quot;width=&quot;2160&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;那拉提比较重点的游玩项目肯定是骑马，今天天气好，因此游玩的人很多，我们在骑马项目这里经历了新疆之旅的第一次排队（没错，之前都是VIP体验，全程无排队）。排了大约30分钟，并且因为人太多，马队只开放最短的草原骑马路线，大概50分钟。&lt;&#x2F;p&gt;
&lt;p&gt;骑马和骑骆驼一样很有意思，属于来这里一定要体验一下的项目。相比骆驼，马的脾气要大得多，经常出现马匹不听指挥的情况，我就遇到了，正在上马的时候马匹突然开始活动起来，好在工作人员立刻控制了它。安全上马之后，开始了慢悠悠的骑行之旅。马走起来很颠簸，再加上草地也不平整，还要经过溪流，并不舒服，不过这样的体验才显得很真实，毕竟骑马应该就是这样的。策马奔腾之类的事情是不会有的，我们安全地到达了目的地，一起拍照打卡，然后又安全地返回了起点。骑马的体验还是很值得的，价格也不贵。&lt;&#x2F;p&gt;
&lt;p&gt;从核心景区出来，我们又去了另一个景点-盘龙谷道，盘龙谷道主要是看风景+山路自驾体验，这应该是我们在新疆之旅中行驶过的最弯的山路。在山路中的一个打卡点，我们遇到了吃草的山羊群，山羊相比绵羊更不怕生一点，吃着吃着就跑到我们附近来了，还直接钻到了我们车底下，也让我们有机会体验了撸羊。&lt;&#x2F;p&gt;
&lt;p&gt;撸完羊我们也就要告别美丽的那拉提，因为独库公路还没开放，我们只能回头去伊宁，在那里换高铁回到乌鲁木齐。独库公路原本是自驾必须要体验的，但如果等到6月开放之后再来，已经进入了旺季，我们的时间安排还有旅游体验都会差很多。&lt;&#x2F;p&gt;
&lt;p&gt;在县城饱餐一顿之后，我们驶上了去伊宁的高速，太阳也火辣了起来。伊犁河谷的肥沃与它的气候也密不可分，这次我们来也体会到了。从那拉提到伊宁并不近，但是经过这段时间在新疆广袤大地上的自驾之旅，这点距离对我们来说已经是小菜一碟了。&lt;&#x2F;p&gt;
&lt;p&gt;伊宁是一个大城市，这里与其他旅游区不太一样，基本和其他大城市没什么区别。同时这里气候炎热，是我们整个新疆之旅中气温最高的地方。到了伊宁之后我们没有其他安排，在周围溜达了一下之后早早休息。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;day-10-yi-zhu&quot;&gt;Day 10 - 伊宁&lt;&#x2F;h2&gt;
&lt;p&gt;今天开始我们已经没有严格的旅游计划，在伊宁大致规划是去喀赞其民俗街、博物馆、伊犁河以及六星街。喀赞其广场有很多鸽子，我们买了一袋鸽粮，尽情地喂了一次鸽子，至少比上海北外滩的喂鸽子划算多了。喂完鸽子我们乘坐观光车进入村里，村子都是传统风格的房屋建筑，外墙都刷了蓝色，看着很奇特。观光车的第一个停靠点是一个村民家，村民家中爷爷表演了维吾尔民族舞蹈，已经83岁高龄的他依旧可以头顶15斤的花瓶完成舞蹈，令人佩服。第二个停靠点是一个维吾尔族家庭展馆，里面按照传统维吾尔族家庭装修设计，可以让游客近距离体验维吾尔族传统民家内部。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;1440&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;05&#x2F;30&#x2F;ya4KBlGteJdLYAk.webp&quot;width=&quot;960&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;民俗街出来，我们直接去了伊宁博物馆。伊宁博物馆不大，但是有它自己的独特历史文化，这里民族众多，在博物馆内我们看到了各个民族的文化历史，特别注意到了刚刚在村子里给我们表演舞蹈的老爷爷，出现在了博物馆内的维吾尔族文化介绍中，看来他在当地应该是很有名的人。&lt;&#x2F;p&gt;
&lt;p&gt;从博物馆出来已经快到正午，天气有些炎热，我们稍作休整之后，开车去了伊犁河风景区，这里能看到伊犁河还有伊犁河大桥。通过四人自行车，我们在河边逛了一圈，消耗了一下体力，准备吃午饭。&lt;&#x2F;p&gt;
&lt;p&gt;午饭选在六星街的一家俄罗斯餐厅，刚好从六星街外围一路逛过去。六星街和特克斯八卦城的设计理念有点像，都是把街道建成特定的布局，不过六星街比较小，以人行为主。街道上以餐厅、小商品店为主，路边也有小摊。我们选的俄罗斯餐厅老板是真正的俄罗斯人，菜品也很正宗，在旅程的末尾换换口味也不错。&lt;&#x2F;p&gt;
&lt;p&gt;至此我们正式结束自驾旅程，到伊宁火车站归还租赁的车，乘上高铁返回乌鲁木齐。从乌鲁木齐高铁站到酒店的途中，我们再次感受到了乌鲁木齐是一个大城市，和上海一般，这里的车很多，道路同样很堵。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;day-11-wu-lu-mu-qi-shang-hai&quot;&gt;Day 11 - 乌鲁木齐、上海&lt;&#x2F;h2&gt;
&lt;p&gt;今天是我们在新疆的最后一天，这段旅程每天都很充实，时间过得飞快，一转眼就到了返程的时间，最后的大半天时间我们计划在乌鲁木齐城中转一转。&lt;&#x2F;p&gt;
&lt;p&gt;首先是采购一些带回家的礼物。第一站是当地比较大的连锁超市-阿尔曼超市，据说这里的东西物美价廉，是从新疆带货回家的最好选择。我们在这里买了一些食品，主要是奶制品、切糕、巧克力、果酱和茶等，临出门又拿了一瓶杏皮茶。这个杏皮茶意外的好喝，老婆一开始说我又喝饮料，马上她自己喝了一口之后就变成了真香：“应该多买几瓶的”。至于其他的食物，一开始我们还想是不是买多了，结果回到家以后，每种品尝了一下，发现都很好吃，又开始遗憾没有多买一些了。从超市出来，我们又去了不远处的金泉商城，这里都是贩卖一些小商品，我们主要买了一些当地景点和特色标识的冰箱贴。&lt;&#x2F;p&gt;
&lt;p&gt;采购完我们的下一站是乌鲁木齐博物馆，作为新疆的首府，它的博物馆自然收藏了最多、最有意义的文物。乌鲁木齐博物馆里的藏品，有个很重要的特点-它们深刻地体现了自古以来新疆地区和中原地区的关联性，这里能看到大量新疆与中原地区文化交流的证明以及对中原王朝正统性的认可。在这里我们也见到了镇馆之宝-“五星出东方利中国”护膊，其意义不言而喻。&lt;&#x2F;p&gt;
&lt;p&gt;逛完博物馆，我们心满意足，前往机场返程，告别美丽的新疆。&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;5月的新疆还不是最美的时候，但我依然可以说：不虚此行。大部分时候，相机都无法展现新疆的美丽，以至于我想起了《白日梦想家》中西恩的话：如果我喜欢一个时刻，我不想被相机打扰，只想静静地沉浸其中。&lt;&#x2F;p&gt;
&lt;p&gt;除了自然景观，新疆还有丰富的人文，可爱的动物，宁静祥和的生活。诸多的美好景色，只要记在心中就好。无论以后什么时候，我都会为自己来过美丽的新疆，看过祖国的大好河山而感到庆幸。虽然因为时间的原因，这段旅程中有很多景点我们都没有仔细游玩甚至是没有去，但是没关系，看过的风景已经让我无比满足，而且新疆值得再来一次！&lt;&#x2F;p&gt;
&lt;p&gt;那么下一次，南疆见！&lt;&#x2F;p&gt;
&lt;p&gt;所有照片通过尼康 Z63 和 理光 GR3 拍摄。你可以在 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;picwall.guchengf.me&#x2F;?tag=%E6%96%B0%E7%96%86%EF%BC%88%E5%8C%97%E7%96%86%EF%BC%89%E8%A1%8C&quot;&gt;https:&#x2F;&#x2F;picwall.guchengf.me&#x2F;?tag=新疆（北疆）行&lt;&#x2F;a&gt; 查看所有的照片。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>饮料评测：统一春拂绿茶</title>
          <pubDate>Wed, 02 Apr 2025 07:57:19 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/review-tongyi-chunfulvcha/</link>
          <guid>https://guchengf.me/blog/review-tongyi-chunfulvcha/</guid>
          <description xml:base="https://guchengf.me/blog/review-tongyi-chunfulvcha/">&lt;p&gt;最后评测于：2025年4月2日。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;1200&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;04&#x2F;02&#x2F;C2MAvqni65afVXg.webp&quot;width=&quot;1200&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;评分（10分制）：&lt;strong&gt;4&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;首先必须要批评这款茶的包装设计、宣传、品牌设计等相关部门，从包装的任何地方都看不到这款茶掺了茉莉花，等你打开喝到第一口，反应一定是：为什么是茉莉花味的，然后去看配料表，发现有茉莉花。这绝对是极其错误的做法。纯绿茶和调味茶完全是两个东西，就凭这一点，这款茶就很难拿到及格的分数。&lt;&#x2F;p&gt;
&lt;p&gt;然后来说说它的味道。入口茉莉花的味道很重，让人几乎忘了这是一款“绿茶”，所以还是对于这款茶定位、包装、宣传、品牌设计等策略非常疑惑，甚至有误导顾客的嫌疑。&lt;&#x2F;p&gt;
&lt;p&gt;茉莉花的味道比较清晰，但是比不过其他类似的以茉莉花为卖点的调味茶，味道不够厚重。至于绿茶口感方面，比较简单粗暴，没有什么太多的层次，就是普通的绿茶饮料的水平，和他们一直卖的常见统一绿茶没有什么差别，只不过这款茶是无糖的。&lt;&#x2F;p&gt;
&lt;p&gt;所以总体来说，这款的主体-绿茶不够突出，毫无特色，口感也偏淡。加了茉莉花导致入口的直接口感都被茉莉花占满了，回味也是茉莉花的味道更重，实在难以将它和所宣传的“纯”绿茶关联起来。&lt;&#x2F;p&gt;
&lt;p&gt;只能给到一个 4 分。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>饮料评测：伊藤园浓味绿茶（无糖）</title>
          <pubDate>Fri, 14 Mar 2025 07:33:56 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/review-itoen-unsweetened-bold-green-tea/</link>
          <guid>https://guchengf.me/blog/review-itoen-unsweetened-bold-green-tea/</guid>
          <description xml:base="https://guchengf.me/blog/review-itoen-unsweetened-bold-green-tea/">&lt;p&gt;最后评测于：2025年3月14日。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;800&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;03&#x2F;14&#x2F;Sc1DwaTquQBF4tG.webp&quot;width=&quot;800&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;评分（10分制）：&lt;strong&gt;7&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;浓茶饮料是一个很小众的市场，我印象中没见过其他浓茶饮料，可以说伊藤园这款浓味绿茶是爱喝浓茶的人为数不多的选择。这款茶在日本各类吃播节目中出镜率比较高，大概因为浓茶比较下饭解腻。&lt;&#x2F;p&gt;
&lt;p&gt;整体来说，这款茶确实非常浓，但是并非是普通的浓绿茶，如果你泡过常见的绿茶品种的浓茶的话，会发现和这款茶的差异很大，我喝了很多次之后，觉得这款茶更接近于浓“山绿茶”。山茶是一个非常规叫法，因为严格意义上，大部分茶叶都产自山上，饮茶爱好者口中的“山茶”指的是那些特定山区出产的绿茶，特点是&lt;strong&gt;生涩味非常重&lt;&#x2F;strong&gt;，是绿茶中的“重口味”，比如比较有名的广东“博罗山茶”，也是我喝得比较多的山茶。&lt;&#x2F;p&gt;
&lt;p&gt;伊藤园浓味绿茶的做法，突出“苦、涩”味，毫无疑问符合大多数人对于“浓茶”的定义。当然，他不一定能代表所有浓绿茶的口感，我重新阐述我上面的观点：它实际上更接近于浓绿山茶，生涩味会比较突出一些。&lt;&#x2F;p&gt;
&lt;p&gt;我给这款茶7分，如果仅从茶的口感、味道之类的来说，它可能达不到7分，但是浓茶饮料本来就少，再加上这款茶确实尽可能地做到了还原，对于浓茶爱好者来说，能有这样一个选择，值得7分。&lt;&#x2F;p&gt;
&lt;p&gt;另外请注意这款茶的茶多酚含量非常高，请适量引用。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>饮料评测：麒麟直火一日黑咖啡 600ml</title>
          <pubDate>Wed, 05 Mar 2025 08:13:37 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/review-kirin-fire-one-day-black-coffee-600-ml/</link>
          <guid>https://guchengf.me/blog/review-kirin-fire-one-day-black-coffee-600-ml/</guid>
          <description xml:base="https://guchengf.me/blog/review-kirin-fire-one-day-black-coffee-600-ml/">&lt;p&gt;最后评测于：2025年3月5日。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;757&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;03&#x2F;05&#x2F;cBvTSd4q9hyAw1s.webp&quot;width=&quot;757&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;评分（10分制）：&lt;strong&gt;6&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;麒麟品牌下的直火系列咖啡，比较常见的应该是奶咖那一款。这款黑咖啡相对少见。名字带“直火”，毫无疑问又是以“烘焙口感”为特色的。&lt;&#x2F;p&gt;
&lt;p&gt;这款咖啡喝起来几乎没有酸感，只有焦苦味，然后“烘焙”的味道也比较重，但是看到配料表的食用香料，我就知道又是科技的味道。抛开香料不谈，如果喜欢日式咖啡味道的，应该会比价喜欢这款咖啡，确实很还原日式咖啡那种烘焙咖啡豆的味道。&lt;&#x2F;p&gt;
&lt;p&gt;除此之外，并没有太出彩的地方，烘焙的味道比较突兀，不厚重，很快就消散了，反倒是焦苦味会持续很久，喝完之后嘴巴里一直都是苦的。&lt;&#x2F;p&gt;
&lt;p&gt;总体只能算是一款合格的日式即饮咖啡，比不上同系列的奶咖款。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>饮料评测：伊右卫门绿茶 500ml</title>
          <pubDate>Mon, 03 Mar 2025 07:01:50 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/review-iyemon-green-tea-500ml/</link>
          <guid>https://guchengf.me/blog/review-iyemon-green-tea-500ml/</guid>
          <description xml:base="https://guchengf.me/blog/review-iyemon-green-tea-500ml/">&lt;p&gt;最后评测于：2025年3月3日。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; height=&quot;500&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;03&#x2F;03&#x2F;Crba1g6MmvHhp3N.webp&quot;width=&quot;500&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;评分（10分制）：&lt;strong&gt;6&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;伊右卫门是三得利旗下的茶饮品牌，主打的大概是精品茶，和东方树叶差不多。首先不得不承认日本在营销方面很有一套，首先是宣传京都茶的这个概念，京都算是日本茶历史的源头；然后是日本茶饮最喜欢的“添加了一些顶级茶叶”的概念；其次是“新茶”的概念；最后还有什么“添加抹茶粉”之类的。这么一套营销概念下来，让你感觉这个茶真的不得了。&lt;&#x2F;p&gt;
&lt;p&gt;那么这个茶喝起来到底怎么样呢？一个词总结：怪异。如果无视他上面的营销概念，这个茶在平平无奇中还带着一股怪异。如果你看他的配料表，会发现除了水、绿茶、维生素C，还有个奇怪的东西：酵母。一个绿茶为什么要加酵母？无非就是差异化口感罢了。所以这个茶喝进去之后，如果你仔细回味一下，会有一点点发酵茶的味道，至于说好不好，见仁见智，我是觉得有一点点怪异的。&lt;&#x2F;p&gt;
&lt;p&gt;这款绿茶整体口感上是偏淡的，味道说不上好，有绿茶的味道但是并不突出（他那些营销概念你都无视就好了），只有很仔细品尝你才能感觉出一点真正的绿茶的味道（经常喝绿茶以及绿茶饮料的人应该明白我的意思）。也许是他们发现这款茶实在是缺乏特点以至于在市场上很难有竞争力，另辟蹊径添加酵母来丰富口感。结果就是确实有了发酵茶的味道和口感，但只能说这并不是一款好的“绿茶”，过分的注重概念导致缺乏了一款定位成“精品茶”的茶饮料的基本盘（最起码他得让我觉得这就是绿茶才对吧）。&lt;&#x2F;p&gt;
&lt;p&gt;另外值得一提的是，这个茶的颜色很亮，如果摆在货架上，会很醒目，大概也是竞争手段之一。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>分享自制的Miniflux V2自定义CSS主题</title>
          <pubDate>Wed, 26 Feb 2025 04:05:30 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/my-miniflux-v2-customize-css/</link>
          <guid>https://guchengf.me/blog/my-miniflux-v2-customize-css/</guid>
          <description xml:base="https://guchengf.me/blog/my-miniflux-v2-customize-css/">&lt;p&gt;Miniflux 默认的样式文字和按钮较小，不易阅读使用，因此根据我自己的需求，结合别人的代码，写了一个自定义的 CSS 主题，分享给大家。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;yu-lan&quot;&gt;预览&lt;&#x2F;h2&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Miniflux V2自定义CSS主题&quot; height=&quot;933&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;02&#x2F;26&#x2F;1nkLzWKyNxQRBja.webp&quot;width=&quot;1304&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;dai-ma&quot;&gt;代码&lt;&#x2F;h2&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;css&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; Miniflux V2 自定义 CSS 主题 &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; MIT License &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; https:&#x2F;&#x2F;guchengf.me&#x2F;my-miniflux-v2-customize-css &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;root&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;    --primary-color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;2c3e50&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;    --bg-color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;f8f9fa&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;    --body-background&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;f8f9fa&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;    --text-color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;333333&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;    --meta-color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;666666&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;    --border-color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;e9ecef&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;    --header-bg&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;ffffff&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;    --hover-color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;d71a1b&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;    --summary-color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;6c757d&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;media&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;prefers-color-scheme&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; dark&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;    :&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;root&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;        --primary-color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;e4e4e4&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;        --bg-color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;1a1b1e&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;        --body-background&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;1a1b1e&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;        --text-color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;e4e4e4&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;        --meta-color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;888888&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;        --border-color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;2d2d2d&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;        --header-bg&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;252629&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;        --hover-color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;ff6b6b&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;        --summary-color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;9ca3af&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;body&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    margin&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    padding&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    background-color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; var&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;--bg-color&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; var&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;--text-color&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    font-family&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; -apple-system&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; BlinkMacSystemFont&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;Segoe UI&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;PingFang SC&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;Microsoft YaHei&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; sans-serif&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    max-width&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; none&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;skip-to-content-link&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    translate&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; initial&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    top&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    left&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    visibility&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; hidden&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;header&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    background-color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; var&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;--header-bg&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    border-bottom&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; solid&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; var&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;--border-color&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    position&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; fixed&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    top&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    left&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    right&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    display&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; flex&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    justify-content&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; space-between&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    align-items&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; center&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    margin&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    z-index&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 1001&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    box-shadow&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; rgba&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0.1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;header&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;nav&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    align-items&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; center&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    max-width&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 1200&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    margin&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; auto&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    padding&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 12&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 30&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;page-header&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;entry-header&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    max-width&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 900&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    margin&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 70&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; auto&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    padding&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 20&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;header&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;alert&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    margin-top&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 45&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;alert&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;page-header&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    margin-top&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 30&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;main&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    max-width&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 900&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    margin&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 20&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; auto&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    padding&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 20&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;item&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    background-color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; var&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;--header-bg&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    padding&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 16&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    margin-bottom&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 12&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    box-shadow&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; rgba&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0.1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    transition&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; transform &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt;0.2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; ease&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; box-shadow &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt;0.2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; ease&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;item-header&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    display&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; flex&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    align-items&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; center&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    border-bottom&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; solid&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; var&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;--border-color&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    padding-bottom&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    margin-bottom&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;item&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;hover&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    box-shadow&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; rgba&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0.1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;item-title&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    font-size&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 1.2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;rem&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    line-height&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 1.4&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;item-title&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; var&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;--primary-color&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    text-decoration&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; none&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    font-weight&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 600&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;item-title&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;hover&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; var&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;--hover-color&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;item-meta&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    display&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; flex&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    align-items&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; center&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    margin-top&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    gap&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 16&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    flex-wrap&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; wrap&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    font-size&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0.9&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;rem&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;item-meta&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt; ul&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    margin-top&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;item-meta-info&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    display&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; flex&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    align-items&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; center&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    gap&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 6&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; var&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;--meta-color&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    font-size&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0.9&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;rem&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;item-meta-info-title&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    text-decoration&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; none&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    padding&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    border-radius&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    transition&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; all&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0.2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; ease&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;item-meta-info-title&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;hover&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; var&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;--hover-color&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    background-color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; var&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;--border-color&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;item-meta-info&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt; li&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;not&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;last-child&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;after&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    content&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; none&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;item-meta-icons&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    display&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; flex&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    gap&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    margin-left&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; auto&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;item-meta-icons&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt; li&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    margin&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;item-meta-icons&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt; li&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;is&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt; button&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    cursor&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; pointer&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    transition&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; all&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0.2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; ease&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    padding&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    border-radius&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    background-color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; var&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;--bg-color&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    margin-left&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    font-size&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0.9&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;rem&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; inherit&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;item-meta-icons&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt; li&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;is&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt; button&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;hover&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; var&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;--hover-color&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    background-color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; var&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;--border-color&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;item-meta-icons&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;li&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    display&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; block&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;item-meta-icons-star&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;has&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;button&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;data-value&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;star&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; var&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;--hover-color&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;media&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;max-width&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 768&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;header&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;nav&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;        padding&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 10&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 15&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;page-header&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;    #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;main&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;        padding&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 15&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;item&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;        padding&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 14&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;        margin-bottom&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 10&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;item-title&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;        font-size&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 1.1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;rem&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;page-header&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;entry-header&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;        margin-top&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 60&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;header&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;alert&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;        margin-top&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 35&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;media&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;max-width&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 480&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;header&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;nav&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;        padding&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 12&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;page-header&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;    #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;main&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;        padding&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 10&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;item&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;        padding&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 12&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;        margin-bottom&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;item-title&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;        flex-wrap&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; wrap&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;        gap&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 12&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;item-meta-icons&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;        width&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 100&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;%&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;        margin-left&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;item-meta-icons&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt; li&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;is&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt; button&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;        flex&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;        justify-content&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; center&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;item-meta-info&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;li&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;        padding&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 4&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;article-link&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;        font-size&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0.85&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;rem&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;page-header&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;entry-header&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;        margin-top&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 55&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;header&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;alert&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;        margin-top&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 30&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;px&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</description>
      </item>
      <item>
          <title>饮料评测：Suntory 三得利乌龙茶（无糖）</title>
          <pubDate>Tue, 18 Feb 2025 08:35:50 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/review-suntory-oolong-tea-sugar-free/</link>
          <guid>https://guchengf.me/blog/review-suntory-oolong-tea-sugar-free/</guid>
          <description xml:base="https://guchengf.me/blog/review-suntory-oolong-tea-sugar-free/">&lt;p&gt;最后评测于 2025年2月18日。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Suntory 三得利乌龙茶（无糖）&quot; height=&quot;600&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;02&#x2F;18&#x2F;XnT5xjMrPmfi7sC.webp&quot;width=&quot;600&quot;  loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;Suntory 三得利乌龙茶（无糖）&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;评分（10分制）：&lt;strong&gt;8&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;简评：你想要的乌龙茶的样子它都有。&lt;&#x2F;p&gt;
&lt;p&gt;有个有趣的现象是，三得利的这款无糖乌龙茶在日本基本是各种店里的标配，他们不会使用现泡的乌龙茶，而是直接使用这款乌龙茶，加热或者冰镇之后提供给客人。在国内也有不少店铺是这样做的，尤其是日料店。&lt;&#x2F;p&gt;
&lt;p&gt;这款乌龙茶大概是很多人心中乌龙茶的标准，味道、口感甚至色泽。我觉得相比其他同类的预制乌龙茶，三得利这款乌龙茶的研发方向就是：只突出乌龙茶的特点。&lt;&#x2F;p&gt;
&lt;p&gt;乌龙茶的特点是什么？清香带一点甜。三得利的这个乌龙茶就是这个感觉，或者说只有这个感觉。事实上这个乌龙茶里面缺少了其他一些茶应该有的东西，但是这不重要，作为一款茶饮料，只突出特点是对的。乌龙茶的特点使得它作为任何餐食的配茶都是合适的，我也非常喜欢在吃饭的时候喝这款乌龙茶。&lt;&#x2F;p&gt;
&lt;p&gt;对于三得利的这款无糖乌龙茶，应该抱着这样一种心态：想喝乌龙茶，喝了这款，乌龙茶的味道（清香、甜）都有了。基于这个事实，8 分是非常合适的。&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;三得利乌龙茶还有带糖的，但我想你看完我的评测应该可以领悟到了，加了糖那就不是乌龙茶的样子了，所以带糖的系列不值一提。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>cgit 中 repo 的 idle 时间问题</title>
          <pubDate>Tue, 18 Feb 2025 08:11:47 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/idle-of-repo-in-cgit/</link>
          <guid>https://guchengf.me/blog/idle-of-repo-in-cgit/</guid>
          <description xml:base="https://guchengf.me/blog/idle-of-repo-in-cgit/">&lt;p&gt;idle 是 cgit 中用来展示 repo 上一次更新的距今时间的。有些时候会出现 idle 不正确或者不展示的情况。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;cgit-shi-ru-he-ji-suan-idle-de&quot;&gt;cgit 是如何计算 idle 的&lt;&#x2F;h2&gt;
&lt;p&gt;cgit 中 repo 的 idle 是通过以下这个逻辑计算的&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;zx2c4&#x2F;cgit&#x2F;blob&#x2F;09d24d7cd0b7e85633f2f43808b12871bb209d69&#x2F;ui-repolist.c#L35&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;zx2c4&#x2F;cgit&#x2F;blob&#x2F;09d24d7cd0b7e85633f2f43808b12871bb209d69&#x2F;ui-repolist.c#L35&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;首先尝试获取 repo 对应的 modify time（修改时间）：&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;如果在 repo 设置中直接定义了 mtime，那就会取这个值&lt;&#x2F;li&gt;
&lt;li&gt;如果 repo 定义了 agefile，就会读取 agefile 的 mtime&lt;&#x2F;li&gt;
&lt;li&gt;尝试读取 refs&#x2F;heads&#x2F;defbranch (defbranch 没有设置的话，默认是 master)&lt;&#x2F;li&gt;
&lt;li&gt;尝试读取 packed-refs 的 mtime&lt;&#x2F;li&gt;
&lt;li&gt;以上都不存在会返回 0（idle 为空）&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;然后根据 repo 的 modify time 计算相对当前时间的 idle。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;jie-jue-cgit-wu-fa-zheng-que-ji-suan-idle-de-wen-ti&quot;&gt;解决 cgit 无法正确计算 idle 的问题&lt;&#x2F;h2&gt;
&lt;p&gt;如果你的 repo 因为各种原因导致 cgit 无法正确计算 idle 的话，可以利用 cgit 会尝试读取 refs&#x2F;heads&#x2F;defbranch(master) 和 packed-refs 的逻辑，按照如下方法解决&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ru-guo-ni-de-repo-de-mo-ren-fen-zhi-shi-master&quot;&gt;如果你的 repo 的默认分支是 master&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;如果 refs&#x2F;heads&#x2F;master 不存在，就先创建这个文件，内容是 master 分支最后一次提交的 commit id&lt;&#x2F;li&gt;
&lt;li&gt;设置这个文件的 mtime 为最后一次提交的 commit time（可以使用&lt;code&gt;git log -1 --format=%ct master&lt;&#x2F;code&gt;获取)。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;后续等你更新 master ref head 之后，idle 就能正确按照默认逻辑计算了。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ru-guo-ni-de-repo-de-mo-ren-fen-zhi-bu-shi-master&quot;&gt;如果你的 repo 的默认分支不是 master&lt;&#x2F;h3&gt;
&lt;p&gt;由于 cgit 只会尝试读取 defbranch 或者 master 的 ref head mtime，假如你的默认分支不是 master，那么你就只能设置 defbranch 了，这样操作比较麻烦，也可以通过另一种方式临时解决。&lt;&#x2F;p&gt;
&lt;p&gt;那就是给你的 repo 的 packed-refs 设置最后一次 commit 的 commit time，这样同样可以让 cgit 正确计算出 idle。后续等你更新 ref head 之后，idle 就能正确按照默认逻辑计算了。&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;idle 计算错误一般出现在你是刚刚迁移到 cgit 的时候，虽然影响并不大，但是为了能正确展示每个 repo 的更新时间，还是有必要做一下修复的。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>饮料评测：UCC 职人咖啡无糖黑标 900ml</title>
          <pubDate>Thu, 13 Feb 2025 06:11:13 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/review-ucc-shokunin-no-coffee-sugar-free-black-900ml/</link>
          <guid>https://guchengf.me/blog/review-ucc-shokunin-no-coffee-sugar-free-black-900ml/</guid>
          <description xml:base="https://guchengf.me/blog/review-ucc-shokunin-no-coffee-sugar-free-black-900ml/">&lt;p&gt;最后评测于 2025年2月13日。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;UCC 职人咖啡无糖黑标&quot; height=&quot;900&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;02&#x2F;13&#x2F;eMG5DiJNqpA39H4.webp&quot;width=&quot;900&quot;  loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;UCC 职人咖啡无糖黑标&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;评分（10分制）：&lt;strong&gt;9&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;UCC 职人咖啡无糖黑标是我心目中最好的即饮黑咖啡。我认为这款咖啡可能是即饮黑咖啡的极致，醇厚的日式烹煮黑咖啡口感，除了日式咖啡常见的烘焙、微苦口感，还有轻微的果酸味，让咖啡的整体口感更佳完整、饱满，可以说是很完美。&lt;&#x2F;p&gt;
&lt;p&gt;事实上，我喝过的很多咖啡店用意式浓缩咖啡做的美式咖啡，都不如 UCC 这款即饮黑咖啡。原因可能有很多：不合适做黑咖啡的拼配豆、不合适的萃取方式（我觉得用浓缩做美式是不能完全还原传统滴滤美式的口感的）等。职人黑咖啡可能在这些方面会更佳接近于传统的滴滤美式或者日式烹煮咖啡。&lt;&#x2F;p&gt;
&lt;p&gt;总体来说，这是一款适合日常饮用的黑咖啡，你几乎找不到能够比它更优秀的即饮黑咖啡，并且我认为它完全可以替代普通咖啡店做出来的各类黑咖啡、美式咖啡，我给它很高的评价，如果你对黑咖啡感兴趣，可以尝试一下，绝对不会失望。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>饮料评测：GEORGIA 乔尼亚 THE BLACK 咖啡 500ml</title>
          <pubDate>Wed, 12 Feb 2025 08:51:29 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/review-georgia-the-black-coffee-500ml/</link>
          <guid>https://guchengf.me/blog/review-georgia-the-black-coffee-500ml/</guid>
          <description xml:base="https://guchengf.me/blog/review-georgia-the-black-coffee-500ml/">&lt;p&gt;最后评测于 2025年2月12日。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;GEORGIA 乔尼亚 THE BLACK 咖啡&quot; height=&quot;940&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;02&#x2F;12&#x2F;XeDOI8VuB1QK4cl.webp&quot;width=&quot;734&quot;  loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;GEORGIA 乔尼亚 THE BLACK 咖啡&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;评分（10分制）：&lt;strong&gt;5&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;GEORGIA 乔尼亚，也叫乔雅，是可口可乐在日本的咖啡品牌，据说是日本最畅销的罐装咖啡品牌。&lt;&#x2F;p&gt;
&lt;p&gt;口感基本符合常见的日式烘焙咖啡口感，但是是属于酸味比较明显的咖啡。&lt;strong&gt;含有食用香料&lt;&#x2F;strong&gt;。日本的罐装咖啡很多都含有食用香精，让我不得不怀疑所谓的日式烘焙咖啡口感完全来自于香精。&lt;&#x2F;p&gt;
&lt;p&gt;总体来说，不能评价它为好喝，缺点在于入口大约2-3秒后那种怪异的很突兀的酸苦感，不知道是否是刻意为之。作为喜欢偏苦和中深烘焙类型的咖啡的人，这款咖啡并不适合我的喜好。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>饮料评测：SANGARIA 三佳利皇冠黑咖啡</title>
          <pubDate>Wed, 12 Feb 2025 05:19:43 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/sangaria-crown-coffee-260ml/</link>
          <guid>https://guchengf.me/blog/sangaria-crown-coffee-260ml/</guid>
          <description xml:base="https://guchengf.me/blog/sangaria-crown-coffee-260ml/">&lt;p&gt;最后评测于 2025年2月12日。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;SANGARIA 三佳利皇冠黑咖啡&quot; height=&quot;600&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;02&#x2F;12&#x2F;i1qlMaPVexRwpbv.webp&quot;width=&quot;600&quot;  loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;SANGARIA 三佳利皇冠黑咖啡&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;评分（10分制）：&lt;strong&gt;6&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;属于日本人喜爱的铁皮罐头咖啡。我觉得日式咖啡最大的特点就是烘焙的味道非常重，同时基本都属于是苦味大于酸味的，因为我本人更偏爱苦味的咖啡，所以日式咖啡都比较符合我的口味。&lt;&#x2F;p&gt;
&lt;p&gt;三佳利的这款皇冠咖啡，在同类的日式铁皮罐头咖啡中，苦味算是轻的，突出烘焙的味道，其他则没有太特殊的，在同类产品中应该算是比较淡的咖啡。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>RSS-it：用Bun开发一个RSS生成工具（一）</title>
          <pubDate>Thu, 06 Feb 2025 03:35:05 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/use-bun-to-create-a-rss-generator-part-1/</link>
          <guid>https://guchengf.me/blog/use-bun-to-create-a-rss-generator-part-1/</guid>
          <description xml:base="https://guchengf.me/blog/use-bun-to-create-a-rss-generator-part-1/">&lt;p&gt;我使用的一些特殊性质的网站不提供任何更新订阅功能，从他们的网页内容中生成 RSS 应该是比较好的解决方案。&lt;&#x2F;p&gt;
&lt;p&gt;很多传统行业的网站虽然会发布一些内容，但是功能贫弱，甚至没有更新通知的功能，通常都是悄无声息的就发布了新内容。而通常这类网站的发布频率又比较低，因此从网页上生成 RSS 来订阅似乎是个不错的选择。从网页内容生成 RSS 其实已经是一个很成熟常见的操作，也有很多的相关工具，我咋研究了一些之后，发现他们大多有一些使用数量限制，考虑到我的需求可能会逐渐增长，再加上我访问的页面有些奇怪的情况，自己开发一个定制化的 RSS 生成工具是比较合适的选择。因此 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;gucheen&#x2F;rss-it&quot;&gt;RSS-it&lt;&#x2F;a&gt; 诞生了。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;wei-shen-me-xuan-ze-bun&quot;&gt;为什么选择 Bun&lt;&#x2F;h2&gt;
&lt;p&gt;最直接的原因是：all in one。&lt;&#x2F;p&gt;
&lt;p&gt;我对于 bun 的理解，它其实和 node、deno 并非完全一种东西，它提供了极高的 node 兼容性，在此基础上又额外实现了 all in one 开发能力。all in one 可以说是一把双刃剑，但在我将一些个人项目迁移到 Bun 或者使用 Bun 重构之后，我觉得至少在小型的个人项目这个方向上，Bun 的 all in one 能力解决了很多问题，提高了开发效率和维护性。all in one 也就意味着很多的能力都由 Bun 直接提供，不需要思考选哪个框架、库，又不用担心这些三方代码的维护问题，稳定性也有保证，突出一个简单高效。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ying-yong-she-ji&quot;&gt;应用设计&lt;&#x2F;h2&gt;
&lt;p&gt;应用的基本功能：&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;获取网页内容&lt;&#x2F;li&gt;
&lt;li&gt;提取关键信息&lt;&#x2F;li&gt;
&lt;li&gt;生成 RSS&lt;&#x2F;li&gt;
&lt;li&gt;通过接口输出 RSS&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;huo-qu-wang-ye-nei-rong-yi-ji-ti-qu-guan-jian-xin-xi&quot;&gt;获取网页内容以及提取关键信息&lt;&#x2F;h3&gt;
&lt;p&gt;由于目标网页目前都是静态页面类型，内容可以直接从 HTML 中获取。Bun 内置了按照 Web 标准实现的 fetch 功能，用 fetch 来做一些基本的网络请求是非常方便的。&lt;&#x2F;p&gt;
&lt;p&gt;CSS 选择器毫无疑问是我们这个场景下最合适的目标定位方式，无论网页结构是什么样子的，通过 CSS 选择器总能准去定位到他。同时 CSS 选择器的扩展能力强，即使网页后续发生变化，在不改变应用逻辑的情况下，通过调整 CSS 选择器，就能应对变化。&lt;&#x2F;p&gt;
&lt;p&gt;这个应用不需要完整的网页渲染，因此选择了 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;taoqf&#x2F;node-html-parser&quot;&gt;Fast HTML Parser&lt;&#x2F;a&gt; 这个库来做 HTML 解析提取，这个库实现了基础的 HTML 解析以及 HTML 节点操作，包括了关键的 querySelector，使得我们可以直接使用 CSS 选择器来选择节点，并且也可以通过 textContent 来获取节点内容。Bun 声明对 node 的完整兼容，因此 node 的库拿来直接用一般是没有问题的。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;sheng-cheng-rss&quot;&gt;生成 RSS&lt;&#x2F;h3&gt;
&lt;p&gt;使用 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jpmonette&#x2F;feed&quot;&gt;feed&lt;&#x2F;a&gt; 这个库来生成 RSS 内容，我选择的是 RSS 2.0 的标准，关于 RSS 和 atom 的区别，这里就不展开了，现在常见的 feed（RSS）应用，应该都是同时支持两者的，对于我们这个应用的场景，二者是没有太大差异的，我更习惯于 RSS，因此选择了 RSS 2.0 的标准。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;tong-guo-jie-kou-shu-chu-rss&quot;&gt;通过接口输出 RSS&lt;&#x2F;h3&gt;
&lt;p&gt;Bun 内置的 serve 方法应对我们这个单一的接口场景绰绰有余。原生支持 async，并且内置了 Response 实现，返回数据流和文件内容都非常方便。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;dui-yu-bun-de-yi-xie-xiang-fa&quot;&gt;对于 Bun 的一些想法&lt;&#x2F;h2&gt;
&lt;p&gt;结合上面写到的这些内容，可以看出，Bun 在 all in one 方面很重要的一个点就是实现了大量 Web api，能在服务端中使用 Web api 来开发对于一个以浏览器环境为主的 Web 前端开发来说是很有吸引力的。又或者说，对于一个网页（服务端）应用来说，使用 Web api 来开发的适配性天生就更高。&lt;&#x2F;p&gt;
&lt;p&gt;另外，Bun 在兼容 node 的基础上，额外内置了一些 api，这 api 最大的特点就是简化。如 Bun.file、Bun.write 的设计，在常见的文件操作场景，我觉得比 node 的 fs 模块更加简洁高效。能够用简洁的 api 来完成大部分代码逻辑，对于开发者来说会非常友好，这意味着我们不需要引入 &lt;strong&gt;improved&lt;&#x2F;strong&gt; 类型的库来解决语言、运行环境原生 api 难用、低效的问题（这在 node 中是非常常见的）。&lt;&#x2F;p&gt;
&lt;p&gt;low-leveled 的 api 设计可能也是一把双刃剑，如果不能做好功能性和易用性的平衡，开发时会非常痛苦。而 Bun 选择了易用性，也许是一个很好的选择，Bun 内置的 api 以高效、易用为目标，这些 api 能解决大部分需求即可。当真的需要扩展和功能性的时候，我们还可以使用兼容的 node api。&lt;&#x2F;p&gt;
&lt;p&gt;本篇介绍了 RSS-it 的创建背景和基础设计思路，并且也介绍了选择 Bun 的原因和它相对于 node 的特点。后续我会基于代码来详细介绍 Bun 的更多特点。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>宜兴一日游</title>
          <pubDate>Wed, 05 Feb 2025 01:39:59 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/2025-01-30-travel-to-yixing/</link>
          <guid>https://guchengf.me/blog/2025-01-30-travel-to-yixing/</guid>
          <description xml:base="https://guchengf.me/blog/2025-01-30-travel-to-yixing/">&lt;p&gt;新年在家缺乏运动，因此去宜兴玩了一天。&lt;&#x2F;p&gt;
&lt;p&gt;我去过两次宜兴，第一次是小学时候春游，去参观了几个溶洞。第二次是大学同学结婚去参加了婚礼。在我的印象中，宜兴比较著名的有溶洞、紫砂壶、国家森林公园等。由于沈海等多条高速在苏州附近的段落都在维护改建，无法通行，出行难度高了很多，路上的时间比预计的多了不少，好在顺利抵达宜兴。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;宜兴·善卷洞瀑布&quot; height=&quot;3413&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;02&#x2F;05&#x2F;MFGYkqC8cSDLOZU.webp&quot;width=&quot;2560&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;我们的第一站是善卷洞。我小学春游时应该是来过善卷洞的，我对洞内的某些景点还有印象。过了这么多年以后，洞内的布景有了比较大的变化，得益于技术的发展，现在洞内可以使用更加先进的灯光、投影、装饰来提高游玩体验。&lt;&#x2F;p&gt;
&lt;p&gt;我觉得善卷洞内比较有意思的景点有两个：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;善卷洞中，中洞凉快，上洞暖和，中洞和上洞之间的通道分为两条，分别名为“冬暖”“夏凉”，按照成语的顺序走“冬暖”从中洞到上洞，感受到温度的上升，然后再走“夏凉”回到中洞，感受到温度的下降，成语用得很贴切。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;下洞有一个瀑布和一条地下河。瀑布应当是天然的，只是通过人工增强了水流，适合拍照。乘坐小船通过地下河出洞穴。摆渡人说去年刚刚将摆渡船升级成了电动的，以前还需要人工划船。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;溶洞在太湖平原算是比较少见和特色的景色，宜兴溶洞名声在外，善卷洞又是其中最著名的，总体来说是值得一去的。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;宜兴·竹海·太湖第一源&quot; height=&quot;1920&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;02&#x2F;05&#x2F;b1SKgTHn3uOltws.webp&quot;width=&quot;2560&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;我们的第二站是宜兴竹海。宜兴的森林资源很多，除了著名的国家森林公园，竹海也比较有名。另外竹海中还藏着另一个景点“太湖之源”，也就是太湖的源头。&lt;&#x2F;p&gt;
&lt;p&gt;从景区入口一路向上，中间会经过著名的“镜湖”，太阳光线照射在湖面反射过来，确实像一面镜子一般，取名很贴切。继续向上就能看到大片竹林，无长时间阳光照射的竹子都是青绿色，阳光照射比较充足的竹子呈现黄绿色。竹海中可以看到两块石碑，分别是“太湖之源”“太湖第一源”，我也是第一次知道这里是太湖的源头。由于近两个月都没有下雨，这里的溪流都枯竭了，无法看到真正的源头水，想来太湖此时的水位应该也很低。&lt;&#x2F;p&gt;
&lt;p&gt;游览道路的尽头是海底，意为“竹海之底”，也就是说竹海到头了，接下去是爬山路，由于时间已晚，我们就在这里打卡后返回。&lt;&#x2F;p&gt;
&lt;p&gt;除了两个景点，我们还在附近的农家乐中吃了午饭，尝到了著名的乌米饭，一种黑色的糯米饭，拌白糖食用，适合喜好甜食的人。另外炒野笋也很好吃，大概在竹海附近有很多优质的竹笋。&lt;&#x2F;p&gt;
&lt;p&gt;一天游玩下来，感觉宜兴是一个非常好的短期旅游的地方，接触自然总是好的。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>动物园半日游</title>
          <pubDate>Tue, 21 Jan 2025 08:08:30 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/2025-01-20-half-day-in-shanghai-zoo/</link>
          <guid>https://guchengf.me/blog/2025-01-20-half-day-in-shanghai-zoo/</guid>
          <description xml:base="https://guchengf.me/blog/2025-01-20-half-day-in-shanghai-zoo/">&lt;p&gt;公司提前开始春节假期，难得工作日有时间外出，因此全家一起去了动物园。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;2025-1-20·上海动物园·鸵鸟&quot; height=&quot;1000&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;01&#x2F;21&#x2F;yjprJSBOCnT3g9L.webp&quot;width=&quot;1500&quot;  loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;鸵鸟&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;我们去的是上海动物园，相对于野生动物园，自然面积和动物数量都不值一提。不过对于我们来说，上海动物园比较近，逛起来也没有那么累，是日常休闲的好地方。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;2025-1-20·上海动物园·鸳鸯&quot; height=&quot;2250&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;01&#x2F;21&#x2F;R8opWEQqNrmgVzC.webp&quot;width=&quot;1500&quot;  loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;鸳鸯&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;上海动物园给人的第一感觉就是佛系，从动物园到工作人员到动物都是这样，没有付费投喂、动物表演，但是有科普讲解。这里就像是大家记忆中童年的那个动物园一样。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;2025-1-20·上海动物园·孔雀&quot; height=&quot;2250&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;01&#x2F;21&#x2F;vWw5g3bsM8ezhOu.webp&quot;width=&quot;1500&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;由于园区比较小，因此每个动物的区域都很紧凑，和动物们的接触距离其实挺近的。其中鸟区的进入式鸟园是打鸟爱好者的福地，这类有各种鸟类，并且开放式空间有更好的拍摄机位。&lt;&#x2F;p&gt;
&lt;p&gt;动物园里的很多动物都懒洋洋的，一看就吃得很饱，也和这里没有付费投喂有关，工作人员都会用心把动物们投喂好。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;2025-1-20·上海动物园·阿拉伯狒狒&quot; height=&quot;2250&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;01&#x2F;21&#x2F;zdXjLU1nhTvP7Cr.webp&quot;width=&quot;1500&quot;  loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;阿拉伯狒狒&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;成年之后我逛动物园的次数越来越少了，如果有人询问动物园我也会优先推荐野生动物园。但我觉得放松休闲的话，上海动物园的感受会更好一些。&lt;&#x2F;p&gt;
&lt;p&gt;动物园可能是每个人童年的美好记忆之一，相比静态的景观，活的动物显然印象更加深刻。看到动物们悠闲的样子，自己也会觉得身心放松。&lt;&#x2F;p&gt;
&lt;p&gt;照片全部用尼康 Z63 + 腾龙 50-400mm f&#x2F;4.5-6.3 拍摄。这个镜头是著名的动物园快乐头，能应付动物园的一切拍摄需求。&lt;&#x2F;p&gt;
&lt;p&gt;更多的照片可以到 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;picwall.guchengf.me&#x2F;&quot;&gt;https:&#x2F;&#x2F;picwall.guchengf.me&#x2F;&lt;&#x2F;a&gt; 浏览&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>年初整理浏览器书签</title>
          <pubDate>Tue, 07 Jan 2025 03:31:58 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/2025-01-07-reorganize-all-bookmarks-in-chrome/</link>
          <guid>https://guchengf.me/blog/2025-01-07-reorganize-all-bookmarks-in-chrome/</guid>
          <description xml:base="https://guchengf.me/blog/2025-01-07-reorganize-all-bookmarks-in-chrome/">&lt;p&gt;趁着新年到来，对浏览器（Google Chrome）中的书签做了一次整理。&lt;&#x2F;p&gt;
&lt;p&gt;根据不同的问题，采用不同的处理方式&lt;&#x2F;p&gt;
&lt;h3 id=&quot;yi-chu-suo-you-wu-fa-fang-wen-de-shu-qian&quot;&gt;移除所有无法访问的书签&lt;&#x2F;h3&gt;
&lt;p&gt;维持网站运转是一件很困难、成本很高的事情（尤其是对于个人网站维护者来说），因此我的书签中相当一部分已经无法访问，消失在了时间中。考虑过是否通过 Web Archive 一类的服务，转为保存他们的快照页面，但是事实上这类本身不再被维护的内容，后续能够提供有价值信息的概率极低，因此放弃了这个想法。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;fang-wen-pin-lu-di-de-shu-qian-gai-wei-bao-cun-dao-dan-du-de-shu-qian-fu-wu-zhong&quot;&gt;访问频率低的书签改为保存到单独的书签服务中&lt;&#x2F;h3&gt;
&lt;p&gt;我自己有一个用 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;sissbruecker&#x2F;linkding&#x2F;&quot;&gt;Linkding&lt;&#x2F;a&gt; 搭建的书签服务，将访问频率低的书签保存到这种独立书签服务中显然更为合理，一方面简化了浏览器书签，另一方面，Linkding 这样的服务可以对书签添加额外的信息，方便管理和查找，万一要用到这些极少访问的书签，查找起来也更方便。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;you-zhi-bo-ke-zi-xun-lei-wang-ye-de-shu-qian-gai-wei-rss-ding-yue&quot;&gt;优质博客、资讯类网页的书签改为 RSS 订阅&lt;&#x2F;h3&gt;
&lt;p&gt;是的，在很长时间之后，我又开始使用 RSS，RSS 是那种很纯粹的订阅体验，对于优质的博客、资讯网站，RSS 能提供很好的阅读体验，也免去了定期重复访问的操作。能够第一时间阅读到优质内容，是一件很快乐的事情。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;dui-suo-you-liu-lan-qi-shu-qian-zhong-xin-fen-lei-zheng-li&quot;&gt;对所有浏览器书签重新分类整理&lt;&#x2F;h3&gt;
&lt;p&gt;当一个书签被放在不合理的文件夹内，找起来就不太方便。因此根据我自己的习惯，重新整理了书签文件夹结构，确保文件夹都只有一层，然后分为购物、视频、娱乐、软件资源、工具、个人网站、工作相关、生活相关、日常浏览的网站、信息类等。&lt;&#x2F;p&gt;
&lt;p&gt;这样当要使用一个书签的时候，会更加方便。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hou-xu-you-hua&quot;&gt;后续优化&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;yong-linkding-zhi-jie-ti-dai-liu-lan-qi-shu-qian&quot;&gt;用 Linkding 直接替代浏览器书签？&lt;&#x2F;h3&gt;
&lt;p&gt;Linkding 的使用效率并不低，配合关键字、标签搜索，查找某个书签也很方便，但是对我来说依然难以替代浏览器书签，这更多地是一个使用习惯的问题。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;shi-yong-liu-lan-qi-biao-qian-zu-guan-li-chang-yong-wang-ye&quot;&gt;使用浏览器标签组管理常用网页&lt;&#x2F;h3&gt;
&lt;p&gt;将经常访问的页面使用浏览器标签组功能分好组，每次通过分组就可以直接打开所有页面，也能快速隐藏，得益于软硬件的发展，同时存在大量的标签页似乎没什么负面影响，这样可以有效降低标签页的使用频率。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;duan-she-chi&quot;&gt;断舍离&lt;&#x2F;h3&gt;
&lt;p&gt;浏览器书签的整理也遵从断舍离的理念，那些不会用到的书签，就干脆一点删除吧。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>2024年我买了哪些物品</title>
          <pubDate>Sun, 29 Dec 2024 04:10:09 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/what-i-bought-in-2024/</link>
          <guid>https://guchengf.me/blog/what-i-bought-in-2024/</guid>
          <description xml:base="https://guchengf.me/blog/what-i-bought-in-2024/">&lt;p&gt;除了传统的年终总结，购物清单分享也是必不可少的。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ni-kang-nikon-z6iii&quot;&gt;尼康 Nikon Z6III&lt;&#x2F;h2&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Nikon Z6III&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2024&#x2F;12&#x2F;29&#x2F;cGLka2M74dleoDX.webp&quot;width=&quot;700&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;年度好物的奖项颁给尼康 Z6III。最好的评语也许是我在 Reddit 看到的一个评论：“是一台完美的享受摄影乐趣的相机”。&lt;&#x2F;p&gt;
&lt;p&gt;尼康也许是相机三大日厂里面唯一一个还在坚持用心造好机器的，即使 Z6III 发布时的定价并不那么完美，但是就这台机器而言，毫无疑问担得起“享受摄影乐趣的机器”这个评价。没有因为这是一台中端机或者和 Z8 有直接竞争而偷工减料、缩减功能，给到了一个摄影爱好者需要的所有功能。我用它替代 Z8 作为日常使用的机器，毕竟Z8太大太笨重了。当我不需要 4500 万像素的时候，这就是一台完美的机器。&lt;&#x2F;p&gt;
&lt;p&gt;不需要过多的评价：这一台完美的享受摄影乐趣的相机。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;li-guang-ricoh-gr-iii&quot;&gt;理光 Ricoh GR III&lt;&#x2F;h2&gt;
&lt;figure&gt;
  &lt;img alt=&quot;Ricoh GR III&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2024&#x2F;12&#x2F;29&#x2F;iKzxvghWy1wl2FD.webp&quot;width=&quot;483&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;理光 GR III 并不是我买的，但是我也在用，GR3 不是新产品了，但依旧是我认为的目前最好的日常相机，可以放在任何包裹内，甚至放在口袋里，随时拿出来使用。&lt;&#x2F;p&gt;
&lt;p&gt;在“Pocketable”的定位下，优秀的画质、防抖、直出效果，如果从口袋里的日常拍照相机这个角度来说，确实没有竞争对手。我个人更喜欢 28mm 的焦段，因此买的是原版 III，同时也不需要 HDF 滤镜。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;chong-wu-chui-shui-ji&quot;&gt;宠物吹水机&lt;&#x2F;h2&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2024&#x2F;12&#x2F;29&#x2F;p6xJ3AuSIk7tToy.webp&quot;width=&quot;350&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;家里的狗狗“如意”的毛比较长，每次洗完澡吹干都比较费事，年初买了一个吹水机，效果比较好。相比使用普通吹风机吹干，这类吹水机的优点有几个：&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;功率更大，风量更大，温度控制更精细，吹干效率高。&lt;&#x2F;li&gt;
&lt;li&gt;有专用的出风口，比如类似梳子一样的出风口，可以在吹干的同时梳理狗狗的毛发，并且能够深入到毛发内部吹干，提高效率。&lt;&#x2F;li&gt;
&lt;li&gt;独立机器，只需要拿着出风口，操作更灵活。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;chong-wu-xing-jun-chuang&quot;&gt;宠物行军床&lt;&#x2F;h2&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2024&#x2F;12&#x2F;29&#x2F;i9MOwL8dF5E6jmX.webp&quot;width=&quot;800&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;简易支架配合弹力网孔面料组成的宠物行军床。行军床通过离地架空解决了两个问题：&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;江浙沪地区梅雨季地面返潮&lt;&#x2F;li&gt;
&lt;li&gt;冬天大理石地面很冷，导致狗窝温度大量散失，无法保暖&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;毫无疑问，狗狗很喜欢这个床，从放置第一天起，它在室内无事可做的时间基本就自觉躺在上面，我妈还会根据季节和温度在上面铺上各种垫子毯子，应该是很舒适。另外有一点点弹力的面料，显然也是狗狗比较喜欢的，它在上面活动的时候，会有一点反馈感。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;qi-che-you-xian-carplay-zhuan-wu-xian-gong-ju&quot;&gt;汽车有线 Carplay 转无线工具&lt;&#x2F;h2&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2024&#x2F;12&#x2F;29&#x2F;fl3wRSyOYq1mEx7.webp&quot;width=&quot;474&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;老婆的汽车只有有线 Carplay，每次使用需要插线比较不方便，因此买了这个小工具。通过转换，基本上可以实现和原车无线 Carplay 相同的效果。连接比较稳定，没有遇到过断连的情况，延迟也不明显。唯一的缺点可能是偶尔会出现开机之后无法连接的情况，这种情况只要重启车机就可以。物有所值。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;shi-wang-mao-fa-li-he-pharma-21-lu-se&quot;&gt;狮王毛发力 和 PHARMA 21 绿色&lt;&#x2F;h2&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2024&#x2F;12&#x2F;29&#x2F;nBQuTjka4A3CNXe.webp&quot;width=&quot;800&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2024&#x2F;12&#x2F;29&#x2F;PqjAYO2UcwWQlC5.webp&quot;width=&quot;1179&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;这两款洗发水是意外发现的，交替使用之后，解决了头发刚洗完干、过一段时间油的问题，推荐。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;peak-design-everyday-sling-6l&quot;&gt;Peak Design EveryDay Sling 6L&lt;&#x2F;h2&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2024&#x2F;12&#x2F;29&#x2F;SLgHVu2snNPQfFb.webp&quot;width=&quot;897&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;好用的日常相机包，6L 的款式可以容纳一些大一点的变焦镜头。特点是拉链顺滑、表面材质耐磨耐刮、支撑保护效果好。另外比较特别的背挎设计实际使用过程中背负性和灵活性都比较出色。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;li-er-kang-pu-qing-tian-ran-zao-ye&quot;&gt;利尔康葡清天然皂液&lt;&#x2F;h2&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2024&#x2F;12&#x2F;29&#x2F;YgfRz7dTZ8Lbkuy.webp&quot;width=&quot;1500&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;别人推荐的洗手液，纯天然植物提取，是医用级别（可做手术第一次洗手），性价比很高，现在是家里的日常洗手液。使用感受：&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;洗得很干净&lt;&#x2F;li&gt;
&lt;li&gt;洗完没有那种奇怪的很滑的感觉，也没有很干燥的感觉&lt;&#x2F;li&gt;
&lt;li&gt;气味很淡不刺鼻&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;ai-pu-sheng-epson-ef-15b-tou-ying-yi&quot;&gt;爱普生 Epson EF-15B 投影仪&lt;&#x2F;h2&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2024&#x2F;12&#x2F;29&#x2F;DGVPKkYghIm6QF1.webp&quot;width=&quot;650&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;在家实现看电影自由，参考了网上各种横向对比购买的，据说是同价位实际性能最好的。亮度高、色彩还原好，自带的音响也能够满足大部分使用场景，也没有虚假宣传，1080P就是1080P。如果要说缺点，那就是操作系统实在是有点差（性能差、功能差），好在我们只把它当做纯粹的投影仪用。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;pen-wu-qi&quot;&gt;喷雾器&lt;&#x2F;h2&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2024&#x2F;12&#x2F;29&#x2F;liFKtVhy4ZuIs5f.webp&quot;width=&quot;454&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;为了方便我妈给家里的果树、花草打药，购买了这个喷雾器，5L的容量足够家用，加压操作简单，带底座的分离式设计，使用时只需要拿着杆子，让我妈也可以轻松使用。额外选配了铜制伸缩杆和喷头。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;realforce-r2-pfu-limited-edition-ivory-jing-dian-rong-jian-pan&quot;&gt;Realforce R2 PFU limited edition Ivory 静电容键盘&lt;&#x2F;h2&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2024&#x2F;12&#x2F;29&#x2F;f9wJYEv4uTrnKti.webp&quot;width=&quot;1100&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;家人送的键盘，键盘是程序员的生产力工具，投资生产力工具自然是值得的。如果说高端机械键盘已经从小众走向大众，那么高端静电容键盘可能是变得更小众了。我特别喜欢静电容键盘的手感，近些年主力使用的编程键盘也一直是静电容键盘。现在来说，买静电容键盘尤其是 Realforce 的静电容键盘多少有点智商税的意思，尤其是 PFU 还有额外溢价。不过家人说的：喜欢就好。抛开价格因素，这当然是一把属于程序员的完美的键盘。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;clarks-qi-le-tilden-cap-niu-jin-xie&quot;&gt;Clarks 其乐 Tilden Cap 牛津鞋&lt;&#x2F;h2&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2024&#x2F;12&#x2F;29&#x2F;4sW8l3uDQNHkdoV.webp&quot;width=&quot;1179&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;我一直比较喜欢其乐的鞋子，因为他家做工、舒适度、造型很均衡，价格也合适，这次特地购买了黑色皮鞋，依旧很满意，出色的完成了婚纱照、婚礼的任务。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;zong-jie&quot;&gt;总结&lt;&#x2F;h2&gt;
&lt;p&gt;2024年的购物总结列出了更多实用为主的物品，经济环境变差的情况下，流行起消费降级，大家更加关注物品的性价比、实用性，因此我的分享也更多地关注物品地这些方面，希望能够给大家提供更好的参考。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>2024年年终总结</title>
          <pubDate>Thu, 26 Dec 2024 07:16:58 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/2024-summary/</link>
          <guid>https://guchengf.me/blog/2024-summary/</guid>
          <description xml:base="https://guchengf.me/blog/2024-summary/">&lt;p&gt;为了避免年终总结再度拖延，今年提前开始作年终总结。根据看到的别人写的年终总结，简单进行一下优化，首先是按照时间线简单列举每个月比较重要的事情，然后是总结。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;1yue&quot;&gt;1月&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;2023年的最后一天在湖州龙之梦太湖古镇跨年，看到了壮观的烟花，体验了滑雪。&lt;&#x2F;li&gt;
&lt;li&gt;由于我妈不在，和我爸两个人经历了最忙乱的一次春节前的阶段。祭祖、烧香、大扫除、去四川前的各种准备，由于雪灾，又临时改为飞机到成都。事实证明，我妈还是家里的顶梁柱。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;2yue&quot;&gt;2月&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;在四川外婆家度过了春节。外婆家所在的西昌是个很适合过冬的城市，气候温暖，阳光充足，生活很舒服。&lt;&#x2F;li&gt;
&lt;li&gt;沿途在成都、乐山、峨眉山旅游了一次，并且走了峨眉山的小众登山路线：大佛禅院——报国寺——伏虎寺——雷音寺——纯阳殿——圣水禅院——中峰寺——经广福寺——清音阁，可惜时间不充裕，不然可以继续向上。成都好吃好玩，有熊猫看，乐山有大佛和跷脚牛肉、钵钵鸡，峨眉山是天下名山。是一次很难的旅游体验。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;3yue&quot;&gt;3月&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;结婚摆上日程，趁着上海举办婚博会，赶紧去了解和预定。在婚博会上定下了婚礼的绝大部分事项：婚礼当日全套、婚纱照、伴手礼、喜糖。&lt;&#x2F;li&gt;
&lt;li&gt;在3月底去婚礼服务门店定下了日期、场地和流程。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;4yue&quot;&gt;4月&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;去无锡旅游了一次，去了灵山大佛、拈花湾和惠山古镇。&lt;&#x2F;li&gt;
&lt;li&gt;经历了年内第一次大裁员。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;5yue&quot;&gt;5月&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;去三亚旅游了一次。从看海这个角度来说，三亚在国内首屈一指，经历过旅游相关服务整治之后，宰客现象也不复存在，花费正常，体验很好。我们住在海棠湾，去了南山（南海观音）、大小洞天、亚龙湾、后海、蜈支洲岛，吃到了各色海鲜。还逛了免税城，并且在这里买了结婚戒指、婚鞋，相比上海同样的门店，节省了可观的费用。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;6yue&quot;&gt;6月&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;这个月拍完了婚纱照，外景选择了嘉兴九龙山，工作人员都很好，最终婚纱照拍得很好，得到了大家的一致好评。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;7yue-8yue&quot;&gt;7月～8月&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;天气炎热，周末都在忙着准备婚礼。&lt;&#x2F;li&gt;
&lt;li&gt;8月搬到了龙柏居住。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;9yue&quot;&gt;9月&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;完成了人生大事：结婚。感谢所有人，一次非常快乐与感动的婚礼。&lt;&#x2F;li&gt;
&lt;li&gt;经历了一次少见的台风。2024年13号台风“贝碧嘉”直击上海、苏州，从来没见过这么大的台风，造成了重大破坏。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;10yue&quot;&gt;10月&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;全家一起爬了虞山。&lt;&#x2F;li&gt;
&lt;li&gt;看了张学友的“60+”演唱会，完成了一个心愿。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;11yue&quot;&gt;11月&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;沿海高速开始扩建，对出行造成了重大影响，开始更多地选择高铁出行。&lt;&#x2F;li&gt;
&lt;li&gt;经历了年内第二次大裁员。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;12yue&quot;&gt;12月&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;公司神奇的调休政策导致12月少了很多完整的周末，大部分时候只能在家休息了。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;zong-jie&quot;&gt;总结&lt;&#x2F;h2&gt;
&lt;p&gt;2024年充满了平凡与不平凡，我完成了结婚这件人生大事。&lt;&#x2F;p&gt;
&lt;p&gt;工作方面，经历了两次大的裁员，公司所从事的行业在走下坡路，大家也意识到公司同样再走下坡路，两次裁员之后，让人感到意外的是，很多公司同事突然放弃内卷，开始平衡工作与生活，我觉得是好事。在意识到这些事情之后，我也感觉的自己应该更专注于自己的职业发展，寄希望于夕阳产业焕发新春似乎不太可靠。&lt;&#x2F;p&gt;
&lt;p&gt;生活上，由于新购入了尼康 Z6III 和理光 GR3，拍到了不少满意的照片，我将它们放在 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;picwall.guchengf.me&quot;&gt;https:&#x2F;&#x2F;picwall.guchengf.me&lt;&#x2F;a&gt; 上分享。家里的狗狗“如意”又长大了一岁，变得更加听话懂事，狗是人类最好的伙伴。&lt;&#x2F;p&gt;
&lt;p&gt;希望2025年各方面都会更好。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>2024年11月23日天平山赏枫</title>
          <pubDate>Thu, 19 Dec 2024 05:43:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/2024-12-19-2024-11-23-tianpingshan/</link>
          <guid>https://guchengf.me/blog/2024-12-19-2024-11-23-tianpingshan/</guid>
          <description xml:base="https://guchengf.me/blog/2024-12-19-2024-11-23-tianpingshan/">&lt;figure&gt;
  &lt;img alt=&quot;2024-11-23-苏州-天平山&quot; height=&quot;1440&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2025&#x2F;03&#x2F;14&#x2F;WMoFVpKJx4ABtc1.webp&quot;width=&quot;960&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;深秋是赏枫的季节，得知苏州天平山是赏枫的好地方，并且最近也一直看到相关的宣传介绍，就在周末前往一探。&lt;&#x2F;p&gt;
&lt;p&gt;出名的地方通常人都很多，天平山也不例外，从外围到入口停车场堵了半个小时，在停车场绕了好一大圈侥幸找到了一个车位。&lt;&#x2F;p&gt;
&lt;p&gt;入口检票处便是人山人海，一抬头便能看到山顶已经占满了人，人头攒动，从来没见过这么多爬山的人。&lt;&#x2F;p&gt;
&lt;p&gt;11月底这里的枫叶大部分已经变红，只是还不是最红的那种，景色还是相当不错的。游客们都举着各种拍照设备拍照。&lt;&#x2F;p&gt;
&lt;p&gt;红枫看起来确实有一种奇妙的氛围，难怪大家都爱看。现在社交媒体上也都是赏枫的游记。&lt;&#x2F;p&gt;
&lt;p&gt;相比山脚，山上却是枫树不多，也没有变红，想来与不同高度的日照、气温都有关系。&lt;&#x2F;p&gt;
&lt;p&gt;整个景区感觉还是不错的，没有太多商业元素，枫叶也确实很好看，都是自然景观。&lt;&#x2F;p&gt;
&lt;p&gt;拿着相机一顿猛拍，收获了不少照片。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>近期菜谱回顾</title>
          <pubDate>Sat, 30 Nov 2024 18:15:57 +0800</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/2024-11-30-recent-recipe-review/</link>
          <guid>https://guchengf.me/blog/2024-11-30-recent-recipe-review/</guid>
          <description xml:base="https://guchengf.me/blog/2024-11-30-recent-recipe-review/">&lt;p&gt;盘点一下最近做过的比较有特色的菜。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;gong-bao-ji-ding&quot;&gt;宫保鸡丁&lt;&#x2F;h2&gt;
&lt;p&gt;看似复杂，实际做起来简单，主要时间是腌制，咸酸甜口味，使用鸡腿肉会更嫩。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;xia-ren-chao-dan&quot;&gt;虾仁炒蛋&lt;&#x2F;h2&gt;
&lt;p&gt;大量消耗鸡蛋的菜谱，可以紧急挽救即将过期的鸡蛋，使用小虾仁更滑嫩，使用大虾仁吃起来更爽快，调味比较关键，很容易做得寡淡无味。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ri-shi-shao-niu-rou-fan&quot;&gt;日式烧牛肉饭&lt;&#x2F;h2&gt;
&lt;p&gt;真正意义上的懒人菜，使用预制日式牛肉汁（浓缩型，兑水），洋葱切丝，肥牛切段（或者直接使用冷冻肥牛卷），炖煮一段时间即可。容易入味，很配米饭。&lt;&#x2F;p&gt;
&lt;p&gt;预制的东西不等于有害或者不好的，重点在于预制菜品的食品安全管理。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;tang-cu-li-ji&quot;&gt;糖醋里脊&lt;&#x2F;h2&gt;
&lt;p&gt;并非懒人菜或者快手菜，里脊肉需要腌制裹粉，裹粉操作对新手比较难。油炸过程是另一个坎，初炸、复炸的火候都不好掌握，很容易炸枯、炸焦。但是如果能掌握技巧，这会是一道很下饭的菜。我喜欢再放一些番茄酱。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;tuo-si-qia-na-san-wen-yu&quot;&gt;托斯卡纳三文鱼&lt;&#x2F;h2&gt;
&lt;p&gt;特色是使用淡奶油浸煮，使用白葡萄酒和黑胡椒调味，配菜是小番茄、菠菜。掌握好火候的话，很简单的一道菜，只是配菜准备稍显麻烦。&lt;&#x2F;p&gt;
&lt;p&gt;很浓的意大利风味，淡奶油打底，没有吃过的人很可能不习惯，首次制作可以少放一些淡奶油。小番茄和菠菜作为配菜不管是色、香、味还是营养都很好。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>2024年11月第三周鸟类摄影记录</title>
          <pubDate>Sat, 16 Nov 2024 11:14:37 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/2024-11-week-3-bird-photography/</link>
          <guid>https://guchengf.me/blog/2024-11-week-3-bird-photography/</guid>
          <description xml:base="https://guchengf.me/blog/2024-11-week-3-bird-photography/">&lt;p&gt;本周去江边拍摄了一些鸟类照片，分享一下。&lt;&#x2F;p&gt;
&lt;p&gt;设备： Nikon Z6III + 50-400mm F&#x2F;4.5-6.3 DI III VC VXD&lt;&#x2F;p&gt;
&lt;p&gt;地点： 上海·浦东新区·前滩公园&lt;&#x2F;p&gt;
&lt;p&gt;400mm 的焦距拍摄江边的鸟类还是有点吃力，Z6III只有2400万像素，裁切之后比较模糊&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2024&#x2F;11&#x2F;16&#x2F;YGgkupI1PScAUvy.webp&quot;width=&quot;817&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2024&#x2F;11&#x2F;16&#x2F;Px4qU1G5ywIilkj.webp&quot;width=&quot;722&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2024&#x2F;11&#x2F;16&#x2F;d3Hlr7RPL4hBj6Q.webp&quot;width=&quot;1134&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2024&#x2F;11&#x2F;16&#x2F;kbc9qyZnAvhFeVN.webp&quot;width=&quot;1399&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2024&#x2F;11&#x2F;16&#x2F;r1tovQ8Rl3OCx65.webp&quot;width=&quot;1500&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
</description>
      </item>
      <item>
          <title>2024年8月19日满月</title>
          <pubDate>Mon, 19 Aug 2024 22:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/2024-08-19-full-moon/</link>
          <guid>https://guchengf.me/blog/2024-08-19-full-moon/</guid>
          <description xml:base="https://guchengf.me/blog/2024-08-19-full-moon/">&lt;p&gt;第一次用相机长焦拍摄满月，满足感很强&lt;&#x2F;p&gt;
&lt;p&gt;但愿人长久，千里共婵娟&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2024&#x2F;08&#x2F;20&#x2F;pXkycwKH84JED9V.jpg&quot; alt=&quot;2024年8月19日满月&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Windows 上 Electron 无法获取下载目录</title>
          <pubDate>Fri, 12 Jul 2024 14:12:53 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/electron-failed-to-get-downloads-path-on-windows/</link>
          <guid>https://guchengf.me/blog/electron-failed-to-get-downloads-path-on-windows/</guid>
          <description xml:base="https://guchengf.me/blog/electron-failed-to-get-downloads-path-on-windows/">&lt;p&gt;使用 Electron 开发桌面应用的时候，通常我们会使用 &lt;code&gt;app.getPath()&lt;&#x2F;code&gt; 来获取一些常见的文件夹路径，比如下载目录。&lt;&#x2F;p&gt;
&lt;p&gt;但是我们偶尔会接到一些反馈，说我们无法正确获取到下载目录，也是就是 &lt;code&gt;app.getPath(&#x27;downloads&#x27;)&lt;&#x2F;code&gt; 出错，会返回一个错误信息&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Failed to get &amp;#39;download&amp;#39; path&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;一直以来我们也只是接到反馈，没有能够明白为什么会出错，直到昨天我在某个机器上碰到了有人修改了下载目录的路径，然后对应的磁盘移除之后，Electron 又抛出了这个错误，
我才意识到这个错误的根本原因。&lt;&#x2F;p&gt;
&lt;p&gt;猜测应该是 Electron 读取注册表内下载目录路径之后，会对这个文件夹做一下检查，然后因为这个路径已经不可读写，所以就抛出了错误。目前 Electron 开发团队对相关 bug 并没有做直接回应，也没计划修复，因此我们只能自己在应用内做一下保护。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;typescript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;getDownloadPath&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;string&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;  try&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;getPath&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;downloads&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; catch&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;error&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;    console&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;error&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;Failed to get &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;\&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;download&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;\&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; path&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; error&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;    const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; userInfo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; os&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;userInfo&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; path&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;join&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;      userInfo&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;homedir&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;      &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;Downloads&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;相关 issue:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;electron&#x2F;electron&#x2F;issues&#x2F;19273&quot;&gt;https:&#x2F;&#x2F;www.reddit.com&#x2F;r&#x2F;MicrosoftTeams&#x2F;comments&#x2F;ng42jp&#x2F;failed_to_get_download_path&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;electron&#x2F;electron&#x2F;issues&#x2F;19273&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;electron&#x2F;electron&#x2F;issues&#x2F;19273&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>2024 元旦</title>
          <pubDate>Tue, 02 Jan 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/2024-new-years-day/</link>
          <guid>https://guchengf.me/blog/2024-new-years-day/</guid>
          <description xml:base="https://guchengf.me/blog/2024-new-years-day/">&lt;p&gt;2024 到来了，时间过得飞快，转眼已经毕业十年了。&lt;&#x2F;p&gt;
&lt;p&gt;今年第一次完成了公历的跨年，看了烟火，看了马戏，滑了雪。&lt;&#x2F;p&gt;
&lt;p&gt;希望 2024 年更好&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;湖州-太湖龙之梦-烟火-12·31&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2024&#x2F;01&#x2F;04&#x2F;nbioueTLHP8z1Yk.webp&quot;width=&quot;1500&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;figure&gt;
  &lt;img alt=&quot;&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2024&#x2F;01&#x2F;04&#x2F;MTDnGp6bySqWldP.webp&quot;width=&quot;1500&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
</description>
      </item>
      <item>
          <title>2023-12-17</title>
          <pubDate>Sun, 17 Dec 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/2023-12-17/</link>
          <guid>https://guchengf.me/blog/2023-12-17/</guid>
          <description xml:base="https://guchengf.me/blog/2023-12-17/">&lt;p&gt;五线小县城平淡而悠闲的一天&lt;&#x2F;p&gt;
&lt;p&gt;&lt;figure&gt;
  &lt;img alt=&quot;2023-12-17·2&quot; height=&quot;2667&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2023&#x2F;12&#x2F;18&#x2F;KFydQr6qbL7AHxN.webp&quot;width=&quot;2000&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;

&lt;figure&gt;
  &lt;img alt=&quot;2023-12-17·1&quot; height=&quot;2667&quot; src=&quot;https:&#x2F;&#x2F;cdn.sa.net&#x2F;2023&#x2F;12&#x2F;18&#x2F;JGwdRUVfvhqg4Tu.webp&quot;width=&quot;2000&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>umi中使用 sass 的相关问题</title>
          <pubDate>Tue, 26 Sep 2023 02:48:50 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/sass-related-problems-in-umi/</link>
          <guid>https://guchengf.me/blog/sass-related-problems-in-umi/</guid>
          <description xml:base="https://guchengf.me/blog/sass-related-problems-in-umi/">&lt;p&gt;umi 中默认的 CSS 预处理器是 less，less 比 sass 有太多优势，至少完全由 JS 实现就领先了很多。现在 sass 虽然有了 dart 的实现，但是依然存在跨平台问题，只是解决了以前 node-sass 的平台编译问题。&lt;&#x2F;p&gt;
&lt;p&gt;不过，在我们实际项目开发中，有太多 sass 编写的代码，这些代码因为各种各样的原因无法迁移到 less，也无法预编译，就不得不在 umi 中引入 sass 构建功能。&lt;&#x2F;p&gt;
&lt;p&gt;umi 一直以来文档就不完善，第三方支持就更差了，sass 配置遇到的问题只能自己想办法解决。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;dart-sass-he-node-sass-de-wen-ti&quot;&gt;dart-sass 和 node-sass 的问题&lt;&#x2F;h2&gt;
&lt;p&gt;首先安装 &lt;code&gt;@umijs&#x2F;plugin-sass&lt;&#x2F;code&gt; 开启基本的 sass 支持。这个插件默认使用的 dart-sass，dart-sass 和 node-sass 之间的问题就不赘述了，直接使用新版的 dart-sass 大概率是不能兼容比较早版本的 sass 的语法和配置的。&lt;&#x2F;p&gt;
&lt;p&gt;这样的话我们就需要切换到 node-sass 的编译工具，首先安装 node-sass，注意 node-sass 和 sass-loader 的版本对应。通过设置 plugin-sass 切换编译使用的库&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#657B83, #B392F0);&quot;&gt;  sass&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#657B83, #B392F0);&quot;&gt;    implementation&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;node-sass&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;quan-ju-bian-liang-de-wen-ti&quot;&gt;全局变量的问题&lt;&#x2F;h2&gt;
&lt;p&gt;除了要换编译用的库，sass 还不可避免的会遇到&lt;strong&gt;全局变量的问题&lt;&#x2F;strong&gt;，原来我们使用 sass 的 additionalData 或者 sass-resource-loader 来引入全局的 sass 代码，这两种我在 umi 的 plugin-sass 中测试都不能正常工作，看了一下插件的源码，发现它有一个 &lt;code&gt;prependData&lt;&#x2F;code&gt; 的参数，看起来似乎就是和 addtionalData 功能差不多。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#657B83, #B392F0);&quot;&gt;  sass&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#657B83, #B392F0);&quot;&gt;    implementation&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;node-sass&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#657B83, #B392F0);&quot;&gt;    prependData&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; `&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;    @import &amp;#39;~&#x2F;node_modules&#x2F;my-package&#x2F;src&#x2F;styles&#x2F;themes.scss&amp;#39;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;`&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;启动 umi 之后，sass 文件的处理都正常了。&lt;&#x2F;p&gt;
&lt;p&gt;这也暴露了 umi 的一个问题，作为国内使用的很多的前端框架，社区和生态支持有点差，很多问题无法得到有效的解决，可能新项目使用会更好一些。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>在 Docker 镜像构建阶段设置用户来避免文件权限问题</title>
          <pubDate>Fri, 01 Sep 2023 06:00:28 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/set-user-while-building-docker-image-to-avoid-file-permission-problems/</link>
          <guid>https://guchengf.me/blog/set-user-while-building-docker-image-to-avoid-file-permission-problems/</guid>
          <description xml:base="https://guchengf.me/blog/set-user-while-building-docker-image-to-avoid-file-permission-problems/">&lt;p&gt;在我的所有个人应用都使用 Docker 来构建及部署之后，我的服务器管理确实方便了不少，不过也遇到了一个问题，就是文件权限的管理。&lt;&#x2F;p&gt;
&lt;p&gt;一般我是用的基础 Docker 镜像的默认用户都是 root，这就导致在这个基础镜像上构建的 Docker 镜像，运行的时候生成的文件都是属于 container 的 root 用户的，当我在宿主机希望访问这些文件的时候，通常会有权限问题。&lt;&#x2F;p&gt;
&lt;p&gt;之前我都只能通过切换权限来操作这些文件，时间久了感觉非常不方便，就希望寻找一种更加简单的权限处理方法。基于我的使用场景来考虑，我需要额外对文件进行操作的 Docker 容器，都是我自己构建的镜像，因此我是可以直接控制镜像的，不会增加额外的成本（如果我是使用别人提供的最终镜像，那么如果要改镜像成本就会比较高）。&lt;&#x2F;p&gt;
&lt;p&gt;因此从构建流程下手，会是一个比较好的选择。&lt;&#x2F;p&gt;
&lt;p&gt;那么我的目标就是，镜像中的用户和宿主机运行 Docker 容器的用户保持一致。Docker 提供了设置镜像当前用户的命令 &lt;code&gt;USER&lt;&#x2F;code&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;那么我们基本的思路就是，在基础镜像中创建一个用户和分组，它们的 id 就是当前宿主机的 Docker 用户和分组，这样容器创建的文件在通过 volume 挂在到宿主机的时候，应用的用户分组也就是我期望的。&lt;&#x2F;p&gt;
&lt;p&gt;通过 Node 的镜像来举例&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;docker&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; syntax=docker&#x2F;dockerfile:1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;FROM&lt;&#x2F;span&gt;&lt;span&gt; node:lts&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 传入宿主机 USER 和 GROUP 的 id&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;ARG&lt;&#x2F;span&gt;&lt;span&gt; USER_ID&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;ARG&lt;&#x2F;span&gt;&lt;span&gt; GROUP_ID&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 创建对应 id 的 USER 和 GROUP，这里名字不重要，只要 id 一致就可以&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;RUN&lt;&#x2F;span&gt;&lt;span&gt; addgroup --gid $GROUP_ID user&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;RUN&lt;&#x2F;span&gt;&lt;span&gt; adduser --disabled-password --gecos &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt; --uid $USER_ID --gid $GROUP_ID user&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;USER&lt;&#x2F;span&gt;&lt;span&gt; user&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;ENV&lt;&#x2F;span&gt;&lt;span&gt; NODE_ENV=production&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;WORKDIR&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;home&#x2F;node&#x2F;app&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;COPY&lt;&#x2F;span&gt;&lt;span&gt; --chown=user:user [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;package.json&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;package-lock.json*&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;.&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;RUN&lt;&#x2F;span&gt;&lt;span&gt; npm install --production&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;COPY&lt;&#x2F;span&gt;&lt;span&gt; --chown=user:user . .&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;CMD&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;npm&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;start&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;这样我们在构建的时候&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;docker&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; build&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; my&#x2F;repo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;-build-arg&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; USER_ID=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;id&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; -u&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;-build-arg&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; GROUP_ID=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;id&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; -g&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; .&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;通过传入 &lt;code&gt;USER_ID&lt;&#x2F;code&gt; 和 &lt;code&gt;GROUP_ID&lt;&#x2F;code&gt;（直接使用 &lt;code&gt;id -u&lt;&#x2F;code&gt; &lt;code&gt;id -g&lt;&#x2F;code&gt; 获取），最终构建的镜像使用的用户的 id 就和宿主机保持一致。&lt;&#x2F;p&gt;
&lt;p&gt;对于这类我自己管理的镜像，使用这种方式能最有效地解决文件权限问题，也不需要改动管理流程。&lt;&#x2F;p&gt;
&lt;p&gt;另外如果你使用的是另外一个流行的基础镜像系统 &lt;code&gt;alpine&lt;&#x2F;code&gt; 的话，创建用户的命令需要修改一下&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;docker&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; alpine 的 adduser 只接受 GROUP NAME，通过 -G 参数来设置&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;RUN&lt;&#x2F;span&gt;&lt;span&gt; adduser --disabled-password --gecos &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt; --uid $USER_ID -G user user&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;现在终于可以愉快地管理容器的文件了。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>第 25 届亚洲宠物展</title>
          <pubDate>Sun, 20 Aug 2023 03:25:49 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/pet-fair-asia-2023/</link>
          <guid>https://guchengf.me/blog/pet-fair-asia-2023/</guid>
          <description xml:base="https://guchengf.me/blog/pet-fair-asia-2023/">&lt;p&gt;2023年，很多大型活动得以恢复，喜欢宠物的人期待的亚洲宠物展也恢复了，是我在炎热的夏季中最期待的一个展会。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;上海-亚洲宠物展-8·19&quot; height=&quot;4000&quot; src=&quot;https:&#x2F;&#x2F;vip2.loli.io&#x2F;2023&#x2F;08&#x2F;20&#x2F;UaCpv43zfuO21Qj.webp&quot;width=&quot;3000&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;宠物在我们生活中的角色越来越重要，物质生活越来越好的情况下，大家越来越关注自己的精神生活质量。&lt;&#x2F;p&gt;
&lt;p&gt;我自己是狗狗的忠实爱好者，家里也养了一条狗（品种大约是马尔济斯、哈瓦那之类的），是一条流浪狗，我妈在上班的单位捡到了它，就带回来收养了，如今已经3岁了，是一条有点皮但是很懂事的狗狗。&lt;&#x2F;p&gt;
&lt;p&gt;一直觉得狗狗是最忠诚的动物，不管跟着主人吃得好不好，过得好不好，它总是无条件地爱着主人。&lt;&#x2F;p&gt;
&lt;p&gt;回到宠物展的话题，这次亚宠展在浦东的上海新国际博览中心，场地非常大，参展厂商也非常多。作为近期难得的大型展会，主题又是大家喜爱的宠物，自然观众也非常多。&lt;&#x2F;p&gt;
&lt;p&gt;本次参展如果要携带宠物需要提前申报，因此家里的狗狗也就无缘来参展了，不然可以让它挑自己喜爱的东西 ：），不过现场带着宠物来的人也不少，不知道是不是现场对于申报的查验不严格。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;n1-n5-guan&quot;&gt;N1-N5 馆&lt;&#x2F;h2&gt;
&lt;p&gt;N1-N5 基本都是比较知名的宠物产品制造商，又以宠物食品为主，基本上你家宠物用的品牌在这里都能找到。来参展之前我们打算给家里的狗狗买一些吃的，但是一进场馆就看花了眼，完全不知道怎么下手，最后只能选择了一些我们比较熟知的品牌购买了一些东西。&lt;&#x2F;p&gt;
&lt;p&gt;在宠物展购买的东西并不一定会比淘宝京东等平台便宜，考虑到参展成本较高，也可以理解。不过展台上会有很多新品，同时也会赠送一些试吃，给以后购买相关产品提供更多选择参考。&lt;&#x2F;p&gt;
&lt;p&gt;很多厂商都有免费赠品活动，像我们这样11点多才到展馆的自然不用考虑参加了，几乎每个队伍都排超长，绕站台好几圈，大家都爱薅羊毛（看到有家厂商送的袋子上写的就是薅羊毛薅个够）。&lt;&#x2F;p&gt;
&lt;p&gt;购买商品之后厂商提供的购物袋也都非常有特色，不仅包含品牌宣传，还有一些和宠物相关的图案、标语，用来替代平时的购物袋也很不错。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;e1-e7-guan&quot;&gt;E1-E7 馆&lt;&#x2F;h2&gt;
&lt;p&gt;E1-E7 主要是相对小一些的展商，宠物活动举办场馆，还有一些专业的宠物产品厂商。&lt;&#x2F;p&gt;
&lt;p&gt;如果你考虑性价比的话，E1-E7 馆的厂商会更加适合你，他们的品牌没有 N 馆的大，但是产品线同样齐全，价格上更有优势。&lt;&#x2F;p&gt;
&lt;p&gt;我们在这里购买了不少狗狗零食，还第一次购买了狗狗罐头，我家狗狗从来没吃过罐头，它比较爱吃新鲜食物，这次刚好给它体验一下。&lt;&#x2F;p&gt;
&lt;p&gt;E 馆里的厂商不少都是生产厂家，他们的目标对象主要是经销商、上下游合作方之类的，因此对于面向普通顾客的参展日没有足够的经验和热情，不过有趣的是到了这一天时候，他们直接开始清仓了，因此他们的售价比同类展商要便宜不少，适合捡漏，我们买了不少宠物零食。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;e4-guan-guan-neng-mao-mi-da-sai&quot;&gt;E4 馆冠能猫咪大赛&lt;&#x2F;h2&gt;
&lt;p&gt;猫咪显然更适合参加这样子的展会，它们更适应室内封闭空间，同时更加安静。因此比较重要的活动也都是猫咪为主。这个猫咪大赛主要是对猫咪的外表、体态、性格和互动性作评价，然后回给猫咪颁发奖章。&lt;&#x2F;p&gt;
&lt;p&gt;每一只参加比赛的猫咪都各有特色，但都是我们拥有不了的高贵血统。&lt;&#x2F;p&gt;
&lt;p&gt;猫咪展区中我们最喜欢的是两只黑色缅因猫，我们说这两只猫很帅，连周围的观众也表示认可：确实很帅。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;上海-亚洲宠物展-黑色缅因猫1-8·19&quot; height=&quot;4000&quot; src=&quot;https:&#x2F;&#x2F;vip2.loli.io&#x2F;2023&#x2F;08&#x2F;20&#x2F;ydloxPjuGwO4X7M.webp&quot;width=&quot;3000&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;figure&gt;
  &lt;img alt=&quot;上海-亚洲宠物展-黑色缅因猫2-8·19&quot; height=&quot;4000&quot; src=&quot;https:&#x2F;&#x2F;vip2.loli.io&#x2F;2023&#x2F;08&#x2F;20&#x2F;ApvcaOkq1ytXnmj.webp&quot;width=&quot;3000&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;p&gt;除了帅气的缅因猫，还有其他很多猫咪。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;上海-亚洲宠物展-猫咪-8·19&quot; height=&quot;3000&quot; src=&quot;https:&#x2F;&#x2F;vip2.loli.io&#x2F;2023&#x2F;08&#x2F;20&#x2F;3L9WaoTwqxzrsjD.webp&quot;width=&quot;4000&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;guan-zhong-dai-lai-de-chong-wu&quot;&gt;观众带来的宠物&lt;&#x2F;h2&gt;
&lt;p&gt;除了参展商带来的宠物，观众也带来了很多可爱的宠物。&lt;&#x2F;p&gt;
&lt;p&gt;比如这只西高地，镜头感很差，头左摇右摇就是没看到镜头。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;上海-亚洲宠物展-西高地-8·19&quot; height=&quot;4000&quot; src=&quot;https:&#x2F;&#x2F;vip2.loli.io&#x2F;2023&#x2F;08&#x2F;20&#x2F;WRemtYvG1PaT3hH.webp&quot;width=&quot;3000&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;qi-ta-yi-xie-chong-wu&quot;&gt;其他一些宠物&lt;&#x2F;h2&gt;
&lt;p&gt;通常我们说到宠物，都是猫狗一类的，但是这次展览上，看到了更多对于我们来说不常见的宠物，比如爬虫类，爬虫类似乎越来越热门了，我们看到的购买爬虫类宠物的观众就不少，比如购买观赏蜥蜴的。另外还有蛇、兔、龟甚至狐獴、貂鼬一类的，真正意义上的长见识了。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;shou-huo&quot;&gt;收获&lt;&#x2F;h2&gt;
&lt;p&gt;参加展览收获颇丰，看到了各式各样的宠物，还买到了不少有用的宠物用品（也有捡漏领到的免费的）。&lt;&#x2F;p&gt;
&lt;p&gt;当然最最重要的还是看得很开心，没人可以拒绝可爱的动物。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;上海-亚洲宠物展-小狗-8·19&quot; height=&quot;4000&quot; src=&quot;https:&#x2F;&#x2F;vip2.loli.io&#x2F;2023&#x2F;08&#x2F;20&#x2F;JoUpC3P2nlwfO47.webp&quot;width=&quot;3000&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;figure&gt;
  &lt;img alt=&quot;上海-亚洲宠物展-金毛-8·19&quot; height=&quot;4000&quot; src=&quot;https:&#x2F;&#x2F;vip2.loli.io&#x2F;2023&#x2F;08&#x2F;20&#x2F;uPf5VgbJnI9NrOa.webp&quot;width=&quot;3000&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;figure&gt;
  &lt;img alt=&quot;上海-亚洲宠物展-陆龟-8·19&quot; height=&quot;4000&quot; src=&quot;https:&#x2F;&#x2F;vip2.loli.io&#x2F;2023&#x2F;08&#x2F;20&#x2F;7NJkuI6HFralySt.webp&quot;width=&quot;3000&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
</description>
      </item>
      <item>
          <title>umijs 架构下在 root 节点外加载外部 qiankun 微应用</title>
          <pubDate>Thu, 17 Aug 2023 08:52:01 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/load-external-qiankun-microapp-outside-umijs-root/</link>
          <guid>https://guchengf.me/blog/load-external-qiankun-microapp-outside-umijs-root/</guid>
          <description xml:base="https://guchengf.me/blog/load-external-qiankun-microapp-outside-umijs-root/">&lt;p&gt;通常来说，要在 umijs 中加载一个外部 qiankun 微应用，只需要在 &lt;code&gt;.umirc&lt;&#x2F;code&gt; 中配置好对应的 app，然后使用 umi 内置的 &lt;code&gt;MicroApp&lt;&#x2F;code&gt; 加载微应用即可。&lt;&#x2F;p&gt;
&lt;p&gt;但是我遇到一个比较特殊的场景，需要在一个 umi root 节点外的元素上加载一个微应用，这就导致无法直接使用 &lt;code&gt;MicroApp&lt;&#x2F;code&gt;，因为缺少了 umi 相关的 qiankun 环境。&lt;&#x2F;p&gt;
&lt;p&gt;针对这种情况，参考了 umi、qiankun 的官方文档，还有其他人的方案之后，决定直接使用 qiankun 的手动加载微应用的方式。&lt;&#x2F;p&gt;
&lt;p&gt;qiankun 提供了一个命令式加载微应用的方法 &lt;code&gt;loadMicroApp&lt;&#x2F;code&gt;，用在 react 组件内也比较方便，唯一的问题是，我们已经在 umi 中定义过外部微应用的相关配置了，在这里需要保持一致，因此利用 umi 的 &lt;code&gt;getMasterOptions&lt;&#x2F;code&gt; 获取当前 umi 配置，找到对应的微应用配置。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;tsx&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;import&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; React&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; useEffect&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; useRef&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;react&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;import&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; loadMicroApp&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;qiankun&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;import&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; getMasterOptions&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;umi&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;export&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; function&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; ExternalApp&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;props&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; props&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; app&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; useRef&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;any&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; containerRef&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; useRef&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #B392F0);&quot;&gt;HTMLDivElement&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; loadApp&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;    const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; masterOptions&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; getMasterOptions&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;masterOptions&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; Array&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;isArray&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;masterOptions&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;apps&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;      const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; targetApp&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; masterOptions&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;apps&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;find&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;config&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; config&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; ===&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;targetApp&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;      if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;threenets&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;        app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; loadMicroApp&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;          ...&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;targetApp&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          container&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; containerRef&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;current&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          props&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;            &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; some props&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          }&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; unload&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;current&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;      app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;current&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;unmount&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;    app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B58900, #79B8FF);&quot;&gt; null&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;  useEffect&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;    loadApp&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;      unload&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;  return&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;div&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt; ref&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #E1E4E8);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;ref&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; containerRef&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;current&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; ref&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #E1E4E8);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;div&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</description>
      </item>
      <item>
          <title>将 pinboard 的 JSON 数据转换成标准的 netscape 书签数据</title>
          <pubDate>Wed, 16 Aug 2023 07:32:22 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/convert-pinboard-json-data-to-standard-netscape-bookmarks/</link>
          <guid>https://guchengf.me/blog/convert-pinboard-json-data-to-standard-netscape-bookmarks/</guid>
          <description xml:base="https://guchengf.me/blog/convert-pinboard-json-data-to-standard-netscape-bookmarks/">&lt;p&gt;我的书签都是存放在 espial 应用上，他的导出功能只能导出兼容 pinboard 的 JSON 数据，但是大部分书签应用支持的都是标准的 netscape 书签数据，就是常见的 &lt;code&gt;.html&lt;&#x2F;code&gt; 类型的书签数据。&lt;&#x2F;p&gt;
&lt;p&gt;为了能在这这些应用上导入我的书签数据，需要将 espial 数据进行转换。&lt;&#x2F;p&gt;
&lt;p&gt;标准的 netscape 书签数据格式可以参考微软文档：&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;learn.microsoft.com&#x2F;en-us&#x2F;previous-versions&#x2F;windows&#x2F;internet-explorer&#x2F;ie-developer&#x2F;platform-apis&#x2F;aa753582(v=vs.85)&quot;&gt;https:&#x2F;&#x2F;learn.microsoft.com&#x2F;en-us&#x2F;previous-versions&#x2F;windows&#x2F;internet-explorer&#x2F;ie-developer&#x2F;platform-apis&#x2F;aa753582(v=vs.85)&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;通用数据两边基本都是有的，通过简单的脚本就可以处理&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;import&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; fs&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;fs&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; pinboard json 数据文件&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; rawFile&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;bookmarks.json&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 输出的 netscape 标准 html 文件&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; outputHTML&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;bookmarks.html&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; pinboardData&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; JSON&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;parse&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;fs&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;readFileSync&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;rawFile&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;toString&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; netscape 标准数据头部内容&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;fs&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;writeFileSync&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;outputHTML&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; `&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;lt;!DOCTYPE NETSCAPE-Bookmark-file-1&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;lt;!--This is an automatically generated file.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;It will be read and overwritten.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;Do Not Edit! --&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;lt;META HTTP-EQUIV=&amp;quot;Content-Type&amp;quot; CONTENT=&amp;quot;text&#x2F;html; charset=UTF-8&amp;quot;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;lt;Title&amp;gt;Bookmarks&amp;lt;&#x2F;Title&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;lt;H1&amp;gt;Bookmarks&amp;lt;&#x2F;H1&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;lt;DL&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;`&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;for&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; item&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; of&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; pinboardData&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 核心数据只有链接、新增时间、标签、标题、描述&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; url&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; item&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;href&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; date&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; Date&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;item&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;time&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;valueOf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; netscape 书签的日期是 unix timestamp 格式&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; tags&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; item&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;tags&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;split&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;join&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; netscape 书签标签用 , 分割&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; title&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; item&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;description&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; description&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; item&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;extended&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; dd&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; `&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;lt;DT&amp;gt;&amp;lt;A HREF=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;${&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;url&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot; ADD_DATE=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;${&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;date&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot; TAGS=&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;${&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;tags&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;${&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;title&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;lt;&#x2F;A&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;  `&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;  fs&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;appendFileSync&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;outputHTML&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; dd&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;description&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;    &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 如果原来填写了描述，补充描述数据&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;    fs&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;appendFileSync&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;outputHTML&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; `&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;lt;DD&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;${&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;description&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;`&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 输出文件&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;fs&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;appendFileSync&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;outputHTML&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;lt;&#x2F;DL&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;生成的 html 文件可以在绝大部分书签类的应用中使用。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>React 在 useEffect 时会捕获所有 state 的状态</title>
          <pubDate>Mon, 14 Aug 2023 08:45:29 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/react-capture-state-while-use-effect/</link>
          <guid>https://guchengf.me/blog/react-capture-state-while-use-effect/</guid>
          <description xml:base="https://guchengf.me/blog/react-capture-state-while-use-effect/">&lt;p&gt;在接触到 &lt;code&gt;useEffect&lt;&#x2F;code&gt; 的依赖时，很容易产生一个误解，就是 state 必须在依赖中，才能获取到正确的值，但这实际是是错误的理解。&lt;&#x2F;p&gt;
&lt;p&gt;我们需要建立一个正确的概念，就是当 &lt;code&gt;useEffect&lt;&#x2F;code&gt; 运行时，它实际上是对当前组件的所有 state 进行了一次捕获，也就意味着，在 effect 内部，所有 state 都是 effect 运行时的状态。&lt;&#x2F;p&gt;
&lt;p&gt;理解了这个概念之后，我们就可以来看实际的例子了&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; setA&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; useState&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt;b&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; setB&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; useState&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;apple&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; onChange&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;  setA&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;  setB&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;banana&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;useEffect&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;  console&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;log&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; b&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 1 banana&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;就像这里提到的，尽管我们的 &lt;code&gt;useEffect&lt;&#x2F;code&gt; 没有将 b 设置为依赖，但是在 effect 内部依然能获取到 b 的最新状态，这就是因为当这个 effect 运行时，会捕获 a, b 的状态，而不仅仅是 a，因此 b 也是改变之后的值。&lt;&#x2F;p&gt;
&lt;p&gt;这一点在某些情况下会非常有用，因为有时候我们只想在 a 改变的时候执行一些 effect，但是又希望能使用所有 state 的最新状态的值。这时候我们可以灵活的利用这个特性，尽管很多 lint 规则都会将这个情况判定为 warning。&lt;&#x2F;p&gt;
&lt;p&gt;另外还要注意一个情况，这种用法仅在对 a b 两个 state 设置在同步流程下进行的时候有效，如果是异步流程，则不能这样使用。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>嵊泗 2 日游</title>
          <pubDate>Mon, 19 Jun 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/2-days-travel-to-shengsi-2023-6-17/</link>
          <guid>https://guchengf.me/blog/2-days-travel-to-shengsi-2023-6-17/</guid>
          <description xml:base="https://guchengf.me/blog/2-days-travel-to-shengsi-2023-6-17/">&lt;p&gt;去嵊泗旅游的主要原因是想看海。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;泗礁岛-六井潭-白色灯塔-6·17&quot; height=&quot;3000&quot; src=&quot;https:&#x2F;&#x2F;vip2.loli.io&#x2F;2023&#x2F;07&#x2F;19&#x2F;i1rZEXp9kNMQTyd.webp&quot;width=&quot;4000&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;早上 7 点从上海出发
&lt;ul&gt;
&lt;li&gt;早饭比平时吃的多一些，因为上午行程非常长&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;沈家湾码头坐船到泗礁岛
&lt;ul&gt;
&lt;li&gt;沈家湾码头在洋山港的最远端，离上海市区非常远&lt;&#x2F;li&gt;
&lt;li&gt;没有买到车船票，因此坐普通客船出发&lt;&#x2F;li&gt;
&lt;li&gt;很多年没有坐船，虽然天气不好，还是有些兴奋&lt;&#x2F;li&gt;
&lt;li&gt;准备了晕车贴，但发现我们都不晕船&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;到达泗礁李柱山码头
&lt;ul&gt;
&lt;li&gt;提前租了车，工作人员把车开到码头，自助取车，非常方便&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;先到镇区吃饭
&lt;ul&gt;
&lt;li&gt;靠近码头和镇区的地方相对平坦，路面坡度比较小，租了排量比较大的车，车况还算好，可以应对&lt;&#x2F;li&gt;
&lt;li&gt;午饭在一家大众点评排名靠前的海鲜面疙瘩吃，除了招牌海鲜面疙瘩，另外点了一份花蛤&lt;&#x2F;li&gt;
&lt;li&gt;海鲜面疙瘩更接近炒制的做法，分量很足，可能是因为海鲜都很新鲜，味道也不错，价格比起上海要便宜一些&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;出发前往泗礁最著名的景点，东海五渔村
&lt;ul&gt;
&lt;li&gt;开发成旅游景点之后，渔村外围经过了装饰改造，增加了海洋、海洋生物相关的元素，很醒目&lt;&#x2F;li&gt;
&lt;li&gt;渔村内以售卖海鲜产品，经营农家乐、民宿为主，但是和其他比较大的旅游景点相比，特点是当地人的生活很大程度上保持了原状，因此海边渔村的氛围很浓&lt;&#x2F;li&gt;
&lt;li&gt;渔村旁的沙滩比较小，想要捡一些冲到沙滩上的东西，但是基本已经被清理过，没发现特别的东西&lt;&#x2F;li&gt;
&lt;li&gt;天气不好，因此没有体验特色的出海捕鱼的旅游项目，有些遗憾，在不远处的海面上可以看到渔船&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;前往下一个景点-六井潭
&lt;ul&gt;
&lt;li&gt;往岛的东部走基本都是山地，路比较窄比较曲折&lt;&#x2F;li&gt;
&lt;li&gt;六井潭最著名的应该是白色灯塔，配合海景适合拍照，可惜天气不好&lt;&#x2F;li&gt;
&lt;li&gt;看到了巨大椅子形状的石头，被称为龙椅&lt;&#x2F;li&gt;
&lt;li&gt;六井潭并没有看到，据说有六个水潭&lt;&#x2F;li&gt;
&lt;li&gt;在白色灯塔处和女朋友一起拍了不少照片&lt;&#x2F;li&gt;
&lt;li&gt;泗礁岛所处的海域泥沙量依旧非常大，因此海水并不是蓝色，更接近绿色，靠近岛屿的海水还有些浑浊，但在六井潭周围的海域能看到比较蓝的海水&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;然后前往和尚套
&lt;ul&gt;
&lt;li&gt;和尚套离六井潭并不远，事实上整个泗礁岛都不大&lt;&#x2F;li&gt;
&lt;li&gt;在前往六井潭以及和尚套的途中经过了海岸公路，天气好的时候应该非常漂亮&lt;&#x2F;li&gt;
&lt;li&gt;和尚套据说是为了纪念鉴真东渡，结合之前几次旅游经历，我们已经打卡过多个鉴真东渡的地点，非常有缘&lt;&#x2F;li&gt;
&lt;li&gt;景点内有一个观景平台，视野非常好。咖啡店内售卖一种饮料“星辰大海”，添加了蓝色糖浆，呈现海水的蓝色&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;在曲折山路上开车的时候，听到了最难忘的导航提示台词
&lt;ul&gt;
&lt;li&gt;今天走过了所有弯路，从此人生尽是坦途&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;到达住宿的地方
&lt;ul&gt;
&lt;li&gt;在住宿地方附近找了一家蒸汽小海鲜吃晚饭，套餐价格实惠，分量依旧很足&lt;&#x2F;li&gt;
&lt;li&gt;吃了人生中见过的最新鲜的黄鱼，清蒸做法，上桌时鱼身上的金黄色非常显眼，味道很好&lt;&#x2F;li&gt;
&lt;li&gt;炒土豆丝似乎是当地非常喜欢的素菜&lt;&#x2F;li&gt;
&lt;li&gt;各种海鲜非常多&lt;&#x2F;li&gt;
&lt;li&gt;岛上酒店非常少，选择了民宿，因为还没到旺季，价格相对便宜&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;经过了一天的旅行，还是有些疲惫&lt;&#x2F;li&gt;
&lt;li&gt;第二天早起前往附近的基湖沙滩
&lt;ul&gt;
&lt;li&gt;基湖沙滩是收费性质的人工沙滩，按照度假村的形式进行开发，环境、观感都比昨天东海渔村的沙滩要好不少，也更适合游玩&lt;&#x2F;li&gt;
&lt;li&gt;沙滩很大，游客也不少&lt;&#x2F;li&gt;
&lt;li&gt;在沙滩上漫步了一圈，捡到了不少海洋生物&lt;&#x2F;li&gt;
&lt;li&gt;遇到了一只搁浅的水母，非常奇特，半透明的身体&lt;&#x2F;li&gt;
&lt;li&gt;有很多海蟹，身体很小，脚很长，有点像蜘蛛&lt;&#x2F;li&gt;
&lt;li&gt;有很多贝类和螺类，但多数都已经碎了&lt;&#x2F;li&gt;
&lt;li&gt;脚踩在海水里的感觉非常舒服&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;在附近一家海鲜店吃了午饭
&lt;ul&gt;
&lt;li&gt;毫无疑问海鲜是当地特色，他们的做法相对简单，由于原材料都很新鲜，简单的做法就能最大程度提现海鲜的美味&lt;&#x2F;li&gt;
&lt;li&gt;再次吃到了炒土豆丝&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;吃完午饭在附近的商店街逛了一下，并且去渔村购买了一些特产&lt;&#x2F;li&gt;
&lt;li&gt;启程返回
&lt;ul&gt;
&lt;li&gt;准备乘坐的第一班渡轮意外被取消了，好在第二班渡轮顺利出发&lt;&#x2F;li&gt;
&lt;li&gt;和我们差不多时间返程的游客非常多，由于离岛只能通过渡轮，很多人都会担心被困在岛上无法按时返程&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;嵊泗列岛是江浙沪地区比较好的海上旅游景点，我们去的时候天气不好，影响了一些体验，但是总体还是觉得很好的。如之前所说，嵊泗列岛所在海域泥沙量依旧非常大，因此海洋并不如其他著名的海边景点好看，但是特色应该是深入海中的小海岛体验，与海南有很大区别。而且当地的海岛生活氛围非常浓，当地人的生活虽然也向着旅游业发展，但是依旧很大程度保留了原来的形态，能够感受到海岛居民的生活。&lt;&#x2F;p&gt;
&lt;p&gt;我比较喜欢靠海的地区，因此觉得嵊泗列岛是值得一去的地方。&lt;&#x2F;p&gt;
&lt;p&gt;再次分享旅程中听到的最喜欢的导航提示台词&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;今天走过了所有弯路，从此人生尽是坦途&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
</description>
      </item>
      <item>
          <title>扬州 3 日游</title>
          <pubDate>Thu, 06 Apr 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/3-days-travel-to-yangzhou-2023-4-3/</link>
          <guid>https://guchengf.me/blog/3-days-travel-to-yangzhou-2023-4-3/</guid>
          <description xml:base="https://guchengf.me/blog/3-days-travel-to-yangzhou-2023-4-3/">&lt;p&gt;烟花三月下扬州。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img alt=&quot;扬州-瘦西湖-五亭桥-4·3&quot; height=&quot;3000&quot; src=&quot;https:&#x2F;&#x2F;vip2.loli.io&#x2F;2023&#x2F;07&#x2F;19&#x2F;yOvVojT1WxXR4nA.webp&quot;width=&quot;4000&quot;  loading=&quot;lazy&quot;&gt;
  
&lt;&#x2F;figure&gt;
&lt;ul&gt;
&lt;li&gt;早上 8 点从上海出发
&lt;ul&gt;
&lt;li&gt;原本预计 11 点能到扬州，路上车流稍多，等到达扬州市区的时候已经 12 点了&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;午饭选择了扬州最著名的饭店，扬州宴
&lt;ul&gt;
&lt;li&gt;淮扬菜的名气不需要多介绍，作为国宴的标准菜式，淮扬菜应该是江苏地区最著名的菜式&lt;&#x2F;li&gt;
&lt;li&gt;淮扬菜中一定要吃的肯定是清炖狮子头&lt;&#x2F;li&gt;
&lt;li&gt;总体上觉得很不错，符合我们对淮扬菜的认知，口味也适合我们&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;前往第一个景点，大明寺
&lt;ul&gt;
&lt;li&gt;大明寺是很奇怪的一个景点，名气并不小，但是存在感有些弱，很多时候都忘了扬州还有这个景点&lt;&#x2F;li&gt;
&lt;li&gt;住宿的地方离大明寺很近，步行前往&lt;&#x2F;li&gt;
&lt;li&gt;从寺院结构来说，总体上和其他的没有太大区别，不过寺内区域很大，有一些历史人物相关的建筑&lt;&#x2F;li&gt;
&lt;li&gt;鉴真是寺内很重要的一个纪念人物，有他的事迹介绍、各种真迹，还有相关的文艺表演；扬州是鉴真六次东渡过程中一个很重要的地点&lt;&#x2F;li&gt;
&lt;li&gt;在钟楼撞了钟，在塔顶拜了佛，据说塔顶的舍利子是释迦摩尼的真迹&lt;&#x2F;li&gt;
&lt;li&gt;寺内的樱花开得很好&lt;&#x2F;li&gt;
&lt;li&gt;学到了代表过去的燃灯佛祖，代表现代的如来佛祖，以及代表未来的弥勒佛，还有其他代表健康、事业的佛祖菩萨&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;游历完大明寺，接着前往瘦西湖
&lt;ul&gt;
&lt;li&gt;瘦西湖毫无疑问是扬州最著名的景点，俗话说“晴西湖不如雨西湖，雨西湖不如夜西湖”，巧的是刚好下雨，现在雨西湖、夜西湖都看到了&lt;&#x2F;li&gt;
&lt;li&gt;景区内对夜游西湖的路线做了明确提示，跟着提示走，不用担心错过演出&lt;&#x2F;li&gt;
&lt;li&gt;瘦西湖比较特别的是，它内部景点紧凑，都很精致，与其他湖泊景点不太一样，人文景观非常丰富，配合各类演出，观感非常好&lt;&#x2F;li&gt;
&lt;li&gt;在其中一个景点等候演出的时候，路过的人剧透吐槽说“等了半个小时，来两个男的摇摇扇子走了，有什么好看的”，本来我们还不信，结果真和他说的一样，顿时感觉瘦西湖不好玩了 :)&lt;&#x2F;li&gt;
&lt;li&gt;一路上雨时下时停，也别有趣味&lt;&#x2F;li&gt;
&lt;li&gt;最后的水幕演出很有特色，介绍了扬州的历史文化&lt;&#x2F;li&gt;
&lt;li&gt;不过瘦西湖管理方似乎特别喜欢各种五彩灯光，五亭桥装了红绿色的灯光，感觉很奇怪，颜色搭配不敢认同&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;第二天本来想要早起体验扬州早茶，但是著名的茶楼都要非常早去排队，家人又起不来，就放弃了&lt;&#x2F;li&gt;
&lt;li&gt;第二天的首个景点是大运河博物馆
&lt;ul&gt;
&lt;li&gt;京杭大运河名气肯定比瘦西湖大，可惜它不算是一个景点&lt;&#x2F;li&gt;
&lt;li&gt;这天还是工作日，我们去博物馆的时间赶上早高峰，车还是比较多的，扬州其实也是一座大城市&lt;&#x2F;li&gt;
&lt;li&gt;京杭大运河历史悠久，扬州段又是其中最古老、最重要的一段，各种历史文物都保存得比较好，馆内的布置、设施比较现代化，确确实实感受到了大运河的历史价值&lt;&#x2F;li&gt;
&lt;li&gt;同时也介绍了大运河沿岸的历史文化，一起了解了扬州的历史&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;从博物馆出来，去到一家昨日出租车司机介绍的淮阳菜馆吃午饭
&lt;ul&gt;
&lt;li&gt;这家淮扬菜馆很特别，据说是某个淮扬菜传人的徒弟开的，店内还挂着师徒合影；一些很著名的淮扬菜它都没有，倒有一些家常菜，其中有一道淮扬小炒，做得非常好吃&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;下午首先去扬州一个有名的私家园林-个园
&lt;ul&gt;
&lt;li&gt;园内比较有特色的就是四季景观的布置，春夏秋冬四个区域按照季节特色设计，围绕中间主楼，足不出户就可以看到四季，很有意思&lt;&#x2F;li&gt;
&lt;li&gt;园子主人当时是扬州大户人家，因此园子后面住宅区域很大，宅院很多，顺便了解到很多扬州古代大户人家的生活&lt;&#x2F;li&gt;
&lt;li&gt;我们跟着其他旅游团队的导游，听到了很多讲解，感觉人文历史类型的景点，有没有导游讲解还是区别很大的&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;个园出来看时间还早，便去了汉广陵王墓博物馆
&lt;ul&gt;
&lt;li&gt;扬州作为历史古城，各种陵墓也不少&lt;&#x2F;li&gt;
&lt;li&gt;汉广陵王墓据说是首个被发现的采用“黄肠题凑”形式的墓葬，也算丰富了我们的见识&lt;&#x2F;li&gt;
&lt;li&gt;陵墓总是有种历史的厚重感，想到里面是 2000 年前的古人，总有种不可思议的感觉&lt;&#x2F;li&gt;
&lt;li&gt;陵墓很深，内部很冷，加上游客很少，还是有点怕的&lt;&#x2F;li&gt;
&lt;li&gt;博物馆内展示的陪葬品也很特别，平时很少能见到这个年代的物品，而且还是比较有价值的贵族物品&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;接着去了东关街
&lt;ul&gt;
&lt;li&gt;扬州的街道景点似乎是近些年才发展起来的，一定要比较的话，似乎和其他的古镇老街没什么区别&lt;&#x2F;li&gt;
&lt;li&gt;买了网红饮料，贴着扬州文字的竹筒奶茶，除去特别的包装，口味上没有特殊的&lt;&#x2F;li&gt;
&lt;li&gt;买了桂花糕，新鲜出炉，挺好吃的&lt;&#x2F;li&gt;
&lt;li&gt;买了几份黄桥烧饼，黄桥烧饼其实是扬州隔壁泰州的特产，不过距离不远，也可以说是当地特色了&lt;&#x2F;li&gt;
&lt;li&gt;东关街上的招牌写着还有不少其他老街（如皮市街），看上去都应该差不多&lt;&#x2F;li&gt;
&lt;li&gt;街的尽头是东关城门，是古代扬州城的遗迹&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;从东关城门出来已经快晚上了，刚好看到了运河码头，就去乘坐了运河景观游轮
&lt;ul&gt;
&lt;li&gt;游轮沿着运河行进，一路上看到了不少历史景点，有导游讲解，才能认出不同的地方&lt;&#x2F;li&gt;
&lt;li&gt;河上几座桥都进行了装饰，包括两岸沿河建筑，都安装了各色灯光，似乎扬州人特别喜欢五彩灯光&lt;&#x2F;li&gt;
&lt;li&gt;船上有扬州评话的表演者，是一位年轻的女性，讲了一段刘备到江东娶孙尚香的故事（著名的赔了夫人又折兵），以及一段关于厨师的笑话&lt;&#x2F;li&gt;
&lt;li&gt;扬州评话是扬州重要的文化传承，之前在扬州宴吃饭也有表演，对于这样的中国传统文化能够继续传承下去，我也感到很高兴&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;第三天我们并没有继续呆在扬州，而是去了无锡鼋头渚
&lt;ul&gt;
&lt;li&gt;早上出发赶到无锡，选了一家无锡本地菜的餐厅，结果后来发现上海也有&lt;&#x2F;li&gt;
&lt;li&gt;点了无锡特色小笼包、糖醋排骨&lt;&#x2F;li&gt;
&lt;li&gt;我对于无锡菜的印象是，“甜”，这一点似乎是共识，你在 Google 搜索无锡菜，出来的第一个结果就是“甜”。我女朋友喜欢甜口，便觉得还好，不算很甜&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;然后马不停蹄的去了鼋头渚
&lt;ul&gt;
&lt;li&gt;鼋头渚以樱花闻名，据说里面有多株日本原种&lt;&#x2F;li&gt;
&lt;li&gt;4月5号清明节的时候，实际上已经过了鼋头渚的樱花花期，我们去并没有看到很多樱花，但是游客依然非常多&lt;&#x2F;li&gt;
&lt;li&gt;鼋头渚似乎还是过去春秋时期练兵的地方，景区内也有古代战船的模型&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;鼋头渚出来便启程返回上海&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;扬州是真正意义上的历史名城，一直都说“烟花三月下扬州”，清明时节的扬州确实非常好玩。扬州最大的特色就是自然景观和人文景观都有，并且结合的非常好，能够真正体现这座城市的魅力。扬州对游客也非常友好，旅游服务到位，而且景点停车都很方便，大部分都不收费。&lt;&#x2F;p&gt;
&lt;p&gt;鼋头渚的话，还是建议在樱花花期的时候过来玩。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>2021年我学到了什么</title>
          <pubDate>Thu, 03 Feb 2022 08:41:37 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/what-gucheen-learned-in-2021/</link>
          <guid>https://guchengf.me/blog/what-gucheen-learned-in-2021/</guid>
          <description xml:base="https://guchengf.me/blog/what-gucheen-learned-in-2021/">&lt;h2 id=&quot;tuan-dui-yun-ying-he-ren-ji-guan-xi-guan-li&quot;&gt;团队运营和人际关系管理&lt;&#x2F;h2&gt;
&lt;p&gt;本来我想说是团队管理，但是后来想想这个话题太尖锐了，还是改成团队运营和人际关系管理好。今年在这块学到的最重要的事情是，&lt;strong&gt;完全通过技术化的思维来做管理并不合理&lt;&#x2F;strong&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;矛盾点在于，团队的每一个人和你做的那些“技术”、“科学”方面的事情都是不一样的，人是感性的。如果你要反驳，“不行，我就是个 100% 理性的人”，没问题，你是对的。&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img
  src=&quot;https:&#x2F;&#x2F;vip1.loli.io&#x2F;2022&#x2F;02&#x2F;03&#x2F;kZ42PYg9EW5wOUQ.jpg&quot;
  alt=&quot;&quot;
  width=&quot;400&quot;
  height=&quot;auto&quot;
&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;我学到的人际关系管理的第一点&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;控制自己的情绪&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;当人处于激动情绪时，大部分交流价值都不大，包括打了鸡血的时候。这就要提醒自己，&lt;strong&gt;当你给其他人画饼、开空头支票的时候，他们在鸡血效果下可能给了你积极的反馈，但这并不是可靠的反馈&lt;&#x2F;strong&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;那么为什么还说技术化的思维做管理并不好呢？&lt;&#x2F;p&gt;
&lt;p&gt;我相信技术是纯粹的，但是人不是，即便是亲密无间的伙伴。人心的复杂不是技术可以相比的，通过人的思维模式去管理，才是正确的方法。&lt;&#x2F;p&gt;
&lt;p&gt;技术化的管理不仅仅是指那种完全对事不对人的模式，也包括那些过于考虑人的情感的模式。这点可能和大家的认知有很大冲突。实际上过分考虑人的情况，也是技术型管理人员常见的问题，从而导致你的团队人员处于&lt;strong&gt;过分放松、绝对优势&lt;&#x2F;strong&gt;的地位，这是非常不利的。&lt;&#x2F;p&gt;
&lt;p&gt;这就是我学到第二点：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;适当的规则&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;当团队人数增加、人员变复杂时，适当的增加压力和规则设定，才是维持团队活力的有效方法。当你感受到压力与规则束缚时，就会有进步的动力。规则设置就是管理学的核心之一，自由度和条条框框的结合点。&lt;&#x2F;p&gt;
&lt;p&gt;管理学是很复杂的问题，因此，多看、多听、多问、多交流，人际沟通是管理的依赖。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;mu-biao-gui-hua-ji-li&quot;&gt;目标、规划、激励&lt;&#x2F;h2&gt;
&lt;p&gt;工作越久，越容易失去梦想。这里就又要分享我那个大学教授的故事了。他在给我们上经济学课程时，说过：“人一定要有梦想，我的梦想就是拿诺贝尔经济学奖。要是我拿了，让我明天出门被车撞死，我也没怨言了”。真正的话糙理不糙。&lt;&#x2F;p&gt;
&lt;p&gt;枯燥的工作很容易消磨了人的意志，因此一定要有目标，哪怕再小、再不起眼都可以。不过我相信绝大部分人都还是有目标的。问题可能是出在规划上。&lt;&#x2F;p&gt;
&lt;p&gt;目标规划就和程序设计一样，一定要&lt;strong&gt;可行并且行之有效&lt;&#x2F;strong&gt;，结合自己的实际情况去进行规划，明确&lt;strong&gt;怎么做、什么时候做&lt;&#x2F;strong&gt;，而不是像大部分代码里的 TODO 那样 TO NEVER DO。&lt;&#x2F;p&gt;
&lt;p&gt;然后便是激励，用游戏的常见设定来说，通常完成成就都有奖励，完成现实生活的目标也是这样，给自己激励才有更多的动力，同时在激励的过程中也能有效缓解压力和疲惫。吃喝玩乐和买买买就是很好的激励方式&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ren-ji-jiao-wang&quot;&gt;人际交往&lt;&#x2F;h2&gt;
&lt;p&gt;人际交往方面，基于多年社会经验，得出的一个比较重要的感悟就是：&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;重视自己的感受&lt;&#x2F;strong&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;很多时候，复杂的人际关系让我们不得不放弃自己的利益、感受来换取人际关系的增长。年岁增长之后，我却愈发觉得，常说的年纪越大越迁就人际关系并不能听信，无论在什么情况下，一定要重视自己的感受。&lt;&#x2F;p&gt;
&lt;p&gt;现在都说重视心理健康，因此也不亏待了自己。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>2021年阅读过的书籍推荐</title>
          <pubDate>Thu, 03 Feb 2022 07:48:37 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/what-gucheen-read-in-2021/</link>
          <guid>https://guchengf.me/blog/what-gucheen-read-in-2021/</guid>
          <description xml:base="https://guchengf.me/blog/what-gucheen-read-in-2021/">&lt;p&gt;书是人类进步的阶梯。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;1-wu-ren-dao-piao-zhao-100ri-ri-ji-kitora&quot;&gt;1. &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.amazon.co.jp&#x2F;dp&#x2F;4048969676&#x2F;&quot;&gt;無人島漂着100日日記 (KITORA)&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;figure&gt;
  &lt;img
  src=&quot;https:&#x2F;&#x2F;vip2.loli.io&#x2F;2022&#x2F;01&#x2F;20&#x2F;pEQ2AaGyPD7r9Fu.jpg&quot;
  alt=&quot;&quot;
  width=&quot;300&quot;
  height=&quot;auto&quot;
&gt;
&lt;&#x2F;figure&gt;

首先是一本漫画。2020年到2021年之间在 Twitter 上连载，推出实体书之后立刻就买了。&lt;br &#x2F;&gt;
主角为了治疗家人的疾病，远行赚钱，在海上遭遇海怪，流落无人荒岛，100天中求生逃脱的故事。&lt;br &#x2F;&gt;
这是一个信念、智慧、勇气和爱的故事。主角最后回到家和家人拥抱在一起的画面非常难忘。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2-shi-jie-di-tu-ji-di-2ban&quot;&gt;2. &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.amazon.cn&#x2F;dp&#x2F;B004OQHNB0&#x2F;&quot;&gt;世界地图集（第2版）&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;figure&gt;
  &lt;img
  src=&quot;https:&#x2F;&#x2F;vip2.loli.io&#x2F;2022&#x2F;02&#x2F;18&#x2F;JdHxvbgm4tY2BNQ.png&quot;
  alt=&quot;&quot;
  width=&quot;300&quot;
  height=&quot;auto&quot;
&gt;
&lt;&#x2F;figure&gt;

神奇的地球。&lt;br &#x2F;&gt;
我非常喜欢看地图、旅游指南，人短暂的一生实在是很难踏遍世界，但是从地图、旅游指南中，你也同样能感受到世界的美妙。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;3-everyday-data-science&quot;&gt;3. &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;andrewnc.github.io&#x2F;blog&#x2F;everyday_data_science.html&quot;&gt;Everyday Data Science&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;figure&gt;
  &lt;img
  src=&quot;https:&#x2F;&#x2F;vip1.loli.io&#x2F;2022&#x2F;02&#x2F;03&#x2F;yKwfIuMDdn18OcB.png&quot;
  alt=&quot;&quot;
  width=&quot;200&quot;
  height=&quot;auto&quot;
&gt;
&lt;&#x2F;figure&gt;

Data science is an interdisciplinary field that uses scientific methods, processes, algorithms and systems to extract knowledge and insights from noisy, structured and unstructured data, and apply knowledge and actionable insights from data across a broad range of application domains.&lt;br &#x2F;&gt;
这本书在网上评价算是褒贬不一。作者从博客中整理出了关于日常生活中的数据科学案例的相关文章，汇总成书。作者的想法是写一本专业非专业人士都可以看的书，不过从博文到书的过程中，还存在不少问题，这点评论已经提到了不少。&lt;br &#x2F;&gt;
不过我还是愿意推荐这本书。“科学”并不是大家想象中那样和日常生活完全无关的，我觉得作为一本入门级的读物，它是合格的。重点在于你是否能够将这种思路应用到日常生活中，在日常生活中实践科学是一件很有意思的事情。&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;再忙也要花时间阅读书籍，如同高尔基所说“书是人类进步的阶梯”。不过今年看了很多热销书，还有朋友圈各种高格局的书，觉得并没有太多收获，因此只推荐了我觉得有所收获的书，也感觉到，读书这种事情，重点是自己的探求方向，朋友圈 99% 的书都是不适合自己的（包括我上面推荐的）。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>2021年我买了哪些东西</title>
          <pubDate>Thu, 03 Feb 2022 06:08:37 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/what-gucheen-bought-in-2021/</link>
          <guid>https://guchengf.me/blog/what-gucheen-bought-in-2021/</guid>
          <description xml:base="https://guchengf.me/blog/what-gucheen-bought-in-2021/">&lt;p&gt;又到了年终总结的时候，我习惯于在春节期间来撰写一年的总结，毕竟对于我来说，这才是一年真正的结束。&lt;&#x2F;p&gt;
&lt;p&gt;首先是购物环节。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;LEGO 92177 瓶中船
&lt;figure&gt;
  &lt;img
  src=&quot;https:&#x2F;&#x2F;vip2.loli.io&#x2F;2022&#x2F;02&#x2F;03&#x2F;W3KdTkyn54e1NVh.jpg&quot;
  alt=&quot;&quot;
  width=&quot;300&quot;
  height=&quot;auto&quot;
&gt;
&lt;&#x2F;figure&gt;

经典复刻&lt;&#x2F;li&gt;
&lt;li&gt;Withings ScanWatch
&lt;figure&gt;
  &lt;img
  src=&quot;https:&#x2F;&#x2F;vip2.loli.io&#x2F;2022&#x2F;02&#x2F;03&#x2F;Fyi15TIsejpnEoU.jpg&quot;
  alt=&quot;&quot;
  width=&quot;200&quot;
  height=&quot;auto&quot;
&gt;
&lt;&#x2F;figure&gt;

家里人送的表，卖点是心电图和健康监测，时刻提醒自己注意身体。戴上之后大约一个多月没收到任何健康问题提醒，当下就放心了很多（某种意义上值了）。作为法国品牌，设计也不错，作为时装表或者正装表都可以。&lt;&#x2F;li&gt;
&lt;li&gt;福莱希（FLEXI）德版经典遛狗绳
&lt;figure&gt;
  &lt;img
  src=&quot;https:&#x2F;&#x2F;vip2.loli.io&#x2F;2022&#x2F;02&#x2F;03&#x2F;m2QDSKWhYEVC3oR.jpg&quot;
  alt=&quot;&quot;
  width=&quot;200&quot;
  height=&quot;auto&quot;
&gt;
&lt;&#x2F;figure&gt;

狗子拥有了更大的活动空间，整体重量很轻，收放都很顺滑。&lt;&#x2F;li&gt;
&lt;li&gt;Samsung 三星 S21 Ultra 5G
&lt;figure&gt;
  &lt;img
  src=&quot;https:&#x2F;&#x2F;vip2.loli.io&#x2F;2022&#x2F;02&#x2F;03&#x2F;yVFwbZNQ2A3arKe.jpg&quot;
  alt=&quot;&quot;
  width=&quot;200&quot;
  height=&quot;auto&quot;
&gt;
&lt;&#x2F;figure&gt;

家里的家庭套餐升级之后，已经全员畅享 5G 了，只有我的手机还不支持，趁着东哥的大额折扣加优惠券，买下了这个 S21 Ultra。&lt;br &#x2F;&gt;
我一直是 S 系列普通型号的用户，因为大屏对我价值很小，普通型号的尺寸、重量都非常适合我。但是这次 S21 只有 Ultra 才有曲面屏，于是就买了 Ultra 。&lt;br &#x2F;&gt;
你要问了，曲面屏有什么实际价值吗？“好看”就是最大的价值。如果 S21 普通型号也有曲面版本的话，我一定会买它的紫色的。&lt;&#x2F;li&gt;
&lt;li&gt;SONY WF-1000XM4 蓝牙耳机
&lt;figure&gt;
  &lt;img
  src=&quot;https:&#x2F;&#x2F;vip1.loli.io&#x2F;2022&#x2F;02&#x2F;03&#x2F;IombKGhuvWtJY6q.png&quot;
  alt=&quot;&quot;
  width=&quot;300&quot;
  height=&quot;auto&quot;
&gt;
&lt;&#x2F;figure&gt;

换新手机带来的问题，没有 3.5mm 耳机孔了，确实到了换用蓝牙耳机的时候，这个耳机是从我姐那里拿来的。&lt;br &#x2F;&gt;
索尼家的耳机各方面水平都在线，在这个价位上表现还算出色，我觉得是一个不错的选择（“耳机玩家”除外，已经被他们贬的一文不值了）。4 代佩戴舒适性有了很大提升，降噪也在平均水平以上。索尼大法好！&lt;&#x2F;li&gt;
&lt;li&gt;资生堂男士均衡护肤水
&lt;figure&gt;
  &lt;img
  src=&quot;https:&#x2F;&#x2F;vip2.loli.io&#x2F;2022&#x2F;02&#x2F;03&#x2F;utviM4XDAwdg7Zl.jpg&quot;
  alt=&quot;&quot;
  width=&quot;200&quot;
  height=&quot;auto&quot;
&gt;
&lt;&#x2F;figure&gt;

我姐今年给我换的新护肤水。我平时也是个不注重保养的男生，全靠我姐帮忙打理。我的脸部是典型的混合型肌肤，之前我姐给我换了很多种护肤品，比较繁琐。这款用起来感觉确实体现了“均衡”，干性和油性区域表现都不错，一整天下来也没有明显的不适感。&lt;&#x2F;li&gt;
&lt;li&gt;蔡司擦镜纸
&lt;figure&gt;
  &lt;img
  src=&quot;https:&#x2F;&#x2F;vip2.loli.io&#x2F;2022&#x2F;02&#x2F;03&#x2F;u2j8X3qixlWZGga.jpg&quot;
  alt=&quot;&quot;
  width=&quot;200&quot;
  height=&quot;auto&quot;
&gt;
&lt;&#x2F;figure&gt;

别人擦镜头，我擦镜片。戴眼镜还是比较麻烦的，我又不戴隐形眼镜，因此镜片需要时常清理，这款擦镜纸已经经历了几次涨价，也和疫情、国际贸易等等因素有关，但是从性价比上来说，我觉得还是可以的（相比小林制药的）。也呼吁大家保护好眼睛。&lt;&#x2F;li&gt;
&lt;li&gt;田宫四驱兄弟 跃动冲锋
&lt;figure&gt;
  &lt;img
  src=&quot;https:&#x2F;&#x2F;vip1.loli.io&#x2F;2022&#x2F;02&#x2F;03&#x2F;nVMYjLcBTzUJZPk.jpg&quot;
  alt=&quot;&quot;
  width=&quot;200&quot;
  height=&quot;auto&quot;
&gt;
&lt;&#x2F;figure&gt;

我的青春回来了&lt;&#x2F;li&gt;
&lt;li&gt;PHILIPS 飞利浦 X2HR 头戴式耳机
&lt;figure&gt;
  &lt;img
  src=&quot;https:&#x2F;&#x2F;vip2.loli.io&#x2F;2022&#x2F;02&#x2F;03&#x2F;VzyaWMAFpx1jgSk.jpg&quot;
  alt=&quot;&quot;
  width=&quot;200&quot;
  height=&quot;auto&quot;
&gt;
&lt;&#x2F;figure&gt;

9500爆款旗舰版，各大评测都很吹捧，表现出色。&lt;br &#x2F;&gt;
任意设备都可以轻松推动，我用的 MOTU M2，当场退烧，也印证了那句话，“早知道，还是原道！”（可能就是 10 万以下听个响吧）。&lt;&#x2F;li&gt;
&lt;li&gt;Q posket 美少女战士 倩妮迪公主
&lt;figure&gt;
  &lt;img
  src=&quot;https:&#x2F;&#x2F;vip2.loli.io&#x2F;2022&#x2F;02&#x2F;03&#x2F;ySn9lZUWb3tjT6z.jpg&quot;
  alt=&quot;&quot;
  width=&quot;300&quot;
  height=&quot;auto&quot;
&gt;
&lt;&#x2F;figure&gt;

童年的梦中情人，唯一可以和木之本樱相比的人。公主款无需多言。&lt;&#x2F;li&gt;
&lt;li&gt;Paris Saint-Germain x Jordan 卫衣
&lt;figure&gt;
  &lt;img
  src=&quot;https:&#x2F;&#x2F;vip2.loli.io&#x2F;2022&#x2F;02&#x2F;03&#x2F;l6YmR1FGIfu7Kxq.jpg&quot;
  alt=&quot;&quot;
  width=&quot;250&quot;
  height=&quot;auto&quot;
&gt;
&lt;&#x2F;figure&gt;

本来是庆祝 LGD 夺冠的，结果是“为什么不 BAN 猛犸”。设计很好看，就当支持梅老板了。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;回顾了一下购物历史，发现涉及挺多方面的（给家人买的东西没有放在里面，更加适合我的朋友们浏览）。&lt;&#x2F;p&gt;
&lt;p&gt;购物时降低压力和激励自己的有效方式，不要吝啬花在自己身上的钱。😊&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Electron 的 Notification 在 Windows 系统下无法正常使用的问题</title>
          <pubDate>Sat, 14 Aug 2021 08:45:29 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/electron-notification-not-work-under-windows/</link>
          <guid>https://guchengf.me/blog/electron-notification-not-work-under-windows/</guid>
          <description xml:base="https://guchengf.me/blog/electron-notification-not-work-under-windows/">&lt;p&gt;Electron 需要设置程序 appId 之后，才能正常在 Windows 下使用 Notification 功能&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;typescript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; windows 下需要设置这一项才能正常使用 Notification&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;process&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;platform&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; ===&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;win32&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;isPackaged&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;    app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;setAppUserModelId&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;My.App.Id&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; else&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;    app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;setAppUserModelId&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;process&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;execPath&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;开发环境下，可以直接设置为程序的 exe 文件路径（实际上就是当前 electron.exe 的路径）。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>对 rollup-plugin-css-only 生成的 CSS 文件添加 hash 信息</title>
          <pubDate>Thu, 11 Mar 2021 16:56:44 +0800</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/hashing-css-file-in-rollup/</link>
          <guid>https://guchengf.me/blog/hashing-css-file-in-rollup/</guid>
          <description xml:base="https://guchengf.me/blog/hashing-css-file-in-rollup/">&lt;p&gt;&lt;code&gt;rollup-plugin-css-only&lt;&#x2F;code&gt; 目前还没有支持对生成的文件名添加基于文件内容的 hash 值，而这个操作在 Web 前端中又非常的常见和必要。&lt;&#x2F;p&gt;
&lt;p&gt;因此只能采用折中的解决办法了。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;import&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; css&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;rollup-plugin-css-only&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;import&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; crypto&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;crypto&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; emitCSS&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;css&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; styles&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; bundle&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; md5&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; crypto&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;createHash&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;md5&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;update&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;css&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;digest&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;hex&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;substr&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; filename&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; `&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;bundle.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;${&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;md5&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;.css&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;`&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; bundle 中添加 css 文件信息&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;  bundle&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;filename&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span&gt; type&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;asset&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; fileName&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; filename&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; source&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; css&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;export&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; default&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  input&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;src&#x2F;main.js&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  output&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    sourcemap&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B58900, #79B8FF);&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    format&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;iife&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    name&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    entryFileNames&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; production&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; ?&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;bundle.[hash].js&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; :&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;bundle.js&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    chunkFileNames&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; production&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; ?&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;[name].[hash].js&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; :&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;[name].js&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    dir&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;build&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  plugins&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;    css&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      output&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; production&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; ?&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; emitCSS&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; :&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;bundle.css&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ]&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</description>
      </item>
      <item>
          <title>2020年我学到了什么</title>
          <pubDate>Sat, 13 Feb 2021 15:03:12 +0800</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/what-gucheen-learned-in-2020/</link>
          <guid>https://guchengf.me/blog/what-gucheen-learned-in-2020/</guid>
          <description xml:base="https://guchengf.me/blog/what-gucheen-learned-in-2020/">&lt;h2 id=&quot;ji-zhang&quot;&gt;记账&lt;&#x2F;h2&gt;
&lt;p&gt;记账确实是一件令人头疼的事情，枯燥的重复性记录工作很容易就让人放弃了。&lt;&#x2F;p&gt;
&lt;p&gt;好消息是，2020年在我姐的悉心指导下，终于第一次做到了全年账目无误，也就是说我记的账对齐了！&lt;&#x2F;p&gt;
&lt;p&gt;很多人说记账可以帮自己开源节流，其实这有些过分夸大记账对于一般人的作用了。&lt;&#x2F;p&gt;
&lt;p&gt;我觉得记账最重要的作用就是可以让你做到“心中有度”。不论是收入还是支出，你心中随时都有概念和底气。&lt;&#x2F;p&gt;
&lt;p&gt;以我自己为例，我是一位可乐爱好者（可口可乐），可口可乐的单价算不上贵，根据品类不同，单品在 2 - 10 元之间。如果你平时不留意的话，很难感受到花费在可乐上的支出。直到年前我将去年一年的可乐支出筛选出来一看总计，原来我一年要喝这么多可乐！&lt;&#x2F;p&gt;
&lt;p&gt;当然，记账也不全是让你感慨自己这一年花了这么多钱，在收入方面，也可以很好给你归纳总结，清晰地看到各种收入来源的比例，以及这一年收入上的增长，对于下一年的支出规划很有帮助。&lt;&#x2F;p&gt;
&lt;p&gt;2020年各类投资收益大涨，确实给我带来不菲的收入，从我自己的投资收益曲线也能看出 2020 年投资市场的波动。&lt;&#x2F;p&gt;
&lt;p&gt;另外还有类似于各种疏忽造成的费用支出（银行扣费服务、不常用的订阅费用支出），也可以在对账时一下子就把它揪出来，清理掉那些不需要的付费服务。（虽然银行也有各种对账单，但是我之前其实很少主动对账）。&lt;&#x2F;p&gt;
&lt;p&gt;这一年的记账经历确实给了我很多收获，真正做到了“心中有度”。&lt;&#x2F;p&gt;
&lt;p&gt;所以给大家推荐两样和记账相关的东西：&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;复式记账法&lt;&#x2F;p&gt;
&lt;p&gt;复式记账法可以让你对所有收入开销的来龙去脉都了如指掌。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;beancount&lt;&#x2F;p&gt;
&lt;p&gt;开源的基于文本的复式记账法软件。简单好用使它最大的特色，有效降低你的记账成本，提升记账体验。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;很多人选择直接将银行等提供的账单导入自己的账单，免去手动记账的过程，但是我却更喜欢手动记账，其中的区别在于，每一次你记账的时候，也是一次思考的过程，想想自己的收入能否继续提升，想想自己的支出是否可以优化。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;chu-yi&quot;&gt;厨艺&lt;&#x2F;h2&gt;
&lt;p&gt;在家基本都是我姐做饭，我给她打打下手。要说我自己做菜，拿手菜也就青椒炒肉丝之类的。&lt;&#x2F;p&gt;
&lt;p&gt;今年工作上的调整让我有了更多时间学习厨艺，在我姐和众多“大厨”的指导下，2020年厨艺有了长足的进步。自己爱吃的菜自己可以做好，也学到了很多新菜式。&lt;&#x2F;p&gt;
&lt;p&gt;能够吃到自己喜欢的食物，是一件非常能提升幸福感的事情，有效缓解自己的生活压力。加上现在教授做菜的渠道越来越多，是我非常推荐的一项技艺。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;pei-ban-jia-ren&quot;&gt;陪伴家人&lt;&#x2F;h2&gt;
&lt;p&gt;随着父母渐老，陪伴家人成为我最重视的事情。年纪越大，觉得时间过得越快，毕业这么多年一眨眼就过去了。时间对于父母来说比我更加珍贵。2020年县城通了高铁，回家更加方便，高速畅通可以选择开车回家，路况不好就可以选择高铁回家，总体时间都在1.5个小时左右。&lt;&#x2F;p&gt;
&lt;p&gt;有时候回家和家人一起吃饭，吹吹牛，就是生活中最值得高兴的事情。&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;与生活中发生的事情相比，工作上的事情显得不值一提，以至于没有太多可以分享的。&lt;&#x2F;p&gt;
&lt;p&gt;人生可以说漫长也可以说短暂，年轻的时候应该多尝试自己喜欢的事情，我不太喜欢那些过于夸大年轻人的苦难处境和贩卖焦虑的论调。&lt;&#x2F;p&gt;
&lt;p&gt;我想在这个世界上没有任何一个人是轻松的，区别在于有些人正视并跨过了它们，有些人沉溺在别人或甜或毒的鸡汤中。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;勤练带来力量&lt;&#x2F;p&gt;
&lt;p&gt;与其感慨路难行，不如马上出发&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;与大家共勉&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>2020年我买了哪些东西</title>
          <pubDate>Sat, 13 Feb 2021 14:46:23 +0800</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/what-gucheen-bought-in-2020/</link>
          <guid>https://guchengf.me/blog/what-gucheen-bought-in-2020/</guid>
          <description xml:base="https://guchengf.me/blog/what-gucheen-bought-in-2020/">&lt;p&gt;其实我很少写年终总结，不过2020年确实特别的一年，值得记录。&lt;&#x2F;p&gt;
&lt;p&gt;参照我经常阅读的一些人的年终总结方式，感觉将内容分类记述是比较好的方式，不显得冗余也不容易写成流水账。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2020nian-wo-mai-liao-xie-shen-me&quot;&gt;2020年我买了些什么&lt;&#x2F;h2&gt;
&lt;p&gt;首先是大家最喜爱的购物环节，虽然疫情对经济有些影响，但是也不能忘了对生活的追求。（以下物品排名不分先后）&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;乐高 75892 迈凯轮塞纳 和 75551 小黄人&lt;&#x2F;p&gt;
&lt;p&gt;&lt;figure&gt;
  &lt;img
  src=&quot;https:&#x2F;&#x2F;vip2.loli.io&#x2F;2022&#x2F;02&#x2F;03&#x2F;6CW5ALc3PSnBjH7.jpg&quot;
  alt=&quot;&quot;
  width=&quot;200&quot;
  height=&quot;auto&quot;
&gt;
&lt;&#x2F;figure&gt;

&lt;figure&gt;
  &lt;img
  src=&quot;https:&#x2F;&#x2F;vip2.loli.io&#x2F;2022&#x2F;02&#x2F;03&#x2F;ojKB1DJs4n76mVe.jpg&quot;
  alt=&quot;&quot;
  width=&quot;200&quot;
  height=&quot;auto&quot;
&gt;
&lt;&#x2F;figure&gt;
&lt;&#x2F;p&gt;
&lt;p&gt;两款老少皆宜的乐高&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;CB12 漱口水&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img
  src=&quot;https:&#x2F;&#x2F;vip2.loli.io&#x2F;2022&#x2F;02&#x2F;03&#x2F;hXNtEQgy8HpMIWe.jpg&quot;
  alt=&quot;&quot;
  width=&quot;200&quot;
  height=&quot;auto&quot;
&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;使用体验比其他同类型的漱口水更加清爽温和，并且抑制口气效果比较明显。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Green Bell 的指甲刀（我购买的型号是G-1114 和G-1113）&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img
  src=&quot;https:&#x2F;&#x2F;vip1.loli.io&#x2F;2022&#x2F;02&#x2F;03&#x2F;quitHxek8GbITMO.jpg&quot;
  alt=&quot;&quot;
  width=&quot;100&quot;
  height=&quot;auto&quot;
&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;物美价廉，刀口设计合理，操作很舒服，并且刀刃锋利，使用时不需要很用力。家里人手一个。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Feather HiSHAVE MOIST Gel 剃须啫喱&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img
  src=&quot;https:&#x2F;&#x2F;vip2.loli.io&#x2F;2022&#x2F;02&#x2F;03&#x2F;dRiNb4rH6uzmqDS.jpg&quot;
  alt=&quot;&quot;
  width=&quot;200&quot;
  height=&quot;auto&quot;
&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;我喜欢手动剃须，剃须啫喱相比剃须泡沫，操作更简单，无需起泡，用量少，更顺滑，皮肤刺激感低，并且没有一些奇怪的香味，因此我更推荐使用剃须啫喱。Feather的这款剃须啫喱算是便宜大碗，自带保湿成分，我个人使用感觉不错。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;防雾剂&lt;&#x2F;p&gt;
&lt;p&gt;今年由于出门都要戴着口罩，冬天眼镜起雾的问题很严重，因此防雾剂很有用，只要认准有效成分-表面活性剂即可，不需要各种乱七八糟的添加成分。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;KRUPS EA810780 咖啡机&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img
  src=&quot;https:&#x2F;&#x2F;vip1.loli.io&#x2F;2022&#x2F;02&#x2F;03&#x2F;P28vfWEsopcKVn9.jpg&quot;
  alt=&quot;&quot;
  width=&quot;200&quot;
  height=&quot;auto&quot;
&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;由于家中的老咖啡机是之前半自动的，使用过于繁琐，经常遭到我妈的吐槽，这次选择了一台全自动咖啡机，使用简单，做成的浓缩咖啡品质稳定，也并没有感觉与之前的半自动咖啡机的成品有明显差异，但是使用的便利性大大提高了我们家的咖啡消耗量，这就足够了（转天就把老咖啡机送人了）。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;MacBook 13英寸 M1 芯片版本&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img
  src=&quot;https:&#x2F;&#x2F;vip1.loli.io&#x2F;2022&#x2F;02&#x2F;03&#x2F;RQ74bglG9cUM2wV.jpg&quot;
  alt=&quot;&quot;
  width=&quot;200&quot;
  height=&quot;auto&quot;
&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;告别被苹果“遥控”之后旧 MacBook 的各种奇怪问题，以及编译时漫长等待的烦躁心情。Intel 该加油了。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;WD-40 Multi-Use Product&lt;&#x2F;p&gt;
&lt;figure&gt;
  &lt;img
  src=&quot;https:&#x2F;&#x2F;vip2.loli.io&#x2F;2022&#x2F;02&#x2F;03&#x2F;OpzwCaPIGdZeAl3.png&quot;
  alt=&quot;&quot;
  width=&quot;100&quot;
  height=&quot;auto&quot;
&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;最后是 WD-40 多用途型号，名声大到我妹妹都可以熟练操作，因此无需再多做介绍。专门处理家中各类物品的疑难杂症，遇事不决先喷WD-40（&lt;strong&gt;切勿直接接触人体以及食品相关器具，使用时做好防护措施&lt;&#x2F;strong&gt;）。&lt;&#x2F;p&gt;
&lt;p&gt;以上是我在2020年购买的东西中觉得最值得推荐的，其中有一些是我已经用了很久，2020年依旧在持续使用的。&lt;&#x2F;p&gt;
&lt;p&gt;同时你会发现表单里面没有任何食品，因为我觉得食品安全相当重要，非特殊情况下不做推荐（乃至狗粮也是如此）。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</description>
      </item>
      <item>
          <title>在JS中用更现代化和优雅的方式进行金额的格式化</title>
          <pubDate>Tue, 26 Jan 2021 17:39:46 +0800</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/morden-elegant-way-to-format-currency-in-js/</link>
          <guid>https://guchengf.me/blog/morden-elegant-way-to-format-currency-in-js/</guid>
          <description xml:base="https://guchengf.me/blog/morden-elegant-way-to-format-currency-in-js/">&lt;p&gt;今天介绍一种我已经使用了很长时间的，针对现代浏览器的金额文本格式化方法。&lt;&#x2F;p&gt;
&lt;p&gt;这种方法使用了 &lt;code&gt;Intl.NumberFormat&lt;&#x2F;code&gt; (&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Web&#x2F;JavaScript&#x2F;Reference&#x2F;Global_Objects&#x2F;Intl&#x2F;NumberFormat&quot;&gt;MDN&lt;&#x2F;a&gt;) 这个API。&lt;&#x2F;p&gt;
&lt;p&gt;以人民币为例&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;typescript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; amountFormatter&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; Intl&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;NumberFormat&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;en-US&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span&gt; style&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;currency&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; currency&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;CNY&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;**&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; * 1234567.12 to 1,234,567.12&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; * &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;param&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);font-style: italic;&quot;&gt; amount&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; *&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;export&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; formatAmount&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;amount&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt; number&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt; string&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;typeof&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; amount&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; ===&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;undefined&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;  return&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; amountFormatter&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;format&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;amount&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;substr&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt;3&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;formatAmount&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;1234567.12&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; =&amp;gt; 1,234,567.12&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;通过上面这个方法，就可以获取常见的人民币展示形式 &lt;code&gt;1,234,567.12&lt;&#x2F;code&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;如果你需要保留人民币符号，那就是下面这个方法&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;typescript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;amountFormatter&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;format&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;amount&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;substr&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 1234567.12 to ¥1,234,567.12&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;事实上 &lt;code&gt;format&lt;&#x2F;code&gt; 方法输出的字符串是 &lt;code&gt;CN¥1,234,567.12&lt;&#x2F;code&gt; ，因此你可以根据自己的需要进行调整。&lt;&#x2F;p&gt;
&lt;p&gt;通过调整 &lt;code&gt;locale&lt;&#x2F;code&gt; 参数和 &lt;code&gt;options&lt;&#x2F;code&gt; 还可以组合出更多形式，尽情探索吧。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>arm64 的 Mac 上面使用 fnm 的问题</title>
          <pubDate>Wed, 20 Jan 2021 10:49:06 +0800</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/fnm-on-mac-arm64/</link>
          <guid>https://guchengf.me/blog/fnm-on-mac-arm64/</guid>
          <description xml:base="https://guchengf.me/blog/fnm-on-mac-arm64/">&lt;p&gt;注：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Mac_transition_to_Apple_Silicon&quot;&gt;文中 mac arm64、apple silicon、m1 皆指代采用 Apple 自研芯片的 mac&lt;&#x2F;a&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;早前我把自己的 Nodejs 版本管理工具切换到了 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Schniz&#x2F;fnm&quot;&gt;fnm&lt;&#x2F;a&gt;，比 nvm 更快更简洁，比 n 更灵活是我选择它的原因。&lt;&#x2F;p&gt;
&lt;p&gt;不久前我的 mac 更新为了 m1 芯片的版本，随之而来的开发环境的问题也很多。&lt;&#x2F;p&gt;
&lt;p&gt;首先就是 Nodejs 的问题。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;nodejs-de-mac-arm64-zhi-chi-xian-zhuang&quot;&gt;Nodejs 的 mac arm64 支持现状&lt;&#x2F;h2&gt;
&lt;p&gt;截止本文发布时间（2021-1-20），只有 v15.x 版本的 Nodejs 支持了 arm64 版本的 mac 系统，其余版本的 Nodejs 只能通过 Rosetta 运行（不过问题不多）。&lt;&#x2F;p&gt;
&lt;p&gt;在 m1 芯片能够提供极大程度性能提升的情况下，大家当然希望更多版本的 Nodejs 可以原生支持 arm64 的 mac。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;nodejs&#x2F;build&#x2F;issues&#x2F;2474&quot;&gt;不过目前 Nodejs 官方还没有正式宣布支持 apple silicon&lt;&#x2F;a&gt;（&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;nodejs&#x2F;TSC&#x2F;issues&#x2F;886&quot;&gt;另一个链接&lt;&#x2F;a&gt;），距离正式支持应该还有一段时间。&lt;&#x2F;p&gt;
&lt;p&gt;由于以上原因，fnm 在 mac arm64 下的使用也产生了一些问题。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Schniz&#x2F;fnm&#x2F;pull&#x2F;368&quot;&gt;在给项目提交了一次更新之后&lt;&#x2F;a&gt;，目前 fnm 已经可以在 mac arm64 下正常编译。&lt;&#x2F;p&gt;
&lt;p&gt;由此，fnm 在 mac arm64 下会去尝试从 Nodejs 官方网站下载 &lt;code&gt;darwin-arm64&lt;&#x2F;code&gt; 版本的预编译二进制包。但是因为官方还没有提供这一版本的包，所以 fnm 无法正常工作。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;wo-de-fnm-lin-shi-jie-jue-fang-an&quot;&gt;我的 fnm 临时解决方案&lt;&#x2F;h2&gt;
&lt;p&gt;由于这个问题，我只能采用一个临时解决方案（不准备切换回 nvm 或者 n 了）。&lt;&#x2F;p&gt;
&lt;p&gt;方案大致逻辑是：&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;v15.x 的 Nodejs 我需要使用 mac arm64 的版本（性能提升显著，为什么不呢）&lt;&#x2F;li&gt;
&lt;li&gt;其余更低版本的 Nodejs 使用 x64 版本通过 Rosetta 运行&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;确定了基础逻辑之后，我需要先找一个获得 mac arm64 版本的方法，从源码编译是一种选择，这也是 nvm 的方法，不过手动编译效率有些低下。好在 homebrew 已经提供了arm64 的预编译包（&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;docs.brew.sh&#x2F;Bottles&quot;&gt;homebrew 提供预编译包的方式&lt;&#x2F;a&gt;），从 homebrew bottles 下载是一个不错的选择。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;bu-zou&quot;&gt;步骤&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;首先我们正常初始化 fnm&lt;&#x2F;p&gt;
&lt;p&gt;我同时使用 fnm 的 mac arm64 和 x64 版本，使用 x64 版本安装 x64 版本的 Nodejs，使用 arm64 版本做其余逻辑。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;安装 arm64 版本的 Nodejs&lt;&#x2F;p&gt;
&lt;p&gt;大致流程就是从 homebrew bottles 下载 &lt;code&gt;darwin-arm64&lt;&#x2F;code&gt; 版本的 Nodejs 预编译包，按照 fnm 的文件结构把文件放到相应位置，比如 &lt;code&gt;15.6.0&lt;&#x2F;code&gt; 对应 &lt;code&gt;~&#x2F;.fnm&#x2F;node-versions&#x2F;v15.6.0&#x2F;installation&lt;&#x2F;code&gt;。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;这样 fnm 就可以同时管理 x64 和 arm64 版本的 Nodejs 了。&lt;&#x2F;p&gt;
&lt;p&gt;为了方便我获取 arm64 版本的 Nodejs，我写了一个 shell 脚本，从 homebrew bottles 下载最新的 &lt;code&gt;darwin-arm64&lt;&#x2F;code&gt; Nodejs 包。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;bin&#x2F;bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 假设你已经安装了 homebrew, wget 和 fx(https:&#x2F;&#x2F;github.com&#x2F;antonmedv&#x2F;fx)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 所有工作在 &#x2F;tmp 下完成避免意外情况&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;mkdir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &#x2F;tmp&#x2F;fnm-node&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;u&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;h&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &#x2F;tmp&#x2F;fnm-node&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;rm&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;fr&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; .&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;mkdir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; fnm&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 保存 homebrew 提供的 node 信息 &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;NODE_INFO&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;m&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;o&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;o&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;j&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;o&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;n&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;brew&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; info&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; node&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;-json&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt; $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;NODE_INFO&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 获取最新的 Node 版本&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;NODE_VERSION&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;$(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;fx&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;NODE_INFO&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; .[0].linked_keg&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;nodejs version: &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #9ECBFF);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #9ECBFF);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;NODE_VERSION&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 建立 fnm 的相同文件结构&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;mkdir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; .&#x2F;fnm&#x2F;node-versions&#x2F;v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;NODE_VERSION&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&#x2F;installation&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; bottles 上的 Node 包&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;NODE_TAR&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;$(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;fx&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;NODE_INFO&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; .[0].bottle.stable.files.arm64_big_sur.url&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; sha256&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;TAR_SHA256&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;$(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;fx&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;NODE_INFO&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; .[0].bottle.stable.files.arm64_big_sur.sha256&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 本地的包文件&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;NODE_TAR_FILE&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;node-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #9ECBFF);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #9ECBFF);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;NODE_VERSION&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;.arm64_big_sur.bottle.tar.gz&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 下载包&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;wget&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt; $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;NODE_TAR&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 校验 sha256&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;FILE_SHA&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;$(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;shasum&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 256&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt; $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;NODE_TAR_FILE&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; head&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 64&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;FILE_SHA&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;TAR_SHA256&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; ]&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;sha256 check failed&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt;    exit&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;fi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 解压&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;tar&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; xzf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt; $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;NODE_TAR_FILE&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 移动文件到 fnm 镜像结构&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;mv&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; node&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;NODE_VERSION&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; .&#x2F;fnm&#x2F;node-versions&#x2F;v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;NODE_VERSION&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&#x2F;installation&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 安装npm和npx&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;pushd .&#x2F;fnm&#x2F;node-versions&#x2F;v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;NODE_VERSION&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;installation&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;cp&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; libexec&#x2F;lib&#x2F;node_modules&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; .&#x2F;lib&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;ln&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;sf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; ..&#x2F;lib&#x2F;node_modules&#x2F;npm&#x2F;bin&#x2F;npm-cli.js&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; .&#x2F;bin&#x2F;npm&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;ln&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;sf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; ..&#x2F;lib&#x2F;node_modules&#x2F;npm&#x2F;bin&#x2F;npx-cli.js&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; .&#x2F;bin&#x2F;npx&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;rm&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;fr&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; AUTHORS&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; etc&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; INSTALL_RECEIPT.json&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; libexec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; share&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;popd&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 创建 fnm 的文件夹结构（可能还没有安装过node）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;mkdir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; ~&#x2F;.fnm&#x2F;node-versions&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 移动最终文件到 fnm 的真正文件夹中&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;mv&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; .&#x2F;fnm&#x2F;node-versions&#x2F;v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;NODE_VERSION&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #E1E4E8);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; ~&#x2F;.fnm&#x2F;node-versions&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;popd&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;all things done&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;fnm&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; ls&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;执行完之后，fnm 就获得了当前 homebrew 中最新的 arm64 版本的 Nodejs。&lt;&#x2F;p&gt;
&lt;p&gt;根据你的本地配置修改脚本中的相应参数。&lt;&#x2F;p&gt;
&lt;p&gt;GitHub gist: &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;gist.github.com&#x2F;gucheen&#x2F;9ebeb8363343d430b6602610feca0827&quot;&gt;fnm: install arm64 version of node from homebrew bottles&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;期待 Nodejs 早日正式支持 mac arm64，以及更多 lts 版本的支持。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>新一年代的思考</title>
          <pubDate>Sun, 10 Jan 2021 03:46:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/the-new-decade/</link>
          <guid>https://guchengf.me/blog/the-new-decade/</guid>
          <description xml:base="https://guchengf.me/blog/the-new-decade/">&lt;p&gt;首先向大家介绍一位我非常喜欢的 Web 前端工作者，&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;hail2u.net&quot;&gt;hail2u&lt;&#x2F;a&gt;，没错，一位日本友人。&lt;&#x2F;p&gt;
&lt;p&gt;说说为什么我会喜欢这位开发者。我从事前端开发工作也有接近8年时间了，在这8年里也经历了前端技术的飞速发展，对于国内的前端开发来说，这8年可以说是天翻地覆。&lt;&#x2F;p&gt;
&lt;p&gt;对于我个人来说，这8年时间其实也可以说是没有任何变化，8年前我的工作内容只是完成业务需求，8年后也一样，区别只不过是换了几种框架而已。&lt;&#x2F;p&gt;
&lt;p&gt;在大公司尤其能感受到这一点，高度流水线化的工作流程，我接触的同事中绝大多数人只是想着完成这个需求就好。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;又不是不能用。--罗永浩&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;大多数时候他们并不在意自己的工作质量如何，只要产品需求完成了那就结束了。&lt;&#x2F;p&gt;
&lt;p&gt;我一直认为追求更高的工作质量、更好的技术能力是一位开发者对自己应有的要求，无论是在我自己的工作中、在我负责的开发管理和人事招聘中，我都一直践行这一点，即便很多时候并非那么容易就能做到。&lt;&#x2F;p&gt;
&lt;p&gt;随便翻看我所在的公司的各种项目，杂乱无意义的 git 提交记录；莫名其妙的夹杂着私人情绪的注释；为了完成任务而编写的无法阅读的代码；不愿意深入了解所用技术而自己创造的各种“轮子”。&lt;&#x2F;p&gt;
&lt;p&gt;我对于这样子的工作态度难以表示认同，然而我也不能改变他们。&lt;&#x2F;p&gt;
&lt;p&gt;回来说说 hail2u，我关注他大约有3年了，这期间我能从他的个人网站、GitHub 发现他一直保持着高效、高质量的产出，从思考、创作到分享。&lt;&#x2F;p&gt;
&lt;p&gt;这是一位非常喜欢研究前端技术标准的开发者，你可以从他的个人网站、个人项目中发现这一点，经常分享好的技术思想。&lt;&#x2F;p&gt;
&lt;p&gt;从他的博客 https:&#x2F;&#x2F;hail2u.net&#x2F; 就能发现这一点，这是一个他自己实现的纯静态网站，在 HTML 和 CSS 的使用上到了一个很高的程度。与现在前端圈或者说技术圈的言必谈架构的氛围不同，在这样一个看起来有些复古的网站上，却有着对前端技术和工程化高度理解。（整站开源，有兴趣的人也可以去看一下。）&lt;&#x2F;p&gt;
&lt;p&gt;因此，我在日语能力不足的情况下依然持续关注着这位开发者，每次他带来的新文章、新分享我都能有所收获。&lt;&#x2F;p&gt;
&lt;p&gt;在 20 年代到来之际，我也意识到自己应当有所改变了，每日枯燥而无意义的工作消磨了我曾经对于技术的追求，我觉得这也是一个不错的契机，开始重新审视自我。&lt;&#x2F;p&gt;
&lt;p&gt;我将自己的博客主题改成了与 hail2u 相同的样式（MIT 开源），借由这种简单的博客形式，让自己更加专注于博客内容。&lt;&#x2F;p&gt;
&lt;p&gt;总体来说，希望在新的一年里，能够真正重新梳理自己的技术能力，真正有所进步。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>guchengf.me stride towards Docker</title>
          <pubDate>Tue, 10 Mar 2020 13:51:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/guchengf-me-stride-towards-docker/</link>
          <guid>https://guchengf.me/blog/guchengf-me-stride-towards-docker/</guid>
          <description xml:base="https://guchengf.me/blog/guchengf-me-stride-towards-docker/">&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;i.loli.net&#x2F;2020&#x2F;04&#x2F;16&#x2F;eoDakWft6PYslr4.png&quot; alt=&quot;Docker&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;是的，guchengf.me 所有线上服务已经大步迈向 Docker ！&lt;&#x2F;p&gt;
&lt;p&gt;在即将进行下一次个人服务器搬迁的时候，我终于决定将现在服务器上所有的东西迁移到 Docker 内。其实在此之前已经经历过几次搬迁，为了避免后续无尽的搬迁体力工作，决定正式更换到 Docker 平台。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;docker-jie-jue-liao-wo-de-na-xie-wen-ti&quot;&gt;Docker 解决了我的哪些问题&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;1-fu-wu-qi-yu-ben-di-kai-fa-de-huan-jing-yi-zhi-xing&quot;&gt;1. 服务器与本地开发的环境一致性&lt;&#x2F;h3&gt;
&lt;p&gt;其实我在开发过程中，很难做到本地开发和服务器的环境完全一致。由于我主业是 Web 前端工程师，众所周知，前端其实是对服务器环境需求最小的，不管是从部署还是维护，复杂度都非常低，少量的环境不一致也不会导致很严重的问题，Web 前端最关注的毫无疑问是客户端（即我们的用户环境，姑且将服务器到客户端的链路优化工作交给更专业的人）。&lt;&#x2F;p&gt;
&lt;p&gt;因为上面这些原因，我对于本地和服务器环境的一致性工作没有太丰富的经验，并且也做得不够好。在经历过一些 Docker 的线上使用之后，我发现 Docker 能非常有效地提高这种一致性，当我需要实现一致性的时候，就采用相同的 Docker 配置，不再需要我手动维护两个环境，我只需要准备好一份能满足我需求的 Docker 配置，就达成了本地和服务器同步的需求。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2-zhong-fu-xing-bu-shu-gong-zuo&quot;&gt;2. 重复性部署工作&lt;&#x2F;h3&gt;
&lt;p&gt;我的个人服务器上运行了一些个人网站和服务，每一个新项目都需要我按照需求进行部署（包括我的个人项目和其他开源项目）。这里面有不少重复性的工作，但我不是专业运维，很难做好自动化工作。&lt;&#x2F;p&gt;
&lt;p&gt;Docker 则给了我一个很好的选择。&lt;&#x2F;p&gt;
&lt;p&gt;开源项目都已经广泛开始提供官方 Docker 镜像，我只需要使用他们提供的镜像，修改相应的配置文件（通常只有很少的配置项），就可以轻松将服务运行起来。&lt;&#x2F;p&gt;
&lt;p&gt;而我自己的项目，则可以整理出共同的需求，集中到同一个 Docker 容器进行管理，有官方镜像的优先使用官方镜像，其余部分再各自独立成容器。这种情况下，我就避开了部署项目时的重复工作。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;3-dai-ma-he-shu-ju-de-ji-zhong-guan-li&quot;&gt;3. 代码和数据的集中管理&lt;&#x2F;h3&gt;
&lt;p&gt;采用 Docker 之后，服务器上的代码和数据得以按照我最喜欢的结构进行管理，毕竟它们的存在形式不再影响它们在服务器上的运行。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;wo-shi-ru-he-jin-xing-qian-yi-gong-zuo&quot;&gt;我是如何进行迁移工作&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;qian-qi-zhun-bei&quot;&gt;前期准备&lt;&#x2F;h3&gt;
&lt;p&gt;毫无疑问，首先我整理出了需要迁移的所有内容。我的个人项目以 Web 前端和 NodeJS 为主，还有少量的 python 以及 Go 项目。其中大部分需要 nginx 作为 Web Server。&lt;&#x2F;p&gt;
&lt;p&gt;那么我需要准备好 nginx 容器（包括相应的配置文件），Node、python、Go的相应环境，还有数据库（mysql 和 mongodb）。&lt;&#x2F;p&gt;
&lt;p&gt;而那些我使用的开源项目，则只需要确认它们是否有相应的 Docker 镜像，对于需要 nginx 的，将它们和我的 nginx 容器关联起来（数据库我不想关联起来，并没有这个必要）。&lt;&#x2F;p&gt;
&lt;p&gt;在做了这些工作之后，我的 Docker 配置结构就已经清晰了。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;nginx （全局统一，包括 https 需要的 letsencrpt），nginx 和各个 Web 服务关联的全局 network（我将它命名为 me_guchengf_net)&lt;&#x2F;li&gt;
&lt;li&gt;单纯 Web 前端的 static（其实它们就只是静态文件的而已）&lt;&#x2F;li&gt;
&lt;li&gt;Node、python、Go 的项目（需要使用相应的语言运行时容器）&lt;&#x2F;li&gt;
&lt;li&gt;mysql 和 mongodb（集中到一起也方便我对数据库进行备份）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;docker-pei-zhi-jie-gou-she-ji&quot;&gt;Docker 配置结构设计&lt;&#x2F;h3&gt;
&lt;p&gt;然后我就开始 Docker 配置结构的设计。&lt;&#x2F;p&gt;
&lt;p&gt;按照上面整理的列表进行一级目录设计。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- nginx（基于 nginx-alpine 二次构建，主要加入了 brotli 的支持并调整了一些 nginx 的配置）。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- mysql&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- mongodb&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- websites（静态的 Web 前端项目）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    - web-1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    - web-2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- typecho（没错我的博客是 typecho 的程序，我做了一些小修改）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- node-proj-a&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- python-proj-a&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- go-proj-a&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- nodejs（我对 Node 环境有一些自己的需求，直接在官方 Node 镜像上进行了二次构建）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- php（typecho 需要 pdo 的 php 扩展，官方镜像没有，二次构建加入进去）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- open-source-proj-a（使用的其他开源服务，基本就是一个 docker-compose.yml 配一个 config 文件）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- logs（日志文件也酌情集中在这里，方便我查找）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- init-scripts（全局初始化脚本）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;基于上面这个结构，我编写了首批 docker-compose 配置文件和二次构建镜像的 Dockerfile 文件。这样我有特定需求的镜像就准备好了，各个服务的基础信息、互相的关联关系也明确了。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;yi-lai-guan-xi&quot;&gt;依赖关系&lt;&#x2F;h3&gt;
&lt;p&gt;在整个结构中，只有 nginx 是对其他 Web 项目有反向依赖的，因为它需要知道每个项目的 nginx 配置，于是我就自行作出约定，每个项目都需要按照标准在项目下提供自己的 nginx 配置文件，在 nginx 容器启动前去每个项目中获取对应的配置，复制并挂载到 nginx 容器内（有自己服务进程的做反向代理，单纯的 Web 前端项目则按照标准的静态项目配置）。&lt;&#x2F;p&gt;
&lt;p&gt;其余项目则都是单向依赖，需要互相访问的就建立对应的 network 进行关联，就可以直接通过容器进行访问，不再需要将端口绑定到宿主机上，也免去了很多麻烦。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;shi-xian-mei-yi-ge-docker-compose-bing-ce-shi&quot;&gt;实现每一个 Docker compose 并测试&lt;&#x2F;h3&gt;
&lt;p&gt;这一步我就正式开始编写各个 docker-compose.yml，每个项目都自行实现项目到 Docker 目录的部署方法，最终的代码和数据在 Docker 容器中挂载。我的大部分项目结构都很简单，最终的成品代码挂载到容器中就可以了，也不存在文件系统的特殊需求。然后配置好需要关联容器生命周期的脚本（大多都是程序启动的前置）。&lt;&#x2F;p&gt;
&lt;p&gt;将项目中对应的线上环境配置替换成 Docker 的版本，比如数据库地址之类的。&lt;&#x2F;p&gt;
&lt;p&gt;只要每一个 docker compose 都可以顺利启动就可以了，在这个过程中我几乎没有遇到问题，项目都顺利运行。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;shang-xian&quot;&gt;上线&lt;&#x2F;h2&gt;
&lt;p&gt;到这里，我就已经完成了所有迁移工作，剩下的就是搬上服务器了。&lt;&#x2F;p&gt;
&lt;p&gt;在服务器上准备好 Docker 环境（已经 docker-compose），将这个 Docker 项目直接发布到服务器上，首先运行初始化脚本，构建好所有定制镜像，然后将数据库服务启动，再依次启动各个项目，最后运行 nginx（因为nginx会检查upstream）。&lt;&#x2F;p&gt;
&lt;p&gt;是的，就和上述这些文字描述的一样，非常轻松，没有太多的曲折。&lt;&#x2F;p&gt;
&lt;p&gt;你现在阅读到的这篇文章就是已经运行在 Docker 容器中的了！&lt;&#x2F;p&gt;
&lt;h2 id=&quot;amazing&quot;&gt;Amazing&lt;&#x2F;h2&gt;
&lt;p&gt;我已经完成了整个迁移工作，并且将我本地开发的 nginx、数据库之类的服务也替换成了 Docker 版本，只需要区分开发和线上的配置文件，就实现了这些环境的一致性。&lt;&#x2F;p&gt;
&lt;p&gt;其实在这整个过程中，我遇到的最大困难竟然是 nginx 中 https 的部分，也就是 letsencrypt 和 certbot 的相关工作，我准备在下一篇文章中详细讲述这个问题。&lt;&#x2F;p&gt;
&lt;p&gt;Enjoy Docker!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>TypeScript 中的 Unknown 类型</title>
          <pubDate>Sat, 10 Aug 2019 06:08:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/unknown-type-in-typescript/</link>
          <guid>https://guchengf.me/blog/unknown-type-in-typescript/</guid>
          <description xml:base="https://guchengf.me/blog/unknown-type-in-typescript/">&lt;p&gt;TypeScript 3.0 中新增了一种 &lt;code&gt;unknown&lt;&#x2F;code&gt; 类型。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.typescriptlang.org&#x2F;docs&#x2F;handbook&#x2F;release-notes&#x2F;typescript-3-0.html#new-unknown-top-type&quot;&gt;New unknown top type&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;unknown&lt;&#x2F;code&gt; is the type-safe counterpart of &lt;code&gt;any&lt;&#x2F;code&gt;. Anything is assignable to &lt;code&gt;unknown&lt;&#x2F;code&gt;, but &lt;code&gt;unknown&lt;&#x2F;code&gt; isn’t assignable to anything but itself and any without a type assertion or a control flow based narrowing. Likewise, no operations are permitted on an &lt;code&gt;unknown&lt;&#x2F;code&gt; without first asserting or narrowing to a more specific type.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;简单来说，&lt;code&gt;unknown&lt;&#x2F;code&gt; 是一种更加安全的 &lt;code&gt;any&lt;&#x2F;code&gt; 的副本。所有东西都可以被标记成是 &lt;code&gt;unknown&lt;&#x2F;code&gt; 类型，但是 &lt;code&gt;unkonwn&lt;&#x2F;code&gt; 必须在进行类型判断和条件控制之后才可以被分配成其他类型，并且在类型判断和条件控制之前也不能进行任何操作。&lt;&#x2F;p&gt;
&lt;p&gt;一些常见的使用案例可以参考&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.typescriptlang.org&#x2F;docs&#x2F;handbook&#x2F;release-notes&#x2F;typescript-3-0.html#example-3&quot;&gt;官方文档&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;我这边举出一个很常见的使用场景。&lt;&#x2F;p&gt;
&lt;p&gt;假设我们在一个 TypeScript 项目中，引入了一个 JavaScript 编写的库，这个库通过单独的 TypeScript declaration 文件提供 TypeScript 支持，那么就可能存在一种情况。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;typescript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;import&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; method&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;js-lib&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; method&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;some&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #B392F0);&quot;&gt; SomeType&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; void&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;method()&lt;&#x2F;code&gt; 在 &lt;code&gt;.d.ts&lt;&#x2F;code&gt; 中声明的参数类型是 &lt;code&gt;SomeType&lt;&#x2F;code&gt;，但是它实际接受另一种类型的参数，比如 &lt;code&gt;null&lt;&#x2F;code&gt;。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;typescript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 如果直接传入 null，那么编译器就会报错&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;method&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B58900, #79B8FF);&quot;&gt;null&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; Error: Argument of type &amp;#39;null&amp;#39; is not assignable to parameter of type &amp;#39;SomeType&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;这种情况下就可以利用 &lt;code&gt;unknown&lt;&#x2F;code&gt; 类型来实现传入 null。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;typescript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;method&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B58900, #79B8FF);&quot;&gt;null&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; as&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt; unknown&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; as&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #B392F0);&quot;&gt; SomeType&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;这样就可以正常通过编译器的类型校验了。&lt;&#x2F;p&gt;
&lt;p&gt;当然最好还是编写正确的 declaration 文件。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Angular LazyLoad Module 常见问题</title>
          <pubDate>Fri, 31 May 2019 03:45:24 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/common-questions-in-angular-lazyload-module/</link>
          <guid>https://guchengf.me/blog/common-questions-in-angular-lazyload-module/</guid>
          <description xml:base="https://guchengf.me/blog/common-questions-in-angular-lazyload-module/">&lt;h2 id=&quot;1-browsermodule-has-already-been-loaded-if-you-need-access-to-common-directives-such-as-ngif-and-ngfor-from-a-lazy-loaded-module-import-commonmodule-instead&quot;&gt;1. BrowserModule has already been loaded. If you need access to common directives such as NgIf and NgFor from a lazy loaded module, import CommonModule instead.&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;BrowserModule&lt;&#x2F;code&gt; 在整个 Angular 应用中只需要引入一次，通常在 &lt;code&gt;app.module.ts&lt;&#x2F;code&gt; 中引入一次就好了，并且如果引入了 &lt;code&gt;BrowserAnimationsModule&lt;&#x2F;code&gt; 或者 &lt;code&gt;NoopAnimationsModule&lt;&#x2F;code&gt; 就不需要再引入 &lt;code&gt;BrowserModule&lt;&#x2F;code&gt; 了，前两个已经内部引用了。&lt;&#x2F;p&gt;
&lt;p&gt;其他模块或者说公共模块中只需要引入 &lt;code&gt;CommonModule&lt;&#x2F;code&gt; 就可以了。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2-ts1323-dynamic-import-is-only-supported-when-module-flag-is-commonjs-or-esnext&quot;&gt;2. TS1323: Dynamic import is only supported when &#x27;--module&#x27; flag is &#x27;commonjs&#x27; or &#x27;esNext&#x27;&lt;&#x2F;h2&gt;
&lt;p&gt;因为目前 Dynamic import 特性还是 esNext 的阶段，而 Angular Cli 的 &lt;code&gt;tsconfig&lt;&#x2F;code&gt; 默认是 es2015，所以使用 &lt;code&gt;import()&lt;&#x2F;code&gt; 会提示这个错误。&lt;&#x2F;p&gt;
&lt;p&gt;将你项目下的 &lt;code&gt;tsconfig.json&lt;&#x2F;code&gt; 中的 &lt;code&gt;module&lt;&#x2F;code&gt; 改为 &lt;code&gt;esnext&lt;&#x2F;code&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;这个问题发生在升级到 Angular 8.0 之后，因为这一版本更改了 &lt;code&gt;loadChildren&lt;&#x2F;code&gt; 的使用方式，新版使用了 &lt;code&gt;import()&lt;&#x2F;code&gt;，但是没有正确更新 tsconfig，就会导致这个问题。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>i18n-render</title>
          <pubDate>Wed, 22 May 2019 06:05:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/i18n-render/</link>
          <guid>https://guchengf.me/blog/i18n-render/</guid>
          <description xml:base="https://guchengf.me/blog/i18n-render/">&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;gucheen&#x2F;i18n-render&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;gucheen&#x2F;i18n-render&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;tiny i18n solution for tiny projects.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;design&quot;&gt;Design&lt;&#x2F;h2&gt;
&lt;p&gt;The i18n-render&#x27;s structure is &lt;code&gt;key -&amp;gt; translation dictionary&lt;&#x2F;code&gt;. While the translation dict is &lt;code&gt;locale -&amp;gt; text&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;In short, i18n-render take a &lt;code&gt;key&lt;&#x2F;code&gt; to get the translation dict, then get translated text with &lt;code&gt;locale&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;source-configuration&quot;&gt;Source Configuration&lt;&#x2F;h2&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; source&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  example1&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    en&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;I can eat glass and it doesn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;\&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;t hurt me.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    fr&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;Je peux manger du verre, ça ne me fait pas mal.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    de&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;Ich kann Glas essen, ohne mir zu schaden.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;    &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;zh-CN&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;我能吞下玻璃而不伤身体。&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;    &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;zh-HK&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;我能吞下玻璃而不傷身體。&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    jp&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;私はガラスを食べられます。それは私を傷つけません。&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  example_image&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    en&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;https:&#x2F;&#x2F;source-image.path&#x2F;en.jpg&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    fr&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;https:&#x2F;&#x2F;source-image.path&#x2F;fr.jpg&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    de&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;https:&#x2F;&#x2F;source-image.path&#x2F;de.jpg&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;    &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;zh-CN&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;https:&#x2F;&#x2F;source-image.path&#x2F;zh-CN.jpg&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;    &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;zh-HK&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;https:&#x2F;&#x2F;source-image.path&#x2F;zh-HK.jpg&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    jp&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;https:&#x2F;&#x2F;source-image.path&#x2F;jp.jpg&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; or&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; source&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  example1&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;    &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;en-US&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;I can eat glass and it doesn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;\&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;t hurt me.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;    &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;fr-FR&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;Je peux manger du verre, ça ne me fait pas mal.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;    &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;de-DE&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;Ich kann Glas essen, ohne mir zu schaden.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;    &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;zh-CN&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;我能吞下玻璃而不伤身体。&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;    &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;zh-HK&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;我能吞下玻璃而不傷身體。&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;    &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;jp-JP&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;私はガラスを食べられます。それは私を傷つけません。&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;usage&quot;&gt;Usage&lt;&#x2F;h2&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;body&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt; ir&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;example1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;这是一段默认的中文&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;img&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt; src&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;https:&#x2F;&#x2F;default-image.path&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt; alt&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt; ir-src&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;example_image&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;img&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt; src&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt; alt&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt; ir-srcset&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;example_image_srcset&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;body&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; import I18nRender from &amp;#39;i18n-render&amp;#39;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; i18n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; I18nRender&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;  source&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  pageTextLocale&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;zh&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;document&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;addEventListener&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;DOMContentLoaded&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;  i18n&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;render&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;api&quot;&gt;API&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;class-i18nrender-constructor&quot;&gt;class I18nRender constructor&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;parameter&lt;&#x2F;th&gt;&lt;th&gt;value&lt;&#x2F;th&gt;&lt;th&gt;description&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;source&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;Object&amp;lt;string, string&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Translation dictionaries for various languages&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;locale&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;string&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Set locale directly instead of auto detect&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;pageTextLocale&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;string&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;If your page already has text in a certain language, setting this parameter can prevent the re-rendering of this language, and you do not need to provide translation of this language.&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;fullLangTag&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;boolean&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;I18n-render uses a short locale tag by default, such as &lt;code&gt;en&lt;&#x2F;code&gt;, &lt;code&gt;fr&lt;&#x2F;code&gt;, &lt;code&gt;de&lt;&#x2F;code&gt;, &lt;code&gt;jp&lt;&#x2F;code&gt;. However, languages can distinguish regions, such as &lt;code&gt;zh-CN&lt;&#x2F;code&gt; and &lt;code&gt;zh-HK&lt;&#x2F;code&gt;, which need two different translation versions. In this case, &lt;code&gt;fullLangTag: true&lt;&#x2F;code&gt; can be set, and the configuration items of the language will become complete modes, such as &lt;code&gt;en-US&lt;&#x2F;code&gt; and &lt;code&gt;zh-CN&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;getlocale-string&quot;&gt;getLocale() =&amp;gt; string&lt;&#x2F;h3&gt;
&lt;p&gt;Get current locale of i18n-render.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;setlocale&quot;&gt;setLocale()&lt;&#x2F;h3&gt;
&lt;p&gt;Change to another locale manualy.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;locale&lt;&#x2F;strong&gt; &lt;code&gt;string&lt;&#x2F;code&gt; the target locale&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;persist&lt;&#x2F;strong&gt; &lt;code&gt;boolean$1,false&lt;&#x2F;code&gt; store locale to localStorage, next time i18n-render will init with this locale&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;rerender&lt;&#x2F;strong&gt; &lt;code&gt;boolean$2,true&lt;&#x2F;code&gt; re-render page text after change locale&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;gettext-string&quot;&gt;getText() =&amp;gt; string&lt;&#x2F;h3&gt;
&lt;p&gt;Get the i18n text of the target text with &lt;code&gt;key&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;key&lt;&#x2F;strong&gt; &lt;code&gt;string&lt;&#x2F;code&gt; the key of text in translation dict&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;locale&lt;&#x2F;strong&gt; &lt;code&gt;string$3&lt;&#x2F;code&gt; the locale want to use, &lt;strong&gt;default to current locale of i18n-render&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;fallback&lt;&#x2F;strong&gt; &lt;code&gt;string$4&lt;&#x2F;code&gt; this fallback text will be used if the target statement does not have a translation dictionary configured or if there is no corresponding language setting.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;render&quot;&gt;render()&lt;&#x2F;h3&gt;
&lt;p&gt;Render all i18n-render elements in page.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;browser-support&quot;&gt;Browser support&lt;&#x2F;h2&gt;
&lt;p&gt;The latest version of Chrome, Firefox, Edge, and Safari.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;mit-license&quot;&gt;MIT License&lt;&#x2F;h2&gt;
</description>
      </item>
      <item>
          <title>Mustang taillight spinner</title>
          <pubDate>Tue, 21 May 2019 02:09:16 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/mustang-taillight-spinner/</link>
          <guid>https://guchengf.me/blog/mustang-taillight-spinner/</guid>
          <description xml:base="https://guchengf.me/blog/mustang-taillight-spinner/">&lt;script
  data-slug-hash=&quot;LozrJK&quot;
  data-user=&quot;your_username&quot;
  data-height=&quot;500&quot;
  data-default-tab=&quot;result&quot;
  data-theme-id=&quot;8862&quot;
  class=&quot;codepen&quot;
  async
  src=&quot;&#x2F;&#x2F;codepen.io&#x2F;assets&#x2F;embed&#x2F;ei.js&quot;
&gt;&lt;&#x2F;script&gt;
</description>
      </item>
      <item>
          <title>kitty 终端模拟器常见问题</title>
          <pubDate>Mon, 29 Apr 2019 03:40:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/kitty-terminal-emulator-faq/</link>
          <guid>https://guchengf.me/blog/kitty-terminal-emulator-faq/</guid>
          <description xml:base="https://guchengf.me/blog/kitty-terminal-emulator-faq/">&lt;h2 id=&quot;mac-xia-terminfo-de-wen-ti-wu-fa-zheng-que-shi-bie-zhong-duan&quot;&gt;Mac 下 terminfo 的问题（无法正确识别终端）&lt;&#x2F;h2&gt;
&lt;p&gt;报错如：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;terminals database is inaccessible&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;xiu-fu-fang-fa&quot;&gt;修复方法：&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;tic&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &#x2F;path&#x2F;to&#x2F;kitty&#x2F;terminfo&#x2F;kitty.terminfo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;这样就自动生成了 terminfo，位于 ~&#x2F;.terminfo 下&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ssh-wu-fa-shi-yong-tmux&quot;&gt;SSH 无法使用 tmux&lt;&#x2F;h2&gt;
&lt;p&gt;报错如：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;open terminal failed: missing or unsuitable terminal: xterm-kitty&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;xiu-fu-fang-fa-1&quot;&gt;修复方法&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;kitty&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; +kitten&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; ssh&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; myserver&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;通过这种方式连接一次，SSH 就保存了 kitty 的信息，之后 ssh 就可以正常使用 tmux 了&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>The Long Way To Angular - Tabs 组件设计与开发</title>
          <pubDate>Tue, 26 Mar 2019 10:36:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/tlwta-tabs-component-in-angular/</link>
          <guid>https://guchengf.me/blog/tlwta-tabs-component-in-angular/</guid>
          <description xml:base="https://guchengf.me/blog/tlwta-tabs-component-in-angular/">&lt;p&gt;The Long Way To Angular（下文以 TLWTA代指）系列停更很久，现在考虑继续。&lt;&#x2F;p&gt;</description>
      </item>
      <item>
          <title>Debian 系统安装 Web CSS 可用字体的正确方法</title>
          <pubDate>Wed, 13 Mar 2019 07:09:04 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/how-to-install-font-on-debian/</link>
          <guid>https://guchengf.me/blog/how-to-install-font-on-debian/</guid>
          <description xml:base="https://guchengf.me/blog/how-to-install-font-on-debian/">&lt;h2 id=&quot;fang-fa-yi&quot;&gt;方法一：&lt;&#x2F;h2&gt;
&lt;p&gt;如果你的字体在 debian 的软件源中直接有维护，比如 Noto Sans CJK，那就可以直接使用 apt 安装：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;apt install fonts-noto-cjk&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;fang-fa-er&quot;&gt;方法二：&lt;&#x2F;h2&gt;
&lt;p&gt;如果需要手动安装，可以将字体放置到 &lt;code&gt;&#x2F;usr&#x2F;local&#x2F;share&#x2F;fonts&lt;&#x2F;code&gt;，然后执行 &lt;code&gt;fc-cache -fv&lt;&#x2F;code&gt;（可能需要sudo）。
如：&lt;code&gt;&#x2F;usr&#x2F;local&#x2F;share&#x2F;fonts&#x2F;poppins&#x2F;Poppins-*.ttf&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Webpack 下页面的 2x 图片解决方案</title>
          <pubDate>Fri, 25 Jan 2019 06:03:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/2x-image-in-web-with-webpack/</link>
          <guid>https://guchengf.me/blog/2x-image-in-web-with-webpack/</guid>
          <description xml:base="https://guchengf.me/blog/2x-image-in-web-with-webpack/">&lt;p&gt;随着现在高分辨率显示器（2K，4K）的普及，以及移动设备上屏幕的ppi的提高，网页上提供高分辨率的图片显得越来越重要。&lt;&#x2F;p&gt;
&lt;p&gt;在用 Webpack 构建的项目中，常见的解决方式，就是提供一张高分辨率的图片，然后在编译时压缩生成对应的低分辨率的版本，这种方法处理较为简单，但是也有一些问题：图片压缩只能是固定的压缩比例；压缩质量不好控制；代码中使用的时候诸多不便；&lt;&#x2F;p&gt;
&lt;p&gt;而现在我们在设计的时候，一般都直接提供了 1x 2x 甚至是 3x 的图片素材，也就是说，压缩这一步骤已经没有太多的必要。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;yi-kai-shi-de-si-lu&quot;&gt;一开始的思路&lt;&#x2F;h2&gt;
&lt;p&gt;所以一个简单的思路就是，按照 &lt;code&gt;original.png&lt;&#x2F;code&gt; &lt;code&gt;original@2x.png&lt;&#x2F;code&gt; 这样的形式去命名图片，然后页面中去引用，低分辨率用 &lt;code&gt;original.png&lt;&#x2F;code&gt;，高分辨率用 &lt;code&gt;original@2x.png&lt;&#x2F;code&gt;。配合 &lt;code&gt;file loader&lt;&#x2F;code&gt;，实现起来非常简单，&lt;code&gt;require&lt;&#x2F;code&gt; 1x 的图片，然后利用 &lt;code&gt;copy-webpack-plugin&lt;&#x2F;code&gt;将2x的图片复制到相同的目录，最后需要用 2x 的图片的时候，直接替换文件路径就可以。&lt;&#x2F;p&gt;
&lt;p&gt;这种方法有一个问题，就是 2x 图片不好管理，因为需要与 1x 图片的名字前缀保持一致，也就无法对 1x 图片文件名进行 hash，对于缓存控制不太好。&lt;&#x2F;p&gt;
&lt;p&gt;于是我就想，能不能在 resolve 1x 图片的同时，将 2x 图片也一起 resolve 并且把 2x 图片的 resolve 结果也返回，这样在代码中就可以同时得到 1x 和 2x 图片的引用，可以自由使用和组合。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ideal-image-loader&quot;&gt;ideal-image-loader&lt;&#x2F;h2&gt;
&lt;p&gt;找了一下，发现已经有 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Brigad&#x2F;ideal-image-loader&#x2F;&quot;&gt;ideal-image-loader&lt;&#x2F;a&gt; 这个开源的项目了，它的逻辑就是和我上面说的一样，配合 srcset，可以轻松的解决 2x 图片的问题。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;import&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; image&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;.&#x2F;abc.png&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;*&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;image:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;    x1: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;        src: &amp;quot;&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;    },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;    x2: {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;        src: &amp;quot;&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;    },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; srcset&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; `&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;${&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;image&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #9ECBFF);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;x1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #9ECBFF);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;src&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; x1, &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;${&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;image&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #9ECBFF);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;x2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #9ECBFF);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;src&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; x2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;img&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt; srcset&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;{srcset}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt; &#x2F;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;这样就实现了自动的图片 2x 控制。对于开发者来说也是无感的，非常方便。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hou-xu-de-yi-xie-wen-ti&quot;&gt;后续的一些问题&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;由于 ideal-image-loader 和 file-loader 的返回格式不一样，导致有些想要直接引用图片的地方不能正常工作了
常见的就是&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;css&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    background&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; url&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;.&#x2F;assets&#x2F;example.png&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;这些背景图片直接写在 css 中，不需要使用 2x 图片，因此只要 file-loader 就可以了。&lt;&#x2F;p&gt;
&lt;p&gt;这时有两种方案可以选择：将这些图片放到特定的文件夹，调整 rule 的include 和 exclude；或者可以通过 rule 的 issuer，所有在 css 中引入的图片，都使用 file-loader 加载。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</description>
      </item>
      <item>
          <title>Angular 中用 Subject 来做异步逻辑</title>
          <pubDate>Thu, 24 Jan 2019 01:49:21 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/use-subject-to-control-async-logic-in-angular/</link>
          <guid>https://guchengf.me/blog/use-subject-to-control-async-logic-in-angular/</guid>
          <description xml:base="https://guchengf.me/blog/use-subject-to-control-async-logic-in-angular/">&lt;p&gt;举一个例子，在 electron 的 renderer 中，使用 ipcRenderer 来做通信，为了效率起见，一般使用异步的 &lt;code&gt;send&lt;&#x2F;code&gt; 方法.&lt;&#x2F;p&gt;
&lt;p&gt;这种情况下，如果是应答式的通信，main 进程发回的通信是不方便在同一个逻辑中完成的（当然也可以在这里listen channel，但是实现起来很奇怪，并且逻辑也不清晰），因此一般都是统一管理。&lt;&#x2F;p&gt;
&lt;p&gt;如果使用 &lt;code&gt;Subject&lt;&#x2F;code&gt; 来做异步处理，会非常方便。&lt;&#x2F;p&gt;
&lt;p&gt;用如下 service 来做样例。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;typescript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;import&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; Injectable&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; NgZone&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;@angular&#x2F;core&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;import&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; Observable&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; Subject&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;rxjs&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;Injectable&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  providedIn&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;root&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;export&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; class&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #B392F0);&quot;&gt; TaskService&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 这个 map 用来保存所有 Subject&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;  tasks&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; Map&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;string&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #B392F0);&quot;&gt; Subject&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;any&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;  constructor&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;private&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; zone&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #B392F0);&quot;&gt; NgZone&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;navigator&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;userAgent&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;toLowerCase&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;indexOf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; electron&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;      const&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt;ipcRenderer&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; window&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;electron&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;      ipcRenderer&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;on&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;demo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;event&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; data&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;        &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 收到服务端返回之后，找对应的 subject，传入返回值，subscriber 就可以继续进行&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;data&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;uuid&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;tasks&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;has&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;data&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;uuid&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;          const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; subject&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;tasks&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;get&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;data&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;uuid&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;          &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 由于异步方法不在 zone 中，假如 subscriber 中有对 view 的操作，将无法正常更新，这里简单通过 zone.run 确保 subscriber 的正确执行&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt;          this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;zone&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;run&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;            subject&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;next&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;data&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;          &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; complete 解除所有 subscriber&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;          subject&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;complete&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt;          this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;tasks&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;delete&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;data&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;uuid&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;  send&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;param&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt; string&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #B392F0);&quot;&gt; Observable&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;any&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;navigator&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;userAgent&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;toLowerCase&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;indexOf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; electron&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;      const&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt;ipcRenderer&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; window&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;electron&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;      &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; renderer 和 main 之间的通信，通过 uuid 来做通信唯一 ID，main 回复的时候会返回这个 uuid&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;      const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; uuid&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; uuidv4&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;      const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; fullParam&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;        uuid&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;        param&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      }&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;      ipcRenderer&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;send&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;demo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; fullParam&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;      &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 发送之后返回 Subject，这样调用的地方就可以直接 subscribe&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;      const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; subject&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; Subject&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt;      this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;tasks&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;set&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;uuid&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; subject&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;      return&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; subject&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;asObservable&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</description>
      </item>
      <item>
          <title>Travis 中使用 Node.js child_process.spawn 时的一个文件权限问题</title>
          <pubDate>Tue, 04 Dec 2018 07:12:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/nodejs-child-process-spawn-trouble-because-of-file-permission/</link>
          <guid>https://guchengf.me/blog/nodejs-child-process-spawn-trouble-because-of-file-permission/</guid>
          <description xml:base="https://guchengf.me/blog/nodejs-child-process-spawn-trouble-because-of-file-permission/">&lt;p&gt;最近开发一个 Node 的命令行程序，其中会用到 &lt;code&gt;child_process.spawn&lt;&#x2F;code&gt; 来创建子进程做一些事情。
本地跑通了测试之后，到了 Travis 的环境下发现子进程创建不成功，debug 到 CI 服务器上之后，发现报了下面这个错误：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;spawn EACCES&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;查了一下这个错误，发现可能是因为创建子进程调用的文件权限不正确，由于我的项目中子进程的相关文件通过源代码编译生成，因此没有不在 git 的追踪中，也就无法直接控制文件权限设置。
于是就选择在 Travis 构建完项目，执行测试之前设置相关文件权限：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; chmod&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;R&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; a+rwx&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; folder&#x2F;files&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;设置之后，子进程就可以正常创建了，这个问题比较容易被忽略。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Ubuntu 下 Firefox 无法正常播放 mp3（mpeg）音频的问题</title>
          <pubDate>Mon, 26 Nov 2018 02:32:56 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/firefox-cannot-play-mp3-audio-under-ubuntu/</link>
          <guid>https://guchengf.me/blog/firefox-cannot-play-mp3-audio-under-ubuntu/</guid>
          <description xml:base="https://guchengf.me/blog/firefox-cannot-play-mp3-audio-under-ubuntu/">&lt;p&gt;最近在由于某个开发的移动平台的工作环境变成了 Firefox，在一次重新安装了 Ubuntu 系统之后，mp3 无法正常播放，提示错误大致如下&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; Warning: Cannot play media. No decoders for requested formats: audio&#x2F;mpeg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;不管是通过是 &lt;code&gt;&amp;lt;audio src&amp;gt;&amp;lt;&#x2F;audio&amp;gt;&lt;&#x2F;code&gt; 还是 &lt;code&gt;new Audio()&lt;&#x2F;code&gt; 的方式，都报出这个错误，最后总结出来三条解决方法：&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;安装 &lt;code&gt;ubuntu-restricted-extras&lt;&#x2F;code&gt; &lt;code&gt;sudo apt-get install ubuntu-restricted-extras&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;安装 &lt;code&gt;gnash&lt;&#x2F;code&gt; &lt;code&gt;sudo apt-get install gnash&lt;&#x2F;code&gt; （一个 gnu 做的 flash 播放器，其中包含了浏览器插件）
这条比较容易忽略，虽然我也不明白为什么 Firefox 调用解码器还和 flash 有关。&lt;&#x2F;li&gt;
&lt;li&gt;安装最新版的 Firefox，实测 59 版本就算满足了上面两条，还是无法正常播放，而 63 版本正常。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</description>
      </item>
      <item>
          <title>SensibleSideButtons  - MAC OS 下鼠标侧键功能完美解决方案</title>
          <pubDate>Thu, 08 Feb 2018 01:58:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/sensible-side-buttons-mac/</link>
          <guid>https://guchengf.me/blog/sensible-side-buttons-mac/</guid>
          <description xml:base="https://guchengf.me/blog/sensible-side-buttons-mac/">&lt;p&gt;一直以来，MAC 下鼠标的功能按键（比如侧键）都不能正常工作，罗技自己的驱动对鼠标型号的支持都非常有限，比如我手中的 G500s 和 G502 就不能正常支持，尝试过很多方案，都不能完美解决，最近发现了 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;sensible-side-buttons.archagon.net&#x2F;&quot;&gt;SensibleSideButtons&lt;&#x2F;a&gt; 这个应用，完美的解决了这个问题。&lt;&#x2F;p&gt;
&lt;p&gt;根据作者的描述，他一直以来也被这个问题困扰，直到后来研究了 Logitech MX Master 的技术方案，最终采用模拟 Trackpad 三指手势的方式，完美的解决了这个问题。&lt;&#x2F;p&gt;
&lt;p&gt;具体可以看作者写的技术原理和实现 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;sensible-side-buttons.archagon.net&#x2F;&quot;&gt;http:&#x2F;&#x2F;sensible-side-buttons.archagon.net&#x2F;&lt;&#x2F;a&gt;。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Electron 实录</title>
          <pubDate>Thu, 25 Jan 2018 09:54:47 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/electron-notebook/</link>
          <guid>https://guchengf.me/blog/electron-notebook/</guid>
          <description xml:base="https://guchengf.me/blog/electron-notebook/">&lt;h2 id=&quot;1-tray-tuo-pan-tu-pian-xiao-shi&quot;&gt;1. Tray（托盘图片）消失&lt;&#x2F;h2&gt;
&lt;p&gt;假如你把 &lt;code&gt;tray&lt;&#x2F;code&gt; 的实例变量定义在了函数内部（比如 &lt;code&gt;app.on(&#x27;ready&#x27;, createWindow)&lt;&#x2F;code&gt; 的回调函数内），那么当 JavaScript 引擎进行垃圾回收的时候，这个变量就会被销毁，这样 tray 的实例就没了，托盘图标就消失了。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;2-wu-fa-jin-xing-fu-zhi-nian-tie-zhi-lei-de-cao-zuo&quot;&gt;2. 无法进行复制、粘贴之类的操作&lt;&#x2F;h2&gt;
&lt;p&gt;由于默认没有绑定任何快捷键，当然操作不了，使用官方提供的下面这段代码，将各平台所有常见的菜单（快捷键）绑定好。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; template&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    label&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;Edit&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    submenu&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;undo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;redo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;type&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;separator&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;cut&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;copy&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;paste&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;pasteandmatchstyle&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;delete&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;selectall&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    label&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;View&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    submenu&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;reload&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;forcereload&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;toggledevtools&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;type&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;separator&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;resetzoom&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;zoomin&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;zoomout&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;type&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;separator&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;togglefullscreen&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;window&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    submenu&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;minimize&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;close&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;help&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    submenu&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        label&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;Learn More&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;        click&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;electron&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;shell&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;openExternal&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;https:&#x2F;&#x2F;electron.atom.io&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;process&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;platform&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; ===&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;darwin&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;  template&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;unshift&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    label&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;getName&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    submenu&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;about&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;type&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;separator&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;services&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; submenu&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;type&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;separator&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;hide&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;hideothers&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;unhide&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;type&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;separator&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;quit&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; Edit menu&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;  template&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;submenu&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;push&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;span&gt;type&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;separator&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      label&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;Speech&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      submenu&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;startspeaking&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;stopspeaking&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; Window menu&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;  template&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt;3&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;submenu&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;close&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;minimize&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;zoom&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;span&gt;type&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;separator&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;span&gt;role&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;front&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</description>
      </item>
      <item>
          <title>Unicode 200B (zero width space) 在 Web 环境的问题</title>
          <pubDate>Mon, 11 Sep 2017 01:10:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/unicode-200b-zero-width-space-in-web/</link>
          <guid>https://guchengf.me/blog/unicode-200b-zero-width-space-in-web/</guid>
          <description xml:base="https://guchengf.me/blog/unicode-200b-zero-width-space-in-web/">&lt;p&gt;最近处理一些用户录入数据时，发现有一些明明是纯数字的数据，却通过不了类型校验（无法解析成 Int&#x2F;BigInt）类型，由于一直都是通过日志查看错误，觉得很疑惑，后来找到原始数据，发现因为这个『字符串』带了一个 zero width space，导致程序异常。&lt;&#x2F;p&gt;
&lt;p&gt;zero width space 在大多数文本输出的地方都是不可见的（顾名思义，没有宽度的空格），因此通过类似页面、日志排查都很难发现这个问题。&lt;&#x2F;p&gt;
&lt;p&gt;当把这个字符串手动复制粘贴到 Chrome 的控制台时，可以看到，这个 zero width space 表现成了一个&lt;code&gt;·&lt;&#x2F;code&gt;，这应该是 Chrome 为了方便调试设计的。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;i.loli.net&#x2F;2019&#x2F;04&#x2F;25&#x2F;5cc116b7bddbd.png&quot; alt=&quot;zero width space&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;而粘贴到 iTerm 终端，则可以直接看到 Unicode 值（但是当作为日志输出到终端时，是无法显示的）&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;i.loli.net&#x2F;2019&#x2F;04&#x2F;25&#x2F;5cc116b7bf45f.jpg&quot; alt=&quot;zero width space in iTerm&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;这个字符一般来源都是用户从一些特定的平台复制而来，因此建议在类似的用户数据录入处进行一下相应处理，这里需要注意，一般语言的标准库的 trim 处理都是不会处理 zero width space 的，所以只能手动移除&lt;code&gt;\u200B&lt;&#x2F;code&gt;( 正则下)。&lt;&#x2F;p&gt;
&lt;p&gt;事实上，还有很多不可见字符，具体请参照这个回答：&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;stackoverflow.com&#x2F;a&#x2F;11305926&#x2F;2530524&quot;&gt;https:&#x2F;&#x2F;stackoverflow.com&#x2F;a&#x2F;11305926&#x2F;2530524&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Control_character#In_ASCII&quot;&gt;Control character in ASCII&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>The long way to Angular and TypeScript | Part.2</title>
          <pubDate>Thu, 31 Aug 2017 07:01:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/long-way-angular-typescript-part-2/</link>
          <guid>https://guchengf.me/blog/long-way-angular-typescript-part-2/</guid>
          <description xml:base="https://guchengf.me/blog/long-way-angular-typescript-part-2/">&lt;h2 id=&quot;yin-yan&quot;&gt;引言&lt;&#x2F;h2&gt;
&lt;p&gt;在一年多之前，我写了一篇文章《The way to Angular 2 | Part.1》介绍 Angular，最初打算持续完成一个系列，然后在我写完文章之后，Angular 和 TypeScript 都发生了相当大的变化，整个系列也搁浅了。 如今，我打算换一个角度，继续这个系列。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;wei-shen-me-yao-shi-yong-angular&quot;&gt;为什么要使用 Angular&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;i.loli.net&#x2F;2017&#x2F;08&#x2F;31&#x2F;59a7b38d97f3e.png&quot; alt=&quot;angular.io_features&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;wei-shen-me-yao-shi-yong-typescript&quot;&gt;为什么要使用 TypeScript&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;i.loli.net&#x2F;2017&#x2F;08&#x2F;31&#x2F;59a7b3901f416.png&quot; alt=&quot;www.typescriptlang.org_index.htm&quot; &#x2F;&gt;&lt;&#x2F;p&gt;</description>
      </item>
      <item>
          <title>浏览器环境下 JavaScript 生成随机字符串的科学方法（字母数字）</title>
          <pubDate>Fri, 25 Aug 2017 02:14:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/better-way-to-generate-random-bytes-in-browser/</link>
          <guid>https://guchengf.me/blog/better-way-to-generate-random-bytes-in-browser/</guid>
          <description xml:base="https://guchengf.me/blog/better-way-to-generate-random-bytes-in-browser/">&lt;h2 id=&quot;sui-ji-shu-yu-sui-ji-zi-fu-chuan&quot;&gt;随机数与随机字符串&lt;&#x2F;h2&gt;
&lt;p&gt;早前我都使用&lt;code&gt;Math.random()&lt;&#x2F;code&gt;来生成随机数，然后转成16进制字符串来生成随机字符串，后来看到了&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;9407892&#x2F;how-to-generate-random-sha1-hash-to-use-as-id-in-node-js&#x2F;14869745#14869745&quot;&gt;这个回答（stackoverflow）&lt;&#x2F;a&gt;。 &lt;code&gt;Math.random()&lt;&#x2F;code&gt; 确实不是一个好的选择，因此我需要更加科学的方法。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;window-crypto-web-cryptography-api&quot;&gt;window.crypto (Web Cryptography API)&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.w3.org&#x2F;TR&#x2F;WebCryptoAPI&quot;&gt;Web Cryptography API 已经是 W3C Recommendation 级别&lt;&#x2F;a&gt;，常见浏览器的近期版本也都已经实现了。 &lt;img src=&quot;https:&#x2F;&#x2F;i.loli.net&#x2F;2019&#x2F;04&#x2F;25&#x2F;5cc1199d2453d.png&quot; alt=&quot;Web Cryptography API in Can I Use&quot; &#x2F;&gt; 使用的时候也可以不用担心兼容性问题。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;crypto-getrandomvalues&quot;&gt;crypto.getRandomValues&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;crypto.getRandomValues&lt;&#x2F;code&gt; 是我们用来实现随机字符串的主要方法，这个方法从实现和随机性的角度来说，更加高效、可靠。 10.2.1. The getRandomValues method The getRandomValues method generates cryptographically random values. It must act as follows:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;If array is not of an integer type (i.e., Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, Uint32Array or UInt8ClampedArray), throw a TypeMismatchError and terminate the algorithm.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;If the byteLength of array is greater than 65536, throw a QuotaExceededError and terminate the algorithm.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Overwrite all elements of array with cryptographically random values of the appropriate type.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Return array.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;blockquote&gt;
&lt;p&gt;Note Do not generate keys using the getRandomValues method. Use the generateKey method instead.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;使用方法就是传入一个 Int 的数组，然后返回被加密之后的数组（覆盖原始数组）。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ke-xue-de-sui-ji-zi-fu-chuan-sheng-cheng-fang-fa&quot;&gt;科学的随机字符串生成方法&lt;&#x2F;h2&gt;
&lt;p&gt;知道了&lt;code&gt;crypto.getRandomValues&lt;&#x2F;code&gt;的使用方法之后，我们就可以来实现一个科学的随机字符串生成方法了。 首先毫无疑问我们需要一个 UintArray，这比我们手动生成随机数的数组要简单多了。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; len&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 64&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; arr&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; Uint8Array&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;len&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;假设我们要生成长度为 64 的随机字符串，len 就是 64，之所以在生成 Uint8Array 时候，要将长度除以2，是因为最终我们是通过16进制字符串的形式来输出的，并且在头部补0取末尾两位，所以只需要一半长度的 Uint8Array 就可以了。 用&lt;code&gt;crypto.getRandomValues()&lt;&#x2F;code&gt;加密这个数据&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;window&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;crypto&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;getRandomValues&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;arr&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;把这个 Uint8Array 转换成普通数组，并且把每一个值转换成16进制字符串（首位补0），取末尾2位，最后拼接到一起，就是最终的随机字符串了。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; dec2hex :: Integer -&amp;gt; String&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; dec2hex&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;dec&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;  return&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; dec&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;toString&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt;16&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;substr&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; generateId :: Integer -&amp;gt; String&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; generateId&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;len&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 40&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;  const&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; arr&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; Uint8Array&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;len&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;  window&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;crypto&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;getRandomValues&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;arr&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;  return&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; Array&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;arr&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; dec2hex&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;join&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;使用这个方法来生成随机字符串，更加高效、科学、可靠。 gist: &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;gist.github.com&#x2F;gucheen&#x2F;f6f302f090e7581b2b2cf22faa125a44&quot;&gt;Generate random string&#x2F;characters in JavaScript&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>在 neovim 退出时，重设终端（iTerm2）光标</title>
          <pubDate>Fri, 18 Aug 2017 06:37:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/reset-termial-cursor-when-exit-neovim/</link>
          <guid>https://guchengf.me/blog/reset-termial-cursor-when-exit-neovim/</guid>
          <description xml:base="https://guchengf.me/blog/reset-termial-cursor-when-exit-neovim/">&lt;h2 id=&quot;wen-ti&quot;&gt;问题&lt;&#x2F;h2&gt;
&lt;p&gt;出于个人习惯，我在终端模拟器（iTerm2 等）中，都是将光标（cursor）设置为 vertical bar，而在 neovim 中则是将 normal 模式的光标设置为 block。&lt;&#x2F;p&gt;
&lt;p&gt;这样一来，当我从 neovim 的正常模式退出时，导致终端的光标样式也变成了 block，非常麻烦。主要是因为终端没有提供 API 查询当前的光标样式设置，因此 neovim 在退出时也不知道要如何重设光标。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;jie-jue&quot;&gt;解决&lt;&#x2F;h2&gt;
&lt;p&gt;思路就是退出 neovim 的时候把光标重新设置为 vertical bar(ver25)。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;viml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt; $TERM_PROGRAM &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;~&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;iTerm&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;  &amp;quot; &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;reset cursor when vim exits&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;  au &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;VimLeave&lt;&#x2F;span&gt;&lt;span&gt; * &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt; guicursor&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;a:ver25&lt;&#x2F;span&gt;&lt;span&gt;-blinkon0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;endif&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;其中&lt;code&gt;ver25&lt;&#x2F;code&gt;就是想要设置的样式，也可以是&lt;code&gt;block&lt;&#x2F;code&gt;等等，这样在退出 neovim 的时候就会重新将 iTerm2 的光标设置为 vertical bar。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>迁移评论系统到 hashover</title>
          <pubDate>Fri, 28 Apr 2017 06:34:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/transfer-comments-system-to-hashover/</link>
          <guid>https://guchengf.me/blog/transfer-comments-system-to-hashover/</guid>
          <description xml:base="https://guchengf.me/blog/transfer-comments-system-to-hashover/">&lt;p&gt;鉴于 disqus 在国内访问越来越慢，资源和数据请求量越来越大，严重拖慢了页面加载，而且博客也只需要一个简单的评论对话系统，所以开始考虑进行评论系统的迁移。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ti-dai-fang-an-hashover&quot;&gt;替代方案 – hashover&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jacobwb&#x2F;hashover-next&quot;&gt;hashover&lt;&#x2F;a&gt; 满足了我对评论系统的期望，简单，数据本地化，可以轻松迁移。&lt;&#x2F;p&gt;
&lt;p&gt;hashover 的评论数据存储默认基于网站的 path，这就使得在迁移的过程中，只要网站的 path 没变，那么相应的评论数据就可以自动对应。&lt;&#x2F;p&gt;
&lt;p&gt;基于 PHP 也使得它在部署时非常方便，对于 WordPress 的运行环境来说是无缝的。&lt;&#x2F;p&gt;
&lt;p&gt;我选择把 hashover 的数据都直接保存在本地，这样如果以后我有迁移的需求，直接将 hashover 打包传输到新的地方，就可以完成迁移工作。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;disqus-to-hashover&quot;&gt;disqus to hashover&lt;&#x2F;h2&gt;
&lt;p&gt;原先的评论系统是 disqus，所以需要转换到 hashover 的数据存储，在网上找到一个原始的转换器 https:&#x2F;&#x2F;github.com&#x2F;ianrenton&#x2F;disqus-to-hashover ，但是它只支持 hashover 1.0 的版本，而我直接使用了 next(2.0) 的版本，所以 fork 了一份，并做了一些改动，使它适配了 2.0 的版本，并且完善了 gravatar 头像的数据支持。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;gucheen&#x2F;disqus-to-hashover-next&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;gucheen&#x2F;disqus-to-hashover-next&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>当我试图 extends 一个被 connect 装饰过的 React Component 时</title>
          <pubDate>Mon, 10 Apr 2017 06:43:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/when-i-try-to-extends-a-connected-component/</link>
          <guid>https://guchengf.me/blog/when-i-try-to-extends-a-connected-component/</guid>
          <description xml:base="https://guchengf.me/blog/when-i-try-to-extends-a-connected-component/">&lt;h2 id=&quot;wen-ti&quot;&gt;问题&lt;&#x2F;h2&gt;
&lt;p&gt;起因是这样的，一开始在项目中写了一个原始的 Popup 组件（通过 react-redux 的 connect 方法接入 redux)，后来有了一个更高级的需求，我就想要直接 extends 这个原始的 Popup 组件，然后覆写一些方法。 然后遇到了一个问题，继承之后的子组件没有父组件的自定义方法。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;jie-yi&quot;&gt;解疑&lt;&#x2F;h2&gt;
&lt;p&gt;最初一度怀疑是否是 babel 的 decorator 插件有问题（毕竟不是浏览器天然支持的特性），但是仔细看了 decorator 插件的源码，发现并不存在这种问题。 后来在这个插件的 issues 里看到了这么一个 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;loganfsmyth&#x2F;babel-plugin-transform-decorators-legacy&#x2F;issues&#x2F;16&quot;&gt;issue&lt;&#x2F;a&gt;，问题并不算是同一个，但是作者提到，&lt;code&gt;react-redux&lt;&#x2F;code&gt; 的 &lt;code&gt;connect&lt;&#x2F;code&gt; 方法可能实现有一些问题（当然这个地方并不是），我就想到去看看 connect 的实现。 然后就看到了底层方法 &lt;code&gt;connectAdvanced&lt;&#x2F;code&gt; 中有这么一句代码：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;export default connectAdvanced() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &#x2F;&#x2F; ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    return hoistStatics(Connect, WrappedComponent);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;hoistStatics 是一个第三方库 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mridgway&#x2F;hoist-non-react-statics&quot;&gt;hoist-non-react-statics&lt;&#x2F;a&gt;，它干的事情也比较简单：&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Copies non-react specific statics from a child component to a parent component. Similar to Object.assign, but with React static keywords blacklisted from being overridden.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;简单来说，就是复制所有非 React 自有的属性，因为使用了 &lt;code&gt;Object.getOwnPropertyNames()&lt;&#x2F;code&gt;的方法，所以我们定义在 Component 上的所有方法就不会被复制到这个新的对象上了。 而在 &lt;code&gt;connectAdvanced&lt;&#x2F;code&gt; 内部，render 时实际是这样的：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;render() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  const selector = this.selector&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  selector.shouldComponentUpdate = false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  if (selector.error) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      throw selector.error&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  } else {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      return createElement(WrappedComponent, this.addExtraProps(selector.props))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;通过 &lt;code&gt;createElement&lt;&#x2F;code&gt; 方法给原始的 &lt;code&gt;WrappedComponent&lt;&#x2F;code&gt; 传入额外的 props，来实现 connect 的效果。 总之，最终 connect 方法返回这个对象，其实和原始的 Component 的结构并不一样，虽然它的 &lt;code&gt;WrappedComponent&lt;&#x2F;code&gt; 属性指向了原始的 Component，但是显然在我们的场景下，并不能使用。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;na-zen-me-ban-ni&quot;&gt;那怎么办呢&lt;&#x2F;h2&gt;
&lt;p&gt;通常的推荐解决方式就是『高阶组件』，这样就屏蔽了 connect 的逻辑。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;wei-shen-me-yao-yong-hoist-non-react-statics-zhe-chong-mo-shi&quot;&gt;为什么要用 hoist-non-react-statics 这种模式&lt;&#x2F;h2&gt;
&lt;p&gt;关于这个问题，作者在 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;reactjs&#x2F;react-redux&#x2F;pull&#x2F;270#issuecomment-175312623&quot;&gt;这一个 issue 的回答中&lt;&#x2F;a&gt; 也说了很多，总结来说，就是为了避免使用者可以直接的接触到 connect 之后的组件的内部方法，防止因为各种改动导致组件的 &quot;break&quot;，这也算是为了提升健壮性。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>从零开始的 Web 前端性能优化 – 规则</title>
          <pubDate>Fri, 10 Mar 2017 06:46:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/improve-web-performance/</link>
          <guid>https://guchengf.me/blog/improve-web-performance/</guid>
          <description xml:base="https://guchengf.me/blog/improve-web-performance/">&lt;blockquote&gt;
&lt;p&gt;build delightful, modern, responsive web experiences. — Google Web Fundamentals&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;yin-yan&quot;&gt;引言&lt;&#x2F;h2&gt;
&lt;p&gt;前端的性能指标在通常情况下是一个很难量化的指标，面向的用户群体和环境复杂，在现有条件下，网页的绝对性能仍然取决于用户的网络连接。&lt;&#x2F;p&gt;
&lt;p&gt;因此本文基本参考 Google 在 PageSpeed Insights 中的标准，考量点都是与网络无关的因素：服务器配置、网页的 HTML 结构及其所用的外部资源。&lt;&#x2F;p&gt;
&lt;p&gt;实际上前端的性能优化，非常依赖于开发者的经验，技术和环境的快速发展，大多数开发者还没能建立起完善、可靠的性能优化体系。因此，我更喜欢参考大型企业的标准，来制定优化规则。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;performance&quot;&gt;Performance&lt;&#x2F;h2&gt;
&lt;p&gt;首先要提到这个单词，一般来说，它可以被翻译成高性能，不过，在前端领域，其实 Performance 还有另外一层含义，『高表现力』。&lt;&#x2F;p&gt;
&lt;p&gt;高表现力就意味着高可用性、高易用性和高度的用户友善设计。不过这些内容层次太高，本文只讨论高性能这一个环节。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;da-xing-qi-ye-de-biao-zhun&quot;&gt;大型企业的标准&lt;&#x2F;h2&gt;
&lt;p&gt;从 Google 建立以来，它一直是这个世界上最顶尖的 Web 技术开发和使用者之一，我认为它所施行和推广的 Web 技术体系，是可以作为我们开发过程中的有效参考的。&lt;&#x2F;p&gt;
&lt;p&gt;首先要介绍的是两个 Google 下属的直接面向前端性能优化的项目，PageSpeed 和 Web Fundamentals。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;pagespeed&quot;&gt;PageSpeed&lt;&#x2F;h3&gt;
&lt;p&gt;PageSpeed 是个历史悠久的项目，从建立以来就是针对高性能的网站开发。它的工作流程就是，抓取网页，按照一定的规则去分析网页，给出参考的性能评分和优化建议。&lt;&#x2F;p&gt;
&lt;p&gt;所以首先要看的就是它的规则。在性能方面，PageSpeed 的规则概括为以下几条：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Avoid landing page redirects&lt;&#x2F;li&gt;
&lt;li&gt;Enable compression&lt;&#x2F;li&gt;
&lt;li&gt;Improve server response time&lt;&#x2F;li&gt;
&lt;li&gt;Leverage browser caching&lt;&#x2F;li&gt;
&lt;li&gt;Minify resources&lt;&#x2F;li&gt;
&lt;li&gt;Optimize images&lt;&#x2F;li&gt;
&lt;li&gt;Optimize CSS Delivery&lt;&#x2F;li&gt;
&lt;li&gt;Prioritize visible content&lt;&#x2F;li&gt;
&lt;li&gt;Remove render-blocking JavaScript&lt;&#x2F;li&gt;
&lt;li&gt;Use asynchronous scripts&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;在这些规则之中，有一些是已经成为成熟的方案，而被广泛采用，成为整个技术实现的基本环节，这些规则不再需要阐述，因为大家都在这么做了，比如 Enable compression (gzip 压缩）。所以下面只介绍一些比较容易被忽略的问题。&lt;&#x2F;p&gt;
&lt;h4 id=&quot;1-avoid-landing-page-redirects&quot;&gt;1. Avoid landing page redirects&lt;&#x2F;h4&gt;
&lt;p&gt;先介绍一下 Landing Page，根据 Wiki 的定义&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;a single web page that appears in response to clicking on a search engine optimized search result or an online advertisement.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;简单来说就是用户从另一个页面（站点）跳转到目标站点的入口页面，通常情况下就是网站的首页。所以这条规则就是&lt;strong&gt;避免首页的重定向&lt;&#x2F;strong&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;理由也很简单，最好的情况下，每一次重定向就增加一次往返（HTTP 请求-响应），而糟糕的情况下就会增加很多次。每一次的往返中包含了 DNS 查询，TCP 握手，TLS 认证环节。&lt;&#x2F;p&gt;
&lt;p&gt;以 Snow&#x2F;Beef （主站退单&#x2F;手淘退单）为例。为了区分不同的订单退单情况，这两个项目都使用服务器端跳转来引导客户端页面转向到对应的路由（业务逻辑）。&lt;&#x2F;p&gt;
&lt;p&gt;那么从用户的角度来说，这里就多了一次往返逻辑，用户需要多等待一次请求&#x2F;响应，然后再进入对应的页面。当然，这也是因为受限于客户端（APP）的 WebView 环境而选择一种解决方案。&lt;&#x2F;p&gt;
&lt;h4 id=&quot;2-optimize-images&quot;&gt;2. Optimize images&lt;&#x2F;h4&gt;
&lt;p&gt;这个问题主要发生在一些设计素材上，为了保证高度还原而选择高质量的图片，就忽略了图片的大小。&lt;&#x2F;p&gt;
&lt;p&gt;有时候也可以适当考虑，使用 CSS 来实现，以减小图片的使用率。&lt;&#x2F;p&gt;
&lt;h4 id=&quot;tao-lun&quot;&gt;讨论&lt;&#x2F;h4&gt;
&lt;p&gt;如同上文所说，这些规则基本上已经成为了业界广泛采用的标准，以现在的环境来看，这些大方向上的实践已经没有太多问题。因此，如果想要更进一步的提升页面性能，那就需要更加细致的挖掘。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;web-fundamentals&quot;&gt;Web Fundamentals&lt;&#x2F;h3&gt;
&lt;p&gt;Web Fundamentals 是 Google 2014 年发起的项目。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;The fundamental knowledge you need to build delightful, modern, responsive web experiences.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;项目总结也很简单：提供令人赏心悦目的现代化响应式 Web 体验所必须的基础知识。其中有一个章节『Performance』着重介绍了网页性能这一块的知识，并且，由于项目较新，所以讨论到的内容以及技术也适应了新的环境，比较有参考价值。&lt;&#x2F;p&gt;
&lt;h4 id=&quot;gai-shu&quot;&gt;概述&lt;&#x2F;h4&gt;
&lt;p&gt;这个章节这样总结提高性能的技巧：提高性能表现的过程要从最小化，或者至少从优化用户下载数据开始。提高代码效率的前提是要理解浏览器是如何渲染这些文件的。最后，你需要一些方法来测试你的优化的效果。&lt;&#x2F;p&gt;
&lt;p&gt;最小化（优化）数据内容大小，提高代码效率，测试优化效果。这些就是一个完整的优化方法。&lt;&#x2F;p&gt;
&lt;h4 id=&quot;1-optimizing-content-efficiency&quot;&gt;1. Optimizing Content Efficiency&lt;&#x2F;h4&gt;
&lt;p&gt;这一节都是关于如何优化『delivery』的效率，作者总结了几个要点：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;限制不必要的下载&lt;&#x2F;li&gt;
&lt;li&gt;优化文本类型资源的编码和传输大小&lt;&#x2F;li&gt;
&lt;li&gt;优化图片&lt;&#x2F;li&gt;
&lt;li&gt;优化 Web Font&lt;&#x2F;li&gt;
&lt;li&gt;HTTP 缓存&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;对比一下之前在 PageSpeed 一节提到的优化点，这里新增了『限制不必要的下载』、『优化 Web Font』。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;限制不必要的下载现在在我们的项目体系中，开源项目占了越来越大的比重，模块化的概念越来越深入，在开发过程中，我们会引入相当多的第三方资源，所以仔细检查这些资源，并认真考量它们是否有必要被引入。同时，对于多页面应用，应该检查每个页面是否只下载了它所需要的资源。 当然，还需要优化资源的大小，以及优化它的技术实现。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;优化 Web Font 这种技术其实受硬件发展的影响更多一点，网络的发展，使得页面可以更快地加载越来越多、越来越大的资源，所以更加丰富的 Web Font 也流行起来。带来的问题是，资源大小的增加和页面文字重新渲染的问题。&lt;&#x2F;p&gt;
&lt;p&gt;以金融运营平台为例，引入了 Font-awesome、Glyphicon 两种 Web Font（icon font），Font-awesome 用来处理各种图标，而 Glyphicon 是因为 ui-grid 这个库依赖于它。两个 Web Font 其实非常大，并且 Glyphicon 只有 ui-grid 使用了，并且用到的字体非常少。在后续优化中，针对 Glyphicon 的 CSS 设计，使用 Font-awesome 写了替代规则，从而移除了 Glyphicon。&lt;&#x2F;p&gt;
&lt;p&gt;文章中其实提供了相当多的 Web Font 优化技巧，也可以作为很好的参考。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h4 id=&quot;2-critical-rendering-path&quot;&gt;2. Critical Rendering Path&lt;&#x2F;h4&gt;
&lt;p&gt;浏览器在获取 HTML，CSS 和 JavaScript 文件之后，将他们渲染成页面上每一个对应的像素，所经过的步骤就是 critical rendering path，就是也就是概述中提到的理解浏览器如何渲染页面。当然，浏览器引擎对于大多数人来说还是太复杂、太深奥了一点，我们可以了解一下简略的内容。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Constructing the Object Model第一步简单来说就是构建 DOM 和 CSSOM 树。所以很显然，为了浏览器可以尽快的渲染页面，我们必须尽快地把 HTML 和 CSS 交给浏览器。这就是为什么我们说要把 CSS 资源写在 &lt;code&gt;head&lt;&#x2F;code&gt; 标签中，而把 JavaScript 资源写在 &lt;code&gt;body&lt;&#x2F;code&gt; 标签的结尾处，为了让浏览器优先获取 HTML 和 CSS，不让 JavaScript 阻塞页面渲染。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Render-tree Construction, Layout, and Paint 上一部已经生成了 DOM 和 CSSOM 树，这一个步骤首先就是要把它们合并成 Render 树。要注意的是，Render 树只会包含渲染页面所需要的节点。接着 Layout 引擎会计算每一个对象的位置和大小。最后把 Render 树渲染到屏幕上。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Render Blocking CSS 首先要了解，HTML 和 CSS 都是阻塞性的资源，浏览器在处理完 CSSOM 之前，不会进行任何渲染动作，所以我们保证 CSS 资源的加载速度。&lt;&#x2F;p&gt;
&lt;p&gt;另外，Media type 和 Media query 是可以把 CSS 标记为非阻塞形式，这样就可以保证浏览器只处理需要的资源。不过即使是这样，浏览器还是需要先把所有 CSS 资源下载完成，所以，依然需要保证 CSS 资源的优化。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Adding Interactivity with JavaScript 同样，JavaScript 也会阻塞 DOM 的构建，延长页面的渲染时间，所以确保只加载必须的 JavaScript 的资源，同时，不会影响到页面功能的 JavaScript 资源使用异步加载（或 async 特性），来提高页面渲染速度。&lt;&#x2F;p&gt;
&lt;p&gt;async 这种特性，使用的比较多的，就是各类页面分析、页面监控服务的 JavaScript 库，因为它们的逻辑和页面主线功能互不影响。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;到这里为止，页面的渲染就完成了，在这之后，作者还分享了针对 Critical Rendering Path 的各种优化方法，可以进一步了解学习（都包括在文末参考文献中）。&lt;&#x2F;p&gt;
&lt;h4 id=&quot;3-rendering-performance&quot;&gt;3. Rendering Performance&lt;&#x2F;h4&gt;
&lt;p&gt;这一节的主要内容就是如何提升你的代码效率。毫无疑问，你需要了解浏览器处理 HTML，CSS 和 JavaScript 的方式。作者提到：高性能的页面，不仅仅是加载迅速，同时还要能正确地运行；页面滚动必须无延迟跟随手指，动画和交互必须如丝般顺滑，这就是所说的『令人赏心悦目的 Web 体验』。&lt;&#x2F;p&gt;
&lt;p&gt;绝大部分设备 1 秒钟刷新屏幕 60 次，这就是我们说的页面动画必须达到 60 fps 的原因，然后简单计算一下的话，每一帧有 16 毫秒时间，除去浏览器工作的开销，基本上我们在一帧之内有 10 毫秒的时间来完成我们的各种工作，那么，如果说某一个任务超过了 10 毫秒，就会带来一个直观的感受，『页面卡了』。&lt;&#x2F;p&gt;
&lt;p&gt;浏览器的一次工作流程就是：&lt;strong&gt;JavaScript &amp;gt; Style &amp;gt; Layout &amp;gt; Paint &amp;gt; Composite&lt;&#x2F;strong&gt; 所以也很容易理解，为了提升页面效率，就需要尽可能地减少浏览器的工作步骤，而在上面的五个步骤中，&lt;strong&gt;Layout 和 Paint 是可以被避免的，这就是我们优化的关键&lt;&#x2F;strong&gt;。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Optimize JavaScript Execution简单来说，在不恰当的时间点运行的 JavaScript 或者运行周期比较长的 JavaScript 代码，就会导致性能问题，这些就是优化的关键点。&lt;&#x2F;p&gt;
&lt;p&gt;当然，首先了解到，实际上在浏览器中执行的代码和你写的 JavaScript 代码并不一样，现代浏览器都采用了 JIT 编译器来优化你写的代码，以提升运行效率，不过这是比较复杂的问题了，我们还是从简单的地方入手。&lt;&#x2F;p&gt;
&lt;p&gt;先了解一个概念 Visual Changes，就是那些不会直接影响页面样式的代码逻辑，比如查找数据和数据排序。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;避免使用 setTimeout 和 setInterval 来进行 Visual Change 操作，使用 requestAnimationFrame 来进行替代。&lt;&#x2F;li&gt;
&lt;li&gt;把耗时较长的 JavaScript 移动到 Web Worker 中执行，和主线程分离。&lt;&#x2F;li&gt;
&lt;li&gt;细化 JavaScript 任务，使得 DOM 的变化分布到不同的帧中。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Reduce the Scope and Complexity of Style Calculations这一条很好理解，降低样式的复杂度。由于每一次 DOM 的变更，浏览器都需要重新计算元素样式，进行 Layout（或者 reflow），所以降低样式复杂度，是提升页面渲染效率的很重要的一环。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;降低选择器的复杂度；使用以 class 为中心的 CSS 设计模式，比如 BEM。&lt;&#x2F;li&gt;
&lt;li&gt;减少样式计算会涉及到的元素数量。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Avoid Large, Complex Layouts and Layout ThrashingLayout 就是浏览器计算元素在页面内的位置和大小的过程。和样式计算类似，Layout 的开销收到需要进行 Layout 计算的元素的数量，以及一次 Layout 的复杂程度的影响。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Layout 通常情况下会包括整个 document。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;DOM 元素的数量会影响性能；应该尽可能避免触发 Layout。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;评估 Layout 模型的性能；新的 Flexbox 模型通常要比旧的 Flexbox 模型以及基于 Float 的模型要更快。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;避免强制同步 Layout（在 JavaScript 执行之前强制浏览器执行 Layout 动作，请参考上文浏览器 render 的过程），以及 Layout 抖动；先读取样式值，然后再进行写入操作。当任何几何属性发生变更的时候（比如 width, height, left, top)，都会触发 Layout。&lt;&#x2F;p&gt;
&lt;p&gt;Layout 是开销非常大的操作，应该在可能的情况下避免它。对于 Flexbox，目前主流浏览器都已经支持了 Flex 布局，在环境允许的情况下，应当优先选择 Flexbox，并且使用新的规范。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Paint Complexity and Reduce Paint Areas Paint 通常是整个渲染过程中运行时间最长的任务。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;除了 transform 和 opacity 之外的任何属性变更都会触发 paint。&lt;&#x2F;li&gt;
&lt;li&gt;paint 一般是渲染流程中开销最大的部分。&lt;&#x2F;li&gt;
&lt;li&gt;通过图层提升和动画编排来减少需要 paint 的区域。&lt;&#x2F;li&gt;
&lt;li&gt;Chrome DevTools 可以获取 paint 的分析数据。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;这里提到了图层提升这个概念，就类似于 Sketch、GIMP、Photoshop 中的图层，不同的独立图层可以单独计算并最终合并。&lt;&#x2F;p&gt;
&lt;p&gt;在 CSS 中，&lt;code&gt;will-change&lt;&#x2F;code&gt; 属性会创建一个新的图层，然后把值设为 &lt;code&gt;transform&lt;&#x2F;code&gt; 就会创建一个合成器层。这个方法支持 Chrome、Opera、Firefox。&lt;&#x2F;p&gt;
&lt;p&gt;那么对于那些不支持的浏览器，就只能使用 3D 变形来创建一个新的图层。利用&lt;code&gt;transform: translateZ(0)&lt;&#x2F;code&gt; 强制进行 3D 变形。需要注意，创建新的图层会增加内存和管理开销，所以需要合理安排图层。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Stick to Compositor-Only Properties and Manage Layer Count 这一节深入探讨了合成器的概念，如果对于动画性能优化有兴趣，可以深入了解一下。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Debounce Your Input Handlers 对各种输入操作的处理进行防抖。输出操作的处理是一个潜在的性能问题，他们可能会阻塞帧的计算，并且增加额外的、不必要的 Layout 任务。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;避免长时间的输入操作处理任务；它们会阻止页面滚动。&lt;&#x2F;li&gt;
&lt;li&gt;不要在输出操作处理任务中进行样式变更。&lt;&#x2F;li&gt;
&lt;li&gt;对处理任务进行防抖；存储事件参数，并且在下一个 &lt;code&gt;requestAnimationFrame&lt;&#x2F;code&gt; 的回调中进行样式变更。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;这里举出实际的例子就是，如果监听了 &lt;code&gt;touchstart&lt;&#x2F;code&gt;, &lt;code&gt;touchmove&lt;&#x2F;code&gt;, &lt;code&gt;touchend&lt;&#x2F;code&gt; 之类的事件，并且调用了 &lt;code&gt;preventDefault()&lt;&#x2F;code&gt; 那么合成器线程就必须要等待你的事件回调结束，在这段时间内，滚动操作就会被阻止。&lt;&#x2F;p&gt;
&lt;p&gt;事实上，即使你没有调用 &lt;code&gt;preventDefault()&lt;&#x2F;code&gt; 合成器也还是要等待，就会导致用户的滚动操作被锁住，出现丢帧之类的问题。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;cong-gui-ze-dao-shi-jian&quot;&gt;从规则到实践&lt;&#x2F;h2&gt;
&lt;p&gt;以『前端』、『性能』、『优化』之类的关键词 Google 一下，可以得到数不清的结果，关于各类优化的奇巧淫技，不需要累述，我们更需要关注的是，如何有效、高效、科学地进行性能优化，就如同我们优化页面性能一样，去优化我们的开发过程。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;can-kao-wen-xian&quot;&gt;参考文献&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;developers.google.com&#x2F;speed&#x2F;docs&#x2F;insights&#x2F;rules&quot;&gt;PageSpeed Insights Rules&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;developers.google.com&#x2F;web&#x2F;fundamentals&#x2F;performance&#x2F;&quot;&gt;Web Fundamentals – Performance&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</description>
      </item>
      <item>
          <title>Grafana 二次开发指南（前端）</title>
          <pubDate>Tue, 06 Sep 2016 06:48:46 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/grafana-develop-guide-front-end/</link>
          <guid>https://guchengf.me/blog/grafana-develop-guide-front-end/</guid>
          <description xml:base="https://guchengf.me/blog/grafana-develop-guide-front-end/">&lt;h1 id=&quot;qian-duan-xiang-mu&quot;&gt;前端项目&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;qi-dong-liu-cheng&quot;&gt;启动流程&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;页面载入之后，引入的脚本是 boot.js，由 es2015 的 shim，systemjs，systemjs 的配置文件和 boot.js 组成。&lt;&#x2F;li&gt;
&lt;li&gt;执行 boot。设定 cache 时间，import &lt;code&gt;app&#x2F;app.js&lt;&#x2F;code&gt;，执行 init 函数。&lt;&#x2F;li&gt;
&lt;li&gt;init 过程，生成 GrafanaAPP。
&lt;ol&gt;
&lt;li&gt;从 &lt;code&gt;app&#x2F;core&#x2F;config&lt;&#x2F;code&gt; 引入配置参数，实际配置参数是 &lt;code&gt;app&#x2F;core&#x2F;settings.js&lt;&#x2F;code&gt;。&lt;&#x2F;li&gt;
&lt;li&gt;定义依赖，ngModuleDependencies（第三方模块），核心模块 &lt;code&gt;app&#x2F;core&#x2F;core&lt;&#x2F;code&gt;（controller, directive…），功能模块（’app&#x2F;features&#x2F;all’）&lt;&#x2F;li&gt;
&lt;li&gt;Systemjs 加载所有功能模块之后，向模块里注入providers。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;angular app 的初始设置由后端直接渲染到页面中，页面文件 &lt;code&gt;public&#x2F;views&#x2F;index.html&lt;&#x2F;code&gt;，参数是 &lt;code&gt;window.grafanaBootData&lt;&#x2F;code&gt;。&lt;&#x2F;li&gt;
&lt;li&gt;app 启动时会自动加载所有在 &lt;code&gt;app&#x2F;featrures&#x2F;all.js&lt;&#x2F;code&gt; 中声明过的模块，所以如果有新的功能模块，确保它最终在该文件中声明了。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;kai-fa-shuo-ming&quot;&gt;开发说明&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;app&#x2F;core&#x2F;utils&#x2F;kbn.js&lt;&#x2F;code&gt; 是各类格式化函数。&lt;&#x2F;li&gt;
&lt;li&gt;如何定义模块
&lt;ol&gt;
&lt;li&gt;typescript 编写的模块按照 ES2015 的模块化语法编写。&lt;&#x2F;li&gt;
&lt;li&gt;JavaScript 编写的模块按照 AMD 格式定义。依赖会自动注入。root 目录是 public。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;引入新的第三方模块。
&lt;ol&gt;
&lt;li&gt;可以直接放入 public 下的 vendor 目录，然后在 &lt;code&gt;app&#x2F;system.conf.js&lt;&#x2F;code&gt; 中加入定义，之后可以直接通过模块名加载。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;如果是 angular 的模块，在 &lt;code&gt;app&#x2F;app.ts&lt;&#x2F;code&gt; 中的 &lt;code&gt;ngModuleDependencies&lt;&#x2F;code&gt; 数组中加入模块名来加载它。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;shu-ju&quot;&gt;数据&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;dashboard controller 初始化完成之后，会通过 dashboardSrv 创建新的 dashboard 数据对象，然后在 dashboard_ctrl 的 setupDashboardInternal 方法中初始化各个注册的模块。&lt;&#x2F;li&gt;
&lt;li&gt;如果你添加了新的功能模块，需要依赖 dashboard 数据，可以在 dashboard_ctrl 中注入 service 方法，然后在 setupDashboardInternal 进行 init 动作。&lt;&#x2F;li&gt;
&lt;li&gt;所有需要持久化的数据都挂载在 dashboard 数据对象下，如果有新的需要持久化的数据，可以挂载在 dashboard 数据对象下，注意避免 key 的冲突。每次用户保存 dashboard 的时候，dashboard 数据对象就会提交到后端保存。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</description>
      </item>
      <item>
          <title>【译】通过 Webpack 实现 AngularJS 的延迟加载</title>
          <pubDate>Tue, 01 Mar 2016 06:54:25 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/lazy-load-angularjs-with-webpack/</link>
          <guid>https://guchengf.me/blog/lazy-load-angularjs-with-webpack/</guid>
          <description xml:base="https://guchengf.me/blog/lazy-load-angularjs-with-webpack/">&lt;blockquote&gt;
&lt;p&gt;原文链接：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;michalzalecki.com&#x2F;lazy-load-angularjs-with-webpack&#x2F;&quot;&gt;http:&#x2F;&#x2F;michalzalecki.com&#x2F;lazy-load-angularjs-with-webpack&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;随着你的单页应用扩大，其下载时间也越来越长。这对提高用户体验不会有好处（提示：但用户体验正是我们开发单页应用的原因）。更多的代码意味着更大的文件，直到代码压缩已经不能满足你的需求，你唯一能为你的用户做的就是不要再让他一次性下载整个应用。这时，延迟加载就派上用场了。不同于一次性下载所有文件，而是让用户只下载他现在需要的文件。&lt;&#x2F;p&gt;
&lt;p&gt;所以。如何让你的应用程序实现延迟加载？它基本上是分成两件事情。把你的模块拆分成小块，并实施一些机制，允许按需加载这些块。听起来似乎有很多工作量，不是吗？如果你使用 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;webpack.github.io&#x2F;&quot;&gt;Webpack&lt;&#x2F;a&gt; 的话，就不会这样。它支持开箱即用的代码分割特性。在这篇文章中我假定你熟悉 Webpack，但如果你不会的话，这里有一篇介绍 。为了长话短说，我们也将使用 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;angular-ui&#x2F;ui-router&quot;&gt;AngularUI Router&lt;&#x2F;a&gt; 和 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ocombe&#x2F;ocLazyLoad&quot;&gt;ocLazyLoad&lt;&#x2F;a&gt; 。&lt;&#x2F;p&gt;
&lt;p&gt;代码可以在 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;MichalZalecki&#x2F;angular-lazyload-webpack&quot;&gt;GitHub&lt;&#x2F;a&gt; 上。你可以随时 fork 它。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;webpack-de-pei-zhi&quot;&gt;Webpack 的配置&lt;&#x2F;h2&gt;
&lt;p&gt;没什么特别的，真的。实际上从你可以直接从文档中复制然后粘贴，唯一的区别是采用了 &lt;code&gt;ng-annotate&lt;&#x2F;code&gt; ，以让我们的代码保持简洁，以及采用 &lt;code&gt;babel&lt;&#x2F;code&gt; 来使用一些 ECMAScript 2015 的魔法特性。如果你对 ES6 感兴趣，可以看看&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;michalzalecki.com&#x2F;ecmascript-6-overview&#x2F;&quot;&gt;这篇以前的帖子&lt;&#x2F;a&gt; 。虽然这些东西都是非常棒的，但是它们都不是实现延迟加载所必需的东西。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; webpack.config.js&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; config&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  entry&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    app&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;.&#x2F;src&#x2F;core&#x2F;bootstrap.js&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  output&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    path&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;     __dirname&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&#x2F;build&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    filename&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;bundle.js&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  resolve&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    root&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; __dirname&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&#x2F;src&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  module&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    noParse&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    loaders&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt; test&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #9ECBFF);&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #85E89D);&quot;&gt;\.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;js&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; exclude&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #9ECBFF);&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;node_modules&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        loader&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;ng-annotate!babel&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      {&lt;&#x2F;span&gt;&lt;span&gt; test&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #9ECBFF);&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #85E89D);&quot;&gt;\.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;html&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; loader&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;raw&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;module&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;exports&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; config&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;ying-yong&quot;&gt;应用&lt;&#x2F;h2&gt;
&lt;p&gt;应用模块是主文件，它必须被包括在 &lt;code&gt;bundle.js&lt;&#x2F;code&gt; 内，这是在每一个页面上都需要强制下载的。正如你所看到的，我们不会加载任何复杂的东西，除了全局的依赖。不同于加载控制器，我们只加载路由配置。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; app.js&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;use strict&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;export&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; default&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;angular&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;module&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;lazyApp&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;    require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;angular-ui-router&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;    require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;oclazyload&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;    require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;.&#x2F;pages&#x2F;home&#x2F;home.routing&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;name&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;    require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;.&#x2F;pages&#x2F;messages&#x2F;messages.routing&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;name&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;lu-you-pei-zhi&quot;&gt;路由配置&lt;&#x2F;h2&gt;
&lt;p&gt;所有的延迟加载都在路由配置中实现。正如我所说，我们正在使用 AngularUI Router ，因为我们需要实现嵌套视图。我们有几个使用案例。我们可以加载整个模块（包括子状态控制器）或每个 state 加载一个控制器（不去考虑对父级 state 的依赖）。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;jia-zai-zheng-ge-mo-kuai&quot;&gt;加载整个模块&lt;&#x2F;h2&gt;
&lt;p&gt;当用户输入 &lt;code&gt;&#x2F;home&lt;&#x2F;code&gt; 路径，浏览器就会下载 home 模块。它包括两个控制器，针对 &lt;code&gt;home&lt;&#x2F;code&gt; 和 &lt;code&gt;home.about&lt;&#x2F;code&gt; 这两个state。我们通过 state 的配置对象中的 &lt;code&gt;resolve&lt;&#x2F;code&gt; 属性就可以实现延迟加载。得益于 Webpack 的 &lt;code&gt;require.ensure&lt;&#x2F;code&gt; 方法，我们可以把 home 模块创建成第一个代码块。它就叫做 &lt;code&gt;1.bundle.js&lt;&#x2F;code&gt; 。如果没有 &lt;code&gt;$ocLazyLoad.load&lt;&#x2F;code&gt;，我们会发现得到一个错误 &lt;code&gt;Argument &#x27;HomeController&#x27; is not a function, got undefined&lt;&#x2F;code&gt;，因为在 Angular 的设计中，启动应用之后再加载文件的方式是不可行的。 但是 &lt;code&gt;$ocLazyLoad.load&lt;&#x2F;code&gt; 使得我们可以在启动阶段注册一个模块，然后在它加载完之后再去使用它。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; home.routing.js&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;use strict&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; homeRouting&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;$urlRouterProvider&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; $stateProvider&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;  $urlRouterProvider&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;otherwise&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&#x2F;home&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;  $stateProvider&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;state&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;home&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      url&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&#x2F;home&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      template&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;.&#x2F;views&#x2F;home.html&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      controller&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;HomeController as vm&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      resolve&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;        loadHomeController&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;$q&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; $ocLazyLoad&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;          return&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; $q&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;resolve&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;            require&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;ensure&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;              &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; load whole module&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;              let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; module&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;.&#x2F;home&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;              $ocLazyLoad&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;load&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span&gt;name&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;home&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;              resolve&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;module&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;controller&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;state&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;home.about&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      url&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&#x2F;about&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      template&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;.&#x2F;views&#x2F;home.about.html&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      controller&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;HomeAboutController as vm&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;export&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; default&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; angular&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;module&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;home.routing&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;config&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;homeRouting&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;控制器被当作是模块的依赖。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; home.js&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;use strict&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;export&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; default&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; angular&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;module&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;home&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;    require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;.&#x2F;controllers&#x2F;home.controller&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;name&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;    require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;.&#x2F;controllers&#x2F;home.about.controller&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;name&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;jin-jia-zai-kong-zhi-qi&quot;&gt;仅加载控制器&lt;&#x2F;h2&gt;
&lt;p&gt;我们所做的是向前迈出的第一步，那么我们接着进行下一步。这一次，将没有大的模块，只有精简的控制器。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; messages.routing.js&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;use strict&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; messagesRouting&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;$stateProvider&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;  $stateProvider&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;state&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;messages&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      url&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&#x2F;messages&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      template&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;.&#x2F;views&#x2F;messages.html&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      controller&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;MessagesController as vm&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      resolve&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;        loadMessagesController&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;$q&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; $ocLazyLoad&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;          return&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; $q&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;resolve&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;            require&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;ensure&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;              &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; load only controller module&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;              let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; module&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;.&#x2F;controllers&#x2F;messages.controller&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;              $ocLazyLoad&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;load&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span&gt;name&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt; module&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;name&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;              resolve&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;module&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;controller&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;state&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;messages.all&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      url&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&#x2F;all&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      template&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;.&#x2F;views&#x2F;messages.all.html&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      controller&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;MessagesAllController as vm&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      resolve&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;        loadMessagesAllController&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;$q&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; $ocLazyLoad&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;          return&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; $q&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;resolve&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;            require&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;ensure&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;              &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; load only controller module&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;              let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; module&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;.&#x2F;controllers&#x2F;messages.all.controller&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;              $ocLazyLoad&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;load&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span&gt;name&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt; module&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;name&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;              resolve&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;module&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;controller&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;    &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;我相信在这里没有什么特别的，规则可以保持不变。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;jia-zai-shi-tu-views&quot;&gt;加载视图（Views）&lt;&#x2F;h2&gt;
&lt;p&gt;现在，让我们暂时放开控制器而去关注一下视图。正如你可能已经注意到的，我们把视图嵌入到了路由配置里面。如果我们没有把里面所有的路由配置放进 &lt;code&gt;bundle.js&lt;&#x2F;code&gt;，这就不会是一个问题，但现在我们需要这么做。这个案例不是要延迟加载路由配置而是视图，那么当我们使用 Webpack 来实现的时候，这会非常简单。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; messages.routing.js&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;state&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;messages.new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      url&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&#x2F;new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;      templateProvider&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;$q&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; $q&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;resolve&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;          &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; lazy load the view&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;          require&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;ensure&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; resolve&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;.&#x2F;views&#x2F;messages.new.html&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      }&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      controller&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;MessagesNewController as vm&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      resolve&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;        loadMessagesNewController&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;$q&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; $ocLazyLoad&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;          return&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; $q&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;resolve&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;            require&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;ensure&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;              &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; load only controller module&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;              let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; module&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;.&#x2F;controllers&#x2F;messages.new.controller&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;              $ocLazyLoad&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;load&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span&gt;name&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt; module&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;name&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;              resolve&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;module&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;controller&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;export&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; default&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; angular&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;module&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;messages.routing&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;config&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;messagesRouting&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;dang-xin-zhong-fu-de-yi-lai&quot;&gt;当心重复的依赖&lt;&#x2F;h2&gt;
&lt;p&gt;让我们来看看 &lt;code&gt;messages.all.controller&lt;&#x2F;code&gt; 和 &lt;code&gt;messages.new.controller&lt;&#x2F;code&gt; 的内容。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; messages.all.controller.js&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;use strict&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;class&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #B392F0);&quot;&gt; MessagesAllController&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;  constructor&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;msgStore&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt;    this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;msgs&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; msgStore&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;all&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;export&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; default&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; angular&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;module&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;messages.all.controller&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;    require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;commons&#x2F;msg-store&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;name&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;controller&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;MessagesAllController&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; MessagesAllController&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; messages.all.controller.js&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;use strict&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;class&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #B392F0);&quot;&gt; MessagesNewController&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;  constructor&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;msgStore&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt;    this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt;    this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;_msgStore&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; msgStore&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;  create&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt;    this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;_msgStore&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;add&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt;this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;text&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt;    this&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;text&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;export&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; default&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; angular&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;module&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;messages.new.controller&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;    require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;commons&#x2F;msg-store&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;name&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;controller&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;MessagesNewController&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; MessagesNewController&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;我们的问题的根源是 &lt;code&gt;require(&#x27;commons&#x2F;msg-store&#x27;).name&lt;&#x2F;code&gt; 。它需要 &lt;code&gt;msgStore&lt;&#x2F;code&gt; 这一个服务，来实现控制器之间的消息共享。此服务在两个包中都存在。在 &lt;code&gt;messages.all.controller&lt;&#x2F;code&gt; 中有一个，在 &lt;code&gt;messages.new.controller&lt;&#x2F;code&gt; 中又有一个。现在，它已经没有任何优化的空间。如何解决呢？只需要把 &lt;code&gt;msgStore&lt;&#x2F;code&gt; 添加为应用模块的依赖。虽然这还不够完美，在大多数情况下，这已经足够了。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; app.js&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;use strict&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;export&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; default&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;angular&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;module&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;lazyApp&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;    require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;angular-ui-router&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;    require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;oclazyload&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;    &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; msgStore as global dependency&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;    require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;commons&#x2F;msg-store&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;name&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;    require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;.&#x2F;pages&#x2F;home&#x2F;home.routing&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;name&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;    require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;.&#x2F;pages&#x2F;messages&#x2F;messages.routing&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;name&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;dan-yuan-ce-shi-de-ji-qiao&quot;&gt;单元测试的技巧&lt;&#x2F;h2&gt;
&lt;p&gt;把 &lt;code&gt;msgStore&lt;&#x2F;code&gt; 改成是全局依赖并不意味着你应该从控制器中删除它。如果你这样做了，在你编写测试的时候，如果没有模拟这一个依赖，那么它就无法正常工作了。因为在单元测试中，你只会加载这一个控制器而非整个应用模块。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; messages.all.controller.spec.js&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;use strict&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;describe&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;MessagesAllController&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;  var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; controller&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;      msgStoreMock&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;  beforeEach&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;angular&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;mock&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;module&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;.&#x2F;messages.all.controller&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;name&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;  beforeEach&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;inject&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;$controller&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;    msgStoreMock&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;commons&#x2F;msg-store&#x2F;msg-store.service.mock&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;    spyOn&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;msgStoreMock&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;all&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;and&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;returnValue&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;foo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;    controller&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; $controller&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;MessagesAllController&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span&gt; msgStore&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; msgStoreMock&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;  it&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;saves msgStore.all() in msgs&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;    expect&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;msgStoreMock&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;all&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;toHaveBeenCalled&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;    expect&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;controller&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;msgs&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;toEqual&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;foo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 8&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</description>
      </item>
      <item>
          <title>The way to Angular 2 | Part.1</title>
          <pubDate>Fri, 19 Feb 2016 06:59:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/the-way-to-angular-2-part-1/</link>
          <guid>https://guchengf.me/blog/the-way-to-angular-2-part-1/</guid>
          <description xml:base="https://guchengf.me/blog/the-way-to-angular-2-part-1/">&lt;p&gt;Angular 2 已经进入 beta 通道有一段时间了，也有不少人开始在各种情景中使用 Angular 2。我自己也在过去两个月里进行了一些基于 Angular 2 的项目尝试。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-way-from-angular-1-x-to-2&quot;&gt;The way from Angular 1.x to 2&lt;&#x2F;h2&gt;
&lt;p&gt;这应该是大多数人很关心的一个问题，从 1.x 到 2，Angular 究竟改变了什么？
一言难尽，这依旧是 Angular，依旧是最基础的那套思想，然后已经从最基础的设计架构层面进行了变更。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;新的设计架构，真正的模块化&lt;&#x2F;strong&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;angular.io&#x2F;generated&#x2F;images&#x2F;guide&#x2F;architecture&#x2F;overview2.png&quot; alt=&quot;ANGULAR ARCHITECTURE OVERVIEW&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Component，控制页面上的每一个 View。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Template，改进以后模板语法，熟悉 Angular 1.x 的人应该可以比较快地上手。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Metadata，因为采用 Class 作为基础而引入的新特性，它向 Angular 描述了如何去处理一个 Class。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Data Binding，Angular 2 将数据绑定的形式（或者说语法）设计成了 4 种，相比原来的，更加统一。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Directive，Directive 依旧和以前一样执行它的任务，根据自身的指令将 DOM 转化成相应的形态。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Serivces，服务一直都是一个宽广的概念，任何应用需要的值、方法和功能都可以是一个服务。Angular 2 没有对 Service 进行任何特殊的设定（没有 Service 相关的基础 Class），只要按照应用的需求进行设计就可以了。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Dependency Injection，依赖注入现在语法变得更加简单，而在 TypeScript 版本中，Angular 还可以让 Component 根据构造参数去查询 Service（自动提示和类型校验会变得友善和精确）。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;其他&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;应用启动方法&lt;&#x2F;li&gt;
&lt;li&gt;基于 Zone 的变化检测&lt;&#x2F;li&gt;
&lt;li&gt;针对 Component 的路由&lt;&#x2F;li&gt;
&lt;li&gt;事件体系&lt;&#x2F;li&gt;
&lt;li&gt;表单模块&lt;&#x2F;li&gt;
&lt;li&gt;新的生命周期设计&lt;&#x2F;li&gt;
&lt;li&gt;filter 被重命名为 Pipe（管道），更加贴切了&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;typescript&quot;&gt;TypeScript&lt;&#x2F;h3&gt;
&lt;p&gt;毫无疑问，在迈向 Angular 2 的路上，会遇到的第一道坎就是 TypeScript。其实官方是有 JavaScript 和 Dart 版本的，但是作为官方推荐的编写语言，TypeScript 带来的好处也是显而易见的：&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;强类型。动态语言总是让人觉得不放心，在逻辑和结构复杂的大型应用中，难免会出现因为使用偏差而导致的错误，TypeScript 提供的强类型校验，可以有效地避免这个问题。&lt;&#x2F;li&gt;
&lt;li&gt;ES2015 的超集。从最古老的 JavaScript 语法，一直到最新的 Async&#x2F;Await 以及 Decorator，得益于 TypeScript 的编译器，我们现在就可以从这些新特性中受益。&lt;&#x2F;li&gt;
&lt;li&gt;模块化。不管是 AMD、CMD 还是 ES2015 的模块化设计， TypeScript 的编译器都可以帮你自动处理（将它自己的模块化语法转换成你需要的标准）。&lt;&#x2F;li&gt;
&lt;li&gt;编译器检查。编译过程中的错误检查可以在很大程度上提高我们的 debug 效率，也可以辅助我们解决一些问题。&lt;&#x2F;li&gt;
&lt;li&gt;开发环境。静态类型检查，自动补全，代码提示等等。&lt;&#x2F;li&gt;
&lt;li&gt;健壮性。以上这些都是为了提高你的应用的健壮性和可扩展性。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;我基本上已经表明了自己的立场，我是非常推荐使用 TypeScript 来进行 Angular 2 的应用开发的，理由也已经在上面描述过。
我认为 TypeScript 不会成为向 Angular 2 升级的阻碍。毫不夸张地说，将现有的 JavaScript 文件后缀名改成&lt;code&gt;.ts&lt;&#x2F;code&gt;就可以正常使用，因此 TypeScript 对于 plain JavaScript 的兼容性是非常好的。
你在 TypeScript 中写的东西依旧是 JavaScript，并非一种全新的语言。就像 TypeScript 官方所说：始于 JavaScript，终于 JavaScript。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>React Native 的包系统</title>
          <pubDate>Wed, 23 Dec 2015 07:04:52 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/react-native-package-system/</link>
          <guid>https://guchengf.me/blog/react-native-package-system/</guid>
          <description xml:base="https://guchengf.me/blog/react-native-package-system/">&lt;h1 id=&quot;jie-shao&quot;&gt;介绍&lt;&#x2F;h1&gt;
&lt;p&gt;在 React-Native 中，实现了一个类似于 webpack 的包系统，命令行工具提供了一个 bundle 的功能，用来打包整个项目的文件。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;bundle&quot;&gt;Bundle&lt;&#x2F;h2&gt;
&lt;p&gt;熟悉 webpack 的人应该知道，webpack 最终会将所有引入的文件（JS、CSS、模板等）全部打包到一个 bundle.js 中，最终项目只需要引入这一个文件就可以。&lt;&#x2F;p&gt;
&lt;p&gt;而 React-Native 的打包机制与 webpack 非常类似，最终打包出一个&lt;code&gt;index.platform.bundle&lt;&#x2F;code&gt;(platform 根据平台区分)供最终 APP 打包使用。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;yi-xie-cai-guo-de-keng&quot;&gt;一些踩过的坑&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;1-bao-xi-tong-dai-lai-de-wen-ti&quot;&gt;1. 包系统带来的问题&lt;&#x2F;h3&gt;
&lt;p&gt;因为 React-Native 的包管理机制和 webpack 类似，因此它会对所有与模块相关的关键字进行检测并做对应的操作。检测机制非常简单：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;exports&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt;IMPORT_RE&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #9ECBFF);&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;\b&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;import&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;\s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;?:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;^&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;&amp;#39;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;\s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;\s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;&amp;#39;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;^&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;&amp;#39;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;\2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;g&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;exports&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt;EXPORT_RE&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #9ECBFF);&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;\b&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;export&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;\s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;?:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;^&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;&amp;#39;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;\s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;\s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;&amp;#39;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;^&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;&amp;#39;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;\2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;g&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;exports&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt;REQUIRE_RE&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #9ECBFF);&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;\b&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;require&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;\s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #85E89D);&quot;&gt;\(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;\s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;&amp;#39;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;^&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;&amp;#39;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;\2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;\s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #85E89D);&quot;&gt;\)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;g&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;exports&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt;SYSTEM_IMPORT_RE&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #9ECBFF);&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;\b&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;System&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #85E89D);&quot;&gt;\.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;import&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;\s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #85E89D);&quot;&gt;\(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;\s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;&amp;#39;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;^&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;&amp;#39;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;\2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #79B8FF);&quot;&gt;\s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #85E89D);&quot;&gt;\)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #DBEDFF);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;g&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;因此所有涉及到关键字的地方，都会被尝试自动引入资源文件并且打包。这就有可能会导致一个问题，当一个模块不存在的时候（其实这可能是我们外部提供的模块），就会出现打包失败的情况。 这时候，我们可以使用 React-Native 提供的方法来处理这一问题。它提供了一个注释关键字&lt;code&gt;@providesModule&lt;&#x2F;code&gt;用来标记我们已经手动引入到系统中的模块。&lt;&#x2F;p&gt;
&lt;p&gt;比如之前我在做一个 fetch 的全局拦截器适配的时候，就遇到了这个问题 (&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;werk85&#x2F;fetch-intercept&#x2F;pull&#x2F;2&quot;&gt;PR 链接&lt;&#x2F;a&gt;) 这个库本身为了对环境进行最大程度的兼容，会在环境不支持 fetch 的时候，尝试引入&lt;code&gt;whatwg-fetch&lt;&#x2F;code&gt;模块，作者使用了 try-catch 来容错，然而在 React-Native 里，打包程序会因为找不到&lt;code&gt;whatwg-fetch&lt;&#x2F;code&gt;模块而直接报错。&lt;&#x2F;p&gt;
&lt;p&gt;这时候，就可以使用&lt;code&gt;@providesModule&lt;&#x2F;code&gt;来处理。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;*&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;* @providesModule whatwg-fetch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;在这个模块中加入这一段注释，React-Native 的 bundle 程序就不会在尝试加载这个额外的模块，也就不会再报错了。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2-android-ping-tai-apk-sheng-cheng&quot;&gt;2. Android 平台 APK 生成&lt;&#x2F;h3&gt;
&lt;p&gt;React-Native 的 Android 平台支持还不久，还有很多没有完善的地方。生成 APK 还不够自动化，需要手动执行操作。&lt;&#x2F;p&gt;
&lt;p&gt;根据&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;facebook.github.io&#x2F;react-native&#x2F;docs&#x2F;signed-apk-android.html#content&quot;&gt;官方的流程说明&lt;&#x2F;a&gt;，在大多数情况下，都可以完成 APK 的构建。也有一些小的坑会遇到。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;使用官方所推荐的构建命令&lt;code&gt;.&#x2F;gradlew assembleRelease&lt;&#x2F;code&gt;，需要保证你已经设定好了签名的 key，不然生成的 APK 是无法正常安装的。&lt;&#x2F;li&gt;
&lt;li&gt;由于&lt;code&gt;.&#x2F;gradlew assembleRelease&lt;&#x2F;code&gt;这个脚本执行过程中也会调用 React-Native 的 bundle 命令，因此，如果你此前已经开启了一个 React-Native packager 的服务器，就会在构建过程中报错，会告诉你 React-Native 的调用出错了，你可以检查一下是否已经有一个 packager 的服务器已经在运行了，把它停掉重新打包即可。&lt;&#x2F;li&gt;
&lt;li&gt;官方说明中提到可以通过开启 &lt;code&gt;Proguard&lt;&#x2F;code&gt; 来减小生成的 APK 文件的体积。但是，请务必确保你已经配置好了 Proguard 的设置，不然构建也会失败。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</description>
      </item>
      <item>
          <title>angular 1.4.x 以后的 groupBy（angular-filter）的排序问题</title>
          <pubDate>Tue, 01 Dec 2015 07:06:31 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/angular-filter-groupby-after-version-1-4-x/</link>
          <guid>https://guchengf.me/blog/angular-filter-groupby-after-version-1-4-x/</guid>
          <description xml:base="https://guchengf.me/blog/angular-filter-groupby-after-version-1-4-x/">&lt;h3 id=&quot;wen-ti&quot;&gt;问题：&lt;&#x2F;h3&gt;
&lt;p&gt;angular 1.4.x 版本开始，&lt;code&gt;&amp;lt;div ng-repeat=&quot;(key, value) in myObj&quot;&amp;gt; ... &amp;lt;&#x2F;div&amp;gt;&lt;&#x2F;code&gt; 的方法移除了按照首字母排序的规则，改为使用浏览器默认的方法，也就是&lt;code&gt;for key in myObj&lt;&#x2F;code&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;因此当我们使用 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;a8m&#x2F;angular-filter&quot;&gt;angular-filter&lt;&#x2F;a&gt; 的 &lt;code&gt;groupBy&lt;&#x2F;code&gt; 方法将数组分组时，分组后的数组不会再按照 &lt;code&gt;key&lt;&#x2F;code&gt; 排序，某些情况下就会造成一些麻烦。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;jie-jue-fang-an&quot;&gt;解决方案：&lt;&#x2F;h3&gt;
&lt;p&gt;根据 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;a8m&#x2F;angular-filter&#x2F;wiki&#x2F;Common-Questions#order-groupby-result&quot;&gt;这一条说明&lt;&#x2F;a&gt;，利用 &lt;code&gt;toArray&lt;&#x2F;code&gt; 和 &lt;code&gt;orderBy&lt;&#x2F;code&gt; 可以解决这一个问题。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;toArray&lt;&#x2F;code&gt; 方法可以将对象转换成固定的数组。这个方法接受一个 &lt;code&gt;bool&lt;&#x2F;code&gt; 类型的参数，用来指定是否将对象的 &lt;code&gt;key&lt;&#x2F;code&gt; 作为转换后数组中的元素的一个属性输出，如果设为 &lt;code&gt;true&lt;&#x2F;code&gt;，那么数组元素将会多一个属性 &lt;code&gt;$key&lt;&#x2F;code&gt; 代表原来的对象的 &lt;code&gt;key&lt;&#x2F;code&gt;。 所以我们可以这样完成 &lt;code&gt;groupBy&lt;&#x2F;code&gt; 方法的排序：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;ul&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt; ng-repeat&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;group in myObj | groupBy: &amp;#39;groupKey&amp;#39; | toArray: true | orderBy: &amp;#39;$key&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;li&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt; ng-bind&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;$key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;li&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;  &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;li&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt; ng-repeat&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;item in group&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;li&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;ul&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;这样，&lt;code&gt;groupBy&lt;&#x2F;code&gt; 的结果就会按照对应的参数的首字母（这里是&lt;code&gt;groupKey&lt;&#x2F;code&gt;）排序了。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Google + 风格下拉选择器(pure-javascript)</title>
          <pubDate>Tue, 08 Sep 2015 07:14:18 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/google-plus-like-dropdown-selector/</link>
          <guid>https://guchengf.me/blog/google-plus-like-dropdown-selector/</guid>
          <description xml:base="https://guchengf.me/blog/google-plus-like-dropdown-selector/">&lt;p&gt;Source code on Github: &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;gucheen&#x2F;GPDP&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;gucheen&#x2F;GPDP&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;script
  data-slug-hash=&quot;MawYoM&quot;
  data-user=&quot;your_username&quot;
  data-height=&quot;500&quot;
  data-default-tab=&quot;result&quot;
  data-theme-id=&quot;8862&quot;
  class=&quot;codepen&quot;
  async
  src=&quot;&#x2F;&#x2F;codepen.io&#x2F;assets&#x2F;embed&#x2F;ei.js&quot;
&gt;&lt;&#x2F;script&gt;
&lt;p&gt;CODE: &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;codepen.io&#x2F;gucheen&#x2F;full&#x2F;MawYoM&quot;&gt;Google plus like dropdown selector&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>AngularJS $resource 服务对 http 请求 response 的自动处理引发的一些问题</title>
          <pubDate>Tue, 30 Jun 2015 07:20:03 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/incorrect-response-due-to-angular-resource/</link>
          <guid>https://guchengf.me/blog/incorrect-response-due-to-angular-resource/</guid>
          <description xml:base="https://guchengf.me/blog/incorrect-response-due-to-angular-resource/">&lt;p&gt;默认情况下，&lt;code&gt;$resource&lt;&#x2F;code&gt; 服务会对它进行的 http 请求的 response 默认进行一些处理，它会尝试 map 返回值。&lt;&#x2F;p&gt;
&lt;p&gt;如果你的服务器端返回的值符合标准 json 格式，那么不会遇到问题，但是如果你的服务器返回了类似 &lt;code&gt;12&lt;&#x2F;code&gt; 或者 &lt;code&gt;abc&lt;&#x2F;code&gt; 这样子的数据时，你就会发现当你在回调中试图获取 response 时，发生了一些意想不到的事情。&lt;&#x2F;p&gt;
&lt;p&gt;你实际获得的结果可能是这样子的：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#657B83, #B392F0);&quot;&gt;  $promise&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; obj&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;  ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;b&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#657B83, #B392F0);&quot;&gt;  $promise&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; obj&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;  ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;你得到的值已经是被错误的 map 过了。这当然不是我们想要的，因此，我们需要手动来处理一下。&lt;&#x2F;p&gt;
&lt;p&gt;所以，我们在 &lt;code&gt;$resource&lt;&#x2F;code&gt; 的对应 &lt;code&gt;action&lt;&#x2F;code&gt; 中指定一下 &lt;code&gt;transformResponse&lt;&#x2F;code&gt; 参数。&lt;&#x2F;p&gt;
&lt;p&gt;顾名思义，&lt;code&gt;transformResponse&lt;&#x2F;code&gt; 就是用来指定对 &lt;code&gt;response&lt;&#x2F;code&gt; 的处理方法的，它接受一个方法或者一个由多个方法组成的数组作为值。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;data&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; headersGetter&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;Array&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #B392F0);&quot;&gt;function&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;data&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; headersGetter&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;因此我们给 &lt;code&gt;$resource&lt;&#x2F;code&gt; 的某个 action 下添加如下一个参数。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#657B83, #B392F0);&quot;&gt;transformResponse&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; function&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;response&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;  return&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span&gt;data&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; response&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;最终的结构是这样子的：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;$resource&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&#x2F;api&#x2F;test&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  save&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    method&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;POST&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;    transformResponse&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; function&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;response&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;      return&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        data&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; response&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      }&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;这样我们就可以在对应的 action （这里是 save 方法） 的回调中取得我们想要的 response 了。&lt;&#x2F;p&gt;
&lt;p&gt;假设你在回调函数中使用 response 作为回调变量名，你可以通过 &lt;code&gt;response.data&lt;&#x2F;code&gt;来获取真实的 response，它不会再被 angular 自动处理了。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>阻止在页面元素内滚动时触发页面滚动</title>
          <pubDate>Thu, 05 Mar 2015 07:08:50 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/stop-page-scrolling-causing-by-element/</link>
          <guid>https://guchengf.me/blog/stop-page-scrolling-causing-by-element/</guid>
          <description xml:base="https://guchengf.me/blog/stop-page-scrolling-causing-by-element/">&lt;p&gt;一般来说，当我们在页面内部一个可滚动元素上使用滚动时，如果滚动距离超过它的顶部或者底部，就会触发页面滚动，但是在一些情况下，我们不希望引起页面滚动，因为这会影响用户操作。&lt;&#x2F;p&gt;
&lt;p&gt;下面是一种阻止页面滚动的方法。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; scroll&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; document&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;getElementsByClassName&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;scroll&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; handleScroll&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;scroll&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;scrollHeight&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; scroll&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;offsetHeight&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 仅在元素处于可滚动状态下才进行阻止&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;deltaY&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; scroll&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;scrollTop&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; ===&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;      e&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;preventDefault&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;deltaY&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;scroll&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;scrollTop&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; scroll&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;offsetHeight&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; &amp;gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; scroll&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;scrollHeight&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;      e&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;preventDefault&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;scroll&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;addEventListener&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;mousewheel&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; handleScroll&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;DEMO: &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;jsbin.com&#x2F;sivaveyonu&#x2F;1&#x2F;edit?html,css,js,output&quot;&gt;JSBIN&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>在 VMware 的客户机内使用鼠标的前进&#x2F;后退等功能键</title>
          <pubDate>Mon, 03 Nov 2014 07:21:21 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/use-mouse-back-forward-buttons-in-vmwrea-workstation-guest-os/</link>
          <guid>https://guchengf.me/blog/use-mouse-back-forward-buttons-in-vmwrea-workstation-guest-os/</guid>
          <description xml:base="https://guchengf.me/blog/use-mouse-back-forward-buttons-in-vmwrea-workstation-guest-os/">&lt;p&gt;在 VMware 的客户机内使用鼠标的前进&#x2F;后退等功能键&lt;&#x2F;p&gt;
&lt;p&gt;在 VMware 的虚拟磁盘文件夹内，找到 .vmx 配置文件，在其中加入下面这句配置：&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;mouse.vusb.enable = &quot;TRUE&quot;&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;就可以在客户机内正常使用鼠标的前进、后退等功能键了。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>中国地区常用浏览器 UA</title>
          <pubDate>Wed, 29 Oct 2014 07:23:10 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/useragent-of-common-browsers-in-china/</link>
          <guid>https://guchengf.me/blog/useragent-of-common-browsers-in-china/</guid>
          <description xml:base="https://guchengf.me/blog/useragent-of-common-browsers-in-china/">&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;360 极速浏览器&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;quot;Mozilla&#x2F;5.0 (Windows NT 6.1; WOW64) AppleWebKit&#x2F;537.36 (KHTML, like Gecko) Chrome&#x2F;37.0.2062.120 Safari&#x2F;537.36 QIHU 360EE&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;猎豹安全浏览器&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;quot;Mozilla&#x2F;5.0 (Windows NT 6.1; WOW64) AppleWebKit&#x2F;537.36 (KHTML, like Gecko) Chrome&#x2F;34.0.1847.137 Safari&#x2F;537.36 LBBROWSER&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;搜狗浏览器&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;quot;Mozilla&#x2F;5.0 (Windows NT 6.1; WOW64) AppleWebKit&#x2F;537.36 (KHTML, like Gecko) Chrome&#x2F;35.0.1916.153 Safari&#x2F;537.36 SE 2.X MetaSr 1.0&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;QQ 浏览器&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;quot;Mozilla&#x2F;4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident&#x2F;4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; QQBrowser&#x2F;8.0.1374.400)&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;百度浏览器&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;quot;Mozilla&#x2F;5.0 (Windows NT 6.1; WOW64) AppleWebKit&#x2F;537.36 (KHTML, like Gecko) Chrome&#x2F;33.0.1750.146 BIDUBrowser&#x2F;6.x Safari&#x2F;537.36&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;360 安全浏览器&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;quot;Mozilla&#x2F;5.0 (Windows NT 6.1; WOW64) AppleWebKit&#x2F;537.36 (KHTML, like Gecko) Chrome&#x2F;31.0.1650.63 Safari&#x2F;537.36&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;傲游浏览器&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;quot;Mozilla&#x2F;5.0 (Windows NT 6.1; WOW64) AppleWebKit&#x2F;537.36 (KHTML, like Gecko) Maxthon&#x2F;4.4.2.2000 Chrome&#x2F;30.0.1599.101 Safari&#x2F;537.36&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;UC 浏览器PC版&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;quot;Mozilla&#x2F;5.0 (Windows NT 6.1; WOW64) AppleWebKit&#x2F;537.36 (KHTML, like Gecko) Chrome&#x2F;35.0.1916.153 UBrowser&#x2F;3.1.1644.29 Safari&#x2F;537.36&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>在 Chrome Extension 中使用 Google Closure</title>
          <pubDate>Wed, 24 Sep 2014 07:28:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/using-closure-in-chrome-extension/</link>
          <guid>https://guchengf.me/blog/using-closure-in-chrome-extension/</guid>
          <description xml:base="https://guchengf.me/blog/using-closure-in-chrome-extension/">&lt;p&gt;要在 Chrome Extension 中使用 Closure library， 需要将 Closure library 按照需求打包。 假设扩展的开发目录如下：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-root&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|-css&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|-js&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|-closure-library&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|-menifest.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|-..&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;首先请到 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20160915023805&#x2F;https:&#x2F;&#x2F;developers.google.com&#x2F;closure&#x2F;compiler&#x2F;&quot;&gt;Closure 官方&lt;&#x2F;a&gt; 下载打包工具 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20160915023805&#x2F;http:&#x2F;&#x2F;dl.google.com&#x2F;closure-compiler&#x2F;compiler-latest.zip&quot;&gt;compiler.jar&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;将 compiler.jar 放到 root 目录下。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;在本目录下任意位置新建 source.js (命名随意)，将所有对 Closure library 的依赖请求写入里面。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goog.require(&amp;#39;goog.dom&amp;#39;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goog.require(&amp;#39;goog.events&amp;#39;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;goog.require(&amp;#39;goog.asserts&amp;#39;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;运行如下命令&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;closure-library&#x2F;closure&#x2F;bin&#x2F;build&#x2F;closurebuilder.py &#x2F;&#x2F; 定位到 Closure library 中的 buider.py 脚本&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    --root=closure-library&#x2F; &#x2F;&#x2F; 这一项指定 Closure library 的目录位置&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    --root=myproject&#x2F; &#x2F;&#x2F; 指定开发项目的位置&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    --namespace=&amp;quot;myproject.start&amp;quot; &#x2F;&#x2F; 指定使用的主命名空间&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    --output_mode=compiled &#x2F;&#x2F; output_mode 输出模式使用 cimpiled&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    --compiler_jar=compiler.jar &#x2F;&#x2F; 指定 compiler.jar 的位置&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    --compiler_flags=&amp;quot;--compilation_level=ADVANCED_OPTIMIZATIONS&amp;quot; &#x2F;&#x2F; 指定 compiler.jar 的参数，双引号内直接使用 compiler.jar 的参数&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;gt; compiled.lib.js &#x2F;&#x2F; 指定输出的文件&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;直接在 Chrome extension 中引入输出的 &lt;code&gt;compiled.lib.js&lt;&#x2F;code&gt; 就可以正常使用 Closure library 了。&lt;code&gt;builder.py&lt;&#x2F;code&gt; 脚本会自动检测你所依赖的 Closure library 类，并将其打包。你还可以将命令直接写成 Makefile 脚本，下次直接运行脚本即可。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    development:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      closure-library&#x2F;closure&#x2F;bin&#x2F;build&#x2F;closurebuilder.py --root=closure-library&#x2F; --root=js&#x2F; --namespace=&amp;quot;YourRootNameSpace&amp;quot; --output_mode=compiled --compiler_jar=compiler.jar &amp;gt; compiled.js&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    production:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      closure-library&#x2F;closure&#x2F;bin&#x2F;build&#x2F;closurebuilder.py --root=closure-library&#x2F; --root=js&#x2F; --namespace=&amp;quot;YourRootNameSpace&amp;quot; --output_mode=compiled --compiler_jar=compiler.jar --compiler_flags=&amp;quot;--compilation_level=ADVANCED_OPTIMIZATIONS&amp;quot; &amp;gt; compiled.js&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    all:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      development&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</description>
      </item>
      <item>
          <title>Typecho 转 Jekyll markdown 工具</title>
          <pubDate>Tue, 09 Sep 2014 07:10:57 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/typecho-to-jekyll/</link>
          <guid>https://guchengf.me/blog/typecho-to-jekyll/</guid>
          <description xml:base="https://guchengf.me/blog/typecho-to-jekyll/">&lt;p&gt;最近想把博客转到 jekyll ，原本的程序是 typecho 的，手动迁移有些麻烦（虽然 typecho 0.9 已经是默认 markdown 写作的了）。
于是想要找一个转换程序，在 github 上搜了一圈，只有一个 typecho 转 hexo 的，虽然都是 markdown 文件，格式也相近，但是还是有一些区别。&lt;&#x2F;p&gt;
&lt;p&gt;于是 fork 了这个 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;lauyoume&#x2F;typecho_to_hexo&quot;&gt;repo&lt;&#x2F;a&gt; , 针对 jkeyll 2.x 版本进行了一些修改，使得可以较完美地转换成符合 jekyll 标准的 markdown 文件。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;修改后的版本： &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;gucheen&#x2F;typecho_to_jekyll&quot;&gt;typecho to jekyll&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;只修改了转换文章的部分，会自动对代码段作处理，转换成 jekyll 标准格式的高亮代码段。在这里需要注意一个问题: 务必标明代码段高亮类型，比如 js、python ，以确保它可以被正确地检测。 另外，标题不能以 &lt;code&gt;[&lt;&#x2F;code&gt; 符号开始，会导致检测错误。有时间再作修改。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Google Closure htmlToDocumentFragment 无法正确渲染’tr’标签</title>
          <pubDate>Fri, 01 Aug 2014 07:29:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/goog-dom-htmltodocumentfragment-tr-error/</link>
          <guid>https://guchengf.me/blog/goog-dom-htmltodocumentfragment-tr-error/</guid>
          <description xml:base="https://guchengf.me/blog/goog-dom-htmltodocumentfragment-tr-error/">&lt;p&gt;首先看一下 &lt;code&gt;goog.dom.htmlToDocumentFragment&lt;&#x2F;code&gt; 的实现代码：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;goog&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;dom&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;htmlToDocumentFragment_&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; function&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;doc&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; htmlString&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;      var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; tempDiv&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; doc&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;createElement&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;div&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;      if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;goog&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;dom&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;BrowserFeature&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt;INNER_HTML_NEEDS_SCOPED_ELEMENT&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;        tempDiv&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;innerHTML&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;        &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; htmlString&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;        tempDiv&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;removeChild&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;tempDiv&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;firstChild&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; else&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;        tempDiv&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;innerHTML&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; htmlString&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;      if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;tempDiv&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;childNodes&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt;length&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; &#x2F;**&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; @&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;type&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #B392F0);&quot;&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #B392F0);&quot;&gt;!Node&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #B392F0);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; *&#x2F;&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;tempDiv&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;removeChild&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;tempDiv&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;firstChild&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; else&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;        var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; fragment&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; doc&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;createDocumentFragment&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;        while&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;tempDiv&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;firstChild&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;          fragment&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;appendChild&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;tempDiv&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;firstChild&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; fragment&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;这个方法利用一个临时 Div 容器来生成 Dom 片段，因为&lt;code&gt;&amp;lt;tr&amp;gt;&lt;&#x2F;code&gt;标签本身不能在&lt;code&gt;&amp;lt;div&amp;gt;&lt;&#x2F;code&gt;标签内使用，所以这个函数不能返回单独地&lt;code&gt;&amp;lt;tr&amp;gt;&lt;&#x2F;code&gt;标签。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Google Closure – goog.require()</title>
          <pubDate>Sat, 26 Jul 2014 07:31:06 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/google-closure-goog-require/</link>
          <guid>https://guchengf.me/blog/google-closure-goog-require/</guid>
          <description xml:base="https://guchengf.me/blog/google-closure-goog-require/">&lt;p&gt;在使用 Google Closure Library 时，要注意一点。 &lt;code&gt;goog.require()&lt;&#x2F;code&gt; 所请求的内容，不能被同一个 script 标签内的 js 代码所使用，例如&lt;strong&gt;下面这种做法就是错误的&lt;&#x2F;strong&gt;。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;script&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt; src&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;closure-library&#x2F;closure&#x2F;goog&#x2F;base.js&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;script&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;script&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 不要这样写&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;goog&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;goog.dom&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; newHeader&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; goog&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;dom&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;createDom&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;h1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;script&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;如果你这样做，会有一个 &lt;code&gt;cannot read property &#x27;xxx&#x27; of undefined&lt;&#x2F;code&gt; 类似的错误。除非 goog.dom.createDom() 在此前已经被请求，不然是无法使用它的。 &lt;strong&gt;正确的做法&lt;&#x2F;strong&gt;是这样：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;script&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt; src&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;closure-library&#x2F;closure&#x2F;goog&#x2F;base.js&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;script&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;script&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;goog&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;goog.dom&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;script&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;script&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; newHeader&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; goog&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;dom&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;createDom&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;h1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;script&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #E1E4E8);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;也可以这样&lt;&#x2F;strong&gt;：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;goog&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;goog.dom&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;    function&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; sayHi&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;    var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; newHeader&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; goog&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;dom&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;createDom&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;h1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;style&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;background-color:#EEE&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;    &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;Hello world!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;    goog&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;dom&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;appendChild&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;document&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;body&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; newHeader&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;这样的话，只需要在其他 script 标签或者文件中调用 &lt;code&gt;sayHi()&lt;&#x2F;code&gt; 函数即可。 参考 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;developers.google.com&#x2F;closure&#x2F;library&#x2F;docs&#x2F;gettingstarted&quot;&gt;Getting Started with the Closure Library&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>ubuntu 中文本地化之后的中文字体优化</title>
          <pubDate>Mon, 14 Jul 2014 07:32:20 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/ubuntu-chinese-fonts-type/</link>
          <guid>https://guchengf.me/blog/ubuntu-chinese-fonts-type/</guid>
          <description xml:base="https://guchengf.me/blog/ubuntu-chinese-fonts-type/">&lt;p&gt;ubuntu 中文本地化之后，默认安装了两个字体 arphic-ukai 和 arphic-uming，导致默认中文字体非常难看，没有很好的渲染，卸载这两个字体就可以改善中文字体效果。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo apt-get remove fonts-arphic-ukai fonts-arphic-uming&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</description>
      </item>
      <item>
          <title>ubuntu安装本地php+mysql+apache测试环境</title>
          <pubDate>Sun, 27 Apr 2014 12:14:52 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/ubuntu-develop-environment/</link>
          <guid>https://guchengf.me/blog/ubuntu-develop-environment/</guid>
          <description xml:base="https://guchengf.me/blog/ubuntu-develop-environment/">&lt;p&gt;1.安装apache。打开终端，可以切换到root模式（下面就不说了，直接写命令）&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;sudo -s&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;这是切换到root模式，这里提示要密码，输入密码即可。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;sudo apt-get install apache2&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;这里会自动安装apache，不要关闭终端。等待安装完成。&lt;&#x2F;p&gt;
&lt;p&gt;用firefox打开http:&#x2F;&#x2F;localhost&#x2F;，提示有“it works”，就是正常工作了。&lt;&#x2F;p&gt;
&lt;p&gt;2.安装php。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;sudo apt-get install php5&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;sudo apt-get install libapache2-mod-php5&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;sudo &#x2F;etc&#x2F;init.d&#x2F;apache2 restart&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;测试：sudo gedit &#x2F;var&#x2F;www&#x2F;test.php&lt;&#x2F;p&gt;
&lt;p&gt;写入,然后保存，并用firefox打开 http:&#x2F;&#x2F;localhost&#x2F;test.php，会显示PHP配置信息就是正确安装了php&lt;&#x2F;p&gt;
&lt;p&gt;3.安装mysql数据库&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;sudo apt-get install mysql-server&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;等到弹出密码输入，输入密码&lt;&#x2F;p&gt;
&lt;p&gt;给外部连接mysql的权限http:&#x2F;&#x2F;www.myxzy.com&#x2F;read.php&#x2F;279.htm&lt;&#x2F;p&gt;
&lt;p&gt;4.安装MYSQL for Apache HTTP Server&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;sudo apt-get install libapache2-mod-auth-mysql&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;sudo apt-get install php5-mysql&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;要让PHP与MySql一起工作，编辑&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;sudo gedit &#x2F;etc&#x2F;php5&#x2F;apache2&#x2F;php.ini&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;取消对;extension=mysql.so的注释，然后保存文件，最后重启apache&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;sudo &#x2F;etc&#x2F;init.d&#x2F;apache2 restart&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;到了这里php+mysql+apache基本安装已经完成。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>使用 nodemon 或者 Supervisor 监控 Express 4.x 代码改动进行开发</title>
          <pubDate>Tue, 22 Apr 2014 07:33:16 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/watch-change-in-express-4-x-with-nodemon-or-supervisor/</link>
          <guid>https://guchengf.me/blog/watch-change-in-express-4-x-with-nodemon-or-supervisor/</guid>
          <description xml:base="https://guchengf.me/blog/watch-change-in-express-4-x-with-nodemon-or-supervisor/">&lt;p&gt;&lt;strong&gt;Update on 2015&lt;&#x2F;strong&gt; 现在 nodemon 已经可以直接支持 Express 4.x 的启动，不在需要进行特殊配置&lt;&#x2F;p&gt;
&lt;p&gt;Update on 2014.04.25: 现在我使用 nodemon 来代替 supervisor 来进行监控任务。 相比 supervisor ，nodemon 的优点包括：更轻量级，内存占用更小。使用更加方便，更容易进行扩展等。 nodemon 的使用方法与 supervisor 相似，&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;npm install -g nodemon&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;直接运行&lt;code&gt;nodemon app.js&lt;&#x2F;code&gt;即可，可以随时输入&lt;code&gt;rs&lt;&#x2F;code&gt;回车进行手动重启，非常方便。 更多的使用方法可以在它的 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;remy&#x2F;nodemon&#x2F;#usage&quot;&gt;github主页&lt;&#x2F;a&gt; 找到。 Express 4.x 默认将启动模块分离到了&lt;code&gt;.&#x2F;bin&#x2F;www&lt;&#x2F;code&gt;中，直接使用 supervisor 无法正常监控应用，使得开发过程中的调试非常不方便。 直接在 app.js 添加 app 模块即可。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; debug&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;debug&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;my-application&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; debug模块&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;set&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;port&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; process&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;env&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt;PORT&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; ||&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 3000&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 设定监听端口&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; Environment sets...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; module.exports = app; 这是 4.x 默认的配置，分离了 app 模块,将它注释即可，上线时可以重新改回来&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;启动监听&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; server&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;listen&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;get&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;port&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; function&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;    debug&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;Express server listening on port &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; server&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;address&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;port&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;之后就可以正常的&lt;code&gt;supervisor app.js&lt;&#x2F;code&gt;进行调试了。 如果需要彻底改变启动方式，还需要修改&lt;code&gt;packages.json&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;scripts&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;: &lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;start&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;node app.js&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 此处将原本的 &amp;#39;node .&#x2F;bin&#x2F;www&amp;#39; 改为 &amp;#39;node app.js&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;之后运行&lt;code&gt;npm start&lt;&#x2F;code&gt;实际就是&lt;code&gt;node app.js&lt;&#x2F;code&gt;了。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>【译】从 Express 3.x 迁移到 4.x</title>
          <pubDate>Fri, 18 Apr 2014 07:37:16 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/migrating-from-express-3-x-to-4-x/</link>
          <guid>https://guchengf.me/blog/migrating-from-express-3-x-to-4-x/</guid>
          <description xml:base="https://guchengf.me/blog/migrating-from-express-3-x-to-4-x/">&lt;p&gt;Express 3.x 到 4.0 的迁移指南。你可能对这篇文章也有兴趣&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;visionmedia&#x2F;express&#x2F;wiki&#x2F;New-features-in-4.x&quot;&gt;4.x版中的新功能&lt;&#x2F;a&gt;。 更多的例子和完整的API文档，请参见&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;expressjs.com&#x2F;4x&#x2F;api.html&quot;&gt;Express 4.x 的文档&lt;&#x2F;a&gt;。&lt;&#x2F;p&gt;
&lt;h1 id=&quot;gai-shu&quot;&gt;概述&lt;&#x2F;h1&gt;
&lt;p&gt;Express 4 不再依赖 Connect 。这意味着所有捆绑的中间件（除了&lt;code&gt;static&lt;&#x2F;code&gt;）都不再能从&lt;code&gt;express&lt;&#x2F;code&gt;模块中被调用。这些中间件都可以作为下面提及的模块进行调用。这一变化是为了让这些中间件在获取修复，更新和发布的同时不影响 express 的发布周期，反之亦然。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;bodyParser &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;expressjs&#x2F;body-parser&quot;&gt;body-parser&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;cookieParser &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;expressjs&#x2F;cookie-parser&quot;&gt;cookie-parser&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;favicon &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;expressjs&#x2F;favicon&quot;&gt;static-favicon&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;session &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;expressjs&#x2F;session&quot;&gt;express-session&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;其他模块在这里 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;senchalabs&#x2F;connect#middleware&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;senchalabs&#x2F;connect#middleware&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h1 id=&quot;yi-chu&quot;&gt;移除&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;app-configure&quot;&gt;app.configure()&lt;&#x2F;h2&gt;
&lt;p&gt;这种方法不再可用。如果你想配置基于环境的不同路由，使用 if 语句或替代模块。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;configure&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;development&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; function&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;    &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; configure stuff here&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 现在改为&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; env&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; process&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;env&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt;NODE_ENV&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; ||&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;development&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;development&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; env&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;    &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; configure stuff here&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;app-router&quot;&gt;app.router&lt;&#x2F;h2&gt;
&lt;p&gt;这个中间件已经全面改版，以此避免&lt;code&gt;.use&lt;&#x2F;code&gt;同&lt;code&gt;.get&lt;&#x2F;code&gt;之间的混淆（或者是其他HTTP动作），同时，不再需要手动声明的&lt;code&gt;app.use(app.router)&lt;&#x2F;code&gt;（已被移除）。查看下面关于新的中间件和路由 API 的一节。 如果你的代码看起来像这样：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;cookieParser&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;bodyParser&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F; 其他的中间件，并没有影响&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;router&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; &amp;lt;--- 这行会被移除&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 更多的中间件（在路由之后执行）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;req&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; res&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; next&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 处理错误的中间件&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;err&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; req&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; res&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; next&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;get&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; ...&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;post&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;...&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;app.router&lt;&#x2F;code&gt;已被移除，中间件和路由按照它们添加的顺序被执行。在你的代码中，你应该将原本在&lt;code&gt;app.use(app.router)&lt;&#x2F;code&gt;之后的向&lt;code&gt;app.use&lt;&#x2F;code&gt;的请求移动到其他路由之后（HTTP动作）。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;cookieParser&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;bodyParser&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F; 其他的中间件，并没有影响&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;get&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; ...&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;post&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;...&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 更多的中间件（在路由后执行）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;req&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; res&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; next&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 处理错误的中间件&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;err&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; req&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; res&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; next&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;express-createserver&quot;&gt;express.createServer()&lt;&#x2F;h2&gt;
&lt;p&gt;长期弃用。现在只要使用&lt;code&gt;express()&lt;&#x2F;code&gt;创建一个新的应用。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;connect-zhong-jian-jian&quot;&gt;connect 中间件&lt;&#x2F;h2&gt;
&lt;p&gt;除了&lt;code&gt;express.static&lt;&#x2F;code&gt;为了便捷性直接封装在 express 中，其他所有 connect 的中间件都被分离到了独立的模块中。由此，每个独立的模块都可以拥有自己的版本控制。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;connect-de-bu-ding&quot;&gt;connect 的补丁&lt;&#x2F;h2&gt;
&lt;p&gt;Connect 对 node 的原型进行了全局的改动。 这被认为是不正确的，所以在 Connect 3 中已被移除。 其中一些补丁是：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;res.on(&#x27;header&#x27;)&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;res.charset&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;res.headerSent&lt;&#x2F;code&gt; – use node’s &lt;code&gt;res.headersSent&lt;&#x2F;code&gt; instead&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;你不应该在任何 Connect 或 Express 的库中再使用这些。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;res-charset&quot;&gt;res.charset&lt;&#x2F;h2&gt;
&lt;p&gt;如果你想快速设置默认的字符集（你确实应该这么做）， 使用 &lt;code&gt;res.set(&#x27;content-type&#x27;)&lt;&#x2F;code&gt; 或者 &lt;code&gt;res.type()&lt;&#x2F;code&gt; 来设置 header 。 当使用&lt;code&gt;res.setHeader()&lt;&#x2F;code&gt;时，默认的字符集将不会添加。&lt;&#x2F;p&gt;
&lt;h1 id=&quot;gai-dong&quot;&gt;改动&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;app-use&quot;&gt;app.use&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;app.use&lt;&#x2F;code&gt; 现在可以接受 &lt;code&gt;:params&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&#x2F;users&#x2F;:user_id&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; function&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;req&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; res&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; next&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;    &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; req.params.user_id 可以正确获取&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;req-accepted&quot;&gt;req.accepted()&lt;&#x2F;h2&gt;
&lt;p&gt;使用&lt;code&gt;req.accepts()&lt;&#x2F;code&gt;来代替。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;req.accepts()&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;req.acceptsEncodings()&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;req.acceptsCharsets()&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;req.acceptsLanguages()&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;都在内部使用 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;expressjs&#x2F;accepts&quot;&gt;accepts&lt;&#x2F;a&gt;。 请参考&lt;code&gt;accepts&lt;&#x2F;code&gt;来提交问题或者查看文档。 请注意，这些属性可能已经从数组改为函数。 要把它们作为“数组”使用，只要不向它们传递任何参数即可。 例如, &lt;code&gt;req.acceptsLanguages() &#x2F;&#x2F; =&amp;gt; [&#x27;en&#x27;, &#x27;es&#x27;, &#x27;fr&#x27;]&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;res-location&quot;&gt;res.location()&lt;&#x2F;h2&gt;
&lt;p&gt;不再做相对路径的 URL 解析。浏览器自身将处理相对路径的 URL 。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;app-route-app-mountpath&quot;&gt;app.route -&amp;gt; app.mountpath&lt;&#x2F;h2&gt;
&lt;p&gt;当把一个 express 应用安装到另一个 express 应用中时。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;pei-zhi-gai-dong&quot;&gt;配置改动&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;json spaces&lt;&#x2F;code&gt; 在开发模式下不再默认启用。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;req-params&quot;&gt;req.params&lt;&#x2F;h2&gt;
&lt;p&gt;现在它是一个对象而不是数组。如果你以前使用&lt;code&gt;req.params[##]&lt;&#x2F;code&gt;的形式，这不会破坏你的应用，它可以在不知道参数名的情况下，使用正则来处理路由。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;res-locals&quot;&gt;res.locals&lt;&#x2F;h2&gt;
&lt;p&gt;不再是一个函数。现在这是一个普通的JS对象。所以把它当作普通的对象来处理。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;res-headersent&quot;&gt;res.headerSent&lt;&#x2F;h2&gt;
&lt;p&gt;改为&lt;code&gt;headersSent&lt;&#x2F;code&gt;来匹配 node.js 的 ServerResponse 对象。你的应用可能并没有使用到这个，因此它不会是一个问题。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;req-is&quot;&gt;req.is&lt;&#x2F;h2&gt;
&lt;p&gt;现在在内部使用 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;expressjs&#x2F;type-is&quot;&gt;type-is&lt;&#x2F;a&gt;。 请参考&lt;code&gt;type-is&lt;&#x2F;code&gt;来提交问题或者查看文档。&lt;&#x2F;p&gt;
&lt;h1 id=&quot;xin-jia-ru&quot;&gt;新加入&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;app-route-path&quot;&gt;app.route(path)&lt;&#x2F;h2&gt;
&lt;p&gt;返回一个新的&lt;code&gt;Route&lt;&#x2F;code&gt;的实例。当收到和这个路由的&lt;code&gt;path&lt;&#x2F;code&gt;相匹配的请求时，这个路由就会被调用。路由可以有自己的中间件和针对 HTTP 动作的方法来处理请求。 请参阅路由和路由线路文档，以便更好地了解如何在 express 中创建路由。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;router-he-route-zhong-jian-jian&quot;&gt;Router 和 Route 中间件&lt;&#x2F;h2&gt;
&lt;p&gt;Router 已经全面改版，现在它是一个功能完善的中间件路由。Router 是在不牺牲参数匹配和中间件的情况下，将你的路由分离到多个文件或者模块的好方法。请参阅 Routes 及&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;expressjs.com&#x2F;4x&#x2F;api.html#router&quot;&gt;路由文档&lt;&#x2F;a&gt; 。 The Rubik&#x27;s Cube is the most popular puzzle on the World. Learn how to solve it with &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;ruwix.com&#x2F;the-rubiks-cube&#x2F;how-to-solve-the-rubiks-cube-beginners-method&#x2F;&quot;&gt;the easiest method&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>【译】Express.js 4.x 新功能</title>
          <pubDate>Thu, 17 Apr 2014 07:44:30 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/new-features-in-express-4-x/</link>
          <guid>https://guchengf.me/blog/new-features-in-express-4-x/</guid>
          <description xml:base="https://guchengf.me/blog/new-features-in-express-4-x/">&lt;p&gt;更多的例子和完整的API文档，请参见&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;expressjs.com&#x2F;4x&#x2F;api.html&quot;&gt;Express 4.x 的文档&lt;&#x2F;a&gt;。你可能对这篇文章也有兴趣 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;visionmedia&#x2F;express&#x2F;wiki&#x2F;Migrating-from-3.x-to-4.x&quot;&gt;从3.x 迁移到 4.x版&lt;&#x2F;a&gt;。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;yi-chu-liao-kun-bang-de-zhong-jian-jian&quot;&gt;移除了捆绑的中间件&lt;&#x2F;h2&gt;
&lt;p&gt;Express 中不再捆绑 Connect 提供的中间件（或者说显示在 “express” 模块中）。你要使用的任何中间件应额外安装并在你的应用的 package.json 中列出。这方便了中间件的功能修复和快速更新，同时避免影响 express 的核心功能。 参见&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;senchalabs&#x2F;connect?source=c#middleware&quot;&gt;中间件模块&lt;&#x2F;a&gt;，这张列表完整的列出了旧的 connect 中间件。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;router-de-gai-jin&quot;&gt;Router 的改进&lt;&#x2F;h2&gt;
&lt;p&gt;express 现在提供了一个更好的“ Router ”功能以及路由 API ，来解决重复性的路由命名情况，并且更容易将路由分解到多个文件，方便项目组织和管理。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;bu-zai-xu-yao-app-use-app-router&quot;&gt;不再需要 app.use(app.router)&lt;&#x2F;h3&gt;
&lt;p&gt;所有的路由功能都将按照它们出现的顺序被添加。你 &lt;em&gt;不用&lt;&#x2F;em&gt; 再使用&lt;code&gt;app.use(app.router)&lt;&#x2F;code&gt;。这解决了 Express 最常见的问题。 换句话说，混合的&lt;code&gt;app.use()&lt;&#x2F;code&gt;和&lt;code&gt;app[VERB]()&lt;&#x2F;code&gt;将 &lt;em&gt;确切地&lt;&#x2F;em&gt; 按照它们的调用顺序工作。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;get&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; home&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&#x2F;public&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;st&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;process&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;cwd&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;get&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&#x2F;users&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; users&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;list&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;post&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&#x2F;users&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; users&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;create&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;app-route-path&quot;&gt;app.route(path)&lt;&#x2F;h3&gt;
&lt;p&gt;取代了原本的&lt;code&gt;app.get()&lt;&#x2F;code&gt;，&lt;code&gt;app.post()&lt;&#x2F;code&gt;等方式（但这些依然可以使用），提供了一个新的&lt;code&gt;route()&lt;&#x2F;code&gt;功能，它会返回一个可被使用的&lt;code&gt;Route&lt;&#x2F;code&gt;实例。然后，你可以在这个实例中调用所有的 HTTP 动作，甚至可以添加具体的中间件到这个路由中。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;route&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&#x2F;users&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;get&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;req&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; res&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; next&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;post&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;req&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; res&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; next&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;route()&lt;&#x2F;code&gt;需要一个&lt;code&gt;path&lt;&#x2F;code&gt;路径参数，这个参数和你创建一个路由时传递给&lt;code&gt;.get()&lt;&#x2F;code&gt;或者&lt;code&gt;.post()&lt;&#x2F;code&gt;的参数相同。 此外，返回的路由有一个&lt;code&gt;.all()&lt;&#x2F;code&gt;方法，如果你想添加中间件到这个路由中，或处理所有的动作，这会很有帮助。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;router-lu-you&quot;&gt;Router（路由）&lt;&#x2F;h3&gt;
&lt;p&gt;另一项新增功能是 express 的&lt;code&gt;Router&lt;&#x2F;code&gt;的公共API。一个Router就像是一个小型的 express 应用。它不包含任何 view 或者 setting，但是确实提供了典型的路由API（&lt;code&gt;.use&lt;&#x2F;code&gt;，&lt;code&gt;.get&lt;&#x2F;code&gt;，&lt;code&gt;.param&lt;&#x2F;code&gt;，&lt;code&gt;.route&lt;&#x2F;code&gt;）。 应用和路由也可以通过&lt;code&gt;.use()&lt;&#x2F;code&gt;方法使用其它路由，这允许你通过多个文件来建立路由，以更好地组织你的应用。 想象一下，在你的项目的一个例子&lt;code&gt;routes&#x2F;people.js&lt;&#x2F;code&gt;。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; people&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; express&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;Router&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;people&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;req&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; res&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; next&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;people&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;get&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; function&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;req&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; res&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt; next&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;module&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;exports&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;people&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; people&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;您可以将其安装在&lt;code&gt;&#x2F;people&lt;&#x2F;code&gt;路径下，这样的话，向&lt;code&gt;&#x2F;people&#x2F;*&lt;&#x2F;code&gt;的任何请求都将被发送到 people 路由。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&#x2F;people&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; require&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;.&#x2F;routes&#x2F;people&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;people&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;更多的例子参见&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;expressjs.com&#x2F;4x&#x2F;api.html#router&quot;&gt;路由器文档&lt;&#x2F;a&gt;。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>express.js 中上传文件的几个注意点</title>
          <pubDate>Thu, 03 Apr 2014 07:46:02 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/some-notes-in-express-file-upload/</link>
          <guid>https://guchengf.me/blog/some-notes-in-express-file-upload/</guid>
          <description xml:base="https://guchengf.me/blog/some-notes-in-express-file-upload/">&lt;h3 id=&quot;she-zhi&quot;&gt;设置：&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;express&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;methodOverride&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;app&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;use&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;express&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;bodyParser&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span&gt;uploadDir&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;public&#x2F;images&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt;keepExtensions&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B58900, #79B8FF);&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;bodyParser&lt;&#x2F;code&gt;设置项一定要紧跟在 &lt;code&gt;methodOverride&lt;&#x2F;code&gt;后面，同时 &lt;code&gt;uploadDir&lt;&#x2F;code&gt;参数的目录需要手动创建。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;biao-dan-shang-chuan&quot;&gt;表单上传：&lt;&#x2F;h3&gt;
&lt;p&gt;使用表单上传时，需要给 &lt;code&gt;&amp;lt;Form&amp;gt;&lt;&#x2F;code&gt; 添加参数 &lt;code&gt;enctype=&quot;multipart&#x2F;form-data&quot;&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;formdata-jquery-ajax&quot;&gt;FormData &amp;amp; jQuery.ajax：&lt;&#x2F;h3&gt;
&lt;p&gt;使用 &lt;code&gt;FormData&lt;&#x2F;code&gt; 结合 &lt;code&gt;jQuery.ajax&lt;&#x2F;code&gt; 方式上传时&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; formData&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; FormData&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;formdata&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;append&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;file&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; files&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; uploadURL&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&#x2F;upload&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;ajax&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    url&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; uploadURL&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    type&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;POST&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    contentType&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B58900, #79B8FF);&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    processData&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B58900, #79B8FF);&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    cache&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B58900, #79B8FF);&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    data&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; formData&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;    success&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; function&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;data&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;    console&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;log&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;data&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;contentType: false, processData: false&lt;&#x2F;code&gt; 需要设置&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>百度 pcs api 使用小记</title>
          <pubDate>Sun, 09 Mar 2014 09:18:39 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/baidu-pcs-api-usage/</link>
          <guid>https://guchengf.me/blog/baidu-pcs-api-usage/</guid>
          <description xml:base="https://guchengf.me/blog/baidu-pcs-api-usage/">&lt;p&gt;利用Implicit Grant授权的模式，在授权认证之后直接从回调链接URL获取access_token，优点是方便，不需要后端，缺点是不能刷新access_token，每一个月需要重新授权一次。适合轻网页应用。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;shou-quan-lian-jie&quot;&gt;授权链接：&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;https:&#x2F;&#x2F;openapi.baidu.com&#x2F;oauth&#x2F;2.0&#x2F;authorize?response_type=token?client_id=CLIENT_ID?redirect_uri=http%3A%2F%2REDIRECT.URI%?scope=basic+netdisk?display=popup&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;cong-hui-diao-di-zhi-huo-qu-access-token&quot;&gt;从回调地址获取access_token：&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; getQueryStringRegExp&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;name&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;  var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; reg&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; RegExp&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;(^|?|&amp;amp;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; name&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;=([^&amp;amp;]*)(s|&amp;amp;|$)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;reg&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;test&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;location&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;href&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; return&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; unescape&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;RegExp&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;$2&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;replace&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;g&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;  return&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B58900, #79B8FF);&quot;&gt; null&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;这个函数用以直接获取地址栏URL中的某个fragment&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;可以直接使用本页面作为回调页面。加一个授权验证即可。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; accessToken&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; getQueryStringRegExp&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;access_token&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 获取access_token&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;accessToken&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B58900, #79B8FF);&quot;&gt; null&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 如果access_token存在，就直接进行用户授权验证&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;  $&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;ajax&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    url&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;https:&#x2F;&#x2F;openapi.baidu.com&#x2F;rest&#x2F;2.0&#x2F;passport&#x2F;users&#x2F;isAppUser?access_token=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; accessToken&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    dataType&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;jsonp&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;done&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;data&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;    var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; isAuth&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;data&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;result&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 授权验证的返回值中的result参数为&amp;#39;1&amp;#39;的话，就是已经授权了&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;      isAuth&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;已授权&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;      &#x2F;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 获取授权用户基本信息 &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;      $&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;ajax&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        url&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;https:&#x2F;&#x2F;openapi.baidu.com&#x2F;rest&#x2F;2.0&#x2F;passport&#x2F;users&#x2F;getLoggedInUser?access_token=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; accessToken&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        dataType&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;jsonp&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;done&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;data&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;        &#x2F;*&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;        data.uid 用户数字id&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;        data.uname 用户名&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;        data.portrait 用户头像id&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;        头像的链接为：&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;        small image: http:&#x2F;&#x2F;tb.himg.baidu.com&#x2F;sys&#x2F;portraitn&#x2F;item&#x2F;{$portrait}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;        large image: http:&#x2F;&#x2F;tb.himg.baidu.com&#x2F;sys&#x2F;portrait&#x2F;item&#x2F;{$portrait}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;        *&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;      &#x2F;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 获取授权用户的个人云存储的基本信息 &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;      $&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;ajax&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        url&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;https:&#x2F;&#x2F;pcs.baidu.com&#x2F;rest&#x2F;2.0&#x2F;pcs&#x2F;quota?method=info?access_token=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; accessToken&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        dataType&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;jsonp&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;done&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;data&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;        &#x2F;*&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;        data.quota 是空间总量&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;        data.used 是已用容量&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;        *&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; else&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;      isAuth&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;未授权&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 未授权的result值为&amp;#39;0&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</description>
      </item>
      <item>
          <title>一种jQuery实现区域外点击事件的方法</title>
          <pubDate>Sat, 18 Jan 2014 09:45:24 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/click-out-of-the-area-in-jquery/</link>
          <guid>https://guchengf.me/blog/click-out-of-the-area-in-jquery/</guid>
          <description xml:base="https://guchengf.me/blog/click-out-of-the-area-in-jquery/">&lt;p&gt;在写弹出菜单插件时，需要实现点击弹出菜单以外的区域时关闭菜单的功能。 发现了一种比较简单地实现这一事件的方法。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;document&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;mouseup&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; _con&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; $&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; 目标区域 &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 设置目标区域&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; if&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;_con&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;is&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;target&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;amp&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;amp&lt;&#x2F;span&gt;&lt;span&gt;; &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;_con&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;has&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;target&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt;length&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; ===&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; Mark 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; some&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; code&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;...&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 功能代码&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;&#x2F;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; Mark 1 的原理：&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;判断点击事件发生在区域外的条件是：&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;1. 点击事件的对象不是目标区域本身&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;2. 事件对象同时也不是目标区域的子元素&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;*&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</description>
      </item>
      <item>
          <title>jQuery 弹出菜单插件 – jQuery.popmenu</title>
          <pubDate>Thu, 16 Jan 2014 09:46:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/jquery-plugin-pop-menu/</link>
          <guid>https://guchengf.me/blog/jquery-plugin-pop-menu/</guid>
          <description xml:base="https://guchengf.me/blog/jquery-plugin-pop-menu/">&lt;p&gt;因为自己要用，所以写了一个弹出菜单插件&lt;&#x2F;p&gt;
&lt;h1 id=&quot;jquerypopmenu&quot;&gt;jQueryPopMenu&lt;&#x2F;h1&gt;
&lt;p&gt;simple responsive popup menu, it’s a jQuery plugin.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;demo&quot;&gt;Demo&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;gucheen.github.io&#x2F;jQueryPopMenu&#x2F;&quot;&gt;http:&#x2F;&#x2F;gucheen.github.io&#x2F;jQueryPopMenu&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;link&quot;&gt;Link&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;gucheen&#x2F;jQueryPopMenu&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;gucheen&#x2F;jQueryPopMenu&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;intro&quot;&gt;Intro&lt;&#x2F;h2&gt;
&lt;p&gt;这是一个基于 jQuery 的弹出菜单插件。有基本的自适应特性。可以设置包括背景色、菜单按钮大小、圆角或者直角等。
&lt;strong&gt;注&lt;&#x2F;strong&gt;：Demo页面中的所有icon都基于FontAwesome，并非必须。可以自行更改。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;i.loli.net&#x2F;2019&#x2F;04&#x2F;25&#x2F;5cc11c33af4fe.jpg&quot; alt=&quot;jQuery.popmenu-1&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;i.loli.net&#x2F;2019&#x2F;04&#x2F;25&#x2F;5cc11c33b9e4b.jpg&quot; alt=&quot;jQuery.popmenu-2&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;info&quot;&gt;Info&lt;&#x2F;h2&gt;
&lt;p&gt;Version 1.0
基于jQuery 2.0.3 构建。 Chrome, Safari, Firefox, Opera 可用。无IE支持。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;usage&quot;&gt;Usage&lt;&#x2F;h2&gt;
&lt;p&gt;使用 &lt;code&gt;$(&#x27; #target &#x27;).popmenu();&lt;&#x2F;code&gt; 调用。 参数包括：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     &amp;#39;controller&amp;#39;: true, &#x2F;&#x2F;设定是否使用控制按钮，设置为false，菜单将一直显示&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     &amp;#39;width&amp;#39;: &amp;#39;300px&amp;#39;, &#x2F;&#x2F;菜单总宽度&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     &amp;#39;background&amp;#39;: &amp;#39;#34495e&amp;#39;, &#x2F;&#x2F;菜单背景色&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     &amp;#39;focusColor&amp;#39;: &amp;#39;#1abc9c&amp;#39;, &#x2F;&#x2F;菜单按钮hover时颜色&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     &amp;#39;borderRadius&amp;#39;: &amp;#39;10px&amp;#39;, &#x2F;&#x2F;边角弧度，设置为0，为直角&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     &amp;#39;top&amp;#39;: &amp;#39;50&amp;#39;, &#x2F;&#x2F;上移距离，向上移动多少就设置为多少&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     &amp;#39;left&amp;#39;: &amp;#39;0&amp;#39;, &#x2F;&#x2F;左移距离，设置同上&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     &amp;#39;iconSize&amp;#39;: &amp;#39;100px&amp;#39; &#x2F;&#x2F;菜单按钮大小，目前是正方形设计（宽高相同）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &#x2F;&#x2F;以上参数数值为默认值&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &#x2F;&#x2F;使用时无需受Demo影响，按钮可以是纯文字，内容排版自行安排设计。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;注：控制按钮对应 &lt;code&gt;.pop_ctrl&lt;&#x2F;code&gt;，即名字为 &lt;code&gt;pop_ctrl&lt;&#x2F;code&gt; 的class，使用class是为了方便同时使用多个菜单，各菜单间无影响。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Ubuntu A卡开源驱动电源管理</title>
          <pubDate>Fri, 10 Jan 2014 09:54:19 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/ubuntu-power-saving-with-the-radeon-driver/</link>
          <guid>https://guchengf.me/blog/ubuntu-power-saving-with-the-radeon-driver/</guid>
          <description xml:base="https://guchengf.me/blog/ubuntu-power-saving-with-the-radeon-driver/">&lt;p&gt;Ubuntu下，A卡的开源驱动有一些自带的电源管理功能，对于笔记本用户来说尤其重要，无论是风扇降噪，还是降温，都有不错的效果，下面是使用方法：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo -i&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#进入root模式&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;echo dynpm &amp;gt; &#x2F;sys&#x2F;class&#x2F;drm&#x2F;card0&#x2F;device&#x2F;power_method&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;## 基于GPU负载的动态调整&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;echo profile &amp;gt; &#x2F;sys&#x2F;class&#x2F;drm&#x2F;card0&#x2F;device&#x2F;power_method&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;## 基于Profile（配置文件）的频率切换；这是默认的模式&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;如果你选择了Profile模式的话，可以有几个不同的配置文件进行切换&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;echo default &amp;gt; &#x2F;sys&#x2F;class&#x2F;drm&#x2F;card0&#x2F;device&#x2F;power_profile&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 默认的模式&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;echo low &amp;gt; &#x2F;sys&#x2F;class&#x2F;drm&#x2F;card0&#x2F;device&#x2F;power_profile&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;## 强制使用最低的可用频率；&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;## 在一些笔记本和显示设备上可能会有一定问题, 因为这是关闭dpms时使用的模式&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;echo mid &amp;gt; &#x2F;sys&#x2F;class&#x2F;drm&#x2F;card0&#x2F;device&#x2F;power_profile&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;## 强制GPU使用&amp;#39;mid&amp;#39;的电源状态；在常规情况下，要比&amp;#39;low&amp;#39;更安全&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;echo high &amp;gt; &#x2F;sys&#x2F;class&#x2F;drm&#x2F;card0&#x2F;device&#x2F;power_profile&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;## 强制使用最高可用频率&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;echo auto &amp;gt; &#x2F;sys&#x2F;class&#x2F;drm&#x2F;card-0&#x2F;device&#x2F;power_profile&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;## 在 &amp;#39;high&amp;#39;和&amp;#39;mid&amp;#39;之前切换，根据系统是否使用电池供电。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;实际情况下，使用 &lt;code&gt;dynpm&lt;&#x2F;code&gt; 或者 profile 中的 &lt;code&gt;mid&lt;&#x2F;code&gt; 模式，都可以有效的降低风扇转速和显卡温度。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>tmux 滚动功能设置</title>
          <pubDate>Thu, 02 Jan 2014 09:55:48 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/tmux-scrolling-set/</link>
          <guid>https://guchengf.me/blog/tmux-scrolling-set/</guid>
          <description xml:base="https://guchengf.me/blog/tmux-scrolling-set/">&lt;p&gt;使用tmux之后，原本的鼠标滚动查看历史记录就变成了切换历史命令，不是很习惯。可以通过以下方法修改回来。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;~&#x2F;&lt;&#x2F;code&gt; 下新建 &lt;code&gt;.tmux.conf&lt;&#x2F;code&gt;（如果没有的话），其中加入下面这句：&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;set-window-option -g mode-mouse on&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;然后使用这个conf：&lt;code&gt;tmux source-file .tmux.conf&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;就可以继续使用滚轮查看历史记录啦&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>【译】利用Emmet来提高你的CSS编码速度</title>
          <pubDate>Mon, 30 Dec 2013 09:56:37 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/writing-turbo-charged-css-with-emmet/</link>
          <guid>https://guchengf.me/blog/writing-turbo-charged-css-with-emmet/</guid>
          <description xml:base="https://guchengf.me/blog/writing-turbo-charged-css-with-emmet/">&lt;p&gt;大多数关于Emmet的文章和教程都是在说明它对HTML的处理能力，但是今天我们要来关注一下Emmet的CSS部分。准备好来增强你的CSS手写能力了吗？让我们开始吧！&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;注&lt;&#x2F;strong&gt;：在你阅读下面的部分之前，建议你先对CSS有一定的了解。&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;emmetshi-shen-me&quot;&gt;Emmet是什么？&lt;&#x2F;h2&gt;
&lt;p&gt;Emmet采用文本缩写的方法，集合了不同的缩写，并且扩展为对应的html&#x2F;xml&#x2F;css。访问 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;emmet.io&#x2F;download&#x2F;&quot;&gt;下载页面&lt;&#x2F;a&gt; ，并为你的编辑器安装Emmet。&lt;&#x2F;p&gt;
&lt;p&gt;在使用Emmet编写代码时，输入适当的缩写，然后按下Emmet的功能键。在Sublime Text中，是&lt;code&gt;TAB&lt;&#x2F;code&gt;键。你正在处理的文件的语法将决定使用哪些缩写。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;wei-shen-me-yao-shi-yong-emmet&quot;&gt;为什么要使用Emmet？&lt;&#x2F;h2&gt;
&lt;p&gt;Emmet使用符合常识的缩写来简化编写代码的过程。它可以起到多大的作用，取决于你投入了多少时间去学习它的来龙去脉。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Emmet（以前叫做Zen Coding ）是一个面向Web开发者的工具，它可以大大加快你的HTML和CSS的工作流程。 它不仅可以节省你的时间，还可以使编写代码的过程更加轻松愉快。只要输入很少的字符，然后看着它们神奇地扩展为格式完美的代码！如果产生了一些错误，撤销按钮可以将扩展后的代码变回原本的缩写形式，这样你就可以再次编辑并且将它扩展。&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;我同时还发现Emmet让我更加轻松地记住了代码。缩写毫无疑问更加易于记忆。 &lt;code&gt;text-transform:&lt;&#x2F;code&gt;对应 “tt” 和 &lt;code&gt;text-align:justify;&lt;&#x2F;code&gt; 对应 “taj” 。可以看到这会有多大的帮助。你将开始学习新的CSS属性并且只需要记住它的缩写。你甚至不需要担心分号和空格，Emmet为你解决这些事情！&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;emmethe-css&quot;&gt;Emmet和CSS&lt;&#x2F;h2&gt;
&lt;p&gt;让我们来看看Emmet的CSS缩写的基本构成，以及它如何加快工作流程。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;属性（Properties）&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;CSS对属性赋予相应的值，如 font-size，margin，padding，等等。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cdn.tutsplus.com&#x2F;webdesign&#x2F;authors&#x2F;ian-yates&#x2F;css-best-property-value.png&quot; alt=&quot;css-best-property-value&quot; &#x2F;&gt;
&lt;em&gt;取自&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;webdesign.tutsplus.com&#x2F;tutorials&#x2F;htmlcss-tutorials&#x2F;the-best-way-to-learn-css-2&#x2F;&quot;&gt;学习CSS的最佳方法&lt;&#x2F;a&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Emmet对每个已知的CSS属性定义了一个缩写。因此， &lt;code&gt;border-bottom&lt;&#x2F;code&gt; 就是 &lt;code&gt;bdb&lt;&#x2F;code&gt; ， &lt;code&gt;border-top&lt;&#x2F;code&gt; 就是 &lt;code&gt;bdt&lt;&#x2F;code&gt; 。下面这个例子是 &lt;code&gt;font-size&lt;&#x2F;code&gt; ，也就是 &lt;code&gt;fz&lt;&#x2F;code&gt; 。&lt;&#x2F;p&gt;
&lt;p&gt;键入缩写之后，按下功能键（我的配置，TAB）和Emmet会神奇地将缩写扩展为有效的CSS，并且将光标移动到你会需要继续输入的地方。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cdn.tutsplus.com&#x2F;webdesign&#x2F;uploads&#x2F;2013&#x2F;10&#x2F;emmet-css-property.gif&quot; alt=&quot;Properties&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;值（Values）&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;现在我们已经了解了属性，是时候添加一个值了。这是通过键入缩写与所需的值的组合来完成的。例如，&lt;code&gt;fz18&lt;&#x2F;code&gt; 将会输出 “font-size: 18px&lt;code&gt;;&lt;&#x2F;code&gt; 。你不需要输入”px”，因为Emmet会默认添加它。如果一个项目没有单位（如 &lt;code&gt;font-weight&lt;&#x2F;code&gt; ），Emmet也足够聪明地知道不要添加 px。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cdn.tutsplus.com&#x2F;webdesign&#x2F;uploads&#x2F;2013&#x2F;10&#x2F;emmet-css-value.gif&quot; alt=&quot;Values&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;单位（Units）&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;如果你并不都是使用像素怎么办？&lt;code&gt;em&lt;&#x2F;code&gt; ， &lt;code&gt;rem&lt;&#x2F;code&gt; ， &lt;code&gt;%&lt;&#x2F;code&gt; ， &lt;code&gt;ex&lt;&#x2F;code&gt; ，和 &lt;code&gt;px&lt;&#x2F;code&gt; 这些单位都可以在Emmet中使用。每个单位也有一个缩写形式（虽然这看起来可能有点极端）：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;px&lt;&#x2F;code&gt; → 默认&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;p&lt;&#x2F;code&gt; → &lt;code&gt;%&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;e&lt;&#x2F;code&gt; → &lt;code&gt;em&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;r&lt;&#x2F;code&gt; → &lt;code&gt;rem&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;x&lt;&#x2F;code&gt; → &lt;code&gt;ex&lt;&#x2F;code&gt; 要使用一个单位，只需值的末尾加上单位的缩写。下面的例子是用单位 &lt;code&gt;em&lt;&#x2F;code&gt; 定义一个字体大小&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cdn.tutsplus.com&#x2F;webdesign&#x2F;uploads&#x2F;2013&#x2F;10&#x2F;emmet-css-unit.gif&quot; alt=&quot;Units&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;多个单位（Multiple Units）&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;某些属性，比如 &lt;code&gt;margin&lt;&#x2F;code&gt; ，允许多个值。要用Emmet做到这一点，就用破折号（&lt;code&gt;-&lt;&#x2F;code&gt;）分隔每一个值。来看看下面这个例子，它给 body 定义 &lt;code&gt;margin&lt;&#x2F;code&gt; 的四个值。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cdn.tutsplus.com&#x2F;webdesign&#x2F;uploads&#x2F;2013&#x2F;10&#x2F;emmet-css-multiple-units.gif&quot; alt=&quot;Multiple Units&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;颜色（Colors）&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Emmet要求你在前面加上# ，而不是将加到值的末尾。所以 &lt;code&gt;#&lt;&#x2F;code&gt; 紧跟在你的属性后面，在值的前面。不同的字符数输出不同的十六进制代码。来看一些例子：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;#1&lt;&#x2F;code&gt; → &lt;code&gt;#111111&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;#e0&lt;&#x2F;code&gt; → &lt;code&gt;#e0e0e0&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;#fc0&lt;&#x2F;code&gt; → &lt;code&gt;#ffcc00&lt;&#x2F;code&gt; 下面是定义 body 颜色的一个例子，使用 &lt;code&gt;#111&lt;&#x2F;code&gt; （ &lt;code&gt;c#1&lt;&#x2F;code&gt; ）：&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cdn.tutsplus.com&#x2F;webdesign&#x2F;uploads&#x2F;2013&#x2F;10&#x2F;emmet-css-colors.gif&quot; alt=&quot;Colors&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;!important&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;尽管 &lt;code&gt;!important&lt;&#x2F;code&gt; 标签不应该经常使用，Emmet 还是提供了它，为防万一。添加一个感叹号 &lt;code&gt;!&lt;&#x2F;code&gt; 到你的缩写，像这样：&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cdn.tutsplus.com&#x2F;webdesign&#x2F;uploads&#x2F;2013&#x2F;10&#x2F;emmet-css-important.gif&quot; alt=&quot;!important&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;多个属性（Multiple Properties）&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;现在，我们对Emmet的CSS功能的有了一个基本的了解，是时候开始把它们结合起来。像类似类似处理HTML的方式，你可以给它们每一个都添加一个加号（&lt;code&gt;+&lt;&#x2F;code&gt;）。请记住，如果你遇到了问题，你可以随时撤销并修改字符串。&lt;&#x2F;p&gt;
&lt;p&gt;写出你的所需的每一个属性和值，用 &lt;code&gt;+&lt;&#x2F;code&gt; 分隔它们，然后按下功能键来查看结果。&lt;&#x2F;p&gt;
&lt;p&gt;下面是为 &lt;code&gt;body&lt;&#x2F;code&gt; 定义不同的 margin 和 padding 的一个例子。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cdn.tutsplus.com&#x2F;webdesign&#x2F;uploads&#x2F;2013&#x2F;10&#x2F;emmet-css-multiple-properties.gif&quot; alt=&quot;Multiple Properties&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;例子&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;记住，你可以组合或者独立地使用所有这些缩写。这不是关于怎样一次就使用Emmet写出正确地代码，只是让你更容易编写你的CSS。为了总结这些很酷的GIF动画，这里有个一个例子，快速创建一个 class 为&lt;code&gt;panel&lt;&#x2F;code&gt; 的 div。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;cdn.tutsplus.com&#x2F;webdesign&#x2F;uploads&#x2F;2013&#x2F;10&#x2F;emmet-css-example.gif&quot; alt=&quot;例子&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;jie-lun&quot;&gt;结论&lt;&#x2F;h2&gt;
&lt;p&gt;Emmet是一个强大的工具。被一些人称为“高速”的编码工具，它可以让你花更少的时间一遍又一遍地写同样的代码，而无需手动创建自己的代码段。Emmet的灵感来自于CSS选择器，并且可以在所有主流的编辑器中使用，以适应任何开发者的工作流程。 请记住，你添加到你的工作流的任何新工具都会有一个学习曲线，但不要花费比你需要弄清楚它是如何为你工作这个过程更多的时间。定期查看文档是一个很好的复习，同时Emmet提供了一个 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;docs.emmet.io&#x2F;cheat-sheet&#x2F;&quot;&gt;cheat sheet&lt;&#x2F;a&gt; ，囊括了所有可用的功能。这是为了帮助你少一些思索，同时写更多的代码而建的！&lt;&#x2F;p&gt;
&lt;h2 id=&quot;xiang-guan-lian-jie&quot;&gt;相关链接&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;docs.emmet.io&#x2F;css-abbreviations&#x2F;&quot;&gt;Emmet CSS Documentation&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;docs.emmet.io&#x2F;cheat-sheet&#x2F;&quot;&gt;Emmet Cheat Sheet&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;webdesign.tutsplus.com&#x2F;tutorials&#x2F;applications&#x2F;build-bootstrap-in-minutes-using-emmet&#x2F;&quot;&gt;Build Bootstrap in Minutes Using Emmet&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;coding.smashingmagazine.com&#x2F;2013&#x2F;03&#x2F;26&#x2F;goodbye-zen-coding-hello-emmet&#x2F;&quot;&gt;Smashing Magazine Emmet Article&lt;&#x2F;a&gt; &lt;strong&gt;&lt;em&gt;Translated by Guc.&lt;&#x2F;em&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>Ubuntu 安装 Chrome-Beta 提示缺少 libxss1</title>
          <pubDate>Sun, 29 Dec 2013 10:03:09 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/ubuntu-install-chrome-beta-require-libxss1/</link>
          <guid>https://guchengf.me/blog/ubuntu-install-chrome-beta-require-libxss1/</guid>
          <description xml:base="https://guchengf.me/blog/ubuntu-install-chrome-beta-require-libxss1/">&lt;p&gt;今天在 Ubuntu上安装chrome beta，提示缺少libxss1，从软件中心和apt-get安装相应libxss1之后，都无法解决这个问题，上网搜索之后，通过这个包解决了问题。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;www.ubuntuupdates.org&#x2F;package&#x2F;core&#x2F;raring&#x2F;main&#x2F;base&#x2F;libxss1&quot;&gt;http:&#x2F;&#x2F;www.ubuntuupdates.org&#x2F;package&#x2F;core&#x2F;raring&#x2F;main&#x2F;base&#x2F;libxss1&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;下载对应的版本，安装之后就可以解决。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Shadowsocks + cow 代理方案</title>
          <pubDate>Sun, 01 Dec 2013 10:01:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/proxy-with-shadowsocks-cow/</link>
          <guid>https://guchengf.me/blog/proxy-with-shadowsocks-cow/</guid>
          <description xml:base="https://guchengf.me/blog/proxy-with-shadowsocks-cow/">&lt;p&gt;首先搭建Shadowsocks，参见官方使用指南：&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;clowwindy&#x2F;shadowsocks#usage&quot;&gt;官方使用指南（英文）&lt;&#x2F;a&gt; &#x2F; &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;clowwindy&#x2F;shadowsocks#usage&quot;&gt;官方使用指南（中文）&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;这里选择了SS的python版本，事实上，cow本身提供了代理方案，但是Shadowsocks的操作空间更大。&lt;&#x2F;p&gt;
&lt;p&gt;官方指南使用 pip 安装SS环境，在一些没有安装pip的vps，需要先安装一下，ubuntu系的是&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo apt-get install python-pip&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;接着就新建一个SS的配置文件 config.json 。可以新建一个 SS 目录，用来存放，方便寻找。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;quot;server&amp;quot;:&amp;quot;my_server_ip&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;quot;server_port&amp;quot;:8388,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;quot;local_port&amp;quot;:1080,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;quot;password&amp;quot;:&amp;quot;barfoo!&amp;quot;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;quot;timeout&amp;quot;:600,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;quot;method&amp;quot;:&amp;quot;table&amp;quot; &#x2F;&#x2F;加密方案推荐 aes-256-cfb ，需安装 m2crypto&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;如果是单IP VPS，推荐使用 &lt;code&gt;0.0.0.0&lt;&#x2F;code&gt; 作为 server 的值。&lt;&#x2F;p&gt;
&lt;p&gt;加密方案使用 &lt;code&gt;aes-256-cfb&lt;&#x2F;code&gt; ，安装 &lt;code&gt;m2crypto&lt;&#x2F;code&gt; 。ubuntu 系&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo apt-get install python-m2crypto&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;安装 gevent 可以提高 Shadowsocks 的性能：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo apt-get install python-gevent&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;SS 可以使用命令行参数覆盖默认配置，具体参见 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;clowwindy&#x2F;shadowsocks&#x2F;wiki&#x2F;Shadowsocks-%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E#%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0&quot;&gt;命令行参数&lt;&#x2F;a&gt; 。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;注&lt;&#x2F;strong&gt;：以上安装命令需要管理员权限。&lt;&#x2F;p&gt;
&lt;p&gt;接下来在配置文件（config.json) 文件所在目录使用&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;nohup ssserver &amp;gt; log &amp;amp;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;这样可以在后台运行SS，断开SSH连接之后依旧可以使用SS，调试情况下，可以使用 ssserver 启动 SS，可以看到信息记录。&lt;&#x2F;p&gt;
&lt;p&gt;然后配置 cow 。官方文档： &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;cyfdecyf&#x2F;cow#cow-climb-over-the-wall-proxy&quot;&gt;cow github&lt;&#x2F;a&gt; 以 windows 版本为例 。&lt;&#x2F;p&gt;
&lt;p&gt;下载：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;dl.chenyufei.info&#x2F;cow&#x2F;&quot;&gt;cow&lt;&#x2F;a&gt; 。也可以从 go 源码编译。&lt;&#x2F;p&gt;
&lt;p&gt;windows 版本的 cow 配置文件为目录下 rc.txt 。实际情况下，我们需要的部分很少。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;ini&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;开头的行是注释，会被忽略&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 本地 HTTP 代理地址&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 配置 HTTP 和 HTTPS 代理时请填入该地址&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; 或者在自动代理配置中填入 http:&#x2F;&#x2F;127.0.0.1:7777&#x2F;pac&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;listen&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; http:&#x2F;&#x2F;127.0.0.1:7777&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; SOCKS5 二级代理&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; proxy = socks5:&#x2F;&#x2F;127.0.0.1:1080&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; HTTP 二级代理&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; proxy = http:&#x2F;&#x2F;127.0.0.1:8080&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; proxy = http:&#x2F;&#x2F;user:password@127.0.0.1:8080&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; shadowsocks 二级代理&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;proxy&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; ss:&#x2F;&#x2F;aes-256-cfb:password@1.2.3.4:8388&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; cow 二级代理&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #6A737D);font-style: italic;&quot;&gt; proxy = cow:&#x2F;&#x2F;aes-128-cfb:password@1.2.3.4:8388&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;由于这里使用SS作为二级代理，因此将其他二级代理的配置都注释了，可以根据自己的情况自行配制。&lt;&#x2F;p&gt;
&lt;p&gt;需要修改的有两个地方，首先是 listen 的端口，选一个好记又不冲突的吧。&lt;&#x2F;p&gt;
&lt;p&gt;另外是配置 SS 的参数。在 shadowsocks 二级代理处。&lt;&#x2F;p&gt;
&lt;p&gt;此处我已经使用了 &lt;code&gt;aes-256-cfb&lt;&#x2F;code&gt; 作为样例，可以根据自己的情况修改。冒号后填入SS密码，[code]@[&#x2F;code]后填入服务器完整地址。&lt;&#x2F;p&gt;
&lt;p&gt;运行 &lt;code&gt;cow-taskbar.exe&lt;&#x2F;code&gt; 或者 &lt;code&gt;cow-hide.exe&lt;&#x2F;code&gt; 启动 cow 。前者会自动缩小到系统托盘，后者则是完全后台。不需要再额外运行 SS 本地程序。&lt;&#x2F;p&gt;
&lt;p&gt;配合浏览器端的代理扩展。例如 Chrome 上的 &lt;code&gt;Proxy SwitchySharp&lt;&#x2F;code&gt; 。在 HTTP&#x2F;HTTPS 中填入 listen 参数。或者直接使用 pac 。&lt;&#x2F;p&gt;
&lt;p&gt;接来下就可以开始体验了。实际使用下，cow 的作用非常明显，相当于一个实时更新的 list ，无需再担心切换问题。&lt;&#x2F;p&gt;
&lt;p&gt;SS 和 cow 的代码、原理、其他使用方式都可以参照它们的 github 主页。其中SS还提供了 nodejs 及源码 等其他服务器版本，以及多平台的本地版本，可以在不同情况下使用。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Noppoo Choc 系列键盘Mac下键位修复</title>
          <pubDate>Mon, 07 Oct 2013 10:03:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/noppoo-choc-mac-fix-key/</link>
          <guid>https://guchengf.me/blog/noppoo-choc-mac-fix-key/</guid>
          <description xml:base="https://guchengf.me/blog/noppoo-choc-mac-fix-key/">&lt;p&gt;Noppoo家产的机械键盘，因为其低廉的价格和不错的性能受到不少像我这样没有太多钱烧键盘的人的喜爱。&lt;&#x2F;p&gt;
&lt;p&gt;默认情况下，Noppoo的键盘在Mac下会有错位问题（部分键位），以前有一种解决方法是USB转PS2转USB，这个方法比较麻烦，而且不一定有效。&lt;&#x2F;p&gt;
&lt;p&gt;现在有了更好的解决方法，&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;thefloweringash.github.io&#x2F;iousbhiddriver-descriptor-override&#x2F;&quot;&gt;IOUSBHIDDriverDescriptorOverride&lt;&#x2F;a&gt; 是一个针对Noppoo的USB键盘Mac OS系统修正项目。配合 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;pqrs.org&#x2F;macosx&#x2F;keyremap4macbook&#x2F;&quot;&gt;KeyRemap4MacBook&lt;&#x2F;a&gt; 可以完美修正Noppoo的Mac兼容性。&lt;&#x2F;p&gt;
&lt;p&gt;1、安装 最新版的 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;thefloweringash.com&#x2F;iousbhiddriver-descriptor-override&#x2F;downloads&#x2F;IOUSBHIDDriverDescriptorOverride-2013-04-21-b545d15.pkg&quot;&gt;IOUSBHIDDriverDescriptorOverride&lt;&#x2F;a&gt; 。&lt;&#x2F;p&gt;
&lt;p&gt;2、安装 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;pqrs.org&#x2F;macosx&#x2F;keyremap4macbook&#x2F;&quot;&gt;KeyRemap4MacBook&lt;&#x2F;a&gt; 。（这可以修复部分键位的残留问题。）&lt;&#x2F;p&gt;
&lt;p&gt;3、重启！体验一下。&lt;&#x2F;p&gt;
&lt;p&gt;事实上，安装完 IOUSBHIDDriverDescriptorOverride 之后只能使 Mac 正确识别Noppoo 的键盘，少数键位依旧存在问题，比如 ? + 等这几个上档功能键位不可用（无法通过上档输入这几个字符）。通过安装 KeyRemap4MacBook 就可以完美解决这些问题。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;注&lt;&#x2F;strong&gt;：考虑到实际情况下，默认是由 windows 键 作为 cmd 键，非常不顺手，所以在系统偏好设置 – 键盘，里进行修改，点击 修饰键，然后选择对应的Noppoo键盘，将 option 和 cmd 键的对应键调换一下，使得 alt 键作为 cmd ，windows 键作为 option ，就会符合 MacBook 自带键盘的键位习惯了。&lt;&#x2F;p&gt;
&lt;p&gt;IOUSBHIDDriverDescriptorOverride：&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;i.loli.net&#x2F;2019&#x2F;04&#x2F;25&#x2F;5cc11cf04b329.jpg&quot; alt=&quot;IOUSBHIDDriverDescriptorOverride&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>【译】AngularJS的一些陷阱</title>
          <pubDate>Thu, 12 Sep 2013 11:06:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/angularjs-pitfalls/</link>
          <guid>https://guchengf.me/blog/angularjs-pitfalls/</guid>
          <description xml:base="https://guchengf.me/blog/angularjs-pitfalls/">&lt;p&gt;这是对我和 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;valeriivasin&quot;&gt;Valerii&lt;&#x2F;a&gt; 在 MoscowJS 2013 上的演讲的一个小的补充。”&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;valeriivasin.github.io&#x2F;moscowjs2013&#x2F;&quot;&gt;JavaScript @ LiveJournal&lt;&#x2F;a&gt;” (文字是俄语的，很抱歉)。&lt;&#x2F;p&gt;
&lt;p&gt;在LiveJournal上，我们经过了很长的一个过程，从jQuery UI的扩展到BackBone，最终转移到了AngularJS，到目前为止，一切都非常好，但是AngularJS有一些小的陷阱。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在页面上通过 pushState 来使用 &lt;code&gt;$location&lt;&#x2F;code&gt; 。&lt;&#x2F;p&gt;
&lt;p&gt;如果你想要使用 &lt;code&gt;history.pushState&lt;&#x2F;code&gt; 改变URL参数，来向旧的页面注入一些 Angular 代码，我想你会遇到一些很糟糕的情况。在我们的案例中，旧的代码修改了 &lt;code&gt;location.search&lt;&#x2F;code&gt; 之后，Angular 会尝试通知所有的 Controller 这个变动，但是因为这个变动来自于非Angular代码，因此 digest 就会进入死循环。我想这应该是老版本代码中的一个bug，但是我们不想触发它，因此，我们需要找到某种方法来屏蔽掉它。问题在于，我们没有手动向任何一个 module 注入 &lt;code&gt;$location&lt;&#x2F;code&gt;。在通过一些追踪之后，我们发现，&lt;code&gt;ng-include&lt;&#x2F;code&gt; 依赖于 &lt;code&gt;$anchorScroll&lt;&#x2F;code&gt;，而这个方法在被调用时，会依赖 &lt;code&gt;$location&lt;&#x2F;code&gt;。在做了一些仔细的测试，以了解为什么 ng-include 需要这些之后，我们决定使用这样一个 hack ：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;angular.module(&amp;#39;ourModule&amp;#39;, []).value(&amp;#39;$anchorScroll&amp;#39;, null);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;页面上没有$location，意味着没有events也就意味着没有死循环。&lt;&#x2F;p&gt;
&lt;p&gt;测试示例： &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;jsbin.com&#x2F;IxAGEzI&#x2F;1&quot;&gt;http:&#x2F;&#x2F;jsbin.com&#x2F;IxAGEzI&#x2F;1&lt;&#x2F;a&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;更新：issue 已经添加并确认 。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;在 &lt;code&gt;&amp;lt;form&amp;gt;&lt;&#x2F;code&gt; 标签上使用 ng-app&lt;&#x2F;p&gt;
&lt;p&gt;这一点在这个 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;angular&#x2F;angular.js&#x2F;issues&#x2F;3370&quot;&gt;GitHub issue&lt;&#x2F;a&gt; 上有更好的描述，在1.2版本之后应该会被修复。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;过多的 &lt;code&gt;scope.$apply()&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;$apply 是一个代价很大的操作。我们有一个叫做 &lt;code&gt;lj-popup&lt;&#x2F;code&gt; 的 directive，它的作用类似于 &lt;code&gt;lj-popup=&quot;popupState&quot;&lt;&#x2F;code&gt; 同时监视 document 文档上的点击。如果点击发生在 &lt;code&gt;ng-app&lt;&#x2F;code&gt; 作用的节点以外（或者按了 ESC 键），就将 &lt;code&gt;popupState&lt;&#x2F;code&gt; 设置为 &lt;code&gt;false&lt;&#x2F;code&gt; 。因此我们使用 $parse setter（assgin）来设置变量和 $apply 。如果页面上有许多 directive 实体，你会遇到一个问题。解决方法是使用常规的检测并且避免使用 $apply ，除非它是必要的。在 lj-popup 的例子中，我们检查 popup 是否是打开的，并且只有在打开的情况下触发 $apply 。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;html5Mode 会禁用所有链接&lt;&#x2F;p&gt;
&lt;p&gt;这个问题非常简单，但是依然要说明一下。如果你向你的 module 注入了 $location 并且启用了 html5Mode ，页面上的所有链接会无法正常工作，因为 Angular 给它们加了 preventDefault 操作，并且转而依赖它自己的 router 。可以这样来解决这个问题&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;jQuery(&amp;#39;div:not([target])&amp;#39;).attr(&amp;#39;target&amp;#39;, &amp;#39;_self&amp;#39;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;当然，如果链接是页面加载完成之后再动态生成的话，这会变的复杂的多。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;原文地址：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;evilagentcooper.tumblr.com&#x2F;post&#x2F;60634355374&#x2F;angularjs-pitfalls&quot;&gt;Angular JS pitfalls&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>jQuery 补漏</title>
          <pubDate>Wed, 24 Jul 2013 12:41:17 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/learning-jquery-keynote/</link>
          <guid>https://guchengf.me/blog/learning-jquery-keynote/</guid>
          <description xml:base="https://guchengf.me/blog/learning-jquery-keynote/">&lt;p&gt;版本变动主要影响，从1.4.0开始，.css(), .attr(), .val(), .html(),.text(), .append(), .prepend(), .before(), .after(), .replaceWith(), .wrap(), .wrapInner(), .offset(),.addClass(), .removeClass(), .toggleClass()接受function作为参数值。 toggleClass()可以同时操作多个class。&lt;&#x2F;p&gt;
&lt;p&gt;可以使用.delay()来推迟事件队列中之后的事件。&lt;&#x2F;p&gt;
&lt;p&gt;从1.6.0开始，如果目标属性没有设置，.attr()会返回undefined。&lt;&#x2F;p&gt;
&lt;p&gt;在1.7.0中，添加了一系列callbacks方法，可以用来对callback列进行操作。比如callbacks.add()添加，callbacks.disable()禁用，callbacks.remove()删除特定的，callbacks.empty()删除所有。&lt;&#x2F;p&gt;
&lt;p&gt;在1.9.0中，.attr()可以正确的设置类似checked的值，与.prop()不同的是，它直接使用相应的值来进行设置，而.prop()使用boolean值来设置。&lt;&#x2F;p&gt;
&lt;p&gt;移除了事件中的.toggle()。移除了.live()【可以用.on()来代替】和.die()【用.off()】。.addBack()取代了.addSelf()。&lt;&#x2F;p&gt;
&lt;p&gt;属性(attributes)部分。.html()可以直接转换string值到html。包括IE9在内，之前的IE浏览器，应该使用.empty().html()，以确保不会破坏文本节点。.toggleClass()的第二参数为boolean值，当它为true，则添加class，为flase则移除class。&lt;&#x2F;p&gt;
&lt;p&gt;应该使用.prop()来获取特定属性的值，因为.prop()会返回比如checked、selected、disabled等状态的正确的值。selectedIndex, tagName, nodeName, nodeType, ownerDocument, defaultChecked, defaultSelected都应该使用.prop()来获取和设置。而元素的其它值则推荐使用.val()来设置。&lt;&#x2F;p&gt;
&lt;p&gt;jQuery.noConflict()用来解除jQuery对$的控制，使得$可以被其他库使用。&lt;&#x2F;p&gt;
&lt;p&gt;CSS部分。1.6.0之后，.css()可以使用相对值，即通过+=、-=来设定值。它不能移除由stylesheet或者元素style值确定的css。但是在IE8及其以下版本中，会移除这些值。.offset()不能获取隐藏元素的位置，同时不会将body的margin，border，padding计算在内。.outerHeight()或者.outerHeight()在参数值为true的时候，会包含元素的margin值。&lt;&#x2F;p&gt;
&lt;p&gt;.data()可以使用HTML5中的data-*属性。&lt;&#x2F;p&gt;
&lt;p&gt;jQuery.fx.off可以关闭所有动画特效。在低性能设备上使用，或者在动画出现问题的时候。.animate()的属性应该是数值，不支持简写的CSS属性，动画过程中不会使不可见元素可见。大多数特效方法都包含duration和easing这两个可选参数，duration控制快慢（执行事件，默认为400，slow为600，fast为200，单位是毫秒），easing是变换方法（默认是swing，还有linear）。1.4.0开始，可以给每个属性设置不同的easing。&lt;&#x2F;p&gt;
&lt;p&gt;DOM操作。.append()如果目标是多个元素，则会分别在目标内插入。如果插入的是本文档的元素，那么只会移动该元素到目标位置，而不是复制它（如果有多个目标，同样分别插入到每个目标内。）.appendTo()等也是一样。1.4.0开始，.before()和.after()可以对自封闭节点起作用，比如&amp;lt;div &#x2F;&amp;gt;。.text()中的string会被转义，因而不会作为HTML元素渲染。&lt;&#x2F;p&gt;
&lt;p&gt;事件（events）部分。.dblclick()绑定双击事件。event.metaKey检测功能键是否按下。event.preventDefault()用来阻止默认动作，比如a标签的跳转。event.target事件目标，可以和this比较来检测事件是否已经执行。.on()在1.7.0开始提供了绑定事件的所有功能，是最主要的事件绑定方式。.off()用来移除绑定的事件。.one()与.on()相似，但是它只处理一个目标元素。event.which用来检测键盘及鼠标的输入，包括鼠标左（1）中（2）右键（3）。可以使用event.data来给事件添加data值。&lt;&#x2F;p&gt;
&lt;p&gt;选择器（selectors）部分。:animated用来选择当时正在执行animation的元素。属性选择器中，=选择以给定值开头，通过连字符连接的属性的元素。~=选择通过空格分隔，包含给定值的属性的元素。*=选择包含给定值的属性的元素。$=选择以给定值结尾的属性的元素。!=不包含给定值。^=以给定值开头。:eq()选择器中，索引是从0开始的，如果值为负数，那么-1代表倒数第一个。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Google Closure 学习笔记-1</title>
          <pubDate>Wed, 24 Jul 2013 12:33:39 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/learning-google-closure-1/</link>
          <guid>https://guchengf.me/blog/learning-google-closure-1/</guid>
          <description xml:base="https://guchengf.me/blog/learning-google-closure-1/">&lt;h2 id=&quot;ji-chu-jie-gou&quot;&gt;基础结构&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;Closure的库结构和文件夹结构相对应，因此需要查找某个命名空间对应的文件时，可以按照库结构来查找。&lt;&#x2F;li&gt;
&lt;li&gt;Closure的基本方法都在base.js中，因此需要先在文档中首先引用base.js。&lt;&#x2F;li&gt;
&lt;li&gt;Closure中使用goog.provide(namespace)来定义命名空间。因此一种好的做法是，只定义一个全局命名空间，其他所有functions作为这个对象的属性。这种做法的好处是，所有的名称都集合在了一起，同时在使用多个库的情况下，避免了和其他库的命名空间冲突。&lt;&#x2F;li&gt;
&lt;li&gt;每一个命名空间都需要使用goog.require()来请求。&lt;&#x2F;li&gt;
&lt;li&gt;goog.partial()和call()的不同在于，goof.partial()中，参数会被直接传递到function内执行。&lt;&#x2F;li&gt;
&lt;li&gt;在Closure中，object、function、array、string、number、boolean、Null、undefined都有对应的goog.isXXX()来进行判断。&lt;&#x2F;li&gt;
&lt;li&gt;goog.isDef(value) 当&lt;code&gt;value != undefined&lt;&#x2F;code&gt;时返回true，null也是返回true。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;ge-ge-zhu-yao-de-ming-ming-kong-jian&quot;&gt;各个主要的命名空间&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;goog.string 包含了对string的处理，主要是string的转义。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;goog.array 包含了对数组的操作。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;goog.object 包含了对象操作。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;goog.json 包含了json的解析和序列化。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;goog.dom 包含了DOM元素的获取和操作。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;goog.dom.classes 包含了DOM元素的CSS类处理。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;goog.userAgent 检测用户useragent。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;goog.userAgent.product 检测用户浏览器。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;goog.style 包含了DOM元素的CSS样式的获取和设置。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;goog.function 包含了function的构建。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;goog.events 事件相关的方法。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;goog.ui UI控件。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;she-ji-dao-de-yi-xie-zhu-yao-de-fang-fa&quot;&gt;涉及到的一些主要的方法。&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;goog.string.htmlEscape(str,opt_isLikelyToContainHtmlChars)&lt;&#x2F;li&gt;
&lt;li&gt;goog.array.forEach() 用来遍历数组中的所有元素。&lt;&#x2F;li&gt;
&lt;li&gt;goog.object.get(obj,key,opt_value)&lt;&#x2F;li&gt;
&lt;li&gt;goog.object.transpose(obj) 可以返回一个交换了键值和数据的对象。但是如果数据不是string的话，就不会出现在返回的对象中。&lt;&#x2F;li&gt;
&lt;li&gt;goog.dom.getElment(idOrElment)&lt;&#x2F;li&gt;
&lt;li&gt;goog.dom.getElmentsByTagNameAndClass(nodeName,className,elmentToLookIn)&lt;&#x2F;li&gt;
&lt;li&gt;goog.dom.getAncestorElmentsByTagNameAndClass(nodeName,className,elmentToLookIn) 包括元素本身&lt;&#x2F;li&gt;
&lt;li&gt;goog.dom.creatDom(nodeName,attributes,var_args) atrributes是一个对象，用来作为创建的元素的属性。如果attributes是string的话，就作为元素的class的值。第三个参数用来创建元素的子元素，可以同时创建多个。goog.creatDom()的返回值是一个node，可以使用在appendChild等方法中。&lt;&#x2F;li&gt;
&lt;li&gt;goog.dom.htmlToDocumentFragment(htmlstring) 返回值是node。&lt;&#x2F;li&gt;
&lt;li&gt;goog.dom.classes.get(element) 返回包含目标元素的class的数组。&lt;&#x2F;li&gt;
&lt;li&gt;goog.dom.classes.has(element,className) 如果目标元素包含相应的类名，返回true，否则返回false。&lt;&#x2F;li&gt;
&lt;li&gt;goog.dom.classes.add(element,var_args)&lt;&#x2F;li&gt;
&lt;li&gt;goog.dom.classes.remove(element,var_args) 添加或删除目标元素的类。&lt;&#x2F;li&gt;
&lt;li&gt;goog.dom.classes.toggle(element,className)&lt;&#x2F;li&gt;
&lt;li&gt;goog.dom.classes.swap(element,fromClass,toClass) 如果目标元素含有fromClass这个类，就将它替换成toClass。&lt;&#x2F;li&gt;
&lt;li&gt;goog.dom.classes.enable(element,className,enabled) 启用或者禁用元素的特定类。&lt;&#x2F;li&gt;
&lt;li&gt;goog.style.getPageOffset(elment) 获取元素相对HTML文档的位置（top和left）。&lt;&#x2F;li&gt;
&lt;li&gt;goog.style.getSize(element) 获取元素的高和宽。能够获取隐藏元素的值。包括hidden和display:none的元素。&lt;&#x2F;li&gt;
&lt;li&gt;goog.style.getBounds(element) 获取元素的位置信息，包括元素的PageOffset和Size。&lt;&#x2F;li&gt;
&lt;li&gt;goog.style.setOpacity(element,opacity) 设置opacity值，0-1，如果是空的话，就会清除opacity值。&lt;&#x2F;li&gt;
&lt;li&gt;goog.style.setInlineBlock(element) 设置元素的display属性为inline-block。&lt;&#x2F;li&gt;
&lt;li&gt;goog.style.setUnselectable(element,unselectable,opt_noRecurse) 设置文本可不可选。&lt;&#x2F;li&gt;
&lt;li&gt;goog.events.listen(eventSource, eventType, listener, [capturePhase, [handler]]) 五个参数分别是绑定事件的DOM对象，触发listener的事件种类（值为string的数组），事件监听器本身，(可选)控制监听器是否仅在捕获阶段被调用，(可选)指定监听器中this代表的对象。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>扁平化输出含有嵌套的数组-javascript</title>
          <pubDate>Fri, 28 Jun 2013 12:45:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/flat-nested-array/</link>
          <guid>https://guchengf.me/blog/flat-nested-array/</guid>
          <description xml:base="https://guchengf.me/blog/flat-nested-array/">&lt;p&gt;Given an array that may contain nested arrays, return a flattened array. Input and out put are illustrated as follows.
将含有嵌套的数组转换成扁平化输出。*号部分为需要写出的代码。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; input&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span&gt;a&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;b&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;g&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; flatten_array&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;arr&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;    var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; out&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;    *&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; out&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;dai-ma&quot;&gt;代码&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; input&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span&gt;a&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;b&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;g&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; out&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;loop&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;input&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt; loop&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #FFAB70);&quot;&gt;object&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;  for&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #F97583);font-weight: bold;&quot;&gt; var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt; object&lt;&#x2F;span&gt;&lt;span&gt; )&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; typeof&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;object&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt; ===&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;object&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt; )&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;      loop&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;object&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;else&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;      out&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;push&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;object&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;console&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #B392F0);&quot;&gt;log&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #E1E4E8);&quot;&gt;out&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</description>
      </item>
      <item>
          <title>imagecss翻译完毕</title>
          <pubDate>Fri, 08 Mar 2013 12:56:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/imagecss-translated/</link>
          <guid>https://guchengf.me/blog/imagecss-translated/</guid>
          <description xml:base="https://guchengf.me/blog/imagecss-translated/">&lt;p&gt;中文版链接：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;blinktunnel.github.io&#x2F;imagecss-chinese&#x2F;&quot;&gt;https:&#x2F;&#x2F;blinktunnel.github.io&#x2F;imagecss-chinese&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;在两个月时间里，断断续续地翻译了这个网站，去年的时候已经有这个打算，最初只是想给孩子们留一点可以参考的东西，执行力比较差，所以拖延了这么长的时间。&lt;&#x2F;p&gt;
&lt;p&gt;水平所迫，翻译难免有错误和不足之处，欢迎指出（联系方式在about页面）。&lt;&#x2F;p&gt;
&lt;p&gt;以后我会逐渐润色翻译。&lt;&#x2F;p&gt;
&lt;p&gt;关于imagecss.com：这是由Patrick Sexton所写的一个关于CSS的新手教程网站，主要涉及图片相关的CSS以及基本CSS布局。网站链接： &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;www.imagecss.com&#x2F;&quot;&gt;http:&#x2F;&#x2F;www.imagecss.com&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;预览图：&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;i.loli.net&#x2F;2019&#x2F;04&#x2F;25&#x2F;5cc11db218543.jpg&quot; alt=&quot;ImageCSS 中文版&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;i.loli.net&#x2F;2019&#x2F;04&#x2F;25&#x2F;5cc11db2229f8.jpg&quot; alt=&quot;Image CSS 关于这个网站&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>V965W 7.8离线更新包（8773-8858）</title>
          <pubDate>Tue, 12 Feb 2013 12:38:30 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/v965w-7-8-update-offline-8873-8858/</link>
          <guid>https://guchengf.me/blog/v965w-7-8-update-offline-8873-8858/</guid>
          <description xml:base="https://guchengf.me/blog/v965w-7-8-update-offline-8873-8858/">&lt;p&gt;V965W的7.8离线更新包，包含8873-8858的更新。其他手机型号未测试。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;注：请先做好备份。Zune更新系统时会自动备份，请确认备份可以正常使用。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;准备工作：&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;请在Win7或者Win8下操作&lt;&#x2F;li&gt;
&lt;li&gt;手机在Zune中先更新到8773&lt;&#x2F;li&gt;
&lt;li&gt;手机电要充足&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;操作：&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;解压压缩包，将其中的三个压缩包分别解压缩得到三个文件夹，并将三个文件夹复制到系统盘。&lt;&#x2F;li&gt;
&lt;li&gt;文件夹的使用顺序为 8773-8779、8779-8783、8783-8858。&lt;&#x2F;li&gt;
&lt;li&gt;以8773-8779为例，32位的机器运行&lt;code&gt;Setup-UpdateWP-x86.exe&lt;&#x2F;code&gt;，64位的机器运行&lt;code&gt;Setup-UpdateWP-x64.exe&lt;&#x2F;code&gt;，然后再运行&lt;code&gt;WP7 Update Cab Sender.bat&lt;&#x2F;code&gt;，输入字母 &lt;code&gt;s&lt;&#x2F;code&gt; 或选择 &lt;code&gt;s&lt;&#x2F;code&gt; 这一项即可。&lt;&#x2F;li&gt;
&lt;li&gt;其他两次更新同样操作。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;离线更新包下载：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;pan.baidu.com&#x2F;share&#x2F;link?shareid=299759&amp;amp;uk=2718369881&quot;&gt;V965W 7.8离线更新包&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Windows 8 下 apploc 的安装</title>
          <pubDate>Fri, 18 Jan 2013 12:49:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/windows-8-install-apploc/</link>
          <guid>https://guchengf.me/blog/windows-8-install-apploc/</guid>
          <description xml:base="https://guchengf.me/blog/windows-8-install-apploc/">&lt;p&gt;Windows 8 下由于权限问题，直接双击安装 apploc.msi 会失败。但是msi又没有右键管理员运行。 因此，需要在管理员模式的Cmd下进行安装，其实很简单。&lt;&#x2F;p&gt;
&lt;p&gt;1、按下 Windows+ X 调出快捷菜单。&lt;&#x2F;p&gt;
&lt;p&gt;选择其中的 Command Prompt(Admin)[命令提示符（管理员）]&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;i.loli.net&#x2F;2019&#x2F;04&#x2F;25&#x2F;5cc11e2100ae9.jpg&quot; alt=&quot;Command Prompt(Admin)&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;2 、在Cmd中进入存放 apploc.msi 的目录&lt;&#x2F;p&gt;
&lt;p&gt;例如 &lt;code&gt;E:\downloads&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;3、直接输入 &lt;code&gt;apploc.msi&lt;&#x2F;code&gt; 运行就可以正常安装了。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Windows phone 7.5 下截屏临时解决方案 [需解锁]</title>
          <pubDate>Sat, 01 Dec 2012 13:01:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/windows-phone-7-5-sreenshot/</link>
          <guid>https://guchengf.me/blog/windows-phone-7-5-sreenshot/</guid>
          <description xml:base="https://guchengf.me/blog/windows-phone-7-5-sreenshot/">&lt;p&gt;目前Windows phone 7.5下还没有系统截屏方法，从8的情况来看，7.8的系统应该会有截屏功能，但是目前还没有推送。
XDA上有开发者发布了几个截屏应用，功能很完善，但是都需要解锁。没办法。
选择其中一个比较方便的做一个介绍。 XDA原帖地址：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;forum.xda-developers.com&#x2F;showthread.php?t=1436742&quot;&gt;http:&#x2F;&#x2F;forum.xda-developers.com&#x2F;showthread.php?t=1436742&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;首先相应，下载PC端的软件和手机端的XAP。可以到原帖下载，我已打包上传至百度盘。&lt;&#x2F;p&gt;
&lt;p&gt;下载：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;pan.baidu.com&#x2F;share&#x2F;link?shareid=145742&amp;amp;uk=2718369881&quot;&gt;http:&#x2F;&#x2F;pan.baidu.com&#x2F;share&#x2F;link?shareid=145742&amp;amp;uk=2718369881&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;** &lt;strong&gt;Usage:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Start &quot;WP Screenshot.exe&quot; on your computer and make sure that port 50560 is open (or simply allow the application to access the network when Windows Firewall pops up).&lt;&#x2F;li&gt;
&lt;li&gt;Start &quot;WP Screenshot&quot; on your Windows Phone device, enter the IP address of your computer (use local IP in case of running both parts on the same local network) and tap &quot;Connect and start&quot;.&lt;&#x2F;li&gt;
&lt;li&gt;Now, when you press any of the selected buttons, a screenshot should be sent to your PC (there you can do some neat things with it, try CTRL+H).&lt;&#x2F;li&gt;
&lt;li&gt;When you want to stop the background worker, simply open the application again and tap &quot;Stop&quot;.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;blockquote&gt;
&lt;h3 id=&quot;shi-yong-fang-fa&quot;&gt;使用方法：&lt;&#x2F;h3&gt;
&lt;h3 id=&quot;1-xian-jiang-xaptui-song-dao-ni-de-shou-ji-an-zhuang-pcduan-cheng-xu-xu-yao-net-4-5-de-zhi-chi&quot;&gt;1.先将XAP推送到你的手机安装。PC端程序需要.net 4.5 的支持。&lt;&#x2F;h3&gt;
&lt;h3 id=&quot;2-zai-pcshang-yun-xing-wp-screenshot-exe-ru-guo-fang-huo-qiang-ti-shi-fang-xing-ji-ke-zhu-yao-shi-xu-yao-tong-guo-duan-kou-50560-dan-du-she-zhi-ye-ke&quot;&gt;2.在PC上运行 &quot;WP Screenshot.exe&quot; ，如果防火墙提示，放行即可（主要是需要通过端口 50560，单独设置也可）。&lt;&#x2F;h3&gt;
&lt;h3 id=&quot;3-zai-shou-ji-duan-yun-xing-wp-screenshot-shu-ru-dian-nao-ip-di-zhi-yong-ben-di-ipji-ke-bi-ru-shi-yong-lu-you-qi-shang-wang-jiu-shi-lei-si-yu-192-168-1-xxx-zhe-yang-yi-ge-di-zhi-ke-yi-xuan-ze-shi-yong-pai-zhao-jian-huo-zhe-yin-liang-jian-jin-xing-jie-ping&quot;&gt;3.在手机端运行 &quot;WP Screenshot&quot; ，输入电脑 ip 地址，用本地ip即可，比如使用路由器上网，就是类似于 192.168.1.xxx 这样一个地址。可以选择使用 拍照键 或者 音量键进行截屏。&lt;&#x2F;h3&gt;
&lt;h3 id=&quot;4-hao-liao-zai-xu-yao-jie-ping-de-shi-hou-an-xia-she-ding-de-jian-ji-ke-jin-xing-jie-ping-tu-pian-hui-zi-dong-fa-dao-dian-nao-duan-tong-guo-ctrl-h-ke-yi-huo-de-bang-zhu-xin-xi-bao-cun-deng-kuai-jie-jian&quot;&gt;4.好了，在需要截屏的时候按下设定的键即可进行截屏，图片会自动发到电脑端。通过Ctrl + H 可以获得帮助信息，“保存”等快捷键。&lt;&#x2F;h3&gt;
&lt;h3 id=&quot;5-bu-xu-yao-jie-ping-de-shi-hou-dian-stop-jiu-ke-yi-ting-zhi-ying-yong-hou-tai-yun-xing-liao&quot;&gt;5.不需要截屏的时候，点&quot;stop&quot;就可以停止应用后台运行了。&lt;&#x2F;h3&gt;
&lt;p&gt;贴上原文：&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;** &lt;strong&gt;About&lt;&#x2F;strong&gt;:
This is another Windows Phone Mango screenshot tool that works a bit differently from other implementation(s). It sends screenshots over the network to a PC application, so that you can instantly show your phone&#x27;s screen on your monitor or projector.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;** &lt;strong&gt;Usage:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Start &quot;WP Screenshot.exe&quot; on your computer and make sure that port 50560 is open (or simply allow the application to access the network when Windows Firewall pops up).&lt;&#x2F;li&gt;
&lt;li&gt;Start &quot;WP Screenshot&quot; on your Windows Phone device, enter the IP address of your computer (use local IP in case of running both parts on the same local network) and tap &quot;Connect and start&quot;.&lt;&#x2F;li&gt;
&lt;li&gt;Now, when you press any of the selected buttons, a screenshot should be sent to your PC (there you can do some neat things with it, try CTRL+H).&lt;&#x2F;li&gt;
&lt;li&gt;When you want to stop the background worker, simply open the application again and tap &quot;Stop&quot;.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;** &lt;strong&gt;Current issues&#x2F;limitations:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;There can be some annoying lag when there is bad WiFi coverage.&lt;&#x2F;li&gt;
&lt;li&gt;It won&#x27;t capture screens from games (XNA) and videos.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;** &lt;strong&gt;Requirements:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;developer unlocked Windows Phone (to deploy the application)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;www.microsoft.com&#x2F;download&#x2F;en&#x2F;details.aspx?id=17851&quot;&gt;.NET Framework 4&lt;&#x2F;a&gt; (you need this if the PC application won&#x27;t start)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;** &lt;em&gt;New in version 0.3:&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;ability to use volume buttons for taking screenshots (phone)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;** &lt;em&gt;New in version 0.2:&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;toast notification after 5 minutes of inactivity (phone)&lt;&#x2F;li&gt;
&lt;li&gt;autosave mode - screenshots get automatically saved into a desired folder (PC)&lt;&#x2F;li&gt;
&lt;li&gt;ability to stretch screenshot to fit to current window size (PC)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The screen capturing part is based on &quot;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;forum.xda-developers.com&#x2F;showthread.php?t=1006331&quot;&gt;The DllImport project&lt;&#x2F;a&gt; (by fiinix)&quot;.&lt;&#x2F;p&gt;
&lt;p&gt;I am looking forward to all the feedback and I&#x27;ll do my best to fix and improve this application in the future.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Putty 的 ppk 文件转成 Xshell 使用的 key 文件</title>
          <pubDate>Tue, 27 Nov 2012 12:30:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/putty-ppk-to-xshell-key/</link>
          <guid>https://guchengf.me/blog/putty-ppk-to-xshell-key/</guid>
          <description xml:base="https://guchengf.me/blog/putty-ppk-to-xshell-key/">&lt;p&gt;从putty转到了xshell，所以ppk文件没有办法直接使用，需要转换一下。&lt;&#x2F;p&gt;
&lt;p&gt;使用putty软件中的puttygen.exe，可以在putty网站中直接下载该程序，有单独提供。&lt;&#x2F;p&gt;
&lt;p&gt;打开它，选择“Conversions”-&amp;gt;“Import key”，选择要导入的ppk文件。导入后，下面的“Export OpenSSH key”选项由灰色变成可用状态，点击它，导出一个自己命名的文件，这个文件默认没有后缀名，也无需加后缀名。导出时提示没有设置密码，点击“是”或者返回设置一个密码。&lt;&#x2F;p&gt;
&lt;p&gt;已经可以正常导入：&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;i.loli.net&#x2F;2019&#x2F;04&#x2F;25&#x2F;5cc11e838276f.jpg&quot; alt=&quot;putty-ppk-to-xshell-key&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>ConEmu、Mactype 冲突导致无法使用系统命令</title>
          <pubDate>Mon, 12 Nov 2012 12:36:41 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/conemu-mactype-conflict/</link>
          <guid>https://guchengf.me/blog/conemu-mactype-conflict/</guid>
          <description xml:base="https://guchengf.me/blog/conemu-mactype-conflict/">&lt;p&gt;64位系统下，字体渲染工具Mactype可能会与ConEmu发生冲突，导致ConEmu无法正常使用Cmd命令。&lt;&#x2F;p&gt;
&lt;p&gt;向作者反应之后，他已经找到了冲突的原因，因为64位下Mactype的hook会导致ConEmu工作不正常，经过我的尝试，只需将 &lt;code&gt;cmd.exe&lt;&#x2F;code&gt; 在 Mactype 的 &lt;code&gt;ini&lt;&#x2F;code&gt; 配置文件中排除即可正常使用。&lt;&#x2F;p&gt;
&lt;p&gt;最好是在 &lt;code&gt;UnloadDll&lt;&#x2F;code&gt; 这一项中添加 &lt;code&gt;cmd.exe&lt;&#x2F;code&gt; ，以确保可以成功。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>让 Chrome 默认使用 Google.com 进行搜索</title>
          <pubDate>Sat, 27 Oct 2012 12:42:27 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/searching-with-google-com-in-chrome/</link>
          <guid>https://guchengf.me/blog/searching-with-google-com-in-chrome/</guid>
          <description xml:base="https://guchengf.me/blog/searching-with-google-com-in-chrome/">&lt;p&gt;Chrome的默认Google搜索会根据你的位置进行选择，于是会使用Google.com.hk。&lt;&#x2F;p&gt;
&lt;p&gt;Google.com.hk的安全过滤功能在简体中文下是无法关闭的。繁体中文下可以关闭，但搜索结果不够实用，看起来也有点不爽。&lt;&#x2F;p&gt;
&lt;p&gt;因此打开Chrome选项，然后单击管理搜索引擎。由于默认的搜索参数不能修改，只好新建一个。&lt;&#x2F;p&gt;
&lt;p&gt;添加新的搜索引擎，名字和关键字随意。名字是在网页中选中内容后单击右键时显示的，&lt;strong&gt;注意：不要与默认的Google搜索重名了&lt;&#x2F;strong&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;默认的Google搜索配置如下：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{google:baseURL}search?q=%s&amp;amp;{google:RLZ}{google:originalQueryForSuggestion}{google:assistedQueryStats}{google:searchFieldtrialParameter}{google:bookmarkBarPinned}{google:searchClient}{google:sourceId}{google:instantExtendedEnabledParameter}{google:omniboxStartMarginParameter}{google:contextualSearchVersion}ie={inputEncoding}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;{google:baseURL}代表你所在的国家或地区是否有本地化的Google搜索，比如在中国，会自动跳转到google.com.hk。所以需要需将该字段修改为https:&#x2F;&#x2F;www.google.com&#x2F;（注意{}要删除）。由于默认配置无法修改，则新建一个Google搜索。&lt;&#x2F;p&gt;
&lt;p&gt;修改后如下：&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;https:&#x2F;&#x2F;www.google.com&#x2F;search?hl=en&amp;amp;amp;q=%s&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;注：已使用安全连接。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;添加完成后，将鼠标移到新添加的Google搜索，单击“设为默认值”即可。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Windows 8 无法安装和升级.net framework 3.5 (0x800F0906)</title>
          <pubDate>Mon, 22 Oct 2012 13:03:44 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/windows-8-net-framework-3-5/</link>
          <guid>https://guchengf.me/blog/windows-8-net-framework-3-5/</guid>
          <description xml:base="https://guchengf.me/blog/windows-8-net-framework-3-5/">&lt;p&gt;安装SQL Server 2008时候需要.net 3.5环境，安装一直不成功，出现错误（0x800F0906）
网上搜了个办法，能解决这个问题&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;打开 win8 安装盘，提取 sourcessxs 文件夹到 x:\sourcessxs （x为任意盘）；&lt;&#x2F;li&gt;
&lt;li&gt;打开 c:\windows\system32 文件夹，找到 cmd.exe，右击，选择&quot;Run as administrator&quot;（管理员模式）；(或者直接按下 win+x ，选择命令提示符（管理员模式）)&lt;&#x2F;li&gt;
&lt;li&gt;在命令行执行以下命令：&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;&lt;code&gt;Dism.exe &#x2F;online &#x2F;enable-feature &#x2F;featurename:NetFX3 &#x2F;*All* &#x2F;Source:E:\sources\sxs &#x2F;LimitAccess&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>我的 Fedora 上手日记-5【VirtualBox安装相关】</title>
          <pubDate>Thu, 06 Sep 2012 12:31:18 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/fedora-virtualbox/</link>
          <guid>https://guchengf.me/blog/fedora-virtualbox/</guid>
          <description xml:base="https://guchengf.me/blog/fedora-virtualbox/">&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;ww1.sinaimg.cn&#x2F;mw690&#x2F;64d90b7bgw1ecybxp8drgj20ac02xwee.jpg&quot; alt=&quot;Fedora&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;首先，从 virtualbox.org 上下载最新的RPM包，安装&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;安装必要的编译器（以下请在管理员权限下操作）
&lt;code&gt;yum install -y kernel-headers kernel-devel dkms gcc&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;打开VirtualBox 服务 &lt;code&gt;&#x2F;etc&#x2F;init.d&#x2F;vboxdrv setup&lt;&#x2F;code&gt; 此处可能会报错，错误情况如下：&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Trying to register the VirtualBox kernel modules using DKMSError! Bad return status for module build on kernel: 3.5.3-1.fc17.x86_64 (x86_64) Consult &#x2F;var&#x2F;lib&#x2F;dkms&#x2F;vboxhost&#x2F;4.1.20&#x2F;build&#x2F;make.log for more information.&lt;strong&gt;[FAILED]&lt;&#x2F;strong&gt; (Failed, trying without DKMS) Recompiling VirtualBox kernel modules &lt;strong&gt;[FAILED]&lt;&#x2F;strong&gt;(Look at &#x2F;var&#x2F;log&#x2F;vbox-install.log to find out what went wrong)&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;出现这个问题，请检查编译器是否正确安装，尤其是DKMS&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;将当前用户添加入 vboxusers 组中（请先退出SU,不然用户是root）&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;查看当前用户&lt;code&gt;whoami&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;添加当前用户到vboxusers组中 &lt;code&gt;su -c usermod -G vboxusers -a username&lt;&#x2F;code&gt; username自行改成你的用户名&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;至此，你已经可以正常使用VirtualBox &lt;code&gt;VirtualBox&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</description>
      </item>
      <item>
          <title>增加wordpress内存限制(WP_MEMORY_LIMIT)</title>
          <pubDate>Mon, 03 Sep 2012 12:35:10 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/wordpress-memory-limit/</link>
          <guid>https://guchengf.me/blog/wordpress-memory-limit/</guid>
          <description xml:base="https://guchengf.me/blog/wordpress-memory-limit/">&lt;p&gt;你是否会觉得你的wordpress运行很慢，或者突然显示没有足够内存运行当前脚本：&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Fatal error: Allowed memory size of 8388608 bytes exhausted.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;或者&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;PHP Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 6233929 bytes) in &#x2F;home&#x2F;…&#x2F;press&#x2F;wp-includes&#x2F;cache.php on line 330&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;还有类似：&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Allowed memory size of 33554432 bytes exhausted (tried to allocate 368640 bytes) in &#x2F;wordpress&#x2F;wp-includes&#x2F;class-simplepie.php on line 9575&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;这些都是因为内存不够引起的，解析来讲述如何增加内存的方法：&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;如果你可以访问php.ini文件，可以把内存限制从32改为64，甚至128等：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;memory_limit = 64M ; Maximum amount of memory a script may consume (64MB)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;如果你没有访问php.ini的存取权限，那么可以更改.htaccess文件：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;php_value memory_limit 64M&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;可以在wp-config.php中添加一行关于WP_MEMORY_LIMIT的定义：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;define(&amp;#39;WP_MEMORY_LIMIT&amp;#39;, &amp;#39;64M&amp;#39;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;上面三种方法无效，与空间商联系。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;&lt;strong&gt;注意：在wp-config.php添加define(‘WP_MEMORY_LIMIT’, ‘64M’);，不要添加在末尾，最好添加在数据库设置前面。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>我的Fedora上手日记-4【grub2启动顺序改变和清理多余内核】</title>
          <pubDate>Tue, 28 Aug 2012 12:29:07 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/fedora-edit-grub2-clean-useless-kernel/</link>
          <guid>https://guchengf.me/blog/fedora-edit-grub2-clean-useless-kernel/</guid>
          <description xml:base="https://guchengf.me/blog/fedora-edit-grub2-clean-useless-kernel/">&lt;p&gt;&lt;img src=&quot;http:&#x2F;&#x2F;ww3.sinaimg.cn&#x2F;mw690&#x2F;64d90b7bgw1ecybxp8drgj20ac02xwee.jpg&quot; alt=&quot;Fedora&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;一、grub2启动顺序改变 装完Fedora等Linux系统之后，一般来说，grub2默认的启动系统都是Linux，但是有很多体验Linux的人还是以Windows为主，所以需要将Windows设为默认启动项，步骤如下：&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;首先找到Windows的menuentry.&lt;code&gt;# cat &#x2F;boot&#x2F;grub2&#x2F;grub.cfg | grep Windows&lt;&#x2F;code&gt; 参考输出结果：&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;menuentry “&lt;strong&gt;Windows 7 (loader) (on &#x2F;dev&#x2F;sda1)&lt;&#x2F;strong&gt;”–class windows –class os&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;可能会不止一个，但是没有关系，知道你平时启动的那一个就可以了，只要确定sda位置。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;设置Windows 作为默认的启动项（这儿只能使用上面命令输出中双引号 ” ” 或者单引号 ‘ ‘ 中的内容，即加粗部分) &lt;code&gt;# grub2-set-default &quot;Windows 7 (loader) (on &#x2F;dev&#x2F;sda1)&quot;&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;验证默认启动项 &lt;code&gt;# grub2-editenv list&lt;&#x2F;code&gt; 参考输出结果：&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;saved_entry=Windows 7 (loader) (on &#x2F;dev&#x2F;sda1)&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;那么好的，我们已经成功设置了，最后再更新grub2设置文件即可&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;生成，更新 grub.cfg (可选）&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;# grub2-mkconfig -o &#x2F;boot&#x2F;grub2&#x2F;grub.cfg&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;当然，&#x2F;etc&#x2F;default&#x2F;grub 中还可以配置timeout，背景图片等等，可以自行搜索。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;二、清理多余内核 随着不断的更新，系统的内核会越来越多，将它们放在那里也没有任何关系，万一新内核有问题，可以随时换回来，当然，时间就了，就积累了一大堆旧内核，我们也可以很方便地将它们清理掉。 我的建议是：一直保留上一个版本的一个内核，这样，新内核有任何问题，都可以随时换回去，比较安全。&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;我们先检查系统现有内核&lt;code&gt;# rpm -q kernel&lt;&#x2F;code&gt; 参考输出结果：&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;kernel-3.3.4-3.fc16.x86_64 kernel-3.3.5-2.fc16.x86_64 不同的情况下，会有不同的结果，一般来说，较新的内核排在下面，从版本号就可以看出，那么我们就找到了需要清理的旧的内核。&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;删除不用的内核&lt;code&gt;yum remove kernel-3.3.4-3.fc16.x86_64&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;只要将内核改成对应的就可以了，可以直接复制第一条命令的结果 然后再次检查内核就会发现内核已被移除，这样子的方法比手动删除更方便更安全。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</description>
      </item>
      <item>
          <title>Ubuntu解决不能调节亮度【方案一】</title>
          <pubDate>Fri, 27 Apr 2012 12:12:24 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/ubuntu-screen-brightness/</link>
          <guid>https://guchengf.me/blog/ubuntu-screen-brightness/</guid>
          <description xml:base="https://guchengf.me/blog/ubuntu-screen-brightness/">&lt;p&gt;&lt;strong&gt;注：随着近几次更新，Ubuntu的兼容性提升了很多，这个问题应该比较少出现了。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;很多人在安装Ubuntu之后发现不能调节显示器亮度了，包括“系统设置”和快捷键，搜索一番之后发现了一个解决方案，目前使用一切良好。&lt;&#x2F;p&gt;
&lt;p&gt;在终端输入： &lt;code&gt;sudo gedit &#x2F;etc&#x2F;X11&#x2F;xorg.conf&lt;&#x2F;code&gt; （也就是编辑xorg.conf） 文件内加入以下内容:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Section &amp;quot;Screen&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Identifier &amp;quot;Default Screen&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;DefaultDepth 24&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;EndSection&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Section &amp;quot;Module&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Load &amp;quot;glx&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;EndSection&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Section &amp;quot;Device&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Identifier &amp;quot;Default Device&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Driver &amp;quot;nvidia&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Option &amp;quot;NoLogo&amp;quot; &amp;quot;True&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Option &amp;quot;RegistryDwords&amp;quot; &amp;quot;EnableBrightnessControl=1&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;EndSection&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;添加完之后重启系统，就可以通过“系统设置”和快捷键正常调节亮度了&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Win7-A卡用户游戏画面拉伸问题的解决方案</title>
          <pubDate>Mon, 13 Feb 2012 12:15:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/win7-ati-resolution-in-game/</link>
          <guid>https://guchengf.me/blog/win7-ati-resolution-in-game/</guid>
          <description xml:base="https://guchengf.me/blog/win7-ati-resolution-in-game/">&lt;p&gt;update：新版本的amd催化剂的控制中心界面有所调整，但是调整方法是一样的。&lt;&#x2F;p&gt;
&lt;p&gt;玩游戏的同学都知道，有些游戏由于自身分辨率的原因，在全屏模式下，默认是不能铺满窗口的（比如War3），或者另一种情况就是它铺满窗口了，但是明显是被拉伸了，有些同学不希望这样，下面这种方法就是针对A卡用户的解决方案。&lt;&#x2F;p&gt;
&lt;p&gt;首先打开&lt;strong&gt;Catalyst Control Center【A卡驱动控制中心】（通过右键菜单或者开始菜单）&lt;&#x2F;strong&gt;，就是这个东西&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;i.loli.net&#x2F;2019&#x2F;04&#x2F;25&#x2F;5cc11ee0c3dde.jpg&quot; alt=&quot;step-1&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;根据版本不同，界面也会不同，如果你的是比较新的型号，那么相应的控制中心也会是比较新的版本，界面会不一样，而且可能是英文的，但是不要紧，请找到相应的选项即可。&lt;&#x2F;p&gt;
&lt;p&gt;然后通过顶端菜单进入&lt;strong&gt;桌面&amp;amp;显示器选项&lt;&#x2F;strong&gt;，如下图&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;i.loli.net&#x2F;2019&#x2F;04&#x2F;25&#x2F;5cc11f2937bd8.jpg&quot; alt=&quot;step-2&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;接着点击对应显示器旁边的黑色下拉小箭头，选择“&lt;strong&gt;配置&lt;&#x2F;strong&gt;”，一般来说就一个显示器，点那一个就好了，如下图&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;i.loli.net&#x2F;2019&#x2F;04&#x2F;25&#x2F;5cc11f293afbb.jpg&quot; alt=&quot;step-3&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;进入该界面之后可以看到一个&lt;strong&gt;缩放选项&lt;&#x2F;strong&gt;，这一个就是控制应用程序全屏状态下，如果应用程序分辨率与标准分辨率（也就是你的桌面分辨率）不同的时候，所要采取的策略&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;i.loli.net&#x2F;2019&#x2F;04&#x2F;25&#x2F;5cc11f293ccbe.jpg&quot; alt=&quot;step-4&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;我们可以看到有两个选项（新版本的控制中心可能会有多个），一个是全屏幕，一个是居中，不难理解，如果选择全屏幕的话，就是会自动拉伸程序至满屏，而选择居中就是根据程序的分辨率将它居中显示（通常这种情况下两侧会有两条黑边）。&lt;&#x2F;p&gt;
&lt;p&gt;但是此时这两个选项都是灰色不可选，原因很简单，因为此刻我们所处的分辨率是默认分辨率，也就用不到这一项功能，所以就无法更改它，因此我们先改变桌面分辨率，请直接在桌面右击鼠标-分辨率，然后随意换一个不是默认值的（一般来说，笔记本电脑的分辨率大多是1366_768或者1440_900之类的），选一个1024*768这样的就没问题了，当然，在Catalyst Control Center中也可以更改的，效果是一样的。改完之后回到之前的那一个界面就会发现选项可以更改了，此时就可以根据你的需要进行更改，有人喜欢游戏的时候自适应全屏，有人喜欢不拉伸，可以自行切换，不用再麻烦的改注册表了。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;这里要提到的是，这样子做的效果是控制画面拉伸，而不是改变了程序的分辨率，要注意。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;相比来说，N卡所提供的相应功能就要丰富的多了。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Mactype 渲染火狐时地址栏字体被压缩的解决方法</title>
          <pubDate>Sat, 11 Feb 2012 12:17:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/firefox-address-bar-font-being-cutted-while-using-mactype/</link>
          <guid>https://guchengf.me/blog/firefox-address-bar-font-being-cutted-while-using-mactype/</guid>
          <description xml:base="https://guchengf.me/blog/firefox-address-bar-font-being-cutted-while-using-mactype/">&lt;p&gt;现在越来越多人喜欢用Mactype来渲染字体，效果很好，改善了Win下的字体显示效果，如果调整好设置的话，可以和Mac OS相媲美。&lt;&#x2F;p&gt;
&lt;p&gt;新版的火狐浏览器下，如果使用了Mactype进行渲染了的话，会发现地址栏被压缩了，字体顶端有少量不显示，主要是因为火狐强制按照cleartype裁剪文字，mactype默认是不开hinting的，比cleartype略高一些，就会被剪掉。问题如图&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;i.loli.net&#x2F;2019&#x2F;04&#x2F;25&#x2F;5cc11fac25b24.jpg&quot; alt=&quot;problem&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;这时候，可以采用以下方法解决。&lt;&#x2F;p&gt;
&lt;p&gt;我们采用CSS的方法来解决这一个问题，为了避免自定义引起不必要的麻烦，同时也为了操作方便，推荐通过火狐的扩展来实现这一方法。&lt;&#x2F;p&gt;
&lt;p&gt;扩展地址：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;addons.mozilla.org&#x2F;zh-CN&#x2F;firefox&#x2F;addon&#x2F;stylish&#x2F;&quot;&gt;https:&#x2F;&#x2F;addons.mozilla.org&#x2F;zh-CN&#x2F;firefox&#x2F;addon&#x2F;stylish&#x2F;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;下载这一扩展安装之后，选择编写新样式 – 空白样式，&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;i.loli.net&#x2F;2019&#x2F;04&#x2F;25&#x2F;5cc11fcd666e3.jpg&quot; alt=&quot;stylish&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;名称自定，然后加入如下CSS代码：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;css&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;namespace&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #79B8FF);&quot;&gt; url&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;http:&#x2F;&#x2F;www.mozilla.org&#x2F;keymaster&#x2F;gatekeeper&#x2F;there.is.only.xul&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #F97583);&quot;&gt;-moz-document&lt;&#x2F;span&gt;&lt;span&gt; url(&amp;#39;chrome:&#x2F;&#x2F;browser&#x2F;content&#x2F;browser.xul&amp;#39;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;  *&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #79B8FF);&quot;&gt;    font-family&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;Segoe UI&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt;Tahoma&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#657B83, #79B8FF);&quot;&gt; sans-serif&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;完成之后可以看见效果，如下图&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;i.loli.net&#x2F;2019&#x2F;04&#x2F;25&#x2F;5cc11fac31877.jpg&quot; alt=&quot;preview&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;另外，据说Mactype项目已经在开始DirectWrite的测试了，也就是说，将来有可能可以看到渲染IE9，当然，不是用现有的GDI++，期待吧。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>“断网法”更新中兴（ZTE）V965W Tania 系统（含7.8）</title>
          <pubDate>Fri, 03 Feb 2012 12:39:48 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/zte-v965w-update-7-8-disconnect-line/</link>
          <guid>https://guchengf.me/blog/zte-v965w-update-7-8-disconnect-line/</guid>
          <description xml:base="https://guchengf.me/blog/zte-v965w-update-7-8-disconnect-line/">&lt;p&gt;Windows Phone 7.8 终于开始推送更新了，对于不能更新到8的老机器也算是一点点补偿。&lt;&#x2F;p&gt;
&lt;p&gt;ZTE V965W性价比颇高，但是由于是非主流机型，因此厂商照顾不足，我一直没有收到更新通知，直至在网上看到网友已经更新了，才知道可以更新了。&lt;&#x2F;p&gt;
&lt;p&gt;在没有收到更新推送的情况下，Zune里的更新检测没有新的更新，这是可以通过网友发现的“断网法”进行更新，成功率很高，只是操作比较麻烦。&lt;&#x2F;p&gt;
&lt;p&gt;我修改了第三步，通过网络连接速度判断断网时机，更加方便和可靠。&lt;&#x2F;p&gt;
&lt;p&gt;方法如下：&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;开启手机的&lt;strong&gt;飞行模式&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;然后连接电脑，打开Zune软件，选择 &lt;strong&gt;电话 – 设置 – 更新&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;通过一个进程网络浏览监测工具查看Zune软件相关进程的流量，比如腾讯电脑管家，360等等，主要是&lt;strong&gt;WMZuneComm.exe&lt;&#x2F;strong&gt;这一个进程，在点击更新之后，观察这个进程的下载速度情况，在其达到&lt;strong&gt;峰值&lt;&#x2F;strong&gt;（与网速有关，该进程流量很小，所以峰值很明显）时，断开电脑的网络连接。&lt;&#x2F;li&gt;
&lt;li&gt;稍作等待，如果收到提示“有可用的更新”，就说明成功了。&lt;&#x2F;li&gt;
&lt;li&gt;没有收到提示则重复更新、断网的这一步骤，关键点在于断网时间的选择。如果出现无法连接更新服务器，则说明断网过早；如果出现没有可用更新，则是断网过晚。&lt;&#x2F;li&gt;
&lt;li&gt;最后点击更新， 正常恢复连接回网络，就可以更新了 。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;我的更新顺序是：8779－8783－8858，8858即为7.8版本。3个版本都需要断网法操作，对于没有收到更新推送的网友，可以一试。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>我的 Fedora 上手日记-3 [yum 指令详解]</title>
          <pubDate>Tue, 24 Jan 2012 12:19:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/fedora-yum-package-manager/</link>
          <guid>https://guchengf.me/blog/fedora-yum-package-manager/</guid>
          <description xml:base="https://guchengf.me/blog/fedora-yum-package-manager/">&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;ww1.sinaimg.cn&#x2F;mw690&#x2F;64d90b7bgw1ecybxp8drgj20ac02xwee.jpg&quot; alt=&quot;Fedora&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;yi-yumshi-shen-me&quot;&gt;一. yum是什么&lt;&#x2F;h2&gt;
&lt;p&gt;yum = Yellow dog Updater, Modified 主要功能是更方便的添加&#x2F;删除&#x2F;更新RPM包. 它能自动解决包的倚赖性问题. 它能便于管理大量系统的更新问题 注:为什么要使用yum而不用apt,最简单的原因,Fedora自带&lt;&#x2F;p&gt;
&lt;h2 id=&quot;er-yumte-dian&quot;&gt;二. yum特点&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;可以同时配置多个资源库(Repository)&lt;&#x2F;li&gt;
&lt;li&gt;简洁的配置文件(&#x2F;etc&#x2F;yum.conf)&lt;&#x2F;li&gt;
&lt;li&gt;自动解决增加或删除rpm包时遇到的倚赖性问题&lt;&#x2F;li&gt;
&lt;li&gt;使用方便&lt;&#x2F;li&gt;
&lt;li&gt;保持与RPM数据库的一致性&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;san-yuman-zhuang&quot;&gt;三. yum安装&lt;&#x2F;h2&gt;
&lt;p&gt;Fedora自带 &lt;code&gt;#rpm -ivh yum-2.0.4-2.noarch.rpm&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;si-yumpei-zhi&quot;&gt;四. yum配置&lt;&#x2F;h2&gt;
&lt;p&gt;注: 修改和增加配置文件中的资源库,加快下载速度和拥有更多可更新的rpm包 将&lt;code&gt;&#x2F;etc&#x2F;yum.conf&lt;&#x2F;code&gt;的内容全部替换为&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[main]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;cachedir=&#x2F;var&#x2F;cache&#x2F;yum&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;debuglevel=2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;logfile=&#x2F;var&#x2F;log&#x2F;yum.log&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;pkgpolicy=newest&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;distroverpkg=fedora-release&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;tolerant=1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;exactarch=1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[fedora-us-1]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;name=Fedora Core 1 -- Fedora US mirror&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;baseurl=ftp:&#x2F;&#x2F;mirrors.kernel.org&#x2F;fedora.us&#x2F;fedora&#x2F;fedora&#x2F;1&#x2F;i386&#x2F;yum&#x2F;os&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[fedora-us-1-updates]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;name=Fedora Core 1 updates -- Fedora US mirror&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;baseurl=ftp:&#x2F;&#x2F;mirrors.kernel.org&#x2F;fedora.us&#x2F;fedora&#x2F;fedora&#x2F;1&#x2F;i386&#x2F;yum&#x2F;updates&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[fedora-us-1-stable]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;name=Fedora Linux (stable) for Fedora Core 1 -- Fedora US mirror&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;baseurl=ftp:&#x2F;&#x2F;mirrors.kernel.org&#x2F;fedora.us&#x2F;fedora&#x2F;fedora&#x2F;1&#x2F;i386&#x2F;yum&#x2F;stable&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[freshrpms]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;name=Fedora Linux $releasever - $basearch - freshrpms&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;baseurl=http:&#x2F;&#x2F;ayo.freshrpms.net&#x2F;fedora&#x2F;linux&#x2F;$releasever&#x2F;$basearch&#x2F;freshrpms&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;wu-yumying-yong&quot;&gt;五. yum应用&lt;&#x2F;h2&gt;
&lt;p&gt;注:当第一次使用yum或yum资源库有更新时,yum会自动下载所有所需的headers放置于&#x2F;var&#x2F;cache&#x2F;yum目录下,所需时间可能较长. 检查有哪些可更新的rpm包 &lt;code&gt;#yum check-update&lt;&#x2F;code&gt; 安装rpm包,使xmms可以播放mp3 &lt;code&gt;#yum install xmms-mp3&lt;&#x2F;code&gt; 安装mplayer,同时自动安装相关的软件 &lt;code&gt;#yum install mplayer&lt;&#x2F;code&gt; 删除licq包,同时删除与该包有倚赖性的包 &lt;code&gt;#yum remove licq&lt;&#x2F;code&gt; 注:同时会提示删除licq-gnome,licq-qt,licq-text,非常方便 系统更新(更新所有可以升级的rpm包,包括kernel) &lt;code&gt;#yum -y update&lt;&#x2F;code&gt; 每天定期执行系统更新 &lt;code&gt;#chkconfig yum on&lt;&#x2F;code&gt; &lt;code&gt;#service yum start&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;liu-yumzhi-ling-xiang-jie&quot;&gt;六. yum指令详解&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;rpm包的更新 检查可更新的rpm包 &lt;code&gt;#yum check-update&lt;&#x2F;code&gt;更新所有的rpm包 &lt;code&gt;#yum update&lt;&#x2F;code&gt; 更新指定的rpm包,如更新kernel和kernel source &lt;code&gt;#yum update kernel kernel-source&lt;&#x2F;code&gt; 大规模的版本升级,与yum update不同的是,连旧的淘汰的包也升级 &lt;code&gt;#yum upgrade&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;rpm包的安装和删除 安装rpm包,如xmms-mp3 &lt;code&gt;#yum install xmms-mp3&lt;&#x2F;code&gt; 删除rpm包,包括与该包有倚赖性的包 &lt;code&gt;#yum remove licq&lt;&#x2F;code&gt; 注:同时会提示删除licq-gnome,licq-qt,licq-text&lt;&#x2F;li&gt;
&lt;li&gt;yum暂存(&#x2F;var&#x2F;cache&#x2F;yum&#x2F;)的相关参数 清除暂存中rpm包文件 &lt;code&gt;#yum clean packages&lt;&#x2F;code&gt; 清除暂存中rpm头文件 &lt;code&gt;#yum clean headers&lt;&#x2F;code&gt; 清除暂存中旧的rpm头文件 &lt;code&gt;#yum clean oldheaders&lt;&#x2F;code&gt; 清除暂存中旧的rpm头文件和包文件 &lt;code&gt;#yum clean&lt;&#x2F;code&gt; 或 &lt;code&gt;#yum clean all&lt;&#x2F;code&gt; 注:相当于&lt;code&gt;yum clean packages&lt;&#x2F;code&gt;+ &lt;code&gt;yum clean oldheaders&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;rpm包列表 列出资源库中所有可以安装或更新的rpm包 &lt;code&gt;#yum list&lt;&#x2F;code&gt; 列出资源库中特定的可以安装或更新以及已经安装的rpm包 &lt;code&gt;#yum list mozilla&lt;&#x2F;code&gt; &lt;code&gt;#yum list mozilla*&lt;&#x2F;code&gt;注:可以在rpm包名中使用匹配符,如列出所有以mozilla开头的rpm包 列出资源库中所有可以更新的rpm包 &lt;code&gt;#yum list updates&lt;&#x2F;code&gt; 列出已经安装的所有的rpm包 &lt;code&gt;#yum list installed&lt;&#x2F;code&gt; 列出已经安装的但是不包含在资源库中的rpm包 &lt;code&gt;#yum list extras&lt;&#x2F;code&gt; 注:通过其它网站下载安装的rpm包&lt;&#x2F;li&gt;
&lt;li&gt;rpm包信息显示(info参数同list) 列出资源库中所有可以安装或更新的rpm包的信息 &lt;code&gt;#yum info&lt;&#x2F;code&gt; 列出资源库中特定的可以安装或更新以及已经安装的rpm包的信息 &lt;code&gt;#yum info mozilla``#yum info mozilla*&lt;&#x2F;code&gt; 注:可以在rpm包名中使用匹配符,如列出所有以mozilla开头的rpm包的信息 列出资源库中所有可以更新的rpm包的信息 &lt;code&gt;#yum info updates&lt;&#x2F;code&gt; 列出已经安装的所有的rpm包的信息 &lt;code&gt;#yum info installed&lt;&#x2F;code&gt; 列出已经安装的但是不包含在资源库中的rpm包的信息 &lt;code&gt;#yum info extras&lt;&#x2F;code&gt; 注:通过其它网站下载安装的rpm包的信息&lt;&#x2F;li&gt;
&lt;li&gt;搜索rpm包 搜索匹配特定字符的rpm包 &lt;code&gt;#yum search mozilla&lt;&#x2F;code&gt; 注:在rpm包名,包描述等中搜索 搜索有包含特定文件名的rpm包 &lt;code&gt;#yum provides realplay&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;qi-an-quan-de-geng-xin-freshrpms-netde-rpmbao&quot;&gt;七. 安全的更新freshrpms.net的rpm包&lt;&#x2F;h2&gt;
&lt;p&gt;安装freshrpms.net的GPG key &lt;code&gt;#rpm --import http:&#x2F;&#x2F;freshrpms.net&#x2F;packages&#x2F;RPM-GPG-KEY.txt&lt;&#x2F;code&gt; 编辑&#x2F;etc&#x2F;yum.conf,增加以下信息到尾部&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[freshrpms]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;name=Fedora Linux $releasever - $basearch - freshrpms&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;baseurl=http:&#x2F;&#x2F;ayo.freshrpms.net&#x2F;fedora&#x2F;linux&#x2F;$releasever&#x2F;$basearch&#x2F;freshrpms&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;gpgcheck=1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;注: 检查GPG Key &lt;code&gt;# rpm -qa gpg-pubkey*&lt;&#x2F;code&gt; 显示Key信息 &lt;code&gt;#rpm -qi gpg-pubkey-e42d547b-3960bdf1&lt;&#x2F;code&gt; 删除Key &lt;code&gt;#rpm -e gpg-pubkey-e42d547b-3960bdf1&lt;&#x2F;code&gt; 最后附上我找到的一份不错的yum教程，虽然比较老，但是基本都是一样的。 Box.net 下载： &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;app.box.com&#x2F;s&#x2F;u73zb0aqu6xmbvxrcmgo&quot;&gt;yum 新手指南&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>我的 Fedora 上手日记-2 [笔记本不能调节亮度]</title>
          <pubDate>Fri, 20 Jan 2012 12:19:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/fedora-adjust-sreen-brightness/</link>
          <guid>https://guchengf.me/blog/fedora-adjust-sreen-brightness/</guid>
          <description xml:base="https://guchengf.me/blog/fedora-adjust-sreen-brightness/">&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;ww1.sinaimg.cn&#x2F;mw690&#x2F;64d90b7bgw1ecybxp8drgj20ac02xwee.jpg&quot; alt=&quot;Fedora&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;用上Fedora之后，真正开始折腾已经是晚上了，关了灯之后，觉得屏幕太亮了，于是想到要调下亮度，便还是用笔记本自带快捷键调节，发现会出现底部的亮度栏，但是不能进行调节，于是到系统设置里边进行更改，发现调节亮度调没有作用，上网搜了很多之后，找到一条可以用的&lt;&#x2F;p&gt;
&lt;p&gt;用yum重装bash ：&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;yum reinstall bash&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;注：此方法使用后还是不能解决不能保存屏幕亮度的问题，即重新启动之后还是最亮的状态。 虽然不知道bash和这个之间有什么关系，但重装之后确实可以用键盘调亮度了。快捷键调节及系统设置选项里的都可以正常使用。 如果遇到相同问题，可以尝试一下。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>我的 Fedora 上手日记-1[系统安装]</title>
          <pubDate>Fri, 20 Jan 2012 07:20:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/fedora-installation/</link>
          <guid>https://guchengf.me/blog/fedora-installation/</guid>
          <description xml:base="https://guchengf.me/blog/fedora-installation/">&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;ww1.sinaimg.cn&#x2F;mw690&#x2F;64d90b7bgw1ecybxp8drgj20ac02xwee.jpg&quot; alt=&quot;Fedora&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Update —— 现在推荐使用 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;unetbootin.sourceforge.net&#x2F;&quot;&gt;UNetbootin&lt;&#x2F;a&gt; 来制作U盘安装盘，之后在系统中选择U盘启动，正常安装即可。&lt;&#x2F;p&gt;
&lt;p&gt;使用方法参见 UNetbootin 官网即可。&lt;&#x2F;p&gt;
&lt;p&gt;UNetbootin Windows 版 百度网盘共享： &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;pan.baidu.com&#x2F;s&#x2F;1kTJSx5l&quot;&gt;UNetbootin-win&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>常用CSS缩写语法总结</title>
          <pubDate>Mon, 05 Dec 2011 12:21:45 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/css-abbreviation/</link>
          <guid>https://guchengf.me/blog/css-abbreviation/</guid>
          <description xml:base="https://guchengf.me/blog/css-abbreviation/">&lt;p&gt;使用缩写可以帮助减少你CSS文件的大小，更加容易阅读。css缩写的主要规则如下：&lt;&#x2F;p&gt;
&lt;h2 id=&quot;yan-se&quot;&gt;颜色&lt;&#x2F;h2&gt;
&lt;p&gt;16进制的色彩值，如果每两位的值相同，可以缩写一半，例如： &lt;code&gt;#000000&lt;&#x2F;code&gt;可以缩写为&lt;code&gt;#000&lt;&#x2F;code&gt; ; &lt;code&gt;#336699&lt;&#x2F;code&gt;可以缩写为&lt;code&gt;#369&lt;&#x2F;code&gt;;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;he-chi-cun&quot;&gt;盒尺寸&lt;&#x2F;h2&gt;
&lt;p&gt;通常有下面四种书写方法:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;property:value1;&lt;&#x2F;code&gt; 表示所有边都是一个值value1&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;property:value1 value2;&lt;&#x2F;code&gt; 表示 top 和 bottom 的值是 value1，right 和 left 的值是 value2&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;property:value1 value2 value3;&lt;&#x2F;code&gt; 表示 top 的值是 value1， right 和 left 的值是 value2，bottom 的值是 value3&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;property:value1 value2 value3 value4;&lt;&#x2F;code&gt; 四个值依次表示top,right,bottom,left 方便的记忆方法是顺时针，上右下左。&lt;&#x2F;li&gt;
&lt;li&gt;具体应用在margin和padding的例子如下： &lt;code&gt;margin:1em 0 2em 0.5em;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;bian-kuang-border&quot;&gt;边框(border)&lt;&#x2F;h2&gt;
&lt;p&gt;边框的属性如下：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;css&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;border-width&lt;&#x2F;span&gt;&lt;span&gt;:1px;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;border-style&lt;&#x2F;span&gt;&lt;span&gt;:solid;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;border-color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #FDAEB7);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #FDAEB7);&quot;&gt;000&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;可以缩写为一句：&lt;code&gt;border:1px solid #000;&lt;&#x2F;code&gt; 语法是 &lt;code&gt;border:width style color;&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;bei-jing-backgrounds&quot;&gt;背景(Backgrounds)&lt;&#x2F;h2&gt;
&lt;p&gt;背景的属性如下：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;css&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;background-color&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #FDAEB7);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#DC322F, #FDAEB7);&quot;&gt;f00;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;background-image&lt;&#x2F;span&gt;&lt;span&gt;:url(&amp;#39;background.gif&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;background-repeat&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;no-repeat&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;background-attachment&lt;&#x2F;span&gt;&lt;span&gt;:fixed;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;background-position&lt;&#x2F;span&gt;&lt;span&gt;:0 0;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;可以缩写为一句：&lt;code&gt;background:#f00 url(&#x27;background.gif&#x27;) no-repeat fixed 0 0;&lt;&#x2F;code&gt; 语法是&lt;code&gt;background:color image repeat attachment position;&lt;&#x2F;code&gt; 你可以省略其中一个或多个属性值，如果省略，该属性值将用浏览器默认值，默认值为：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;css&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;color: transparent;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;image&lt;&#x2F;span&gt;&lt;span&gt;: none;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;repeat: repeat;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;attachment: scroll;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;position: 0% 0%;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;zi-ti-fonts&quot;&gt;字体(fonts)&lt;&#x2F;h2&gt;
&lt;p&gt;字体的属性如下：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;css&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;font-style&lt;&#x2F;span&gt;&lt;span&gt;:italic;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;font-variant&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;small-caps&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;font-weight&lt;&#x2F;span&gt;&lt;span&gt;:bold;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;font-size&lt;&#x2F;span&gt;&lt;span&gt;:1em;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;line-height&lt;&#x2F;span&gt;&lt;span&gt;:140%;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;font-family&lt;&#x2F;span&gt;&lt;span&gt;:&amp;quot;Lucida Grande&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;sans-serif&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;可以缩写为一句：&lt;code&gt;font:italic small-caps bold 1em&#x2F;140% &quot;Lucida Grande&quot;,sans-serif;&lt;&#x2F;code&gt; 注意，如果你缩写字体定义，至少要定义&lt;code&gt;font-size&lt;&#x2F;code&gt;和&lt;code&gt;font-family&lt;&#x2F;code&gt;两个值。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;lie-biao-lists&quot;&gt;列表(lists)&lt;&#x2F;h2&gt;
&lt;p&gt;取消默认的圆点和序号可以这样写 &lt;code&gt;list-style:none;&lt;&#x2F;code&gt; list的属性如下:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #E1E4E8); background-color: light-dark(#FDF6E3, #24292E);&quot;&gt;&lt;code data-lang=&quot;css&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;list-style-type&lt;&#x2F;span&gt;&lt;span&gt;:square;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;list-style-position&lt;&#x2F;span&gt;&lt;span&gt;:inside;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;list-style-image&lt;&#x2F;span&gt;&lt;span&gt;:url(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #85E89D);&quot;&gt;image&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #B392F0);&quot;&gt;gif&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;可以缩写为一句：&lt;code&gt;list-style:square inside url(image.gif);&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>关于Wordpress不能自动更新的解决方法</title>
          <pubDate>Fri, 25 Feb 2011 13:18:16 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/wordpress-cannot-auto-upgrade/</link>
          <guid>https://guchengf.me/blog/wordpress-cannot-auto-upgrade/</guid>
          <description xml:base="https://guchengf.me/blog/wordpress-cannot-auto-upgrade/">&lt;p&gt;Wordpress应该是比较热门的一个博客和个人网站程序，但是有时候它会发生不能自动更新的问题，还是比较让人纠结的&lt;&#x2F;p&gt;
&lt;p&gt;下边介绍一个解决这个问题的手动升级Wordpress的方法&lt;&#x2F;p&gt;
&lt;p&gt;1、下载好新版版本的Wordpress程序，删掉里边的&lt;code&gt;wp-content&lt;&#x2F;code&gt; 文件夹（及其子目录），因为&lt;code&gt;wp-config.php&lt;&#x2F;code&gt; 文件默认名问&lt;code&gt;wp-config-sample.php &lt;&#x2F;code&gt;，所以不用管它&lt;&#x2F;p&gt;
&lt;p&gt;2、&lt;strong&gt;备份你原本的数据和数据库！（重要！）&lt;&#x2F;strong&gt;，停用所有运行的插件&lt;&#x2F;p&gt;
&lt;p&gt;3、首先进入你的服务器Wordpress程序的&lt;strong&gt;根目录&lt;&#x2F;strong&gt;，将&lt;strong&gt;除了&lt;&#x2F;strong&gt; &lt;code&gt;wp-content&lt;&#x2F;code&gt; 文件夹（及其子目录）和 &lt;code&gt;wp-config.php&lt;&#x2F;code&gt; 文件以外的所有东西删掉&lt;&#x2F;p&gt;
&lt;p&gt;4、将你准本好的新版本Wordpress程序上传至服务器Wordpress程序根目录中原本的对应位置，覆盖原文件（如果有的话，一般是没有的）&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;注&lt;&#x2F;strong&gt;：本步骤如果你的服务器支持在线解压缩，建议将Wordpress压缩包上传至服务器再进行解压，不然用FTP上传这么多文件你会很纠结的。&lt;&#x2F;p&gt;
&lt;p&gt;5、在浏览器地址栏中输入 &lt;code&gt;http:&#x2F;&#x2F;你的博客地址&#x2F;wp-admin&#x2F;upgrade.php&lt;&#x2F;code&gt; 完成升级&lt;&#x2F;p&gt;
&lt;p&gt;其中比较重要的就是注意保留服务器上的 &lt;strong&gt;wp-content&lt;&#x2F;strong&gt; 文件夹（及其子目录）和 &lt;strong&gt;wp-config.php&lt;&#x2F;strong&gt; 文件，以及不要上传新版本中的这两个东西，因为这个就是的博客的各种设置及数据，其他基本没有什么问题~。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>关于Au中去电流噪声的一个小技巧</title>
          <pubDate>Wed, 16 Feb 2011 12:22:58 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/adobe-audition-noise-reduction/</link>
          <guid>https://guchengf.me/blog/adobe-audition-noise-reduction/</guid>
          <description xml:base="https://guchengf.me/blog/adobe-audition-noise-reduction/">&lt;p&gt;不知道有多少人会用Adobe Audition录制音频，应该不多，录视频的估计很多，不管怎样，也是介绍一个Au中去除录音电流噪声的方法（同时对去环境噪音也有一定用处），这是比较简便的一个，而且效果不错，对于一般人来说够了&lt;&#x2F;p&gt;
&lt;p&gt;首先打开Au，好吧，这个界面有点乱，我们随意新建一个录音吧&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;http:&#x2F;&#x2F;farm6.static.flickr.com&#x2F;5135&#x2F;5449595071_4070c83000.jpg&quot; alt=&quot;step-1&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;接着我们来制作噪音样本，点下录音按钮不要说话，过一段时间后点击结束&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;http:&#x2F;&#x2F;farm5.static.flickr.com&#x2F;4118&#x2F;5449595173_7bc7ced6af.jpg&quot; alt=&quot;step-2&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;我们就得到了这样一个电流噪音样本&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;http:&#x2F;&#x2F;farm5.static.flickr.com&#x2F;4094&#x2F;5449595313_95def47006.jpg&quot; alt=&quot;step-3&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;我们选中这段噪音样本，对的，就是振幅大的这一段，一部分就行，右击选择修剪&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;http:&#x2F;&#x2F;farm6.static.flickr.com&#x2F;5015&#x2F;5450205342_ee7f442224.jpg&quot; alt=&quot;step-4&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;这样我们就得到了完整的噪音样本。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;http:&#x2F;&#x2F;farm6.static.flickr.com&#x2F;5252&#x2F;5449595497_8796bb245a.jpg&quot; alt=&quot;step-5&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;然后我们选择“效果”→“修复”→“降噪器（进程）”&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;http:&#x2F;&#x2F;farm6.static.flickr.com&#x2F;5175&#x2F;5450205836_04afddfde9.jpg&quot; alt=&quot;step-6&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;然后有了这样一个界面&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;http:&#x2F;&#x2F;farm6.static.flickr.com&#x2F;5139&#x2F;5449595863_bc6619257a.jpg&quot; alt=&quot;step-7&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;可以看到它是自动选择整个音频的&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;http:&#x2F;&#x2F;farm6.static.flickr.com&#x2F;5251&#x2F;5450206020_787c261646.jpg&quot; alt=&quot;step-8&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;我们点击“获取特性”&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;http:&#x2F;&#x2F;farm5.static.flickr.com&#x2F;4094&#x2F;5449596151_1c255b0d40.jpg&quot; alt=&quot;step-9&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;好了，我们得到目前噪音的特性了&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;http:&#x2F;&#x2F;farm6.static.flickr.com&#x2F;5217&#x2F;5450206326_f1956fd599.jpg&quot; alt=&quot;step-10&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;通过调节“降噪级别”，我们可以调整降噪的幅度，同时配合“试听（右下角）”功能，可以调节出一个比较好的效果&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;http:&#x2F;&#x2F;farm6.static.flickr.com&#x2F;5252&#x2F;5450206466_c43c265f58.jpg&quot; alt=&quot;step-11&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;好，我们调整完毕之后点击“确定”，让它处理完毕，之后我们可以看到，噪音已经去除了&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;http:&#x2F;&#x2F;farm5.static.flickr.com&#x2F;4118&#x2F;5449596573_abb7834858.jpg&quot; alt=&quot;step-12&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;我们已经获得了噪音特性，之后要去除其他录音中的噪音，我们只需要打开那个音频，然后选中要降噪的部分，用相同的方法进行降噪，不过不用再获取特性了，因为我们已经有了，建议在录完音频处理完之后立即进行降噪，因为那时候的噪音状况比较相近，效果会比较好。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>把 Android 装到电脑上</title>
          <pubDate>Mon, 31 Jan 2011 12:24:48 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/android-on-pc/</link>
          <guid>https://guchengf.me/blog/android-on-pc/</guid>
          <description xml:base="https://guchengf.me/blog/android-on-pc/">&lt;p&gt;好吧，话不多说，直接上图，基本功能都有，可以上网，版本是2.2.1&lt;&#x2F;p&gt;
&lt;p&gt;其他暂未测试~&lt;&#x2F;p&gt;
&lt;p&gt;开机画面~&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;http:&#x2F;&#x2F;farm6.static.flickr.com&#x2F;5019&#x2F;5404335990_6bfc9ec1c3.jpg&quot; alt=&quot;booting&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;滑动解锁。。。哈哈，把下边的锁拉到上边就可以了，注意左上角显示没有插入SD卡。。。当然了。。。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;http:&#x2F;&#x2F;farm6.static.flickr.com&#x2F;5292&#x2F;5403733675_c819f7c11e.jpg&quot; alt=&quot;unlocking&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;桌面，标志性的小机器人。可以把程序拖到桌面上来。同时桌面可以左右拖动，切换不同工作区&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;http:&#x2F;&#x2F;farm6.static.flickr.com&#x2F;5180&#x2F;5403733901_2c9f0db670.jpg&quot; alt=&quot;desktop&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;程序界面&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;http:&#x2F;&#x2F;farm6.static.flickr.com&#x2F;5174&#x2F;5403734461_bc8fc74cdf.jpg&quot; alt=&quot;program-list-1&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;程序界面&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;http:&#x2F;&#x2F;farm6.static.flickr.com&#x2F;5216&#x2F;5403734671_8491f0bb81.jpg&quot; alt=&quot;program-list-2&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;注意看版本号。2.2.1&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;http:&#x2F;&#x2F;farm6.static.flickr.com&#x2F;5139&#x2F;5404336706_72ebd43560.jpg&quot; alt=&quot;version&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;输入界面。。。键盘大得吓人~三分之二屏幕都是。很明显这是为触屏准备的。。。（支持键盘输入）&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;http:&#x2F;&#x2F;farm6.static.flickr.com&#x2F;5251&#x2F;5403734901_7d63a8a0e1.jpg&quot; alt=&quot;keyboard&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;更多的测试以后再慢慢放出吧。&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>终于开通了自己的blog~</title>
          <pubDate>Thu, 27 Jan 2011 13:20:54 +0000</pubDate>
          <author>Unknown</author>
          <link>https://guchengf.me/blog/hello-world/</link>
          <guid>https://guchengf.me/blog/hello-world/</guid>
          <description xml:base="https://guchengf.me/blog/hello-world/">&lt;p&gt;忙乎了两天，终于把自己的blog搞定了。&lt;&#x2F;p&gt;
&lt;p&gt;中间也是遇到很多问题，换了很多域名和空间，当然，都是免费的。哈哈&lt;&#x2F;p&gt;
&lt;p&gt;差不多都弄完之后，写篇日志庆祝下！&lt;&#x2F;p&gt;
</description>
      </item>
    </channel>
</rss>
