<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>ChoDocs</title>
        <link>https://chodocs.cn/</link>
        <description>一站式前端内容网站，包括学习路线、知识体系，海量前端面试问题解答，一站式阅读体验，跟随前沿技术，深度和广度学习，React 与 Vue 生态。</description>
        <lastBuildDate>Thu, 05 Feb 2026 02:13:49 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-CN</language>
        <image>
            <title>ChoDocs</title>
            <url>https://chodocs.cn//chodocs-logo.svg</url>
            <link>https://chodocs.cn/</link>
        </image>
        <copyright>Copyright (c) 2022-present, Chocolate and ChoDocs contributors</copyright>
        <item>
            <title><![CDATA[24 年 4 月份学习动态 ]]></title>
            <link>https://chodocs.cn//weekly/202404.html</link>
            <guid isPermaLink="false">https://chodocs.cn//weekly/202404.html</guid>
            <pubDate>Mon, 22 Apr 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[24 年 4 月份学习动态  第一周  待补充...]]></description>
            <content:encoded><![CDATA[<h2 id="第一周" tabindex="-1">第一周 </h2>
<blockquote>
<p>待补充...</p>
</blockquote>]]></content:encoded>
            <author>Choi Yang</author>
        </item>
        <item>
            <title><![CDATA[2024 新年快乐 ]]></title>
            <link>https://chodocs.cn//weekly/2024.html</link>
            <guid isPermaLink="false">https://chodocs.cn//weekly/2024.html</guid>
            <pubDate>Thu, 25 Jan 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[2024 新年快乐  关于 2023 年终总结这次我没有在年末去写，一方面是准备面试这块，另外一方面是对于 2023 的目标并没有做好。 再过几周快要到春节了，也许回老家路途当中我又会多几分思绪，会构思出我应该写什么。 当然，一些过去的事情已成为历史，2024 年继续努力！]]></description>
            <content:encoded><![CDATA[<p>关于 2023 年终总结这次我没有在年末去写，一方面是准备面试这块，另外一方面是对于 2023 的目标并没有做好。</p>
<p>再过几周快要到春节了，也许回老家路途当中我又会多几分思绪，会构思出我应该写什么。</p>
<p>当然，一些过去的事情已成为历史，2024 年继续努力！</p>]]></content:encoded>
            <author>Choi Yang</author>
        </item>
        <item>
            <title><![CDATA[23 年 10 月份学习动态 ]]></title>
            <link>https://chodocs.cn//weekly/202310.html</link>
            <guid isPermaLink="false">https://chodocs.cn//weekly/202310.html</guid>
            <pubDate>Sat, 07 Oct 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[23 年 10 月份学习动态  第一周  假期中，无学习。 第二周  这一周主要是看神光的 Nest 小册，大概是从第 12 节开始的，目前看到第 33 节，这个在 9 月第二周内容有提到，是想要开始学一下这块内容。 Nest 通关秘籍 大概看了下面这篇文章，看起来有点吃力，先记录着，或许后续再回头看的时候会清晰一些。 Islands &amp; Server Components &amp; R]]></description>
            <content:encoded><![CDATA[<h2 id="第一周" tabindex="-1">第一周 </h2>
<blockquote>
<p>假期中，无学习。</p>
</blockquote>
<h2 id="第二周" tabindex="-1">第二周 </h2>
<p>这一周主要是看神光的 Nest 小册，大概是从第 12 节开始的，目前看到第 33 节，这个在 9 月第二周内容有提到，是想要开始学一下这块内容。</p>
<p><a href="https://juejin.cn/book/7226988578700525605" target="_blank" rel="noreferrer">Nest 通关秘籍</a></p>
<p>大概看了下面这篇文章，看起来有点吃力，先记录着，或许后续再回头看的时候会清晰一些。</p>
<p><a href="https://dev.to/this-is-learning/islands-server-components-resumability-oh-my-319d" target="_blank" rel="noreferrer">Islands &amp; Server Components &amp; Resumability, Oh My!</a></p>
<h2 id="第三周" tabindex="-1">第三周 </h2>
<h3 id="nest" tabindex="-1">Nest </h3>
<p>早些时间看 Nest 的时候就有打算参考这位大佬的关于 Nest 启动模版的开源项目，没想到现在又有新花样了。大概看了一下项目，还有挺多不是很熟悉，先留个脑海印象，继续学习。</p>
<p><a href="https://innei.in/posts/programming/nestjs-with-trpc-and-dependency-injection" target="_blank" rel="noreferrer">NestJS + tRPC 与 CSR 侧的 React Query 集成指南</a></p>
<h3 id="next-js" tabindex="-1">Next.js </h3>
<p>又一个实验性功能，配置方式：</p>
<div class="language-javascript line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">javascript</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">exports</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  experimental: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    optimizePackageImports: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'my-lib'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><p><a href="https://vercel.com/blog/how-we-optimized-package-imports-in-next-js" target="_blank" rel="noreferrer">How we optimized package imports in Next.js</a></p>
<p>关于 RSC 比较不错的内容，有具体的项目。后文介绍 Router Cache 问题，这个在 8 - 9 月份的时候就有了解过，不确定现在是否还有问题（最近一些事情以及自己有点懒了，没抽时间去验证实践）。</p>
<p><a href="https://www.antstack.com/blog/exploring-react-server-components-and-server-actions-with-next-js/" target="_blank" rel="noreferrer">Exploring React Server Components and Server Actions with Next.js</a></p>
<h3 id="其它" tabindex="-1">其它 </h3>
<p>近段时间会在星球内发布，暂不公开分享。</p>
<h2 id="第四周" tabindex="-1">第四周 </h2>
<p>准备更换工作 ing</p>]]></content:encoded>
            <author>Choi Yang</author>
        </item>
        <item>
            <title><![CDATA[23 年 9 月份学习动态 ]]></title>
            <link>https://chodocs.cn//weekly/202309.html</link>
            <guid isPermaLink="false">https://chodocs.cn//weekly/202309.html</guid>
            <pubDate>Mon, 11 Sep 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[23 年 9 月份学习动态  第一周  React  看了下面这个视频，App Router 中使用 tRPC 以及 react-query： tRPC + NextJS App Router = Simple Typesafe APIs - Jack Herrington 下面这篇 React 并发模式阅读花费了一些时间： The underlying mechanisms of React’s]]></description>
            <content:encoded><![CDATA[<h2 id="第一周" tabindex="-1">第一周 </h2>
<h3 id="react" tabindex="-1">React </h3>
<p>看了下面这个视频，App Router 中使用 tRPC 以及 react-query：</p>
<p><a href="https://www.youtube.com/watch?v=qCLV0Iaq9zU" target="_blank" rel="noreferrer">tRPC + NextJS App Router = Simple Typesafe APIs - Jack Herrington</a></p>
<p>下面这篇 React 并发模式阅读花费了一些时间：</p>
<p><a href="https://andreigatej.dev/blog/the-underlying-mechanisms-of-reacts-concurrent-mode/" target="_blank" rel="noreferrer">The underlying mechanisms of React’s concurrent mode</a></p>
<p>看完上面这篇后发现意犹未尽，又想起之前这篇并发也讲得挺好的，又重新回顾了一遍：</p>
<p><a href="https://vercel.com/blog/how-react-18-improves-application-performance" target="_blank" rel="noreferrer">How React 18 Improves Application Performance</a></p>
<p><a href="https://t.zsxq.com/123yzWHCj" target="_blank" rel="noreferrer">近期了解到的 React 一些</a></p>
<h3 id="bun" tabindex="-1">Bun </h3>
<p>近期热点：</p>
<p><a href="https://bun.sh/" target="_blank" rel="noreferrer">Bun 官方文档</a></p>
<p>看了两位博主的介绍，感觉挺牛的，新项目可以开始玩一玩：</p>
<p><a href="https://www.youtube.com/watch?v=EJv2Hmhg95w" target="_blank" rel="noreferrer">My Favorite New Features in Bun 1.0 - Josh tried coding</a></p>
<p><a href="https://www.youtube.com/watch?v=dQkv5C-Lfkw" target="_blank" rel="noreferrer">Bun Is Better Than I Hoped - Theo - t3․gg</a></p>
<p>在星球内提了一下，写了一下感想：</p>
<p><a href="https://t.zsxq.com/12B9FiQTM" target="_blank" rel="noreferrer">Bun 发布</a></p>
<h3 id="随笔" tabindex="-1">随笔 </h3>
<p>过去几个月阅读文章的时候借助翻译插件，其实阅读也挺快的，不过会错过英文学习的机会，这周在尝试在家里阅读的时候会真正读出来，边听边改善自己发音问题，我是知道自己在轻重音这块不分的，所以说出来很有中式味道，也感觉怪怪的，这段过程是挺难的，关键还是过去并没有很重视发音的问题，而只是为了应试需要。</p>
<p>所以过去虽然英语成绩还算过得去，但也只是考试能过个关罢了。加油吧，一步一步把困难点越过去。</p>
<h2 id="第二周" tabindex="-1">第二周 </h2>
<h3 id="react-1" tabindex="-1">React </h3>
<p>我是真不会用 React 啊：</p>
<p><a href="https://www.developerway.com/posts/how-to-use-memo-use-callback" target="_blank" rel="noreferrer">How to useMemo and useCallback: you can remove most of them</a></p>
<p><a href="https://www.developerway.com/posts/react-re-renders-guide" target="_blank" rel="noreferrer">React re-renders guide: everything, all at once</a></p>
<p>非常棒的内容，可惜新出的课有点贵 😂</p>
<p><a href="https://www.joshwcomeau.com/react/server-components/" target="_blank" rel="noreferrer">Making Sense of React Server Components</a></p>
<h3 id="bun-1" tabindex="-1">Bun </h3>
<p><a href="https://www.youtube.com/watch?v=1xoy8Q5o8ws" target="_blank" rel="noreferrer">The Truth About Bun</a></p>
<p><a href="https://www.youtube.com/watch?v=z_66kDwxwBI" target="_blank" rel="noreferrer">My thoughts on Bun</a></p>
<h3 id="docker" tabindex="-1">Docker </h3>
<p>最近想开始学习一下 Docker 和 Kubernetes，也就是往 DevOps 方向多靠一靠。</p>
<p><a href="https://levelup.gitconnected.com/docker-for-frontend-developers-4eeaedf10dc7" target="_blank" rel="noreferrer">Docker for frontend developers</a></p>
<p>目前视频教程以看这个为主，先从一个点出发，之后可能会看看其它系列，主要是搜的时候这个靠前，然后在听的时候觉得吐词还是比较清楚的，对于英文这块也能锻炼下 👂🏻。</p>
<p><a href="https://www.youtube.com/watch?v=wH9XesmPUOk&amp;list=PLy7NrYWoggjwPggqtFsI_zMAwvG0SqYCb" target="_blank" rel="noreferrer">How to install docker? Step by Step || Docker Tutorial</a></p>
<h3 id="其它" tabindex="-1">其它 </h3>
<p><a href="https://www.youtube.com/watch?v=DGHIjLMMKdk" target="_blank" rel="noreferrer">Why You Never Finish Your Side Projects</a></p>
<p>有点点震撼，还好会一点 tailwindcss。</p>
<p><a href="https://www.youtube.com/watch?v=xNG4zXpU1QA&amp;t=3s" target="_blank" rel="noreferrer">Vercel's New AI Writes Surprisingly Good Code</a></p>
<p><a href="https://www.youtube.com/watch?v=q5DFpyIN5Xs" target="_blank" rel="noreferrer">7 Awesome TypeScript Types You Should Know</a></p>
<h3 id="随笔-1" tabindex="-1">随笔 </h3>
<p>可能想再开始看看光哥的 Nest 小册，里面也有许多 Docker 相关内容，其它一些碎碎念就在星球内发布了。</p>
<p><a href="https://t.zsxq.com/12nzBvMax" target="_blank" rel="noreferrer">随笔：2023.09.18</a></p>
<h2 id="第三周" tabindex="-1">第三周 </h2>
<h3 id="bun-2" tabindex="-1">Bun </h3>
<p>看了这篇文章，估计 Bun 还是替代不了，我的文档项目目前用 Bun 只是尝个鲜，倒是没发现兼容性问题，速度的话个人感觉差别不是很大。</p>
<p><a href="https://adventures.nodeland.dev/archive/my-thoughts-on-bun/" target="_blank" rel="noreferrer">My thoughts on Bun and other Adventures</a></p>
<h3 id="ts" tabindex="-1">TS </h3>
<p>原来是这样：</p>
<p><a href="https://www.totaltypescript.com/tsconfig-cheat-sheet" target="_blank" rel="noreferrer">The TSConfig Cheat Sheet</a></p>
<h3 id="docker-1" tabindex="-1">Docker </h3>
<p>这周最主要学习部分，虽然视频内容是 2 年前的，但是入个门还是可以，现在明白一些配置文件以及在 DevOps 流程中的作用了。</p>
<p><a href="https://www.youtube.com/watch?v=pg19Z8LL06w" target="_blank" rel="noreferrer">Docker Crash Course for Absolute Beginners [NEW]</a></p>
<p><a href="https://www.youtube.com/watch?v=3c-iBn73dDE" target="_blank" rel="noreferrer">Docker Tutorial for Beginners [FULL COURSE in 3 Hours]</a></p>
<h3 id="其它-1" tabindex="-1">其它 </h3>
<blockquote>
<p>随便看看</p>
</blockquote>
<p><a href="https://www.youtube.com/watch?v=oO5FNfZMrWg" target="_blank" rel="noreferrer">I Never Want to Write Tailwind Any Other Way</a></p>
<h3 id="随笔-2" tabindex="-1">随笔 </h3>
<p><a href="https://t.zsxq.com/126an4hRq" target="_blank" rel="noreferrer">随笔：2023.09.25</a></p>
<h2 id="第四周" tabindex="-1">第四周 </h2>
<p>在 b 站发了一个动态，许久没有更新内容了：</p>
<p><a href="https://www.bilibili.com/opus/845528986102530081" target="_blank" rel="noreferrer">承蒙各位喜爱，说下更新事宜</a></p>
<blockquote>
<p>预准备国庆假期，没有学习。</p>
</blockquote>]]></content:encoded>
            <author>Choi Yang</author>
        </item>
        <item>
            <title><![CDATA[23 年 8 月份学习动态 ]]></title>
            <link>https://chodocs.cn//weekly/202308.html</link>
            <guid isPermaLink="false">https://chodocs.cn//weekly/202308.html</guid>
            <pubDate>Mon, 07 Aug 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[23 年 8 月份学习动态  第一周  React Query  目前还没开始在项目中正式使用 React Query，但看完倒是改变了我起初的认知。 TODO：视频稿 React Query and React Context Thinking in React Query RSC  下面这篇文章很好，会基于这篇博客录制一期视频稿，vercel 的 blog 内容质量都不错。 Understan]]></description>
            <content:encoded><![CDATA[<h2 id="第一周" tabindex="-1">第一周 </h2>
<h3 id="react-query" tabindex="-1">React Query </h3>
<p>目前还没开始在项目中正式使用 React Query，但看完倒是改变了我起初的认知。</p>
<blockquote>
<p>TODO：视频稿</p>
</blockquote>
<p><a href="https://tkdodo.eu/blog/react-query-and-react-context" target="_blank" rel="noreferrer">React Query and React Context</a></p>
<p><a href="https://tkdodo.eu/blog/thinking-in-react-query" target="_blank" rel="noreferrer">Thinking in React Query</a></p>
<h3 id="rsc" tabindex="-1">RSC </h3>
<p>下面这篇文章很好，会基于这篇博客录制一期视频稿，vercel 的 blog 内容质量都不错。</p>
<p><a href="https://vercel.com/blog/understanding-react-server-components" target="_blank" rel="noreferrer">Understanding React Server Components</a></p>
<h3 id="圈子" tabindex="-1">圈子 </h3>
<p>回答了秋招相关问题：</p>
<details  class="details custom-block"><summary>问题描述</summary>
<p>hello,chocolate 哥，好久没找你问问题了，最近大家问的都是有关秋招的事情，我也不例外。先说说我的近况：我是在 7 月 10 号开始自己的第一份实习，入职的是一家专门给政府做大数据平台的公司，平时主要的工作就是给几个数据平台的项目改改 bug 和对一些功能模块进行迭代更新。前段时间主管给我安排的工作比较少，空闲的时间我会研究一下公司前端的源码，然后写写算法题(目前是跟着剑指 offer 来刷的)，晚上回学校会学习 react 和做一下组件库项目(因为我觉得之前自己简历上的项目没有很特别的地方，所以就决定做一个组件库项目，用的是 vue3+ts)，这段时间的话感觉技术深度上会有那么点提升，就比如公司某个项目的水印功能我看了源码之后会思考进一步的封装优化，也有用 ts 重新优化封装了一下，为此还写了文章，还有就是工作中踩过的坑也会让自己长记性，再者就是写组件库让我对 Vue3 和 ts 有进一步理解(感觉写组件库可以更好地理解去一门框架)。对于秋招的展望：经历过这段实习后我还是想去互联网公司看看吧，工资的话，能到五位数就算成功吧。现在主要纠结的点是：我什么时候辞职 all in 秋招比较合适？因为现阶段慢慢感觉到公司让我做的工作对自己的提升没那么大了，然后每天下班回学校学习会觉得时间没那么够用，一开始我是想着九月份的时候就离职的，这两天又在想要不要提前在八月中旬的时候提离职，这样可以多点时间把自己手头上的项目给完善好，然后准备八股和改简历，九月份就不会那么赶，但是八月中旬提离职的话这个实习时长又会很尴尬。
<a href="https://t.zsxq.com/10MSK8lck" target="_blank" rel="noreferrer">问题回复</a></p>
</details>
<h3 id="其它" tabindex="-1">其它 </h3>
<p>8 月开篇其实还算轻松，和同事约了好几顿饭，原因是工作变动，具体就不详细在这公开展示了，也可能是有个传统吧，一般变动的同事都会请其他人吃顿饭，也许今后我们就是陌生人了，很难再见个面了。</p>
<p>尽管过去在工作中也有一些烦心事儿，但都过去了。总的来说，我其实是在一个比较融洽的团队当中，未来不久也许我也会有变动，但做好当下的事情就好，不急不躁，也希望他们能有更好的钱途。</p>
<h2 id="第二周" tabindex="-1">第二周 </h2>
<h3 id="文章学习" tabindex="-1">文章学习 </h3>
<p>挺有意思的，没想到也是看了 Demystifying React Server Components 那篇文章：</p>
<p><a href="https://www.alvar.dev/blog/creating-devtools-for-react-server-components" target="_blank" rel="noreferrer">Devtools for React Server Components</a></p>
<p>再看了文档这部分，最开始读的时候感觉很吃力，现在看起来顺畅许多了。</p>
<p><a href="https://nextjs.org/docs/getting-started/react-essentials" target="_blank" rel="noreferrer">React Essentials</a></p>
<p>感觉不看我也能理解 Server Actions 的概念：</p>
<p><a href="https://scastiel.dev/simplest-example-server-actions-nextjs" target="_blank" rel="noreferrer">The simplest example to understand Server Actions in Next.js</a></p>
<h3 id="视频学习" tabindex="-1">视频学习 </h3>
<p>看了如下三个视频：</p>
<p><a href="https://www.youtube.com/watch?v=6M9aZzm-kEc" target="_blank" rel="noreferrer">The most underrated TypeScript feature</a></p>
<p><a href="https://www.youtube.com/watch?v=_yhSh4g0NSk" target="_blank" rel="noreferrer">I Hate Next.js 13 Caching Even More Now</a></p>
<p><a href="https://www.youtube.com/watch?v=dD1fpoGHuC8&amp;t=14s" target="_blank" rel="noreferrer">This UI Library is NEXT LEVEL (New Update!)</a></p>
<h3 id="感想" tabindex="-1">感想 </h3>
<p>感觉最近自己有点摆烂，对于编程这块的兴趣有点下降，也许是工作上的事情让我觉得有点力不从心，身边同事的变动也让我有点不知所措，想到一堆事情交接到我手里就不是很好受，但也没办法，拥抱变化，熬过这阵子再说。</p>
<h2 id="第三周" tabindex="-1">第三周 </h2>
<blockquote>
<p>将会是最艰难的一周...</p>
</blockquote>
<p>加油吧。</p>
<h2 id="第四周" tabindex="-1">第四周 </h2>
<p>8 月的后面两周，工作日是近段时间最忙的，人员变动，事情交接确实处理了蛮多事情，不过现阶段也差不多弄完了。近段时间没有腾出许多时间在学习上，除开每天固定忙碌的打工时间，剩余时间用于玩游戏与观看堆积了一段时间的影视，玩了过去一直很想很想体验的游戏：只狼和艾尔登法环，最近新出的装甲核心 6 也在体验。游玩的体验也很不错，玩的也挺疯狂的。</p>
<p>差不多有半个月没有内容和视频动态更新，未更新的每一周其实我还是有打算补录一下，不过总感觉状态不是很好，也许是工作上琐事比较多，这段时间让我对代码有一点点抗拒，工作之外并不想再去写代码，阅读相关内容。这两款游戏确实让我找到了新的兴奋点，这段日子也算是挺过来了。</p>
<p>提到补录视频这块，最近除开娱乐时间几乎脑子都在想着工作事情，所以并没有多少学习新东西的欲望，反而回家玩会儿游戏屏蔽掉工作上的压力会更舒适。</p>
<p>不过我也知道游戏应该只是工作时间之外的一部分，马上也快 9 月了，我会恢复往常的学习状态，保持分享，正好这段日子的一些囤积的新东西都可以学一学，逛一逛了。</p>]]></content:encoded>
            <author>Choi Yang</author>
        </item>
        <item>
            <title><![CDATA[23 年 7 月份学习动态 ]]></title>
            <link>https://chodocs.cn//weekly/202307.html</link>
            <guid isPermaLink="false">https://chodocs.cn//weekly/202307.html</guid>
            <pubDate>Sat, 01 Jul 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[23 年 7 月份学习动态  第一周  主题：日积月累，顺应变化  1）最近终于等到了阿里云备案完成的消息了，把我的域名 yangchaoyi.vip 重拾了，也就是之前所说的用 mx-space 搭建的。这下还是多催催自己写写文章，毕竟服务器是要花钱的 2）最近的英文学习是跟着 b 站 up「昂克英文君」来的，尽管他大概半年没有更新了，但是前些年创作的视频真的质量很高，而且老师的声音也很棒，很清]]></description>
            <content:encoded><![CDATA[<h2 id="第一周" tabindex="-1">第一周 </h2>
<h3 id="主题-日积月累-顺应变化" tabindex="-1">主题：日积月累，顺应变化 </h3>
<p>1）最近终于等到了阿里云备案完成的消息了，把我的域名 yangchaoyi.vip 重拾了，也就是之前所说的用 mx-space 搭建的。这下还是多催催自己写写文章，毕竟服务器是要花钱的</p>
<p>2）最近的英文学习是跟着 b 站 up「昂克英文君」来的，尽管他大概半年没有更新了，但是前些年创作的视频真的质量很高，而且老师的声音也很棒，很清晰流利。</p>
<p>几乎所有英文内容都涉及到了，还为大家整理在了收藏夹里面，全都是无私分享，实在是太棒了！之后看了最后两期更新的视频，也感叹生活的不易，这两年真是艰难，想做自媒体也很难有应得的回报。</p>
<p>还有一点是这些内容其实完全可以作为收费，但依旧选择了免费公开，而收费的话我理解的是解答疑惑，提供导师辅导一样。基本上入门到进阶全都有了，自学完全没问题，这也是我很喜欢的一点，这也是个人价值观不同，看中长期收益。</p>
<p>今后我也会考虑支持一下这位老师，遇到优秀的人我总是感觉很兴奋，尽管素未谋面，但人一生也许很短暂，能遇到一些值得让自己感到很激动和感谢地人已经是让我很快乐的事情了，我常常会想，居然还有这样积极的人，我也要多“吸收”他们的能量。</p>
<blockquote>
<p>剩下内容不公开分享了，详见：</p>
</blockquote>
<p><a href="https://t.zsxq.com/10KseLDYZ" target="_blank" rel="noreferrer">日积月累，顺应变化</a></p>
<h2 id="第二周" tabindex="-1">第二周 </h2>
<p>这周主要是看这份文档：</p>
<p><a href="https://github.com/reactwg/server-components/discussions/5" target="_blank" rel="noreferrer">RSC From Scratch. Part 1: Server Components</a></p>
<p>dan 神写的，不过时间是 6 月份，还有两个部分没有更新，剩下两章节就不确定啥时候发布了，得等等了。</p>
<p>从零开始这个系列真的写的不错，当英文阅读看也挺好，深度学习！</p>
<p>我是看了两遍，第一遍有很多语句不太熟悉，有些内容也感觉看着看着就有点绕，第二遍感觉就还好，在语句中也掌握了一些单词使用。总体来说，看完能加深对服务端组件的理解，能有个大概的认知，这样今后 React 再次更新服务端相关的东西也有个前提概要了。</p>
<p>接着，就是基于之前发的 next-enterprise 项目，录制了两期视频：</p>
<p><a href="https://www.bilibili.com/video/BV1TX4y1v7J4/" target="_blank" rel="noreferrer">开源项目学习之 Next.js 企业级启动模版</a></p>
<p><a href="https://www.bilibili.com/video/BV1wu411778D/" target="_blank" rel="noreferrer">续：看看 Next.js 企业级启动项目 Issues，关于技术栈选择的问题</a></p>
<h3 id="英文学习" tabindex="-1">英文学习 </h3>
<p>之前提及的「昂克英文」目前初级专栏学习完一半了，感觉过去为了应试而学的方式确实不行，很多都是当下明白过一段时间就遗忘，工作以后用的少了遗忘的就更快，但视频教程学起来很清晰，继续保持学习。</p>
<h3 id="其它" tabindex="-1">其它 </h3>
<p><a href="https://relingo.net" target="_blank" rel="noreferrer">Relingo 插件官网</a></p>
<p>关于语言学习，这个浏览器插件真的非常棒，免费版功能很良心了，几乎取代了我之前使用的「沉浸式翻译」插件了，内容不做多余的介绍了。</p>
<p>对了，我和 HearLing 在 6 月份的时候受到邀请成为了鱼皮星球的嘉宾，一直打算写一篇文章说一下的，下次一定。</p>
<h2 id="第三周" tabindex="-1">第三周 </h2>
<p>上周分享了如下文章 how-web-works，这周抽空读完了，也算是英文阅读。</p>
<p><a href="https://github.com/vasanthk/how-web-works" target="_blank" rel="noreferrer">How Web Works</a></p>
<p>个人觉得极客时间《浏览器工作原理》李兵老师的更全和仔细一点，这份文档居然还提到了你按下键盘的回车键，产生一个电信号之类的，可以作为了解，不过真正放到面试中国内面试官可能也不会对你感兴趣。</p>
<p>接着，阅读了这篇文章，了解一下 Next.js 13 当中的 Prefetching。</p>
<p><a href="https://www.builder.io/blog/prefetching-nextjs-visual-guide" target="_blank" rel="noreferrer">A Visual Guide to Prefetching in Next.js 13</a></p>
<p>空闲时间，开始学习一下新出的 Next.js 系列视频，这位博主在 youtube 上挺活跃的，视频内容也做的很好，底下的评论几乎都是积极的，什么时候国内评论区能有这样的风气啊？目前只看到 1/6 样子，学完的话基本上就掌握了 Next.js 13 App Router 的使用。</p>
<p><a href="https://www.youtube.com/watch?v=ffJ38dBzrlY" target="_blank" rel="noreferrer">Build a SaaS AI Platform with Next.js 13, React, Tailwind, Prisma, Stripe | Full Tutorial 2023</a></p>
<p>接着，最近其实一直在看 RSC 相关的内容，找到了这份解释文档，目前只看了前言部分，待看完后整理一下内容。之后应该会配合 Dan 神写的 Deep Dive 内容再看看。</p>
<p><a href="https://demystifying-rsc.vercel.app/" target="_blank" rel="noreferrer">Demystifying React Server Components with NextJS 13 App Router</a></p>
<p>不过结合最近 Dan 离开了 Meta 公司，感觉这个系列会断更了。</p>
<p><a href="https://github.com/reactwg/server-components/discussions/5" target="_blank" rel="noreferrer">RSC From Scratch. Part 1: Server Components #5</a></p>
<h3 id="英文学习-1" tabindex="-1">英文学习 </h3>
<p>将「昂克英文君」的初级系列刷完了，毕竟是初级，里面大部分知识还是有基础的，后半部分选择性观看了，有些比较简单的就加速一把过了，后续打算往中级再学一学。</p>
<p><a href="https://www.bilibili.com/video/BV1tt411w72A/" target="_blank" rel="noreferrer">【完结】【Grammar in Use 全网首套视频教程】剑桥语法在用初级 手把手讲解 英语语法</a></p>
<h3 id="视频更新" tabindex="-1">视频更新 </h3>
<p>本周未打算录制视频，因为最近一直在看 RSC 相关的内容，感觉这块内容还了解的不够，讲不了什么，如果只是把他人的输出内容讲一遍的话真没必要录制，录完了可能自己过后也就忘记了，先自己形成一套知识体系。</p>
<p>其它，工作日看到了前老板的文章，也写了一份关于工具的感想。</p>
<p><a href="https://mp.weixin.qq.com/s/4ALipJhxCLmRZGguDROyEw" target="_blank" rel="noreferrer">让玄学可靠：构建复杂 LLM 应用</a></p>
<p><a href="https://t.zsxq.com/10QkYMQrF" target="_blank" rel="noreferrer">这半年来让我眼前一亮的 AI 平台</a></p>
<h2 id="第四周" tabindex="-1">第四周 </h2>
<p>这周几乎都是在看 RSC 相关的内容，如下：</p>
<h3 id="rsc-相关" tabindex="-1">RSC 相关 </h3>
<p>上周提及的看完了，等更新中，内容不长，浅显易懂，关键是还能拿出一部分 bundle 源码做演示，文档看起来简约但交互很棒。</p>
<p><a href="https://demystifying-rsc.vercel.app/" target="_blank" rel="noreferrer">Demystifying React Server Components with NextJS 13 App Router</a></p>
<p>支持 RSC 的库集合页，可以之后瞧一瞧。</p>
<p><a href="https://github.com/reactwg/server-components/discussions/6" target="_blank" rel="noreferrer">Libraries that support React Server Components #6</a></p>
<p>Dan 神的另外一篇文章，能够更好理解客户端组件和服务端组件的关系，配图言简意赅。</p>
<p><a href="https://github.com/reactwg/server-components/discussions/4" target="_blank" rel="noreferrer">Why do Client Components get SSR'd to HTML? #4</a></p>
<p>Web 渲染方式变化的历史，以及 RSC 的意义，看了文章底部的介绍后，翻了一下这位作者其它文章，诚心满满，内容比较优质。</p>
<p><a href="https://www.perssondennis.com/articles/why-server-components-a-brief-history-of-web" target="_blank" rel="noreferrer">Why Server Components - A Brief History of Web</a></p>
<p>RSC 的一些技巧，也许是别人的踩坑记：</p>
<p><a href="https://echobind.com/post/react-server-components-tips" target="_blank" rel="noreferrer">React Server Components Tips</a></p>
<h3 id="next-js" tabindex="-1">Next.js </h3>
<p><a href="https://www.perssondennis.com/articles/errors-received-when-migrating-nextjs-13-to-new-app-folder" target="_blank" rel="noreferrer">Errors Received When Migrating Next.js 13 to New App Folder</a></p>
<h3 id="react" tabindex="-1">React </h3>
<p>这篇内容很深度，值得多次阅读。介绍 JS 主线程以及 React 18 做的一些优化。</p>
<p><a href="https://vercel.com/blog/how-react-18-improves-application-performance" target="_blank" rel="noreferrer">How React 18 Improves Application Performance</a></p>
<p>基于 RSC，Next.js 有内置的 fetch 了，也还有 server actions 概念，那么或许就不需要用了？</p>
<p><a href="https://tkdodo.eu/blog/you-might-not-need-react-query" target="_blank" rel="noreferrer">You Might Not Need React Query</a></p>
<h3 id="ts" tabindex="-1">TS </h3>
<p><a href="https://www.totaltypescript.com/strongly-type-useref-with-elementref" target="_blank" rel="noreferrer">Strongly Type useRef with ElementRef</a></p>
<p>使用 ElementRef 可以很方便的提取元素类型，核心代码如下：</p>
<div class="language-typescript line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">typescript</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { useRef, ElementRef } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> "react"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Component</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> audioRef</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> useRef</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">ElementRef</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"audio"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>>(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">null</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">);</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> &#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">audio</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> ref</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">={</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">audioRef</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}>Hello</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">audio</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">};</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br></div></div><h3 id="英文学习-2" tabindex="-1">英文学习 </h3>
<p>中级开篇中，加油学习吧。</p>
<p><a href="https://www.bilibili.com/video/BV1C7411q7dD/" target="_blank" rel="noreferrer">【Grammar in Use 全网首套视频教程】剑桥在用语法中级 手把手讲解 英语语法</a></p>
<h3 id="视频更新-1" tabindex="-1">视频更新 </h3>
<p>开始了每周学习动态新的系列，接下来的下一周会发布上一周的学习内容的视频，做一些回顾和讲解，不断总结。不然每周更新一期技术类内容有时候还是有点挑战的，也许做着做着频道就不更新了，毕竟一旦懒起来了还真就不太想做这件事了。
详细点的在视频开头有介绍，也可跳过，总之，感谢各位能关注我，能为我的视频点赞，感谢各位的能量 buff！</p>
<p>7 月最后一周的内容会在近两天内发布，时长我会控制一下。</p>
<p><a href="https://www.bilibili.com/video/BV1eu4y127PH/" target="_blank" rel="noreferrer">【每周学习】博客阅读 | Next.js 13 相关 | RSC 初探 | Server Components | Grammar in Use</a></p>
<h3 id="文章更新" tabindex="-1">文章更新 </h3>
<blockquote>
<p>近段时间，我一直在看关于 RSC（React Server Components） 的内容，今年夏季社区讨论也挺多的，我也阅读了挺多社区大佬的文章，但毕竟现在还算是新玩意，业界以 Next.js 这个框架实践为主。
我现在其实一直处于观望阶段，Next.js 13 后出的 App Router 目前还没开始完全落地使用，不过倒是看了一些博主的视频，大概知道其中的规范。
这次呢，我就先大概梳理一下近段时间我所了解的关于 RSC 的内容，我个人感觉是在学「设计模式」...</p>
</blockquote>
<p><a href="https://t.zsxq.com/10W0ZmwPz" target="_blank" rel="noreferrer">初探 RSC</a></p>
<blockquote>
<p>想问 up 几个问题: 1.现在的秋招目标设置的合理吗？
2.除了把基础补一下，还可以从哪些方法扩大自己的优势
...</p>
</blockquote>
<p><a href="https://t.zsxq.com/10mv6mucj" target="_blank" rel="noreferrer">秋招相关问题解答</a></p>
<p>马上 8 月了，加油！</p>]]></content:encoded>
            <author>Choi Yang</author>
        </item>
        <item>
            <title><![CDATA[HearLing 的 2023 社招面试分享 ]]></title>
            <link>https://chodocs.cn//interview/2023/hearling.html</link>
            <guid isPermaLink="false">https://chodocs.cn//interview/2023/hearling.html</guid>
            <pubDate>Sun, 04 Jun 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[HearLing 的 2023 社招面试分享  分享我在今年 6 月社招面试求职的经历，现在前端确实会点卷，考察的东西会很多，有的也会问的很深入，所以大家要多准备，多总结，多学习。 最好养成习惯，把每一家面试的问题记录下来，然后回去总结自己回答不好的地方，调整优化，这样才能够更好的提升自己，有机会成功上岸。 需要根据自己经历进行梳理的问题  平常怎么学习前端的 项目的亮点 介绍你所做的项目 推荐使]]></description>
            <content:encoded><![CDATA[<p>分享我在今年 6 月社招面试求职的经历，现在前端确实会点卷，考察的东西会很多，有的也会问的很深入，所以大家要多准备，多总结，多学习。</p>
<blockquote>
<p>最好养成习惯，把每一家面试的问题记录下来，然后回去总结自己回答不好的地方，调整优化，这样才能够更好的提升自己，有机会成功上岸。</p>
</blockquote>
<h2 id="需要根据自己经历进行梳理的问题" tabindex="-1">需要根据自己经历进行梳理的问题 </h2>
<ul>
<li>
<p>平常怎么学习前端的</p>
</li>
<li>
<p>项目的亮点</p>
</li>
<li>
<p>介绍你所做的项目</p>
</li>
</ul>
<blockquote>
<p>推荐使用 star 法则：Situation（应用的使用场景）Task（有哪些任务，解决 xxx 的问题）Action（在这之中所做的行动）Result（最终的结果）</p>
</blockquote>
<p>这些问题答好了，能够给面试官一个比较好的印象，也能够让面试官知道你的学习能力，以及你的项目能力。</p>
<h2 id="常考基础面试题" tabindex="-1">常考基础面试题 </h2>
<ul>
<li>
<p>遍历数组的方法</p>
</li>
<li>
<p>for in / for of 区别</p>
</li>
<li>
<p>es6 新特性</p>
</li>
<li>
<p>let 与 const 的区别</p>
</li>
<li>
<p>promise 新方法，实现 Promise.all 或者 Promise.race</p>
</li>
<li>
<p>set 与 map 的区别</p>
</li>
<li>
<p>浏览器缓存</p>
</li>
<li>
<p>事件循环机制</p>
</li>
<li>
<p>性能优化</p>
</li>
<li>
<p>node 方面： eggjs 或者 express 中间件原理</p>
</li>
<li>
<p>为什么要使用 ssr ， next 与 nust 区别</p>
</li>
<li>
<p>跨域问题</p>
</li>
<li>
<p>介绍一下 TCP 协议，TCP 的可靠性怎么保证</p>
</li>
<li>
<p>https</p>
</li>
<li>
<p>数据类型及判断数据类型的方法</p>
</li>
<li>
<p>大数相加</p>
</li>
<li>
<p>对一个只会 Vue 框架的前端开发者，你会怎么介绍 React 框架</p>
</li>
<li>
<p>js 的 闭包，this 指向问题</p>
</li>
<li>
<p>css flex 布局</p>
</li>
<li>
<p>平常怎么做移动端适配</p>
</li>
</ul>
<h2 id="手写-js" tabindex="-1">手写 js </h2>
<p>手写题不多，可能就口述一下，讲清楚就可以了。</p>
<h3 id="_1、reduce-原理" tabindex="-1">1、reduce 原理 </h3>
<div class="language-javascript line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">javascript</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> reduce</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">array</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">reducer</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">initialValue</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> accumulator </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> initialValue</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> currentIndex </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (initialValue </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">===</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> undefined</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    accumulator </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> array[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    currentIndex </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> currentIndex; i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> array.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">length</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    accumulator </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> reducer</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(accumulator, array[i])</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> accumulator</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br></div></div><p>这个 reduce 方法接受三个参数:</p>
<ul>
<li>array:要进行扫描的数组</li>
<li>reducer:累加器函数，用于合并两个值</li>
<li>initialValue:可选的初始值，如果不指定会使用数组的第一个值作为初始值</li>
</ul>
<p>reduce 方法的工作原理是:</p>
<ol>
<li>如果指定了 initialValue，那么 accumulator 直接使用这个初始值，currentIndex 从 0 开始。</li>
<li>如果没有指定 initialValue，那么 accumulator 使用数组的第一个值，currentIndex 从 1 开始。</li>
<li>从当前索引开始遍历数组，调用 reducer 函数来合并 accumulator 和当前值。</li>
<li>返回最终的 accumulator 值。</li>
</ol>
<p>举个例子，计算数组的总和:</p>
<div class="language-javascript line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">javascript</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> sum</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">a</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">b</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> a </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> total</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> reduce</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">([</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">], sum) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// 6</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> totalWithInitial</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> reduce</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">([</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">], sum, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// 16</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><h3 id="_2、节流防抖" tabindex="-1">2、节流防抖 </h3>
<p>防抖：是指在一段时间内，不管触发多少次回调，都只执行最后一次。</p>
<div class="language-javascript line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">javascript</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> debounce</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">fn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">delay</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> timer </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> null</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">...</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">args</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    clearTimeout</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(timer)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    timer </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> setTimout</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      fn.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">apply</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">this</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, args)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }, delay)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br></div></div><p>节流：是指在一段时间内，不管触发多少次回调，都只执行一次。</p>
<div class="language-javascript line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">javascript</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> throttle</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">fn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">delay</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> flag </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> true</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">...</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">args</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">!</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">flag)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      return</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    flag </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> false</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    setTimeout</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      fn.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">apply</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">this</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, args)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      flag </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> true</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }, dalay)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br></div></div><h3 id="_3、promise-实现" tabindex="-1">3、Promise 实现 </h3>
<div class="language-javascript line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">javascript</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Promise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">executor</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> this</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  self.status </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'pending'</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  self.value </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> undefined</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  self.reason </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> undefined</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  self.onResolvedCallbacks </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> []</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  self.onRejectedCallbacks </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> []</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> resolve</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">value</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (self.status </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">===</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'pending'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      self.status </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'resolved'</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      self.value </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> value</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      self.onResolvedCallbacks.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">forEach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">fn</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> fn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">())</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> reject</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">reason</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (self.status </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">===</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'pending'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      self.status </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'rejected'</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      self.reason </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> reason</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      self.onRejectedCallbacks.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">forEach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">fn</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> fn</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">())</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  try</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    executor</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(resolve, reject)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  catch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (e) {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    reject</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(e)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Promise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">prototype</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">then</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> function</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">onFulfilled</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">onRejected</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> self</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> this</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> promise2</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (self.status </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">===</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'resolved'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    promise2 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> new</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Promise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">((</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">resolve</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">reject</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      try</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> x</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> onFulfilled</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(self.value)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">        resolvePromise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(promise2, x, resolve, reject)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      catch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (e) {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">        reject</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(e)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    })</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (self.status </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">===</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'rejected'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    promise2 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> new</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Promise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">((</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">resolve</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">reject</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      try</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> x</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> onRejected</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(self.reason)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">        resolvePromise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(promise2, x, resolve, reject)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      catch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (e) {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">        reject</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(e)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    })</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (self.status </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">===</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'pending'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    promise2 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> new</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Promise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">((</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">resolve</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">reject</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      self.onResolvedCallbacks.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">push</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        try</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">          const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> x</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> onFulfilled</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(self.value)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">          resolvePromise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(promise2, x, resolve, reject)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        catch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (e) {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">          reject</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(e)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      })</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      self.onRejectedCallbacks.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">push</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        try</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">          const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> x</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> onRejected</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(self.reason)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">          resolvePromise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(promise2, x, resolve, reject)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        catch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (e) {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">          reject</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(e)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      })</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    })</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> promise2</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> resolvePromise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">promise2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">x</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">resolve</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">reject</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (promise2 </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">===</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> reject</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> TypeError</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'Chaining cycle detected for promise'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> called</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">!==</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> null</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &#x26;&#x26;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">typeof</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">===</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'object'</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ||</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> typeof</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">===</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'function'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    try</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> then</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x.then</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">typeof</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> then </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">===</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'function'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        then.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">call</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          x,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">y</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (called)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">              return</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            called </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> true</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">            resolvePromise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(promise2, y, resolve, reject)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">r</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (called)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">              return</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            called </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> true</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">            reject</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(r)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        )</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">        resolve</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(x)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    catch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (e) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (called)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        return</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      called </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> true</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">      reject</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(e)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  else</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    resolve</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(x)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">exports</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Promise</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">53</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br><span class="line-number">56</span><br><span class="line-number">57</span><br><span class="line-number">58</span><br><span class="line-number">59</span><br><span class="line-number">60</span><br><span class="line-number">61</span><br><span class="line-number">62</span><br><span class="line-number">63</span><br><span class="line-number">64</span><br><span class="line-number">65</span><br><span class="line-number">66</span><br><span class="line-number">67</span><br><span class="line-number">68</span><br><span class="line-number">69</span><br><span class="line-number">70</span><br><span class="line-number">71</span><br><span class="line-number">72</span><br><span class="line-number">73</span><br><span class="line-number">74</span><br><span class="line-number">75</span><br><span class="line-number">76</span><br><span class="line-number">77</span><br><span class="line-number">78</span><br><span class="line-number">79</span><br><span class="line-number">80</span><br><span class="line-number">81</span><br><span class="line-number">82</span><br><span class="line-number">83</span><br><span class="line-number">84</span><br><span class="line-number">85</span><br><span class="line-number">86</span><br><span class="line-number">87</span><br><span class="line-number">88</span><br><span class="line-number">89</span><br><span class="line-number">90</span><br><span class="line-number">91</span><br><span class="line-number">92</span><br><span class="line-number">93</span><br><span class="line-number">94</span><br><span class="line-number">95</span><br><span class="line-number">96</span><br><span class="line-number">97</span><br><span class="line-number">98</span><br><span class="line-number">99</span><br><span class="line-number">100</span><br><span class="line-number">101</span><br><span class="line-number">102</span><br><span class="line-number">103</span><br><span class="line-number">104</span><br><span class="line-number">105</span><br><span class="line-number">106</span><br><span class="line-number">107</span><br><span class="line-number">108</span><br><span class="line-number">109</span><br><span class="line-number">110</span><br><span class="line-number">111</span><br><span class="line-number">112</span><br><span class="line-number">113</span><br><span class="line-number">114</span><br><span class="line-number">115</span><br><span class="line-number">116</span><br><span class="line-number">117</span><br><span class="line-number">118</span><br><span class="line-number">119</span><br><span class="line-number">120</span><br><span class="line-number">121</span><br><span class="line-number">122</span><br><span class="line-number">123</span><br><span class="line-number">124</span><br><span class="line-number">125</span><br><span class="line-number">126</span><br><span class="line-number">127</span><br><span class="line-number">128</span><br><span class="line-number">129</span><br></div></div><h3 id="_4、promiseall、promiserace" tabindex="-1">4、promiseAll、promiseRace </h3>
<div class="language-javascript line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">javascript</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> promiseAll</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">promises</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> results</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> []</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> count </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> promises.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">length</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    try</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      results[i] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> await</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> promises[i]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      count</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    catch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (err) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Promise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">reject</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(err)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (count </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">===</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> promises.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">length</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Promise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">resolve</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(results)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br></div></div><div class="language-javascript line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">javascript</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> promiseRace</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">promises</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> result</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> promises.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">length</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">; i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    try</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      result </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> await</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> promises[i]</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Promise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">resolve</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(result)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    catch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (err) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Promise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">reject</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(err)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br></div></div><h3 id="_5、深拷贝" tabindex="-1">5、深拷贝 </h3>
<p>完整版参考链接：<code>https://github.com/x-extends/xe-utils/blob/master/func/clone.js</code></p>
<div class="language-javascript line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">javascript</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> arrayEach</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> require</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'./arrayEach'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> objectEach</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> require</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'./objectEach'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> objectToString</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> require</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'./staticObjectToString'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> getCativeCtor</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">val</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">args</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Ctor</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> val.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">__proto__</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">constructor</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> args </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">?</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Ctor</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(args) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Ctor</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> handleValueClone</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">item</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">isDeep</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> isDeep </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">?</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> copyValue</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(item, isDeep) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> item</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> copyValue</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">val</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">isDeep</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (val) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    switch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (objectToString.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">call</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(val)) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      case</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> '[object Object]'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> restObj</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Object.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">create</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(Object.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">getPrototypeOf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(value))</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">        objectEach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(val, (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">item</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">key</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          restObj[key] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> handleValueClone</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(item, isDeep)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        })</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> restObj</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      case</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> '[object Date]'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      case</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> '[object RegExp]'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        return</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> getCativeCtor</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(val, val.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">valueOf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">())</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      case</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> '[object Array]'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      case</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> '[object Arguments]'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> restArr</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> []</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">        arrayEach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(val, (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">item</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          restArr.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">push</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">handleValueClone</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(item, isDeep))</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        })</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> restArr</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      case</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> '[object Set]'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> restSet</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> getCativeCtor</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(val)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        restSet.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">forEach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">((</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">item</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          restSet.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">add</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">handleValueClone</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(item, isDeep))</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        })</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> restSet</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      case</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> '[object Map]'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> restMap</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> getCativeCtor</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(val)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        restMap.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">forEach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">((</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">item</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">key</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          restMap.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">set</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(key, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">handleValueClone</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(item, isDeep))</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        })</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> restMap</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> val</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">/**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * 浅拷贝/深拷贝</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> *</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">@param</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> {object}</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> obj</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> 对象/数组</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">@param</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> {boolean}</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> deep</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> 是否深拷贝</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">@return</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> {object}</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> */</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> clone</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">obj</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">deep</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (obj) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> copyValue</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(obj, deep)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> obj</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">exports</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> clone</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">53</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br><span class="line-number">56</span><br><span class="line-number">57</span><br><span class="line-number">58</span><br><span class="line-number">59</span><br><span class="line-number">60</span><br><span class="line-number">61</span><br><span class="line-number">62</span><br><span class="line-number">63</span><br><span class="line-number">64</span><br><span class="line-number">65</span><br><span class="line-number">66</span><br><span class="line-number">67</span><br><span class="line-number">68</span><br><span class="line-number">69</span><br><span class="line-number">70</span><br></div></div><p>简易版，递归：</p>
<div class="language-javascript line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">javascript</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> deepClone</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">target</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">weakMap</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> WeakMap</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">typeof</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> target </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">!==</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'object'</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ||</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> target </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">==</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> null</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">typeof</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> target </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">===</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'function'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> target.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">bind</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">this</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">...</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">arguments</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> target</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (target </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">instanceof</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Date</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Date</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(target)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (target </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">instanceof</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> RegExp</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> RegExp</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(target)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> res</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> new</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> target.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">constructor</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (weakMap.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">get</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(target))</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> weakMap.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">get</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(target)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  weakMap.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">set</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(res, target)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> key</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> target) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    res[key] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> deepClone</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(target[key], weakMap)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> res</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br></div></div>]]></content:encoded>
            <author>HearLing</author>
        </item>
        <item>
            <title><![CDATA[23 年 6 月份学习动态 ]]></title>
            <link>https://chodocs.cn//weekly/202306.html</link>
            <guid isPermaLink="false">https://chodocs.cn//weekly/202306.html</guid>
            <pubDate>Wed, 31 May 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[23 年 6 月份学习动态  第一周  本周算是停了一周，工作日其余时间几乎没有放在学习上，本周末录制了关于 2023 React 生态的视频，今天剪辑差不多了，明晚回家再修剪下应该会发出来。 下半年打算将星球降价了，老用户续费的话可以联系我额外领取优惠券，所以也不会亏，当然，才进来没多久（未到半年）想退也可以，仅支持退半年费用（手续费不退） 虽然说是知识付费，但大多数人会因为我个人而付费，但目前]]></description>
            <content:encoded><![CDATA[<h2 id="第一周" tabindex="-1">第一周 </h2>
<p>本周算是停了一周，工作日其余时间几乎没有放在学习上，本周末录制了关于 2023 React 生态的视频，今天剪辑差不多了，明晚回家再修剪下应该会发出来。</p>
<CustomLink title='《2023 年 React 生态》'  href='https://www.bilibili.com/video/BV1Zh4y1G78R/'/><p>下半年打算将星球降价了，老用户续费的话可以联系我额外领取优惠券，所以也不会亏，当然，才进来没多久（未到半年）想退也可以，仅支持退半年费用（手续费不退）</p>
<p>虽然说是知识付费，但大多数人会因为我个人而付费，但目前我做的方式也许达不到该有的价值，因此考虑降价，只要我还在做编程这个领域，这个社群就会还在，我也同样每周会和各位分享我的学习动态，每周完成打卡。</p>
<p>其次，在星球内也很高兴有球友拿到了 offer，也是比较活跃的几位，关于各位提的问题基本上都回答还算不错，下半年还需继续努力。</p>
<p>其他的，各位也许能理解其中原因，暂时就不列举了，到年底总结就再好好复盘一下吧，晚安，好梦。</p>
<h2 id="第二周" tabindex="-1">第二周 </h2>
<p>本周在看 React 相关文档，如下：</p>
<CustomLink title='You Might Not Need an Effect'  href='https://react.dev/learn/you-might-not-need-an-effect'/><CustomLink title='React re-renders guide: everything, all at once' href='https://www.developerway.com/posts/react-re-renders-guide'/><p>（很推荐这个博客，全都是 React 优质内容）</p>
<p>其次，本周也发布了 b 站视频：</p>
<CustomLink title='《Stack Overflow 2023 开发者调查》JS 还是第一？
'  href='https://www.bilibili.com/video/BV1DX4y147pR/'/>
<CustomLink title='2023 Developer Survey' href='https://survey.stackoverflow.co/2023/'/><p>（2023 年 5 月，Stack Overflow 对超过 90,000 开发人员进行了年度调查，内容涉及他们如何学习和提升，他们正在使用的技术以及未来准备使用的技术...）</p>
<p>另外，本周购买了阿里云服务器，将我那个域名备案一下，目前就差最后的审核了，大概下周末应该会有备案号了。打算是回归二次元风格的博客，今后也会把一些编程内容先写在自己博客上。</p>
<h3 id="one-more-thing" tabindex="-1">One more thing </h3>
<p>Vercel 最近发布了 ai 的 sdk，日常需求 3.5 够用了，毕竟现在还提升容量了，地址在：</p>
<p><a href="https://sdk.vercel.ai/" target="_blank" rel="noreferrer">https://sdk.vercel.ai/</a></p>
<h2 id="第三周" tabindex="-1">第三周 </h2>
<p>上周一直想着把 b 站视频发了，就忘了打卡了，直到周日晚上才想起来，时间比较晚就算了，工作日感冒了有点昏昏沉沉，想着打卡还是不要太敷衍，还是得做到每周对自己真正的总结。既然欠了一些，这次总结就多些一点：</p>
<p>因为今天也是比较特殊，我是 21 年 7 月 1 日入职的，所以到现在正好两年了，就拿上周发的 b 站视频来说，发现国外很多一些远程工作都是 5 年起，所以我还有 3 年提升自己的机会，这么一想好像路还挺长时间也充足...</p>
<p>剩余内容就不公开分享了，仅星球粉丝可见，主要是两年来的一些总结和感悟。</p>
<CustomLink title='入职两周年的总结' href='https://t.zsxq.com/0fm83FjiD'/><h2 id="第四周" tabindex="-1">第四周 </h2>
<p>这两周我一直在学习英语，现在基本上每天大概会有 1-2 小时左右的时间花在英语上，当然，不是那种简单的记单词这种，而是结合了一些 youtube 上的博主方法，主要是以观看英文类视频为主，这件事情需要长期来做，我在今年 3 月份的时候，看 youtube 上一些编程类博主视频很难能跟上，看起来也比较吃力，但是现在会好很多了。</p>
<p>希望自己今后保持英语的学习，我现阶段其实并不是把英语当做必须的事儿，而是间接性很自然地去接触，逐渐去适应母语者们的谈话与交流，因为看的大部分还是前端以及全栈相关的内容，所以兴趣还是有的，边学习英文的同时也能掌握到很多其它知识。</p>
<p>我目前在看的一些频道就是这些了...</p>
<p>剩余内容就不公开分享了，仅星球粉丝可见，如下：</p>
<CustomLink title='6 月剩下两周内学习内容' href='https://t.zsxq.com/0fQHF8cGI'/>]]></content:encoded>
            <author>Choi Yang</author>
        </item>
        <item>
            <title><![CDATA[tRPC 是什么？与 REST 和 GraphQL 有啥关系 | 你可能不再需要传统的 API！ ]]></title>
            <link>https://chodocs.cn//program/trpc/</link>
            <guid isPermaLink="false">https://chodocs.cn//program/trpc/</guid>
            <pubDate>Sun, 28 May 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[tRPC 是什么？与 REST 和 GraphQL 有啥关系 | 你可能不再需要传统的 API！  tRPC 是什么？与 REST 和 GraphQL 有啥关系 | 你可能不再需要传统的 API！什么是 tRPC  tRPC 是一个基于 TypeScript 的 RPC 框架，它的目标是让前后端的开发者可以像调用本地函数一样调用远程函数，而不用关心底层的网络通信细节。 tRPC 的目标是让前后端的]]></description>
            <content:encoded><![CDATA[<VideoLink bvId='BV17z4y1z7xa' >tRPC 是什么？与 REST 和 GraphQL 有啥关系 | 你可能不再需要传统的 API！</VideoLink><h2 id="什么是-trpc" tabindex="-1">什么是 tRPC </h2>
<p>tRPC 是一个基于 TypeScript 的 RPC 框架，它的目标是让前后端的开发者可以像调用本地函数一样调用远程函数，而不用关心底层的网络通信细节。</p>
<p>tRPC 的目标是让前后端的开发者可以像调用本地函数一样调用远程函数，而不用关心底层的网络通信细节。</p>
<CloudinaryImg publicId='program/iShot_2023-06-04_20.54.29_jhvnxf' alt='trpc'/><p>相关特点可以从 <a href="https://trpc.io/" target="_blank" rel="noreferrer">tRPC 官网</a></p>
<p>直接看到，这里就不搬运官网内容了。</p>
<h2 id="本文内容" tabindex="-1">本文内容 </h2>
<p>本文会带你实现一个极简的 tRPC 项目，实现 <code>examples-minimal</code>。</p>
<blockquote>
<p>相关源码如下：</p>
</blockquote>
<p><a href="https://github.com/chonext/trpc-practice/tree/main/examples-minimal" target="_blank" rel="noreferrer">examples-minimal 项目源码</a></p>
<p>tRPC 分为几个包，所以你可以只安装你需要的，确保在代码库的适当部分安装所需的包。</p>
<p>首先安装 <code>@trpc/server</code> 和 <code>@trpc/client</code> 包，这两个包分别使用于服务端和客户端。</p>
<div class="language-bash line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> @trpc/server</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> @trpc/client</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><h2 id="编写后端逻辑" tabindex="-1">编写后端逻辑 </h2>
<p>我们不打算把项目弄复杂了，因此对于后端数据库而言，我们使用虚拟的，用一个数组即可，如下代码所示：</p>
<p><code>server/db.ts</code></p>
<div class="language-typescript line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">typescript</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">interface</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> User</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">email</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">password</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// Imaginary database</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> users</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> User</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> []</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> db</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  user: {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    findMany</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> users,</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    findById</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> users.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">find</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">user</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> user.id </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">===</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> id),</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    create</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">data</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">email</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">password</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> user</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { id: </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(users.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">length</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> +</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">), </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">data }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      users.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">push</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(user)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> user</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br></div></div><p>在模拟的 <code>db</code> 对象中有一些数据的操作方法，如 <code>findById</code> 和 <code>create</code>，这些方法会在后面的代码中用到，也如字面意思一样，<code>findById</code> 用于根据 <code>id</code> 查找用户，<code>create</code> 用于创建用户。</p>
<p>接下来创建 <code>server/trpc.ts</code> 文件，如下代码所示：</p>
<div class="language-typescript line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">typescript</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { initTRPC } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> '@trpc/server'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">/**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * Initialization of tRPC backend</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * Should be done only once per backend!</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> */</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> t</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> initTRPC.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">create</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">/**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * Export reusable router and procedure helpers</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * that can be used throughout the router</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> */</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> router</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> t.router</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> publicProcedure</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> t.procedure</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br></div></div><p>在 <code>server/trpc.ts</code> 文件中，我们初始化了 tRPC 后端，然后导出了 <code>router</code> 和 <code>publicProcedure</code> 两个变量，这两个变量会在后面的代码中用到。</p>
<p>接着，有了前面铺垫，就是编写后端逻辑了，我们在 <code>server/index.ts</code> 文件中编写后端逻辑，如下代码所示：</p>
<div class="language-typescript line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">typescript</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { createHTTPServer } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> '@trpc/server/adapters/standalone'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> z </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'zod'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { db } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> './db'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { publicProcedure, router } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> './trpc'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> appRouter</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> router</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  userList: publicProcedure.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">query</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    // Retrieve users from a datasource, this is an imaginary database</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> users</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> await</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> db.user.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">findMany</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> users</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  userById: publicProcedure</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">input</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(z.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({ id: z.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">() }))</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">query</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ({ </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">input</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      const</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> input</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> user</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> await</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> db.user.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">findById</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(id)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> user</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  userCreate: publicProcedure</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">input</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      z.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">object</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({ name: z.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(), email: z.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(), password: z.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">() })</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    )</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">mutation</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ({ </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">input</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> user</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> await</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> db.user.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">create</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(input)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> user</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">})</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// Export type router type signature,</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// NOT the router itself.</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> type</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> AppRouter</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> typeof</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> appRouter</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> server</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> createHTTPServer</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  router: appRouter,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">})</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">server.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">listen</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3000</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br></div></div><p>这里我们导入了 <code>db</code>、<code>publicProcedure</code> 和 <code>router</code>，然后创建了 <code>appRouter</code>，<code>appRouter</code> 是一个对象，它包含了 <code>userList</code>、<code>userById</code> 和 <code>userCreate</code> 三个属性，这三个属性分别对应了 <code>publicProcedure.query</code>、<code>publicProcedure.query</code> 和 <code>publicProcedure.mutation</code>，这三个属性的值都是一个函数，这个函数的返回值就是我们需要的数据。</p>
<p>值得注意的是，代码的第 31 行我标注了一下，这里导出的是 <code>AppRouter</code> 类型，而不是 <code>appRouter</code> 对象，这是因为 <code>appRouter</code> 对象中的 <code>userList</code>、<code>userById</code> 和 <code>userCreate</code> 三个属性的类型都是 <code>Procedure</code>，而 <code>Procedure</code> 是一个泛型，它的第一个参数是输入类型，第二个参数是输出类型，因此我们需要导出 <code>AppRouter</code> 类型，这样在后面的代码中才能使用 <code>AppRouter</code> 类型。</p>
<p>也就是我们在前端调用后端 api 的时候可以直接通过 <code>.</code> 就可以获得对应的属性和方法了。</p>
<p>到此，我们后端的逻辑差不多写完了，将对应的 <code>appRouter</code> 传入 <code>createHTTPServer</code> 函数中，然后监听 3000 端口即可，下面我们即将编写前端逻辑，来调用后端的接口试一试。</p>
<h2 id="编写前端逻辑" tabindex="-1">编写前端逻辑 </h2>
<p>由于前端只用负责调用 api，所以代码其实也很简单，如 <code>client/index.ts</code> 所示：</p>
<div class="language-typescript line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">typescript</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { AppRouter } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> '../server'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { createTRPCProxyClient, httpBatchLink } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> '@trpc/client'</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">//     👆 **type-only** import</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// Pass AppRouter as generic here. 👇 This lets the `trpc` object know</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// what procedures are available on the server and their input/output types.</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> trpc</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> createTRPCProxyClient</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">AppRouter</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>({</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  links: [</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    httpBatchLink</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      url: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'http://localhost:3000'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  ],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">})</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">() {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> createdUser</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> await</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> trpc.userCreate.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">mutate</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    name: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'一百个Chocolate'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    email: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'chocolate@qq.com'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    password: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'Chocolate'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  })</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'createdUser: '</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, createdUser)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> userCreated</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> await</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> trpc.userById.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">query</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({ id: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'1'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> })</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'userCreated: '</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, userCreated)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> users</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> await</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> trpc.userList.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">query</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'Users:'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, users)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br></div></div><p>这里我们导入了 <code>createTRPCProxyClient</code> 和 <code>httpBatchLink</code>，然后创建了 <code>trpc</code> 对象，<code>trpc</code> 对象就是我们用来调用后端 api 的对象，它的属性和方法就是后端 <code>appRouter</code> 对象中的 <code>userList</code>、<code>userById</code> 和 <code>userCreate</code> 三个属性，这三个属性的类型都是 <code>Procedure</code>，所以我们可以直接通过 <code>.</code> 来调用这三个属性。</p>
<h3 id="编写-script-脚本" tabindex="-1">编写 script 脚本 </h3>
<p>为了让我们前后端代码跑起来，还需要修改一下项目的 script 脚本，如下：</p>
<div class="language-json line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  // xxx</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "scripts"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "client:dev"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"esno client"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "server:dev"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"esno server"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  // ...</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div><p>这里我是使用的 <code>esno</code> 来执行我们的 ts 文件。也需要安装一下：</p>
<div class="language-bash line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> esno</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><blockquote>
<p><code>esno</code> 是一个命令行工具，它可以直接执行 ts 文件，而不需要我们先编译成 js 文件，然后再执行 js 文件，这样就可以省去编译的过程了。</p>
</blockquote>
<p>那么我们就可以在终端中执行 <code>npm run client:dev</code> 和 <code>npm run server:dev</code> 来分别启动前端和后端了，这里需要注意一下，我们需要先执行 <code>npm run server:dev</code>，然后再执行 <code>npm run client:dev</code>，因为前端需要调用后端的接口，所以后端必须先启动起来，否则前端就会报错。</p>
<p>当然，这里其实也可以使用 <code>wait-port</code> 以及 <code>npm-run-all</code> 来实现前后端一起启动，我们会在进阶篇来介绍，这里就先不展示了。</p>
<p>我们来看看打印结果：</p>
<CloudinaryImg publicId='program/iShot_2023-06-04_21.24.18_h7hzpm' alt='console'/><p>可以看到，我们成功的调用了后端的接口，获取到了数据。</p>
<h2 id="总结" tabindex="-1">总结 </h2>
<p>到此，我们就完成了一个简单的 tRPC 项目，我们使用 tRPC 来创建了一个后端 api，然后在前端使用 tRPC 来调用后端的接口，获取到了数据。</p>
<p>这里我们使用的是 <code>httpBatchLink</code>，也就是 http 协议，当然 tRPC 还支持其他的协议，比如 <code>wsLink</code>、<code>grpcLink</code>、<code>reactQueryLink</code> 等等，可以从官网文档中进一步学习。</p>
<h2 id="文章参考" tabindex="-1">文章参考 </h2>
<p><a href="https://trpc.io/docs/" target="_blank" rel="noreferrer">tRPC 官方文档</a></p>
<p><a href="https://www.youtube.com/watch?v=UfUbBWIFdJs" target="_blank" rel="noreferrer">Learn tRPC In 45 Minutes</a></p>]]></content:encoded>
            <author>Choi Yang</author>
        </item>
        <item>
            <title><![CDATA[23 年 5 月份学习动态 ]]></title>
            <link>https://chodocs.cn//weekly/202305.html</link>
            <guid isPermaLink="false">https://chodocs.cn//weekly/202305.html</guid>
            <pubDate>Sun, 30 Apr 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[23 年 5 月份学习动态  第一周  ✅ 实践了一下 prisma，并在 b 站发布了视频： （粉丝涨了几十） ✅ 最近一直在读《趁着年轻，我偏要勉强》 ✅ 看了最近 vercel 发布的动态以及看了 Next.js 13.4 版本更新内容，放个地址： 以上都会录制视频，下周会有发布 ✅ 创建了 youtube 频道，打算 youtube 和 bilibili 一起更新，也期待自己不断学习英语口]]></description>
            <content:encoded><![CDATA[<h2 id="第一周" tabindex="-1">第一周 </h2>
<p>✅ 实践了一下 prisma，并在 b 站发布了视频：</p>
<CustomLink title='【编程】Prisma 教程 | 快速入门 | 下一代 Node.js 和 TypeScript ORM' href='https://www.bilibili.com/video/BV1yo4y1x7e7/'/><blockquote>
<p>（粉丝涨了几十）</p>
</blockquote>
<p>✅ 最近一直在读《趁着年轻，我偏要勉强》</p>
<p>✅ 看了最近 vercel 发布的动态以及看了 Next.js 13.4 版本更新内容，放个地址：</p>
<CustomLink title='Introducing Vercel Storage' href='https://vercel.com/blog/vercel-storage'/><CustomLink title='Next.js 13.4' href='https://nextjs.org/blog/next-13-4'/><p>以上都会录制视频，下周会有发布</p>
<p>✅ 创建了 youtube 频道，打算 youtube 和 bilibili 一起更新，也期待自己不断学习英语口语，可能之后会有口语类视频更新，目标就是能够用英语去讲解视频，期待着那一天的自己！</p>
<CustomLink title='我的 YouTube 账号' href='https://www.youtube.com/@chocolate1999'/><p>下面是星球内的一些动态：</p>
<p>问题解答与发文：</p>
<CustomLink title='next.js 框架问题咨询' href='https://t.zsxq.com/0dLRjBSIz'/><CustomLink title='办 visa 卡之后的体验' href='https://t.zsxq.com/0d3yy2G1U'/><CustomLink title='大三阶段我对于大学的思考与转变' href='https://t.zsxq.com/0db45ZlGm'/><CustomLink title='简历指导与面试咨询与计划安排' href='https://t.zsxq.com/0dUdFSTkN'/><p>另外就是帮几位球友看了简历，但是微信上直接聊的，就没公开在星球了，大家如果还有简历或者最近面试一些相关事情也欢迎继续交流</p>
<p>时间过得很快，还两个月今年就过一半了，上半年结束我会把学习计划好好总结一遍，写一份总结，回顾一下上半年</p>
<h2 id="第二周" tabindex="-1">第二周 </h2>
<p>本周工作日回答了一些问题，也和一些球友私下聊了些，也有收到面试邀请的，期待好消息。</p>
<p>另外，在这次打卡内容里也写点东西，这周因为其他组前端休陪产假了，请了两周假，而那个组就一个前端，而我当初又因为我们总监的关系，揽了不少活给我们组，因此前端事情非常多，不过好在大部分事情这周内也解决了。</p>
<p>这周状态就是事情多到不能停下键盘，也与去年降本增效有关系，原本那个组前端是有 3 个的，两个被抽出去研究 AI 去了，剩下一个也管理微前端很多个模块，因此他这个角色地位挺重要的，不可替代。</p>
<p>而我属于这也安排做做，那也安排搞搞，原本这周还要给另外一个部门做官网的，好在和产品熟一点，我就推了，幸好没接这种事情，因为之前就大概了解他们部门做事很喜欢变来变去，并且说是做官网，到现在了设计稿都还在重新设计，啥都没确定好就说同步开发了，这里面成本太大了，不论是沟通还是时间上，做好这件事是应该的，没做好就寄。</p>
<p>说到 AI 这块，确实也有小团队做了这件事，估计这个月月底会上线，和 copilot 差不多，其实也就是调用了 openai，套了壳。</p>
<p>接下来是这周的一些输出与输入：</p>
<h3 id="视频稿件" tabindex="-1">视频稿件 </h3>
<CustomLink title='【编程】一起看看 Vercel 新发布动态，他们五一期间发布了啥？| 前端开发体验 DX' href='https://www.bilibili.com/video/BV1Uh411V7jC/' desc='Vercel 新发布动态'/><CustomLink title='【编程】24 分钟，带你了解 Next.js 13.4 | App Router | Turbopack | Server Actions' href='https://www.bilibili.com/video/BV1Ca4y1g7mM/' desc='解读 Next.js 13.4 | App Router | Turbopack | Server Actions'/><h3 id="英语学习" tabindex="-1">英语学习 </h3>
<CustomLink title='從零開始自學也能學會英文或是 ￼ 日文的五個步驟/ Comprehensible Input/我推薦的英文 YouTube 頻道在說明區' href='https://www.youtube.com/watch?v=59QlHqVOCKw&t=603s'/><CustomLink title='watch this if you feel like a failure' href='https://www.youtube.com/watch?v=5T3GY8PSiSI'/><CustomLink title='【双语字幕】台湾大学史嘉琳教授英语语音学（含发音练习）一，第三集：声道和调音器官' href='https://www.youtube.com/watch?v=Q2BlOUKMfq8&t=2425s'/><p>很喜欢史嘉琳教授的语音学课程，目前学到第三课了，继续努力</p>
<h3 id="阅读" tabindex="-1">阅读 </h3>
<p>持续阅读《趁着年轻，我偏要勉强》，大概看了 1/3 了，喜欢通过阅读，开拓视野，了解别人的生活与心路历程，读到出国留学时期的一些经历，了解了别人眼中的世界。</p>
<p>最近也看完了《漫长的季节》，部分情节也让我想到了这本书里所介绍的，这部剧很值得一个奖。</p>
<p>本周就大概到此了，烦心事、麻烦事都在昨天，昨天都已过去，期待更好的明天，加油！</p>
<h2 id="第三周" tabindex="-1">第三周 </h2>
<p>本周实际产出并不是很多，主要是回答了一些问题，可以翻阅查看。</p>
<p>另外，本周把之前在读的书读到一半了。</p>
<p>这周感觉缺少一点写代码的动力，不过这两天看了 antfu 的 github 通知管理视频：</p>
<CustomLink title='How I manage GitHub Notifications - Anthony Fu' href='https://www.youtube.com/watch?v=gu-0b6KCf80'/><p>感觉看完又有动力写代码了，也许就是被“高能量”的人所影响，接下来会用 Next.js 来做一个 twitter 的 clone，相关技术是 T3 Stack + NextAuth + Supabase + Prisma，仓库也建好了：</p>
<CustomLink title='Twitter clone built with T3 Stack + NextAuth + Supabase + Prisma（todo）' href='https://github.com/chonext/twitter-clone'/><p>目前还是私有的，之前有邀请过 chonext 组织的可以直接看，想加入的也可以联系我我邀请加入即可，后续做完会打算开源一下。</p>
<p>有个具体的项目去做，遇到问题去解决问题，同时也涉及全栈这块，感觉还是有挺多东西可以学到的。</p>
<p>参考学习的仓库地址也贴一下，如果你也想自己学习，可以参考一下：</p>
<CustomLink title='Build and Deploy: TWITTER clone with React, Tailwind, Next, Prisma, Mongo, NextAuth & Vercel (2023)' href='https://github.com/AntonioErdeljac/twitter-clone'/><CustomLink title='Twitter clone built with T3 Stack + NextAuth + Supabase + Prisma' href='https://github.com/AlandSleman/t3-twitter-clone'/><p>也看了这篇文章：</p>
<CustomLink title='5 New Hooks in React 18' href='https://betterprogramming.pub/5-new-hooks-in-react-18-300aa713cefe'/><p>感觉目前这些 hook 还用不到，可能也不会单独用，而是用社区优秀的 hooks 集合库了。</p>
<p>下周见。</p>
<h2 id="第四周" tabindex="-1">第四周 </h2>
<p>这是五月最后一周打卡，因为今天一直忙着拍摄 b 站视频，所以内容一直没准备好。</p>
<p>✅ 最近一直在做前端全栈类项目，如果前后端都是使用 ts 的话，那么 tRPC 这东西很有用，为了将这个视频做好，还是做了很多前期准备，视频如下：</p>
<CustomLink title='【编程】tRPC 是什么？与 REST 和 GraphQL 有啥关系 | 你可能不再需要传统的 API！' href='https://www.bilibili.com/video/BV17z4y1z7xa/'/><p>✅ 读完了之前一直在提的《趁着年轻，我偏要勉强》，读完之后看到了《活着》那本书我一直搁着没看，没想到一读就停不下来，也在这周读完了。</p>
<p>下周一有部门聚餐也有办公室搬迁，所以明天也算是久违的正当摸鱼了，最近几天会把视频内容写好文字稿和大家分享。</p>
<p>视频后续也说了会用 express 以及 Next.js 实现，并且会引入前端鉴权之类的，比如用邮箱登录、GitHub 授权登录、云端数据库等，各位晚安好梦，准备迎接 6 月！</p>]]></content:encoded>
            <author>Choi Yang</author>
        </item>
        <item>
            <title><![CDATA[ChoDocs 的 VitePress 插件折腾记录 ]]></title>
            <link>https://chodocs.cn//program/vitepress-plugin/</link>
            <guid isPermaLink="false">https://chodocs.cn//program/vitepress-plugin/</guid>
            <pubDate>Tue, 18 Apr 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[ChoDocs 的 VitePress 插件折腾记录  如果你也想拥有和 chodocs.cn 一样的 vitepress 文档效果，不妨从这篇文章看起。 事先声明：在自己配置之前查看一下是否版本和我目前是一致的，一般而言版本号相差个位数影响不大，如果相差较大建议升级一下 vitepress 版本并结合官方文档修改。 另：本文档目前是开源的，一些改动可能会在未来的更新中被修改。其次，因为个人时间有]]></description>
            <content:encoded><![CDATA[<p>如果你也想拥有和 <a href="https://chodocs.cn/" target="_blank" rel="noreferrer">chodocs.cn</a> 一样的 vitepress 文档效果，不妨从这篇文章看起。</p>
<blockquote>
<p>事先声明：在自己配置之前查看一下是否版本和我目前是一致的，一般而言版本号相差个位数影响不大，如果相差较大建议升级一下 vitepress 版本并结合官方文档修改。</p>
</blockquote>
<blockquote>
<p>另：本文档目前是开源的，一些改动可能会在未来的更新中被修改。其次，因为个人时间有限，如果你发现了一些问题或者相关配置文档难以理解不清楚怎么配置，欢迎提 issue 或者 pr。代码其实已经开源了，我想爱折腾的各位根据文件引用关系即可完成 cv 操作。</p>
</blockquote>
<h2 id="相关说明" tabindex="-1">相关说明 </h2>
<p>对于下文中的一些 npm 包，如果你有时间可以来提提 pr 写上安装代码，方便自己也帮助他人，我会非常感谢的。</p>
<blockquote>
<p><strong>TODO</strong></p>
<ul>
<li>一些 npm 包的安装代码</li>
<li>详细说明</li>
</ul>
</blockquote>
<h2 id="配置-vite" tabindex="-1">配置 Vite </h2>
<p>核心文件源代码在这里:</p>
<p><a href="https://github.com/chodocs/chodocs/blob/main/docs/vite.config.ts" target="_blank" rel="noreferrer">vite.config.ts 源码</a></p>
<h3 id="示例代码" tabindex="-1">示例代码 </h3>
<p>以下是示例代码，也许是过去的某个版本的，并非一定是最新的，最新代码请查看上述源代码。</p>
<p>文件路径 <code>docs/vite.config.ts</code>，如下：</p>
<blockquote>
<p>遇到提示说需要安装的包，可参考 chodocs 的 <code>package.json</code> 文件中的 <code>devDependencies</code> 部分，按需安装即可。</p>
</blockquote>
<div class="language-ts line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { resolve } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'node:path'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> UnoCSS </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'unocss/vite'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> IconsResolver </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'unplugin-icons/resolver'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Icons </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'unplugin-icons/vite'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Components </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'unplugin-vue-components/vite'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { defineConfig } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'vite'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { MarkdownTransform } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> './.vitepress/plugins/markdownTransform'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> default</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> defineConfig</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    server: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      hmr: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        overlay: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      fs: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        allow: [</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">resolve</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(__dirname, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'..'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    plugins: [</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">      // custom</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">      MarkdownTransform</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(),</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">      // plugins</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">      Components</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        dirs: </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">resolve</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(__dirname, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'.vitepress/theme/components'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        include: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/</span><span style="--shiki-light:#22863A;--shiki-light-font-weight:bold;--shiki-dark:#85E89D;--shiki-dark-font-weight:bold">\.</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">vue</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /</span><span style="--shiki-light:#22863A;--shiki-light-font-weight:bold;--shiki-dark:#85E89D;--shiki-dark-font-weight:bold">\.</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">vue</span><span style="--shiki-light:#22863A;--shiki-light-font-weight:bold;--shiki-dark:#85E89D;--shiki-dark-font-weight:bold">\?</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">vue</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> /</span><span style="--shiki-light:#22863A;--shiki-light-font-weight:bold;--shiki-dark:#85E89D;--shiki-dark-font-weight:bold">\.</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">md</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        resolvers: [</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">          IconsResolver</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            componentPrefix: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">''</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          }),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        ],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        dts: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'./.vitepress/components.d.ts'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        transformer: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'vue3'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      }),</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">      Icons</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        compiler: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'vue3'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        autoInstall: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        defaultStyle: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'display: inline-block'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      }),</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">      UnoCSS</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    ],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br></div></div><h2 id="配置-unocss" tabindex="-1">配置 UnoCSS </h2>
<p>本文档几乎 95% 以上的样式都是使用 UnoCSS，在上述配置文件中已经配置好了，如果你有特殊样式配置，可以参考项目根目录下的 <code>unocss.config.ts</code>，可进行相关修改。</p>
<p>目前 UnoCSS 官网上线了，地址在：</p>
<p><a href="https://unocss.dev/" target="_blank" rel="noreferrer">UnoCSS 官网地址</a></p>
<p>可查阅官方文档使用。</p>
<h2 id="文档显示页面信息和底部贡献者" tabindex="-1">文档显示页面信息和底部贡献者 </h2>
<p>上述 Vite 配置文件中，我们看到了有一个 <code>MarkdownTransform</code> 函数，这个函数是用来处理 markdown 文件的，主要是为了在每个文档页面的底部显示贡献者信息和版权信息，以及在每个文档页面的顶部显示阅读时间和字数。</p>
<p>核心文件源代码在这里，可以点击查看:</p>
<p><a href="https://github.com/chodocs/chodocs/blob/main/docs/.vitepress/plugins/markdownTransform.ts" target="_blank" rel="noreferrer">markdownTransform.ts</a></p>
<h3 id="示例代码-1" tabindex="-1">示例代码 </h3>
<p>以下是示例代码，也许是过去的某个版本的，并非一定是最新的，最新代码请查看上述源代码。</p>
<p>文件路径 <code>docs/.vitepress/plugins/markdownTransform.ts</code>，如下：</p>
<div class="language-ts line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { Plugin } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'vite'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { replacer } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> '../../../scripts/utils'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { getReadingTime } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> './../theme/utils'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> MarkdownTransform</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Plugin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    name: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'chodocs-md-transform'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    enforce: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'pre'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    async</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> transform</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">code</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">!</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">id.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">match</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/</span><span style="--shiki-light:#22863A;--shiki-light-font-weight:bold;--shiki-dark:#85E89D;--shiki-dark-font-weight:bold">\.</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">md</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">\b</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> null</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">      // convert links to relative</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      code </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> code.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">replace</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">https</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">?</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">:</span><span style="--shiki-light:#22863A;--shiki-light-font-weight:bold;--shiki-dark:#85E89D;--shiki-dark-font-weight:bold">\/\/</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">chodocs</span><span style="--shiki-light:#22863A;--shiki-light-font-weight:bold;--shiki-dark:#85E89D;--shiki-dark-font-weight:bold">\.</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">cn</span><span style="--shiki-light:#22863A;--shiki-light-font-weight:bold;--shiki-dark:#85E89D;--shiki-dark-font-weight:bold">\/</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">g</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'/'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      const</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">_name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">i</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> id.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">split</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'/'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">).</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">slice</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">      // cut index.md</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (_name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">===</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'docs'</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> &#x26;&#x26;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">===</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'index.md'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> code</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      const</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">footer</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> getDocsMarkdown</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      code </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> replacer</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(code, footer, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'FOOTER'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'tail'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      const</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">readTime</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">words</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> getReadingTime</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(code)</span></span>
<span class="line highlighted"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      code </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> code.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">replace</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">        /</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">(#</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\s.</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\n</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">        `$1</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\n\n</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">&#x3C;PageInfo readTime="${</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">readTime</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">}" words="${</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">words</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">}"/></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\n</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">`</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      )</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> code</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line highlighted"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> getDocsMarkdown</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">() {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> ContributorsSection</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> `## Contributors</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  &#x3C;Contributors/>`</span></span>
<span class="line highlighted"><wbr></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> CopyRightSection</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> `</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  &#x3C;CopyRight/>`</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> footer</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> `${</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ContributorsSection</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">}</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\n</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">${</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">CopyRightSection</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">}</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">\n</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">`</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    footer,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br></div></div><p>这里其实就是一个 Vite 的插件，在 <code>docs/vite.config.ts</code> 中引入了这个插件。</p>
<p>上述代码我高亮了三行代码，你会发现这里其实就是引入了 Vue 组件，为什么没见到导入呢？</p>
<p>因为我们在上述的「<strong>配置 Vite</strong>」 代码中引入了 <code>unplugin-vue-components/vite</code>，如下：</p>
<div class="language-ts line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Components </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'unplugin-vue-components/vite'</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p>这个插件的作用就是自动导入 Vue 组件，所以我们在上述代码中直接使用了 <code>Contributors</code> 和 <code>CopyRight</code> 这两个组件，而不需要导入。</p>
<h3 id="contributors-组件" tabindex="-1">Contributors 组件 </h3>
<p>这个组件是用来显示贡献者信息的，核心文件源代码在这里：</p>
<p><a href="https://github.com/chodocs/chodocs/blob/main/docs/.vitepress/theme/components/Contributors.vue" target="_blank" rel="noreferrer">Contributors.vue</a></p>
<h3 id="copyright-组件" tabindex="-1">CopyRight 组件 </h3>
<p>这个组件是用来显示版权信息的，核心文件源代码在这里：</p>
<p><a href="https://github.com/chodocs/chodocs/blob/main/docs/.vitepress/theme/components/CopyRight.vue" target="_blank" rel="noreferrer">CopyRight.vue</a></p>
<h2 id="文档页面的顶部信息组件" tabindex="-1">文档页面的顶部信息组件 </h2>
<p>这个组件用来显示阅读时间和字数等，核心文件源代码在这里：</p>
<p><a href="https://github.com/chodocs/chodocs/blob/main/docs/.vitepress/theme/components/PageInfo.vue" target="_blank" rel="noreferrer">PageInfo.vue</a></p>
<h2 id="文章阅读数统计" tabindex="-1">文章阅读数统计 </h2>
<p>在上述的文档页面顶部信息组件里面其实已经看到了，如下代码所示：</p>
<div class="language-html line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">html</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">div</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> class</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"flex gap-[4px] items-center"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  &#x3C;</span><span style="--shiki-light:#B31D28;--shiki-light-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic">ph:eye-fill</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> /></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  阅读量:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">span</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"busuanzi_container_page_pv"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">span</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"busuanzi_value_page_pv"</span><span style="--shiki-light:#B31D28;--shiki-light-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic"> /</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  &#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">span</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">div</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br></div></div><p>我这里使用的是 <code>busuanzi</code>，不过有时候会出现不稳定情况，即不显示阅读数据，小问题。</p>
<p>我们需要在 <code>docs/.vitepress/theme/index.ts</code> 路径下引入 <code>busuanzi</code>，如下：</p>
<div class="language-ts line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// xxx</span></span>
<span class="line highlighted"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> busuanzi </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'busuanzi.pure.js'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> theme</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Theme</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  ...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DefaultTheme,</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">  enhanceApp</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({ </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">router</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> EnhanceAppContext</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    // ...</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (inBrowser) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      router.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">onAfterRouteChanged</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">to</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line highlighted"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        busuanzi.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">fetch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  },</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  // xxx</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> default</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> theme</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br></div></div><p>这样也是希望能够在路由切换的时候重新获取阅读数据。</p>
<h2 id="文档内图片放大镜-🔍-效果" tabindex="-1">文档内图片放大镜 🔍 效果 </h2>
<p>核心插件使用的是 <code>mediumZoom</code>，具体引入方式同样也是在 <code>docs/.vitepress/theme/index.ts</code>下，如下所示：</p>
<div class="language-ts line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// xxx</span></span>
<span class="line highlighted"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> mediumZoom </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'medium-zoom'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> theme</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Theme</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  ...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">DefaultTheme,</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">  enhanceApp</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({ </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">router</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> EnhanceAppContext</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    // ...</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  },</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">  setup</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">() {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> route</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> useRoute</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line highlighted"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> initZoom</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line highlighted"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">      mediumZoom</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'.main img'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, { background: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'var(--vp-c-bg)'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> })</span></span>
<span class="line highlighted"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line highlighted"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    onMounted</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line highlighted"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">      initZoom</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line highlighted"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    })</span></span>
<span class="line highlighted"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    watch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span></span>
<span class="line highlighted"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> route.path,</span></span>
<span class="line highlighted"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> nextTick</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> initZoom</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">())</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    )</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> default</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> theme</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br></div></div><h2 id="文档支持-pwa" tabindex="-1">文档支持 pwa </h2>
<p>pwa 使用的是 <code>vite-plugin-pwa</code>，具体引入方式可见这里:</p>
<p><a href="https://github.com/chodocs/chodocs/blob/main/docs/.vitepress/theme/plugins/pwa.ts" target="_blank" rel="noreferrer">plugins/pwa.ts</a></p>
<div class="language-ts line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { VitePWAOptions } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'vite-plugin-pwa'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> fg </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'fast-glob'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { resolve } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'pathe'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  description,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  githubSourceContentRegex,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  googleFontRegex,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  googleStaticFontRegex,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  jsdelivrCDNRegex,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  name,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">} </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> '../meta'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">/**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * Vite Plugin PWA uses Workbox  library to build the service worker</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * can find more information on Workbox section.</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">@see</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> https://vite-plugin-pwa.netlify.app/</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> */</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> pwa</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Partial</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">VitePWAOptions</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">> </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  outDir: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'../dist'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  registerType: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'autoUpdate'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  // include all static assets under public/</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  includeAssets: fg.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sync</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'**/*.{png,svg,gif,ico,txt}'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    cwd: </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">resolve</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(__dirname, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'../../public'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  manifest: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    id: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'/'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    name,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    short_name: name,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    description,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    theme_color: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'#06f'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    icons: [</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        src: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'/images/icons/apple-touch-120x120.png'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        sizes: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'120x120'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        type: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'image/png'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        src: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'/images/icons/android-chrome-192x192.png'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        sizes: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'192x192'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        type: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'image/png'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        src: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'/images/icons/android-chrome-512x512.png'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        sizes: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'512x512'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        type: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'image/png'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    ],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  workbox: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    navigateFallbackDenylist: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">^</span><span style="--shiki-light:#22863A;--shiki-light-font-weight:bold;--shiki-dark:#85E89D;--shiki-dark-font-weight:bold">\/</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">new</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">$</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    globPatterns: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'**/*.{js,css,webp,png,svg,gif,ico,woff2}'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    navigateFallback: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">null</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    runtimeCaching: [</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        urlPattern: googleFontRegex,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        handler: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'CacheFirst'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        options: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          cacheName: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'google-font-style-cache'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          expiration: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            maxEntries: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            maxAgeSeconds: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">60</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> *</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 60</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> *</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 24</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> *</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 365</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// &#x3C;== 365 days</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          cacheableResponse: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            statuses: [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">200</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        urlPattern: googleStaticFontRegex,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        handler: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'CacheFirst'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        options: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          cacheName: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'google-fonts-cache'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          expiration: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            maxEntries: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            maxAgeSeconds: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">60</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> *</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 60</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> *</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 24</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> *</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 365</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// &#x3C;== 365 days</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          cacheableResponse: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            statuses: [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">200</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        urlPattern: jsdelivrCDNRegex,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        handler: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'CacheFirst'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        options: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          cacheName: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'jsdelivr-cdn-cache'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          expiration: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            maxEntries: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            maxAgeSeconds: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">60</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> *</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 60</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> *</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 24</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> *</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 365</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// &#x3C;== 365 days</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          cacheableResponse: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            statuses: [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">200</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        urlPattern: githubSourceContentRegex,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        handler: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'CacheFirst'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        options: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          cacheName: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'githubusercontent-images-cache'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          expiration: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            maxEntries: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            maxAgeSeconds: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">60</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> *</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 60</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> *</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 24</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> *</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 365</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// &#x3C;== 365 days</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          cacheableResponse: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            statuses: [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">200</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    ],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">53</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br><span class="line-number">56</span><br><span class="line-number">57</span><br><span class="line-number">58</span><br><span class="line-number">59</span><br><span class="line-number">60</span><br><span class="line-number">61</span><br><span class="line-number">62</span><br><span class="line-number">63</span><br><span class="line-number">64</span><br><span class="line-number">65</span><br><span class="line-number">66</span><br><span class="line-number">67</span><br><span class="line-number">68</span><br><span class="line-number">69</span><br><span class="line-number">70</span><br><span class="line-number">71</span><br><span class="line-number">72</span><br><span class="line-number">73</span><br><span class="line-number">74</span><br><span class="line-number">75</span><br><span class="line-number">76</span><br><span class="line-number">77</span><br><span class="line-number">78</span><br><span class="line-number">79</span><br><span class="line-number">80</span><br><span class="line-number">81</span><br><span class="line-number">82</span><br><span class="line-number">83</span><br><span class="line-number">84</span><br><span class="line-number">85</span><br><span class="line-number">86</span><br><span class="line-number">87</span><br><span class="line-number">88</span><br><span class="line-number">89</span><br><span class="line-number">90</span><br><span class="line-number">91</span><br><span class="line-number">92</span><br><span class="line-number">93</span><br><span class="line-number">94</span><br><span class="line-number">95</span><br><span class="line-number">96</span><br><span class="line-number">97</span><br><span class="line-number">98</span><br><span class="line-number">99</span><br><span class="line-number">100</span><br><span class="line-number">101</span><br><span class="line-number">102</span><br><span class="line-number">103</span><br><span class="line-number">104</span><br><span class="line-number">105</span><br><span class="line-number">106</span><br><span class="line-number">107</span><br><span class="line-number">108</span><br><span class="line-number">109</span><br><span class="line-number">110</span><br><span class="line-number">111</span><br><span class="line-number">112</span><br></div></div><p>基本上你只需要修改部分文件以及描述信息即可，文档内通用。</p>
<h2 id="文档支持-rss-订阅" tabindex="-1">文档支持 rss 订阅 </h2>
<p>这个是前不久做好的功能，核心是使用的 <code>feed</code> 库生成的，具体效果可见 <code>https://chodocs.cn/feed.xml</code>。</p>
<p>核心代码可见这里:</p>
<p><a href="https://github.com/chodocs/chodocs/blob/main/docs/.vitepress/plugins/genFeed.ts" target="_blank" rel="noreferrer">genFeed.ts</a></p>
<p>以下是示例代码：</p>
<div class="language-ts line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { SiteConfig } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'vitepress'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { writeFileSync } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'node:fs'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> path </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'node:path'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { Feed } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'feed'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { createContentLoader } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'vitepress'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { site </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">as</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> baseUrl, description, name } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> '../meta'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> reName</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">!</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">name)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'Choi Yang'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">===</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'Choi Yang'</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ?</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'Chocolate1999'</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> :</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> name</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> getGithubLink</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> `https://github.com/${</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">reName</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">name</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">}`</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> genFeed</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">config</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> SiteConfig</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> feed</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Feed</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    title: name,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    description,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    id: baseUrl,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    link: baseUrl,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    language: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'zh-CN'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    image: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'https://chodocs.cn/chodocs-logo.svg'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    favicon: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">`${</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">baseUrl</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">}/favicon.ico`</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    copyright: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'Copyright (c) 2022-present, Chocolate and ChoDocs contributors'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  })</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> posts</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> createContentLoader</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'**/*.md'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    excerpt: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    render: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }).</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">load</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  posts.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sort</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">a</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">b</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      +new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Date</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(b.frontmatter?.date </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">as</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      -</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> +new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Date</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a.frontmatter?.date </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">as</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  )</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">url</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">frontmatter</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">html</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">of</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> posts) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> postTitle </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> '无题'</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    postTitle </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> html?.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">match</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">&#x3C;h1 id=(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">.</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">)>(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">.</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*?</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">)&#x3C;a </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">.</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*?</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">></span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)?.[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">||</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> postTitle</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    feed.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">addItem</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      title: frontmatter?.title </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">||</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> postTitle,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      id: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">`${</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">baseUrl</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">}${</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">url</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">slice</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">}`</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      link: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">`${</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">baseUrl</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">}${</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">url</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">slice</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">}`</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      guid: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">`${</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">baseUrl</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">}${</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">url</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">slice</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">)</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">}`</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      description: html,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      content: html,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      author: [</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          name: frontmatter?.author </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">||</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'Choi Yang'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          link: frontmatter?.author</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            ?</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> getGithubLink</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(frontmatter?.author)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            :</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> undefined</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      ],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      date: frontmatter?.date </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">||</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Date</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'2021-07-01'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    })</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">  writeFileSync</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(path.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">join</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(config.outDir, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'feed.xml'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">), feed.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">rss2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">())</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">53</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br><span class="line-number">56</span><br><span class="line-number">57</span><br><span class="line-number">58</span><br><span class="line-number">59</span><br><span class="line-number">60</span><br><span class="line-number">61</span><br><span class="line-number">62</span><br><span class="line-number">63</span><br><span class="line-number">64</span><br></div></div><p>核心思路是读取文件，根据文件内容生成 <code>feed</code>，然后写入到 <code>feed.xml</code> 文件中，关键是相关字段一定要完整，缺一不可，不然生成的 xml 文件能显示但是无法订阅。</p>
<h2 id="谷歌分析和百度统计" tabindex="-1">谷歌分析和百度统计 </h2>
<p>这个主要是观察网站数据使用，当然 ChoDocs 之后还会集成 umami，以下提供一下对应的文件路径：</p>
<ul>
<li>谷歌分析：<code>docs/.vitepress/theme/plugins/googleAnalytics.ts</code></li>
<li>百度统计：<code>docs/.vitepress/theme/plugins/baidutongji.ts</code></li>
</ul>
<h2 id="结语" tabindex="-1">结语 </h2>
<p>目前文档还在不断完善，主要还是提供一点思路，如果你在配置过程中遇到了问题，还请提相关 issue，如果解决了也欢迎来提交 pr，参与这个项目在首页会有贡献者头像展示。</p>]]></content:encoded>
            <author>Choi Yang</author>
        </item>
        <item>
            <title><![CDATA[vue3-management-system ]]></title>
            <link>https://chodocs.cn//vuejs/vue3-management-system/</link>
            <guid isPermaLink="false">https://chodocs.cn//vuejs/vue3-management-system/</guid>
            <pubDate>Sat, 15 Apr 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[vue3-management-system  项目已在 GitHub 开源，基于 Vue3 全家桶开发的后台管理系统，适用于自学 Vue3 的同学，以及外包项目快速交付。 线上地址点这里 项目仓库求 star ⭐ 技术栈  该项目使用技术栈如下： Vue 3：前端框架 TypeScript：语言 Vite：打包工具 Pinia：状态管理 Vue Router：路由管理 Element Plus：]]></description>
            <content:encoded><![CDATA[<p>项目已在 <code>GitHub</code> 开源，基于 <code>Vue3</code> 全家桶开发的后台管理系统，适用于自学 <code>Vue3</code> 的同学，以及外包项目快速交付。</p>
<p><a href="https://vue3-management-system.netlify.app" target="_blank" rel="noreferrer">线上地址点这里</a></p>
<p><a href="https://github.com/chovue/vue3-management-system" target="_blank" rel="noreferrer">项目仓库求 <code>star</code> ⭐ </a></p>
<h2 id="技术栈" tabindex="-1">技术栈 </h2>
<p>该项目使用技术栈如下：</p>
<ul>
<li><code>Vue 3</code>：前端框架</li>
<li><code>TypeScript</code>：语言</li>
<li><code>Vite</code>：打包工具</li>
<li><code>Pinia</code>：状态管理</li>
<li><code>Vue Router</code>：路由管理</li>
<li><code>Element Plus</code>：<code>UI</code> 组件库</li>
<li><code>vxe-table</code>：表格组件库</li>
<li><code>Echarts</code>：图表</li>
<li><code>Axios</code>：网络请求</li>
</ul>
<h2 id="项目截图" tabindex="-1">项目截图 </h2>
<p><strong>登录页：</strong></p>
<p><img src="https://user-images.githubusercontent.com/51811652/227832497-7bc46908-d818-48ce-8ecd-bac57c3d9855.png" alt="image"></p>
<p><strong>首页：</strong></p>
<p><img src="https://user-images.githubusercontent.com/51811652/227833231-3b91552a-618f-41de-bbc1-fc6f68177a7d.png" alt="image"></p>
<p><strong>表格：</strong></p>
<p><img src="https://user-images.githubusercontent.com/51811652/227835053-4d680143-b165-4bbf-9f04-97c4a5422635.png" alt="image"></p>
<h2 id="安装" tabindex="-1">安装 </h2>
<div class="language- line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span># 克隆项目</span></span>
<span class="line"><span>git clone https://github.com/HearLing/vue3-management-system.git</span></span>
<span class="line"><span></span></span>
<span class="line"><span># 进入项目目录</span></span>
<span class="line"><span>cd vue3-management-system</span></span>
<span class="line"><span></span></span>
<span class="line"><span># 安装依赖</span></span>
<span class="line"><span>npm install</span></span>
<span class="line"><span></span></span>
<span class="line"><span># 本地开发，启动服务</span></span>
<span class="line"><span>npm run dev</span></span>
<span class="line"><span></span></span>
<span class="line"><span># 打包构建</span></span>
<span class="line"><span>npm run build</span></span>
<span class="line"><span></span></span>
<span class="line"><span># ESLint修复</span></span>
<span class="line"><span>npm run lint</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br></div></div><h2 id="vue3-基础教程" tabindex="-1">Vue3 基础教程 </h2>
<ul>
<li><a href="https://articles.zsxq.com/id_o9g577gfmczj.html" target="_blank" rel="noreferrer">【Vue3 基础】01.初识 Vue</a></li>
<li><a href="https://articles.zsxq.com/id_6id2z9me4o9n.html" target="_blank" rel="noreferrer">【Vue3 基础】02.声明式渲染</a></li>
<li><a href="https://articles.zsxq.com/id_wpxkwewbz0gw.html" target="_blank" rel="noreferrer">【Vue3 基础】03.模板语法</a></li>
<li><a href="https://articles.zsxq.com/id_rpottcluq6m1.html" target="_blank" rel="noreferrer">【Vue3 基础】04.响应式 API</a></li>
<li><a href="https://articles.zsxq.com/id_v8bomv95s5x6.html" target="_blank" rel="noreferrer">【Vue3 基础】05.组件化</a></li>
<li><a href="https://articles.zsxq.com/id_2kc09gngm90j.html" target="_blank" rel="noreferrer">【Vue3 基础加餐篇】01.Ref 解包场景</a></li>
<li><a href="https://articles.zsxq.com/id_dn5u0sr8j15k.html" target="_blank" rel="noreferrer">【Vue3 基础加餐篇】02.key 的作用源码解析</a></li>
<li><a href="https://articles.zsxq.com/id_x8lsr3vt8jjk.html" target="_blank" rel="noreferrer">【Vue3 基础加餐篇】03.源码解析响应式原理</a></li>
</ul>
<h2 id="typescript-入门教程" tabindex="-1">TypeScript 入门教程 </h2>
<ul>
<li><a href="https://articles.zsxq.com/id_w1w4owfll680.html" target="_blank" rel="noreferrer">【TypeScript 入门】01.初识 TypeScript</a></li>
<li><a href="https://articles.zsxq.com/id_awwmialgwnvl.html" target="_blank" rel="noreferrer">【TypeScript 入门】02.类型推断、类型拓宽与缩小</a></li>
<li><a href="https://articles.zsxq.com/id_g6owsianwz4g.html" target="_blank" rel="noreferrer">【TypeScript 入门】03.接口类型和类型别名</a></li>
<li><a href="https://articles.zsxq.com/id_l60bjdtj1c7m.html" target="_blank" rel="noreferrer">【TypeScript 入门】04.高级类型</a></li>
<li><a href="https://articles.zsxq.com/id_h85tsi5h79x7.html" target="_blank" rel="noreferrer">【TypeScript 入门】05.枚举类型</a></li>
<li><a href="https://articles.zsxq.com/id_wjwkewi1suk7.html" target="_blank" rel="noreferrer">【TypeScript 入门】06.泛型</a></li>
</ul>
<h2 id="项目实战教程" tabindex="-1">项目实战教程 </h2>
<ul>
<li><a href="https://articles.zsxq.com/id_lkdv1kbnj76w.html" target="_blank" rel="noreferrer">【实战】01.项目初始化</a></li>
<li><a href="https://articles.zsxq.com/id_431m72ne2aws.html" target="_blank" rel="noreferrer">【实战】02.Vue Router 入门</a></li>
<li><a href="https://articles.zsxq.com/id_jkwmwst6xpvg.html" target="_blank" rel="noreferrer">【实战】03.使用 Vue-router 进行路由管理</a></li>
<li><a href="https://articles.zsxq.com/id_xwq70ghehdi6.html" target="_blank" rel="noreferrer">【实战】04.Axios 入门</a></li>
<li><a href="https://articles.zsxq.com/id_w5u1rpz5msfq.html" target="_blank" rel="noreferrer">【实战】05.Axios 封装与使用</a></li>
<li><a href="https://articles.zsxq.com/id_o76w73rd7eba.html" target="_blank" rel="noreferrer">【实战】06.Apifox 进行 Mock 数据模拟</a></li>
<li><a href="https://articles.zsxq.com/id_xj202bsnoh7l.html" target="_blank" rel="noreferrer">【实战】07.Echart 数据可视化</a></li>
<li><a href="https://articles.zsxq.com/id_4xxpb5wpbhk7.html" target="_blank" rel="noreferrer">【实战】08.Pinia 状态管理</a></li>
<li><a href="https://articles.zsxq.com/id_wbewaqq34vw2.html" target="_blank" rel="noreferrer">【实战】09.vxe-table 列表的增删改查</a></li>
<li><a href="https://articles.zsxq.com/id_wo7bpjafed1w.html" target="_blank" rel="noreferrer">【实战加餐 1】前端项目快速部署上线，无需一分钱</a></li>
<li>...</li>
</ul>
<h2 id="参考资料" tabindex="-1">参考资料 </h2>
<ul>
<li><a href="https://preview.pro.ant.design/dashboard/analysis" target="_blank" rel="noreferrer">参考项目</a></li>
<li><a href="https://cn.vuejs.org" target="_blank" rel="noreferrer">Vue3 中文文档</a></li>
<li><a href="https://router.vuejs.org/zh/" target="_blank" rel="noreferrer">Vue Router 中文文档</a></li>
<li><a href="https://pinia.vuejs.org/zh/" target="_blank" rel="noreferrer">Pinia 中文文档</a></li>
<li><a href="https://element-plus.gitee.io/zh-CN/guide/quickstart.html" target="_blank" rel="noreferrer">Element Plus 中文文档</a></li>
</ul>]]></content:encoded>
            <author>HearLing</author>
        </item>
        <item>
            <title><![CDATA[给你的 Next.js 项目优雅地添加 sitemap ]]></title>
            <link>https://chodocs.cn//nextjs/sitemap/</link>
            <guid isPermaLink="false">https://chodocs.cn//nextjs/sitemap/</guid>
            <pubDate>Thu, 06 Apr 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[给你的 Next.js 项目优雅地添加 sitemap  好用的库 next-sitemap  关于 next.js 生成 sitemap 有一个比较好用的库，名字叫做 next-sitemap，他的描述信息如下： Sitemap generator for next.js. Generate sitemap(s) and robots.txt for all static/pre-rendere]]></description>
            <content:encoded><![CDATA[<h2 id="好用的库-next-sitemap" tabindex="-1">好用的库 next-sitemap </h2>
<p>关于 next.js 生成 sitemap 有一个比较好用的库，名字叫做 <code>next-sitemap</code>，他的描述信息如下：</p>
<blockquote>
<p>Sitemap generator for next.js. Generate sitemap(s) and robots.txt for all static/pre-rendered/dynamic/server-side pages.</p>
</blockquote>
<p>这可以让我们在项目中生成 sitemap 文件，让搜索引擎更好地爬取我们的网站，从而提高网站的 SEO。</p>
<p>基础的安装教程大家可以参考 <a href="https://www.npmjs.com/package/next-sitemap" target="_blank" rel="noreferrer">next-sitemap</a> 的官方文档，这里就不再赘述了。</p>
<h2 id="开箱使用" tabindex="-1">开箱使用 </h2>
<p>不过我看了一些开源项目，比如之前我一直在用的 next.js 启动模版，<a href="https://github.com/theodorusclarence/ts-nextjs-tailwind-starter" target="_blank" rel="noreferrer">🔋 Next.js + Tailwind CSS + TypeScript starter and boilerplate packed with useful development features</a></p>
<p>来看项目源码查看对应的 <code>next-sitemap.config.js</code> 文件，发现他们的配置文件是这样的：</p>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">/**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">@type</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> {import('next-sitemap').IConfig}</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">@see</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> https://github.com/iamvishnusankar/next-sitemap#readme</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> */</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">exports</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  siteUrl: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'https://chodocs.cn'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  generateRobotsTxt: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  robotsTxtOptions: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    policies: [{ userAgent: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'*'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, allow: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'/'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br></div></div><p>这时候通过 <code>build</code> 之后你会发现生成的 <code>sitemap</code> 文件是这样的：</p>
<p><img src="https://chodocs-1301295644.cos.accelerate.myqcloud.com/img/20230405214926.png" alt="默认情况生成的 sitemap 文件"></p>
<p>一般情况我们可能不需要那个 <code>sitemap-0.xml</code> 文件，然而生成的文件都放在了 <code>sitemap-0</code> 里面去了，而不是默认的 <code>sitemap.xml</code>。</p>
<blockquote>
<p>这里就以我之前用 Next.js 开发的一个博客项目为例看看吧。</p>
</blockquote>
<p><img src="https://chodocs-1301295644.cos.accelerate.myqcloud.com/img/202304061412792.png" alt=""></p>
<p>在国内一些站点收录这块最好还是直接提供 <code>sitemap.xml</code> 文件，因此本篇就来介绍一下如何优雅地给 Next.js 项目添加 <code>sitemap</code>，并且还能拓展同域名下但是不同项目里的 <code>sitemap</code>。</p>
<h2 id="修改配置取消生成-sitemap-0-xml" tabindex="-1">修改配置取消生成 sitemap-0.xml </h2>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">/**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">@type</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> {import('next-sitemap').IConfig}</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">@see</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> https://github.com/iamvishnusankar/next-sitemap#readme</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> */</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">exports</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  /** Without additional '/' on the end */</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  siteUrl: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'https://blog.yangchaoyi.vip'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  generateRobotsTxt: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  generateIndexSitemap: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  robotsTxtOptions: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    policies: [{ userAgent: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'*'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, allow: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'/'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br></div></div><p>这里我们只需要在配置文件里面添加 <code>generateIndexSitemap: false</code> 就可以了，这样就不会生成 <code>sitemap-0.xml</code> 文件了。</p>
<p><img src="https://chodocs-1301295644.cos.accelerate.myqcloud.com/img/202304061420122.png" alt=""></p>
<p>具体可查看原文档 <a href="https://github.com/iamvishnusankar/next-sitemap#index-sitemaps-optional" target="_blank" rel="noreferrer">Index sitemaps (Optional)</a></p>
<blockquote>
<p>📣 From next-sitemap v2.x onwards, sitemap.xml will be Index Sitemap. It will contain urls of all other generated sitemap endpoints.</p>
</blockquote>
<blockquote>
<p>Index sitemap generation can be turned off by setting generateIndexSitemap: false in next-sitemap config file. (This is useful for small/hobby sites which does not require an index sitemap) (Example: no-index-sitemaps)</p>
</blockquote>
<h2 id="如何拓展同域名下不同项目的-sitemap" tabindex="-1">如何拓展同域名下不同项目的 sitemap </h2>
<p>这个需求不知道是否你也会有，我来给大家举个例子，比如 <a href="https://coding.net/" target="_blank" rel="noreferrer">coding.net</a> 官网，也是使用 Next.js 开发的，但官网内也有挺多子页面，比如洞见博客，以及帮助文档之类的，这些其实并不都是由 Next.js 创建的，但是呢作为官网首页，根路径下的 <code>sitemap</code> 内容也需要将子项目中索引包含进去，提交一个地址来收录即可。</p>
<p><code>next-sitemap</code> 也考虑到了这点，具体可以查看 <a href="https://github.com/iamvishnusankar/next-sitemap#additional-paths-function" target="_blank" rel="noreferrer">Additional paths function</a> 这里，</p>
<details  class="details custom-block"><summary>查看示例代码</summary>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">/** </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">@type</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> {import('next-sitemap').IConfig}</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> */</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">exports</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">  additionalPaths</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">config</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> result</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> []</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    // required value only</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    result.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">push</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({ loc: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'/additional-page-1'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> })</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    // all possible values</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    result.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">push</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      loc: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'/additional-page-2'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      changefreq: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'yearly'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      priority: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0.7</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      lastmod: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Date</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">().</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">toISOString</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(),</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">      // acts only on '/additional-page-2'</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      alternateRefs: [</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          href: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'https://es.example.com'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          hreflang: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'es'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          href: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'https://fr.example.com'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          hreflang: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'fr'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      ],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    })</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    // using transformation from the current configuration</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    result.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">push</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">await</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> config.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">transform</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(config, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'/additional-page-3'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> result</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br></div></div></details>
<p>通过 <code>additionalPaths</code> 这个配置项，我们可以在 <code>next-sitemap</code> 生成 <code>sitemap</code> 的时候添加一些额外的路径，这样也算是达到了拓展的效果，不过类似文档类项目，我们难道还要自己手动一个个添加吗？</p>
<p>那可是有好几百篇呢，因此我们可以在文档类项目单独给他生成一个 <code>sitemap.xml</code> 文件，然后主站的 <code>sitemap</code> 去读取就好了。</p>
<p>比如 coding 的<a href="https://coding.net/help/docs/start/register-invite.html" target="_blank" rel="noreferrer">帮助文档</a>，还是有 500 篇左右的文章，手动肯定是很麻烦的，那么对于这个文档类网站，我们根据文档框架也生成了 <code>sitemap.xml</code> 文件，地址如下：</p>
<blockquote>
<p><a href="https://coding.net/help/docs/sitemap.xml" target="_blank" rel="noreferrer">https://coding.net/help/docs/sitemap.xml</a></p>
</blockquote>
<p>我们接下来就是读取这些内容，然后让我们在 build 阶段合并到我们的主站里去。</p>
<h2 id="读取子项目的-sitemap-xml-文件" tabindex="-1">读取子项目的 sitemap.xml 文件 </h2>
<p>我们这里使用的库名叫做 <a href="https://www.npmjs.com/package/node-fetch" target="_blank" rel="noreferrer">node-fetch</a>，然而对于 <code>next-sitemap.config.js</code> 文件是跑在 <code>node</code> 这端的，并且不能使用 <code>esm</code> 规范，<code>node-fetch</code> 为我们也提供了 <code>CommonJS</code> 规范的，</p>
<div class="language-bash line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> node-fetch@2</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p>然后我们在 <code>next-sitemap.config.js</code> 文件里面引入 <code>node-fetch</code>，并且使用 <code>async/await</code> 的方式去读取 <code>sitemap.xml</code> 文件，最后返回给 <code>next-sitemap</code>。</p>
<p>示例代码如下：</p>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">/**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">@type</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> {import('next-sitemap').IConfig}</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> * </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">@see</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> https://github.com/iamvishnusankar/next-sitemap#readme</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D"> */</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> fetch</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> require</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'node-fetch'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">exports</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  siteUrl: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'https://blog.yangchaoyi.vip'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  generateRobotsTxt: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  generateIndexSitemap: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">  additionalPaths</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">config</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> result</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> []</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    // 帮助文档 url 集合</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> helpDocsMapUrl</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> fetch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">      'https://coding.net/help/docs/sitemap.xml'</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    )</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">then</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">response</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> response.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">text</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">())</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">then</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">str</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> str.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">match</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">&#x3C;loc>(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">.</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*?</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">)&#x3C;</span><span style="--shiki-light:#22863A;--shiki-light-font-weight:bold;--shiki-dark:#85E89D;--shiki-dark-font-weight:bold">\/</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">loc></span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">g</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">then</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">matches</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> matches.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">map</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">match</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> match.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">replace</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">&#x3C;</span><span style="--shiki-light:#22863A;--shiki-light-font-weight:bold;--shiki-dark:#85E89D;--shiki-dark-font-weight:bold">\/</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">?</span><span style="--shiki-light:#032F62;--shiki-dark:#DBEDFF">loc></span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">/</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">g</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">''</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)))</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">then</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">urls</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> Promise</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">resolve</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(urls))</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    helpDocsMapUrl?.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">map</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">u</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      result.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">push</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        loc: u,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        priority: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0.6</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        lastmod: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Date</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">().</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">toISOString</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      })</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    )</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    result.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">push</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">await</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> config.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">transform</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(config))</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> result</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  robotsTxtOptions: {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    policies: [{ userAgent: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'*'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, allow: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'/'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br></div></div><p>此时当我们再次 <code>build</code> 时，就会生成全部内容了，如下图所示，文档内容还是挺多的，手动添加人都想哭了。</p>
<p><img src="https://chodocs-1301295644.cos.accelerate.myqcloud.com/img/202304061506602.png" alt=""></p>
<h2 id="结语" tabindex="-1">结语 </h2>
<p>本篇就到此结束了，其实后面的是否同域名也许不重要，不过最好还是添加同域名下的索引吧，至于具体有啥影响读者也可以了解一下相关 SEO 的策略，欢迎反馈。</p>
<p><code>next-sitemap</code> 这个库一开始是为大型索引而配置的，所以对于我们索引数都还没破万的，还是需要自己配置一下，如若发现本文有不足的地方，欢迎提 PR 或者 Issue。</p>
<h2 id="相关链接" tabindex="-1">相关链接 </h2>
<ul>
<li><a href="https://www.npmjs.com/package/node-fetch" target="_blank" rel="noreferrer">node-fetch</a></li>
<li><a href="https://www.npmjs.com/package/next-sitemap" target="_blank" rel="noreferrer">next-sitemap</a></li>
</ul>
<blockquote>
<p>学如逆水行舟，不进则退。</p>
</blockquote>]]></content:encoded>
            <author>Choi Yang</author>
        </item>
        <item>
            <title><![CDATA[23 年 4 月份学习动态 ]]></title>
            <link>https://chodocs.cn//weekly/202304.html</link>
            <guid isPermaLink="false">https://chodocs.cn//weekly/202304.html</guid>
            <pubDate>Sun, 02 Apr 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[23 年 4 月份学习动态  第一周  4 月第一周打卡，依旧由我来先开头吧哈哈。 阅读  项目  让 ChoDocs 文档网站支持了 rss，参考的是 Vue3 Blog 项目实现的，不过有点问题，那个是将所有 md 放在 posts 文件夹内，但我现在是每个分类一个文件夹，所以生成的 xml 内容还不是很多，需要读取一下文件夹，待修复。 视频  文章  总结  这周看了些 Java 内容，后面]]></description>
            <content:encoded><![CDATA[<h2 id="第一周" tabindex="-1">第一周 </h2>
<p>4 月第一周打卡，依旧由我来先开头吧哈哈。</p>
<h3 id="阅读" tabindex="-1">阅读 </h3>
<CustomLink title='(一)玩命死磕 Java 内存模型（JMM）与 Volatile 关键字底层原理' desc='看完之后让我彻底放弃 Java 学习，还是喜欢 js，后续会考虑后端用 TypeORM 或者 Prisma' href='https://juejin.cn/post/6977323236186914852'/><CustomLink title='Docker 是怎么实现的？前端怎么用 Docker 做部署？' desc='感觉 docker 也还好学，最近了解到了 mac 比较好用的 OrbStack，准备今天下载下来玩一玩' href='https://juejin.cn/post/7137621606469222414'/><CustomLink title='测试妹子提了个 bug,为什么你多了个 options 请求？' desc='浏览器工作原理相关，简短的文章，挺有意思' href='https://juejin.cn/post/7206264862657445947'/><h3 id="项目" tabindex="-1">项目 </h3>
<p>让 <a href="https://chodocs.cn/" target="_blank" rel="noreferrer">ChoDocs</a> 文档网站支持了 rss，参考的是 Vue3 Blog 项目实现的，不过有点问题，那个是将所有 md 放在 posts 文件夹内，但我现在是每个分类一个文件夹，所以生成的 xml 内容还不是很多，需要读取一下文件夹，待修复。</p>
<h3 id="视频" tabindex="-1">视频 </h3>
<CustomLink title='【编程】给你的 Next.js 项目优雅地添加 sitemap' desc='许久未更新了，就拿前不久遇到的问题录制了视频，虽然长视频没啥人看，关键还是锻炼下自己吧' href='https://www.bilibili.com/video/BV1JN411P7Dk/'/><h3 id="文章" tabindex="-1">文章 </h3>
<CustomLink title='标题：关于标准化规范这件事' desc='工作感悟' href='https://t.zsxq.com/0ck6paA5E'/><CustomLink title='标题：项目推荐专栏 | 开篇' desc='从带做项目到提供项目技术支持服务' href='https://t.zsxq.com/0cf6tPpVA'/><CustomLink title='标题：Vue3 项目：疫情数据可视化' desc='推荐的第一期' href='https://t.zsxq.com/0cS6xGRhJ'/><CustomLink title='标题：本周的科技资讯（每周末发布）' desc='' href='https://t.zsxq.com/0cmo2QBEt'/><h3 id="总结" tabindex="-1">总结 </h3>
<p>这周看了些 Java 内容，后面学着学着还是有点劝退，我依旧还是喜欢前端这块的开发体验优化，是真的很爽，多线程问题确实有很多地方需要考虑，也和后端朋友聊了些，感觉自己不是写 Java 的料，继续深耕前端吧，也并非一定要学 Java 是吧。</p>
<h2 id="第二周" tabindex="-1">第二周 </h2>
<p>这个月事情比较多，最近我们这边会出新版注册页面，要赶在 51 放假前上线，又是前端类的大改动，时间会比较赶，并且原本的注册逻辑我也没参与过，都是边看代码边折腾的，因此最近长文阅读比较少，如下：</p>
<h3 id="阅读-1" tabindex="-1">阅读 </h3>
<CustomLink title='The biggest Next.js boilerplates of 2023' desc='' href='https://theodorusclarence.com/blog/nextjs-boilerplate-2023'/><CustomLink title='前端依赖治理：代码分析工具开发实战（3/17）' desc='' href='https://juejin.cn/book/7202598408815640631'/><h3 id="文章-1" tabindex="-1">文章 </h3>
<CustomLink title='最近觉得比较有趣的内容' desc='' href='https://t.zsxq.com/0djKIsHmD'/><CustomLink title='A 厂 和 T 厂，我的一些思考' desc='' href='https://t.zsxq.com/0ddTtsPLB'/><CustomLink title='每周信息流（2）' desc='' href='https://t.zsxq.com/0dPDQPxaw'/><h3 id="其它" tabindex="-1">其它 </h3>
<p>最近再重新折腾一下 nextjs 的博客，还是喜欢折腾 Next.js 系列，把样式重新改造一下，之后将 yangchaoyi.vip 这个域名再用起来，一些个人想法、学习类就在个人博客上发。</p>
<p>上半年把 Next.js 学习系列出完，我们上半年定的目标也就差不多完成了。</p>
<blockquote>
<p>学如逆水行舟，不进则退。</p>
</blockquote>
<h2 id="第三周" tabindex="-1">第三周 </h2>
<h3 id="阅读-2" tabindex="-1">阅读 </h3>
<CustomLink title='《小王子》' href='https://weread.qq.com/web/bookDetail/04e32e30534c9404e504598'/><CustomLink title='放心，前端死不了' desc='' href='https://juejin.cn/post/7224325360598302781'/><h3 id="视频学习" tabindex="-1">视频学习 </h3>
<p>（下面我就不贴地址了，主要是 youtube 上的，搜一下就能搜到）</p>
<p>这周抽空一直在看这个 Next.js 全栈视频，有挺多收获的，真全栈内容，目前 3.5h 了，总共 8 个多小时。</p>
<ul>
<li>
<p>Full Stack Airbnb Clone with Next.js 13 App Router: React, Tailwind, Prisma, MongoDB, NextAuth 2023</p>
</li>
<li>
<p>【TED 演讲】想学会一个语言？就像玩电子游戏般地去说出来 | Marianna Pascal | TEDxPenangRoad</p>
</li>
<li>
<p>如何用「回音法」學好英文口說 | 史嘉琳 Karen Chung | TEDxNTUST</p>
</li>
<li>
<p>【双语字幕】台湾大学史嘉琳教授英语语音学（含发音练习）一，第一集：课程介绍</p>
</li>
</ul>
<blockquote>
<p>看了嘉琳老师的英语课程，把英语当做自己平常的习惯！</p>
</blockquote>
<h3 id="文章-2" tabindex="-1">文章 </h3>
<CustomLink title='让《小王子》永远活在我们心中' desc='' href='https://t.zsxq.com/0duW1ieLZ'/><h3 id="其它-1" tabindex="-1">其它 </h3>
<p>本周一直在忙着新版注册页，涉及到微信扫码这块，到今天算是快完结了，该和后端联调的也差不多了，下周主要是提供给测试和设计验收然后改改 bug 就行了，上半年事情应该不算太多了。</p>
<p>计划下周会在 b 站重新开启直播，也会写一篇短文说一下想法，这次一定了！</p>
<blockquote>
<p>后续：主题是《玩一下即时 AI》，可惜没有按录制...</p>
</blockquote>
<h2 id="第-4-周" tabindex="-1">第 4 周 </h2>
<h3 id="视频学习-1" tabindex="-1">视频学习 </h3>
<p>把之前 youtube 上在看的 Next.js 视频看完了，8 小时 40 分时长。</p>
<CustomLink title='Full Stack Airbnb Clone with Next.js 13 App Router: React, Tailwind, Prisma, MongoDB, NextAuth 2023' desc='' href='https://www.youtube.com/watch?v=c_-b_isI4vg'/><p>研发周期（可以理解为）刚好两年的英语视频，做的很用心，很有意思，全程看完了。</p>
<CustomLink title='【罗肖尼】如何永远学会一个单词？' desc='' href='https://www.bilibili.com/video/BV1ns4y1A7fj/?vd_source=9b6c8716136aceeb3992f47f96111dd8'/><h3 id="阅读-3" tabindex="-1">阅读 </h3>
<p>最近在看这本书：</p>
<CustomLink title='《趁着年轻，我偏要勉强》' desc='' href='https://weread.qq.com/web/bookDetail/03632890729fc921036eaf1'/><h3 id="星球内更新" tabindex="-1">星球内更新 </h3>
<CustomLink title='关键词：Auto-GPT'  href='https://t.zsxq.com/0dwprPd2I'/><CustomLink title='解答提问' href='https://t.zsxq.com/0djbQ8X2I' desc='up 好，这次又攒了几个问题来找你解答啦 1.关于怎么看书的问题 开始学习 C++后我是直接看书学，现在书快看完了，但感觉收获特别少，让我慢慢描述一下这个问题...'/><CustomLink title='解答提问'  href='https://t.zsxq.com/0d33HX0nz' desc='向大佬请教一些问题
1.如何看别人项目的代码以及找到他的优点，拿到自己项目使用呢
2.学习过于依赖视频怎么办，看官方文档感觉有些点不好懂'/>
<CustomLink title='解答提问'  href='https://t.zsxq.com/0dkGo6wxr' desc='想问一下有没有那种比较全乎的对后端请求解析之类的文章，因为在公司写原生小程序...'/><CustomLink title='球友分享：前端仔的自话自说'  href='https://t.zsxq.com/0dJOzD60M' desc='五一放假，不想出去人挤人，看到 up 知识星球更新，所以也把偷懒没发的文章发一下...'/>]]></content:encoded>
            <author>Choi Yang</author>
        </item>
        <item>
            <title><![CDATA[金三银四面试题汇总之三月面试遇见的前端题 ]]></title>
            <link>https://chodocs.cn//interview/isolcat/</link>
            <guid isPermaLink="false">https://chodocs.cn//interview/isolcat/</guid>
            <pubDate>Sat, 25 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[金三银四面试题汇总之三月面试遇见的前端题  前言  从三月刚开始就疯狂的海投简历，到最后顺利拿下某中厂的日常实习 OC，中间还是遇见了很多的坎坷，这里来按照不同的公司来记录一下我的前端面试经历吧 知乎  这是我最后悔的一场面试，不是因为别的，就是因为我没有准备充分，错过了我这个很喜欢的公司 由于是第一次面试，所以紧张的不行，不过面试官人真的很好，一直笑眯眯的鼓励我继续说下去，作为所有面试的开头，这]]></description>
            <content:encoded><![CDATA[<h2 id="前言" tabindex="-1">前言 </h2>
<p>从三月刚开始就疯狂的海投简历，到最后顺利拿下某中厂的日常实习 OC，中间还是遇见了很多的坎坷，这里来按照不同的公司来记录一下我的前端面试经历吧</p>
<h2 id="知乎" tabindex="-1">知乎 </h2>
<blockquote>
<p>这是我最后悔的一场面试，不是因为别的，就是因为我没有准备充分，错过了我这个很喜欢的公司
由于是第一次面试，所以紧张的不行，不过面试官人真的很好，一直笑眯眯的鼓励我继续说下去，作为所有面试的开头，这场面试让我对后面的面试更加有信心和好奇了</p>
</blockquote>
<h3 id="css-部分" tabindex="-1">CSS 部分 </h3>
<ul>
<li>常用的选择器有哪些？(我是傻逼，太紧张了乱说一通)</li>
</ul>
<blockquote>
<p>常用的选择器包括标签选择器、类选择器、ID 选择器、后代选择器、子元素选择器、相邻兄弟选择器、通用选择器和属性选择器等</p>
</blockquote>
<ul>
<li>权重</li>
</ul>
<blockquote>
<p>CSS 的权重是指在样式冲突时，某一条样式被应用的优先级。权重值的计算方式是根据选择器的类型和数量来确定的。选择器的权重值从高到低为：<code>!important &gt; 行内样式 &gt; ID选择器 &gt; 类选择器、属性选择器和伪类选择器 &gt; 标签选择器和伪元素选择器</code>。具体来说，ID 选择器的权重值为 100，类选择器、属性选择器和伪类选择器的权重值为 10，标签选择器和伪元素选择器的权重值为 1。在样式冲突时，权重值高的样式会覆盖权重值低的样式。</p>
</blockquote>
<ul>
<li>比如我想隐藏一个元素应该怎么办呢？这里我回答了 visibility 和 display，还自作聪明的说了 z-index，自己给自己挖了坑</li>
</ul>
<blockquote>
<ol>
<li>使用<code>display</code>属性：设置元素的 display 属性为 none，这样元素在页面上不会占用任何空间，同时也不会对其他元素产生影响。</li>
<li>使用<code>visibility</code>属性：设置元素的 visibility 属性为 hidden，这样元素在页面上不可见，但仍然占用空间。</li>
<li>使用<code>opacity</code>属性：设置元素的 opacity 属性为 0，这样元素在页面上不可见，但仍然占用空间。</li>
<li>使用<code>position</code>属性：将元素的 position 属性设置为 absolute 或 fixed，然后将元素移动到屏幕外或者使其超出容器的范围之外，这样元素在页面上不可见，但仍然占用空间。</li>
<li>使用<code>z-index</code>属性：将元素的 z-index 属性设置为负值，这样元素在页面上不可见，但仍然占用空间。</li>
<li>使用<code>clip</code>属性：将元素的 clip 属性设置为一个矩形区域，这样元素只会显示矩形区域内的部分，其余部分会被裁剪掉。</li>
</ol>
</blockquote>
<ul>
<li>接着上面的继续问，比如我想要一个元素，既不会被移除，但又要被隐藏(这里我回答的是 visibility，但面试官不满意，让我想想其他的方法) 最后说的方法是将其移除视窗外，或者直接缩小到不可见(这个方法确实出乎我的意料)</li>
</ul>
<blockquote>
<p>使用<code>position</code>属性：将元素的 position 属性设置为 absolute 或 fixed，然后将元素移动到屏幕外或者使其超出容器的范围之外，这样元素在页面上不可见，但仍然占用空间。</p>
</blockquote>
<ul>
<li>css 当中如果出现了两个一样的类定义，你如何避免冲突(有点太紧张了，就说的是 scoped 进行样式隔离，然后又按照自己的记忆随便回答了个外部引入的方式，结果把面试官弄笑了，唉)</li>
</ul>
<blockquote>
<ol>
<li>优先级：CSS 中每个选择器都有一个优先级，可以通过优先级来确定哪个样式定义将被应用。如果两个类定义中的样式相冲突，可以通过调整优先级来解决冲突。</li>
<li>父元素选择器：可以使用父元素选择器来限定样式的范围，从而避免冲突。比如，如果两个类定义中的样式都应用到某个父元素的不同子元素上，可以使用父元素选择器来限定样式的范围，从而避免冲突。</li>
<li>命名空间：可以使用命名空间来区分不同模块或组件的样式定义，从而避免冲突。比如，可以为不同模块或组件的类定义添加不同的命名空间前缀，从而将它们区分开来。</li>
<li>scoped 样式：可以使用 scoped 样式来将样式限定在特定的组件或模块中，从而避免与其他组件或模块的样式冲突。scoped 样式是一种 Vue 框架提供的特殊样式，可以通过在 style 标签中添加 scoped 属性来实现。</li>
</ol>
</blockquote>
<p>后面的有点记不清楚了</p>
<h3 id="javascript-部分" tabindex="-1">JavaScript 部分 </h3>
<ul>
<li>问我基本数据类型和引用数据类型(这里大意了，说的很快，可能没说全面。。。)</li>
</ul>
<blockquote>
<ul>
<li>基本数据类型：Undefined null Boolean number string</li>
<li>引用数据类型：object array function</li>
</ul>
</blockquote>
<ul>
<li>问我 es6 里的新引入的东西，这里面试官想让我说 map forEach，我说了箭头函数那些，他就鼓励我继续说下去，结果大脑当机了没想到这些</li>
<li>问我 map 和 forEach 的区别，我又乱回答了一通，js 基础真的太差了我，唉</li>
</ul>
<blockquote>
<p><code>map()</code>和<code>forEach()</code>都是 JavaScript 数组对象的方法，用于遍历数组。它们的区别在于返回值和使用方式。</p>
<p><code>forEach()</code>方法会对数组的每个元素执行一次回调函数，没有返回值，仅仅是遍历数组。</p>
<div class="language- line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span>arr = [1, 2, 3, 4];</span></span>
<span class="line"><span>arr.forEach((num) => {</span></span>
<span class="line"><span>console.log(num * 2);</span></span>
<span class="line"><span>});</span></span>
<span class="line"><span>// 输出2 4 6 8</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><p><code>map()</code>方法会对数组的每个元素执行一次回调函数，并将回调函数的返回值组成一个新的数组返回，不会修改原数组。</p>
<div class="language- line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span>arr = [1, 2, 3, 4];</span></span>
<span class="line"><span>const newArr = arr.map((num) => {</span></span>
<span class="line"><span>return num * 2;</span></span>
<span class="line"><span>});</span></span>
<span class="line"><span>console.log(newArr); // 输出[2, 4, 6, 8]</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><p>因此，如果我们想对数组进行遍历并执行一些操作，可以使用<code>forEach()</code>方法；如果我们需要在遍历数组的同时生成一个新的数组，可以使用<code>map()</code>方法。</p>
</blockquote>
<p>记不清楚了后面，反正回答的有点差</p>
<h3 id="vue-部分" tabindex="-1">Vue 部分 </h3>
<ul>
<li>面试官本身是 react 的，不是很清楚 vue，就让我介绍 vue，我就说了 Vue 的一些特点和 react 的区别之类的</li>
<li>然后问我 Vue 双向绑定之类的，我就又讲了一些底层的东西</li>
<li>问我接触过 react 没，我回答没 😢</li>
</ul>
<h3 id="项目部分" tabindex="-1">项目部分 </h3>
<blockquote>
<p>我这次能拿到这个面试完全看的是组件库的项目，面试官似乎对我组件库的项目很感兴趣</p>
</blockquote>
<ul>
<li>就说为什么我的 button 按钮那里不进行一个直接的映射，而是还需要进行调用颜色，我说这部分实现遇见了 bug</li>
<li>项目的组件还是太少了</li>
<li>用过 git 吗？给我介绍一下，我就开始介绍了，又给自己挖了坑，提到了 git merge，然后问我如何切换分支，我说不会，只能硬着头皮说自己项目没分支，面试官看上去很惊讶 😢</li>
</ul>
<h3 id="手撕-js-部分" tabindex="-1">手撕 js 部分 </h3>
<p>没有我背的八股 js，直接哭死</p>
<blockquote>
<p>实现了将一个由键值对对象组成的数组转换成一个键为对象中 key 属性值、值为 value 属性值的对象</p>
</blockquote>
<div class="language- line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span>function change(arr) {</span></span>
<span class="line"><span>    return arr.reduce((pre, { key, value }) => {</span></span>
<span class="line"><span>        pre[key] = value;</span></span>
<span class="line"><span>        return pre</span></span>
<span class="line"><span>    }, {})</span></span>
<span class="line"><span>}</span></span>
<span class="line"><span></span></span>
<span class="line"><span>let a = change([{ key: 'a', value: '1' }, { key: 'b', value: '2' }])</span></span>
<span class="line"><span>console.log(a)</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br></div></div><p>我直接不会，然后面试官教我怎么实现</p>
<h3 id="反问" tabindex="-1">反问 </h3>
<p>我第一次面试，所以我感觉很烂，您觉得怎么样呢，还有后续吗？</p>
<ul>
<li>我感觉还行，但你的 js 部分可能还不是很好 🥹😭 感觉很阳光开朗</li>
</ul>
<p>知乎的技术栈是什么呢？</p>
<ul>
<li>大部分是 react，有一些是 Vue</li>
</ul>
<p>请问你们的组件是直接用现成的还是自己弄呢？</p>
<ul>
<li>b 端的话会自己弄，c 端需要很多自己定义样式的地方，大都手搓</li>
</ul>
<p>好的，没有了，谢谢您</p>
<ul>
<li>好的</li>
</ul>
<h3 id="总结" tabindex="-1">总结 </h3>
<p>自己太紧张了，很多地方发挥的很失败，面试没准备好，在面试的时候我才在搭建环境，自己的 js 基础太差了，git 命令也很差，需要恶补一下，知乎的寄了，接下来加油吧</p>
<h2 id="扁鹊健康" tabindex="-1">扁鹊健康 </h2>
<blockquote>
<p>第二场面试，八股文基本上全答出来了，结果反手删我微信给我挂了 😓</p>
</blockquote>
<p>第二次面试很明显比第一次好多了，没有那么紧张，情绪也没有失控，可能是没开视频的原因？感觉面试的时候还是得尽量严肃一点吧，控制好自己的情绪和面部表情才能够更好的回答问题，在面试前让自己冷静下来，像对待考试一样去对待每一场面试</p>
<p>面试官迟到了 6 分钟的样子 电话面试 本以为只会面试 10 分钟，结果面试了半小时</p>
<p>之前看牛客上的面经，以为是很简单的那种，结果大意了，把我简历扒拉干净了的感觉</p>
<p>一上来还是自我介绍</p>
<h3 id="数据结构" tabindex="-1">数据结构 </h3>
<p>一上来就进行数据结构的拷打呜呜，我数据结构很烂诶</p>
<ul>
<li>有哪些排序的方法？</li>
</ul>
<blockquote>
<ol>
<li>Array.prototype.sort()：该方法可以对数组进行原地排序，即直接修改原数组，不会返回新的数组。默认情况下，它会将数组元素转换为字符串，然后按照 Unicode 码点排序。如果需要按照其他方式排序，可以传入一个比较函数作为参数。</li>
<li>Array.prototype.reverse()：该方法可以将数组中的元素按照相反的顺序重新排列，并返回新的数组。</li>
<li>冒泡排序（Bubble Sort）：这是一种简单的排序算法，它重复地遍历要排序的数组，比较相邻的元素并交换位置，直到整个数组都已经排序。</li>
<li>快速排序（Quick Sort）：这是一种快速的排序算法，它的基本思想是选择一个基准元素，然后将数组中的元素分为小于基准元素和大于基准元素的两部分，再对这两部分分别进行排序。</li>
<li>插入排序（Insertion Sort）：这是一种简单的排序算法，它将数组分为已排序和未排序两部分，然后将未排序部分的第一个元素插入到已排序部分的正确位置上。</li>
<li>选择排序（Selection Sort）：这是一种简单的排序算法，它将数组分为已排序和未排序两部分，然后从未排序部分选择最小的元素并放到已排序部分的末尾。</li>
<li>归并排序（Merge Sort）：这是一种分治的排序算法，它将数组分成两个子数组，分别对这两个子数组进行排序，然后将排序后的子数组合并成一个有序的数组</li>
</ol>
</blockquote>
<ul>
<li>我说了快排和冒泡排序后问我快排的时间复杂度</li>
</ul>
<blockquote>
<p>快速排序的平均时间复杂度为 O(nlogn)。具体来说，当待排序数组的划分比较平均时，快速排序的时间复杂度是最优的。而当待排序数组已经有序或接近有序时，快速排序的时间复杂度会退化为 O(n^2)。</p>
</blockquote>
<blockquote>
<p>快速排序的时间复杂度分析如下：</p>
<ul>
<li>每次划分操作需要对整个数组进行一次遍历，时间复杂度为 O(n)；</li>
<li>快速排序的递归树的深度为 logn，因为每次划分都会将数组一分为二，所以深度为 logn；</li>
<li>每次划分的时间复杂度为 O(n)，因此快速排序的总时间复杂度为 O(nlogn)。</li>
</ul>
<p>需要注意的是，快速排序的最坏时间复杂度为 O(n^2)，但这种情况很少出现，通常情况下快速排序的时间复杂度为 O(nlogn)，是一种高效的排序算法。</p>
</blockquote>
<ul>
<li>我说了有两种情况，然后追问我如何对快排进行优化(这里没回答好)</li>
</ul>
<blockquote>
<p>JavaScript 中，可以使用以下技巧来优化快速排序算法：</p>
<ol>
<li>三数取中：在选择基准元素时，使用数组中间、头部和尾部的三个元素的中位数作为基准元素。这可以降低最坏情况的出现概率。</li>
<li>插入排序：在数组的长度小于某个值（如 10）时，使用插入排序算法而不是快速排序。插入排序在处理小数组时比快速排序更快。</li>
<li>随机化数组：在每次执行快速排序时，随机打乱数组，以增加算法的随机性。</li>
<li>尾递归优化：使用尾递归优化快速排序的实现，避免栈溢出。</li>
</ol>
</blockquote>
<ul>
<li>问我快排最差的情况是什么</li>
</ul>
<blockquote>
<p>最差情况是每次选取的基准元素都是当前子数组中最大或最小的元素。在这种情况下，每次划分都只能排除一个元素，因此需要进行 n 次划分才能完成排序，时间复杂度为 O(n^2)。这种情况发生的概率非常低，但是如果数据本身就是有序的，或者是基本有序的，快排容易陷入最差情况。</p>
</blockquote>
<p>后面突然问我计算机组成原理了解吗？把我吓到了，连忙说之前学过，但没怎么了解</p>
<h3 id="css" tabindex="-1">CSS </h3>
<p>CSS 问题我记得不是很清楚了<strong>下次面试一定要录音！</strong></p>
<ul>
<li>CSS 盒模型</li>
<li>出了个场景题，说 content 大小为 100px，border 为 100px，问此时怪异盒模型的宽高（这里我电话没听太清楚，好像是说我出了问题了，但我下来一看感觉是面试官说错了(・∀・(・∀・(・∀・*)）</li>
</ul>
<h3 id="js" tabindex="-1">js </h3>
<ul>
<li>es6 新特性</li>
<li>箭头函数和普通函数区别</li>
</ul>
<blockquote>
<ol>
<li>语法不同：箭头函数使用箭头符号（<code>=&gt;</code>）来定义函数，而普通函数使用关键字 <code>function</code> 来定义。</li>
<li><code>this</code> 的指向不同：箭头函数没有自己的 <code>this</code>，它会继承父级作用域中的 <code>this</code> 值。而普通函数中的 <code>this</code> 则是在函数被调用时动态确定的，它的值取决于调用函数的方式。</li>
<li>无法使用 <code>arguments</code> 对象：箭头函数没有自己的 <code>arguments</code> 对象，因此在箭头函数中使用 <code>arguments</code> 会引用外部作用域的 <code>arguments</code>。</li>
<li>不能用作构造函数：箭头函数不能使用 <code>new</code> 关键字来创建实例，因为它们没有自己的 <code>this</code>，也没有原型对象。</li>
<li>没有原型：箭头函数没有 <code>prototype</code> 属性，因此不能通过它来定义方法。</li>
<li>没有自己的 <code>arguments</code>, <code>super</code>, <code>new.target</code> 对象：箭头函数没有自己的 <code>arguments</code>, <code>super</code>, <code>new.target</code> 对象，它们都是从外部继承的。</li>
</ol>
</blockquote>
<ul>
<li>Promise</li>
<li>Promise 的参数有哪些</li>
</ul>
<blockquote>
<p>Promise 构造函数的参数为一个函数，这个函数接收两个参数：resolve 和 reject，它们分别表示 Promise 对象的两种状态：已解决（fulfilled）和已拒绝（rejected）</p>
</blockquote>
<ul>
<li>Promise.all 了解吗</li>
<li>Promise.all 的使用场景</li>
</ul>
<blockquote>
<ol>
<li>多个异步操作并行执行，且需要等待所有操作完成后进行下一步处理，比如从多个 API 接口获取数据，然后将所有数据合并到一起再进行渲染</li>
<li>多个异步操作中有一个操作失败就立即停止所有操作，并执行错误处理逻辑</li>
</ol>
</blockquote>
<ul>
<li>数据类型，基本数据类型和引用数据类型</li>
<li>symbol 了解吗 说说他的使用场景</li>
</ul>
<blockquote>
<p>定义对象的私有属性：Symbol 值作为属性名是唯一的，可以防止属性名的冲突，因此可以用来定义对象的私有属性</p>
<p>防止对象属性被意外修改：由于 Symbol 值是唯一的，因此可以用来定义对象属性，防止属性被意外修改</p>
<p>定义常量：由于 Symbol 值是唯一的，因此可以用来定义常量</p>
<p>定义枚举：由于 Symbol 值是唯一的，因此可以用来定义枚举</p>
</blockquote>
<h3 id="计算机网络" tabindex="-1">计算机网络 </h3>
<ul>
<li>说说 http 和 https 的区别</li>
</ul>
<blockquote>
<ol>
<li>安全性：HTTP 传输的数据是明文的，容易被窃取和篡改，而 HTTPS 使用 SSL/TLS 加密传输数据，可以保证数据的机密性和完整性，防止数据被窃取和篡改</li>
<li>端口号：HTTP 默认使用端口号 80，而 HTTPS 默认使用端口号 443</li>
<li>证书：HTTPS 使用 SSL/TLS 协议对传输数据进行加密，需要使用证书对网站进行身份验证，防止中间人攻击。HTTP 不需要证书进行身份验证</li>
<li>速度：由于 HTTPS 使用 SSL/TLS 加密传输数据，会增加传输数据的时间和带宽消耗，因此速度比 HTTP 慢一些</li>
<li>缓存：HTTP 可以使用浏览器缓存来提高访问速度，而 HTTPS 在加密传输数据时会禁止浏览器缓存，以保证数据的安全性</li>
</ol>
</blockquote>
<ul>
<li>说说 http 状态码</li>
<li>了解 https 数据传输的过程吗？(没太回答上来)</li>
</ul>
<blockquote>
<ol>
<li>客户端向服务器发起 HTTPS 请求，请求中包含了 SSL/TLS 支持的信息，比如支持的 SSL/TLS 版本号、加密算法等。</li>
<li>服务器返回证书给客户端，证书中包含了服务器的公钥、服务器的身份信息和证书的有效期等。</li>
<li>客户端验证服务器的身份，包括验证证书的有效性、证书是否过期、证书中的域名与服务器的域名是否一致等。</li>
<li>如果证书验证通过，客户端生成一个随机的加密密钥，并使用服务器的公钥进行加密，然后发送给服务器。</li>
<li>服务器使用私钥解密客户端发来的密钥，然后生成一个随机数作为会话密钥，并将会话密钥加密后发送给客户端。</li>
<li>客户端和服务器使用会话密钥进行数据传输，客户端和服务器之间的所有数据都使用会话密钥进行加密和解密，保证数据的机密性和完整性</li>
</ol>
</blockquote>
<h3 id="项目" tabindex="-1">项目 </h3>
<p>移动端媒体项目：</p>
<ul>
<li>你这个项目为什么不用 vuex 而是 pinia 呢？说说二者的区别吧</li>
<li>你这个 token 持久化是怎么实现的？(乱编了我就)</li>
<li>除了 pinia 那个方法还有什么呢？我说了 session</li>
<li>session 关掉后就没有了哦，还有吗？(答案是 localstorage)</li>
</ul>
<p>组件库项目：</p>
<ul>
<li>为什么想到做个组件库的项目呢？</li>
<li>你是如何实现组件库的封装呢？(这里回答 defineComputed 然后讲我是如何写的组件就行)</li>
<li>说一下常用的 git 命令吧</li>
<li>经典问题之 git merge 和 git rebase 的区别</li>
</ul>
<blockquote>
<p><code>git merge</code> 命令会生成一个新的合并提交，并且会保留原来的分支历史记录，合并后的提交包含两个分支的修改。而 <code>git rebase</code> 命令则是将当前分支的修改应用到目标分支上，重新生成一颗新的分支历史记录，使得分支历史记录更加线性化</p>
</blockquote>
<ul>
<li>vite 和 webpack 的区别</li>
</ul>
<blockquote>
<ol>
<li>构建方式不同：Vite 利用 ES Modules 的特性进行构建，每个文件都是一个独立的模块，开发过程中只需要编译修改的文件，不需要每次都编译整个项目；而 Webpack 采用静态分析的方式进行构建，需要分析整个项目中的依赖关系，每次修改后需要重新编译整个项目。</li>
<li>开发体验不同：Vite 支持快速的热更新和即时预览，开发者可以在修改代码的同时，立即在浏览器中查看到最新效果；而 Webpack 需要重新编译后才能查看最新效果。</li>
<li>对 Vue 的支持：Vite 是 Vue.js 官方推荐的开发工具，内置了对 Vue 单文件组件的支持，可以直接在浏览器中运行 Vue 组件；而 Webpack 需要通过插件等方式进行支持。</li>
<li>总体来说，Vite 更适合于轻量级的应用，对于 Vue 单文件组件的支持更加完善，而 Webpack 则更适合于复杂的应用，可以通过插件等方式进行更加灵活的配置</li>
<li>vite 支持热重载</li>
</ol>
</blockquote>
<p>热重载（Hot Reload）是指在应用程序运行时对代码进行修改，而无需重新启动应用程序或重新加载整个页面，即可使更改的部分立即生效并反映在应用程序中。热重载可以帮助开发人员更快地调试和开发应用程序，同时减少开发周期</p>
<p>还有一些我就忘记了哈哈</p>
<h3 id="反问-1" tabindex="-1">反问 </h3>
<ul>
<li>公司技术栈？</li>
</ul>
<p>react 少部分是 vue2</p>
<ul>
<li>多久出结果</li>
</ul>
<p>一周内吧</p>
<p>感觉还算是很不错的面试，基本上都回答出来了，不过这个是阿里的外包公司，一半员工都是阿里过去的，看了一下公司规模很小，估计也没 hc 让我进去，就当一次电话面试的体验了，加油!</p>
<h2 id="即刻-app" tabindex="-1">即刻 app </h2>
<blockquote>
<p>很热情的一个面试官！反问环节最有意思的一家，不过难度也算最高的一家</p>
</blockquote>
<p>这是我目前面过的公司里难度感觉最高的一家了，不是常规的那种八股文直接硬背，而是真的结合实际的场景进行出题的，对于一个技术栈的考察的深度很深，是一个很不错的面试官</p>
<p>首先第一点给我感觉不一样的就是，没有自我介绍！上来就直接发了个链接，可能是打算结合实际代码来对我进行考察，可惜这里失败了(学校的网真的差。。。)</p>
<h3 id="ref-和-reactive-的区别" tabindex="-1">ref 和 reactive 的区别 </h3>
<p>ref 是一个函数，它可以将一个普通数据类型（如数字、字符串等）转换为一个响应式对象，从而让这个数据在 Vue 的响应式系统中被追踪。ref 返回一个对象，这个对象有一个.value 属性，用来获取和设置这个响应式对象的值</p>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { ref } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'vue'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> count</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> ref</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(count.value) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// 0</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">count.value </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(count.value) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// 1</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br></div></div><p>而 reactive 则是一个函数，它可以将一个普通的 Javascript 对象转换为一个响应式对象。它会递归地将这个对象的所有属性都转换为响应式对象，从而让整个对象在 Vue 的响应式系统中被追踪。reactive 返回一个 Proxy 对象，用来代理原始对象的访问和修改</p>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { reactive } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'vue'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> state</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> reactive</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  count: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  message: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'hello'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">})</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(state.count) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// 0</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(state.message) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// 'hello'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">state.count </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">state.message </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'world'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(state.count) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// 1</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(state.message) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// 'world'</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br></div></div><p>因此，ref 主要用于创建一个单一的响应式数据，而 reactive 则适用于创建一个复杂的、包含多个属性的响应式数据对象</p>
<h3 id="ref-可以大量的替换成-reactive-吗" tabindex="-1">ref 可以大量的替换成 reactive 吗 </h3>
<p>不能直接把 ref 替换成 reactive。</p>
<p>ref 主要用于将基本数据类型（如字符串、数字等）转换为响应式数据，并提供一个.value 属性用于访问和修改该数据。而 reactive 则用于将一个普通的 JavaScript 对象转换为响应式对象，并使用 Proxy 来拦截对该对象的访问和修改，以实现响应式更新。</p>
<p>因此，如果你需要使用响应式数据来存储基本数据类型，或者你只需要响应式地跟踪一个值的变化，那么 ref 仍然是更合适的选择。而如果你需要管理一个对象的多个属性，并希望这些属性可以响应式地更新，那么 reactive 会更加合适</p>
<h3 id="为什么-vue-和-react-都去选择自己实现一个路由-是出于什么目的呢" tabindex="-1">为什么 vue 和 react 都去选择自己实现一个路由，是出于什么目的呢 </h3>
<ol>
<li>更好地集成到框架中：由于路由是前端应用中必不可少的一部分，因此框架集成路由功能可以提供更好的用户体验和开发效率。通过自己实现路由库，Vue 和 React 可以将路由功能无缝集成到框架中，提供更好的开发体验和更高的开发效率。</li>
<li>更好地控制代码和依赖：Vue 和 React 自己实现的路由库可以更好地控制代码和依赖。如果使用第三方路由库，可能会增加代码的复杂性和依赖关系，而自己实现路由库可以避免这些问题。</li>
<li>更好地满足框架的需求：Vue 和 React 的路由库可以更好地满足框架的需求。由于框架本身的特性和设计思想，可能需要特定的路由实现方式来满足这些需求。通过自己实现路由库，可以更好地满足框架的需求，提供更好的开发体验和更高的性能。</li>
<li>更好地控制性能：Vue 和 React 的路由库可以更好地控制性能。由于路由是前端应用中的关键部分，性能往往是一个重要的考虑因素。通过自己实现路由库，Vue 和 React 可以更好地控制路由的性能，从而提供更好的用户体验和更高的性能</li>
</ol>
<blockquote>
<p>总之，Vue 和 React 都实现了自己的路由库，主要是为了更好地集成到框架中，更好地控制代码和依赖，更好地满足框架的需求，以及更好地控制性能</p>
</blockquote>
<h3 id="浏览器自己本身就有路由-为什么不直接用-a-标签进行一个跳转-而是选择用-router-来进行一个跳转呢" tabindex="-1">浏览器自己本身就有路由，为什么不直接用 a 标签进行一个跳转，而是选择用 router 来进行一个跳转呢 </h3>
<p>浏览器本身的路由是基于 URL 的，即每个页面都有一个唯一的 URL 地址。使用浏览器本身的路由，需要在 URL 中手动编写参数，处理页面刷新和前进/后退等操作的逻辑，这样会使得代码复杂性增加，并且不太方便维护。</p>
<p>而使用 router 库可以将路由相关的逻辑抽象出来，让开发者可以更加方便地处理页面跳转和传递参数等操作。使用 router 可以实现单页应用（SPA），使得用户在应用中的操作更流畅，且无需每次跳转都重新加载整个页面。</p>
<p>此外，使用 router 还可以提供一些额外的功能，如路由守卫、动态路由等，这些功能可以帮助开发者更好地控制路由的行为，提高应用的性能和安全性</p>
<blockquote>
<p>虽然浏览器本身也有路由，但使用 router 库可以提供更好的开发体验和更丰富的功能，使得应用的开发更加方便、高效和可维护</p>
</blockquote>
<h3 id="浏览器为什么支持单页面路由呢" tabindex="-1">浏览器为什么支持单页面路由呢？ </h3>
<p>参考链接：<a href="https://developer.mozilla.org/zh-CN/docs/Web/API/History" target="_blank" rel="noreferrer">https://developer.mozilla.org/zh-CN/docs/Web/API/History</a></p>
<p>浏览器支持单页面路由的一个重要原因是<code>History</code> API。</p>
<p>在传统的多页面应用中，页面之间的跳转通过超链接或表单提交等方式实现，每个页面都有一个唯一的 URL 地址。而在单页面应用中，页面的跳转是通过 JavaScript 代码控制，使用 history API 可以更加方便地实现这种页面切换逻辑。</p>
<p>history API 是 HTML5 规范中新增的一组 API，可以让开发者更加方便地操作浏览器的历史记录。通过 history API，开发者可以在不重新加载整个页面的情况下，改变浏览器的 URL 地址，添加或修改历史记录，以及监听历史记录的变化等操作。</p>
<p>在单页面应用中，开发者可以使用 history API 来实现前端路由，即在不重新加载整个页面的情况下，通过改变 URL 地址，实现不同页面之间的切换。这样可以提高应用程序的性能，并且使得应用程序更具交互性和动态性</p>
<h3 id="当我们在使用-history-进行导航的时候-我们的页面真的进行了一个切换吗-是怎么做到的呢" tabindex="-1">当我们在使用 history 进行导航的时候，我们的页面真的进行了一个切换吗？是怎么做到的呢 </h3>
<p>当我们使用 history 进行导航时，实际上并没有进行页面的刷新或重新加载。相反，浏览器仅仅是通过修改 URL 地址和浏览器历史记录，模拟了一个页面的切换效果。</p>
<p>具体来说，使用 history 进行导航时，我们通常会调用 history.pushState 或 history.replaceState 方法，这些方法可以向浏览器历史记录中添加或修改一个记录，并且同时修改当前 URL 地址。然后，浏览器会根据新的 URL 地址重新渲染页面，并且在浏览器的历史记录中添加或修改一个记录。</p>
<p>当我们使用 history 进行导航时，虽然页面并没有进行刷新或重新加载，但是浏览器会触发一些相关的事件，如 popstate 事件，用来处理导航过程中的一些逻辑。开发者可以在这些事件中添加相关的处理逻辑，从而实现前端路由的功能</p>
<h3 id="vue-如何监听路由的变化呢" tabindex="-1">vue 如何监听路由的变化呢？ </h3>
<p>在 Vue 中，可以使用 Vue Router 提供的导航守卫（Navigation Guards）来监听路由的变化。</p>
<p>导航守卫是 Vue Router 提供的一组钩子函数，可以在路由发生变化时被触发。通过使用导航守卫，开发者可以实现一些常见的路由控制逻辑，如路由权限控制、路由拦截、路由跳转前的确认等等。</p>
<p>Vue Router 提供了三种类型的导航守卫：</p>
<ol>
<li>全局守卫：在整个应用程序中，所有的路由变化都会触发这些守卫。可以通过 Vue Router 实例的 beforeEach、beforeResolve 和 afterEach 方法来注册全局守卫。</li>
<li>路由独享守卫：在某个路由上，只有该路由变化时才会触发这些守卫。可以在路由配置对象中通过 beforeEnter 属性来注册路由独享守卫。</li>
<li>组件内守卫：在某个路由对应的组件中，可以通过 Vue 组件生命周期钩子函数来监听路由的变化，实现一些组件内部的路由控制逻辑。</li>
</ol>
<p>以下是一个使用全局守卫来监听路由变化的示例：</p>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Vue </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'vue'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> VueRouter </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'vue-router'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Vue.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">use</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(VueRouter)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> router</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> VueRouter</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  routes: [</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    { path: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'/'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, component: Home },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    { path: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'/about'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, component: About },</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  ],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">})</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">router.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">beforeEach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">((</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">to</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">next</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'路由变化：'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, from.path, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">' => '</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, to.path)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">  next</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br></div></div><p>在上面的示例中，我们通过 Vue Router 实例的 beforeEach 方法注册了一个全局守卫，在每次路由变化时都会触发这个守卫，并且打印出路由变化的信息。可以根据实际需求，编写自己的路由守卫逻辑</p>
<h3 id="原生-js-如何进行监听路由的变化" tabindex="-1">原生 js 如何进行监听路由的变化 </h3>
<p>在原生 JavaScript 中，可以使用 <code>window.onpopstate</code> 事件来监听路由的变化。</p>
<p>当用户在浏览器中进行前进或后退操作时，或者通过 JavaScript 调用 <code>history.pushState()</code> 或 <code>history.replaceState()</code> 方法时，都会触发 <code>window.onpopstate</code> 事件。</p>
<p>可以通过如下代码来监听 <code>window.onpopstate</code> 事件：</p>
<div class="language- line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span>window.onpopstate = function(event) {</span></span>
<span class="line"><span>  console.log("当前路由：", window.location.pathname);</span></span>
<span class="line"><span>};</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><p>在上面的代码中，当用户在浏览器中进行前进或后退操作时，或者通过 JavaScript 调用 <code>history.pushState()</code> 或 <code>history.replaceState()</code> 方法时，会触发 <code>window.onpopstate</code> 事件，并输出当前路由路径到控制台。</p>
<p>需要注意的是，这种方式只能监听浏览器历史记录中的路由变化，对于通过 AJAX 或其他方式进行的路由变化是无法监听的。如果需要监听所有的路由变化，可以考虑使用一些现有的路由库，如 React Router、Vue Router 等</p>
<h3 id="没有-hash-的路由如何进行监听" tabindex="-1">没有 hash 的路由如何进行监听 </h3>
<p>如果你使用的是 HTML5 History API 来管理路由，而不是 hash 路由，那么可以通过监听 <code>popstate</code> 事件来实现路由变化的监听。</p>
<p>HTML5 History API 可以让我们使用 <code>pushState()</code> 和 <code>replaceState()</code> 方法来操作浏览器的历史记录，并可以修改当前页面的 URL，而不会导致页面的刷新。</p>
<p>当通过 <code>pushState()</code> 或 <code>replaceState()</code> 方法修改浏览器历史记录时，会触发 <code>popstate</code> 事件。我们可以通过监听这个事件来获取路由的变化。</p>
<p>例如，我们可以使用如下代码来监听路由的变化：</p>
<div class="language- line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span>window.addEventListener('popstate', function(event) {</span></span>
<span class="line"><span>  console.log("当前路由：", window.location.pathname);</span></span>
<span class="line"><span>});</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><p>在上面的代码中，当用户通过浏览器前进或后退按钮，或者通过 <code>pushState()</code> 或 <code>replaceState()</code> 方法修改浏览器历史记录时，会触发 <code>popstate</code> 事件，并输出当前路由路径到控制台</p>
<h3 id="onpopstate-可以监听到一个-pushstate-的事件吗" tabindex="-1">onpopstate 可以监听到一个 pushstate 的事件吗 </h3>
<blockquote>
<p>这里回答错了，我说的是可以进行监听的，面试官让我回去再好好看看</p>
</blockquote>
<p><code>onpopstate</code> 事件只能监听到由浏览器触发的历史记录变化，例如点击浏览器的前进或后退按钮，或者调用 <code>history.back()</code> 或 <code>history.forward()</code> 方法。</p>
<p>如果你在 JavaScript 中调用 <code>history.pushState()</code> 或 <code>history.replaceState()</code> 方法来修改浏览器的历史记录，那么不会触发 <code>onpopstate</code> 事件。但是，调用这两个方法会添加新的历史记录，并且可以在历史记录中回退和前进，这些历史记录变化会触发 <code>onpopstate</code> 事件。</p>
<p>因此，如果你想要在调用 <code>pushState()</code> 或 <code>replaceState()</code> 方法后立即获取路由变化，可以在调用这两个方法后手动触发 <code>popstate</code> 事件，例如</p>
<div class="language- line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span>history.pushState({}, '', '/new-path');</span></span>
<span class="line"><span>window.dispatchEvent(new PopStateEvent('popstate'));</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><p>在上面的代码中，我们先调用 <code>pushState()</code> 方法来修改浏览器的历史记录，并修改当前页面的 URL 为 <code>/new-path</code>。然后，手动触发 <code>popstate</code> 事件，这会立即触发绑定在 <code>window.onpopstate</code> 上的事件处理函数，并获取到新的路由信息</p>
<h3 id="ts-泛型的作用-在开发当中最常用在哪里" tabindex="-1">ts 泛型的作用，在开发当中最常用在哪里 </h3>
<p>TypeScript 中的泛型（generics）是一种用于在编译时期处理类型的工具。泛型可以让我们编写更通用、更可重用的代码。</p>
<p>泛型最常用的场景之一是在函数和类中使用。通过使用泛型，我们可以编写可重用的函数或类，可以支持多种不同类型的参数或属性。例如，下面是一个使用泛型的函数示例</p>
<div class="language-typescript line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">typescript</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> reverse</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">list</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[])</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> T</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[] {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> list.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">reverse</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> numbers</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> reversedNumbers</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> reverse</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(numbers)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> letters</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'a'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'b'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'c'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> reversedLetters</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> reverse</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(letters)</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br></div></div><p>在上面的代码中，我们定义了一个名为 <code>reverse</code> 的函数，它使用了一个类型参数 <code>T</code>。我们可以将 <code>reverse</code> 函数应用于任何具有 <code>reverse</code> 方法的数组类型。在调用 <code>reverse</code> 函数时，我们将一个类型为 <code>T[]</code> 的数组作为参数传递，并返回一个类型为 <code>T[]</code> 的数组。</p>
<p>除了函数和类，泛型还可以应用于 TypeScript 中的其它特性，例如接口、类型别名等</p>
<p>在开发中，我们最常使用泛型的场景是编写通用的数据结构、算法和函数，例如列表、树、排序算法、搜索算法等等。泛型可以让我们编写更通用、更可重用的代码，并且可以提高代码的灵活性和可扩展性。同时，使用泛型还可以让我们在编译时期发现类型错误，避免一些潜在的运行时错误</p>
<h3 id="axios-二次封装的好处" tabindex="-1">axios 二次封装的好处 </h3>
<p>通过对 <code>axios</code> 进行二次封装，我们可以实现以下功能：</p>
<ol>
<li>统一处理请求参数和响应数据格式：我们可以对请求参数和响应数据进行预处理或格式化，以便在多个请求中使用相同的格式。</li>
<li>统一处理错误信息：我们可以对错误信息进行统一处理或格式化，以便在多个请求中使用相同的错误信息处理逻辑。</li>
<li>添加请求头、设置超时时间等功能：我们可以在二次封装中添加一些公共的请求头、超时时间等参数，以便在多个请求中使用相同的参数。</li>
<li>支持自定义拦截器：我们可以通过自定义拦截器来对请求或响应进行处理，例如添加 token、在请求头中添加认证信息等</li>
</ol>
<h3 id="如何标识用户已经登录" tabindex="-1">如何标识用户已经登录 </h3>
<p>在 Web 应用程序中，标识用户是否已经登录通常使用 Session 或 Token 的方式。</p>
<p>Session 是一种服务器端的技术，用于跟踪用户的状态。当用户登录成功后，服务器会创建一个 Session，并为该用户分配一个唯一的 Session ID，将该 Session ID 存储在 Cookie 中或者通过 URL 传递给客户端。在用户访问其他页面时，客户端会将 Session ID 发送回服务器，并使用该 ID 来查找服务器端的 Session 数据。如果 Session 数据存在，说明用户已经登录，否则用户未登录。使用 Session 的优点是可以在服务器端存储敏感的用户信息，不会在客户端暴露。</p>
<p>Token 是一种基于客户端的技术，通常使用 JSON Web Token (JWT) 或类似的技术。当用户登录成功后，服务器会生成一个 Token，并将该 Token 发送给客户端。客户端在后续的请求中携带该 Token，服务器可以通过解析 Token 来验证用户的身份。使用 Token 的优点是可以让客户端缓存用户的登录状态，减轻服务器的负担，同时可以在不同的服务之间共享用户的登录状态。</p>
<p>在实现登录功能时，通常需要将用户的登录信息存储在服务器端，例如数据库、缓存等等。当用户登录成功后，服务器会创建 Session 或生成 Token，并将其返回给客户端。客户端可以将 Session ID 存储在 Cookie 中，或将 Token 存储在本地存储或会话存储中。在后续的请求中，客户端会将 Session ID 或 Token 发送回服务器，服务器可以根据 Session ID 或解析 Token 来验证用户的身份</p>
<h3 id="token-已经过期的话-我想要刷新-token-如何实现" tabindex="-1">token 已经过期的话，我想要刷新 token 如何实现 </h3>
<p>在实现 Token 刷新功能时，通常需要注意以下几个步骤：</p>
<ol>
<li>在服务器端，需要定义一个用于刷新 Token 的 API 接口，该接口需要验证当前 Token 的有效性，并根据需要生成一个新的 Token，并返回给客户端。</li>
<li>在客户端，当发现当前 Token 已经过期时，需要向服务器端发送一个刷新 Token 的请求，并将当前 Token 和刷新 Token 的回调函数传递给服务器端。</li>
<li>在服务器端，当收到客户端发送的刷新 Token 的请求时，需要验证当前 Token 的有效性。如果当前 Token 有效，生成一个新的 Token，并将其返回给客户端。如果当前 Token 无效，需要向客户端返回一个错误码或提示信息。</li>
<li>在客户端，当收到服务器端返回的新 Token 时，需要将新 Token 存储到本地存储或会话存储中，并调用刷新 Token 的回调函数</li>
</ol>
<h3 id="无感刷新-token" tabindex="-1">无感刷新 token </h3>
<p>在前后端分离的应用中，为了保证安全性和用户体验，通常会使用 token 来实现用户身份认证。当 token 过期时，需要重新获取新的 token，以保持用户的登录状态。在这种情况下，无感刷新 token 可以提高用户体验，使用户无需手动重新登录即可继续访问应用程序。</p>
<p>以下是一种基本的无感刷新 token 的实现思路：</p>
<ol>
<li>定义 token 的过期时间，例如 30 分钟。</li>
<li>在用户每次发送请求时，检查 token 是否快要过期，例如在 token 过期时间前 5 分钟进行检查。</li>
<li>如果 token 即将过期，发送一个请求给后端，请求新的 token。</li>
<li>如果后端返回新的 token，将新的 token 保存在本地，同时更新所有请求中的 token 值。</li>
<li>如果后端返回错误或者新的 token 无效，清除本地 token，跳转到登录页面。</li>
</ol>
<p>通过这种方式，即使 token 过期，用户也不需要手动重新登录即可继续使用应用程序，从而提高用户体验和应用程序的安全性。当然，具体实现细节可能因具体应用场景而异，需要根据实际情况进行调整。</p>
<h3 id="将上面的操作写在哪里呢" tabindex="-1">将上面的操作写在哪里呢？ </h3>
<p>在实现无感刷新 token 的过程中，主要涉及到两个方面的实现：前端和后端。</p>
<p>前端方面，可以在请求拦截器中实现 token 的检查和更新。可以通过在请求头中设置 Authorization 字段，将 token 发送给后端。当 token 即将过期时，可以在请求拦截器中发送一个刷新 token 的请求，并将新的 token 保存在本地存储中，同时更新所有请求的 Authorization 字段。这样，即使 token 过期，用户也无需手动刷新 token 即可继续使用应用程序。</p>
<p>后端方面，需要实现一个 token 的刷新接口，接收旧的 token 并返回新的 token。在处理刷新请求时，需要对旧的 token 进行验证，以确保该请求是合法的。如果验证通过，则生成新的 token 并返回给前端，否则返回错误信息。</p>
<p>总之，在实现无感刷新 token 的过程中，前端和后端都需要进行一定的实现。前端需要在请求拦截器中进行 token 的检查和更新，后端需要实现一个 token 的刷新接口，并对旧的 token 进行验证。同时，还需要定义 token 的过期时间，并根据实际情况进行调整</p>
<h3 id="响应拦截器的功能" tabindex="-1">响应拦截器的功能 </h3>
<p>响应拦截器是前端网络请求中一个非常重要的概念，它的主要功能是在从服务器接收到响应数据之后，对响应数据进行处理，然后再将其返回到调用处。</p>
<p>响应拦截器的主要功能包括以下几个方面：</p>
<ol>
<li>错误处理：响应拦截器可以检查响应数据中是否存在错误信息，例如请求失败、权限不足等。如果存在错误信息，则可以根据实际情况进行处理，例如跳转到错误页面、显示错误信息等。</li>
<li>数据处理：响应拦截器可以对响应数据进行处理，例如对数据进行格式化、过滤、排序等操作。这样可以提高应用程序的可读性和可维护性。</li>
<li>统一处理：响应拦截器可以对所有的响应数据进行统一处理，例如添加一些公共的响应头、对返回的数据进行加密等操作。这样可以提高应用程序的安全性和可扩展性。</li>
<li>token 刷新：响应拦截器可以在响应数据中检查 token 的过期时间，如果即将过期，则可以自动进行 token 的刷新，从而实现无感刷新 token 的功能。</li>
<li>缓存处理：响应拦截器可以对响应数据进行缓存处理，例如将响应数据存储在本地存储中，以提高应用程序的性能和用户体验</li>
</ol>
<h3 id="反问-2" tabindex="-1">反问 </h3>
<ul>
<li>您对我的面试表现和之后学习前端的建议</li>
</ul>
<p>看我自己的兴趣，看我对之后的哪些技术比较感兴趣，然后说了好几分钟的一些我都没听过的前端技术/(ㄒ o ㄒ)/~~</p>
<p>一下子就感觉自己的前端之路才刚刚开始起步，后面的前端技术好多呀</p>
<ul>
<li>之后还会有二面吗？</li>
</ul>
<p>楠哥会给我消息，最迟是明天</p>
<ul>
<li>公司技术栈和技术氛围</li>
</ul>
<p>你知道你投递是小宇宙吧，我们公司小宇宙全是 react，然后很详细的给我介绍了 react 里的很多东西</p>
<h2 id="丁香园" tabindex="-1">丁香园 </h2>
<blockquote>
<p>面试体验最差的一家！面试官一进来就挎着个脸，怨气十足的样子，随便问了一个八股就开始手撕，因为当时我心里想着另一家公司的二面，所以没怎么走心了(互相 KPI？)</p>
</blockquote>
<ul>
<li>讲一下防抖和节流</li>
<li>手撕一下</li>
<li>做个算法(内容我忘记了)</li>
</ul>
<p>反问环节，不好意思 😅 完全不想反问你任何问题，然后面试官就嘲讽了我一顿就挂电话了 😅</p>
<h2 id="合合信息" tabindex="-1">合合信息 </h2>
<blockquote>
<p>面试官是一个听声音感觉年纪蛮大的一个人，人很和蔼！很愉快的一次面试</p>
</blockquote>
<p>上来面试官就自我介绍，然后介绍公司，然后就问我有什么需要反问的？第一次遇见这种情况哈哈哈</p>
<h3 id="vue-响应式原理" tabindex="-1">vue 响应式原理 </h3>
<h3 id="http1-和-http1-1-的区别" tabindex="-1">http1 和 http1.1 的区别 </h3>
<p>HTTP（Hypertext Transfer Protocol）是用于在 Web 上传输数据的协议。HTTP / 1.0 和 HTTP / 1.1 是两个版本的 HTTP 协议，下面是它们之间的一些区别：</p>
<ol>
<li>持久连接：HTTP / 1.1 引入了持久连接，这意味着在单个 TCP 连接上可以发送多个请求/响应对，从而减少了每个请求的延迟。HTTP / 1.0 在每个请求/响应之后关闭 TCP 连接。</li>
<li>块传输编码：HTTP / 1.1 支持块传输编码，这意味着可以在接收响应时逐步解压缩数据，而不必等待整个响应。这对于处理大型响应或流式数据非常有用。</li>
<li>身份验证：HTTP / 1.1 提供了更安全的身份验证方法，例如基于令牌的身份验证方案，可以替代 HTTP / 1.0 中的基本身份验证。</li>
<li>缓存处理：HTTP / 1.1 对缓存处理进行了改进，包括新的 Cache-Control 指令，可以更好地控制缓存行为。</li>
<li>响应码：HTTP / 1.1 引入了更多的响应码，例如“100 Continue”，这使得客户端可以更好地控制它们的请求行为。</li>
<li>主机头字段：HTTP / 1.1 要求在每个请求中都包含主机头字段，这使得服务器可以更好地处理多个虚拟主机。</li>
<li>管道化：HTTP / 1.1 支持管道化，允许客户端同时发送多个请求，从而提高性能。HTTP / 1.0 不支持管道化。</li>
</ol>
<h3 id="除了前端你其他的学的怎么样-比如计算机组成原理和网络之类的" tabindex="-1">除了前端你其他的学的怎么样？比如计算机组成原理和网络之类的 </h3>
<p>其他的我不太行诶(这里希望是别问太难)，结果面试官就笑了，说那咱们就不问了</p>
<p>然后就开始闲聊了 😂</p>
<blockquote>
<p>这里面试官建议我好好学学计算机基础那些，那些相比于前后端的技术，可以让我在 AI 的冲击下走的更远，心里也蛮有感触的，毕竟大家都看见了 chatGPT 带来的威力，算是一次很轻松愉快的面试吧</p>
</blockquote>
<h2 id="同程旅行" tabindex="-1">同程旅行 </h2>
<h3 id="项目-1" tabindex="-1">项目 </h3>
<p>看得出来面试官是提前对我的简历看了很多的，一上来就先对我的项目进行了分析，然后问我最近的一次实习（就这个最近的一次实习直接把我整不会了，一下就紧张了起来 😭）和项目是什么时候</p>
<blockquote>
<p>我最近还没有实习，零经验，我直接介绍我自己的项目可以吗？</p>
</blockquote>
<p>这里感觉自己介绍的项目太拉胯了，没有很好的体现出自己的项目，接下来应该将自己的项目进行概括才行啊</p>
<h4 id="你为什么要用-jsx-进行开发组件库呢-有什么好处呢" tabindex="-1">你为什么要用 jsx 进行开发组件库呢？有什么好处呢？ </h4>
<p>JSX 是 React 中一种用于编写组件的语法，它可以将 HTML 和 JavaScript 结合起来，让开发者更加方便地编写动态组件。使用 JSX 进行组件库开发的好处如下：</p>
<blockquote>
<ol>
<li>增加可读性和可维护性：JSX 让代码看起来更像是 HTML 模板，这使得代码更容易阅读和理解，也更容易进行修改和维护。</li>
<li>提高开发效率：使用 JSX 可以减少开发者在编写组件时需要编写的模板代码，这可以减少代码量，提高开发效率。</li>
<li>更好的性能：JSX 可以通过使用虚拟 DOM 来优化组件渲染性能。React 在每次组件更新时会生成新的虚拟 DOM 树，并与旧的虚拟 DOM 树进行比较，然后只更新需要更新的部分，从而提高渲染效率。</li>
<li>易于与 React 集成：React 是一种流行的前端框架，使用 JSX 可以使组件库更容易与 React 集成，从而提高组件库的适用性。</li>
</ol>
</blockquote>
<p>综上所述，使用 JSX 进行组件库开发可以提高开发效率、可读性和可维护性，并且可以提高组件渲染性能，从而使组件库更加适用于 React 等前端框架</p>
<h4 id="pinia-在这个项目里解决了什么问题" tabindex="-1">pinia 在这个项目里解决了什么问题 </h4>
<p>在一个 Vue 3 项目中使用 Pinia 可以解决以下问题：</p>
<blockquote>
<ol>
<li>简化状态管理：Pinia 提供了一个简洁的 API，使得我们可以更容易地定义和管理状态，并在整个应用程序中共享它们。</li>
<li>更好的类型支持：Pinia 提供了一个类型安全的 API，可以让我们更容易地编写类型安全的代码，并减少错误。</li>
<li>更好的可测试性：Pinia 的状态管理使得我们可以更容易地对 Vue 3 组件进行单元测试，从而提高代码的可测试性。</li>
<li>更好的性能：Pinia 的状态管理实现了基于 Proxy 的响应式系统，从而提高了性能并减少了不必要的重渲染</li>
</ol>
</blockquote>
<p>综上所述，Pinia 能够帮助我们更好地管理 Vue 3 应用程序中的状态，并且提供了更好的类型支持、可测试性和性能，从而使得我们可以更容易地编写高质量的 Vue 3 应用程序。在这个项目中使用 Pinia，可以提高项目的开发效率和代码质量</p>
<h4 id="pinia-的-store-你是如何进行设计的" tabindex="-1">pinia 的 store 你是如何进行设计的 </h4>
<p>在设计 Pinia 的 store 时，我们通常需要考虑以下几个方面：</p>
<blockquote>
<ol>
<li>状态的划分：我们需要考虑应用程序中需要管理的状态，并根据不同的功能和需求进行划分。通常情况下，我们会将状态划分为多个 store，每个 store 管理一部分相关的状态。</li>
<li>Store 的命名：我们需要为每个 store 提供一个唯一的名称，以便在整个应用程序中引用它们。</li>
<li>Store 的定义：我们需要定义每个 store 的结构，包括 store 的状态、getter、mutation 和 action 等。</li>
<li>Store 的注册：我们需要将定义好的 store 注册到应用程序中，以便在应用程序的其他地方使用。</li>
<li>Store 的使用：我们需要在组件中使用 store，通过 getter 获取 store 的状态，并在需要时通过 mutation 和 action 来修改 store 的状态。</li>
</ol>
</blockquote>
<p>在实际的应用程序中，我们通常会根据具体的业务需求来设计 store 的结构和划分。一般来说，我们会将相关的状态放在一个 store 中，并通过模块化的方式来组织多个 store，从而实现更好的可维护性和可扩展性。</p>
<p>在使用 Pinia 的过程中，可以参考官方文档提供的示例和最佳实践，以便更好地设计和管理 store，从而提高应用程序的性能和可维护性</p>
<h4 id="你的-store-有进行模块的拆分吗-还是说放在一起" tabindex="-1">你的 store 有进行模块的拆分吗？还是说放在一起 </h4>
<p>在实际应用程序中，将 store 模块化并组织成多个文件通常是比较好的实践，这有助于提高应用程序的可维护性和可扩展性。</p>
<p>通常情况下，我们会将 store 模块化为多个文件，每个文件对应一个 store 模块，然后通过 Vuex 的模块化功能来组织它们。每个 store 模块负责管理自己的状态、getter、mutation 和 action，并且可以通过模块间的调用来实现跨 store 的状态共享。</p>
<p>模块化的方式可以使得 store 更加易于维护和扩展，因为每个模块只负责自己的一部分功能，而不会将所有的状态都放在同一个 store 中，从而导致代码的臃肿和难以维护。</p>
<p>在使用 Pinia 时，同样可以将 store 模块化为多个文件，并使用 Pinia 提供的模块化功能来组织它们。每个 store 模块也负责管理自己的状态、getter、mutation 和 action，并且可以通过其他 store 模块的调用来实现跨 store 的状态共享。</p>
<p>综上所述，将 store 模块化并组织成多个文件是一个比较好的实践，可以提高应用程序的可维护性和可扩展性</p>
<h4 id="你做的组件库当中有遇见什么困难吗-可以举例说明" tabindex="-1">你做的组件库当中有遇见什么困难吗？可以举例说明 </h4>
<h3 id="html5" tabindex="-1">html5 </h3>
<h4 id="h5-当中新增了哪些" tabindex="-1">h5 当中新增了哪些 </h4>
<p>以下是 HTML5 中一些新增的功能和特性：</p>
<ol>
<li>新的语义化标签：HTML5 新增了一些语义化标签，如 <code>&lt;header&gt;</code>、<code>&lt;footer&gt;</code>、<code>&lt;nav&gt;</code>、<code>&lt;article&gt;</code>、<code>&lt;section&gt;</code>、<code>&lt;aside&gt;</code> 等，可以更好地描述页面的结构和内容，有助于提高页面的可读性和可访问性。</li>
<li>多媒体支持：HTML5 提供了更好的多媒体支持，包括 <code>&lt;audio&gt;</code> 和 <code>&lt;video&gt;</code> 标签，可以直接在网页中嵌入音频和视频。</li>
<li>本地存储：HTML5 提供了本地存储功能，包括 localStorage 和 sessionStorage，可以在客户端浏览器中存储数据，从而提高应用程序的性能和用户体验。</li>
<li>Web Workers：HTML5 中新增了 Web Workers，可以在后台线程中执行 JavaScript 代码，从而提高应用程序的性能和响应速度。</li>
<li>Canvas：HTML5 中新增了 <code>&lt;canvas&gt;</code> 标签，可以在网页中绘制各种图形和动画，有助于实现更加复杂的交互效果。</li>
<li>地理位置 API：HTML5 提供了地理位置 API，可以获取用户的地理位置信息，有助于实现基于地理位置的应用。</li>
<li>Web Socket：HTML5 中新增了 Web Socket，可以实现双向通信，从而实现更加实时和高效的应用程序。</li>
<li>Web Storage：HTML5 中新增了 Web Storage，可以在客户端浏览器中存储数据，从而提高应用程序的性能和用户体验。</li>
</ol>
<p>综上所述，HTML5 提供了许多新的功能和特性，可以帮助开发人员更加方便地实现一些复杂的应用场景，提高应用程序的性能和用户体验</p>
<h3 id="html-的行内元素和块级元素的区别-都有哪些" tabindex="-1">html 的行内元素和块级元素的区别，都有哪些 </h3>
<p>HTML 元素可以分为两类：行内元素和块级元素。它们的主要区别在于：</p>
<ol>
<li>显示方式：块级元素在页面上以块的形式展现，它会占据一整行的空间，可以设置宽度、高度、内边距和外边距等属性。而行内元素则不会独占一行，它们在一行内按照从左到右的顺序排列，并且不能设置宽度、高度和内边距等属性。</li>
<li>内容模型：块级元素通常用于包含其他块级元素或行内元素，可以包含任何其他元素。而行内元素通常用于包含文本或其他行内元素，不能包含块级元素。</li>
<li>默认样式：块级元素通常具有明显的外观特征，例如：段落 <code>&lt;p&gt;</code> 元素会在前后添加空白，标题 <code>&lt;h1&gt;</code>~<code>&lt;h6&gt;</code> 元素会加粗并换行等等。而行内元素通常没有这些明显的外观特征，例如：超链接 <code>&lt;a&gt;</code> 元素只是有下划线，并且字体颜色有所变化等等。</li>
</ol>
<p>以下是一些常见的 HTML 块级元素和行内元素：</p>
<p>块级元素：</p>
<ul>
<li><code>&lt;div&gt;</code></li>
<li><code>&lt;p&gt;</code></li>
<li><code>&lt;h1&gt;</code>~<code>&lt;h6&gt;</code></li>
<li><code>&lt;ul&gt;</code>、<code>&lt;ol&gt;</code>、<code>&lt;li&gt;</code></li>
<li><code>&lt;table&gt;</code></li>
<li><code>&lt;form&gt;</code></li>
<li><code>&lt;hr&gt;</code></li>
<li><code>&lt;header&gt;</code>、<code>&lt;footer&gt;</code>、<code>&lt;nav&gt;</code>、<code>&lt;section&gt;</code> 等 HTML5 新增的语义化标签</li>
</ul>
<p>行内元素：</p>
<ul>
<li><code>&lt;a&gt;</code></li>
<li><code>&lt;span&gt;</code></li>
<li><code>&lt;strong&gt;</code>、<code>&lt;em&gt;</code></li>
<li><code>&lt;img&gt;</code></li>
<li><code>&lt;input&gt;</code></li>
<li><code>&lt;label&gt;</code></li>
<li><code>&lt;br&gt;</code></li>
<li><code>&lt;button&gt;</code></li>
<li><code>&lt;select&gt;</code></li>
<li><code>&lt;textarea&gt;</code></li>
</ul>
<h4 id="img-说行内还是块呢-span-说行内还是块" tabindex="-1">img 说行内还是块呢？span 说行内还是块 </h4>
<p><img> 元素默认是行内元素，但可以通过设置 display 属性为 block 或 inline-block 等值来改变其显示方式。</p>
<p><code>&lt;span&gt;</code> 元素是一个纯粹的行内元素，它不能包含块级元素，但可以包含其他行内元素。</p>
<h3 id="css-1" tabindex="-1">css </h3>
<h4 id="盒子模型" tabindex="-1">盒子模型 </h4>
<p>盒子模型是指 HTML 元素在渲染时呈现为一个矩形盒子的模型。这个矩形盒子包含了元素的内容、内边距（padding）、边框（border）和外边距（margin）等部分。</p>
<p>具体来说，盒子模型包含以下几个部分：</p>
<ol>
<li>内容区域（content area）：元素内部的实际内容，包括文本、图像、嵌套的元素等。</li>
<li>内边距（padding）：内容区域和边框之间的空白区域，可以通过 CSS 属性 <code>padding</code> 或 <code>padding-*</code> 来设置。</li>
<li>边框（border）：包围内容和内边距的线条，可以通过 CSS 属性 <code>border</code> 或 <code>border-*</code> 来设置。</li>
<li>外边距（margin）：边框和周围元素之间的空白区域，可以通过 CSS 属性 <code>margin</code> 或 <code>margin-*</code> 来设置。</li>
</ol>
<p>盒子模型在 Web 页面布局中扮演着重要的角色，可以用来控制元素的尺寸、位置、边距和内边距等方面的表现。默认情况下，元素的尺寸是指内容区域的大小，但是通过设置 <code>box-sizing</code> 属性可以改变元素尺寸的计算方式，使其包括内边距和边框</p>
<h4 id="will-change" tabindex="-1">will-change </h4>
<p><a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS" target="_blank" rel="noreferrer">CSS</a> 属性 <code>will-change</code> 为 web 开发者提供了一种告知浏览器该元素会有哪些变化的方法，这样浏览器可以在元素属性真正发生变化之前提前做好对应的优化准备工作。这种优化可以将一部分复杂的计算工作提前准备好，使页面的反应更为快速灵敏</p>
<p>链接：<a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/will-change" target="_blank" rel="noreferrer">https://developer.mozilla.org/zh-CN/docs/Web/CSS/will-change</a></p>
<h4 id="垂直居中布局" tabindex="-1">垂直居中布局 </h4>
<h4 id="translate-是基于自身还是父元素" tabindex="-1">translate 是基于自身还是父元素 </h4>
<p><code>translate()</code> 是一种 CSS <code>transform</code> 函数，用于在元素上进行平移变换。它是相对于元素自身的位置进行平移，而不是相对于父元素或其他元素。</p>
<p>具体来说，<code>translate()</code> 函数接受两个参数：<code>translate(x, y)</code>，其中 <code>x</code> 和 <code>y</code> 分别代表在水平和垂直方向上的平移距离。如果只给出一个参数，则默认为水平方向上的平移。</p>
<p><code>translate()</code> 函数的平移距离是相对于元素自身的初始位置进行计算的，而不受到父元素的影响。因此，如果我们想要实现相对于父元素进行平移，可以考虑使用 <code>position</code> 属性和 <code>top</code>、<code>bottom</code>、<code>left</code>、<code>right</code> 属性来控制元素的位置</p>
<h4 id="移动端兼容问题你是如何解决的" tabindex="-1">移动端兼容问题你是如何解决的 </h4>
<p>移动端兼容问题是前端开发中非常重要的一环，以下是我通常采用的一些解决方法：</p>
<ol>
<li>使用移动端适配方案：移动端设备的屏幕尺寸和像素密度差异较大，因此需要使用适配方案来保证页面在不同屏幕上显示效果一致。常见的适配方案有：rem、vw/vh、flexible.js 等。</li>
<li>使用 CSS3 和 ES6 功能时需要进行前缀处理：移动端的浏览器兼容性不如 PC 端，因此在使用 CSS3 和 ES6 功能时需要进行前缀处理，例如 <code>-webkit-</code>、<code>-moz-</code>、<code>-ms-</code>、<code>-o-</code> 等。</li>
<li>避免使用过多的图片和动画效果：移动设备的网络环境和硬件性能相对较弱，因此需要尽量减少页面中的图片数量和动画效果，以提高页面的加载速度和流畅性。</li>
<li>使用移动端专用的 UI 组件和交互方式：移动设备的操作方式和 PC 端有较大差异，因此需要使用移动端专用的 UI 组件和交互方式，例如滑动、轻扫、长按等。</li>
<li>针对不同设备的浏览器进行测试：移动设备的浏览器种类繁多，不同浏览器在兼容性上也有所不同，因此需要在开发完成后对不同设备的浏览器进行测试，以确保页面在各种浏览器上的兼容性。</li>
</ol>
<p>除此之外，还可以使用一些工具来帮助解决移动端兼容问题，例如 Autoprefixer 可以自动添加 CSS3 前缀，FastClick 可以解决移动端点击事件的延迟等</p>
<h4 id="css-的相对单位有哪些" tabindex="-1">css 的相对单位有哪些 </h4>
<p>在 CSS 中，相对单位有以下几种：</p>
<ol>
<li><code>em</code>：相对于父元素的字体大小。例如，如果父元素的字体大小为 16px，子元素的 <code>font-size</code> 设为 1.5em，则子元素的字体大小为 24px。</li>
<li><code>rem</code>：相对于根元素的字体大小。例如，如果根元素的字体大小为 16px，元素的 <code>font-size</code> 设为 1.5rem，则元素的字体大小为 24px。与 <code>em</code> 不同的是，<code>rem</code> 取决于根元素的字体大小，而不是父元素的字体大小。</li>
<li><code>vw</code> 和 <code>vh</code>：相对于视口宽度和高度的百分比。例如，如果视口宽度为 1000px，元素的 <code>width</code> 设为 50vw，则元素的宽度为 500px。</li>
<li><code>vmin</code> 和 <code>vmax</code>：相对于视口宽度和高度中较小或较大的那个值的百分比。例如，如果视口宽度为 1000px，视口高度为 800px，元素的 <code>width</code> 设为 50vmin，则元素的宽度为 400px（因为视口宽度为较大的值，所以按照视口宽度计算）。</li>
<li><code>%</code>：相对于父元素的宽度或高度的百分比。例如，如果父元素的宽度为 1000px，元素的 <code>width</code> 设为 50%，则元素的宽度为 500px。</li>
</ol>
<p>相对单位与绝对单位（如像素、英寸等）相比，具有更好的响应式特性，可以根据不同的屏幕尺寸和设备类型自适应地调整大小，因此在响应式设计中得到广泛应用</p>
<h3 id="计算机网络-1" tabindex="-1">计算机网络 </h3>
<h4 id="输入-url" tabindex="-1">输入 URL </h4>
<h4 id="渲染进程" tabindex="-1">渲染进程 </h4>
<h3 id="js-1" tabindex="-1">js </h3>
<h4 id="普通数据类型存储在哪里-堆还是栈" tabindex="-1">普通数据类型存储在哪里？堆还是栈 </h4>
<p>在 JavaScript 中，普通数据类型的值通常存储在栈内存中。栈是一种后进先出的数据结构，可以高效地管理函数调用和局部变量。</p>
<p>当我们声明一个变量并赋值时，JavaScript 引擎会为该变量分配一段栈内存，并将变量的值存储在其中。当该变量不再使用时，这段栈内存也会被释放，变成可用的空间。</p>
<p>常见的普通数据类型包括数字、字符串、布尔值、null 和 undefined 等。这些类型的值都比较简单，不需要过多的内存空间来存储，因此通常存储在栈内存中。</p>
<p>与普通数据类型不同，引用数据类型（如对象、数组、函数等）的值存储在堆内存中。堆内存是一种动态分配的内存空间，可以存储复杂的数据结构和对象。</p>
<p>当我们声明一个引用类型的变量时，JavaScript 引擎会为该变量分配一段栈内存，并将其指向堆内存中的实际值。因为引用类型的值通常比较复杂，包含大量的属性和方法，因此需要较大的内存空间来存储</p>
<h4 id="深拷贝和浅拷贝的区别。-让你实现一个深拷贝的思路" tabindex="-1">深拷贝和浅拷贝的区别。 让你实现一个深拷贝的思路 </h4>
<p>深拷贝和浅拷贝都是对于复杂数据类型进行复制的操作，区别在于复制的方式不同。</p>
<p>浅拷贝是指创建一个新对象，这个新对象有着原始对象属性值的一份精确拷贝，如果属性是基本类型，拷贝的就是基本类型的值，如果属性是引用类型，拷贝的就是内存地址，所以如果其中一个对象改变了这个地址，就会影响到另一个对象。</p>
<p>深拷贝是指创建一个新对象，这个新对象的值和原始对象的值完全没有关联，即便原始对象中有引用类型的属性，新对象也会开辟新的内存地址，完全拷贝一份新的对象，修改一个对象不会影响到另一个对象。</p>
<p>一个实现深拷贝的思路是：</p>
<ol>
<li>首先判断需要拷贝的对象是否是引用类型，如果是基本类型则直接返回该值。</li>
<li>如果是引用类型，则创建一个新的空对象或数组（取决于原始对象的类型）。</li>
<li>遍历原始对象的所有属性或元素，将它们的值递归地拷贝到新对象中，这个递归过程需要注意以下几点：
<ul>
<li>如果属性或元素的值是基本类型，则直接复制该值；</li>
<li>如果属性或元素的值是引用类型，则递归调用深拷贝函数，并将结果赋值给新对象的相应属性或元素。</li>
</ul>
</li>
<li>返回新对象或数组</li>
</ol>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> deepCopy</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">obj</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">typeof</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> obj </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">!==</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'object'</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ||</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> obj </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">===</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> null</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> obj</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> newObj</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> Array.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">isArray</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(obj) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">?</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">:</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {}</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> key</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> obj)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    newObj[key] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> deepCopy</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(obj[key])</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> newObj</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br></div></div><h4 id="除了这个方法你还有其他的思路吗-json-如果来做深拷贝存在哪些问题" tabindex="-1">除了这个方法你还有其他的思路吗？json 如果来做深拷贝存在哪些问题 </h4>
<p>除了递归拷贝之外，还有其他实现深拷贝的思路：</p>
<ol>
<li>使用 Object.assign()方法实现浅拷贝，然后对于每个属性值是引用类型的属性，再递归调用深拷贝函数。</li>
<li>使用 ES6 的展开运算符(…)实现浅拷贝，然后对于每个属性值是引用类型的属性，再递归调用深拷贝函数。</li>
<li>使用第三方库，如 Lodash 的_.cloneDeep()方法，该方法能够递归地深拷贝一个对象。</li>
</ol>
<p>使用 JSON.stringify()和 JSON.parse()方法进行深拷贝是一种常见的错误做法。虽然这种方法能够将一个对象序列化为 JSON 字符串，再将 JSON 字符串解析为一个新对象，但是存在以下几个问题：</p>
<ul>
<li>该方法只能序列化对象中的可枚举属性，不能序列化对象的原型链和方法。</li>
<li>如果对象中有循环引用（即一个对象引用了自身），则该方法会抛出错误。</li>
<li>该方法不能序列化 RegExp、Date、Map、Set 等特殊类型的对象，会将其序列化为字符串或空对象。</li>
</ul>
<p>因此，使用 JSON.stringify()和 JSON.parse()方法进行深拷贝并不可靠，建议使用其他方法实现深拷贝</p>
<h4 id="箭头函数的作用-箭头函数和普通函数的区别" tabindex="-1">箭头函数的作用，箭头函数和普通函数的区别 </h4>
<p>箭头函数是 ES6 中新增的一种函数定义方式，主要有以下几个作用：</p>
<ol>
<li>简化函数定义：箭头函数可以使用更短的语法定义函数，省略了 function 关键字和 return 语句。</li>
<li>更简洁的 this 指向：箭头函数没有自己的 this，它的 this 指向最近的一层非箭头函数作用域的 this，可以避免 this 指向混乱的问题。</li>
<li>更简洁的代码结构：箭头函数通常可以使代码更加简洁易懂，特别是当需要传递回调函数或者进行函数式编程时，箭头函数可以使代码更加简洁易读。</li>
</ol>
<p>与普通函数相比，箭头函数的主要区别在于 this 的指向和函数定义的语法结构：</p>
<ol>
<li>this 指向：箭头函数的 this 指向在定义时就已经确定了，指向最近的一层非箭头函数作用域的 this。而普通函数的 this 指向在运行时才能确定，可能会受到调用方式、绑定方式等多种因素的影响。</li>
<li>语法结构：箭头函数省略了 function 关键字和 return 语句，更加简洁明了。同时，箭头函数的参数只有一个时可以省略括号，而普通函数的参数需要用括号括起来。</li>
</ol>
<p>需要注意的是，由于箭头函数的 this 指向与普通函数不同，因此在某些场景下可能会出现错误的结果。此外，箭头函数也不能作为构造函数使用，因为它没有自己的 this。因此，需要根据实际情况选择合适的函数定义方式</p>
<h4 id="箭头函数的-this-指向哪里-它的-this-可以被改变吗" tabindex="-1">箭头函数的 this 指向哪里？它的 this 可以被改变吗 </h4>
<p>箭头函数的 this 指向在函数定义时就已经确定了，它的 this 指向的是定义时所在的作用域中的 this，而不是在调用时所在的作用域。</p>
<p>具体来说，箭头函数的 this 指向最近的一层非箭头函数作用域的 this。如果箭头函数本身没有定义作用域，则指向全局对象。这与普通函数不同，普通函数的 this 指向在调用时才能确定，可能会受到调用方式、绑定方式等多种因素的影响。</p>
<p>由于箭头函数的 this 指向在定义时就已经确定，因此它的 this 不能被改变。即使使用 apply、call 等方法来改变 this 指向，也无法改变箭头函数的 this 指向。</p>
<p>需要注意的是，箭头函数的 this 指向是静态的，不能动态改变，因此在某些场景下可能会出现错误的结果。在这种情况下，可以使用普通函数来替代箭头函数，或者使用 bind 方法来绑定 this 指向</p>
<h4 id="typeof-检测-null" tabindex="-1">typeof 检测 null </h4>
<p>使用 typeof 检测 null 的结果是”<code>object</code>“。</p>
<p>这是因为在 JavaScript 中，null 被认为是一个空对象引用。虽然它不是对象，但 typeof 检测 null 的结果是”object”，这是一个历史遗留问题。在 ES6 中，通过 Symbol.hasInstance 方法可以正确地检测 null，但它并不常用。如果需要判断一个值是否为 null，可以直接使用严格等于（===）运算符，因为 null 只等于它本身，不等于任何其他值</p>
<h4 id="了解微前端吗-微前端目前业内的解决方案-阿里的乾坤了解吗" tabindex="-1">了解微前端吗？微前端目前业内的解决方案 阿里的乾坤了解吗 </h4>
<p>微前端是一种将前端应用程序拆分为更小、更容易管理的部分的架构风格，每个部分可以独立地开发、测试、部署和扩展。它的主要目的是解决单体应用程序的复杂性和可维护性问题，以及不同应用程序之间的耦合问题。</p>
<p>在业内，目前有许多微前端的解决方案，包括 Single-SPA、qiankun、Mosaic、Piral、Luigi 等等。这些解决方案都有各自的优缺点和适用场景，可以根据实际需求进行选择。</p>
<p>阿里的 qiankun 是一种在 React、Vue、Angular 等前端框架上实现微前端的解决方案。它使用了主应用和子应用的概念，主应用负责整体框架的搭建和管理子应用，子应用则可以使用不同的前端框架进行开发。qiankun 提供了统一的路由、状态管理、样式隔离等功能，可以有效地实现微前端架构</p>
<h4 id="微前端的好处" tabindex="-1">微前端的好处 </h4>
<ol>
<li>技术栈无关性：不同的团队可以使用不同的技术栈来开发不同的微前端应用，而这些应用可以无缝地集成到一个统一的应用中，不会出现技术栈不一致的问题。</li>
<li>模块化开发：每个微前端应用都是独立开发的，可以根据需求进行拆分成多个小模块，每个模块可以独立开发、测试、部署和升级，从而提高了开发效率和代码质量。</li>
<li>独立部署：每个微前端应用都是独立部署的，可以快速部署新的功能和修复 bug，而不需要整个应用重新部署，从而提高了部署效率和灵活性。</li>
<li>高可维护性：由于每个微前端应用都是独立开发、测试、部署和升级的，因此可以更容易地维护和更新每个应用，从而提高了整个应用的可维护性。</li>
<li>更好的扩展性：微前端应用可以在需要时独立开发和扩展，可以更好地满足业务需求，同时也可以更容易地扩展到新的平台和设备</li>
</ol>
<h4 id="数组如何进行扁平化的处理-给你几个多维数组-将其平展开来" tabindex="-1">数组如何进行扁平化的处理？给你几个多维数组，将其平展开来 </h4>
<p>数组扁平化可以将多维数组转化为一维数组，常用的方法有递归方法和非递归方法。以下是一些实现方法：</p>
<h4 id="递归方法" tabindex="-1">递归方法 </h4>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> flatten</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">arr</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> result </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> []</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  arr.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">forEach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">((</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">item</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (Array.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">isArray</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(item))</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      result </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> result.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">concat</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">flatten</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(item))</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    else</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      result.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">push</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(item)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  })</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> result</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// 示例</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> arr1</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">], </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">6</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">7</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">9</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]]]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">flatten</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(arr1)) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// [1, 2, 3, 4, 5, 6, 7, 8, 9]</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br></div></div><h4 id="非递归方法" tabindex="-1">非递归方法 </h4>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> flatten</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">arr</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> result</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> []</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> stack</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">arr]</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  while</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (stack.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">length</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> item</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> stack.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">pop</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (Array.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">isArray</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(item))</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      stack.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">push</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">item)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    else</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      result.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">unshift</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(item)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> result</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// 示例</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> arr2</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">], </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">6</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">7</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">9</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]]]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">flatten</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(arr2)) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// [1, 2, 3, 4, 5, 6, 7, 8, 9]</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br></div></div><h4 id="es6-方法" tabindex="-1">ES6 方法 </h4>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> flatten</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">arr</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> arr.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">flat</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(Number.POSITIVE_INFINITY)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// 示例</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> arr3</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">], </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">5</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">6</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">7</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">9</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]]]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">flatten</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(arr3)) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// [1, 2, 3, 4, 5, 6, 7, 8, 9]</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br></div></div><p>需要注意的是，如果数组元素中包含了对象、函数等复杂类型，则需要根据具体情况进行处理</p>
<p>flat 参考链接：<a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/flat" target="_blank" rel="noreferrer">https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/flat</a></p>
<h3 id="场景题" tabindex="-1">场景题 </h3>
<h4 id="实现一个功能-我在页面-a-点击了一个按钮-进入页面-b-这个时候我在页面-b-进行了一个操作-这时候如何让-a-进行一个刷新-也就是如何实现两个进程的通信" tabindex="-1">实现一个功能，我在页面 A 点击了一个按钮，进入页面 B，这个时候我在页面 B 进行了一个操作，这时候如何让 A 进行一个刷新，也就是如何实现两个进程的通信 </h4>
<p>实现两个进程的通信可以通过以下几种方式：</p>
<ol>
<li>使用浏览器的 <code>localStorage</code> 或者 <code>sessionStorage</code> 来存储需要传递的数据，然后在另一个页面中读取存储的数据并进行处理。需要注意的是，存储的数据类型必须是字符串，因此需要使用 <code>JSON.stringify</code> 和 <code>JSON.parse</code> 进行数据的转换。</li>
</ol>
<p>示例代码：</p>
<p>在页面 A 中：</p>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">localStorage.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">setItem</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'data'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">JSON</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">stringify</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({ name: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'John'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, age: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">25</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }))</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// 跳转到页面B</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">window.location.href </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'pageB.html'</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><p>在页面 B 中：</p>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// 从localStorage中读取数据</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> data</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> JSON</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">parse</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(localStorage.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">getItem</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'data'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">))</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// 处理数据</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(data.name, data.age) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// John 25</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// 删除localStorage中的数据</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">localStorage.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">removeItem</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'data'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// 触发页面A的刷新</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">window.location.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">reload</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div><ol>
<li>使用浏览器的 <code>window.postMessage</code> 方法进行跨窗口通信。该方法可以在不同窗口之间传递数据，并且不同窗口可以处于不同的域名和协议下。</li>
</ol>
<p>示例代码：</p>
<p>在页面 A 中：</p>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// 在A页面中注册message事件的监听器</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">window.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">addEventListener</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'message'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">event</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (event.origin </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">!==</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'http://localhost:3000'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    // 如果不是指定的来源，不予处理</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  // 处理接收到的数据</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(event.data)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  // 触发页面A的刷新</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  window.location.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">reload</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">})</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// 在A页面中向B页面发送数据</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">window.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">open</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'pageB.html'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br></div></div><p>在页面 B 中：</p>
<div class="language- line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span>// 在B页面中向A页面发送数据</span></span>
<span class="line"><span>window.opener.postMessage({ name: 'John', age: 25 }, 'http://localhost:3000');</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><p>需要注意的是，该方法存在跨站点脚本攻击（XSS）的风险，因此需要在处理消息时进行数据的合法性检验，确保消息的来源和内容都是可信的。</p>
<ol>
<li>使用第三方的库来实现进程间通信，例如 SignalR、Socket.IO 等。这些库提供了更高级的通信功能，并且支持实时通信、广播消息等特性，但也需要相应的服务器支持。</li>
</ol>
<p>需要根据具体的场景和需求来选择合适的通信方式</p>
<h4 id="vue-的响应式系统。我分了-vue2-和-vue3-来讲" tabindex="-1">vue 的响应式系统。我分了 vue2 和 vue3 来讲 </h4>
<p>在 Vue 2 中，Vue 通过 Object.defineProperty() 来实现响应式系统。当一个对象被传入 Vue 实例进行响应式处理时，Vue 会遍历这个对象的每一个属性，并使用 Object.defineProperty() 把这个属性转换成 getter 和 setter。当这个属性被读取时，getter 会被触发，这个属性就会被添加到依赖中；当这个属性被修改时，setter 会被触发，这个属性的依赖就会被通知，并执行相应的更新操作。这样，当数据被修改时，所有依赖这个数据的地方都会自动更新。</p>
<p>但是，Vue 2 的响应式系统存在一些问题。首先，它只能监听对象的属性，而不能监听新增的属性和删除的属性；其次，它无法监听数组的变化，只能监听数组的索引变化，即当使用数组的 push、pop、shift、unshift、splice 等方法时才能触发更新。</p>
<p>在 Vue 3 中，Vue 引入了 Proxy 对象来实现响应式系统。当一个对象被传入 Vue 实例进行响应式处理时，Vue 会使用 Proxy 对象对这个对象进行代理，这样就可以监听新增的属性和删除的属性，同时也可以监听数组的变化。当一个属性被读取或修改时，Proxy 对象的 get 和 set 方法会被触发，这样就可以实现响应式更新。</p>
<p>Vue 3 的响应式系统还有一个优点，就是它支持了多个根节点，也就是 Fragment。这样可以在不需要添加额外的 DOM 节点的情况下，返回多个元素。</p>
<p>总体来说，Vue 3 的响应式系统更加灵活和高效，能够更好地应对复杂的应用场景</p>
<h4 id="vue2-是如何解决数组检测的问题" tabindex="-1">vue2 是如何解决数组检测的问题 </h4>
<p>在 Vue 2 中，对于数组的检测是通过对数组的原型进行改写来实现的。Vue 2 中通过 <code>Object.defineProperty()</code> 方法对数组原型上的 7 个变异方法进行<strong>重写</strong>，分别是 <code>push()</code>、<code>pop()</code>、<code>shift()</code>、<code>unshift()</code>、<code>splice()</code>、<code>sort()</code>、<code>reverse()</code>。在这些方法被调用时，除了执行它们本身的操作外，还会通知依赖更新。</p>
<p>当数据是数组类型时，Vue 会先判断该数组是否具有 <code>__ob__</code> 属性（Observer 对象），如果有则说明已经被观测过，直接返回该 <code>__ob__</code> 对象；如果没有，则会创建一个 <code>Observer</code> 对象来观测该数组，然后返回该 <code>__ob__</code> 对象。</p>
<p>虽然这种方式可以监听数组的变化，但是存在以下问题：</p>
<ol>
<li>监听不到索引值的变化，比如 <code>arr[1] = newValue</code>。</li>
<li>对象的新增和删除也需要进行额外处理。</li>
<li>遍历数组时会将数组中的每一项都进行依赖收集，造成性能问题。</li>
</ol>
<p>Vue 提供了 <code>$set</code> 方法，可以用来给数组添加新元素或者修改已有元素的值，使得这些修改也能够被 Vue 监听到并更新视图。例如：</p>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">this</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">$set</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">this</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.array, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'new value'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p>这行代码会将 <code>array</code> 数组中索引为 <code>1</code> 的元素的值改为 <code>'new value'</code>，并通知 Vue 去更新视图。</p>
<p>除了 <code>$set</code> 方法，Vue 还提供了 <code>$delete</code> 方法来删除数组中的元素</p>
<p>为了解决这些问题，Vue 3 采用了更加高效的响应式系统</p>
<h4 id="vue2-的缺陷-性能问题。如果-data-里的层次很深的话-进行多层次的监听开销是很大的" tabindex="-1">vue2 的缺陷，性能问题。如果 data 里的层次很深的话，进行多层次的监听开销是很大的 </h4>
<p>Vue 2 在进行响应式处理时，会递归遍历数据对象中的每一个属性，并将这些属性转化为 getter 和 setter。当数据层次比较深时，这种递归遍历的开销就会非常大，会导致页面渲染性能下降。</p>
<p>除此之外，Vue 2 还存在以下性能问题：</p>
<ol>
<li>每个组件都会创建自己的观察者 Watcher 实例，当组件数量较多时，会导致大量的内存开销和性能问题；</li>
<li>每次数据变化都会导致重新渲染整个组件，即使数据变化的影响仅限于某个子组件；</li>
<li>在大型列表渲染时，使用 v-for 进行循环渲染会产生大量的 DOM 操作，影响渲染性能</li>
</ol>
<h4 id="vue-的模版解析过程" tabindex="-1">vue 的模版解析过程 </h4>
<p>在 Vue 中，模板是由 HTML 代码和 Vue 特定的模板语法组成的。Vue 的模板编译器会将模板编译成渲染函数，然后再生成 Virtual DOM，最终进行渲染。</p>
<p>下面是 Vue 的模板解析过程：</p>
<ol>
<li>解析模板，生成 AST 抽象语法树：Vue 的编译器会将模板转换为 AST 抽象语法树，这是一个树形结构，代表了模板的结构，包括元素节点、文本节点、指令等。</li>
<li>优化 AST：在生成 AST 之后，Vue 的编译器会对其进行优化，例如静态节点提取、静态根节点提取等优化操作，以提高渲染性能。</li>
<li>生成代码：最后，Vue 的编译器会将 AST 转换为渲染函数的代码。这个渲染函数是一个 JavaScript 函数，接收一个参数 h，返回一个 Virtual DOM 节点。</li>
<li>生成 Virtual DOM：渲染函数生成后，Vue 会使用它来生成 Virtual DOM，然后对比新旧 Virtual DOM，计算出需要更新的部分，最终只更新需要更新的部分。</li>
<li>渲染：最后，Vue 将更新后的 Virtual DOM 渲染到真实的 DOM 中。</li>
</ol>
<p>这个过程是 Vue 的模板编译过程的核心，也是 Vue 能够高效渲染页面的重要原因</p>
<h3 id="反问-3" tabindex="-1">反问 </h3>
<ul>
<li>你对我的面试表现怎么样</li>
</ul>
<blockquote>
<p>挺好的 基础问题基本上都回答的出来，前端的广度还不够 挺好的</p>
</blockquote>
<ul>
<li>还会有二面吗？</li>
</ul>
<blockquote>
<p>这个我们得和后面的小组商量一下</p>
</blockquote>
<ul>
<li>同程旅行的技术栈是什么？</li>
</ul>
<blockquote>
<p>苏州这边是 vue2 为主，做一个低代码平台的组件化</p>
</blockquote>
<h3 id="同程旅行二面" tabindex="-1">同程旅行二面 </h3>
<blockquote>
<p>二面是业务部门负责人+HRBP 面，很轻松愉快的一次面试</p>
</blockquote>
<p>基本上就是闲聊，问我对前端的一些看法，还有实习、到时候答辩会怎么解决之类的，顺便问了我为什么掘金 ID 叫八岁小孩学编程，是八岁就开始了吗 😂 我连忙回答说是乱取的一个名字，然后就是很愉快的交流了</p>
<h3 id="后续" tabindex="-1">后续 </h3>
<p>成功 OC 了，打算去苏州实习咯，这边也和辅导员商量好了，等正式 offer 邮件下来就去打印出来，和学校申请去实习了，我的三月份面试也在这里画上了一个还算完美的句号了，谢谢同程的收留哈哈哈，也谢谢除丁香园以外的每个面试官 😽</p>]]></content:encoded>
            <author>isolcat</author>
        </item>
        <item>
            <title><![CDATA[23 年 3 月份学习动态 ]]></title>
            <link>https://chodocs.cn//weekly/202303.html</link>
            <guid isPermaLink="false">https://chodocs.cn//weekly/202303.html</guid>
            <pubDate>Sat, 25 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[23 年 3 月份学习动态  第一周  这是三月份的第一周打卡，因为也是我们星球周打卡活动的开端，作为发起人我就优先在周五先发一下，之后的每次打卡会和大家一样，会在周末打卡。同时也是提供一下参考的模版，当然，大家学习的内容各不相同，按自己想法来就好，如下： 学习内容  本周学完了一本小册《TypeScript 类型体操通关秘籍》，同时写了阅读之后的体验，晚点会更新在星球专栏内。 文章分享  关于春]]></description>
            <content:encoded><![CDATA[<h2 id="第一周" tabindex="-1">第一周 </h2>
<p>这是三月份的第一周打卡，因为也是我们星球周打卡活动的开端，作为发起人我就优先在周五先发一下，之后的每次打卡会和大家一样，会在周末打卡。同时也是提供一下参考的模版，当然，大家学习的内容各不相同，按自己想法来就好，如下：</p>
<h3 id="学习内容" tabindex="-1">学习内容 </h3>
<p>本周学完了一本小册《TypeScript 类型体操通关秘籍》，同时写了阅读之后的体验，晚点会更新在星球专栏内。</p>
<h3 id="文章分享" tabindex="-1">文章分享 </h3>
<p><a href="https://t.zsxq.com/0bf8fNomJ" target="_blank" rel="noreferrer">关于春季实习招聘</a></p>
<p><a href="https://t.zsxq.com/0by8JSkOb" target="_blank" rel="noreferrer">关于日常实习如何准备写了一篇回答</a></p>
<h3 id="工作内容" tabindex="-1">工作内容 </h3>
<p>本周工作没啥新鲜的，就不谈了。</p>
<h3 id="其它" tabindex="-1">其它 </h3>
<p>剩余时间就是在整理这周末会出的星球内部共享小册，关于过去的一些前端面试总结的整理。其次，就是在思考怎样让之后的带项目更有新意一点，方式倒是确定了，但需要一段时间先准备文档，这样大家都能参与进来，预计的话应该是 4 月份开始项目实战，3 月份找工作比较重要，正好有时间先让我准备一下。</p>
<p>写于 2023 年 3 月 3 日晚。</p>
<h2 id="第二周" tabindex="-1">第二周 </h2>
<p>这是三月份的第二周打卡，本周我们开始了 Next.js 实战环节，可查看如下推文的介绍：</p>
<p><a href="https://t.zsxq.com/0clrMC9vv" target="_blank" rel="noreferrer">Next.js 实战内容</a></p>
<p>如果你也要学习 Next.js 或者说学一下 React，随时可以加入都行，每一步都会有文档同步（会放在星球专栏里），往期的内容看一下就好了。目前我们还是采用闭源开发，仅邀请星球内小伙伴参与，至少也能熟悉一下 github 以及协作开发是吧。</p>
<p>接下来说一下这几天在做的事，自己折腾设计了一下 logo，勉勉强强吧，看得过去就行。然后这两天也在做 next.js 启动模版以及添加了一个 og 工具，如图一二三所示。</p>
<p>og 工具主要是为项目 seo 做优化，而启动模版是为了让零基础的同学也能直接上手 Next.js，如果前期不会玩 github，那么可以先拉一份启动模版，给自己创立一个私有仓库，看着我们的 commit 自己动手实现一遍，其实自己动手了，看几遍提供的文档（马上会总结在星球专栏里），流程自然也就会了，那么就可以直接来到仓库一起参与开发了。</p>
<p>至于命名 ChoNext，也是希望这个组织是个 Next.js 项目集合，多往里面折腾点有意思的项目。</p>
<h3 id="学习内容-1" tabindex="-1">学习内容 </h3>
<p>阅读了关于 Next.js 的文章，这位博主我很喜欢，当初搭建 Next.js 与 Tailwind CSS starter 就是用的他的开源项目，我的开源博客项目也是基于他的魔改的，可以从他的博客找到 github 地址，如下：</p>
<p><a href="https://theodorusclarence.com/blog/nextjs-redirect-no-flashing" target="_blank" rel="noreferrer">Next.js Redirect Without Flashing Content</a></p>
<p><a href="https://theodorusclarence.com/blog/nextjs-fetch-method" target="_blank" rel="noreferrer">Understanding Next.js Data Fetching (CSR, SSR, SSG, ISR</a></p>
<p><a href="https://theodorusclarence.com/blog/nextjs-fetch-usecase" target="_blank" rel="noreferrer">How to choose between Next.js CSR, SSR, SSG, and ISR</a></p>
<p>对于前端主流的渲染方式，如 CSR、SSR、SSG、ISR 虽然面试的话对于后两者考察比较少，但目前这两种在社区内比较活跃，比如 vitepress 就是 SSG，而 Next.js 这四种渲染方式都支持，并且可以根据不同的页面呈现不同的渲染方式，但后续看了 Nuxt3 也有，这两个框架感觉就是也会越来越像，那么我们掌握其中一个，对于另一个差不多就是依葫芦画瓢了。</p>
<p>后续继续读了下面这篇文章，ISR 与 SWR 结合，ISR 有个不足点就是只对下一个用户访问时显示新页面，当前用户不会，因此结合 SWR 能够让当前用户也能立即显示修改之后的新页面。</p>
<p><a href="https://joebell.co.uk/blog/updating-static-next-js-pages-instantly" target="_blank" rel="noreferrer">Updating Static Next.js Pages Instantly</a></p>
<p>在掘金刷到了如下裁员分析，总结一下就是人口红利不再，需要探索新玩法，移动互联网确实到了它该有的境界了，趋于平衡。</p>
<p><a href="https://juejin.cn/post/7201047960825774139" target="_blank" rel="noreferrer">互联网大裁员原因分析</a></p>
<p>对于 React 初学者以及工作中还不熟练地同学还是挺有帮助的，或许你不知道其中一些 Ref 用法，推荐读一读。</p>
<p><a href="https://juejin.cn/post/7205842390842458149" target="_blank" rel="noreferrer">使用 React18 + Vite + TypeScript 完成公司项目经验总结，学到了很多</a></p>
<p>以及观看了</p>
<p><a href="https://www.bilibili.com/video/BV1vx4y1V7VD/" target="_blank" rel="noreferrer">【Anthony Fu】Nuxt，进一步的开发者体验 | 直播录像</a></p>
<p>对于 Nuxt3 以及相关的工具非常期待！但同时我也希望这个工具出台也能卷一卷社区，哈哈，压力来到了 Next.js 这边。devtools 也开源了，如果有机会感觉也可以去试试做个 Next.js 版本的。</p>
<h3 id="英语" tabindex="-1">英语 </h3>
<p>最近一直在看英语兔的语法合集：</p>
<p><a href="https://www.bilibili.com/video/BV1XY411J7aG/" target="_blank" rel="noreferrer">英语语法精讲合集 (全面, 通俗, 有趣 | 从零打造系统语法体系</a></p>
<p>目前进度（9/29）</p>
<h3 id="励志" tabindex="-1">励志 </h3>
<p><a href="https://www.youtube.com/watch?v=plCCoy4rTIc" target="_blank" rel="noreferrer">张颂文：时间的力量</a></p>
<p>最近在 youtube 看到了这个，因为也是最近刷完了《狂飙》，对于张颂文这个演员也挺喜欢的，之前也看了他和朱朝阳演的剧，那会就很期待他接下来的剧，没想到狂飙里封神！</p>
<h3 id="b-站视频更新" tabindex="-1">b 站视频更新 </h3>
<p>前文说了做了一个启动模版，配置的过程中也录制了视频，如果你想要知道一步一步怎么配置来的，可以看看，内容接近 30 分钟，可选择性看。</p>
<p><a href="https://www.bilibili.com/video/BV1m24y1g7iW/" target="_blank" rel="noreferrer">折腾一下 Next.js + Tailwind CSS 启动模版</a></p>
<h3 id="chodocs-更新" tabindex="-1">ChoDocs 更新 </h3>
<p>新增设计模式文章：</p>
<p><a href="/patterns/middleware-pattern/">中介/中间件模式</a></p>
<p>折腾了一下 ChoDocs，目前文档网站可支持图片点击放大功能，并且调整了右上角菜单选项，并且提供了备用站点（最近 b 站很多人提打不开，挺纳闷的，我用流量也能访问来着...）</p>
<p><a href="https://chodocs.netlify.app/" target="_blank" rel="noreferrer">https://chodocs.netlify.app/</a></p>
<p>其次，对网站也做了相关 seo 优化。</p>
<h3 id="其它-1" tabindex="-1">其它 </h3>
<p>见本周的推文更新。</p>
<p>以上就是本周的学习内容打卡了，其实也没多少，最后也说一下「日更」标签会渐渐取消掉，而是参与每周末的打卡内容中，思考了一下，每日的内容应该形成一个体系比较好，不必记流水账，显得内容不是很干货。</p>
<p>而应该把内容专注于输出更优质的地方，比如写好接下来的 Next.js 系列实战，另外也提及一下，Vue3 实战其实之前算是完结了，我们会在接下来的日子快速同步文档，目前已经开始在星球发布了，这个是会作为付费专栏更新在 csdn 的，所以其实对于我们星球用户算是福利了，无需再购买而直接阅读。由 主导，如果之前没有参与的同学可以跟随文档再结合仓库代码学习一下，这样上手应该挺快的，继续加油吧！</p>
<p>如果你也想分享自己每周的学习动态，在星球 app 上方有每周打卡挑战，报名参与后发布每周的学习内容即可，欢迎各位积极参加，至于为什么不做每天打卡，后续会和大家说一下原因。一年大概只有 52 周，每周做一次总结大概只要十来分钟，这也只会需要 52 次，想想并不会占据多少时间，那么年底的时候我们可以一起来总结一下一年我们做了多少，那时候一定会感谢自己平常的积累，成就满满！</p>
<h2 id="第三周" tabindex="-1">第三周 </h2>
<h3 id="阅读" tabindex="-1">阅读 </h3>
<p><a href="https://mp.weixin.qq.com/s/3d41-tf0ymZ08H2J6OcPaw" target="_blank" rel="noreferrer">何谓“工程师的经济价值”？</a></p>
<blockquote>
<p>经验学习，也许每个阶段读会有不同的感受，值得今后再读&gt;</p>
</blockquote>
<p><a href="https://juejin.cn/post/7208907027840630840" target="_blank" rel="noreferrer">鹅厂七年半，写在晋升失败的不眠之夜</a></p>
<blockquote>
<p>经验学习，拥抱变化</p>
</blockquote>
<p><a href="https://juejin.cn/post/7209648356530962489" target="_blank" rel="noreferrer">生产上的问题你不会用 sourcemap 定位吗？</a></p>
<blockquote>
<p>可快速了解 sourcemap</p>
</blockquote>
<h3 id="英语-1" tabindex="-1">英语 </h3>
<p>最近一直在看英语兔的语法合集：</p>
<p><a href="https://www.bilibili.com/video/BV1XY411J7aG/" target="_blank" rel="noreferrer">英语语法精讲合集 (全面, 通俗, 有趣 | 从零打造系统语法体系</a></p>
<p>目前进度（18/29）</p>
<h3 id="chodocs" tabindex="-1">chodocs </h3>
<p>稍微折腾了点样式，目前在研究 pwa，社区里有</p>
<p><a href="https://github.com/vite-pwa/vitepress" target="_blank" rel="noreferrer">Zero-config PWA Plugin for VitePress</a></p>
<p>集成了但还没生效</p>
<blockquote>
<p>（2023.03.25 补充：目前已生效）</p>
</blockquote>
<h3 id="chonext-gpt" tabindex="-1">chonext-gpt </h3>
<p>做了移动端适配了，把之前做博客的时候使用的梅花效果搬过来了，之后打算再做个 header</p>
<h3 id="生活" tabindex="-1">生活 </h3>
<p>看了《中国乒乓》电影，6 元不亏，不过感觉后面的剧情结束的很快</p>
<h3 id="发现" tabindex="-1">发现 </h3>
<p><a href="https://www.phind.com/" target="_blank" rel="noreferrer">https://www.phind.com/</a></p>
<p>这个网站也集成了 gpt，感觉反应挺快的，会同步在 chodocs 资源导航上</p>
<h3 id="下周计划" tabindex="-1">下周计划 </h3>
<p>继续写设计模式专栏，找点编程类视频与文章继续学习，感觉这周并没有学多少技术类文章</p>
<h2 id="第四周" tabindex="-1">第四周 </h2>
<p>本周的学习动态：</p>
<h3 id="阅读-1" tabindex="-1">阅读 </h3>
<p><a href="https://juejin.cn/post/7137143919418015751" target="_blank" rel="noreferrer">面向个人开发者应该打造的 CI/CD 部署系统</a></p>
<p><a href="https://juejin.cn/post/7207617774633107512" target="_blank" rel="noreferrer">从零搭建属于你自己的前端规范+自动化部署</a></p>
<p>对于自动化部署这块了解了一下，目前还没玩过 docker，现在在往这块内容学习。</p>
<h3 id="英语-2" tabindex="-1">英语 </h3>
<p><a href="https://www.bilibili.com/video/BV1XY411J7aG/" target="_blank" rel="noreferrer">英语语法精讲合集 (全面, 通俗, 有趣 | 从零打造系统语法体系</a></p>
<p>这周把英语兔的内容学完了（29/29），温故而知新，还会继续二刷的。</p>
<h3 id="视频" tabindex="-1">视频 </h3>
<p><a href="https://www.bilibili.com/video/BV1GL411y7oK/" target="_blank" rel="noreferrer">掌握 NextJS 13：在短短 5 小时内构建和部署现代全栈应用程序！</a></p>
<p>5 小时关于 Next.js 全栈的视频，是我这周一直抽空看的，最近会打算折腾一下 Prisma，感觉可以用来做点全栈类的东西，视频里做的项目就是基于 openAi 来判断两个文本的相似度，其中也涉及到一些登录 jwt 验证，直接利用谷歌的 api 实现谷歌账号的登录来获取 token，在请求头中如果没有携带 token 就不能调用，然后还涉及到利用 redis 的 api 来进行接口限流访问，虽然看完之后整体来看项目不是很复杂，但短小精悍，该有的都有。</p>
<p>还是感觉挺酷的，能做一个完整的项目出来！</p>
<h3 id="其它-2" tabindex="-1">其它 </h3>
<p>本周和一位球友聊了聊，很高兴他拿到了实习 offer，后续也会邀请他来和各位分享在找实习过程中的心路历程。</p>
<blockquote>
<p>这位球友很热情，提了 PR 上来，现将面试内容公开在这——<a href="/interview/isolcat/">「isolcat 三月面试合集」</a>，这仅仅只是一部分，心路历程将会发布在<a href="/zsxq.html">「学习圈子」</a>里。</p>
</blockquote>
<p>接着，提一下写的这个回答：</p>
<blockquote>
<p>up 你好，我想问问学习路线的问题。我在一所普通一本，大三下。竞赛方面，大二的时候接触 ACM，学的拿的奖很少，蓝桥杯只拿了省二，后面参加一些其他比赛，robocom 编程赛拿了国三(学科竞赛排行榜上的)，传智杯拿了省二...</p>
</blockquote>
<p><a href="https://t.zsxq.com/0clFuTN5k" target="_blank" rel="noreferrer">解答提问</a></p>
<p>不过是匿名的提问，也不知道提问者是否看到了（因为对于匿名者的提问，回复也会是匿名）</p>
<p>这周末该实战点东西了，做完了再和各位分享吧~</p>
<h2 id="月末补充" tabindex="-1">月末补充 </h2>
<p>本周的学习动态：</p>
<h3 id="文章" tabindex="-1">文章 </h3>
<p><a href="https://t.zsxq.com/0cliv9mVf" target="_blank" rel="noreferrer">2023 前端趋势 | 渲染模式的发展</a></p>
<p><a href="https://t.zsxq.com/0cNk7ylww" target="_blank" rel="noreferrer">最近很严重的内耗</a></p>
<h3 id="阅读-2" tabindex="-1">阅读 </h3>
<p>这几天看完了掘金这篇文章：</p>
<p><a href="https://juejin.cn/post/7204715616283836473" target="_blank" rel="noreferrer">追忆四年前：一段关于我被外企 CTO 用登录注册吊打的不堪往事</a></p>
<p>读完之后感觉又见识到了一位博客大佬，文章的内容都很不错，读完还有点意犹未尽，拉到结尾的时候看到说会出小册，说是 4 月份，今天下班后打开居然还真这么快就出了，果断买下了。</p>
<p>近段时间自己也在面向全栈学习，先把 Java 那套熟悉一下，把过去遗忘的知识捡起来，提升自己，前后端兼顾学习，等到学差不多了再系统性总结吧，先加油学！</p>
<p><a href="https://www.robinwieruch.de/web-development-trends/" target="_blank" rel="noreferrer">10 Web Development Trends in 2023</a></p>
<h3 id="项目" tabindex="-1">项目 </h3>
<p>chovue 组织建立，之前 HearLing 项目开源啦，文档目前已经更新完了（星球专栏内可免费阅读全文），近段时间我也会参与提交点 commit，把项目优化一下，文档之后也会做点加餐内容的补充。</p>
<p>对于这个管理系统项目，希望的是短小精悍，不需要花费太多时间去折腾，能够让你快速入门相关技术栈。</p>
<p>并且提供一定的思路，遇到其他需求也就是依葫芦画瓢了。</p>
<p>4 月份继续努力！</p>
<blockquote>
<p>地址：</p>
</blockquote>
<p><a href="https://github.com/chovue/vue3-management-system" target="_blank" rel="noreferrer">vue3+typescript+pinia 管理系统</a></p>]]></content:encoded>
            <author>Choi Yang</author>
        </item>
        <item>
            <title><![CDATA[23 年每周学习动态公开 ]]></title>
            <link>https://chodocs.cn//weekly/guide.html</link>
            <guid isPermaLink="false">https://chodocs.cn//weekly/guide.html</guid>
            <pubDate>Sat, 25 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[23 年每周学习动态公开  下面的内容我已经对每个月做了分类，同时每一篇文章内也对每周做了分级，可选择性阅读。 💬 重要提示 学习动态的内容仅供参考学习，并非是代表前端的学习路线，毕竟每个人感兴趣的点可能不一样，我可能会面向全栈以及程序员本身职业全面发展来。]]></description>
            <content:encoded><![CDATA[<p>下面的内容我已经对每个月做了分类，同时每一篇文章内也对每周做了分级，可选择性阅读。</p>
<div  class="warning custom-block"><p class="custom-block-title">💬 重要提示</p>
<p>学习动态的内容仅供参考学习，并非是代表前端的学习路线，毕竟每个人感兴趣的点可能不一样，我可能会面向全栈以及程序员本身职业全面发展来。</p>
</div>]]></content:encoded>
            <author>Choi Yang</author>
        </item>
        <item>
            <title><![CDATA[高阶组件模式 ]]></title>
            <link>https://chodocs.cn//patterns/hoc-pattern/</link>
            <guid isPermaLink="false">https://chodocs.cn//patterns/hoc-pattern/</guid>
            <pubDate>Mon, 20 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[高阶组件模式  在应用程序中，我们经常希望在多个组件中使用相同的逻辑。此逻辑可以包括向组件应用某种样式、要求授权或添加全局状态。 高阶组件模式就能够让我们在多个组件中重用相同逻辑，这种模式允许我们在整个应用程序中重用组件逻辑。 高阶组件简称 HOC（Higher Order Component），是接收其它组件的组件。 HOC 包含我们希望应用于作为参数传递的组件的特定逻辑。应用该逻辑后，HOC ]]></description>
            <content:encoded><![CDATA[<p>在应用程序中，我们经常希望在多个组件中使用相同的逻辑。此逻辑可以包括向组件应用某种样式、要求授权或添加全局状态。</p>
<p>高阶组件模式就能够让我们在多个组件中重用相同逻辑，这种模式允许我们在整个应用程序中重用组件逻辑。</p>
<p>高阶组件简称 HOC（Higher Order Component），是接收其它组件的组件。</p>
<p>HOC 包含我们希望应用于作为参数传递的组件的特定逻辑。应用该逻辑后，HOC 会返回带有附加逻辑的元素。</p>
<p>假设我们总是想向应用程序中的多个组件添加某种样式。我们可以简单地创建一个 HOC，将样式对象添加到传递给它的组件中，而不是每次都在本地创建一个样式对象</p>
<div class="language-jsx line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">jsx</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> withStyles</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">Component</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">props</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> style</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { padding: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'0.2rem'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, margin: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'1rem'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> &#x3C;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Component</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> style</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{style} {</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">props} /></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Button</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">button</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>Click me!&#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">button</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Text</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">p</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>Hello World!&#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">p</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> StyledButton</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> withStyles</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(Button)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> StyledText</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> withStyles</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(Text)</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br></div></div><p>在上面的示例中，我们创建了一个 HOC，名称为 <code>withStyles</code>，它接收一个组件作为参数，并返回一个新组件。</p>
<p>接着，我们使用 <code>withStyles</code> HOC 来为 <code>Button</code> 和 <code>Text</code> 组件添加了样式，会发现它们都有了相同的样式。</p>
<h2 id="狗狗图片的例子" tabindex="-1">狗狗图片的例子 </h2>
<p>让我们看一下之前在<a href="/patterns/container-presentational-pattern/">容器/演示模式</a>中使用的狗狗图片 Demo，该示例无非是渲染从 API 获取的狗狗的图像列表。</p>
<iframe src='https://stackblitz.com/edit/container-presentational-pattern-hooks?ctl=1&embed=1&file=src/useDogImages.js'></iframe>
<p>让我们稍微改进一下用户体验。当我们获取数据时，我们希望向用户显示 <code>Loading…</code>的状态。但我们不必直接向 <code>DogImages</code> 组件添加数据，而是使用一个高阶组件来为我们添加这个逻辑。</p>
<p>如下我们创建一个名为 <code>withLoader</code> 的 HOC，<code>withLoader</code> HOC 应该返回一个新组件，该组件应该在数据被请求到之前显示 <code>Loading…</code>，并在数据被请求到后显示 <code>Element</code>。</p>
<div class="language-jsx line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">jsx</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> withLoader</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">Element</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">url</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">props</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><p>一个 HOC 返回一个元素，在本例中是一个功能组件 <code>props =&gt;{}</code>，我们希望向该元素添加逻辑，允许我们在数据仍在获取时显示带有 <code>Loading</code> 的文本。一旦获取了数据，组件应该将获取的数据作为 <code>props</code> 传递。</p>
<p>直接来看看下方的示例吧：</p>
<iframe src='https://stackblitz.com/edit/react-wz3weq?ctl=1&embed=1&file=src/withLoader.js'></iframe>
<p>完美！我们刚刚创建了一个可以接收任何组件和 url 的 HOC。</p>
<p>1.在 <code>useEffect</code> hook 中，<code>withLoader</code> HOC 从我们传递的 url 来请求获取数据。当数据还没有返回时，我们返回包含 <code>Loading…</code> 的文本（这里为了演示需要，写了一个 <code>setTimeout</code>，大概 3s 左右会有显示 <code>Loading...</code> 的效果）。</p>
<p>2.一旦获取了数据，我们将 data 设置为已经获取的数据。由于 data 不再为空，我们可以显示传递给 HOC 的 <code>element</code> 组件。</p>
<p>那么，我们如何将这个行为添加到我们的应用程序中，让它实际显示 <code>Loading...</code>在 DogImages 列表上?</p>
<p>在 <code>DogImages.js</code> 文件中，我们不再只想导出普通的 DogImages 组件。相反，我们想要在 DogImages 组件周围导出包裹了一层 <code>withLoader</code> HOC 的组件，如下代码所示。</p>
<div class="language-jsx line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">jsx</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> default</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> withLoader</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(DogImages)</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><code>withLoader</code> 高阶组件接受两个参数，第一个参数是我们想要包裹的组件，第二个参数是我们想要从中获取数据的 url。</p>
<div class="language-jsx line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">jsx</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> default</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> withLoader</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  DogImages,</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  'https://dog.ceo/api/breed/labrador/images/random/6'</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><p>由于我们已经将 <code>withLoader</code> HOC 应用于 <code>DogImages</code> 组件，我们现在可以在 <code>DogImages</code> 组件中通过传递过来的 <code>props</code> 来使用 <code>data</code>。</p>
<div class="language-jsx line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">jsx</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> React </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'react'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> withLoader </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> './withLoader'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> DogImages</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">props</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> props.data.message.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">map</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">((</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">dog</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">index</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">img</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> src</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{dog} </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">alt</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Dog"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> key</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{index} /></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  ))</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> default</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> withLoader</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  DogImages,</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  'https://dog.ceo/api/breed/labrador/images/random/6'</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br></div></div><p>这时候再来看看上述的演示代码，如下所示：</p>
<iframe src='https://stackblitz.com/edit/react-wz3weq?ctl=1&embed=1&file=src/withLoader.js'></iframe>
<p>到此，应该对于高阶组件模式有了一个基本的了解，通过 <code>HOC pattern</code>，我们可以在多个组件中重用相同的逻辑，这种模式允许我们在整个应用程序中重用组件逻辑。</p>
<p>在上述狗狗图片示例中，我们使用了 <code>withLoader</code> HOC，它只要接受一个组件和一个 url，就可以为我们的组件添加数据获取的逻辑。这样，我们就可以在任何组件中使用 <code>withLoader</code> HOC，而不必在每个组件中都写一遍数据获取的逻辑。</p>
<h2 id="多个高阶组件的组合" tabindex="-1">多个高阶组件的组合 </h2>
<p>我们可以将多个 HOC 组合在一起，以便在组件中使用多个 HOC。例如，我们可以使用 <code>withLoader</code> HOC 来获取数据，然后使用 <code>withLogger</code> HOC 来记录数据。</p>
<p>不过接下来的例子，我们这样子做，当我们 <code>hover</code> 容器的时候，会有一个文本提示，告诉我们当前 <code>hovering</code>，来看看 Demo 吧。</p>
<iframe src='https://stackblitz.com/edit/hoc-pattern-hovering?ctl=1&embed=1&file=src/withHover.js'></iframe>
<p>在上述例子中，我们新增了一个 <code>withHover</code> HOC，它接收一个组件作为参数，并返回一个新组件。这个新组件会在鼠标悬停在组件上时显示 <code>Hovering</code>，详细代码如下：</p>
<div class="vp-code-group"><div class="tabs"><input type="radio" name="group-93" id="tab-94" checked><label data-title="withHover.js" for="tab-94">withHover.js</label><input type="radio" name="group-93" id="tab-95" ><label data-title="DogImages.js" for="tab-95">DogImages.js</label><input type="radio" name="group-93" id="tab-115" ><label data-title="useHover.js" for="tab-115">useHover.js</label><input type="radio" name="group-93" id="tab-116" ><label data-title="DogImages.js" for="tab-116">DogImages.js</label></div><div class="blocks">
<div class="language-jsx active line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">jsx</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> React, { useState } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'react'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> default</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> withHover</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">Element</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">props</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    const</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">hovering</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">setHover</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> useState</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      &#x3C;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Element</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">props}</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">        hovering</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{hovering}</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">        onMouseEnter</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> setHover</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)}</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">        onMouseLeave</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> setHover</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      /></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    )</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br></div></div><div class="language-jsx line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">jsx</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> React </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'react'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> withHover </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> './withHover'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> withLoader </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> './withLoader'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> DogImages</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">props</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">div</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">props}></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      {props.hovering </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x26;&#x26;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">div</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"hover"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>Hovering!&#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">div</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">div</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"list"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {props.data.message.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">map</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">((</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">dog</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">index</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">img</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> src</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{dog} </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">alt</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Dog"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> key</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{index} /></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        ))}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      &#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">div</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    &#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">div</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  )</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> default</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> withHover</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">  withLoader</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(DogImages, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'https://dog.ceo/api/breed/labrador/images/random/6'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br></div></div><p>你会发现，我们在 <code>DogImages</code> 组件中使用了两个 HOC，<code>withHover</code> 和 <code>withLoader</code>。这两个 HOC 都接收一个组件作为参数，并返回一个新组件。我们可以将多个 HOC 组合在一起，以便在组件中使用多个 HOC。</p>
<blockquote>
<p>其实大部分的 HOC 目前都是可以被 <code>React Hooks</code> 所取代，我们下面来看看使用了 Hooks 之后又会是怎样的形式。</p>
</blockquote>
<h2 id="hooks-中" tabindex="-1">Hooks 中 </h2>
<p>在大部分例子中，我们可以通过 <code>React Hooks</code> 来替代 HOC。我们来看看如何使用 <code>React Hooks</code> 来实现 <code>withHover</code> HOC。</p>
<iframe src='https://stackblitz.com/edit/hoc-pattern-hooks?ctl=1&embed=1&file=src/useHover.js'></iframe>
<p>详细代码如下，你也可以在上述演示 demo 中切换查看代码详情。</p>
<div class="vp-code-group"><div class="tabs"><input type="radio" name="group-114" id="tab-115" checked><label data-title="useHover.js" for="tab-115">useHover.js</label><input type="radio" name="group-114" id="tab-116" ><label data-title="DogImages.js" for="tab-116">DogImages.js</label></div><div class="blocks">
<div class="language-jsx active line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">jsx</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { useEffect, useRef, useState } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'react'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> default</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> useHover</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">() {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  const</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">hovering</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">setHover</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> useState</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> ref</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> useRef</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">null</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> handleMouseOver</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> setHover</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> handleMouseOut</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> setHover</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">  useEffect</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> node</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ref.current</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (node) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      node.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">addEventListener</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'mouseover'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, handleMouseOver)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      node.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">addEventListener</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'mouseout'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, handleMouseOut)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        node.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">removeEventListener</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'mouseover'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, handleMouseOver)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        node.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">removeEventListener</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'mouseout'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, handleMouseOut)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }, [ref.current])</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [ref, hovering]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br></div></div><div class="language-jsx line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">jsx</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> React </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'react'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> useHover </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> './useHover'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> withLoader </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> './withLoader'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> DogImages</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">props</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  const</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">hoverRef</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">hovering</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> useHover</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">div</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> ref</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{hoverRef} {</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">props}></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      {hovering </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x26;&#x26;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">div</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"hover"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>Hovering!&#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">div</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">div</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"list"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {props.data.message.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">map</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">((</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">dog</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">index</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">          &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">img</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> src</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{dog} </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">alt</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Dog"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> key</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{index} /></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        ))}</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      &#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">div</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    &#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">div</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  )</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> default</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> withLoader</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  DogImages,</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">  'https://dog.ceo/api/breed/labrador/images/random/6'</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br></div></div></div></div>
</div></div>
<p>在上述代码中，我们使用了 <code>useHover</code> 自定义 Hook，如果不太清楚自定义 Hook，可以在 <a href="https://react.dev/learn/reusing-logic-with-custom-hooks" target="_blank" rel="noreferrer">React 最新文档</a> 中学习。</p>
<p>当我们使用了 Hooks 语法之后，你会发现代码也变得干净卫生了，我们不需要去通过 <code>withxxx</code> 这样的 HOC 来包裹了，而是直接在组件中使用 <code>useHover</code> Hook，这样就可以在组件中使用 <code>hovering</code> 状态了。</p>
<h3 id="hooks-好处" tabindex="-1">Hooks 好处 </h3>
<p>在上述代码中，我们不难发现，使用了 Hooks 之后没有那么多层级，代码也变得简洁了，这是因为 Hooks 本身就是一个函数，我们可以在任何地方调用它，而不需要像 HOC 那样，需要在组件中包裹一层 HOC。</p>
<p>来看看，包裹了 HOC 的组件结构：</p>
<div class="language-jsx line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">jsx</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">withAuth</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  &#x3C;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">withLayout</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    &#x3C;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">withLogging</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      &#x3C;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Component</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> /></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    &#x3C;/</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">withLogging</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  &#x3C;/</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">withLayout</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">&#x3C;/</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">withAuth</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br></div></div><p>看完感受就是一套又一套的...</p>
<h2 id="优点" tabindex="-1">优点 </h2>
<p>使用高阶组件模式允许我们在一个地方保留我们想要重用的逻辑。这降低了通过重复代码在应用程序中意外传播错误的风险，每次都可能引入新的错误。</p>
<p>通过将所有逻辑都放在一个地方，可以轻松地实现关注点的分离。</p>
<h2 id="不足" tabindex="-1">不足 </h2>
<p>HOC 可以传递被包裹的组件时，可能会导致命名冲突，来看下述例子：</p>
<div class="language-jsx line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">jsx</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> withStyles</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">Component</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">props</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> style</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { padding: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'0.2rem'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, margin: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'1rem'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> &#x3C;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Component</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> style</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{style} {</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">props} /></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Button</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">button</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> style</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{{ color: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'red'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }}>Click me!&#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">button</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> StyledButton</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> withStyles</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(Button)</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br></div></div><p>在本例中，<code>withStyles</code> HOC 将一个名为 <code>style</code> 的 <code>props</code> 添加到我们传递给它的元素中。</p>
<p>然而，<code>Button</code> 组件已经有了一个名为 <code>style</code> 的 props，这时样式将会被覆盖！</p>
<p>我们可以修改一下代码，如下所示：</p>
<div class="language-jsx line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">jsx</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> withStyles</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">Component</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">props</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> style</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      padding: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'0.2rem'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      margin: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'1rem'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">      ...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">props.style</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> &#x3C;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Component</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> style</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{style} {</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">props} /></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Button</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">button</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> style</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{{ color: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'red'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> }}>Click me!&#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">button</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> StyledButton</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> withStyles</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(Button)</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br></div></div><p>另外，如果有多个 HOC，那么 HOC 的嵌套层级就会越来越深，这样也会导致组件的可读性变差，对于组件所接收的 <code>props</code> 也很难确定它应该是来自于哪个 HOC，这可能也会阻碍调试以及阅读。</p>]]></content:encoded>
            <author>Choi Yang</author>
        </item>
        <item>
            <title><![CDATA[中介/中间件模式 ]]></title>
            <link>https://chodocs.cn//patterns/middleware-pattern/</link>
            <guid isPermaLink="false">https://chodocs.cn//patterns/middleware-pattern/</guid>
            <pubDate>Tue, 07 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[中介/中间件模式  通过中间件模式，我们能够更好地处理组件之间的通信，可以想象成有一个中心点，其它组件只需要由它来进行接受和转发信息即可，组件之间不需要直接对话，在 JS 中，一个中间件可以是一个对象字面量或者一个函数。 举个例子，可以将这种模式转换为空中交通管制员和飞行员之间的关系，飞行员只需要与空中交通管制员对话，而不是让飞行员直接相互交谈，想想，如果是直接交谈，你找我我找你，到底听谁的呢？山]]></description>
            <content:encoded><![CDATA[<p>通过中间件模式，我们能够更好地处理组件之间的通信，可以想象成有一个中心点，其它组件只需要由它来进行接受和转发信息即可，组件之间不需要直接对话，在 <code>JS</code> 中，一个中间件可以是一个对象字面量或者一个函数。</p>
<p>举个例子，可以将这种模式转换为空中交通管制员和飞行员之间的关系，飞行员只需要与空中交通管制员对话，而不是让飞行员直接相互交谈，想想，如果是直接交谈，你找我我找你，到底听谁的呢？山里都得有个老大不是哈哈，没有人管控就会非常混乱。</p>
<p>那么在这当中空中交通管制员的任务就是要确保所有飞机都接收到安全飞行所需的信息，不会撞到其他飞机。</p>
<p>那么同样在 <code>JS</code> 中，如果有大量的组件，没有一个领头的，相互之间通信也会非常混乱，对于开发者而言也很痛苦，不知道这个数据到底怎么传，如下图所示：</p>
<CloudinaryImg publicId='patterns/middleware-pattern-1_uynu2e' alt='middleware-pattern-1'/><p>那么，使用了中间件模式之后，不需要让组件之间去通信了，而是直接从多对多的关系变为了多对一的关系，如下图所示。</p>
<CloudinaryImg publicId='patterns/middleware-pattern_ebrees' alt='middleware-pattern'/><h2 id="简单的聊天室" tabindex="-1">简单的聊天室 </h2>
<p>我们以一个简单的聊天室来演示中介/中间件模式，在这个聊天室里面的用户不需要私聊，而是把这个聊天室当做用户之间的中介，由聊天室来接受信息并转发信息，我们来看看代码：</p>
<iframe src='https://stackblitz.com/edit/middleware-pattern-chatroom?devToolsHeight=33&embed=1&file=index.js'></iframe>
<h2 id="express-中的中间件学习" tabindex="-1">Express 中的中间件学习 </h2>
<p>了解 <code>Express.js</code> 的同学一定知道它的中间件，我们现在来回顾一下，对于前端的接口路由，我们可以添加一个回调，如下代码所示：</p>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> app</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> require</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'express'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)()</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">app.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">use</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'/'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">req</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">res</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">next</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  req.headers[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'test-header'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 1234</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">  next</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><p>注意第 5 行代码，有个 next 方法执行，代表我们会执行下一个回调，那么通过这样，在请求和响应之间就可以创建中间件函数链，如下图所示：</p>
<CloudinaryImg publicId='patterns/middleware-express_lgniew' alt='middleware-express'/><p>我们再把上述代码完善一下，看看下方的 demo，展示一个中间件链的使用：</p>
<iframe src='https://stackblitz.com/edit/middleware-pattern-node-express?ctl=1&embed=1&file=index.js'></iframe>
<p>当我们访问根路径 <code>/</code> 时，请求和响应之间的两个中间件都会调用。</p>
<h2 id="总结" tabindex="-1">总结 </h2>
<p>中间件模式让所有通信都通过一个中心点，从而简化对象之间的多对多关系。</p>]]></content:encoded>
            <author>Choi Yang</author>
        </item>
        <item>
            <title><![CDATA[混合模式 ]]></title>
            <link>https://chodocs.cn//patterns/mixin-pattern/</link>
            <guid isPermaLink="false">https://chodocs.cn//patterns/mixin-pattern/</guid>
            <pubDate>Wed, 22 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[混合模式  mixin 是一个对象，我们可以使用它向另一个对象或类添加可重用的功能，而不需要使用继承的方式。 注意，我们不能单独使用 mixin：它们的唯一目的是在没有继承的情况下向对象或类添加功能。 mixin 使用  假设对于我们的应用程序，我们需要创建多个狗。然而，我们创建的狗只有一个 name 属性，如下代码所示： jsclass Dog { constructor(name) { thi]]></description>
            <content:encoded><![CDATA[<p><code>mixin</code> 是一个对象，我们可以使用它向另一个对象或类添加可重用的功能，而不需要使用继承的方式。</p>
<blockquote>
<p>注意，我们不能单独使用 <code>mixin</code>：它们的唯一目的是在没有继承的情况下向对象或类添加功能。</p>
</blockquote>
<h2 id="mixin-使用" tabindex="-1">mixin 使用 </h2>
<p>假设对于我们的应用程序，我们需要创建多个狗。然而，我们创建的狗只有一个 <code>name</code> 属性，如下代码所示：</p>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Dog</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  constructor</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    this</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> name</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><p>一只狗除开拥有名字外，它应该还会汪汪叫，摇尾巴，玩！</p>
<p>我们可以创建一个 <code>mixin</code>，为我们提供 <code>bark</code>、<code>wagTail</code> 和 <code>play</code> 属性，而不是直接添加到 <code>Dog</code> 中。</p>
<p>开头咱们说过，一个 <code>mixin</code> 就是一个对象，因此我们创建一个名为 <code>dogFunctionality</code> 的对象。</p>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> dogFunctionality</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">  bark</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'Woof!'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">),</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">  wagTail</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'Wagging my tail!'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">),</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">  play</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'Playing!'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><p>我们可以通过 <code>Object.assign</code> 方法将上述 <code>dogFunctionality</code> 对象添加到 <code>Dog</code> 的原型中，也就是 <code>Dog.prototype</code>。</p>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Dog</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  constructor</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    this</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.name </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> name</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> dogFunctionality</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">  bark</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'Woof!'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">),</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">  wagTail</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'Wagging my tail!'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">),</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">  play</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'Playing!'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Object.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">assign</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Dog</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">prototype</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, dogFunctionality)</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br></div></div><p>那么在实例化 <code>Dog</code> 后，每一个实例对象都能访问 <code>Dog</code> 上的方法，包括在原型上的方法，因为我们可以通过原型链的方式去往上找。</p>
<p>不妨来示例化一下吧，<code>new</code> 出来一个宠物，名叫做 <code>pet1</code>，我们来访问一下上述新增加的方法试试：</p>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> pet1</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> new</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Dog</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'Daisy'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">pet1.name </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// Daisy</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">pet1.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">bark</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">() </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// Woof!</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">pet1.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">play</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">() </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// Playing!</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><p>会发现能正常使用，那么我们通过 <code>mixin</code> 方式可以轻松将自定义的一些方法添加到类或对象当中，不需要使用继承的方式。</p>
<h2 id="mixin-本身也可以继承" tabindex="-1">mixin 本身也可以继承 </h2>
<p>虽然我们可以在没有继承的情况下使用<code>mixin</code>添加方法，但 <code>mixin</code> 本身也可以使用继承。</p>
<p>比如说，大多数哺乳动物(除了海豚，也许还有其他物种)能走路和睡觉，而狗也是哺乳动物，应该也是要会走路和睡觉。</p>
<p>下面我们再创建一个名为 <code>animalFunctionality</code> 的 <code>mixin</code> 添加走路和睡觉的方法。</p>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> animalFunctionality</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">  walk</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'Walking!'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">),</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">  sleep</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'Sleeping!'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><p>我们可以使用 <code>Object.assign</code> 将这些属性添加到 <code>dogFunctionality</code> 原型中。在上述例子中，目标对象是 <code>dogFunctionality</code>。</p>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> animalFunctionality</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  // xxx</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> dogFunctionality</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">  // xxx</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Object.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">assign</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(dogFunctionality, animalFunctionality)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">Object.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">assign</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Dog</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">prototype</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, dogFunctionality)</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br></div></div><h2 id="demo" tabindex="-1">Demo </h2>
<p>那么我们可以 <code>new</code> 来试试，又新增了 <code>walk</code> 和 <code>sleep</code> 方法。</p>
<iframe src='https://stackblitz.com/edit/mixin-pattern-demo?devToolsHeight=33&embed=1&file=index.js'></iframe>
<h2 id="日常编码" tabindex="-1">日常编码 </h2>
<p>日常编码中的一个 <code>mixin</code> 例子就是浏览器环境中的 <code>Window</code> 对象了，它从 <code>WindowOrWorkerGlobalScope</code> 和 <code>WindowEventHandlers</code> 中混合了很多属性方法。</p>
<p>比如，我们常用的一些 <code>setTimeout</code> 、<code>setInterval</code>、<code>indexedDB</code> 和 <code>isSecureContext</code>。</p>
<p>由于它是一个 <code>mixin</code>，因此仅用于向对象去添加功能，而不能创建 <code>WindowOrWorkerGlobalScope</code> 类型的对象，我们来看看下方的例子：</p>
<iframe src='https://stackblitz.com/edit/mixin-pattern-window-demo?ctl=1&devToolsHeight=33&embed=1&file=index.js'></iframe>
<p>可以发现，我们直接去访问 <code>WindowOrWorkerGlobalScope</code> 或者 <code>WindowEventHandlers</code> 是访问不到的。</p>
<h2 id="react-es6-前" tabindex="-1">React (ES6 前) </h2>
<p>在引入 <code>ES6</code> 类之前，<code>mixin</code> 经常被用来为 <code>React</code> 组件添加功能。<code>React</code>团队不鼓励使用<code>mixin</code>，因为它很容易给组件增加不必要的复杂性，使其难以维护和重用。</p>
<p>React 团队鼓励使用更高阶的组件，这些组件现在通常可以被 <code>Hooks</code> 取代。</p>
<h2 id="结语" tabindex="-1">结语 </h2>
<p><code>mixin</code> 允许我们轻松地向对象添加属性方法，而不需要将功能注入到对象的原型中。因为修改一个对象的原型被认为是一种糟糕的做法，它会导致原型污染和对于属性方法来源的不确定性。</p>]]></content:encoded>
            <author>Choi Yang</author>
        </item>
        <item>
            <title><![CDATA[模块模式 ]]></title>
            <link>https://chodocs.cn//patterns/module-pattern/</link>
            <guid isPermaLink="false">https://chodocs.cn//patterns/module-pattern/</guid>
            <pubDate>Tue, 21 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[模块模式  随着应用程序和代码库的增长，保持代码可维护和分离变得越来越重要。模块模式可以将代码分割成更小的、可重用的片段。 除了能够将代码分割成更小的可重用片段外，模块还允许您在文件中保留某些私有值。 默认情况下，模块内的声明被限定(封装)到该模块。如果不显式导出某个值，则该值在该模块之外不可用。 那么就降低了在代码中其它地方的声明的值出现命名冲突的风险，因为这些值在全局作用域中不可用。 ES20]]></description>
            <content:encoded><![CDATA[<p>随着应用程序和代码库的增长，保持代码可维护和分离变得越来越重要。模块模式可以将代码分割成更小的、可重用的片段。</p>
<p>除了能够将代码分割成更小的可重用片段外，模块还允许您在文件中保留某些私有值。</p>
<p>默认情况下，模块内的声明被限定(封装)到该模块。如果不显式导出某个值，则该值在该模块之外不可用。</p>
<p>那么就降低了在代码中其它地方的声明的值出现命名冲突的风险，因为这些值在全局作用域中不可用。</p>
<h2 id="es2015-的模块" tabindex="-1">ES2015 的模块 </h2>
<p>ES2015 引入了内置 JavaScript 模块。模块是一个包含 JavaScript 代码的文件，与普通脚本相比在行为上有一些不同。</p>
<p>下面，我们来看一个名为 <code>math.js</code> 的模块，包含了一些数学类的函数。</p>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> add</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">x</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">y</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> y</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> multiply</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">x</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 2</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> subtract</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">x</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">y</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> y</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> square</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">x</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br></div></div><p>代码也比较简单，包含加减乘除这些函数，不过我们希望的是能够在 <code>index.js</code> 当中使用，很显然，我们需要将这几个函数通过 <code>export</code> 关键字导出去，如下：</p>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> add</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">x</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">y</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> y</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> multiply</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">x</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 2</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> subtract</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">x</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">y</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> y</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> square</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">x</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br></div></div><p>通过在函数前面添加 <code>export</code> 即可实现导出，不过我们仅仅只是在模块中导出了这些函数，此时在 <code>index.js</code> 中还是不能使用，那么为了能够使用来自模块的导出值，我们必须引用他们。</p>
<p>顾名思义，我们可以使用 <code>import</code> 关键字，为了让 js 知道我们想从哪个模块导入这些函数，我们还需要添加 <code>from</code> 和模块的路径，如下：</p>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { add, multiply, square, subtract } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> './math.js'</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><h2 id="演示" tabindex="-1">演示 </h2>
<iframe src='https://stackblitz.com/edit/module-pattern-demo?devToolsHeight=33&embed=1&file=index.js'></iframe>
<p>使用模块的一大好处是，我们只能访问使用 <code>export</code> 关键字显式导出的值。没有使用 <code>export</code> 关键字显式导出的值只在该模块中可用。</p>
<p>我们不妨创建一个只能在 <code>math.js</code> 文件中引用的值，称为 <code>privateValue</code>。</p>
<div class="vp-code-group"><div class="tabs"><input type="radio" name="group-46" id="tab-47" checked><label data-title="main.js" for="tab-47">main.js</label><input type="radio" name="group-46" id="tab-48" ><label data-title="index.js" for="tab-48">index.js</label></div><div class="blocks">
<div class="language-js active line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> privateValue</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'This is a value private to the module!'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> add</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">x</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">y</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> y</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> multiply</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">x</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 2</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> subtract</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">x</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">y</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> y</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> square</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">x</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br></div></div><div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { add, multiply, square, subtract } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> './math.js'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(privateValue)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">/* Error: privateValue is not defined */</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div></div></div>
<p>通过将值设置为模块私有，可以降低意外污染全局作用域的风险。</p>
<p>假如没有设置私有的话，都放在全局，那很有可能你的同事也会使用到和你相同名称的值，这样就会导致命名冲突，而模块内私有的值可以防止命名冲突。</p>
<p>如果我们发现导入的值已经在该文件中使用了，我们可以使用 <code>as</code> 关键字进行重命名一下，看看如下例子：</p>
<h2 id="演示-1" tabindex="-1">演示 </h2>
<iframe src='https://stackblitz.com/edit/module-pattern-demo2?ctl=1&devToolsHeight=33&embed=1&file=index.js'></iframe>
<h2 id="export-与-export-default" tabindex="-1">export 与 export default </h2>
<p>除了仅使用导出关键字 <code>export</code> 导出外，还可以使用默认导出，注意，每个模块<strong>只能有一个</strong>默认导出。</p>
<p>默认导出的关键字是 <code>export default</code>，我们在下方例子当中将加法的函数设置为默认导出试试，其它的都使用 <code>export</code> 来导出。</p>
<div class="vp-code-group"><div class="tabs"><input type="radio" name="group-72" id="tab-73" checked><label data-title="math.js" for="tab-73">math.js</label><input type="radio" name="group-72" id="tab-74" ><label data-title="index.js" for="tab-74">index.js</label></div><div class="blocks">
<div class="language-js active line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> default</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> add</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">x</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">y</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> y</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> multiply</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">x</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 2</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> subtract</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">x</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">y</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> y</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> square</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">x</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br></div></div><div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> add, { multiply, square, subtract } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> './math.js'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">add</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">7</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">multiply</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">9</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">subtract</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">square</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div></div></div>
<p>从以上代码我们不难发现，通过 <code>export default</code> 导出的值，我们在 <code>import</code> 的时候是不需要加在括号里的。</p>
<p>同时， js 知道这个值是默认导出的，我们也可以直接给它取一个别名，比如我们上述导入的 <code>add</code> 可以取名为 <code>addValues</code>。</p>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> addValues, { multiply, square, subtract } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> './math.js'</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">addValues</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">7</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">multiply</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">9</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">subtract</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">square</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><p>此外，我们还可以通过 <code>*</code> 和 <code>as</code> 的配合来实现所有的导出（包括默认导出），如下例子，我们用模块导出的内容设置为 <code>math</code>。</p>
<iframe src='https://stackblitz.com/edit/module-pattern-demo3?devToolsHeight=33&embed=1&file=index.js'></iframe>
<p>在上例中，我们从一个模块导入所有的导出。这样做时要小心，可能会不必要地导入其它不需要的值，因为使用 <code>*</code> 会导入所有导出的值。</p>
<p>而模块私有的值在导入模块的文件中仍然不可用，除非我们显式地导出它们。</p>
<h2 id="todo-iist" tabindex="-1">Todo iist </h2>
<p>在使用 React 构建应用程序时，你经常需要处理大量的组件。我们不需要在一个文件中编写所有这些组件，而是可以将这些组件分离到它们自己的文件中，实际上就是为每个组件创建一个模块。</p>
<p>比如一个 demo 名叫 todo-list，想必大家非常熟悉吧，它包含一个列表、列表项、一个输入框和一个按钮。</p>
<p>使用模块模式的话，我们可以将每一个组件单独做成一个模块，这样主应用程序只需要将这些模块拼起来就好了，包括样式我们也可以单独写在每一个组件当中，相互不影响。</p>
<h2 id="dynamic-import" tabindex="-1">Dynamic import </h2>
<p>上文我们在 <code>index.js</code> 文件顶部导入都是直接导入的，也有导入所有的模块，但实际情况我们有时候并不需要立即要这个模块，而是希望它在特定的条件下才导入模块，这时候，我们就可以通过 <code>Dynamic import</code> 来按需加载导入的模块。</p>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'node:module'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">).</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">then</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">((</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">default</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">namedExport</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">});</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// Or with async/await</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">async</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> () </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> module</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> await</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'node:module'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">default</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">namedExport</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">})()</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br></div></div><h2 id="演示-2" tabindex="-1">演示 </h2>
<iframe src='https://stackblitz.com/edit/module-pattern-dynamic-import?ctl=1&devToolsHeight=33&embed=1&file=index.js'></iframe>
<p>通过动态导入模块，我们可以减少页面加载时间。当用户需要时，我们只需要加载，解析和编译用户真正需要的代码。</p>
<p>除了能够按需导入模块外，<code>import()</code> 函数还可以接收表达式。它允许我们传递模板字符串，以便基于给定的值来动态加载模块。</p>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> res</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> await</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">`../assets/dog${</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">num</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">}.png`</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p>如上述代码，只有当用户单击点击加载图像按钮后，每个图像才会加载，并且会根据我们传递的 <code>num</code> 值来判断实现动态加载。</p>
<p>这样，我们就不依赖于硬编码的模块路径，我们可以根据用户输入、从外部源接收的数据、函数的结果等来导入模块，会比直接全部导入更加灵活。</p>
<h2 id="结语" tabindex="-1">结语 </h2>
<p>使用模块模式，我们可以封装不公开的一部分代码。这可以防止一些变量的命名冲突和全局作用域的污染，从而降低使用多个依赖项和命名空间的风险。</p>
<p>当然，为了能使用 ES5 及以上的语法，我们需要类似于 <code>Babel</code> 这样的编译器让我们能在 js 运行时使用模块化的语法。</p>]]></content:encoded>
            <author>Choi Yang</author>
        </item>
        <item>
            <title><![CDATA[观察者模式 ]]></title>
            <link>https://chodocs.cn//patterns/observer-pattern/</link>
            <guid isPermaLink="false">https://chodocs.cn//patterns/observer-pattern/</guid>
            <pubDate>Mon, 20 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[观察者模式  使用观察者模式，我们可以观察某些对象，这些对象可叫做可观察的对象。当事件触发之后，可观察的对象会通知它所有的观察者。 可观察的对象通常包含 3 个重要部分： observers 观察者：每当发生特定事件时都会通知的观察者集合 subscribe() 订阅：将观察者添加到观察者集合 Unsubscribe() 取消订阅：从观察者集合中删除观察者 notify() 通知：每当发生特定事件]]></description>
            <content:encoded><![CDATA[<p>使用观察者模式，我们可以观察某些对象，这些对象可叫做可观察的对象。当事件触发之后，可观察的对象会通知它所有的观察者。</p>
<p>可观察的对象通常包含 3 个重要部分：</p>
<ul>
<li>
<p><code>observers</code> 观察者：每当发生特定事件时都会通知的观察者集合</p>
</li>
<li>
<p><code>subscribe()</code> 订阅：将观察者添加到观察者集合</p>
</li>
<li>
<p><code>Unsubscribe()</code> 取消订阅：从观察者集合中删除观察者</p>
</li>
<li>
<p><code>notify()</code> 通知：每当发生特定事件时通知所有观察者</p>
</li>
</ul>
<p>下面，我们来创建一个可观察的对象，我们使用 ES6 class 语法，如下例子：</p>
<div class="language-js line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> Observable</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  constructor</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">() {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    this</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.observers </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> []</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">  subscribe</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">func</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    this</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.observers.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">push</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(func)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">  unsubscribe</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">func</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    this</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.observers </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> this</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.observers.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">filter</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">subscriber</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> subscriber </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">!==</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> func)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">  notify</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">data</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    this</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">.observers.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">forEach</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">observer</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =></span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> observer</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(data))</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br></div></div><p>现在，我们可以使用 <code>subscribe</code> 方法将观察者添加到观察者列表当中，而使用 <code>unsubscribe</code> 方法可以删除指定的观察者，并且可以通过 <code>notify</code> 方法通知所有的订阅。</p>
<h2 id="思路整理" tabindex="-1">思路整理 </h2>
<p>我们不妨写一个简单的应用程序，如下我们仅仅包含两个组件，一个 <code>Button</code> 和一个 <code>Switch</code>。</p>
<div class="language-jsx line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">jsx</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> default</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> App</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">() {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    &#x3C;</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">div</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> className</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"App"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      &#x3C;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Button</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">>Click me!&#x3C;/</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Button</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      &#x3C;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">FormControlLabel</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> control</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{&#x3C;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">Switch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> />} /></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    &#x3C;/</span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">div</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  )</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div><p>这个应用程序的功能如下：</p>
<p>我们希望跟踪用户与应用程序的交互，无论用户何时单击按钮或拨动开关，我们都希望用时间戳记录此事件。</p>
<p>除了记录它之外，我们还想创建一个 <code>toast</code> 通知，在事件发生时显示。</p>
<p>简单来说，就是通过打印日志和弹窗通知两种形式来记录用户的操作行为，比如用户点了一下按钮，我就打印一下日志并且通知提醒一下我做了点击操作。</p>
<p>那么通过观察者模式，我们就可以这样拆解，将可观察对象订阅打印日志和通知事件，每当用户点击按钮或者拨动开关的时候，都会调用可观察对象 <code>notify</code> 方法，通过 <code>notify</code> 方法我们可以将数据传递给所有的订阅者，在这里就是打印日志和通知这两个订阅者。</p>
<h2 id="演示" tabindex="-1">演示 </h2>
<p>来看实现的例子吧：</p>
<iframe src='https://stackblitz.com/edit/observer-pattern-demo?devToolsHeight=33&embed=1&file=src/App.js'></iframe>
<blockquote>
<p>TODO：为什么这里会有两次弹窗通知？不影响演示效果（欢迎讨论交流，可提 PR）</p>
</blockquote>
<p>我们可以在许多方面使用观察者模式，比如在使用异步，基于事件的数据时，它可能非常有用。也许您希望某些组件在某些数据下载完成后，或者每当用户向消息板发送新消息时，所有其他成员都应收到通知。</p>
<h2 id="例子学习" tabindex="-1">例子学习 </h2>
<p>使用观察者模式的一个流行库是 <code>RxJS</code>，RxJS 中有大量的内置特性和示例使用了观察者模式。</p>
<blockquote>
<p>ReactiveX combines the Observer pattern with the Iterator pattern and functional programming with collections to fill the need for an ideal way of managing sequences of events. - RxJS</p>
</blockquote>
<p>ReactiveX 将观察者模式与迭代器模式和函数式编程结合在一起，以满足对管理事件序列的理想方式的需求。- RXJS</p>
<p>使用 RxJS，我们可以创建可观察对象并订阅某些事件!</p>
<p>让我们看一下他们的文档中介绍的一个示例，该示例记录用户是否在文档中拖拉。</p>
<iframe src='https://stackblitz.com/edit/observer-pattern-rxjs-demo?ctl=1&devToolsHeight=33&embed=1&file=src/App.js'></iframe>
<h2 id="优点" tabindex="-1">优点 </h2>
<p>使用观察者模式是实现关注点分离和单一职责原则的好方法。</p>
<p>观察者对象与可观察对象不是紧密耦合的，并且可以在任何时候解耦。可观察对象就只用负责监视事件，而观察者只是处理接收到的数据。</p>
<h2 id="不足" tabindex="-1">不足 </h2>
<p>如果观察者变得过于复杂，在通知所有订阅者时可能会导致性能问题。</p>]]></content:encoded>
            <author>Choi Yang</author>
        </item>
        <item>
            <title><![CDATA[VitePress 添加本地搜索功能 ]]></title>
            <link>https://chodocs.cn//program/vitepress-local-search/</link>
            <guid isPermaLink="false">https://chodocs.cn//program/vitepress-local-search/</guid>
            <pubDate>Sun, 19 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[VitePress 添加本地搜索功能  踩坑历程 折腾了三遍 Algolia 都没能添加上搜索功能，最后在找到了这个 issus 里大佬提供的解决方案，成功添加上了本地搜索功能。 Offline search functionality #670 安装插件  bashnpm i vitepress-plugin-search markdown-it flexsearch -D 1添加和配置插件  ]]></description>
            <content:encoded><![CDATA[<div  class="warning custom-block"><p class="custom-block-title">踩坑历程</p>
<p>折腾了三遍 Algolia 都没能添加上搜索功能，最后在找到了这个 issus 里大佬提供的解决方案，成功添加上了本地搜索功能。</p>
</div>
<p><a href="https://github.com/vuejs/vitepress/issues/670" target="_blank" rel="noreferrer">Offline search functionality #670</a></p>
<h3 id="安装插件" tabindex="-1">安装插件 </h3>
<div class="language-bash line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> i</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> vitepress-plugin-search</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> markdown-it</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> flexsearch</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> -D</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><h3 id="添加和配置插件" tabindex="-1">添加和配置插件 </h3>
<p>坑点</p>
<p>1.<code>README</code> 没写在哪个目录下存放<code>vite.config.ts</code>，依据经验放在根目录下不管用，放在<code>.vitepress</code>也不生效，最后挨个试才发现需要放在<code>docs</code></p>
<p><a href="https://github.com/emersonbottero/vitepress-plugin-search#readme" target="_blank" rel="noreferrer">README</a></p>
<p>2.示例没有引入<code>flexSearchIndexOptions</code>，需要手动从<code>flexsearch</code>中引入</p>
<p>3.引入后发现之前搜索框样式没了，需要在<code>.vitepress/theme/styles/index.css</code>下重新覆盖样式</p>
<p><img src="https://zerdocs.oss-cn-shanghai.aliyuncs.com/202302052330956.png" alt="image-20230205233032922"></p>
<div class="language-typescript line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">typescript</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> flexSearchIndexOptions </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'flexsearch'</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { defineConfig } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'vite'</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// vite.config.ts</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> { SearchPlugin } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 'vitepress-plugin-search'</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// default options</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> options</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">  ...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">flexSearchIndexOptions,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  previewLength: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">100</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// 搜索结果预览长度</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  buttonLabel: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'搜索'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  placeholder: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">'情输入关键词'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> default</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> defineConfig</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">({</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  plugins: [</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">SearchPlugin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(options)],</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br></div></div><h3 id="样式覆盖" tabindex="-1">样式覆盖 </h3>
<div class="language-css line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">css</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">.DocSearch-Button</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  display</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">flex</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  justify-content</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">center</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  align-items</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">center</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  margin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  padding</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  width</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">32</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  height</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">32</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  border-radius</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">4</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  background</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">transparent</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  transition</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: border-color </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0.25</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">s</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">@media</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">min-width</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">768</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">  .DocSearch-Button</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    justify-content</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">flex-start</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    border</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> solid</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> transparent</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    border-radius</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">8</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    padding</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 10</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 12</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    width</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">100</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">%</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    height</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">40</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    background-color</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">var</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">--vp-c-bg-alt</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">@media</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">max-width</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">768</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">  .DocSearch-Button-Keys</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    display</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">none</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">  .VPNavBarHamburger</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    height</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">32</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> !important</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    width</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">32</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> !important</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    border-radius</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">4</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">px</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">.DocSearch-Button:hover</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  background-color</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">#f5f5f6</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br></div></div>]]></content:encoded>
            <author>fxzer</author>
        </item>
        <item>
            <title><![CDATA[给 VitePress 添加 algolia 搜索解决方案（高版本 alpha.37 以后） ]]></title>
            <link>https://chodocs.cn//program/vitepress-algolia-solved/</link>
            <guid isPermaLink="false">https://chodocs.cn//program/vitepress-algolia-solved/</guid>
            <pubDate>Fri, 17 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[给 VitePress 添加 algolia 搜索解决方案（高版本 alpha.37 以后）  按照之前的方案在使用 alpha.36 之前的版本是没问题的，但是由于 alpha.37 开始支持 i18n，原来的方法似乎不奏效了，在控制台 network 里发现没有返回搜索结果，这好我自己也在做文档搜索相关的内容，就去调研了一下，得到了一个非常简单的解决方案。 首先我是去 vitepress 下提]]></description>
            <content:encoded><![CDATA[<p>按照之前的方案在使用 alpha.36 之前的版本是没问题的，但是由于 alpha.37 开始支持 i18n，原来的方法似乎不奏效了，在控制台 network 里发现没有返回搜索结果，这好我自己也在做文档搜索相关的内容，就去调研了一下，得到了一个非常简单的解决方案。</p>
<h3 id="首先我是去-vitepress-下提了一个-issue" tabindex="-1">首先我是去 vitepress 下提了一个 issue </h3>
<p><a href="https://github.com/vuejs/vitepress/issues/1935" target="_blank" rel="noreferrer">algolia Search can’t return result · Issue #1935 · vuejs/vitepress</a></p>
<p>很快给我了回复，但是他是认为是我这边的爬虫问题，让我去 algolia 控制台重启爬虫，这也并没有解决，也就不不了了之了。</p>
<p>隔了几天另一位朋友在我的 issue 下留言，提供了他的爬虫配置，在爬虫文件里加了些配置，我立马去在我自己的项目里去尝试了下，没想到直接就成功了，立马过来文档里来分享给各位。</p>
<p>我自己的 vitepress 是使用的目前最新的 vitepress <code>1.0.0-alpha.45</code>，这个方法是没问题的，并且很简单，只需要在爬虫里加一些字段即可。</p>
<div class="language-json line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "index_name"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"***"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "start_urls"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"***"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">],</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "rateLimit"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "maxDepth"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "selectors"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "lvl0"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">      "selector"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">""</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">      "defaultValue"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Documentation"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    },</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "lvl1"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">".content h1"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "lvl2"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">".content h2"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "lvl3"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">".content h3"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "lvl4"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">".content h4"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "lvl5"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">".content h5"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "content"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">".content p, .content li"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "lang"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">      "selector"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"/html/@lang"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">      "type"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"xpath"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">      "global"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  },</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "selectors_exclude"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">    "aside"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">    ".page-footer"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">    ".next-and-prev-link"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">    ".table-of-contents"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  ],</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "custom_settings"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "attributesForFaceting"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"lang"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"tags"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  },</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "js_render"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br></div></div><p>这里是我自己的网站使用的搜索，大家可以去试一下。</p>
<p><a href="https://lucky-design.vercel.app/" target="_blank" rel="noreferrer">lucky-design</a></p>]]></content:encoded>
            <author>Richard-Zhang1019</author>
        </item>
        <item>
            <title><![CDATA[给 VitePress 添加 algolia 搜索（补充） ]]></title>
            <link>https://chodocs.cn//program/vitepress-algolia-plus/</link>
            <guid isPermaLink="false">https://chodocs.cn//program/vitepress-algolia-plus/</guid>
            <pubDate>Thu, 09 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[给 VitePress 添加 algolia 搜索（补充）  【编程】最新版本的 VitePress 中添加 Algolia 搜索，无坑版本 B 站视频传送门最近 vitepress 更新了好几个版本，而 chodocs 仓库依赖更新的机器人之前因为转换组织原因没启用，所以一直没有同步版本。直到最近还是有挺多粉丝来询问为什么我按照「给 VitePress 添加 algolia 搜索」 这篇文章做法]]></description>
            <content:encoded><![CDATA[<VideoLink bvId="BV1DY411v7Lt">【编程】最新版本的 VitePress 中添加 Algolia 搜索，无坑版本 B 站视频传送门</VideoLink><p>最近 vitepress 更新了好几个版本，而 chodocs 仓库依赖更新的机器人之前因为转换组织原因没启用，所以一直没有同步版本。直到最近还是有挺多粉丝来询问为什么我按照<a href="/program/vitepress-algolia/">「给 VitePress 添加 algolia 搜索」</a> 这篇文章做法而不生效，如下图所示：</p>
<CloudinaryImg publicId='program/algolia-comment_e34jfq' alt='algolia-comment'/><p>于是就有了今天的内容，还是想着补充一下，不给各位留坑。</p>
<h2 id="依旧使用-algolia" tabindex="-1">依旧使用 algolia </h2>
<blockquote>
<p>推荐这样做，也不需要继续使用我们的 ci 资源了。</p>
</blockquote>
<p>大家可以看到，chodocs 目前已经使用了最新的版本，但 <code>Algolia</code> 依旧还是生效的。</p>
<p>这已经不是用的上一篇文章的 ci 自动爬取数据了，而是基于官方的（也是上文图中最后一段所说）<code>DocSearch</code> 来爬取数据，申请地址如下：</p>
<p><a href="https://docsearch.algolia.com/apply/" target="_blank" rel="noreferrer">docsearch 申请地址</a></p>
<blockquote>
<p>如果表单提交不成功，需要使用科学上网。</p>
</blockquote>
<p>这里有几点需要注意：</p>
<ul>
<li>您必须是该网站的所有者，或至少有更新其内容的权限</li>
<li>你的网站必须是公开的</li>
<li>你的网站必须是一个开源项目或技术博客的技术文档，不授权于商业内容</li>
<li>你的网站必须到生产环境</li>
</ul>
<blockquote>
<p>from <a href="https://docsearch.algolia.com/docs/who-can-apply" target="_blank" rel="noreferrer">who-can-apply</a></p>
</blockquote>
<p>其实一般是 GitHub 上的开源项目都会申请通过的，我是大概等了 2 天样子，会收到如下类似的邮件回复，根据 key 和 id 来替换过去旧的即可。</p>
<CloudinaryImg publicId='program/algolia-email_rv2mu6' alt='algolia-email'/><h2 id="社区方案" tabindex="-1">社区方案 </h2>
<p>一位小伙伴贡献了文档，详情见<a href="/program/vitepress-local-search/">「使用 flexsearch 支持本地搜索」</a></p>]]></content:encoded>
            <author>Choi Yang</author>
        </item>
        <item>
            <title><![CDATA[给 VitePress 添加 algolia 搜索 ]]></title>
            <link>https://chodocs.cn//program/vitepress-algolia/</link>
            <guid isPermaLink="false">https://chodocs.cn//program/vitepress-algolia/</guid>
            <pubDate>Sun, 18 Dec 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[给 VitePress 添加 algolia 搜索  【编程】在 VitePress 中添加 Algolia 搜索，手把手教学 B 站视频传送门背景  最近在折腾 VitePress，搭建了一个文档项目：ChoDocs，不过文档还不支持搜索功能，虽然目前内容不多，但待我同步完之后，搜索就很有必要了。 之前看 VitePress 官网发现没有相关介绍文档，不过好在自己对于 algolia 比较熟悉了]]></description>
            <content:encoded><![CDATA[<VideoLink bvId="BV1eG4y1g7Kj">【编程】在 VitePress 中添加 Algolia 搜索，手把手教学 B 站视频传送门</VideoLink><h2 id="背景" tabindex="-1">背景 </h2>
<p>最近在折腾 VitePress，搭建了一个文档项目：<a href="https://chodocs.cn/" target="_blank" rel="noreferrer">ChoDocs</a>，不过文档还不支持搜索功能，虽然目前内容不多，但待我同步完之后，搜索就很有必要了。</p>
<p>之前看 VitePress 官网发现没有相关介绍文档，不过好在自己对于 algolia 比较熟悉了，于是自己在项目中集成了。</p>
<CloudinaryImg publicId='program/vitepress-algolia-config_psxytb' alt='vitepress-algolia-config'/><h2 id="前期准备" tabindex="-1">前期准备 </h2>
<h3 id="账号与创建应用" tabindex="-1">账号与创建应用 </h3>
<p>需要再 <a href="https://www.algolia.com/doc/" target="_blank" rel="noreferrer">algolia 官网</a> 注册一个账号，或者直接选择以 GitHub 身份登录。</p>
<CloudinaryImg publicId='program/algolia-index_kfusvo' alt='algolia-index'/><p>登录之后会进入控制台页面，点击右上角头像，会有一个设置选项，之后来到 Applications 这里，去创建一个应用，以我自己的为例，下图已经创建好了「chodocs」。</p>
<CloudinaryImg publicId='program/algolia-new-app_cqdd2f' alt='algolia-new-app'/><h2 id="配置" tabindex="-1">配置 </h2>
<h3 id="获取-key" tabindex="-1">获取 key </h3>
<p>如图下所示，进入 API Keys 页面。</p>
<CloudinaryImg publicId='program/algolia-overview_riawa3' alt='algolia-overview'/><p>会看到如下界面，一个是可公开的，<code>Search-Only API Key</code> 是待会我们在 VitePress 项目中会使用的，而 <code>Admin API Key</code> 是用于一会爬虫的 key，因为是私有的，所以一会放在 Github Secrets 中。</p>
<CloudinaryImg publicId='program/algolia-apikeys_eudmrp' alt='algolia-apikeys'/><h3 id="在文档中填写-key" tabindex="-1">在文档中填写 key </h3>
<p>在上一步我们获取了公开的 key，在这里我们就来配置一下，将上述的 <code>Search-Only API Key</code> 填到 apiKey 字段中，<strong>私有的 key 不要填</strong>！</p>
<p>修改文件在 <code>docs/.vitepress/config</code> 文件中，具体可参考链接 <a href="https://github.com/chodocs/chodocs/blob/main/docs/.vitepress/config.ts" target="_blank" rel="noreferrer">config.ts</a>。</p>
<div class="language-json line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "xxx"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">    // ...</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  },</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "algolia"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "appId"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"RDDxxx"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// 需要替换</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "apiKey"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"9302dbxxx"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// 需要替换</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "indexName"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"chodocs"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// 需要替换</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "placeholder"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"请输入关键词"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "buttonText"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"搜索"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br></div></div><h3 id="私钥放在-github-secrets-中" tabindex="-1">私钥放在 Github Secrets 中 </h3>
<p>将上述获取的 <code>Admin API Key</code> 添加到 Github Secrets 中，如下图所示，创建 <code>API_KEY</code> 和 <code>APPLICATION_ID</code> 两个字段，一会在 ci 中会使用到。</p>
<CloudinaryImg publicId='program/chodocs-settings_laq3ug' alt='chodocs-settings'/><h3 id="创建-crawlerconfig-json" tabindex="-1">创建 crawlerConfig.json </h3>
<p>在项目的根目录下创建 <code>crawlerConfig.json</code> 文件，内容如下，注意前两个字段需要进行替换。这是告诉 <code>algolia</code> 需要爬取的配置。</p>
<div class="language-json line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "index_name"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"chodocs"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">, </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// 填写自己的索引名称</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "start_urls"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"https://chodocs.cn/"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">], </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">// 填写自己的网站地址</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "rateLimit"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "maxDepth"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">10</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "selectors"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "lvl0"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">      "selector"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">""</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">      "defaultValue"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Documentation"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    },</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "lvl1"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">".content h1"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "lvl2"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">".content h2"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "lvl3"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">".content h3"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "lvl4"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">".content h4"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "lvl5"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">".content h5"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">    "content"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">".content p, .content li"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  },</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "selectors_exclude"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: [</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">    "aside"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">    ".page-footer"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">    ".next-and-prev-link"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span></span>
<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">    ".table-of-contents"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">  ],</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">  "js_render"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br></div></div><h3 id="编写-ci-脚本" tabindex="-1">编写 CI 脚本 </h3>
<p>在项目根目录<code>.github/workflows</code> 文件夹下，创建 <code>algolia.yml</code> 文件（名称可更改，自定义），粘贴如下内容：</p>
<div class="language-yaml line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">algolia</span></span>
<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">on</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">  push</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    branches</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      - </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">main</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">jobs</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">  algolia</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    runs-on</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">ubuntu-latest</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">    steps</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      - </span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">uses</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">actions/checkout@v3</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      - </span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Get the content of algolia.json as config</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">        id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">algolia_config</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">        run</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">echo "config=$(cat crawlerConfig.json | jq -r tostring)" >> $GITHUB_OUTPUT</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">      - </span><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">name</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">Push indices to Algolia</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">        uses</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">signcl/docsearch-scraper-action@master</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">        env</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">:</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">          APPLICATION_ID</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">${{ secrets.APPLICATION_ID }}</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">          API_KEY</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">${{ secrets.API_KEY }}</span></span>
<span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D">          CONFIG</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">${{ steps.algolia_config.outputs.config }}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br></div></div><blockquote>
<p>解释一下：这里 yml 就是使用 Github Actions 在 Docker 中执行的 AlgoliaDocSearch scraper action，当我们推送到 main 分支时就会立即执行这个任务，当然如果你是 master 分支只需要修改 branches 那里的值即可。</p>
</blockquote>
<h2 id="结尾" tabindex="-1">结尾 </h2>
<p>关于这个搜索个人觉得只是满足了基本的需求，而 algolia 官网的那个搜索才会功能更全面，而我之前在公司项目中就根据官网效果做了一个搜索，可以访问<a href="https://coding.net/help" target="_blank" rel="noreferrer">帮助中心</a>体验。</p>
<CloudinaryImg publicId='program/help-search_vxs4ay' alt='help-search'/><p>预计 23 年我会把这个搜索做一份开源版本，敬请期待。</p>]]></content:encoded>
            <author>Choi Yang</author>
        </item>
        <item>
            <title><![CDATA[使用 dumi 发布个人的 npm 包 ]]></title>
            <link>https://chodocs.cn//program/npm-package/</link>
            <guid isPermaLink="false">https://chodocs.cn//program/npm-package/</guid>
            <pubDate>Sat, 26 Nov 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[使用 dumi 发布个人的 npm 包  【编程】基于 dumi 2.0 发布属于个人的 npm 包 | 造轮子必备技能 | 手把手 publish | 提供文档开箱即用 B 站视频传送门前期准备  一个 npm 账号，如果没有的话需要自行注册。 npm 注册地址 dumi 基础，可以观看如下视频快速学习文档。 【编程】dumi 2.0 发布，上手使用 | 文档介绍 | 居然发现 bug？ 使用 ]]></description>
            <content:encoded><![CDATA[<VideoLink bvId="BV1RK41197eA">【编程】基于 dumi 2.0 发布属于个人的 npm 包 | 造轮子必备技能 | 手把手 publish | 提供文档开箱即用 B 站视频传送门</VideoLink><h2 id="前期准备" tabindex="-1">前期准备 </h2>
<ul>
<li>一个 npm 账号，如果没有的话需要自行注册。</li>
</ul>
<p><a href="https://www.npmjs.com/signup" target="_blank" rel="noreferrer">npm 注册地址</a></p>
<ul>
<li>dumi 基础，可以观看如下视频快速学习文档。</li>
</ul>
<p><a href="https://www.bilibili.com/video/BV1KG4y1Z7ZX/" target="_blank" rel="noreferrer">【编程】dumi 2.0 发布，上手使用 | 文档介绍 | 居然发现 bug？</a></p>
<h2 id="使用-dumi" tabindex="-1">使用 dumi </h2>
<p>通过脚手架安装，根据提示选择对应的模版，由于我们要发布 npm 包，所以选择 <code>React Library</code>。</p>
<div class="language-sh line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npx</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> create-dumi</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><h2 id="发布前注意事项" tabindex="-1">发布前注意事项 </h2>
<p>第一，npm 源需要使用 npmjs</p>
<div class="language-sh line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> config</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> set</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> registry</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> https://registry.npmjs.org</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p>第二，需要执行 <code>npm login</code>，填写用户名，邮箱等。</p>
<p>第三，package.json 里边 <code>name</code> 需要用小写，不能用大写</p>
<p>第四，确保 package.json 里边的 <code>name</code> 和目前 <a href="https://www.npmjs.com/" target="_blank" rel="noreferrer">npmjs</a> 网站已发布的不冲突。</p>
<h3 id="版本号规范" tabindex="-1">版本号规范 </h3>
<p>npm 包的版本通常遵循 <a href="https://semver.org/lang/zh-CN/" target="_blank" rel="noreferrer">semver 语义化版本</a>规范。</p>
<p>版本格式为：major.minor.patch，每个字母代表的含义如下：</p>
<p>主版本号（major）：当你做了不兼容的 API 修改，
次版本号（minor）：当你做了向下兼容的功能性新增，
修订号（patch）：当你做了向下兼容的问题修正。</p>
<p>先行版本号是加到修订号的后面，作为版本号的延伸；当要发行大版本或核心功能时，但不能保证这个版本完全正常，就要先发一个先行版本。</p>
<p>先行版本号的格式是在修订版本号后面加上一个连接号（-），再加上一连串以点（.）分割的标识符，标识符可以由英文、数字和连接号（[0-9A-Za-z-]）组成。举个例子：</p>
<div class="language-sh line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">1.0.0-alpha</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">1.0.0-alpha.1</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">1.0.0-0.2.5</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><p>常见的先行版本号有：</p>
<ul>
<li>alpha：不稳定版本，一般而言，该版本的 Bug 较多，需要继续修改，是测试版本</li>
<li>beta：基本稳定，相对于 Alpha 版已经有了很大的进步，消除了严重错误</li>
<li>rc：和正式版基本相同，基本上不存在导致错误的 Bug</li>
<li>release：最终版本</li>
</ul>
<p><a href="https://juejin.cn/post/7052307032971411463" target="_blank" rel="noreferrer">此处参考：从零开始发布自己的 NPM 包</a></p>
<p>当然，我们最好是使用命令来规范我们的版本，举例：</p>
<blockquote>
<p>以下主要介绍常用的几个命令</p>
</blockquote>
<ul>
<li><code>npm version major</code> （3.1.0 --&gt; 4.0.0）</li>
<li><code>npm version minor</code>（2.0.1 --&gt; 2.1.0）</li>
<li><code>npm version patch</code>（2.0.0 --&gt; 2.0.1）</li>
</ul>
<p>至于 prexxx 开头的，以及 release 相关可以查询下述文档拓展学习。</p>
<p><a href="https://www.npmjs.cn/cli/version/" target="_blank" rel="noreferrer">文档指引：npm version</a></p>
<h2 id="补充相关命令" tabindex="-1">补充相关命令 </h2>
<div class="language-sh line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">//</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 登录自己的</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 账号</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> login</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">//</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 退出当前账号</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> logout</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">//</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 查看当前身份</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> who</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> am</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> i</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">//</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 发布</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> publish</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">//</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> 撤销发布某个版本</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> unpublish</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> [pkg]@[version]</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br></div></div><h2 id="解决遇到的问题" tabindex="-1">解决遇到的问题 </h2>
<h3 id="_403-问题" tabindex="-1">403 问题 </h3>
<div class="language-sh line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">sh</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ERR!</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> code</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> E403</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ERR!</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 403</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 403</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> Forbidden</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> —</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> PUT</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> https://registry.npmjs.org/xxx</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> —</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> You</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> do</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> not</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> have</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> permission</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> to</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> publish</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> xxx.</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> Are</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> you</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> logged</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> in</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> as</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> the</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> correct</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> user?</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ERR!</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 403</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> In</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> most</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> cases,</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> you</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> or</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> one</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> of</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> your</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> dependencies</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> are</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> requesting</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> ERR!</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 403</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> a</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> package</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> version</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> that</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> is</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> forbidden</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> by</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> your</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> security</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF"> policy.</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><p>一般是两种情况：</p>
<ul>
<li>邮箱不对</li>
<li>package.json 里边的 <code>name</code> 和目前 <a href="https://www.npmjs.com/" target="_blank" rel="noreferrer">npmjs</a> 网站已发布的冲突了</li>
</ul>
<p>参考<a href="https://medium.com/@su_bak/solve-the-error-when-npm-publish-for-the-first-time-a4cca150f379" target="_blank" rel="noreferrer">Solve the error when npm publish for the first time.</a></p>]]></content:encoded>
            <author>Choi Yang</author>
        </item>
        <item>
            <title><![CDATA[欢迎来到编程学习内容 ]]></title>
            <link>https://chodocs.cn//program/</link>
            <guid isPermaLink="false">https://chodocs.cn//program/</guid>
            <pubDate>Fri, 25 Nov 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[欢迎来到编程学习内容  在这里分享一些编程技巧，比如 VitePress 相关配置插件等。]]></description>
            <content:encoded><![CDATA[<p>在这里分享一些编程技巧，比如 VitePress 相关配置插件等。</p>]]></content:encoded>
            <author>Choi Yang</author>
        </item>
        <item>
            <title><![CDATA[🏆 从大一到大三，我与服务外包大赛 ]]></title>
            <link>https://chodocs.cn//green/hl-contest/</link>
            <guid isPermaLink="false">https://chodocs.cn//green/hl-contest/</guid>
            <pubDate>Wed, 03 Feb 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[🏆 从大一到大三，我与服务外包大赛  前言  我与服务外包，真的是一场缘分，大一的时候因为在部门学会了做视频，在班级群看到辅导员问有没有人会做视频，我回复了，没想到我与服务外包的缘分就此展开了。。。 总结我与服务外包：大一帮忙做视频接触服务外包这个比赛，大二正式参加的服务外包拿到一等奖，大三又参加拿到二等奖。 我写这篇文章已经过了记录心路历程的最佳时间，所以这篇文章更多的是建议和打气，因为我觉得你们肯定比当时的我要厉害，我行你也行的，要相信自己！]]></description>
            <content:encoded><![CDATA[<h2 id="前言" tabindex="-1">前言 </h2>
<p>我与<a href="http://www.fwwb.org.cn/" target="_blank" rel="noreferrer">服务外包</a>，真的是一场缘分，大一的时候因为在部门学会了做视频，在班级群看到辅导员问有没有人会做视频，我回复了，没想到我与服务外包的缘分就此展开了。。。</p>
<p>总结我与服务外包：大一帮忙做视频接触服务外包这个比赛，大二正式参加的服务外包拿到<code>一等奖</code>，大三又参加拿到<code>二等奖</code>。</p>
<p>我写这篇文章已经过了记录心路历程的最佳时间，所以这篇文章更多的是建议和打气，因为我觉得你们肯定比当时的我要厉害，我行你也行的，要相信自己！</p>
<p>------ 正文开始------</p>
<p>若果你是要听故事，那么你可以从头到尾看这篇文章，若果只是想听我分享经验，可以直接跳到最后。</p>
<h2 id="缘起" tabindex="-1">缘起 </h2>
<p>一切得从一个群消息开始，是辅导员金杰学长在群里问我们有没有会做视频的，大一的我很菜，自己也就是会一些皮毛，我一时间看到了也没有回复。学长又说了是一位学姐请人帮忙，十分急迫。我想着等等我们班那些做视频做得好的回复，然而过了一会都没有人，我看着总不能没人帮这个忙吧，又不是什么坏事，于是我回了：<code>我会做视频吖~</code></p>
<p>很快学姐就加到我了，确实十分迫切，交给我的任务就是做一个他们课程系统的介绍视频，也就是从这个时候开始，我了解到了很多技术，记得当时很多名词都还不会读呢。。。</p>
<p>当时改视频改到崩溃：（这个文件一直留着得有三年了吧）</p>
<p><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4c0f2d19ce884368a3fed46113b57943~tplv-k3u1fbpfcp-zoom-1.image" alt=""></p>
<p>做的视频截取了部分：</p>
<p><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2b4da4f55d414adb8c1facf9e29f3a18~tplv-k3u1fbpfcp-zoom-1.image" alt=""></p>
<p>其实真的很坎坷，时间也很紧迫，也因我当时做视频的能力确实不行，达不到她们的期望，最后还是拉上老韩（韩梓健），熬了一个通宵，才做完整个四分多钟视频。</p>
<p>最后学长学姐拿到了三等奖，这个证书上虽然没有我的名字，但是也觉得自己收获满满，也为我之后想这个奖上有我的名字埋下了种子。。。</p>
<h2 id="从未想过的道路" tabindex="-1">从未想过的道路 </h2>
<p>第一个没想过：我当组长，第二个没想过：选一个没人选的题，第三个没想到：大二就拿国一 🏆</p>
<p>真的是从未想过的道路，其实中途一阵很慌，做为组长也压力山大。但是努力总是有回报的吧，我也一直对我们的项目很有信心，虽然我可能并不是技术的核心人物，但是大家各司其职，完成一个远大目标的这种感觉实在太妙了~</p>
<h3 id="预备阶段" tabindex="-1">预备阶段 </h3>
<p>伟帅（刘伟老师）把我们所有组拉一起讲了一下选题之后(人是真的多，整个三机房全满了)，当天晚上我们就把企业命题的 PDF 打印出五份，去小吃街的螺蛳粉店里头讨论命题。</p>
<p>第一次选题讨论：
<img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7b799b8e16b94a3db28917542f8c2196~tplv-k3u1fbpfcp-zoom-1.image" alt=""></p>
<p><strong>赛题匹配</strong>：我们拿着册子一页一页，拿着笔一遍遍的筛筛着命题，划掉不可能选的题包括且不限于大数据量化的，硬件设计的，需要自己写人工智能内核逻辑的，需要大量资金的等等，真有点职场讨论的意思。最后选题落在四个上面，两个微信小程序(其中一个就是 A11)，一个传统的跨境电商，一个 A15 景点识别。</p>
<p><strong>经典二选一</strong>：队里讨论到后面有两种声音：
赵振睿和吴若峰（上图离我远一些的两位）主张选微信小程序的，理由：</p>
<ol>
<li>本生微信是国内平台。</li>
<li>文档多，学习成本低。</li>
<li>命题的功能点虽多但都很明确。</li>
</ol>
<p>韩梓健和缪传鹏主张选 A15，理由：</p>
<ol>
<li>写这个代码必须要用到 Xcode,那玩意儿只存在于白苹果和黑苹果，白苹果不是家家都有这就刷掉一批人了，黑苹果也不是家家都会又刷掉一批人了，而韩梓健恰好又能装黑苹果，这是先天优势。</li>
<li>选 Swift 语言的好处是能把大家都拉回同一起跑线，一起从零开始学习，毕竟移动端 IOS 开发大学生肯定没有专门去学。</li>
<li>参加这个比赛主要是为了学习，就算没拿奖也没关系，以后职场能用。</li>
</ol>
<p>好家伙二比二平了呗，换你来你会怎么选呢？</p>
<p><strong>选题 ending</strong>：当时的我们才刚进大二，总结来说光脚的不怕穿鞋的，什么都要新学，为什么不选一个感兴趣的呢？经过我们三（我、缪、韩）的说服，我们五个都统一了观点。话说那个时候我们都挺自信的，可能是不知道未来要面对什么吧 😅</p>
<p><strong>选题挑战</strong>：1、谷歌的 API 是什么，返回来的结果是什么都不知道。2、当时队里五台电脑只有两台黑苹果。3、如何实现景点识别的逻辑毫无头绪。😂 真的是非常的莽，但是对于当时的我们啥都是挑战，可能这个挑战更大，但是如果我们实现了感觉能吹一辈子。</p>
<p>当时的赛题：</p>
<p><img src="https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f4d44e14e55d44fe9fa51ff0af41032d~tplv-k3u1fbpfcp-watermark.image" alt=""></p>
<h3 id="赛题启动" tabindex="-1">赛题启动 </h3>
<p><strong>启动及危机</strong>：选完题没多久，期末了。。。大家都忙着复习。。。期末弄完就又实训了。。。实训完放寒假了。。。 哪怕时间再紧凑也还是要挤出时间来的，现阶段还写不了代码，那就想功能，想创新，聊分工，总有能做的事 💗。</p>
<p>当时的需求分析：</p>
<p><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b480aa1c586c496db25b85df7a5d83d7~tplv-k3u1fbpfcp-zoom-1.image" alt=""></p>
<h2 id="十分重要的寒假" tabindex="-1">十分重要的寒假 </h2>
<p>放寒假更不好弄了，很容易就分心，虽然早就预料到了，没想到心散的这么快 💔。刚回家那一阵，都没什么人吱声，大家似乎都不知道要干些什么，没什么干劲，我想多半是我的问题，于是有了下面的张图，根据这张图明确功能点明确了分工。</p>
<p><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ed1b08efebb746b3820bf49580473c86~tplv-k3u1fbpfcp-watermark.image" alt=""></p>
<p><strong>灵魂拷问</strong>：</p>
<ul>
<li>要五个人都编码嘛？要你你怎么安排？</li>
<li>队员找不到，或有事，项目参与度低怎么办？</li>
<li>项目进度缓慢怎么办？
我在这先不说，当时的我这方面做的不是太好，后面在大三的参加的时候吸取了教训，具体怎么做的后面再说吧。</li>
</ul>
<p><strong>积极面对</strong>：寒假整个下来并不顺利，首先在群里疯狂活跃，杜绝冷场吧，基本上除了编码，能做的事我都做了，主要还是看他们吧</p>
<p>墨刀做的原型（部分）：</p>
<p><img src="https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/42251339df9c4795b11170035f684584~tplv-k3u1fbpfcp-watermark.image" alt=""></p>
<p>期间的各种文档，做的一点也不比写代码简单，如果让我选我宁愿去写代码，然而我没得选 😭，安安心心写了几千字，加上做各种图（跟写论文差不多）</p>
<p>当时的文档，各种改（不要学我这么弄，当时比较傻）：</p>
<p><img src="https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/de29ea1e82f8426cba91b9140c445cc1~tplv-k3u1fbpfcp-watermark.image" alt=""></p>
<h3 id="回学校" tabindex="-1">回学校 </h3>
<p><strong>寒假结束</strong>：文字、图片、语音翻译都有了，也就是说核心的翻译功能我们基本完成了，当然我也知道单靠这样是没法拿奖的。不过还是要吹一波组员，总还是会跟我报告一下进度，发个小视频演示一下效果，况且用的黑苹果很卡顿，这么极端条件下能做完这些已经很不错了。</p>
<p>寒假做出的功能 demo，十分简陋：</p>
<p><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/39d55ca8c872489089abf3a37163efd3~tplv-k3u1fbpfcp-zoom-1.image" alt=""></p>
<p><strong>初检查</strong>：
一回到学校不久伟帅就要检查项目了！咋办呐，没有界面，拿这个去不被骂死 😧？不过回学校还是有很多好处，大家集在一起，很快就开始进入正轨了，当时我们拿着韩梓健用 Flutter 撸出来的一个模板交货，并且讲了我们理解的大概的命题需求和想法。</p>
<p>那天伟帅在机房里提了许多想法。你们不是搞 AR 吗（可能因为我们实现了一个 AR demo）？AR 中搞一个气球，显示这个景点和你的距离，越远越小，点一下他就飞走引领你去目的地。还有啥 NLP 情感分析的，能识别出大家对于这个景点的舆论评级，进而做推荐还有很多。走出三教之后吴若峰就说&quot;咋不上天呢&quot;? 😂 哈哈哈哈哈哈哈</p>
<p><strong>启程</strong>：因为只有一个月就要交作品了，时间非常非常赶，我们回来就各种熬夜写逻辑，做界面。我和赵振睿则负责文档 PPT 的初步撰写等等。那段时间因为队里只有两台正常的黑苹果，经常是韩做完部分功能睡觉后老缪接过他的电脑继续工作。我们那几个技术 boy 那几个星期是天天熬夜，熬到三四点都是小意思了。</p>
<p><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/af33663b1fd64763b3e99ca57043ce8f~tplv-k3u1fbpfcp-zoom-1.image" alt=""></p>
<p><strong>收尾</strong>：因为我们这个软件的性质，我们去拍介绍视频就免不了“游山玩水”，我们去了五一广场，橘子洲头拍素材。拍完之后老韩（韩梓健）就开工了，这里放一段 GIF，视频做的是真的好，所以说大佬就是大佬呢，很有大片的感觉，配上音乐一绝。我呢就还是“打杂”，在组员的帮助下把能写的都写出来了，PPT 也都做出来了，最后文档 PPT 视频，加上编译的 ipa，上传，over 了，结果由天。</p>
<p>大佬做的视频片段：</p>
<p><img src="https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/cad617c135a545b6a94cd4f1d75db9ae~tplv-k3u1fbpfcp-watermark.image" alt=""></p>
<p>PPT</p>
<p><img src="https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/06cd356c79c147f5a317c31b428fdd38~tplv-k3u1fbpfcp-watermark.image" alt=""></p>
<h3 id="决赛" tabindex="-1">决赛！ </h3>
<p>那天我们还在上课，组员突然发我消息说我们进了，一看文件确实我们进决赛了，这意味着我们可以去无锡了！当天晚上我们又去那家螺蛳粉的店里搓了一顿，看了一下名单 A15 进决赛的全国就五支队伍，之前中南，南邮选这个题目的都被刷掉了，不禁唏嘘。A11 有 11 个队伍，而且学校另外两个进决赛的也都选了 A11，反正怎么想都觉得当时没选 A11 或者另外一个微信小程序题目的决定多么正确 ✌️。再加上我们有 AR，实际上从那时候开始我们还是很有信心的，底气来自于各种核心代码逻辑，各种核心功能实现都是自己写出来的。伟帅把我们叫去开会，让我们准备答辩，做好 PPT 录好视频，准备好稿子什么的。</p>
<h3 id="喜讯" tabindex="-1">喜讯！ </h3>
<p><strong>到了酒店</strong>：经过了一天的高铁，我们一行人都挺累的了，不过当天晚上伟帅还是拉着我们再阿里是房间又来了一场排练，当时吴若峰已经对 PPT 非常熟悉了，都可以做到不看 PPT 从头到尾娓娓道来。第二天就要比赛，我让他们早点休息，缪传鹏还在改代码，第二天早上和我说 AR 翻译做到所见即所得了，没有延迟，花了一个晚上给 AR 绘图加了多线程，大大提升速度。我已听到高兴坏了，之前还担心评委要求演示 AR 半天半天不出来呢，现在可以说是真的一点都不慌了。</p>
<p>一大早缪传鹏还在改代码：</p>
<p><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ed5e5bb532d94aafb3ffd6b4524b9c72~tplv-k3u1fbpfcp-zoom-1.image" alt=""></p>
<p><strong>答辩</strong>：我们抽到的签是下午一点的，当时咱们学校的另外两个队伍都已经答完了，看着都挺轻松的，我们也不慌，进答辩室之前都是有说有笑的。进去之后正常的按流程，答辩，视频演示。回答问题也是一样，因为创新点，功能点是在你这边，你知道你为什么要做这个功能，你怎么做这个功能，所以，其实主导权在你手里，无论老师怎么问，万变不离其宗。换句话说，只要老师问到了我们设计的功能点上，我们都能回答的非常好。反而让我们担心的是他们如果问成本，问市场价值这些虚幻的东西我们可能会紧张答不好，但其实也无所谓，毕竟我们做足了百分的准备...</p>
<p>一出答辩门，我们都小声的说 <code>稳了，稳了</code>，伟帅看我们一脸笑意的走过来，也笑了，都不需要问我们情况，我们路上还在想该不会我们三个队伍都拿一等奖吧哈哈哈。</p>
<p><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b88aa79c298249069ab57c8c428c032a~tplv-k3u1fbpfcp-zoom-1.image" alt=""></p>
<p><strong>一通电话</strong>：第二天早上我原本想睡个懒觉，因为昨晚大家一起庆祝玩累了，迷迷糊糊接到志愿者的电话说要去彩排，三支队伍有两只接到了电话，我们推断我们就是一等奖了，掩饰不住的喜悦，急匆匆的就去了江大。然后体育馆彩排照片传回来实锤了就是一等奖，高兴的一批 😆。</p>
<p><strong>完结撒花</strong>：接下来就是开心的玩耍啦，伟帅还请我们搓了一顿，然而时间还是有限，也就玩了一天，收获满满回学校了~
一回学校我就发了说说，当时要是我有博客就可以把这些分享给更多人了：</p>
<p><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4c5f6aec70c9421d9d59577487b28ce6~tplv-k3u1fbpfcp-watermark.image?" alt="说说"></p>
<h2 id="大三" tabindex="-1">大三 </h2>
<p>没错大三我又参见了这个比赛，确实是觉得自己在之前的比赛中，技术方面没有学到很多，于是我和赵振睿两个就一起约着继续参加。大三期间我们也学了一些新的技术，其中两个组员就是课题作业的两位，还有一位则是睿哥他们组的组员。然后就是整装待发，开始了第二次的服务外包大赛之旅。</p>
<h3 id="准备阶段" tabindex="-1">准备阶段 </h3>
<p>其实大体上和大二是差不多的，如果硬要说区别，可能是更沉稳了？当时也是有比较成熟的技术栈了，就想学学对以后找工作有用的新技术，于是采用了相对比较保守的选题策略。
然后就还是老样子啦，依然是要考试等等事情，不过倒是不是很慌问题不大，毕竟身份不同，现在可是老学姐了啦哈哈哈~</p>
<h3 id="疫情来袭" tabindex="-1">疫情来袭 </h3>
<p>寒假回家之前，我们已经完成了原型设计，需求分析，创新点分析，前端要用的一些框架也学得差不多了。接着回到家，我制定了一系列的计划，人员安排，保证人人都有事情做。要说我唯一没有料到的事情就是疫情，我也没法预料。说实话确实是有一阵子乱了针脚。每天都实时关注着各类信息，时不时被感动又被气炸，可能还睡不好觉，不过好在疫情慢慢转好，心情也不再那么容易波动，修整之后很快我们又步上了正轨。</p>
<p><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ab3055a0f194483c9769622604615082~tplv-k3u1fbpfcp-zoom-1.image" alt=""></p>
<p>不过仔细想想有没有疫情我们五个注定都是要宅在在家写代码的。当然依旧还是会出现问题，比如一个功能点久久实现不出来，这个赛题要求的文档太多了怎么办，真的想不出创新点又怎么办？等等。。。</p>
<p><strong>漫长的假期</strong>：感觉每天都在重复上演，每天都在做着差不多的事，只不过饭菜发生了一些改变，经常是写着写着一下午就过去了，又要吃晚饭了。在加上疫情的缘故改成了网上授课，原本我们计划回学校一起讨论写代码什么的都泡汤了，“假期”感觉又长了许多。。。于是只能继续沿用假期的管理方案，白天就是自由写代码还有上课，晚上咱们就开会议视频 7 点到 10，也不是说一定要讲什么事，有事就一起快速讨论解决了，没事就还是各自写代码（没有疫情，我们就会是在机房疫情写的了）</p>
<p>也不知道因为这个会议视频我产出了多少黑照：</p>
<p><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e24bf86f4e834c009738a387efcee0a9~tplv-k3u1fbpfcp-zoom-1.image" alt=""></p>
<p>每星期一篇的汇报情况文档：</p>
<p><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5c6c495811594cadba16dfc55cf0996f~tplv-k3u1fbpfcp-watermark.image" alt=""></p>
<p><strong>独当大任</strong>：除了写代码，还有一个重大的工程，那就是做视频了，以前还有老韩在，现在我要一个人来面对了哎~。没有办法拿起鼠标就是干呗，找素材录音剪辑，全自学，直接实践，现在回头看觉得实在是挺猛的。不过确实还是不是非常完美的，毕竟当时时间还是比较紧张嘛，虽然没有老韩那个视频那么上档次，但这个扁平化小清新的风格是视频还是符合我们软件介绍的感觉的。</p>
<p>放个视频片段吧：</p>
<p><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d254f88b905b4647b902470edb4381e3~tplv-k3u1fbpfcp-zoom-1.image" alt=""></p>
<h3 id="回到学校" tabindex="-1">回到学校 </h3>
<p>回到学校，完善了所有要提交的东西，最终交了上去，等待通知。不过我们基本不会熬夜了，前期该做的都做了，可能就是改改界面改改视频以及文档的一些工作。</p>
<p><strong>区域赛</strong>：不过和以往不同的是，今年开始（2020）开始分区域赛了，进了区域赛再比一轮才能进决赛，门槛比以往高了许多，痛苦也加倍。。。还记得当时同样的场景，还是在课间，收到伟帅在大群里发的获奖名单，怀着忐忑的心情点开了它，搜索着我们的组名，进了！一下子石头落地，甚至想哭 😭</p>
<p><strong>答辩</strong>：我是最了解我们这个项目的人，毫无疑问答辩主讲的任务落在了我的头上，连夜写主讲稿，每次都还是会有一些些失误，伟帅也一直说我可以更自信，稿子要记熟，不要死记。我就拿着稿子天天背，晚上睡觉脑子里还会自动想稿子里的内容。当时觉得自己哪里都有问题，自带湖南口音难纠正这是一，二呢说得太快经常性顺嘴或者卡壳，三呢用伟帅的话说就是没有激情，给我造成了挺大打击的，但是组员总是会在我垂头丧气时给我鼓励，感恩~💕</p>
<p><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/14ed476d6e804534a453787919a47864~tplv-k3u1fbpfcp-zoom-1.image" alt=""></p>
<h3 id="决赛-1" tabindex="-1">决赛 </h3>
<p>其实还是有遗憾的，没能再去一趟无锡，只能远程参见决赛，彩排也只能各自在家中。</p>
<p><strong>压力</strong>：进决赛是有想到过的，毕竟当时我们做的准备十分充足，并且答辩过程也不错。没有想到的是全校只有我们一个队进了决赛，这就意味着老师都会来盯我们了~虽然也没想过划水，但是压力确实还是会有的。加需求、改视频、加创意等等一堆事儿又来了，不想再讲了，总之就是挺枯燥的。</p>
<p><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/870e2a1b2fb44aa4a4221caa7d3d0f4b~tplv-k3u1fbpfcp-watermark.image" alt=""></p>
<p>经过几天的远程彩排，终于到决赛那一天了。还是像之前彩排一样我进行着我的演讲，只不过对象从我认识的老师换成了评委老师们。很快如流水般就结束了，问的问题我们也都八九不离十都答出来了。结束后倒是感觉非常不真实，就结束了嘛？我打开手机，志愿者又在报下一组准备了，关上手机，长叹一口气，都结束了~</p>
<p><img src="https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/16d84ca75a50475b96b40a2d9ca03f4e~tplv-k3u1fbpfcp-watermark.image" alt=""></p>
<p><strong>噩耗</strong>：颁奖当然也还是远程观看的，宣布得奖就是一张名单，仔细查找发现没有我们队，甚至我们这个题都没有一等。我们只能苦笑，忙活半天还是二等奖嘛，之前还想着一等奖没跑了呢 😂</p>
<p><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/06e65ebb287a4aef978279f1c80e8147~tplv-k3u1fbpfcp-zoom-1.image" alt=""></p>
<p>也许是线上的原因吧，也没有那么难过，也询问了伟帅，确实是存在有的赛题没有一等的情况，毕竟那么多题，有的题可能还会有两个一等。我们只能叹了口气，自认选题没选好咯。当天还想发个说说，一翻也没什么合适的照片，呜呜呜要是没有疫情，我们的比赛就是线下了，还可以“白嫖”学校的赞助，还能在无锡游玩 😭</p>
<p>好吧故事到这就结束了。。。没有图片。。。</p>
<p>💜 下面是我给参加服务外包比赛的学弟学妹们的一些建议 💜</p>
<h2 id="我的一些小建议" tabindex="-1">我的一些小建议 </h2>
<p>我给的建议完全是参考我自己的经验，其实每个组的情况都是不一样的，但是我希望我踩过的坑你们就不要再踩了，我的一些经验能给你一些参考~</p>
<h3 id="给大二同学的建议" tabindex="-1">给大二同学的建议 </h3>
<p>大二我们选的赛题任务是做一个基于 swift 开发的景点智能识别语言翻译 iOS 软件</p>
<p><strong>赛题阶段</strong></p>
<p>当时我们选了一个没有一个队选的赛题，不过我们很有信心，这个信心来自于对赛题的琢磨，队员的情况我们当时就是非常自信，啥也不怕，因为啥对我们都是新的，光脚不怕穿鞋的，但我们都有学新知识的干劲，并且志向高远就是要拿全国一等奖。</p>
<p>总结起来就是几点：</p>
<ol>
<li>要<code>有信心</code>，不仅对自己还有对你的组员</li>
<li>仔细<code>琢磨每个赛题</code>，了解组员们，选出你们最合适的赛题</li>
<li>对于<code>新知识不要怕</code>，要有学新知识的干劲</li>
</ol>
<p><strong>回家前（大三也适用）</strong></p>
<p>分工明确，时间规划明确（最简单的就是用笔记下来，当然可以也可以找一些高效的协同工具），最好在回家前对队员的职责非常明确，对自己的组员要有基本了解，在一起就多讨论。</p>
<p><strong>在家（大三也适用）</strong></p>
<p>项目汇报要认真督促，不要糊弄老师糊弄自己。</p>
<p>找不到队员的情况，确实存在，但是最后要了解清楚是什么原因，会造成什么后果，然后组内讨论调整。</p>
<h3 id="给大三同学的建议" tabindex="-1">给大三同学的建议 </h3>
<p>大三我们选的赛题是做一个绿色积分系统嵌入码上行 APP。</p>
<p>选题上还是大二差不多，只不过大三的同学们应该是已经有相对成熟的技术栈了，推荐采用了保守选题的策略，不过关键还是看你们啦。</p>
<p>其他的规划管理还是和大二差不多，可以试着用用除 QQ 以外的一些沟通工具，这里我们可以用一些高效的远程协同工具，比如远程视频（钉钉、腾讯会议），文档协同等等，来提高效率，减少沟通成本。</p>
<h3 id="一些工具的推荐" tabindex="-1">一些工具的推荐 </h3>
<p>有很多学弟学妹问我视频怎么做，怎么管理团队等等，我这里还是有些工具推荐给大家的。
做文档需要的：</p>
<ul>
<li><code>ProcessOn</code> 可以实现免费在线作图、实时协作</li>
<li><code>XMind</code>: 做思维导图的，超级好用</li>
<li><code>腾讯文档、金山文档、石墨文档</code> :在线协同编辑文档</li>
<li><code>starUML</code>画 UML 等图的</li>
</ul>
<p>做 PPT 需要的（美观）：</p>
<ul>
<li>如果只是想做简单的 PPT，就用<code>office PPT</code>就行</li>
<li>如果追求美观，那必须得用 PPT 模板呀：<code>52PPT</code>（可以下到免费的 PPT）、<code>包图网</code>（找网络部的借会员）、<code>千图网</code>（也是要借会员，也可以去某宝买）、<code>iconfont</code>（图标库）、<code>flaticon</code>（PPT 图标库，需要访问外网）</li>
</ul>
<p>做视频需要的</p>
<ul>
<li>有条件的可以用 <code>finalCut</code>，我是没有这个条件，没用过，但是韩梓健用的这个，说挺好用的（大二那个视频）</li>
<li><code>万彩动画大师</code>，我比较推荐的，很好上手，新手友好，扁平化，模板也算多的</li>
<li><code>pr</code>，常规吧，我用还算习惯，毕竟我只用那么几个功能，做完加个音频剪辑一下的时候用</li>
<li><code>ae</code>，容易卡，模板不多，难上手，我没玩会，不推荐吧，但是用它做特效应该不错，但是一般我们也没这个需求不是吗？</li>
</ul>
<p>这些都只是辅助工具，还是要看你怎么用，可能还有一些忘记写上去了，但基本就这些就足够了</p>
<h2 id="最后的提醒" tabindex="-1">最后的提醒： </h2>
<ul>
<li>每次老师组织的会议都要认真记录很有用，官方和学校赛题群及时关注消息，利用好官网提供的答疑系统去提交对赛题的疑问。</li>
<li>反复琢磨赛题，琢磨赛题不仅仅是确定需求，挖掘需求，需求排序</li>
<li>组长最好可视化需求，可视化进度安排，反复根据打分规则自评分析</li>
<li>团队很重要，不然就变成一个人在写项目了。不互相督促，跟进度，项目完成不了</li>
<li>最后一定要留充足的时间写文档和做视频，这个是非常重要的，大家也都是懂的，你交上去的东西就是文档和视频，打分也基本根据你提交的文档视频和 PPT 来打分，所以要提前规划好</li>
</ul>
<p>💜💜💜 就写到这了，其实应该更早一点发，一直拖到现在，不过也算是对我大学生活的一大部分的总结了 💜💜💜</p>
<p>写这篇文章也不知道会不会有人看 💔，如果你看到这了，觉得故事不错或者对你有一点点帮助的话，就给个三连再走吧~❤️</p>
<p><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/52899d88b6f64c77bc42b74849476342~tplv-k3u1fbpfcp-zoom-1.image" alt=""></p>]]></content:encoded>
            <author>HearLing</author>
        </item>
        <item>
            <title><![CDATA[【河南-郑州之旅】暨 FPX 夺冠&amp;湖南中医药大学夺冠！（上篇） ]]></title>
            <link>https://chodocs.cn//green/ch3.html</link>
            <guid isPermaLink="false">https://chodocs.cn//green/ch3.html</guid>
            <pubDate>Wed, 13 Nov 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[【河南-郑州之旅】暨 FPX 夺冠&amp;湖南中医药大学夺冠！（上篇）  TIP 文章编写于 2019 年 11 月 13 日 —— 记录美好的时光！ 引言  对于这次全国大型比赛，已经过去三天了，想来想去，还是打算写一份心路历程，或许是年龄大了，“越重感情了”，对于一些愉快的事情，总想着用时光机存着，以后当我翻阅这篇文章，或许又是满满的喜悦呢~ 第一天  这次大赛呢，主体流程如下，从长沙南到郑]]></description>
            <content:encoded><![CDATA[<div  class="tip custom-block"><p class="custom-block-title custom-block-title-default">TIP</p>
<p>文章编写于 2019 年 11 月 13 日 —— 记录美好的时光！</p>
</div>
<p><img src="https://img-blog.csdnimg.cn/20191113175550908.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQyOTcxOA==,size_16,color_FFFFFF,t_70" alt=""></p>
<h2 id="引言" tabindex="-1">引言 </h2>
<p>对于这次全国大型比赛，已经过去三天了，想来想去，还是打算写一份心路历程，或许是年龄大了，“越重感情了”，对于一些愉快的事情，总想着用时光机存着，以后当我翻阅这篇文章，或许又是满满的喜悦呢~</p>
<h2 id="第一天" tabindex="-1">第一天 </h2>
<p>这次大赛呢，主体流程如下，从长沙南到郑州东，我们一行 9 个参赛选手，2 位老师一同坐高铁前往目的地，大约 3 个小时 40 分钟。基本上是队内坐在一块，比较有意思的是在等候高铁的时候，老师发现就我一个人带了行李箱，然后就被问到：杨超逸，你带这么大行李箱，难道是要给女朋友带特产回去么？ 后面就疯狂八卦我女朋友。。。然后还知道我不止一个。。。后面弄的学弟也知道了，也是疯狂八卦~ 好了，不多说了，这篇文章重点不在这！</p>
<p><img src="https://img-blog.csdnimg.cn/2019111317161995.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQyOTcxOA==,size_16,color_FFFFFF,t_70" alt=""></p>
<p>下面说我们这次比赛具体行程，我觉得酒店挺不错的（露出了白嫖的笑脸），居然还提供了自助早餐，像我这种白嫖党，发现了酸奶，直接拿着壶直接开怼。。。然后特别感谢这次河南中医药大学的优秀志愿者们，觉得特别贴心，一直带领我们，该去哪里，学校景点食堂特色等等都详细告诉我们，并且有什么重要事情都会给我们每一个人说的清清楚楚，这里表示感谢！总之，是一次不错的比赛（旅行）！</p>
<p><img src="https://img-blog.csdnimg.cn/20191113175607986.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQyOTcxOA==,size_16,color_FFFFFF,t_70" alt=""></p>
<h2 id="第二天-白天" tabindex="-1">第二天-白天 </h2>
<p>上午可以说是开了好久好久的会议，我差不多把手机里面下载的剧快看完了。。。然后就是在比赛前进行拍照了，下面就是我们湖南中医药大学的 3 个队伍，应该还不知道本人是谁 哈哈哈 后面还会有图片的 拍照的时候稍微溜达了一会，就感觉和我们学校相比，简直太大了，每条路我都看不到尽头。。。 开完会议后就是食堂吃饭了，不得不提一句真香，河南那边物价确实挺低的，一个蛋挞居然只卖一块钱，在我们学校 3.5 起步的那种。。。 然后食堂一餐饭 7-8 块就够你吃了，我反正是点了没办法吃其他的了，然后在我们湖南这边一顿饭 20 左右才够吃，如果要是陪女朋友出去吃，外面价格会更高一点！</p>
<p><img src="https://img-blog.csdnimg.cn/20191113175617534.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQyOTcxOA==,size_16,color_FFFFFF,t_70" alt=""></p>
<p><img src="https://img-blog.csdnimg.cn/20191113175625469.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQyOTcxOA==,size_16,color_FFFFFF,t_70" alt="">
然后再下午打了一场热身赛嘛，下面是封榜后的图，我们学校应该是做了 4 道题，然后我们含浦幼稚园队处在银牌区，然后这次比赛自我感觉的话是稳银了，热身赛嘛，放松心情找找感觉就是了，明天正式赛才是关键的！</p>
<p><img src="https://img-blog.csdnimg.cn/20191113175634377.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQyOTcxOA==,size_16,color_FFFFFF,t_70" alt=""></p>
<h2 id="第二天-晚上" tabindex="-1">第二天-晚上 </h2>
<p>晚上，是比较爽的，因为比赛那天没有晚餐吃了，所以要把餐票尽快消费，每个人都有 80 的餐票，然后物价又比较低，可以吃好多好多东西了</p>
<p><img src="https://img-blog.csdnimg.cn/20191113175640601.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQyOTcxOA==,size_16,color_FFFFFF,t_70" alt=""></p>
<p>这里也不知道怎么就被老师偷拍了，还配了文字（哭笑）</p>
<p><img src="https://img-blog.csdnimg.cn/20191113173146366.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQyOTcxOA==,size_16,color_FFFFFF,t_70" alt=""></p>
<p><img src="https://img-blog.csdnimg.cn/20191113173611361.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQyOTcxOA==,size_16,color_FFFFFF,t_70" alt=""></p>
<h2 id="第三天-正式比赛" tabindex="-1">第三天-正式比赛 </h2>
<p>这也是最后 1 小时封榜图，我们学校 10 题，夺得第一次全国中医药冠军，然后我们含浦幼稚园也是比较幸运，后面有几个队和我们一样的题目，还 try 了几个题，最后没 ac，我们运气上拿到了最后一块金，不过我们队之后也太多的高兴，因为学长学姐可以是比我们多一倍的题啊，这次比赛是他们的退役战，我们与他们还是有很大差距的，这次只是运气好了一点点。</p>
<p><img src="https://img-blog.csdnimg.cn/20191113175652693.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQyOTcxOA==,size_16,color_FFFFFF,t_70" alt=""></p>
<h2 id="荣誉情况" tabindex="-1">荣誉情况 </h2>
<p>这后面也没啥好说的了，就是一些获奖荣誉了</p>
<p><img src="https://img-blog.csdnimg.cn/20191113175702802.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQyOTcxOA==,size_16,color_FFFFFF,t_70" alt=""></p>
<p><img src="https://img-blog.csdnimg.cn/20191113175710314.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQyOTcxOA==,size_16,color_FFFFFF,t_70" alt=""></p>
<p><img src="https://img-blog.csdnimg.cn/20191113174816369.png" alt=""></p>
<p><img src="https://img-blog.csdnimg.cn/2019111317484251.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQyOTcxOA==,size_16,color_FFFFFF,t_70" alt=""></p>]]></content:encoded>
            <author>Choi Yang</author>
        </item>
        <item>
            <title><![CDATA[【河南-郑州之旅】暨 FPX 夺冠&amp;湖南中医药大学夺冠！（下篇） ]]></title>
            <link>https://chodocs.cn//green/ch4.html</link>
            <guid isPermaLink="false">https://chodocs.cn//green/ch4.html</guid>
            <pubDate>Wed, 13 Nov 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[【河南-郑州之旅】暨 FPX 夺冠&amp;湖南中医药大学夺冠！（下篇）  TIP 文章编写于 2019 年 11 月 13 日 —— 记录美好的时光！ FPX 总冠军（我们又是冠军！）  终于 LPL 两连冠了，都还是 3 比 0，正好我们学校也是当天夺冠，真是一个不错的一天~ 男生节（感谢女神们送上的礼物~）  打完了比赛，回去正好过男生节，不过我们班女生有一个特点，那就是会在双 11 那天给]]></description>
            <content:encoded><![CDATA[<div  class="tip custom-block"><p class="custom-block-title custom-block-title-default">TIP</p>
<p>文章编写于 2019 年 11 月 13 日 —— 记录美好的时光！</p>
</div>
<h2 id="fpx-总冠军-我们又是冠军" tabindex="-1">FPX 总冠军（我们又是冠军！） </h2>
<p>终于 LPL 两连冠了，都还是 3 比 0，正好我们学校也是当天夺冠，真是一个不错的一天~</p>
<p><img src="https://img-blog.csdnimg.cn/20191113175834121.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQyOTcxOA==,size_16,color_FFFFFF,t_70" alt=""></p>
<p><img src="https://img-blog.csdnimg.cn/20191113182049595.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQyOTcxOA==,size_16,color_FFFFFF,t_70" alt=""></p>
<h2 id="男生节-感谢女神们送上的礼物" tabindex="-1">男生节（感谢女神们送上的礼物~） </h2>
<p><img src="https://img-blog.csdnimg.cn/20191113180227698.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQyOTcxOA==,size_16,color_FFFFFF,t_70" alt=""></p>
<p>打完了比赛，回去正好过男生节，不过我们班女生有一个特点，那就是会在双 11 那天给我们送礼物过来，下面就是我们一些礼物了，特别好看~</p>
<h2 id="礼物篇" tabindex="-1">礼物篇 </h2>
<p><img src="https://img-blog.csdnimg.cn/20191113180607433.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQyOTcxOA==,size_16,color_FFFFFF,t_70" alt=""></p>
<p><img src="https://img-blog.csdnimg.cn/20191113180617664.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQyOTcxOA==,size_16,color_FFFFFF,t_70" alt=""></p>
<p><img src="https://img-blog.csdnimg.cn/20191113180644919.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQyOTcxOA==,size_16,color_FFFFFF,t_70" alt=""></p>
<h2 id="结语" tabindex="-1">结语 </h2>
<p>现在也是大三上学期过了一大半了，只剩下一个多月左右时间了，最后说一说共勉的话吧，这次比赛对我来说意义挺大的，其实我的 acm 个人能力不是很强，拿奖可以说是靠这队内大佬，不过见到优秀的人我会更加激励自己变得优秀起来。也希望看到这里的你一起加油！我也没太多想说的了，挑了几句共勉的句子：</p>
<p><strong><font color=Purple>① 只有拥有一串充实的今天，我们才会拥有一个饱满的人生。</font ></strong></p>
<p><strong><font color=SaddleBrown>② 人生的快乐与否，有时完全在于心态，若快乐，生活也就变得快乐！所以，我们快乐与否，不在于拥有什么，而在于怎样看待自己所拥有的一切。生活是快乐的源泉，有了生活，快乐就不会枯竭。生活中并不缺少快乐，缺少的是发现快乐的眼睛，缺少的是感到快乐的心。</font ></strong></p>
<p><strong><font color=Orchid>③ 如果你把自己当成泥土，就不会有珍珠被埋没的痛苦；如果你用欣赏的眼睛看人，就能看到值得尊重和学习的人。</font ></strong></p>
<p><strong><font color=PaleVioletRed>④ 在这个世界上，没有一劳永逸，完美无缺的选择，您不可能同时拥有春花和秋月，不可能同时拥有硕果和繁花。不可能所有的好处都是您的。您要学会权衡利弊，学会放弃一些什么，然后才可能得到些什么。您要学会接受生命的残缺和悲哀，然后，心平气和，因为，这就是人生。</font ></strong></p>
<p><strong><font color=Peru>⑤ 也许你想成为太阳，可你却只是一颗星辰;也许你想成为大树，可你却是一棵小草。于是，你有些自卑。其实，你和别人一样，也是一片风景：做不了太阳，就做星辰，在自己的星座发光发热;做不了大树，就做小草，以自己的绿色装点希望……</font ></strong></p>]]></content:encoded>
            <author>Choi Yang</author>
        </item>
        <item>
            <title><![CDATA[2019 年 第二届信息科学与工程学院院赛-正式赛(赛后补题) ]]></title>
            <link>https://chodocs.cn//green/ch2.html</link>
            <guid isPermaLink="false">https://chodocs.cn//green/ch2.html</guid>
            <pubDate>Thu, 20 Jun 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[2019 年 第二届信息科学与工程学院院赛-正式赛(赛后补题)  TIP 文章编写于 2019 年 06 月 20 日 —— 发表完失败感想之后，想着还是要继续比赛，先补完题再说，跌倒了再爬起来。 1500：XP 的矩阵  分析： 这道题注意只能向下或者向右移动，令 dp(i,j)表示 XP 学长走到位置为(x,y)时路径和的最小值，因此你可以得到状态转移方程 dp(i,j) = min(dp(i]]></description>
            <content:encoded><![CDATA[<div  class="tip custom-block"><p class="custom-block-title custom-block-title-default">TIP</p>
<p>文章编写于 2019 年 06 月 20 日 —— 发表完失败感想之后，想着还是要继续比赛，先补完题再说，跌倒了再爬起来。</p>
</div>
<h2 id="_1500-xp-的矩阵" tabindex="-1"><a href="http://acm.hnucm.edu.cn/JudgeOnline/problem.php?id=1500">1500：XP 的矩阵</a> </h2>
<p>分析：</p>
<p>这道题注意只能向下或者向右移动，令 dp(i,j)表示 XP 学长走到位置为(x,y)时路径和的最小值，因此你可以得到状态转移方程 dp(i,j) = min(dp(i-1,j),dp(i,j-1)) +a(i,j)。</p>
<p>注意初始化的时候让其他地方变为最大值，保证在矩阵内行走，然后 dp[1][0]=dp[0][1]=0 是为了起点的初始化</p>
<div class="language-c line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">&#x3C;bits/stdc++.h></span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">#define</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> mst</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">a</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">memset</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">0x</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">3f</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">sizeof</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a))</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">using namespace std;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> maxn</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1000</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">map</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> mp;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">map</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">::iterator it;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70"> g</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[maxn][maxn];</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70"> dp</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[maxn][maxn];</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> n;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> t;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    cin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">t;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    while</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(t</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">        mst</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(dp);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> n,m;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        cin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">n</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">m;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">n;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> j</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;j</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">m;j</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                cin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">g</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[i][j];</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">        dp</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">][</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">dp</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">][</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">n;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> j</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;j</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">m;j</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            {</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">                dp</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[i][j]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">min</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">dp</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">][j],</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">dp</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[i][j</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">])</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">g</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[i][j];</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> res</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">dp</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[n][m];</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        cout</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">res</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">endl;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br></div></div><h2 id="_1504-xp-的二进制操作数列" tabindex="-1"><a href="http://acm.hnucm.edu.cn/JudgeOnline/problem.php?id=1500">1504: XP 的二进制操作数列</a> </h2>
<p>分析:</p>
<p>这道题挺有意思的，看懂了就是一个水题，为了使得数列中所有数字变为零，你需要使得它们先成为相同的某个数字，考虑 or 操作，那么你只需要 or 上一个二进制下位数全为 1 的数 y，即可让一个数 x 变成 y，之后你只需要再 xor 一次 y 即可得到全零的数列，另外题目的坑点在于可能初始时数列就是完全相同的。并且如果数列全为 0 的话要特别考虑 全 0 不需要操作，所以操作次数为 0</p>
<p>那么就很显然了，如果数列完全相同（除开全 0）操作次数为 1 （与自己异或就行了），不完全相同就 2 次 （先 or 一个 2 的 32 次方-1 的数 使自己变为全 1 然后再异或这个全 1 操作次数为 2）</p>
<div class="language-c line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">&#x3C;bits/stdc++.h></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">using namespace std;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> maxn</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">100000</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">long</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> long</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70"> a</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[maxn];</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">set</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;long</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> long</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> ></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">st;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> t;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    cin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">t;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    while</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(t</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        st.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">clear</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">();</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> n;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        cin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">n;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        bool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> flag</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">n;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            long</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> long</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            cin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">x;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(x</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">!=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                flag</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            st.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">insert</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(x);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(flag)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">             int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> len</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">st.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">size</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">();</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(len</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">!=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                cout</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">endl;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            else</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                cout</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">endl;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        else</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            cout</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">endl;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br></div></div><h2 id="_1505-xp-的橘子洲" tabindex="-1"><a href="http://acm.hnucm.edu.cn/JudgeOnline/problem.php?id=1500">1505: XP 的橘子洲</a> </h2>
<p>分析：</p>
<p>这个题原本学长是想考我们 xor 异或操作的，但是我用 map 做了，因为那个特别的烟花只有 1 个 所以对所有烟花，相同的就++ 然后如果 value 值为 1 就输出那个就行了</p>
<div class="language-c line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">&#x3C;bits/stdc++.h></span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">#define</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> mst</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">a</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">memset</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a,</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">sizeof</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a))</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">using namespace std;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> maxn</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1000000</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70"> a</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[maxn];</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">map</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> mp;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">map</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">::iterator it;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> n;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    cin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">n;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">n;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        cin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">x;</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">        mp</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[x]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(it</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">mp.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">begin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">();it</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">!=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">mp.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">end</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">();it</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(it->second</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">==</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            cout</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">it->first</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">endl;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br></div></div><div  class="info custom-block"><p class="custom-block-title custom-block-title-default">INFO</p>
<p>经过暑假刷题后，明白了异或操作，特来补上简单异或操作！</p>
</div>
<p>位异或:
一个数与 0 异或 等于它本身
一个数与自己异或 等于 0</p>
<p>即对于一个任意一个数 n，它有几个特殊的性质：</p>
<p>1、0^n = n</p>
<p>2、n^n = 0
所以可以通过每次异或运算，最后剩下的值就是出现奇数次的那个数字。</p>
<p>==另外，附上位异或的一些运算法则==</p>
<p>1、a^b = b^a</p>
<p>2、(a ^ b) ^ c = a ^ ( b ^ c )</p>
<p>3、a ^ b ^a = b</p>
<div class="language-c line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">&#x3C;iostream></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">using namespace std;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> maxn</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">e</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">6</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70"> a</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[maxn];</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> n;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    cin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">n;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> res</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">n;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        cin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">x;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        res</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">^=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">x;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    cout</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">res</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">endl;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br></div></div><h2 id="_1507-xp-的买卖" tabindex="-1"><a href="http://acm.hnucm.edu.cn/JudgeOnline/problem.php?id=1500">1507: XP 的买卖</a> </h2>
<p>分析</p>
<p>树状数组的模板题，但是我们需要注意的是树状数组没有单点替换的操作 只有更新这种做法，所以我们就先把原来的那个值减去，然后再加上我们新输入的值。其他的就是模板了，然后注意这个题 long long 才能过 数据比较大</p>
<div class="language-c line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">&#x3C;bits/stdc++.h></span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">#define</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> mst</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">a</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">memset</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a,</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">sizeof</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a))</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">using namespace std;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> maxn</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">100000</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">map</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> mp;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">map</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">::iterator it;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70"> a</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[maxn];</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">long</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> long</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70"> c</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[maxn];</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> n,m;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> change</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70"> pos</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70"> v</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">pos;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">n;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x26;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">i))</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">        c</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[i]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">v;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">long</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> long</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> sum</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70"> x</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    long</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> long</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ans</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    while</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(x</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">></span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        ans</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+=</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">c</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[x];</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        x</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">x</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x26;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">x);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ans;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> t;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    scanf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">%d</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x26;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">t);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    while</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(t</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">        mst</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(c);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        cin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">n</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">m;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">n;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            cin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">a</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[i];</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">            change</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(i,</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">a</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[i]);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        while</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(m</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> op,x,y;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            cin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">op</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">x</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">y;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(op</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">==</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D">                //cout&#x3C;&#x3C;sum(y)&#x3C;&#x3C;"  "&#x3C;&#x3C;sum(x-1)&#x3C;&#x3C;endl;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                cout</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sum</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(y)</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sum</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(x</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">endl;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            else</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">                change</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(x,y</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">a</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[x]);</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">                a</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[x]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">y;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">53</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br><span class="line-number">56</span><br></div></div><h2 id="_1508-xp-的梅溪湖" tabindex="-1"><a href="http://acm.hnucm.edu.cn/JudgeOnline/problem.php?id=1500">1508: XP 的梅溪湖</a> </h2>
<p>分析：</p>
<p>Dirac 定理:设一个无向图中有 N 个顶点，若所有顶点的度数大于等于 N/2,则哈密顿回路一定存在。 根据题意你只需要输出 YES 即可。</p>
<div class="language-c line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">&#x3C;bits/stdc++.h></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">using namespace std;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> n,m;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    cin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">n</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">m;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">m;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x,y;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        cin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">x</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">y;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    cout</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"Yes"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">endl;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br></div></div><h2 id="_1513-xp-的数论" tabindex="-1"><a href="http://acm.hnucm.edu.cn/JudgeOnline/problem.php?id=1500">1513: XP 的数论</a> </h2>
<p>分析：</p>
<p>这个题用埃式筛素数法或者用欧拉筛法来求，不会被卡时间，然而我这的解法并没有筛，要是 OJ 用了大数据，那么我这个代码应该过不了了，思路是如果一个数的素因子个数为奇数的话，那么结果减去这个数，如果为偶数的话，那么结果就加上这个数。关于埃式筛法与欧拉筛法，后面弄懂了就再补一下！</p>
<div class="language-c line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">&#x3C;bits/stdc++.h></span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">using namespace std;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">set</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;int></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> st;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> f</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70"> n</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    st.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">clear</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">();</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(n</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">==</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        st.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">insert</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    else</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(n</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        st.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">clear</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">();</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    else</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">sqrt</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(n);i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(n</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">%</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">==</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                n</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">/=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">i;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                st.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">insert</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(i);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        st.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">insert</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(n);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> k</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">st.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">size</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">();</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> k;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> t;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    cin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">t;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    while</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(t</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> n;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        cin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">n;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        long</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> long</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> sum</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">n;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> k</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">f</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(i);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(k</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">%</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">==</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                sum</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">i;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            else</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                sum</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">i;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        cout</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">sum</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">endl;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">53</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br><span class="line-number">56</span><br></div></div><h2 id="_1515-xp-的校园漫步" tabindex="-1"><a href="http://acm.hnucm.edu.cn/JudgeOnline/problem.php?id=1500">1515: XP 的校园漫步</a> </h2>
<p>分析：</p>
<p>并查集的模板题，开始我的并查集写错了，请教别人好久才把这个题给 AC 了，解题思路就是看输入的两个端点是否有相同的父节点，如果有的话，那么就会形成一个环，就会出现题目所述现象。</p>
<div class="language-c line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">&#x3C;bits/stdc++.h></span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">#define</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> mst</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">a</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">memset</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a,</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">sizeof</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a))</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">using namespace std;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> maxn</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1000000</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70"> pre</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[maxn];</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> find_pre</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70"> x</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(x</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">!=</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">pre</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[x])</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">        pre</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[x]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">find_pre</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">pre</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[x]);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70"> pre</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[x];</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> join</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70"> x</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70"> y</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> a</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">find_pre</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(x);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> b</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">find_pre</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(y);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">!=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">b)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">        pre</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[a]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">b;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> t;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    cin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">t;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    while</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(t</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> n,m;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        cin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">n</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">m;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">n;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">            pre</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[i]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">i;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        bool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> flag</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">m;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> x,y;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            cin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">x</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">y;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">find_pre</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(x)</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">==</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">find_pre</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(y))</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                flag</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            else</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">                join</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(x,y);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(flag)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            cout</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"YES"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">endl;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        else</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            cout</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"NO"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">endl;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">53</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br><span class="line-number">56</span><br><span class="line-number">57</span><br><span class="line-number">58</span><br><span class="line-number">59</span><br><span class="line-number">60</span><br></div></div><h2 id="_1516-xp-的岳麓山" tabindex="-1"><a href="http://acm.hnucm.edu.cn/JudgeOnline/problem.php?id=1500">1516: XP 的岳麓山</a> </h2>
<p>分析：</p>
<p>一道模拟题，我感觉我的方法还是比较复杂！题解：你需要分别遍历 a，b 两次，每次记录 a 前缀的最大值，b 后缀的最大值即可判断</p>
<div class="language-c line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">&#x3C;bits/stdc++.h></span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">#define</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> mst</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">a</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">memset</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a,</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">sizeof</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a))</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">using namespace std;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> maxn</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1000000</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">map</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> mp;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">map</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">::iterator it;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70"> a</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[maxn];</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70"> b</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[maxn];</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70"> res</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[maxn];</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> n;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    cin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">n;</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    mst</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a);</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">    mst</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(b);</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">n;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        cin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">a</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[i];</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">n;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        cin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">b</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[i];</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ans1</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">n;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">a</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[i]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ans1)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            ans1</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">a</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[i];</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">            mp</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[i]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> ans2</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">n;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">b</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[i]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">ans2)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            ans2</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">b</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[i];</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">            mp</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[i]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> k</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(it</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">mp.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">begin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">();it</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">!=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">mp.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">end</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">();it</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(it->second</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">==</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">            res</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[k</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">it->first;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(k)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">k;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">!=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">k</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">-</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                cout</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">res</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[i]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">" "</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            else</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                cout</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">res</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[i]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">endl;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    else</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        cout</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">"none"</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">endl;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">53</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br><span class="line-number">56</span><br><span class="line-number">57</span><br><span class="line-number">58</span><br><span class="line-number">59</span><br><span class="line-number">60</span><br><span class="line-number">61</span><br><span class="line-number">62</span><br><span class="line-number">63</span><br><span class="line-number">64</span><br><span class="line-number">65</span><br><span class="line-number">66</span><br><span class="line-number">67</span><br><span class="line-number">68</span><br><span class="line-number">69</span><br><span class="line-number">70</span><br><span class="line-number">71</span><br></div></div><h2 id="_1517-xp-的连续字符串" tabindex="-1"><a href="http://acm.hnucm.edu.cn/JudgeOnline/problem.php?id=1500">1517: XP 的连续字符串</a> </h2>
<p>分析：</p>
<p>遍历字符串，每次判断当前字符与前一个字符是否相同，如果相同即更新当前连续的长度，并判断是否需要更新答案，另外如果当前连续长度和当前记录的最长的长度相同，即判断字典序的大小即可。O(N)</p>
<div class="language-c line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF">&#x3C;bits/stdc++.h></span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">#define</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> mst</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">a</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">) </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0">memset</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a,</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">sizeof</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(a))</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">using namespace std;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">const</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> maxn</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1000000</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">+</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">8</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">map</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> mp;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">map</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">,</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">::iterator it;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70"> a</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[maxn];</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70"> b</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[maxn];</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70"> res</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[maxn];</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">{</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> t;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    cin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">t;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    while</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(t</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">--</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> n;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        cin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">n;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        string str;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        cin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">>></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">str;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> curdd</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> dd</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> curcnt</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> cnt</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">        for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8"> i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">n;i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[i]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">==</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[curdd])</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                curcnt</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">            else</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">                if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(curcnt</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">cnt)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                    cnt</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">curcnt;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                    dd</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">curdd;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">                if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(curcnt</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">==</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">cnt)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">                    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[dd]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">></span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[curdd])</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                    {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                        dd</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">curdd;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                    }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                curcnt</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF">1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">                curdd</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">i;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">            }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">        cout</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70">str</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">[dd]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">&#x3C;&#x3C;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">endl;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">    }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583">    return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">53</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br></div></div><blockquote>
<p><strong>未完待续。。。</strong></p>
</blockquote>
<div class="language-c line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e" tabindex="0" dir="ltr" v-pre=""><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8">学如逆水行舟，不进则退</span></span></code></pre>
<div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div>]]></content:encoded>
            <author>Choi Yang</author>
        </item>
        <item>
            <title><![CDATA[2019 年 第二届信息科学与工程学院院赛-正式赛 ]]></title>
            <link>https://chodocs.cn//green/ch1.html</link>
            <guid isPermaLink="false">https://chodocs.cn//green/ch1.html</guid>
            <pubDate>Wed, 19 Jun 2019 00:00:00 GMT</pubDate>
            <description><![CDATA[2019 年 第二届信息科学与工程学院院赛-正式赛  TIP 文章编写于 2019 年 06 月 19 日 —— 当初一次小的失败让我想了很多，在放弃与坚持中犹豫与徘徊。 赛后感想  对于这次比赛呢，我受到了小小的打击，也是我自己参与竞赛来第一次受到的打击。这次院里比赛，也是我大学内最后一次机会参加本学校举行的比赛了，所以赛前我就很焦虑自己打得好不好，会不会被学弟学妹们超过，其实这个还好，学弟学妹]]></description>
            <content:encoded><![CDATA[<div  class="tip custom-block"><p class="custom-block-title custom-block-title-default">TIP</p>
<p>文章编写于 2019 年 06 月 19 日 —— 当初一次小的失败让我想了很多，在放弃与坚持中犹豫与徘徊。</p>
</div>
<h2 id="赛后感想" tabindex="-1">赛后感想 </h2>
<p>对于这次比赛呢，我受到了小小的打击，也是我自己参与竞赛来第一次受到的打击。这次院里比赛，也是我大学内最后一次机会参加本学校举行的比赛了，所以赛前我就很焦虑自己打得好不好，会不会被学弟学妹们超过，其实这个还好，学弟学妹们超过我也很正常，他们都挺努力的，并且我打 ACM 起步也比较晚，他们刚进大学就接触了算法。</p>
<p>然后，因为这次比赛的话，也是我们学校这次集训队选拔的一次参考，加上之前的赛前焦虑，我更加有点怀疑自己的水平了，自信心逐渐下降。在星期天的上午打了一场热身赛，我就做了一道签到题，然后其他题全是搜索题关于 dfs 的，我一道也做不出来，特别是还有一道简单的 dp 题也没有做出来，此时此刻我信心几乎没有了。</p>
<p>看到自己一道题也没有做出来，我中午就把前天晚上急着整理出来的模板打印了三份，给了我室友两份。中午就躺了一小会，还是觉得没啥信心，好了，一到正式赛，慌慌地做了签到题，然后就很迷茫的一个一个题看，做完签到题我不知道怎么的，我的手居然颤抖了起来，我才发觉我真的紧张了。然后打开排名，发现别人又开了其他题了，我居然发呆了，急着去看一个题，完全没有冷静下来。</p>
<p>就这样，4 个小时的比赛，我一直觉得我有 2 个小时是在发呆或者说梦游一样，做在椅子上坐立不安，摆来摆去，题完全没有思路，感觉大脑完全空白。</p>
<blockquote>
<p>不为失败找借口，脚踏实地做事才是正确的做法！</p>
</blockquote>
<p>其实现在我已经调节了过来，已经没有必要一直回忆这段不愉快的竞赛了，现在该做的就是把题给补了，然后培养一个好的心态。</p>
<blockquote>
<p>给自己：以后的比赛，不管自己当时水平如何，也要保持冷静地去看题，学如逆水行舟，不进则退！</p>
</blockquote>
<p>最后的最后，我想说说：当时决定打 ACM 的想法没有错，体验酸甜苦辣，今年下半年就是我最后的战役了，所以决定这个暑假我会好好准备一下，为下半年的重大比赛而准备，能够在下半年拿到国家级奖项是我的目标，如果没有拿到的话，也没事，至少我会为之努力，不后悔。同样还在 ACM 路上的你们也要加油鸭，冲冲冲！</p>
<div  class="info custom-block"><p class="custom-block-title custom-block-title-default">INFO</p>
<p>2019 年 12 月 17 日更新</p>
<p>今天翻开过去的博客，想不到之前努力想要得到的东西居然梦想成真了，真的拿到了国家级的奖项了，目前大三上快要结束了，已经确定自己是要找工作了，那么关于 acm 的话还是要继续坚持下去，2020 年省赛过后就准备退役了，该为自己找工作积累项目经验了！</p>
</div>]]></content:encoded>
            <author>Choi Yang</author>
        </item>
    </channel>
</rss>