diff --git a/404.html b/404.html index 7453d9165..58934195c 100644 --- a/404.html +++ b/404.html @@ -30,13 +30,13 @@ Oragekk's Blog - + -
跳至主要內容

框架支持

vuepress2.x

主题支持

vuepress-theme-hope

自定义内容

基于原主题进行了继承,个性化内容如下,主要自定义内容分为

  1. 自定义布局

    • NotFound.vue
    • Layout.vue(增加打赏组件)
    • News.vue(说说列表布局)
  2. 自定义组件

    • BlogHero.vue
    • PageFooter.vue
    • Sponsor.vue(打赏组件)
    • NewsList.vue (说说列表)
    • NewsItem.vue (说说item)
  3. 本地插件开发

    • vuepress-plugin-canvas(支持彩虹背景和动态几何图形两种)
    • vuepress-plugin-gradient-cover (遮罩背景)
    • vuepress-plugin-hitokoto (一言插件)
    • vuepress-plugin-live2DAssist (看板娘辅助,由于子页有sidebar,看板娘会挡住,所以写了一个子页隐藏的小东西)
    • vuepress-plugin-popper (鼠标特效,基于@moefy-canvas/theme-popper
  4. 引用外部内容

  5. 配置内容

    • navbar
    • sidebar
    • 评论基于 Waline
    • 搜索基于algolia
    • 启用 copyright 版权信息插件
    • feed rss插件
    • 增加文章类型-说说,为说说markdown图片添加预览选择器
  6. 零碎

    • 运行时间统计
    • CSS 样式美化
    • 引入字体,品如手写体,夏行楷体
    • wanlie 增加自定义emoji,并修改展示样式
    • 个性log
    • 自动推送新文章url到搜索引擎(百度、Bing、Google)👉详细配置

总结

未完待续,持续优化中

本地插件,喜欢自取,源码公开,点击右上角,github图标即可,当然不要忘记点个✨哦

你认为这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.2.1
- + diff --git a/article/index.html b/article/index.html index c5e50aa45..f2405cbcd 100644 --- a/article/index.html +++ b/article/index.html @@ -30,7 +30,7 @@ 文章 | Oragekk's Blog - + @@ -89,6 +89,6 @@

积极可组合性

组合性是 Flutter 最为出众的一个特性。widget 通过组合其他 widget 的方式进行构建,并且这些 widget 自身由更基础的 widget 构建。比如,Padding 是一个 widget 而非其他 widget 的属性。因此,使用 Flutter 创建的用户界面是由多个 widget 组成的。


Oragekk...大约 29 分钟FlutterFlutter
- + diff --git a/assets/1.html-DxIDPIch.js b/assets/1.html-CCqqooZ8.js similarity index 96% rename from assets/1.html-DxIDPIch.js rename to assets/1.html-CCqqooZ8.js index 2c356d277..8d4ba2cec 100644 --- a/assets/1.html-DxIDPIch.js +++ b/assets/1.html-CCqqooZ8.js @@ -1 +1 @@ -import{_ as t,o,c as r,f as a,a as e}from"./app-DK0NGD4b.js";const n={},p=e("p",null,"我宣布,经过两天的自定义后",-1),c=e("p",null,"🎉说说开始营业了哈哈!!!散花🎉",-1);function i(s,m){return o(),r("div",null,[p,c,a(" more ")])}const d=t(n,[["render",i],["__file","1.html.vue"]]),_=JSON.parse(`{"path":"/news/1.html","title":"从这里开始","lang":"zh-CN","frontmatter":{"title":"从这里开始","icon":"support","date":"2023-06-02T00:00:00.000Z","article":false,"news":true,"sitemap":[{"exclude":true}],"description":"我宣布,经过两天的自定义后 🎉说说开始营业了哈哈!!!散花🎉","head":[["meta",{"property":"og:url","content":"https://oragekk.me/news/1.html"}],["meta",{"property":"og:site_name","content":"Oragekk's Blog"}],["meta",{"property":"og:title","content":"从这里开始"}],["meta",{"property":"og:description","content":"我宣布,经过两天的自定义后 🎉说说开始营业了哈哈!!!散花🎉"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-06-02T09:46:27.000Z"}],["meta",{"property":"article:author","content":"Oragekk"}],["meta",{"property":"article:published_time","content":"2023-06-02T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-06-02T09:46:27.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"从这里开始\\",\\"description\\":\\"我宣布,经过两天的自定义后 🎉说说开始营业了哈哈!!!散花🎉\\"}"]]},"headers":[],"git":{"createdTime":1685699187000,"updatedTime":1685699187000,"contributors":[{"name":"oragekk","email":"oragekk@163.com","commits":1}]},"readingTime":{"minutes":0.15,"words":45},"filePathRelative":"news/1.md","localizedDate":"2023年6月2日","excerpt":"

我宣布,经过两天的自定义后

\\n

🎉说说开始营业了哈哈!!!散花🎉

\\n","autoDesc":true}`);export{d as comp,_ as data}; +import{_ as t,o,c as r,f as a,a as e}from"./app-B-uzNdhT.js";const n={},p=e("p",null,"我宣布,经过两天的自定义后",-1),c=e("p",null,"🎉说说开始营业了哈哈!!!散花🎉",-1);function i(s,m){return o(),r("div",null,[p,c,a(" more ")])}const d=t(n,[["render",i],["__file","1.html.vue"]]),_=JSON.parse(`{"path":"/news/1.html","title":"从这里开始","lang":"zh-CN","frontmatter":{"title":"从这里开始","icon":"support","date":"2023-06-02T00:00:00.000Z","article":false,"news":true,"sitemap":[{"exclude":true}],"description":"我宣布,经过两天的自定义后 🎉说说开始营业了哈哈!!!散花🎉","head":[["meta",{"property":"og:url","content":"https://oragekk.me/news/1.html"}],["meta",{"property":"og:site_name","content":"Oragekk's Blog"}],["meta",{"property":"og:title","content":"从这里开始"}],["meta",{"property":"og:description","content":"我宣布,经过两天的自定义后 🎉说说开始营业了哈哈!!!散花🎉"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-06-02T09:46:27.000Z"}],["meta",{"property":"article:author","content":"Oragekk"}],["meta",{"property":"article:published_time","content":"2023-06-02T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-06-02T09:46:27.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"从这里开始\\",\\"description\\":\\"我宣布,经过两天的自定义后 🎉说说开始营业了哈哈!!!散花🎉\\"}"]]},"headers":[],"git":{"createdTime":1685699187000,"updatedTime":1685699187000,"contributors":[{"name":"oragekk","email":"oragekk@163.com","commits":1}]},"readingTime":{"minutes":0.15,"words":45},"filePathRelative":"news/1.md","localizedDate":"2023年6月2日","excerpt":"

我宣布,经过两天的自定义后

\\n

🎉说说开始营业了哈哈!!!散花🎉

\\n","autoDesc":true}`);export{d as comp,_ as data}; diff --git a/assets/2.html-BjF3APTC.js b/assets/2.html-zscj9y5a.js similarity index 97% rename from assets/2.html-BjF3APTC.js rename to assets/2.html-zscj9y5a.js index aefea9a7e..f26b389ad 100644 --- a/assets/2.html-BjF3APTC.js +++ b/assets/2.html-zscj9y5a.js @@ -1 +1 @@ -import{_ as t,o as r,c as o,f as a,a as e}from"./app-DK0NGD4b.js";const n={},c=e("p",null,"同样的六月",-1),i=e("p",null,"加油吧💪🏻",-1),p=e("iframe",{style:{"border-radius":"12px"},src:"https://open.spotify.com/embed/track/4UPjlT2qK6fODCuLdAv48T?utm_source=generator",width:"100%",height:"352",frameBorder:"0",allowfullscreen:"",allow:"autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture",loading:"lazy"},null,-1);function l(s,m){return r(),o("div",null,[c,i,p,a(" more ")])}const u=t(n,[["render",l],["__file","2.html.vue"]]),h=JSON.parse(`{"path":"/news/2.html","title":"六月","lang":"zh-CN","frontmatter":{"title":"六月","icon":"support","date":"2023-06-05T00:00:00.000Z","article":false,"news":true,"sitemap":[{"exclude":true}],"description":"同样的六月 加油吧💪🏻","head":[["meta",{"property":"og:url","content":"https://oragekk.me/news/2.html"}],["meta",{"property":"og:site_name","content":"Oragekk's Blog"}],["meta",{"property":"og:title","content":"六月"}],["meta",{"property":"og:description","content":"同样的六月 加油吧💪🏻"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-06-19T05:24:42.000Z"}],["meta",{"property":"article:author","content":"Oragekk"}],["meta",{"property":"article:published_time","content":"2023-06-05T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-06-19T05:24:42.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"六月\\",\\"description\\":\\"同样的六月 加油吧💪🏻\\"}"]]},"headers":[],"git":{"createdTime":1686017689000,"updatedTime":1687152282000,"contributors":[{"name":"oragekk","email":"oragekk@163.com","commits":3}]},"readingTime":{"minutes":0.18,"words":55},"filePathRelative":"news/2.md","localizedDate":"2023年6月5日","excerpt":"

同样的六月

\\n

加油吧💪🏻

\\n\\n","autoDesc":true}`);export{u as comp,h as data}; +import{_ as t,o as r,c as o,f as a,a as e}from"./app-B-uzNdhT.js";const n={},c=e("p",null,"同样的六月",-1),i=e("p",null,"加油吧💪🏻",-1),p=e("iframe",{style:{"border-radius":"12px"},src:"https://open.spotify.com/embed/track/4UPjlT2qK6fODCuLdAv48T?utm_source=generator",width:"100%",height:"352",frameBorder:"0",allowfullscreen:"",allow:"autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture",loading:"lazy"},null,-1);function l(s,m){return r(),o("div",null,[c,i,p,a(" more ")])}const u=t(n,[["render",l],["__file","2.html.vue"]]),h=JSON.parse(`{"path":"/news/2.html","title":"六月","lang":"zh-CN","frontmatter":{"title":"六月","icon":"support","date":"2023-06-05T00:00:00.000Z","article":false,"news":true,"sitemap":[{"exclude":true}],"description":"同样的六月 加油吧💪🏻","head":[["meta",{"property":"og:url","content":"https://oragekk.me/news/2.html"}],["meta",{"property":"og:site_name","content":"Oragekk's Blog"}],["meta",{"property":"og:title","content":"六月"}],["meta",{"property":"og:description","content":"同样的六月 加油吧💪🏻"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-06-19T05:24:42.000Z"}],["meta",{"property":"article:author","content":"Oragekk"}],["meta",{"property":"article:published_time","content":"2023-06-05T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-06-19T05:24:42.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"六月\\",\\"description\\":\\"同样的六月 加油吧💪🏻\\"}"]]},"headers":[],"git":{"createdTime":1686017689000,"updatedTime":1687152282000,"contributors":[{"name":"oragekk","email":"oragekk@163.com","commits":3}]},"readingTime":{"minutes":0.18,"words":55},"filePathRelative":"news/2.md","localizedDate":"2023年6月5日","excerpt":"

同样的六月

\\n

加油吧💪🏻

\\n\\n","autoDesc":true}`);export{u as comp,h as data}; diff --git a/assets/3.html-DWdPtRSF.js b/assets/3.html-BxzPupJn.js similarity index 96% rename from assets/3.html-DWdPtRSF.js rename to assets/3.html-BxzPupJn.js index abd6c39e1..50cd93261 100644 --- a/assets/3.html-DWdPtRSF.js +++ b/assets/3.html-BxzPupJn.js @@ -1 +1 @@ -import{_ as t,r as o,o as r,c as a,d as n,f as i,a as c}from"./app-DK0NGD4b.js";const p={},s=c("p",null,"“世间多是方展博,人间难寻小犹太”",-1);function m(l,d){const e=o("BiliBili");return r(),a("div",null,[s,n(e,{bvid:"BV1ve4y1776E"}),i(" more ")])}const g=t(p,[["render",m],["__file","3.html.vue"]]),u=JSON.parse(`{"path":"/news/3.html","title":"六月","lang":"zh-CN","frontmatter":{"title":"六月","icon":"support","date":"2023-06-05T00:00:00.000Z","article":false,"news":true,"sitemap":[{"exclude":true}],"description":"“世间多是方展博,人间难寻小犹太”","head":[["meta",{"property":"og:url","content":"https://oragekk.me/news/3.html"}],["meta",{"property":"og:site_name","content":"Oragekk's Blog"}],["meta",{"property":"og:title","content":"六月"}],["meta",{"property":"og:description","content":"“世间多是方展博,人间难寻小犹太”"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-06-19T03:15:17.000Z"}],["meta",{"property":"article:author","content":"Oragekk"}],["meta",{"property":"article:published_time","content":"2023-06-05T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-06-19T03:15:17.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"六月\\",\\"description\\":\\"“世间多是方展博,人间难寻小犹太”\\"}"]]},"headers":[],"git":{"createdTime":1686017689000,"updatedTime":1687144517000,"contributors":[{"name":"oragekk","email":"oragekk@163.com","commits":1}]},"readingTime":{"minutes":0.12,"words":35},"filePathRelative":"news/3.md","localizedDate":"2023年6月5日","excerpt":"

“世间多是方展博,人间难寻小犹太”

\\n","autoDesc":true}`);export{g as comp,u as data}; +import{_ as t,r as o,o as r,c as a,d as n,f as i,a as c}from"./app-B-uzNdhT.js";const p={},s=c("p",null,"“世间多是方展博,人间难寻小犹太”",-1);function m(l,d){const e=o("BiliBili");return r(),a("div",null,[s,n(e,{bvid:"BV1ve4y1776E"}),i(" more ")])}const g=t(p,[["render",m],["__file","3.html.vue"]]),u=JSON.parse(`{"path":"/news/3.html","title":"六月","lang":"zh-CN","frontmatter":{"title":"六月","icon":"support","date":"2023-06-05T00:00:00.000Z","article":false,"news":true,"sitemap":[{"exclude":true}],"description":"“世间多是方展博,人间难寻小犹太”","head":[["meta",{"property":"og:url","content":"https://oragekk.me/news/3.html"}],["meta",{"property":"og:site_name","content":"Oragekk's Blog"}],["meta",{"property":"og:title","content":"六月"}],["meta",{"property":"og:description","content":"“世间多是方展博,人间难寻小犹太”"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-06-19T03:15:17.000Z"}],["meta",{"property":"article:author","content":"Oragekk"}],["meta",{"property":"article:published_time","content":"2023-06-05T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-06-19T03:15:17.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"六月\\",\\"description\\":\\"“世间多是方展博,人间难寻小犹太”\\"}"]]},"headers":[],"git":{"createdTime":1686017689000,"updatedTime":1687144517000,"contributors":[{"name":"oragekk","email":"oragekk@163.com","commits":1}]},"readingTime":{"minutes":0.12,"words":35},"filePathRelative":"news/3.md","localizedDate":"2023年6月5日","excerpt":"

“世间多是方展博,人间难寻小犹太”

\\n","autoDesc":true}`);export{g as comp,u as data}; diff --git a/assets/4.html-CN6JWxUH.js b/assets/4.html-CcZjx0ar.js similarity index 97% rename from assets/4.html-CN6JWxUH.js rename to assets/4.html-CcZjx0ar.js index c55e93209..c441e6087 100644 --- a/assets/4.html-CN6JWxUH.js +++ b/assets/4.html-CcZjx0ar.js @@ -1 +1 @@ -import{_ as t,o,c as r,f as a,a as e}from"./app-DK0NGD4b.js";const n={},p=e("p",null,"一转眼就快十月了,工作比较忙,有点顾不上更新了哈哈",-1),c=e("p",null,"想加一个音乐播放插件,但是没时间(〒︿〒))",-1),i=e("p",null,"希望接下来一切都好吧,加油!!🎉🎉🎉",-1);function s(m,l){return o(),r("div",null,[p,c,i,a(" more ")])}const _=t(n,[["render",s],["__file","4.html.vue"]]),u=JSON.parse(`{"path":"/news/4.html","title":"九月","lang":"zh-CN","frontmatter":{"title":"九月","icon":"support","date":"2023-09-25T00:00:00.000Z","article":false,"news":true,"sitemap":[{"exclude":true}],"description":"一转眼就快十月了,工作比较忙,有点顾不上更新了哈哈 想加一个音乐播放插件,但是没时间(〒︿〒)) 希望接下来一切都好吧,加油!!🎉🎉🎉","head":[["meta",{"property":"og:url","content":"https://oragekk.me/news/4.html"}],["meta",{"property":"og:site_name","content":"Oragekk's Blog"}],["meta",{"property":"og:title","content":"九月"}],["meta",{"property":"og:description","content":"一转眼就快十月了,工作比较忙,有点顾不上更新了哈哈 想加一个音乐播放插件,但是没时间(〒︿〒)) 希望接下来一切都好吧,加油!!🎉🎉🎉"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-09-25T11:22:43.000Z"}],["meta",{"property":"article:author","content":"Oragekk"}],["meta",{"property":"article:published_time","content":"2023-09-25T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-09-25T11:22:43.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"九月\\",\\"description\\":\\"一转眼就快十月了,工作比较忙,有点顾不上更新了哈哈 想加一个音乐播放插件,但是没时间(〒︿〒)) 希望接下来一切都好吧,加油!!🎉🎉🎉\\"}"]]},"headers":[],"git":{"createdTime":1695640963000,"updatedTime":1695640963000,"contributors":[{"name":"oragekk","email":"oragekk@163.com","commits":1}]},"readingTime":{"minutes":0.23,"words":70},"filePathRelative":"news/4.md","localizedDate":"2023年9月25日","excerpt":"

一转眼就快十月了,工作比较忙,有点顾不上更新了哈哈

\\n

想加一个音乐播放插件,但是没时间(〒︿〒))

\\n

希望接下来一切都好吧,加油!!🎉🎉🎉

\\n","autoDesc":true}`);export{_ as comp,u as data}; +import{_ as t,o,c as r,f as a,a as e}from"./app-B-uzNdhT.js";const n={},p=e("p",null,"一转眼就快十月了,工作比较忙,有点顾不上更新了哈哈",-1),c=e("p",null,"想加一个音乐播放插件,但是没时间(〒︿〒))",-1),i=e("p",null,"希望接下来一切都好吧,加油!!🎉🎉🎉",-1);function s(m,l){return o(),r("div",null,[p,c,i,a(" more ")])}const _=t(n,[["render",s],["__file","4.html.vue"]]),u=JSON.parse(`{"path":"/news/4.html","title":"九月","lang":"zh-CN","frontmatter":{"title":"九月","icon":"support","date":"2023-09-25T00:00:00.000Z","article":false,"news":true,"sitemap":[{"exclude":true}],"description":"一转眼就快十月了,工作比较忙,有点顾不上更新了哈哈 想加一个音乐播放插件,但是没时间(〒︿〒)) 希望接下来一切都好吧,加油!!🎉🎉🎉","head":[["meta",{"property":"og:url","content":"https://oragekk.me/news/4.html"}],["meta",{"property":"og:site_name","content":"Oragekk's Blog"}],["meta",{"property":"og:title","content":"九月"}],["meta",{"property":"og:description","content":"一转眼就快十月了,工作比较忙,有点顾不上更新了哈哈 想加一个音乐播放插件,但是没时间(〒︿〒)) 希望接下来一切都好吧,加油!!🎉🎉🎉"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-09-25T11:22:43.000Z"}],["meta",{"property":"article:author","content":"Oragekk"}],["meta",{"property":"article:published_time","content":"2023-09-25T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-09-25T11:22:43.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"九月\\",\\"description\\":\\"一转眼就快十月了,工作比较忙,有点顾不上更新了哈哈 想加一个音乐播放插件,但是没时间(〒︿〒)) 希望接下来一切都好吧,加油!!🎉🎉🎉\\"}"]]},"headers":[],"git":{"createdTime":1695640963000,"updatedTime":1695640963000,"contributors":[{"name":"oragekk","email":"oragekk@163.com","commits":1}]},"readingTime":{"minutes":0.23,"words":70},"filePathRelative":"news/4.md","localizedDate":"2023年9月25日","excerpt":"

一转眼就快十月了,工作比较忙,有点顾不上更新了哈哈

\\n

想加一个音乐播放插件,但是没时间(〒︿〒))

\\n

希望接下来一切都好吧,加油!!🎉🎉🎉

\\n","autoDesc":true}`);export{_ as comp,u as data}; diff --git a/assets/404.html-BOcMMntT.js b/assets/404.html-CbM9U-XQ.js similarity index 93% rename from assets/404.html-BOcMMntT.js rename to assets/404.html-CbM9U-XQ.js index 75b380b93..5847858ed 100644 --- a/assets/404.html-BOcMMntT.js +++ b/assets/404.html-CbM9U-XQ.js @@ -1 +1 @@ -import{_ as t,o as e,c as o,a as n}from"./app-DK0NGD4b.js";const r={},a=n("p",null,"404 Not Found",-1),c=[a];function p(s,i){return e(),o("div",null,c)}const m=t(r,[["render",p],["__file","404.html.vue"]]),d=JSON.parse(`{"path":"/404.html","title":"","lang":"zh-CN","frontmatter":{"layout":"NotFound","description":"404 Not Found","head":[["meta",{"property":"og:url","content":"https://oragekk.me/404.html"}],["meta",{"property":"og:site_name","content":"Oragekk's Blog"}],["meta",{"property":"og:description","content":"404 Not Found"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"Oragekk"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"\\",\\"description\\":\\"404 Not Found\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0.01,"words":3},"filePathRelative":null,"excerpt":"

404 Not Found

\\n","autoDesc":true}`);export{m as comp,d as data}; +import{_ as t,o as e,c as o,a as n}from"./app-B-uzNdhT.js";const r={},a=n("p",null,"404 Not Found",-1),c=[a];function p(s,i){return e(),o("div",null,c)}const m=t(r,[["render",p],["__file","404.html.vue"]]),d=JSON.parse(`{"path":"/404.html","title":"","lang":"zh-CN","frontmatter":{"layout":"NotFound","description":"404 Not Found","head":[["meta",{"property":"og:url","content":"https://oragekk.me/404.html"}],["meta",{"property":"og:site_name","content":"Oragekk's Blog"}],["meta",{"property":"og:description","content":"404 Not Found"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"Oragekk"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"\\",\\"description\\":\\"404 Not Found\\"}"]]},"headers":[],"git":{},"readingTime":{"minutes":0.01,"words":3},"filePathRelative":null,"excerpt":"

404 Not Found

\\n","autoDesc":true}`);export{m as comp,d as data}; diff --git a/assets/5.html-BjDVrj8X.js b/assets/5.html-DlPnxJmp.js similarity index 96% rename from assets/5.html-BjDVrj8X.js rename to assets/5.html-DlPnxJmp.js index 7fb2219e2..2683c6074 100644 --- a/assets/5.html-BjDVrj8X.js +++ b/assets/5.html-DlPnxJmp.js @@ -1 +1 @@ -import{_ as p,r as o,o as i,c as s,a as e,b as t,d as r,f as c}from"./app-DK0NGD4b.js";const m={},l=e("br",null,null,-1),d=e("br",null,null,-1),g=e("a",{href:"https://github.com/OrageKK/vuepress-plugin-meting2",target:"_blank",rel:"noopener noreferrer"},"文档",-1);function u(_,h){const n=o("Badge"),a=o("Meting");return i(),s("div",null,[e("p",null,[t("嘿~"),r(n,{text:"vuepress-plugin-meting2",type:"tip"}),l,t(" 播放器有了,撒花✿✿ヽ(°▽°)ノ✿🎉🎉🎉"),d,t(" 文档👉🏻戳这里"),g]),r(a,{auto:"https://y.qq.com/n/ryqq/songDetail/003UTVCN0QvffG",api:"https://api.injahow.cn/meting/?server=:server&type=:type&id=:id&auth=:auth&r=:r"}),c(" more ")])}const f=p(m,[["render",u],["__file","5.html.vue"]]),k=JSON.parse(`{"path":"/news/5.html","title":"十月","lang":"zh-CN","frontmatter":{"title":"十月","icon":"support","date":"2023-10-11T00:00:00.000Z","article":false,"news":true,"sitemap":[{"exclude":true}],"description":"嘿~","head":[["meta",{"property":"og:url","content":"https://oragekk.me/news/5.html"}],["meta",{"property":"og:site_name","content":"Oragekk's Blog"}],["meta",{"property":"og:title","content":"十月"}],["meta",{"property":"og:description","content":"嘿~"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-10-11T11:12:13.000Z"}],["meta",{"property":"article:author","content":"Oragekk"}],["meta",{"property":"article:published_time","content":"2023-10-11T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-10-11T11:12:13.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"十月\\",\\"description\\":\\"嘿~\\"}"]]},"headers":[],"git":{"createdTime":1697022733000,"updatedTime":1697022733000,"contributors":[{"name":"oragekk","email":"oragekk@163.com","commits":1}]},"readingTime":{"minutes":0.22,"words":65},"filePathRelative":"news/5.md","localizedDate":"2023年10月11日","excerpt":"

嘿~

\\n","autoDesc":true}`);export{f as comp,k as data}; +import{_ as p,r as o,o as i,c as s,a as e,b as t,d as r,f as c}from"./app-B-uzNdhT.js";const m={},l=e("br",null,null,-1),d=e("br",null,null,-1),g=e("a",{href:"https://github.com/OrageKK/vuepress-plugin-meting2",target:"_blank",rel:"noopener noreferrer"},"文档",-1);function u(_,h){const n=o("Badge"),a=o("Meting");return i(),s("div",null,[e("p",null,[t("嘿~"),r(n,{text:"vuepress-plugin-meting2",type:"tip"}),l,t(" 播放器有了,撒花✿✿ヽ(°▽°)ノ✿🎉🎉🎉"),d,t(" 文档👉🏻戳这里"),g]),r(a,{auto:"https://y.qq.com/n/ryqq/songDetail/003UTVCN0QvffG",api:"https://api.injahow.cn/meting/?server=:server&type=:type&id=:id&auth=:auth&r=:r"}),c(" more ")])}const f=p(m,[["render",u],["__file","5.html.vue"]]),k=JSON.parse(`{"path":"/news/5.html","title":"十月","lang":"zh-CN","frontmatter":{"title":"十月","icon":"support","date":"2023-10-11T00:00:00.000Z","article":false,"news":true,"sitemap":[{"exclude":true}],"description":"嘿~","head":[["meta",{"property":"og:url","content":"https://oragekk.me/news/5.html"}],["meta",{"property":"og:site_name","content":"Oragekk's Blog"}],["meta",{"property":"og:title","content":"十月"}],["meta",{"property":"og:description","content":"嘿~"}],["meta",{"property":"og:type","content":"website"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-10-11T11:12:13.000Z"}],["meta",{"property":"article:author","content":"Oragekk"}],["meta",{"property":"article:published_time","content":"2023-10-11T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-10-11T11:12:13.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"WebPage\\",\\"name\\":\\"十月\\",\\"description\\":\\"嘿~\\"}"]]},"headers":[],"git":{"createdTime":1697022733000,"updatedTime":1697022733000,"contributors":[{"name":"oragekk","email":"oragekk@163.com","commits":1}]},"readingTime":{"minutes":0.22,"words":65},"filePathRelative":"news/5.md","localizedDate":"2023年10月11日","excerpt":"

嘿~

\\n","autoDesc":true}`);export{f as comp,k as data}; diff --git a/assets/AFNETworking-A-memory-leak.html-DS8aVVjh.js b/assets/AFNETworking-A-memory-leak.html-DGO_7mOf.js similarity index 99% rename from assets/AFNETworking-A-memory-leak.html-DS8aVVjh.js rename to assets/AFNETworking-A-memory-leak.html-DGO_7mOf.js index 008cd78b8..98d5a81e3 100644 --- a/assets/AFNETworking-A-memory-leak.html-DS8aVVjh.js +++ b/assets/AFNETworking-A-memory-leak.html-DGO_7mOf.js @@ -1,4 +1,4 @@ -import{_ as s,o as a,c as n,e}from"./app-DK0NGD4b.js";const i={},l=e(`

细心的你是否也发现了 AFN 的内存泄漏的问题了呢.

解决方法

    + (AFHTTPSessionManager *)sharedHTTPSession{
+import{_ as s,o as a,c as n,e}from"./app-B-uzNdhT.js";const i={},l=e(`

细心的你是否也发现了 AFN 的内存泄漏的问题了呢.

解决方法

    + (AFHTTPSessionManager *)sharedHTTPSession{
     static dispatch_once_t onceToken;
     dispatch_once(&onceToken, ^{
         manager = [AFHTTPSessionManager manager];
diff --git a/assets/JavaScriptBridge.html-BwZ34i68.js b/assets/JavaScriptBridge.html-yHc9vznD.js
similarity index 99%
rename from assets/JavaScriptBridge.html-BwZ34i68.js
rename to assets/JavaScriptBridge.html-yHc9vznD.js
index 7c0d5fd0f..d72744e2d 100644
--- a/assets/JavaScriptBridge.html-BwZ34i68.js
+++ b/assets/JavaScriptBridge.html-yHc9vznD.js
@@ -1,4 +1,4 @@
-import{_ as s,o as a,c as i,e as n}from"./app-DK0NGD4b.js";const l={},e=n(`

最近一直在忙,今天抽空写一下 H5 和 Native 的交互

一、选择

  • 项目本身 webview 使用的是 WKWebview,其实 WKWebview 自带的 messageHandle 也可以满足此需求
  • JSContext,源自于 JavaScriptCore 框架中的东西,最后不使用此方案源于一下几点
    • 但是其中繁杂的字符串使用,让我觉的可能会由于粗心出现不可预知的错误
    • 加载时机的问题,当你重新 loadrequest 的时候,会导致 js 注入失败
    • 回调方法略复杂
  • JavaScriptBridge,最后选择此库源于以下几点
    • 使用简单,注册完毕之后设置完代理,只需要负责注册方法和调用方法
    • 回调简单,两端回调 responsecallback 包含在注册的方法中。使用 block
    • 三端通用,JavaScript 和 iOS、Android 都可以(Android 版本库
    • Ps :关于 Android 版本库,其中很多是按照 iOS 版的 JavaScriptBridge 改写的。但是其中有很多问题,尤其是各种调用时机问题,上面的链接是经过我旁边的 Android 小哥试了四五个版本之后发现的,修复了各种改写版的问题

二、使用

  • 首先需要引入 WebViewJavascriptBridge 库
#import "WebViewJavascriptBridge.h"
  • 初始化,此处为了方便子类使用,所以在基类中注册 bridge,并 return bridge 对象,方便子类调用
#pragma mark - 桥接
+import{_ as s,o as a,c as i,e as n}from"./app-B-uzNdhT.js";const l={},e=n(`

最近一直在忙,今天抽空写一下 H5 和 Native 的交互

一、选择

  • 项目本身 webview 使用的是 WKWebview,其实 WKWebview 自带的 messageHandle 也可以满足此需求
  • JSContext,源自于 JavaScriptCore 框架中的东西,最后不使用此方案源于一下几点
    • 但是其中繁杂的字符串使用,让我觉的可能会由于粗心出现不可预知的错误
    • 加载时机的问题,当你重新 loadrequest 的时候,会导致 js 注入失败
    • 回调方法略复杂
  • JavaScriptBridge,最后选择此库源于以下几点
    • 使用简单,注册完毕之后设置完代理,只需要负责注册方法和调用方法
    • 回调简单,两端回调 responsecallback 包含在注册的方法中。使用 block
    • 三端通用,JavaScript 和 iOS、Android 都可以(Android 版本库
    • Ps :关于 Android 版本库,其中很多是按照 iOS 版的 JavaScriptBridge 改写的。但是其中有很多问题,尤其是各种调用时机问题,上面的链接是经过我旁边的 Android 小哥试了四五个版本之后发现的,修复了各种改写版的问题

二、使用

  • 首先需要引入 WebViewJavascriptBridge 库
#import "WebViewJavascriptBridge.h"
  • 初始化,此处为了方便子类使用,所以在基类中注册 bridge,并 return bridge 对象,方便子类调用
#pragma mark - 桥接
 
 - (void)InitializeWebViewJavascriptBridge {
     // 注册桥接
diff --git a/assets/Jenkins.html-CLfOdyvj.js b/assets/Jenkins.html-BzJTFLBX.js
similarity index 99%
rename from assets/Jenkins.html-CLfOdyvj.js
rename to assets/Jenkins.html-BzJTFLBX.js
index feaa89e1a..e4f9b831b 100644
--- a/assets/Jenkins.html-CLfOdyvj.js
+++ b/assets/Jenkins.html-BzJTFLBX.js
@@ -1,4 +1,4 @@
-import{_ as i,r as e,o as l,c as t,a as o,b as s,d as r,w as p,e as a}from"./app-DK0NGD4b.js";const c={},d=a('

提示

如果想在代码 Push 后,或者 Merge request 后,自动部署,可以采用多种方案,以下介绍两种

不知道如何配置的同学,可以参考一下

1. 通过 Jenkins 提供的【触发远程构建】

1.1. 勾选【触发远程构建】并填入 token

勾选远程构建开关
勾选远程构建开关

1.2. 配置 API token

  1. 打开 Jenkins 控制台。

  2. 在顶部导航栏中,点击您的用户名,然后选择 "Configure" 选项。

  3. 在配置页面中,向下滚动,找到 "API Token" 部分。

  4. 如果您之前没有生成过 API Token,则点击 "Add new Token" 或 "Generate Token" 按钮。

  5. 在生成或更改 Token 的过程中,您可能需要提供您的 Jenkins 用户密码进行身份验证。

  6. 生成或更改成功后,您将看到新生成的 Token 值。请将其复制并妥善保存,因为在以后的访问中,您将无法再查看该 Token 的值。

1.3. 如何调用 Url

Jenkins 提供了便捷的远程触发功能,但是需要配置一个 token,然后在 push 后,通过 post 请求,调用 Jenkins 的 url 即可触发构建

调用 url 可以使用 python 脚本,或者 curl 命令,一般配合 git 提交,使用 curl 命令居多

下面以 GitLab CI/CD 为例进行举例

',10),k=a(`

GitLab CI/CD 是通过 GitLab Runner 来执行的

GitLab CI/CD 将按照 Stage 定义的顺序来执行,任何一个 Stage 失败,整个 CI/CD 将失败

每一个 Stage 可以被若干个 Job 关联。Stage 在执行的时候,关联到这个 Stage 的所有 Job 都将被执行,不过不同的 Job 可能是并行执行的。

每个 Job 在执行的时候,会先按照缓存策略加载缓存数据,然后按照顺序依次运行 before_script、script 和 after_script 中配置的脚本,运行完毕以后,会将生成的数据保存到缓存中。

1.4. 编写.gitlab-ci.yml

stages:
+import{_ as i,r as e,o as l,c as t,a as o,b as s,d as r,w as p,e as a}from"./app-B-uzNdhT.js";const c={},d=a('

提示

如果想在代码 Push 后,或者 Merge request 后,自动部署,可以采用多种方案,以下介绍两种

不知道如何配置的同学,可以参考一下

1. 通过 Jenkins 提供的【触发远程构建】

1.1. 勾选【触发远程构建】并填入 token

勾选远程构建开关
勾选远程构建开关

1.2. 配置 API token

  1. 打开 Jenkins 控制台。

  2. 在顶部导航栏中,点击您的用户名,然后选择 "Configure" 选项。

  3. 在配置页面中,向下滚动,找到 "API Token" 部分。

  4. 如果您之前没有生成过 API Token,则点击 "Add new Token" 或 "Generate Token" 按钮。

  5. 在生成或更改 Token 的过程中,您可能需要提供您的 Jenkins 用户密码进行身份验证。

  6. 生成或更改成功后,您将看到新生成的 Token 值。请将其复制并妥善保存,因为在以后的访问中,您将无法再查看该 Token 的值。

1.3. 如何调用 Url

Jenkins 提供了便捷的远程触发功能,但是需要配置一个 token,然后在 push 后,通过 post 请求,调用 Jenkins 的 url 即可触发构建

调用 url 可以使用 python 脚本,或者 curl 命令,一般配合 git 提交,使用 curl 命令居多

下面以 GitLab CI/CD 为例进行举例

',10),k=a(`

GitLab CI/CD 是通过 GitLab Runner 来执行的

GitLab CI/CD 将按照 Stage 定义的顺序来执行,任何一个 Stage 失败,整个 CI/CD 将失败

每一个 Stage 可以被若干个 Job 关联。Stage 在执行的时候,关联到这个 Stage 的所有 Job 都将被执行,不过不同的 Job 可能是并行执行的。

每个 Job 在执行的时候,会先按照缓存策略加载缓存数据,然后按照顺序依次运行 before_script、script 和 after_script 中配置的脚本,运行完毕以后,会将生成的数据保存到缓存中。

1.4. 编写.gitlab-ci.yml

stages:
   - deploy
 
 deploy_to_hyjk_open-x:
diff --git a/assets/Mylink-eoVYxaQz.js b/assets/Mylink-BokaCp9V.js
similarity index 92%
rename from assets/Mylink-eoVYxaQz.js
rename to assets/Mylink-BokaCp9V.js
index da5fffb88..2be0c4e1c 100644
--- a/assets/Mylink-eoVYxaQz.js
+++ b/assets/Mylink-BokaCp9V.js
@@ -1 +1 @@
-import{g as h,o as t,c as a,u as l,F as k,h as m,n as u,a as o,t as i,f as v,_ as f}from"./app-DK0NGD4b.js";const g={class:"vp-project-panel"},j=["href"],y=["src"],C={class:"vp-project-name"},x={class:"vp-project-desc"},M=h({__name:"Mylink",props:{type:String,links:Object},setup(p){const r=p;let e;console.log(r.links),e=r.links;const _=n=>`project${n%9}`;return(n,d)=>(t(),a("div",g,[l(e).length>0?(t(!0),a(k,{key:0},m(l(e),(s,c)=>(t(),a("a",{key:c,class:u(["item vp-project-card",_(c)]),href:s.link,target:"_blank"},[o("img",{class:"vp-project-image",src:s.icon,alt:"",onerror:'this.onerror=null,this.src=this.srcset="/assets/avatar.webp"'},null,8,y),o("div",C,i(s.name),1),o("div",x,i(s.desc),1)],10,j))),128)):v("v-if",!0)]))}}),B=f(M,[["__scopeId","data-v-83f21a4e"],["__file","Mylink.vue"]]);export{B as M};
+import{g as h,o as t,c as a,u as l,F as k,h as m,n as u,a as o,t as i,f as v,_ as f}from"./app-B-uzNdhT.js";const g={class:"vp-project-panel"},j=["href"],y=["src"],C={class:"vp-project-name"},x={class:"vp-project-desc"},M=h({__name:"Mylink",props:{type:String,links:Object},setup(p){const r=p;let e;console.log(r.links),e=r.links;const _=n=>`project${n%9}`;return(n,d)=>(t(),a("div",g,[l(e).length>0?(t(!0),a(k,{key:0},m(l(e),(s,c)=>(t(),a("a",{key:c,class:u(["item vp-project-card",_(c)]),href:s.link,target:"_blank"},[o("img",{class:"vp-project-image",src:s.icon,alt:"",onerror:'this.onerror=null,this.src=this.srcset="/assets/avatar.webp"'},null,8,y),o("div",C,i(s.name),1),o("div",x,i(s.desc),1)],10,j))),128)):v("v-if",!0)]))}}),B=f(M,[["__scopeId","data-v-83f21a4e"],["__file","Mylink.vue"]]);export{B as M};
diff --git a/assets/NSError.html-CFDeKAl3.js b/assets/NSError.html-Cbfa4ghy.js
similarity index 99%
rename from assets/NSError.html-CFDeKAl3.js
rename to assets/NSError.html-Cbfa4ghy.js
index f9bea7059..5d5640ea8 100644
--- a/assets/NSError.html-CFDeKAl3.js
+++ b/assets/NSError.html-Cbfa4ghy.js
@@ -1,4 +1,4 @@
-import{_ as s,o as a,c as n,e as i}from"./app-DK0NGD4b.js";const l={},r=i(`

前言

整理一下在iOS开发中NSError的错误代码

NSError

NSError是系统错误信息类

初始化方法两个

  // domain 不能为空 dict可以为空
+import{_ as s,o as a,c as n,e as i}from"./app-B-uzNdhT.js";const l={},r=i(`

前言

整理一下在iOS开发中NSError的错误代码

NSError

NSError是系统错误信息类

初始化方法两个

  // domain 不能为空 dict可以为空
   
   - (instancetype)initWithDomain:(NSErrorDomain)domain code:(NSInteger)code userInfo:(nullable NSDictionary *)dict;
 
diff --git "a/assets/NSOperation\345\222\214NSOPerationQueue.html-q2KmhtqX.js" "b/assets/NSOperation\345\222\214NSOPerationQueue.html-D0EB1Evs.js"
similarity index 99%
rename from "assets/NSOperation\345\222\214NSOPerationQueue.html-q2KmhtqX.js"
rename to "assets/NSOperation\345\222\214NSOPerationQueue.html-D0EB1Evs.js"
index 79bf7114a..bdeca20d1 100644
--- "a/assets/NSOperation\345\222\214NSOPerationQueue.html-q2KmhtqX.js"
+++ "b/assets/NSOperation\345\222\214NSOPerationQueue.html-D0EB1Evs.js"
@@ -1,4 +1,4 @@
-import{_ as a,o as e,c as i,e as s}from"./app-DK0NGD4b.js";const n={},o=s(`

一. NSOperatioin

1.目的

  • 开启线程
  • 提供一些 GCD 不具备的功能
  • OC 框架,内部封装的是 GCD

2.区别

  • GCD 执行效率高于 NSOperation
  • NSOperation 提供了一些 GCD 中不具备的功能(暂停/恢复/取消)---管理操作-NSOperation 的高级用法

3.NSOperation 本身是一个抽象类不可以直接使用,实际开发中使用其子类

  • 苹果提供了两个原生子类

    • NSInvocationOperation
      NSInvocationOperation *op = [[NSInvocationOperation alloc]  initWithTarget:self selector:@selector(test) object:nil];
    • NSBlockOperation 将操作封装在 block 中
       NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
      +import{_ as a,o as e,c as i,e as s}from"./app-B-uzNdhT.js";const n={},o=s(`

      一. NSOperatioin

      1.目的

      • 开启线程
      • 提供一些 GCD 不具备的功能
      • OC 框架,内部封装的是 GCD

      2.区别

      • GCD 执行效率高于 NSOperation
      • NSOperation 提供了一些 GCD 中不具备的功能(暂停/恢复/取消)---管理操作-NSOperation 的高级用法

      3.NSOperation 本身是一个抽象类不可以直接使用,实际开发中使用其子类

      • 苹果提供了两个原生子类

        • NSInvocationOperation
          NSInvocationOperation *op = [[NSInvocationOperation alloc]  initWithTarget:self selector:@selector(test) object:nil];
        • NSBlockOperation 将操作封装在 block 中
           NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
             // 可以追加操作(无限)---如果在非主队列执行操作,原操作和追加的操作都会 开启多条线程去执行
             NSLog(@"操作 1---------%@",[NSThread currentThread]);
           }];
          diff --git a/assets/Q_A.html-CRGr32ol.js b/assets/Q_A.html-WwxGbpRP.js
          similarity index 98%
          rename from assets/Q_A.html-CRGr32ol.js
          rename to assets/Q_A.html-WwxGbpRP.js
          index fa8a7cf88..fc4b9c0e7 100644
          --- a/assets/Q_A.html-CRGr32ol.js
          +++ b/assets/Q_A.html-WwxGbpRP.js
          @@ -1 +1 @@
          -import{_ as t,o as p,c as r,f as a,a as e,e as o}from"./app-DK0NGD4b.js";const n={},s=e("h1",{id:"前端-q-a",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#前端-q-a"},[e("span",null,"前端-Q&A")])],-1),l=e("h2",{id:"浏览器是如何渲染页面的",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#浏览器是如何渲染页面的"},[e("span",null,"浏览器是如何渲染页面的?")])],-1),i=e("p",null,"当浏览器的网络线程收到 HTML 文档后,会产生一个渲染任务,并将其传递给渲染主线程的消息队列。",-1),c=e("p",null,"在事件循环机制的作用下,渲染主线程取出消息队列中的渲染任务,开启渲染流程。",-1),d=o('

          整个渲染流程分为多个阶段,分别是: HTML 解析、样式计算、布局、分层、绘制、分块、光栅化、画

          每个阶段都有明确的输入输出,上一个阶段的输出会成为下一个阶段的输入。

          这样,整个渲染流程就形成了一套组织严密的生产流水线。


          渲染的第一步是解析 HTML

          解析过程中遇到 CSS 解析 CSS,遇到 JS 执行 JS。为了提高解析效率,浏览器在开始解析前,会启动一个预解析的线程,率先下载 HTML 中的外部 CSS 文件和 外部的 JS 文件。

          如果主线程解析到link位置,此时外部的 CSS 文件还没有下载解析好,主线程不会等待,继续解析后续的 HTML。这是因为下载和解析 CSS 的工作是在预解析线程中进行的。这就是 CSS 不会阻塞 HTML 解析的根本原因。

          如果主线程解析到script位置,会停止解析 HTML,转而等待 JS 文件下载好,并将全局代码解析执行完成后,才能继续解析 HTML。这是因为 JS 代码的执行过程可能会修改当前的 DOM 树,所以 DOM 树的生成必须暂停。这就是 JS 会阻塞 HTML 解析的根本原因。

          第一步完成后,会得到 DOM 树和 CSSOM 树,浏览器的默认样式、内部样式、外部样式、行内样式均会包含在 CSSOM 树中。


          渲染的下一步是样式计算

          主线程会遍历得到的 DOM 树,依次为树中的每个节点计算出它最终的样式,称之为 Computed Style。

          在这一过程中,很多预设值会变成绝对值,比如red会变成rgb(255,0,0);相对单位会变成绝对单位,比如em会变成px

          这一步完成后,会得到一棵带有样式的 DOM 树。


          接下来是布局,布局完成后会得到布局树。

          布局阶段会依次遍历 DOM 树的每一个节点,计算每个节点的几何信息。例如节点的宽高、相对包含块的位置。

          大部分时候,DOM 树和布局树并非一一对应。

          比如display:none的节点没有几何信息,因此不会生成到布局树;又比如使用了伪元素选择器,虽然 DOM 树中不存在这些伪元素节点,但它们拥有几何信息,所以会生成到布局树中。还有匿名行盒、匿名块盒等等都会导致 DOM 树和布局树无法一一对应。


          下一步是分层

          主线程会使用一套复杂的策略对整个布局树中进行分层。

          分层的好处在于,将来某一个层改变后,仅会对该层进行后续处理,从而提升效率。

          滚动条、堆叠上下文、transform、opacity 等样式都会或多或少的影响分层结果,也可以通过will-change属性更大程度的影响分层结果。


          再下一步是绘制

          主线程会为每个层单独产生绘制指令集,用于描述这一层的内容该如何画出来。


          完成绘制后,主线程将每个图层的绘制信息提交给合成线程,剩余工作将由合成线程完成。

          合成线程首先对每个图层进行分块,将其划分为更多的小区域。

          它会从线程池中拿取多个线程来完成分块工作。


          分块完成后,进入光栅化阶段。

          合成线程会将块信息交给 GPU 进程,以极高的速度完成光栅化。

          GPU 进程会开启多个线程来完成光栅化,并且优先处理靠近视口区域的块。

          光栅化的结果,就是一块一块的位图


          最后一个阶段就是

          合成线程拿到每个层、每个块的位图后,生成一个个「指引(quad)」信息。

          指引会标识出每个位图应该画到屏幕的哪个位置,以及会考虑到旋转、缩放等变形。

          变形发生在合成线程,与渲染主线程无关,这就是transform效率高的本质原因。

          合成线程会把 quad 提交给 GPU 进程,由 GPU 进程产生系统调用,提交给 GPU 硬件,完成最终的屏幕成像。

          什么是 reflow?

          reflow 的本质就是重新计算 layout 树。

          当进行了会影响布局树的操作后,需要重新计算布局树,会引发 layout。

          为了避免连续的多次操作导致布局树反复计算,浏览器会合并这些操作,当 JS 代码全部完成后再进行统一计算。所以,改动属性造成的 reflow 是异步完成的。

          也同样因为如此,当 JS 获取布局属性时,就可能造成无法获取到最新的布局信息。

          浏览器在反复权衡下,最终决定获取属性立即 reflow。

          什么是 repaint?

          repaint 的本质就是重新根据分层信息计算了绘制指令。

          当改动了可见样式后,就需要重新计算,会引发 repaint。

          由于元素的布局信息也属于可见样式,所以 reflow 一定会引起 repaint。

          为什么 transform 的效率高?

          因为 transform 既不会影响布局也不会影响绘制指令,它影响的只是渲染流程的最后一个「draw」阶段

          由于 draw 阶段在合成线程中,所以 transform 的变化几乎不会影响渲染主线程。反之,渲染主线程无论如何忙碌,也不会影响 transform 的变化。

          阐述一下 JS 的事件循环

          事件循环又叫做消息循环,是浏览器渲染主线程的工作方式。

          在 Chrome 的源码中,它开启一个不会结束的 for 循环,每次循环从消息队列中取出第一个任务执行,而其他线程只需要在合适的时候将任务加入到队列末尾即可。

          过去把消息队列简单分为宏队列和微队列,这种说法目前已无法满足复杂的浏览器环境,取而代之的是一种更加灵活多变的处理方式。

          根据 W3C 官方的解释,每个任务有不同的类型,同类型的任务必须在同一个队列,不同的任务可以属于不同的队列。不同任务队列有不同的优先级,在一次事件循环中,由浏览器自行决定取哪一个队列的任务。但浏览器必须有一个微队列,微队列的任务一定具有最高的优先级,必须优先调度执行

          JS 中的计时器能做到精确计时吗?为什么?

          不行,因为:

          1. 计算机硬件没有原子钟,无法做到精确计时
          2. 操作系统的计时函数本身就有少量偏差,由于 JS 的计时器最终调用的是操作系统的函数,也就携带了这些偏差
          3. 按照 W3C 的标准,浏览器实现计时器时,如果嵌套层级超过 5 层,则会带有 4 毫秒的最少时间,这样在计时时间少于 4 毫秒时又带来了偏差
          4. 受事件循环的影响,计时器的回调函数只能在主线程空闲时运行,因此又带来了偏差
          ',64);function h(m,g){return p(),r("div",null,[s,l,i,c,a(" more "),d])}const u=t(n,[["render",h],["__file","Q_A.html.vue"]]),S=JSON.parse(`{"path":"/posts/Web/Q_A.html","title":"前端-Q&A","lang":"zh-CN","frontmatter":{"date":"2023-04-06T00:00:00.000Z","icon":"question","category":["浏览器"],"tag":["前端开发"],"dir":{"order":6},"description":"浏览器是如何渲染页面的? 当浏览器的网络线程收到 HTML 文档后,会产生一个渲染任务,并将其传递给渲染主线程的消息队列。 在事件循环机制的作用下,渲染主线程取出消息队列中的渲染任务,开启渲染流程。","head":[["meta",{"property":"og:url","content":"https://oragekk.me/posts/Web/Q_A.html"}],["meta",{"property":"og:site_name","content":"Oragekk's Blog"}],["meta",{"property":"og:title","content":"前端-Q&A"}],["meta",{"property":"og:description","content":"浏览器是如何渲染页面的? 当浏览器的网络线程收到 HTML 文档后,会产生一个渲染任务,并将其传递给渲染主线程的消息队列。 在事件循环机制的作用下,渲染主线程取出消息队列中的渲染任务,开启渲染流程。"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-07T13:18:20.000Z"}],["meta",{"property":"article:author","content":"Oragekk"}],["meta",{"property":"article:tag","content":"前端开发"}],["meta",{"property":"article:published_time","content":"2023-04-06T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-07T13:18:20.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"前端-Q&A\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2023-04-06T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-07T13:18:20.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"Oragekk\\",\\"url\\":\\"https://orgaekk.me\\"}]}"]]},"headers":[{"level":2,"title":"浏览器是如何渲染页面的?","slug":"浏览器是如何渲染页面的","link":"#浏览器是如何渲染页面的","children":[]},{"level":2,"title":"什么是 reflow?","slug":"什么是-reflow","link":"#什么是-reflow","children":[]},{"level":2,"title":"什么是 repaint?","slug":"什么是-repaint","link":"#什么是-repaint","children":[]},{"level":2,"title":"为什么 transform 的效率高?","slug":"为什么-transform-的效率高","link":"#为什么-transform-的效率高","children":[]},{"level":2,"title":"阐述一下 JS 的事件循环","slug":"阐述一下-js-的事件循环","link":"#阐述一下-js-的事件循环","children":[]},{"level":2,"title":"JS 中的计时器能做到精确计时吗?为什么?","slug":"js-中的计时器能做到精确计时吗-为什么","link":"#js-中的计时器能做到精确计时吗-为什么","children":[]}],"git":{"createdTime":1680873500000,"updatedTime":1680873500000,"contributors":[{"name":"oragekk","email":"oragekk@163.com","commits":1}]},"readingTime":{"minutes":6.68,"words":2003},"filePathRelative":"posts/Web/Q&A.md","localizedDate":"2023年4月6日","excerpt":"\\n

          浏览器是如何渲染页面的?

          \\n

          当浏览器的网络线程收到 HTML 文档后,会产生一个渲染任务,并将其传递给渲染主线程的消息队列。

          \\n

          在事件循环机制的作用下,渲染主线程取出消息队列中的渲染任务,开启渲染流程。

          \\n","autoDesc":true}`);export{u as comp,S as data}; +import{_ as t,o as p,c as r,f as a,a as e,e as o}from"./app-B-uzNdhT.js";const n={},s=e("h1",{id:"前端-q-a",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#前端-q-a"},[e("span",null,"前端-Q&A")])],-1),l=e("h2",{id:"浏览器是如何渲染页面的",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#浏览器是如何渲染页面的"},[e("span",null,"浏览器是如何渲染页面的?")])],-1),i=e("p",null,"当浏览器的网络线程收到 HTML 文档后,会产生一个渲染任务,并将其传递给渲染主线程的消息队列。",-1),c=e("p",null,"在事件循环机制的作用下,渲染主线程取出消息队列中的渲染任务,开启渲染流程。",-1),d=o('

          整个渲染流程分为多个阶段,分别是: HTML 解析、样式计算、布局、分层、绘制、分块、光栅化、画

          每个阶段都有明确的输入输出,上一个阶段的输出会成为下一个阶段的输入。

          这样,整个渲染流程就形成了一套组织严密的生产流水线。


          渲染的第一步是解析 HTML

          解析过程中遇到 CSS 解析 CSS,遇到 JS 执行 JS。为了提高解析效率,浏览器在开始解析前,会启动一个预解析的线程,率先下载 HTML 中的外部 CSS 文件和 外部的 JS 文件。

          如果主线程解析到link位置,此时外部的 CSS 文件还没有下载解析好,主线程不会等待,继续解析后续的 HTML。这是因为下载和解析 CSS 的工作是在预解析线程中进行的。这就是 CSS 不会阻塞 HTML 解析的根本原因。

          如果主线程解析到script位置,会停止解析 HTML,转而等待 JS 文件下载好,并将全局代码解析执行完成后,才能继续解析 HTML。这是因为 JS 代码的执行过程可能会修改当前的 DOM 树,所以 DOM 树的生成必须暂停。这就是 JS 会阻塞 HTML 解析的根本原因。

          第一步完成后,会得到 DOM 树和 CSSOM 树,浏览器的默认样式、内部样式、外部样式、行内样式均会包含在 CSSOM 树中。


          渲染的下一步是样式计算

          主线程会遍历得到的 DOM 树,依次为树中的每个节点计算出它最终的样式,称之为 Computed Style。

          在这一过程中,很多预设值会变成绝对值,比如red会变成rgb(255,0,0);相对单位会变成绝对单位,比如em会变成px

          这一步完成后,会得到一棵带有样式的 DOM 树。


          接下来是布局,布局完成后会得到布局树。

          布局阶段会依次遍历 DOM 树的每一个节点,计算每个节点的几何信息。例如节点的宽高、相对包含块的位置。

          大部分时候,DOM 树和布局树并非一一对应。

          比如display:none的节点没有几何信息,因此不会生成到布局树;又比如使用了伪元素选择器,虽然 DOM 树中不存在这些伪元素节点,但它们拥有几何信息,所以会生成到布局树中。还有匿名行盒、匿名块盒等等都会导致 DOM 树和布局树无法一一对应。


          下一步是分层

          主线程会使用一套复杂的策略对整个布局树中进行分层。

          分层的好处在于,将来某一个层改变后,仅会对该层进行后续处理,从而提升效率。

          滚动条、堆叠上下文、transform、opacity 等样式都会或多或少的影响分层结果,也可以通过will-change属性更大程度的影响分层结果。


          再下一步是绘制

          主线程会为每个层单独产生绘制指令集,用于描述这一层的内容该如何画出来。


          完成绘制后,主线程将每个图层的绘制信息提交给合成线程,剩余工作将由合成线程完成。

          合成线程首先对每个图层进行分块,将其划分为更多的小区域。

          它会从线程池中拿取多个线程来完成分块工作。


          分块完成后,进入光栅化阶段。

          合成线程会将块信息交给 GPU 进程,以极高的速度完成光栅化。

          GPU 进程会开启多个线程来完成光栅化,并且优先处理靠近视口区域的块。

          光栅化的结果,就是一块一块的位图


          最后一个阶段就是

          合成线程拿到每个层、每个块的位图后,生成一个个「指引(quad)」信息。

          指引会标识出每个位图应该画到屏幕的哪个位置,以及会考虑到旋转、缩放等变形。

          变形发生在合成线程,与渲染主线程无关,这就是transform效率高的本质原因。

          合成线程会把 quad 提交给 GPU 进程,由 GPU 进程产生系统调用,提交给 GPU 硬件,完成最终的屏幕成像。

          什么是 reflow?

          reflow 的本质就是重新计算 layout 树。

          当进行了会影响布局树的操作后,需要重新计算布局树,会引发 layout。

          为了避免连续的多次操作导致布局树反复计算,浏览器会合并这些操作,当 JS 代码全部完成后再进行统一计算。所以,改动属性造成的 reflow 是异步完成的。

          也同样因为如此,当 JS 获取布局属性时,就可能造成无法获取到最新的布局信息。

          浏览器在反复权衡下,最终决定获取属性立即 reflow。

          什么是 repaint?

          repaint 的本质就是重新根据分层信息计算了绘制指令。

          当改动了可见样式后,就需要重新计算,会引发 repaint。

          由于元素的布局信息也属于可见样式,所以 reflow 一定会引起 repaint。

          为什么 transform 的效率高?

          因为 transform 既不会影响布局也不会影响绘制指令,它影响的只是渲染流程的最后一个「draw」阶段

          由于 draw 阶段在合成线程中,所以 transform 的变化几乎不会影响渲染主线程。反之,渲染主线程无论如何忙碌,也不会影响 transform 的变化。

          阐述一下 JS 的事件循环

          事件循环又叫做消息循环,是浏览器渲染主线程的工作方式。

          在 Chrome 的源码中,它开启一个不会结束的 for 循环,每次循环从消息队列中取出第一个任务执行,而其他线程只需要在合适的时候将任务加入到队列末尾即可。

          过去把消息队列简单分为宏队列和微队列,这种说法目前已无法满足复杂的浏览器环境,取而代之的是一种更加灵活多变的处理方式。

          根据 W3C 官方的解释,每个任务有不同的类型,同类型的任务必须在同一个队列,不同的任务可以属于不同的队列。不同任务队列有不同的优先级,在一次事件循环中,由浏览器自行决定取哪一个队列的任务。但浏览器必须有一个微队列,微队列的任务一定具有最高的优先级,必须优先调度执行

          JS 中的计时器能做到精确计时吗?为什么?

          不行,因为:

          1. 计算机硬件没有原子钟,无法做到精确计时
          2. 操作系统的计时函数本身就有少量偏差,由于 JS 的计时器最终调用的是操作系统的函数,也就携带了这些偏差
          3. 按照 W3C 的标准,浏览器实现计时器时,如果嵌套层级超过 5 层,则会带有 4 毫秒的最少时间,这样在计时时间少于 4 毫秒时又带来了偏差
          4. 受事件循环的影响,计时器的回调函数只能在主线程空闲时运行,因此又带来了偏差
          ',64);function h(m,g){return p(),r("div",null,[s,l,i,c,a(" more "),d])}const u=t(n,[["render",h],["__file","Q_A.html.vue"]]),S=JSON.parse(`{"path":"/posts/Web/Q_A.html","title":"前端-Q&A","lang":"zh-CN","frontmatter":{"date":"2023-04-06T00:00:00.000Z","icon":"question","category":["浏览器"],"tag":["前端开发"],"dir":{"order":6},"description":"浏览器是如何渲染页面的? 当浏览器的网络线程收到 HTML 文档后,会产生一个渲染任务,并将其传递给渲染主线程的消息队列。 在事件循环机制的作用下,渲染主线程取出消息队列中的渲染任务,开启渲染流程。","head":[["meta",{"property":"og:url","content":"https://oragekk.me/posts/Web/Q_A.html"}],["meta",{"property":"og:site_name","content":"Oragekk's Blog"}],["meta",{"property":"og:title","content":"前端-Q&A"}],["meta",{"property":"og:description","content":"浏览器是如何渲染页面的? 当浏览器的网络线程收到 HTML 文档后,会产生一个渲染任务,并将其传递给渲染主线程的消息队列。 在事件循环机制的作用下,渲染主线程取出消息队列中的渲染任务,开启渲染流程。"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-04-07T13:18:20.000Z"}],["meta",{"property":"article:author","content":"Oragekk"}],["meta",{"property":"article:tag","content":"前端开发"}],["meta",{"property":"article:published_time","content":"2023-04-06T00:00:00.000Z"}],["meta",{"property":"article:modified_time","content":"2023-04-07T13:18:20.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"前端-Q&A\\",\\"image\\":[\\"\\"],\\"datePublished\\":\\"2023-04-06T00:00:00.000Z\\",\\"dateModified\\":\\"2023-04-07T13:18:20.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"Oragekk\\",\\"url\\":\\"https://orgaekk.me\\"}]}"]]},"headers":[{"level":2,"title":"浏览器是如何渲染页面的?","slug":"浏览器是如何渲染页面的","link":"#浏览器是如何渲染页面的","children":[]},{"level":2,"title":"什么是 reflow?","slug":"什么是-reflow","link":"#什么是-reflow","children":[]},{"level":2,"title":"什么是 repaint?","slug":"什么是-repaint","link":"#什么是-repaint","children":[]},{"level":2,"title":"为什么 transform 的效率高?","slug":"为什么-transform-的效率高","link":"#为什么-transform-的效率高","children":[]},{"level":2,"title":"阐述一下 JS 的事件循环","slug":"阐述一下-js-的事件循环","link":"#阐述一下-js-的事件循环","children":[]},{"level":2,"title":"JS 中的计时器能做到精确计时吗?为什么?","slug":"js-中的计时器能做到精确计时吗-为什么","link":"#js-中的计时器能做到精确计时吗-为什么","children":[]}],"git":{"createdTime":1680873500000,"updatedTime":1680873500000,"contributors":[{"name":"oragekk","email":"oragekk@163.com","commits":1}]},"readingTime":{"minutes":6.68,"words":2003},"filePathRelative":"posts/Web/Q&A.md","localizedDate":"2023年4月6日","excerpt":"\\n

          浏览器是如何渲染页面的?

          \\n

          当浏览器的网络线程收到 HTML 文档后,会产生一个渲染任务,并将其传递给渲染主线程的消息队列。

          \\n

          在事件循环机制的作用下,渲染主线程取出消息队列中的渲染任务,开启渲染流程。

          \\n","autoDesc":true}`);export{u as comp,S as data}; diff --git a/assets/Reduced-App- volume.html-hgEX0v9f.js b/assets/Reduced-App- volume.html-BBOCyqv9.js similarity index 99% rename from assets/Reduced-App- volume.html-hgEX0v9f.js rename to assets/Reduced-App- volume.html-BBOCyqv9.js index 2a10e2ac0..d8b244886 100644 --- a/assets/Reduced-App- volume.html-hgEX0v9f.js +++ b/assets/Reduced-App- volume.html-BBOCyqv9.js @@ -1 +1 @@ -import{_ as e,o as t,c as a,e as r}from"./app-DK0NGD4b.js";const i={},l=r('

          把打包好的.ipa 文件的后缀改为.zip 并解压。右键.appbundle 选择显示包内容。有些情况下,大一点的文件压缩后反而比小一点的文件压缩后的体积小,而我们真正关心的时候解压后的真实体积,所以一定要解压里面的资源文件,看解压后的 size。从 APP Store 下载的.ipa 文件要比自己本地打包的要大,因为 APP Store 对 ipa 包又做了加密处理。Xcode 的 Organizer window 的 Estimate Size 功能能估计本地打包文件从 APP Store 下载时的大小。根据优化的 28 定律和常识,首先当然是多媒体资源的体积啦。

          图片

          压缩图片 不重要的图片可适当采用 8bit PNG 图片 1.什么是矢量图 矢量图是由计算机的算法产生的,可以无限放大或缩小,不会有任何损失,通常由矢量软件制作。 2.什么是位图 位图是由一个一个的小色块组成,放大后会看到那些小色块,同一面积内小色块越多,分辨率就越高。 3.矢量图的优缺点 可以无限放大或缩小,不会影响图像素质,文件体积较小,编辑灵活。缺点是表达的色彩层次不清,整体观感效果不如位图 4.位图的优缺点 不能放太大,减少文件分辨率后会影响图片质量,图片战胜空间较大,优点是能很细腻地表达图片的效果,图片表达效果非常好 5.什么情况下用位图,什么情况下用矢量图 一些对图片要求高的用位图,例如照片。其他的尽量用矢量图。例如文字、表格、卡通图片等

          • 去掉无用的图片

          • 用代码绘制简单的纯色图片  用 Sketch 和 PaintCode 快速得到绘制代码

          • 如果不需要使用透明,可以用 jpeg 代替 PNG。jpeg 减少了些效率但更加小。需权衡性能,大小。

          • 对 32 位的图片,尽肯能的使用高压缩率,使用 PS 的“Save For Web”功能,可以有效的减小 JPEG 和 PNG 图片的尺寸。 默认情况下,在 build 时,PNG 图像就被pngcrush压缩。

          音频

          视频

          • 视频也可以使用类似于音频的处理方法,音视频的压缩可以很大程度的压缩,但是要注意压缩的格式,是不是会增加编解码的负担,这要权衡考虑。

          Assets

          • 检查 bundle 中的无用文件,不要打包到 app 或者静态库中。可以点击文件,在右侧的 file inspector 里面的 target membership 中取消勾选;或者在 build phase 里面的 Copy Bundle Resources 中去掉。
          • 确定 dead code(代码被定义但从未被调用)被剥离,build setting 里 DEAD_CODE_STRIPPING = YES。 去掉冗余的代码,即使一点冗余代码,编译后体积也是很可观的。

          编译设置

          • Optimization Level设置为Fastest, Smallest [-Os]Strip Debug
            Symbols During Copy设置为YES (COPY_PHASE_STRIP = YES)
            这样会减小接近一半的体积,但是在 release 版本,这些貌似是默认的配置,但是不妨也检查一下。 此外在 debug 版本最好在完成开发测试后,设置成这种模式,重新测试一遍,因为不同的编译设置可能会掩盖一些 bug。

          • 设置IOS_DEPLOYMENT_TARGET 为想要运行系统的最低版本

          • 设置需要的 arm 架构,设置 ARCHS = arm64可以消除 armv6 架构,潜在的减少近一半的容量。
            iOS Devices: ARM,尺寸,像素一览表
            1,如果想自己的 app 在各个机器都能够最高效率的运行,则需要将 Build Active Architecture Only 改为 NO,Valid architectures 选择对应的指令集:armv7 armv7s arm64。这个会为各个指令集编译对应的代码,因此最后的 ipa 体积基本翻了 3 倍,Release 版本必须 NO。
            2,如果想让 app 体积保持最小,则现阶段应该选择 Valid architectures 为 armv7,这样 Build Active Architecture Only 选 YES 或 NO 就无所谓了

          其他

          • 将应用的中一些数据,如长字符串、表格等移到外部文件中,不要放在代码里面,这样能减小一些体积,因为外部文件的压缩率要比应用中的数据压缩率高。

          编译选项

          1. 编译器优化级别
            Build Settings->Optimization Level 有几个编译优化选项,release 版应该选择 Fastest, Smalllest,这个选项会开启那些不增加代码大小的全部优化,并让可执行文件尽可能小。
          2. 去除符号信息
            Strip Linked Product / Deployment Postprocessing / Symbols Hidden by Default 在 release 版本应该设为 yes,可以去除不必要的调试符号。Symbols Hidden by Default 会把所有符号都定义成”private extern”,详细信息见官方文档
            这些选项目前都是 XCode 里 release 的默认选项,但旧版 XCode 生成的项目可能不是,可以检查一下。其他优化还可以参考官方文档—CodeFootprint.pdf

          第三方库统计

          项目里会引入很多第三方静态库,如果能知道这些第三方库在可执行文件里占用的大小,就可以评估是否值得去找替代方案去掉这个第三方库。我们可以从 linkmap 中统计出这个信息,对此写了个 node.js 脚本,可以通过 linkmap 统计每个.o 目标文件占用的体积和每个.a 静态库占用的体积,详见这里(需翻墙)。

          ARC->MRC

          有人提出用 ARC 写的代码编译出来的可执行文件是会比用 MRC 大的,原因大致是 ARC 代码会在某些情况多出一些 retain 和 release 的指令,例如调用一个方法,它返回的对象会被 retain,退出作用域后会被 release,MRC 就不需要,汇编指令变多,机器码变多,可执行文件就变大了。还有其他细节实现的区别,先不纠结了。
          那用 ARC 究竟会增大多少体积?我觉得从汇编指令的增多减少去算是很难算准确的,这东西涉及细节太多,还是得从统计的角度计算。做了几个对比试验,统计了几个同时支持 ARC/MRC 的开源项目在开启/关闭 ARC 的情况下TEXT 代码段的大小对比。只对比TEXT 代码段是因为:
          ARC 对可执行文件大小的影响几乎都是在代码段
          可执行文件会进行某种对齐,例如有些段在不足 32K 的时候填充 0 直到对齐 32K,若用可执行文件大小对比结果可能是对齐后的,不准确。

          实验数据:

          -------MBProgressHUDSDWebImageFMDB
          开启 ARC195322442429056
          关闭 ARC176482257525848
          对比↓9.6%↓7.5%↓11%

          结果是 ARC 大概会使代码段增加 10%的 size,考虑代码段占可执行文件大约有 80%,估计对整个可执行文件的影响会是 8%。
          可以评估一下 8%的体积下降是不是值得把项目里某些模块改成 MRC,这样程序的维护成本上升了,一般不到特殊情况不建议这么做。

          无用代码

          在项目里新建一个类,给它添加几个方法,但不要在任何地方 import 它,build 完项目后观察 linkmap,你会发现这个类还是被编译进可执行文件了。
          按 C++的经验,没有被使用到的类和方法编译器都会优化掉,不会编进最终的可执行文件,但 object-c 不一样,因为 object-c 的动态特性,它可以通过类和方法名反射获得这个类和方法进行调用,所以就算在代码里某个类没被使用到,编译器也没法保证这个类不会在运行时通过反射去调用,所以只要是在项目里的文件,无论是否又被使用到都会被编译进可执行文件。
          对此我们可以通过脚本,遍历整个项目的文件,找出所有没有被引用的类文件和没有被调用的方法,在保证没有其他地方动态调用的情况下把它们去掉。如果整个项目历时很长,历时代码遗留较多,这个清理对可执行文件省出的空间还是挺可观的。

          类/方法名长度

          观察 linkmap 可以发现每个类和方法名都在__cstring 段里都存了相应的字符串值,所以类和方法名的长短也是对可执行文件大小是有影响的,原因还是 object-c 的动态特性,因为需要通过类/方法名反射找到这个类/方法进行调用,object-c 对象模型会把类/方法名字符串都保存下来。
          对此我们可以考虑在编译前把所有类和方法名进行混淆,跟压缩 js 一样,把长名字替换成短名字,这样做的好处除了缩小体积外,还对安全性有很大提升,别人拿到可执行文件对它 class-dump 出来的结果都是混淆后的类和方法名,就无法从类和方法名中猜出某个方法是做什么的,就难以挂钩子进行 hack。不过这样做有个缺点,就是 crash 堆栈反解出来的堆栈方法名会是混淆后的,需要再加一层混淆->原名的转换,实现和使用成本有点高。
          实际上这部分占用的长度比较小,中型项目也就几百 K,对安全性要求高的情况可以试试。

          冗余字符串

          代码上定义的所有静态字符串都会记录在在可执行文件的__cstring 段,如果项目里 Log 非常多,这个空间占用也是可观的,也有几百 K 的大小,可以考虑清理所有冗余的字符串。另外如果有特别长的字符串,建议抽离保存成静态文件,因为 AppStore 对可执行文件加密导致压缩率低,特别长的字符串抽离成静态资源文件后压缩率会比在可执行文件里高很多。

          CheckList

          最后把缩减iOS安装包大小的各种方法列出来做了张 CheckList 图:

          参考文献:http://blog.cnbang.net/tech/2296/

          ',33),n=[l];function o(p,s){return t(),a("div",null,n)}const d=e(i,[["render",o],["__file","Reduced-App- volume.html.vue"]]),h=JSON.parse(`{"path":"/posts/iOS/system/Reduced-App-%20volume.html","title":"减小iOS-App或者静态库体积","lang":"zh-CN","frontmatter":{"title":"减小iOS-App或者静态库体积","date":"2016-11-04T18:11:56.000Z","category":["iOS"],"tag":["iOS"],"description":"把打包好的.ipa 文件的后缀改为.zip 并解压。右键.appbundle 选择显示包内容。有些情况下,大一点的文件压缩后反而比小一点的文件压缩后的体积小,而我们真正关心的时候解压后的真实体积,所以一定要解压里面的资源文件,看解压后的 size。从 APP Store 下载的.ipa 文件要比自己本地打包的要大,因为 APP Store 对 ipa ...","head":[["meta",{"property":"og:url","content":"https://oragekk.me/posts/iOS/system/Reduced-App-%20volume.html"}],["meta",{"property":"og:site_name","content":"Oragekk's Blog"}],["meta",{"property":"og:title","content":"减小iOS-App或者静态库体积"}],["meta",{"property":"og:description","content":"把打包好的.ipa 文件的后缀改为.zip 并解压。右键.appbundle 选择显示包内容。有些情况下,大一点的文件压缩后反而比小一点的文件压缩后的体积小,而我们真正关心的时候解压后的真实体积,所以一定要解压里面的资源文件,看解压后的 size。从 APP Store 下载的.ipa 文件要比自己本地打包的要大,因为 APP Store 对 ipa ..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://zero-space.s3.amazonaws.com/photos/2e6cc210-e9a6-4a0f-9c05-2c4056a982acx840.jpg"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-03-10T06:30:41.000Z"}],["meta",{"property":"article:author","content":"Oragekk"}],["meta",{"property":"article:tag","content":"iOS"}],["meta",{"property":"article:published_time","content":"2016-11-04T18:11:56.000Z"}],["meta",{"property":"article:modified_time","content":"2023-03-10T06:30:41.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"减小iOS-App或者静态库体积\\",\\"image\\":[\\"https://zero-space.s3.amazonaws.com/photos/2e6cc210-e9a6-4a0f-9c05-2c4056a982acx840.jpg\\",\\"http://upload-images.jianshu.io/upload_images/2076247-dde8e96bdd40396b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240\\"],\\"datePublished\\":\\"2016-11-04T18:11:56.000Z\\",\\"dateModified\\":\\"2023-03-10T06:30:41.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"Oragekk\\",\\"url\\":\\"https://orgaekk.me\\"}]}"]]},"headers":[{"level":2,"title":"图片","slug":"图片","link":"#图片","children":[]},{"level":2,"title":"音频","slug":"音频","link":"#音频","children":[]},{"level":2,"title":"视频","slug":"视频","link":"#视频","children":[]},{"level":2,"title":"Assets","slug":"assets","link":"#assets","children":[]},{"level":2,"title":"编译设置","slug":"编译设置","link":"#编译设置","children":[]},{"level":2,"title":"其他","slug":"其他","link":"#其他","children":[]},{"level":2,"title":"编译选项","slug":"编译选项","link":"#编译选项","children":[{"level":3,"title":"第三方库统计","slug":"第三方库统计","link":"#第三方库统计","children":[]},{"level":3,"title":"ARC->MRC","slug":"arc-mrc","link":"#arc-mrc","children":[]},{"level":3,"title":"无用代码","slug":"无用代码","link":"#无用代码","children":[]},{"level":3,"title":"类/方法名长度","slug":"类-方法名长度","link":"#类-方法名长度","children":[]},{"level":3,"title":"冗余字符串","slug":"冗余字符串","link":"#冗余字符串","children":[]},{"level":3,"title":"CheckList","slug":"checklist","link":"#checklist","children":[]}]}],"git":{"createdTime":1678187456000,"updatedTime":1678429841000,"contributors":[{"name":"huangkun","email":"huangkun@tonshow.cn","commits":1}]},"readingTime":{"minutes":9.24,"words":2771},"filePathRelative":"posts/iOS/system/Reduced-App- volume.md","localizedDate":"2016年11月4日","excerpt":"
          \\"\\"
          \\n
          \\n

          把打包好的.ipa 文件的后缀改为.zip 并解压。右键.appbundle 选择显示包内容。有些情况下,大一点的文件压缩后反而比小一点的文件压缩后的体积小,而我们真正关心的时候解压后的真实体积,所以一定要解压里面的资源文件,看解压后的 size。从 APP Store 下载的.ipa 文件要比自己本地打包的要大,因为 APP Store 对 ipa 包又做了加密处理。Xcode 的 Organizer window 的 Estimate Size 功能能估计本地打包文件从 APP Store 下载时的大小。根据优化的 28 定律和常识,首先当然是多媒体资源的体积啦。

          \\n
          ","autoDesc":true}`);export{d as comp,h as data}; +import{_ as e,o as t,c as a,e as r}from"./app-B-uzNdhT.js";const i={},l=r('

          把打包好的.ipa 文件的后缀改为.zip 并解压。右键.appbundle 选择显示包内容。有些情况下,大一点的文件压缩后反而比小一点的文件压缩后的体积小,而我们真正关心的时候解压后的真实体积,所以一定要解压里面的资源文件,看解压后的 size。从 APP Store 下载的.ipa 文件要比自己本地打包的要大,因为 APP Store 对 ipa 包又做了加密处理。Xcode 的 Organizer window 的 Estimate Size 功能能估计本地打包文件从 APP Store 下载时的大小。根据优化的 28 定律和常识,首先当然是多媒体资源的体积啦。

          图片

          压缩图片 不重要的图片可适当采用 8bit PNG 图片 1.什么是矢量图 矢量图是由计算机的算法产生的,可以无限放大或缩小,不会有任何损失,通常由矢量软件制作。 2.什么是位图 位图是由一个一个的小色块组成,放大后会看到那些小色块,同一面积内小色块越多,分辨率就越高。 3.矢量图的优缺点 可以无限放大或缩小,不会影响图像素质,文件体积较小,编辑灵活。缺点是表达的色彩层次不清,整体观感效果不如位图 4.位图的优缺点 不能放太大,减少文件分辨率后会影响图片质量,图片战胜空间较大,优点是能很细腻地表达图片的效果,图片表达效果非常好 5.什么情况下用位图,什么情况下用矢量图 一些对图片要求高的用位图,例如照片。其他的尽量用矢量图。例如文字、表格、卡通图片等

          • 去掉无用的图片

          • 用代码绘制简单的纯色图片  用 Sketch 和 PaintCode 快速得到绘制代码

          • 如果不需要使用透明,可以用 jpeg 代替 PNG。jpeg 减少了些效率但更加小。需权衡性能,大小。

          • 对 32 位的图片,尽肯能的使用高压缩率,使用 PS 的“Save For Web”功能,可以有效的减小 JPEG 和 PNG 图片的尺寸。 默认情况下,在 build 时,PNG 图像就被pngcrush压缩。

          音频

          视频

          • 视频也可以使用类似于音频的处理方法,音视频的压缩可以很大程度的压缩,但是要注意压缩的格式,是不是会增加编解码的负担,这要权衡考虑。

          Assets

          • 检查 bundle 中的无用文件,不要打包到 app 或者静态库中。可以点击文件,在右侧的 file inspector 里面的 target membership 中取消勾选;或者在 build phase 里面的 Copy Bundle Resources 中去掉。
          • 确定 dead code(代码被定义但从未被调用)被剥离,build setting 里 DEAD_CODE_STRIPPING = YES。 去掉冗余的代码,即使一点冗余代码,编译后体积也是很可观的。

          编译设置

          • Optimization Level设置为Fastest, Smallest [-Os]Strip Debug
            Symbols During Copy设置为YES (COPY_PHASE_STRIP = YES)
            这样会减小接近一半的体积,但是在 release 版本,这些貌似是默认的配置,但是不妨也检查一下。 此外在 debug 版本最好在完成开发测试后,设置成这种模式,重新测试一遍,因为不同的编译设置可能会掩盖一些 bug。

          • 设置IOS_DEPLOYMENT_TARGET 为想要运行系统的最低版本

          • 设置需要的 arm 架构,设置 ARCHS = arm64可以消除 armv6 架构,潜在的减少近一半的容量。
            iOS Devices: ARM,尺寸,像素一览表
            1,如果想自己的 app 在各个机器都能够最高效率的运行,则需要将 Build Active Architecture Only 改为 NO,Valid architectures 选择对应的指令集:armv7 armv7s arm64。这个会为各个指令集编译对应的代码,因此最后的 ipa 体积基本翻了 3 倍,Release 版本必须 NO。
            2,如果想让 app 体积保持最小,则现阶段应该选择 Valid architectures 为 armv7,这样 Build Active Architecture Only 选 YES 或 NO 就无所谓了

          其他

          • 将应用的中一些数据,如长字符串、表格等移到外部文件中,不要放在代码里面,这样能减小一些体积,因为外部文件的压缩率要比应用中的数据压缩率高。

          编译选项

          1. 编译器优化级别
            Build Settings->Optimization Level 有几个编译优化选项,release 版应该选择 Fastest, Smalllest,这个选项会开启那些不增加代码大小的全部优化,并让可执行文件尽可能小。
          2. 去除符号信息
            Strip Linked Product / Deployment Postprocessing / Symbols Hidden by Default 在 release 版本应该设为 yes,可以去除不必要的调试符号。Symbols Hidden by Default 会把所有符号都定义成”private extern”,详细信息见官方文档
            这些选项目前都是 XCode 里 release 的默认选项,但旧版 XCode 生成的项目可能不是,可以检查一下。其他优化还可以参考官方文档—CodeFootprint.pdf

          第三方库统计

          项目里会引入很多第三方静态库,如果能知道这些第三方库在可执行文件里占用的大小,就可以评估是否值得去找替代方案去掉这个第三方库。我们可以从 linkmap 中统计出这个信息,对此写了个 node.js 脚本,可以通过 linkmap 统计每个.o 目标文件占用的体积和每个.a 静态库占用的体积,详见这里(需翻墙)。

          ARC->MRC

          有人提出用 ARC 写的代码编译出来的可执行文件是会比用 MRC 大的,原因大致是 ARC 代码会在某些情况多出一些 retain 和 release 的指令,例如调用一个方法,它返回的对象会被 retain,退出作用域后会被 release,MRC 就不需要,汇编指令变多,机器码变多,可执行文件就变大了。还有其他细节实现的区别,先不纠结了。
          那用 ARC 究竟会增大多少体积?我觉得从汇编指令的增多减少去算是很难算准确的,这东西涉及细节太多,还是得从统计的角度计算。做了几个对比试验,统计了几个同时支持 ARC/MRC 的开源项目在开启/关闭 ARC 的情况下TEXT 代码段的大小对比。只对比TEXT 代码段是因为:
          ARC 对可执行文件大小的影响几乎都是在代码段
          可执行文件会进行某种对齐,例如有些段在不足 32K 的时候填充 0 直到对齐 32K,若用可执行文件大小对比结果可能是对齐后的,不准确。

          实验数据:

          -------MBProgressHUDSDWebImageFMDB
          开启 ARC195322442429056
          关闭 ARC176482257525848
          对比↓9.6%↓7.5%↓11%

          结果是 ARC 大概会使代码段增加 10%的 size,考虑代码段占可执行文件大约有 80%,估计对整个可执行文件的影响会是 8%。
          可以评估一下 8%的体积下降是不是值得把项目里某些模块改成 MRC,这样程序的维护成本上升了,一般不到特殊情况不建议这么做。

          无用代码

          在项目里新建一个类,给它添加几个方法,但不要在任何地方 import 它,build 完项目后观察 linkmap,你会发现这个类还是被编译进可执行文件了。
          按 C++的经验,没有被使用到的类和方法编译器都会优化掉,不会编进最终的可执行文件,但 object-c 不一样,因为 object-c 的动态特性,它可以通过类和方法名反射获得这个类和方法进行调用,所以就算在代码里某个类没被使用到,编译器也没法保证这个类不会在运行时通过反射去调用,所以只要是在项目里的文件,无论是否又被使用到都会被编译进可执行文件。
          对此我们可以通过脚本,遍历整个项目的文件,找出所有没有被引用的类文件和没有被调用的方法,在保证没有其他地方动态调用的情况下把它们去掉。如果整个项目历时很长,历时代码遗留较多,这个清理对可执行文件省出的空间还是挺可观的。

          类/方法名长度

          观察 linkmap 可以发现每个类和方法名都在__cstring 段里都存了相应的字符串值,所以类和方法名的长短也是对可执行文件大小是有影响的,原因还是 object-c 的动态特性,因为需要通过类/方法名反射找到这个类/方法进行调用,object-c 对象模型会把类/方法名字符串都保存下来。
          对此我们可以考虑在编译前把所有类和方法名进行混淆,跟压缩 js 一样,把长名字替换成短名字,这样做的好处除了缩小体积外,还对安全性有很大提升,别人拿到可执行文件对它 class-dump 出来的结果都是混淆后的类和方法名,就无法从类和方法名中猜出某个方法是做什么的,就难以挂钩子进行 hack。不过这样做有个缺点,就是 crash 堆栈反解出来的堆栈方法名会是混淆后的,需要再加一层混淆->原名的转换,实现和使用成本有点高。
          实际上这部分占用的长度比较小,中型项目也就几百 K,对安全性要求高的情况可以试试。

          冗余字符串

          代码上定义的所有静态字符串都会记录在在可执行文件的__cstring 段,如果项目里 Log 非常多,这个空间占用也是可观的,也有几百 K 的大小,可以考虑清理所有冗余的字符串。另外如果有特别长的字符串,建议抽离保存成静态文件,因为 AppStore 对可执行文件加密导致压缩率低,特别长的字符串抽离成静态资源文件后压缩率会比在可执行文件里高很多。

          CheckList

          最后把缩减iOS安装包大小的各种方法列出来做了张 CheckList 图:

          参考文献:http://blog.cnbang.net/tech/2296/

          ',33),n=[l];function o(p,s){return t(),a("div",null,n)}const d=e(i,[["render",o],["__file","Reduced-App- volume.html.vue"]]),h=JSON.parse(`{"path":"/posts/iOS/system/Reduced-App-%20volume.html","title":"减小iOS-App或者静态库体积","lang":"zh-CN","frontmatter":{"title":"减小iOS-App或者静态库体积","date":"2016-11-04T18:11:56.000Z","category":["iOS"],"tag":["iOS"],"description":"把打包好的.ipa 文件的后缀改为.zip 并解压。右键.appbundle 选择显示包内容。有些情况下,大一点的文件压缩后反而比小一点的文件压缩后的体积小,而我们真正关心的时候解压后的真实体积,所以一定要解压里面的资源文件,看解压后的 size。从 APP Store 下载的.ipa 文件要比自己本地打包的要大,因为 APP Store 对 ipa ...","head":[["meta",{"property":"og:url","content":"https://oragekk.me/posts/iOS/system/Reduced-App-%20volume.html"}],["meta",{"property":"og:site_name","content":"Oragekk's Blog"}],["meta",{"property":"og:title","content":"减小iOS-App或者静态库体积"}],["meta",{"property":"og:description","content":"把打包好的.ipa 文件的后缀改为.zip 并解压。右键.appbundle 选择显示包内容。有些情况下,大一点的文件压缩后反而比小一点的文件压缩后的体积小,而我们真正关心的时候解压后的真实体积,所以一定要解压里面的资源文件,看解压后的 size。从 APP Store 下载的.ipa 文件要比自己本地打包的要大,因为 APP Store 对 ipa ..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://zero-space.s3.amazonaws.com/photos/2e6cc210-e9a6-4a0f-9c05-2c4056a982acx840.jpg"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-03-10T06:30:41.000Z"}],["meta",{"property":"article:author","content":"Oragekk"}],["meta",{"property":"article:tag","content":"iOS"}],["meta",{"property":"article:published_time","content":"2016-11-04T18:11:56.000Z"}],["meta",{"property":"article:modified_time","content":"2023-03-10T06:30:41.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"减小iOS-App或者静态库体积\\",\\"image\\":[\\"https://zero-space.s3.amazonaws.com/photos/2e6cc210-e9a6-4a0f-9c05-2c4056a982acx840.jpg\\",\\"http://upload-images.jianshu.io/upload_images/2076247-dde8e96bdd40396b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240\\"],\\"datePublished\\":\\"2016-11-04T18:11:56.000Z\\",\\"dateModified\\":\\"2023-03-10T06:30:41.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"Oragekk\\",\\"url\\":\\"https://orgaekk.me\\"}]}"]]},"headers":[{"level":2,"title":"图片","slug":"图片","link":"#图片","children":[]},{"level":2,"title":"音频","slug":"音频","link":"#音频","children":[]},{"level":2,"title":"视频","slug":"视频","link":"#视频","children":[]},{"level":2,"title":"Assets","slug":"assets","link":"#assets","children":[]},{"level":2,"title":"编译设置","slug":"编译设置","link":"#编译设置","children":[]},{"level":2,"title":"其他","slug":"其他","link":"#其他","children":[]},{"level":2,"title":"编译选项","slug":"编译选项","link":"#编译选项","children":[{"level":3,"title":"第三方库统计","slug":"第三方库统计","link":"#第三方库统计","children":[]},{"level":3,"title":"ARC->MRC","slug":"arc-mrc","link":"#arc-mrc","children":[]},{"level":3,"title":"无用代码","slug":"无用代码","link":"#无用代码","children":[]},{"level":3,"title":"类/方法名长度","slug":"类-方法名长度","link":"#类-方法名长度","children":[]},{"level":3,"title":"冗余字符串","slug":"冗余字符串","link":"#冗余字符串","children":[]},{"level":3,"title":"CheckList","slug":"checklist","link":"#checklist","children":[]}]}],"git":{"createdTime":1678187456000,"updatedTime":1678429841000,"contributors":[{"name":"huangkun","email":"huangkun@tonshow.cn","commits":1}]},"readingTime":{"minutes":9.24,"words":2771},"filePathRelative":"posts/iOS/system/Reduced-App- volume.md","localizedDate":"2016年11月4日","excerpt":"
          \\"\\"
          \\n
          \\n

          把打包好的.ipa 文件的后缀改为.zip 并解压。右键.appbundle 选择显示包内容。有些情况下,大一点的文件压缩后反而比小一点的文件压缩后的体积小,而我们真正关心的时候解压后的真实体积,所以一定要解压里面的资源文件,看解压后的 size。从 APP Store 下载的.ipa 文件要比自己本地打包的要大,因为 APP Store 对 ipa 包又做了加密处理。Xcode 的 Organizer window 的 Estimate Size 功能能估计本地打包文件从 APP Store 下载时的大小。根据优化的 28 定律和常识,首先当然是多媒体资源的体积啦。

          \\n
          ","autoDesc":true}`);export{d as comp,h as data}; diff --git a/assets/Update-Cocoapods.html-Du1QI9a2.js b/assets/Update-Cocoapods.html-Cqw1fYxU.js similarity index 99% rename from assets/Update-Cocoapods.html-Du1QI9a2.js rename to assets/Update-Cocoapods.html-Cqw1fYxU.js index 3ba1b437a..0f0d94fd9 100644 --- a/assets/Update-Cocoapods.html-Du1QI9a2.js +++ b/assets/Update-Cocoapods.html-Cqw1fYxU.js @@ -1 +1 @@ -import{_ as e,o,c as a,e as t}from"./app-DK0NGD4b.js";const i={},s=t('

          之前采用正常的 sudo gem install cocoapods更新 cocoapods 版本一直不成功,下面为和我遇到同样问题的兄弟们提供一个解决办法

          先切换 gem 源

          • gem sources --remove https://rubygems.org/
          • gem source -a https://gems.ruby-china.org
          • 查看是否切换成功 gem source -l
            如果出现下图这样的就说明切换成功了, 如果还是官方的源, 请手动重启电脑尝试

          接下来就可以开始升级了 cocoapods 了

          • sudo gem install -n /usr/local/bin cocoapods --pre
          • 是的, 你没看错是这个命令, 然后终端会出现一大推东西, 别管他, 最后停下来是这样的就差不多了
          • 然后查看版本pod --version
            出现 1.1.1,恭喜你已经安装成功了
          • 接下来设置 pod 仓库 pod setup

          Paste_Image.png
          此处需要耐心等待,根据网络情况完成时间长短不一。
          可以在终端中 CD 到~/.cocoapods目录中输入 du -sh *查看下载进度

          至此, 已经升级到 cocoapods1.1.1 了, 可以愉快的把玩 Swift3.0 的一些三方库了

          ',7),c=[s];function p(r,d){return o(),a("div",null,c)}const l=e(i,[["render",p],["__file","Update-Cocoapods.html.vue"]]),n=JSON.parse(`{"path":"/posts/iOS/tool/Update-Cocoapods.html","title":"Update Cocoapods 1.1.1","lang":"zh-CN","frontmatter":{"title":"Update Cocoapods 1.1.1","date":"2016-11-09T11:34:47.000Z","category":["iOS"],"tag":["iOS","工具集"],"description":"之前采用正常的 sudo gem install cocoapods更新 cocoapods 版本一直不成功,下面为和我遇到同样问题的兄弟们提供一个解决办法 先切换 gem 源 gem sources --remove https://rubygems.org/ gem source -a https://gems.ruby-china.org 查看是...","head":[["meta",{"property":"og:url","content":"https://oragekk.me/posts/iOS/tool/Update-Cocoapods.html"}],["meta",{"property":"og:site_name","content":"Oragekk's Blog"}],["meta",{"property":"og:title","content":"Update Cocoapods 1.1.1"}],["meta",{"property":"og:description","content":"之前采用正常的 sudo gem install cocoapods更新 cocoapods 版本一直不成功,下面为和我遇到同样问题的兄弟们提供一个解决办法 先切换 gem 源 gem sources --remove https://rubygems.org/ gem source -a https://gems.ruby-china.org 查看是..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"http://upload-images.jianshu.io/upload_images/2076247-365912ab78be4906.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-03-10T06:30:41.000Z"}],["meta",{"property":"article:author","content":"Oragekk"}],["meta",{"property":"article:tag","content":"iOS"}],["meta",{"property":"article:tag","content":"工具集"}],["meta",{"property":"article:published_time","content":"2016-11-09T11:34:47.000Z"}],["meta",{"property":"article:modified_time","content":"2023-03-10T06:30:41.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Update Cocoapods 1.1.1\\",\\"image\\":[\\"http://upload-images.jianshu.io/upload_images/2076247-365912ab78be4906.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240\\",\\"http://upload-images.jianshu.io/upload_images/2076247-81b6046594fe772b.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240\\",\\"http://upload-images.jianshu.io/upload_images/2076247-cafa12def948db48.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240\\"],\\"datePublished\\":\\"2016-11-09T11:34:47.000Z\\",\\"dateModified\\":\\"2023-03-10T06:30:41.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"Oragekk\\",\\"url\\":\\"https://orgaekk.me\\"}]}"]]},"headers":[{"level":3,"title":"至此, 已经升级到 cocoapods1.1.1 了, 可以愉快的把玩 Swift3.0 的一些三方库了","slug":"至此-已经升级到-cocoapods1-1-1-了-可以愉快的把玩-swift3-0-的一些三方库了","link":"#至此-已经升级到-cocoapods1-1-1-了-可以愉快的把玩-swift3-0-的一些三方库了","children":[]}],"git":{"createdTime":1678187456000,"updatedTime":1678429841000,"contributors":[{"name":"huangkun","email":"huangkun@tonshow.cn","commits":1}]},"readingTime":{"minutes":1.01,"words":304},"filePathRelative":"posts/iOS/tool/Update-Cocoapods.md","localizedDate":"2016年11月9日","excerpt":"
          \\n

          之前采用正常的 sudo gem install cocoapods更新 cocoapods 版本一直不成功,下面为和我遇到同样问题的兄弟们提供一个解决办法

          \\n
          \\n

          先切换 gem 源

          \\n
            \\n
          • gem sources --remove https://rubygems.org/
          • \\n
          • gem source -a https://gems.ruby-china.org
          • \\n
          • 查看是否切换成功 gem source -l
            \\n如果出现下图这样的就说明切换成功了, 如果还是官方的源, 请手动重启电脑尝试
            \\n\\"\\"
          • \\n
          ","autoDesc":true}`);export{l as comp,n as data}; +import{_ as e,o,c as a,e as t}from"./app-B-uzNdhT.js";const i={},s=t('

          之前采用正常的 sudo gem install cocoapods更新 cocoapods 版本一直不成功,下面为和我遇到同样问题的兄弟们提供一个解决办法

          先切换 gem 源

          • gem sources --remove https://rubygems.org/
          • gem source -a https://gems.ruby-china.org
          • 查看是否切换成功 gem source -l
            如果出现下图这样的就说明切换成功了, 如果还是官方的源, 请手动重启电脑尝试

          接下来就可以开始升级了 cocoapods 了

          • sudo gem install -n /usr/local/bin cocoapods --pre
          • 是的, 你没看错是这个命令, 然后终端会出现一大推东西, 别管他, 最后停下来是这样的就差不多了
          • 然后查看版本pod --version
            出现 1.1.1,恭喜你已经安装成功了
          • 接下来设置 pod 仓库 pod setup

          Paste_Image.png
          此处需要耐心等待,根据网络情况完成时间长短不一。
          可以在终端中 CD 到~/.cocoapods目录中输入 du -sh *查看下载进度

          至此, 已经升级到 cocoapods1.1.1 了, 可以愉快的把玩 Swift3.0 的一些三方库了

          ',7),c=[s];function p(r,d){return o(),a("div",null,c)}const l=e(i,[["render",p],["__file","Update-Cocoapods.html.vue"]]),n=JSON.parse(`{"path":"/posts/iOS/tool/Update-Cocoapods.html","title":"Update Cocoapods 1.1.1","lang":"zh-CN","frontmatter":{"title":"Update Cocoapods 1.1.1","date":"2016-11-09T11:34:47.000Z","category":["iOS"],"tag":["iOS","工具集"],"description":"之前采用正常的 sudo gem install cocoapods更新 cocoapods 版本一直不成功,下面为和我遇到同样问题的兄弟们提供一个解决办法 先切换 gem 源 gem sources --remove https://rubygems.org/ gem source -a https://gems.ruby-china.org 查看是...","head":[["meta",{"property":"og:url","content":"https://oragekk.me/posts/iOS/tool/Update-Cocoapods.html"}],["meta",{"property":"og:site_name","content":"Oragekk's Blog"}],["meta",{"property":"og:title","content":"Update Cocoapods 1.1.1"}],["meta",{"property":"og:description","content":"之前采用正常的 sudo gem install cocoapods更新 cocoapods 版本一直不成功,下面为和我遇到同样问题的兄弟们提供一个解决办法 先切换 gem 源 gem sources --remove https://rubygems.org/ gem source -a https://gems.ruby-china.org 查看是..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"http://upload-images.jianshu.io/upload_images/2076247-365912ab78be4906.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2023-03-10T06:30:41.000Z"}],["meta",{"property":"article:author","content":"Oragekk"}],["meta",{"property":"article:tag","content":"iOS"}],["meta",{"property":"article:tag","content":"工具集"}],["meta",{"property":"article:published_time","content":"2016-11-09T11:34:47.000Z"}],["meta",{"property":"article:modified_time","content":"2023-03-10T06:30:41.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Update Cocoapods 1.1.1\\",\\"image\\":[\\"http://upload-images.jianshu.io/upload_images/2076247-365912ab78be4906.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240\\",\\"http://upload-images.jianshu.io/upload_images/2076247-81b6046594fe772b.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240\\",\\"http://upload-images.jianshu.io/upload_images/2076247-cafa12def948db48.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240\\"],\\"datePublished\\":\\"2016-11-09T11:34:47.000Z\\",\\"dateModified\\":\\"2023-03-10T06:30:41.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"Oragekk\\",\\"url\\":\\"https://orgaekk.me\\"}]}"]]},"headers":[{"level":3,"title":"至此, 已经升级到 cocoapods1.1.1 了, 可以愉快的把玩 Swift3.0 的一些三方库了","slug":"至此-已经升级到-cocoapods1-1-1-了-可以愉快的把玩-swift3-0-的一些三方库了","link":"#至此-已经升级到-cocoapods1-1-1-了-可以愉快的把玩-swift3-0-的一些三方库了","children":[]}],"git":{"createdTime":1678187456000,"updatedTime":1678429841000,"contributors":[{"name":"huangkun","email":"huangkun@tonshow.cn","commits":1}]},"readingTime":{"minutes":1.01,"words":304},"filePathRelative":"posts/iOS/tool/Update-Cocoapods.md","localizedDate":"2016年11月9日","excerpt":"
          \\n

          之前采用正常的 sudo gem install cocoapods更新 cocoapods 版本一直不成功,下面为和我遇到同样问题的兄弟们提供一个解决办法

          \\n
          \\n

          先切换 gem 源

          \\n
            \\n
          • gem sources --remove https://rubygems.org/
          • \\n
          • gem source -a https://gems.ruby-china.org
          • \\n
          • 查看是否切换成功 gem source -l
            \\n如果出现下图这样的就说明切换成功了, 如果还是官方的源, 请手动重启电脑尝试
            \\n\\"\\"
          • \\n
          ","autoDesc":true}`);export{l as comp,n as data}; diff --git a/assets/WCDB.html-C_b8iPW3.js b/assets/WCDB.html-Dm4gbE_q.js similarity index 99% rename from assets/WCDB.html-C_b8iPW3.js rename to assets/WCDB.html-Dm4gbE_q.js index 90e705e85..2ea559bfd 100644 --- a/assets/WCDB.html-C_b8iPW3.js +++ b/assets/WCDB.html-Dm4gbE_q.js @@ -1,4 +1,4 @@ -import{_ as i,o as a,c as e,e as l}from"./app-DK0NGD4b.js";const s={},n=l(`

          前言

          移动端的数据库选型一直是一个难题,直到前段时间看到了 WeMobileDev(微信前端团队)放出了第三个开源组件-WCDB

          WCDB(WeChat DataBase)是微信官方的移动端数据库组件,致力于提供一个高效、易用、完整的移动端存储方案

          微信团队怎么说

          • 基于 SQLCipher

          • WCDB-iOS/Mac

          • WCDB-Android

          • 数据库损坏修复工具 WDBRepair

          背景

          WCDB 的出现可以说解决了目前移动端数据库的几个难点

          • 首先在选型上,FMDB的 SQL 拼接、难以防止的 SQL 注入;CoreData虽然可以方便 ORM,但学习成本高,稳定性堪忧,而且多线程鸡肋;另外基于 C 语言的sqlite我想用的人也应该不多;除了上述关系型数据库之外然后还有一些其他的 Key-Value 型数据库,如我用过的 Realm,对于 ObjC 开发者来说,上手倒是没什么难度,但缺点显而易见,需要继承,入侵性强,对于单继承的 OC 来说这并不理想,而且对于集合类型不完全支持,复杂查询也比较无力。

          • 高效

            • 多线程高并发:WCDB 支持多线程读与读、读与写并发执行,写与写串行执行。

            • 批量写操作性能测试:

              批量写ops/sec
              WCDB458000
              FMDB161000
          • 易用 WCDB 支持一句代码即可将数据取出并组合为 object

            • WINQ(WCDB 语言集成查询):通过 WINQ,开发者无须为了拼接 SQL 的字符串而写一大坨胶水代码。

            • ORM(Object Relational Mapping):WCDB 支持灵活、易用的 ORM。开发者可以很便捷地定义表、索引、约束,并进行增删改查操作。

            • 像这样

              [database getObjectsOfClass:WCTSampleConvenient.class
              +import{_ as i,o as a,c as e,e as l}from"./app-B-uzNdhT.js";const s={},n=l(`

              前言

              移动端的数据库选型一直是一个难题,直到前段时间看到了 WeMobileDev(微信前端团队)放出了第三个开源组件-WCDB

              WCDB(WeChat DataBase)是微信官方的移动端数据库组件,致力于提供一个高效、易用、完整的移动端存储方案

              微信团队怎么说

              • 基于 SQLCipher

              • WCDB-iOS/Mac

              • WCDB-Android

              • 数据库损坏修复工具 WDBRepair

              背景

              WCDB 的出现可以说解决了目前移动端数据库的几个难点

              • 首先在选型上,FMDB的 SQL 拼接、难以防止的 SQL 注入;CoreData虽然可以方便 ORM,但学习成本高,稳定性堪忧,而且多线程鸡肋;另外基于 C 语言的sqlite我想用的人也应该不多;除了上述关系型数据库之外然后还有一些其他的 Key-Value 型数据库,如我用过的 Realm,对于 ObjC 开发者来说,上手倒是没什么难度,但缺点显而易见,需要继承,入侵性强,对于单继承的 OC 来说这并不理想,而且对于集合类型不完全支持,复杂查询也比较无力。

              • 高效

                • 多线程高并发:WCDB 支持多线程读与读、读与写并发执行,写与写串行执行。

                • 批量写操作性能测试:

                  批量写ops/sec
                  WCDB458000
                  FMDB161000
              • 易用 WCDB 支持一句代码即可将数据取出并组合为 object

                • WINQ(WCDB 语言集成查询):通过 WINQ,开发者无须为了拼接 SQL 的字符串而写一大坨胶水代码。

                • ORM(Object Relational Mapping):WCDB 支持灵活、易用的 ORM。开发者可以很便捷地定义表、索引、约束,并进行增删改查操作。

                • 像这样

                  [database getObjectsOfClass:WCTSampleConvenient.class
                   
                   		fromTable:tableName
                   
                  diff --git a/assets/WKWebView-URL.html-CBmYG6d-.js b/assets/WKWebView-URL.html-DuqslWhx.js
                  similarity index 99%
                  rename from assets/WKWebView-URL.html-CBmYG6d-.js
                  rename to assets/WKWebView-URL.html-DuqslWhx.js
                  index 184d7f290..3d15c0d79 100644
                  --- a/assets/WKWebView-URL.html-CBmYG6d-.js
                  +++ b/assets/WKWebView-URL.html-DuqslWhx.js
                  @@ -1,4 +1,4 @@
                  -import{_ as s,o as a,c as i,e as n}from"./app-DK0NGD4b.js";const l={},e=n(`

                  本文介绍使用 WKWebView 拦截 url 进行原生界面跳转

                  3.gif
                  3.gif
                  • 使用代理方法 decidePolicyForNavigationAction
                  - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
                  +import{_ as s,o as a,c as i,e as n}from"./app-B-uzNdhT.js";const l={},e=n(`

                  本文介绍使用 WKWebView 拦截 url 进行原生界面跳转

                  3.gif
                  3.gif
                  • 使用代理方法 decidePolicyForNavigationAction
                  - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
                       // 获取完整url并进行UTF-8转码
                       NSString *strRequest = [navigationAction.request.URL.absoluteString stringByRemovingPercentEncoding];
                       if ([strRequest hasPrefix:@"app://"]) {
                  diff --git a/assets/WKWebView.html-BaW8vIPH.js b/assets/WKWebView.html-CHZbN4DT.js
                  similarity index 99%
                  rename from assets/WKWebView.html-BaW8vIPH.js
                  rename to assets/WKWebView.html-CHZbN4DT.js
                  index 6cfab4b79..fc7d23811 100644
                  --- a/assets/WKWebView.html-BaW8vIPH.js
                  +++ b/assets/WKWebView.html-CHZbN4DT.js
                  @@ -1,4 +1,4 @@
                  -import{_ as s,o as a,c as i,e as n}from"./app-DK0NGD4b.js";const e={},l=n(`

                  记录一下 iOS8 之后的新控件 WKWebView,用以替代之前的 UIWebView,因为需求是在 TableView 的 Cell 中放一个 WebView。就产生了滑动手势冲突,为了解决这个问题就需要让 webView 高度自适应

                  一、新特性

                  • 在性能、稳定性、功能方面有很大的提升,最明显的就是内存占用降低了很多。
                  • 允许 JavaScript 的 Nitro 库加载并使用(UIWebView 中限制)
                  • 支持了更多的 HTML5 特性;
                  • 高达 60fps 的滚动刷新率以及内置手势(支持右滑返回);
                  • 将 UIWebViewDelegate 与 UIWebView 重构成了 14 类与 3 个协议(查看苹果官方文档);

                  二、初始化

                  • 首先需要引入 WebKit 库
                  #import <WebKit/WebKit.h>
                  • 采用 configuration 的方式初始化(可选)
                  - (WKWebView *)webView {
                  +import{_ as s,o as a,c as i,e as n}from"./app-B-uzNdhT.js";const e={},l=n(`

                  记录一下 iOS8 之后的新控件 WKWebView,用以替代之前的 UIWebView,因为需求是在 TableView 的 Cell 中放一个 WebView。就产生了滑动手势冲突,为了解决这个问题就需要让 webView 高度自适应

                  一、新特性

                  • 在性能、稳定性、功能方面有很大的提升,最明显的就是内存占用降低了很多。
                  • 允许 JavaScript 的 Nitro 库加载并使用(UIWebView 中限制)
                  • 支持了更多的 HTML5 特性;
                  • 高达 60fps 的滚动刷新率以及内置手势(支持右滑返回);
                  • 将 UIWebViewDelegate 与 UIWebView 重构成了 14 类与 3 个协议(查看苹果官方文档);

                  二、初始化

                  • 首先需要引入 WebKit 库
                  #import <WebKit/WebKit.h>
                  • 采用 configuration 的方式初始化(可选)
                  - (WKWebView *)webView {
                       if (!_webView) {
                           WKWebViewConfiguration *config = [WKWebViewConfiguration new];
                           //初始化偏好设置属性:preferences
                  diff --git a/assets/YYMemoryCache.html-DyYkpWup.js b/assets/YYMemoryCache.html-BbWxf4Nh.js
                  similarity index 99%
                  rename from assets/YYMemoryCache.html-DyYkpWup.js
                  rename to assets/YYMemoryCache.html-BbWxf4Nh.js
                  index 367688d96..ab0714078 100644
                  --- a/assets/YYMemoryCache.html-DyYkpWup.js
                  +++ b/assets/YYMemoryCache.html-BbWxf4Nh.js
                  @@ -1,4 +1,4 @@
                  -import{_ as i,o as n,c as l,f as e,a as s,b as a,e as r}from"./app-DK0NGD4b.js";const o={},p=s("h2",{id:"_1-1-前言",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#_1-1-前言"},[s("span",null,"1.1. 前言")])],-1),B=s("p",null,[a("开发中总会用到各种缓存,但是各位有没有考虑过什么样的缓存才能被叫做优秀的缓存,或者说优秀的缓存应该具备哪些特质?"),s("br"),a(" 本文将结合 YYCache 的源码逐步带大家找到答案。"),s("br"),a(" YYCache 是一个线程安全的高性能键值缓存(该项目是 YYKit 组件之一)"),s("br"),a(" YYCache 的代码逻辑清晰,注释详尽,加上自身不算太大的代码量使得其阅读非常简单,更加难能可贵的是它的性能还非常高。")],-1),t=r(`

                  提示

                  YYCache 是由 YYMemoryCache 与 YYDiskCache 两部分组成的,其中 YYMemoryCache 作为高速内存缓存,而 YYDiskCache 则作为低速磁盘缓存。
                  YYMemoryCache 是内存缓存,所以存取速度非常快,主要用到两种数据结构的 LRU 淘汰算法

                  NSCache 是苹果提供的一个简单的内存缓存,它有着和 NSDictionary 类似的 API,不同点是它是线程安全的,并且不会 retain key。我在测试时发现了它的几个特点:NSCache 底层并没有用 NSDictionary 等已有的类,而是直接调用了 libcache.dylib,其中线程安全是由 pthread_mutex 完成的。另外,它的性能和 key 的相似度有关,如果有大量相似的 key (比如 “1”, “2”, “3”, …),NSCache 的存取性能会下降得非常厉害,大量的时间被消耗在 CFStringEqual() 上,不知这是不是 NSCache 本身设计的缺陷。

                  1.2. 介绍

                  YYMemoryCache 是一个高速的内存缓存,用于存储键值对。它与 NSDictionary 相反,Key 被保留并且不复制。API 和性能类似于 NSCache,所有方法都是线程安全的。

                  YYMemoryCache 对象与 NSCache 的不同之处在于:

                  YYMemoryCache 使用 LRU(least-recently-used) 算法来驱逐对象;NSCache 的驱逐方式是非确定性的。
                  YYMemoryCache 提供 age、cost、count 三种方式控制缓存;NSCache 的控制方式是不精确的。
                  YYMemoryCache 可以配置为在收到内存警告或者 App 进入后台时自动逐出对象。

                  @interface YYMemoryCache : NSObject
                  +import{_ as i,o as n,c as l,f as e,a as s,b as a,e as r}from"./app-B-uzNdhT.js";const o={},p=s("h2",{id:"_1-1-前言",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#_1-1-前言"},[s("span",null,"1.1. 前言")])],-1),B=s("p",null,[a("开发中总会用到各种缓存,但是各位有没有考虑过什么样的缓存才能被叫做优秀的缓存,或者说优秀的缓存应该具备哪些特质?"),s("br"),a(" 本文将结合 YYCache 的源码逐步带大家找到答案。"),s("br"),a(" YYCache 是一个线程安全的高性能键值缓存(该项目是 YYKit 组件之一)"),s("br"),a(" YYCache 的代码逻辑清晰,注释详尽,加上自身不算太大的代码量使得其阅读非常简单,更加难能可贵的是它的性能还非常高。")],-1),t=r(`

                  提示

                  YYCache 是由 YYMemoryCache 与 YYDiskCache 两部分组成的,其中 YYMemoryCache 作为高速内存缓存,而 YYDiskCache 则作为低速磁盘缓存。
                  YYMemoryCache 是内存缓存,所以存取速度非常快,主要用到两种数据结构的 LRU 淘汰算法

                  NSCache 是苹果提供的一个简单的内存缓存,它有着和 NSDictionary 类似的 API,不同点是它是线程安全的,并且不会 retain key。我在测试时发现了它的几个特点:NSCache 底层并没有用 NSDictionary 等已有的类,而是直接调用了 libcache.dylib,其中线程安全是由 pthread_mutex 完成的。另外,它的性能和 key 的相似度有关,如果有大量相似的 key (比如 “1”, “2”, “3”, …),NSCache 的存取性能会下降得非常厉害,大量的时间被消耗在 CFStringEqual() 上,不知这是不是 NSCache 本身设计的缺陷。

                  1.2. 介绍

                  YYMemoryCache 是一个高速的内存缓存,用于存储键值对。它与 NSDictionary 相反,Key 被保留并且不复制。API 和性能类似于 NSCache,所有方法都是线程安全的。

                  YYMemoryCache 对象与 NSCache 的不同之处在于:

                  YYMemoryCache 使用 LRU(least-recently-used) 算法来驱逐对象;NSCache 的驱逐方式是非确定性的。
                  YYMemoryCache 提供 age、cost、count 三种方式控制缓存;NSCache 的控制方式是不精确的。
                  YYMemoryCache 可以配置为在收到内存警告或者 App 进入后台时自动逐出对象。

                  @interface YYMemoryCache : NSObject
                   
                   #pragma mark - Attribute
                   @property (nullable, copy) NSString *name; // 缓存名称,默认为 nil
                  diff --git a/assets/about.html-CylbYPmv.js b/assets/about.html-B7wj1tkV.js
                  similarity index 99%
                  rename from assets/about.html-CylbYPmv.js
                  rename to assets/about.html-B7wj1tkV.js
                  index ae841a199..23e323ce9 100644
                  --- a/assets/about.html-CylbYPmv.js
                  +++ b/assets/about.html-B7wj1tkV.js
                  @@ -1,4 +1,4 @@
                  -import{_ as i,r as l,o as e,c as r,a as p,b as s,d as o,w as t,e as a}from"./app-DK0NGD4b.js";const k={},c=a('

                  关于本站

                  ✨📒

                  详细记录一下此次建站过程

                  开始

                  之前的博客是基于jekyll打造的,要添加和定制化的东西都只能基于html+js+css完成,有些麻烦,所以一直有想更换引擎的想法
                  直到偶然间发现vuepress,首先是被vue3+typescript+vite吸引,然后看到默认主题属实有点不合符我的期待,自己动手成本又太高,也没有太急着去折腾,直到无意中发现了
                  vuepress-theme-hope,漂亮的外观一下子就吸引到我了,然后去官网深入研究了一番,发现二次开发的成本并不高,对于我来说比较友好,基本都是基于选项的配置型,和一小部分的定制开发,也可以基于vue来写,这让我觉得很合适。所以,一步步折腾了起来……

                  Markdown增强

                  ',5),d=a(`

                  目录结构

                  .
                  +import{_ as i,r as l,o as e,c as r,a as p,b as s,d as o,w as t,e as a}from"./app-B-uzNdhT.js";const k={},c=a('

                  关于本站

                  ✨📒

                  详细记录一下此次建站过程

                  开始

                  之前的博客是基于jekyll打造的,要添加和定制化的东西都只能基于html+js+css完成,有些麻烦,所以一直有想更换引擎的想法
                  直到偶然间发现vuepress,首先是被vue3+typescript+vite吸引,然后看到默认主题属实有点不合符我的期待,自己动手成本又太高,也没有太急着去折腾,直到无意中发现了
                  vuepress-theme-hope,漂亮的外观一下子就吸引到我了,然后去官网深入研究了一番,发现二次开发的成本并不高,对于我来说比较友好,基本都是基于选项的配置型,和一小部分的定制开发,也可以基于vue来写,这让我觉得很合适。所以,一步步折腾了起来……

                  Markdown增强

                  ',5),d=a(`

                  目录结构

                  .
                   ├── .github
                      ├── ISSUE_TEMPLATE # issus 模版
                      └── bug-report.yml
                  diff --git a/assets/app-DK0NGD4b.js b/assets/app-B-uzNdhT.js
                  similarity index 97%
                  rename from assets/app-DK0NGD4b.js
                  rename to assets/app-B-uzNdhT.js
                  index 961adf7c5..69e639965 100644
                  --- a/assets/app-DK0NGD4b.js
                  +++ b/assets/app-B-uzNdhT.js
                  @@ -1,4 +1,4 @@
                  -const __vite__fileDeps=["assets/design.html-B2WuonX6.js","assets/Mylink-eoVYxaQz.js","assets/public-api.html-CQ926TNZ.js","assets/component-5fPsKYVS.js","assets/commonjsHelpers-Cpj98o6Y.js","assets/mermaid.core-H5Ux720q.js","assets/vue-repl-23a9KZvI.js","assets/utils-X8EomH4B-BP_hkFrF.js","assets/codemirror-editor-rzQ_Hkkw.js","assets/APlayer.min-CAgWaKXK.js"],__vite__mapDeps=i=>i.map(i=>__vite__fileDeps[i]);
                  +const __vite__fileDeps=["assets/design.html-Ce15CoAF.js","assets/Mylink-BokaCp9V.js","assets/public-api.html-BuW-P-mb.js","assets/component-XzbOLqsv.js","assets/commonjsHelpers-Cpj98o6Y.js","assets/mermaid.core-Bk1eNDay.js","assets/vue-repl-Dk163GK1.js","assets/utils-X8EomH4B-BP_hkFrF.js","assets/codemirror-editor-B3dqp7I9.js","assets/APlayer.min-CAgWaKXK.js"],__vite__mapDeps=i=>i.map(i=>__vite__fileDeps[i]);
                   var c2=Object.defineProperty;var u2=(e,t,n)=>t in e?c2(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var Rr=(e,t,n)=>(u2(e,typeof t!="symbol"?t+"":t,n),n);/**
                   * @vue/shared v3.4.27
                   * (c) 2018-present Yuxi (Evan) You and Vue contributors
                  @@ -15,7 +15,7 @@ var c2=Object.defineProperty;var u2=(e,t,n)=>t in e?c2(e,t,{enumerable:!0,config
                   * @vue/runtime-dom v3.4.27
                   * (c) 2018-present Yuxi (Evan) You and Vue contributors
                   * @license MIT
                  -**/const p3="http://www.w3.org/2000/svg",f3="http://www.w3.org/1998/Math/MathML",Vn=typeof document<"u"?document:null,Nc=Vn&&Vn.createElement("template"),h3={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,o)=>{const s=t==="svg"?Vn.createElementNS(p3,e):t==="mathml"?Vn.createElementNS(f3,e):Vn.createElement(e,n?{is:n}:void 0);return e==="select"&&o&&o.multiple!=null&&s.setAttribute("multiple",o.multiple),s},createText:e=>Vn.createTextNode(e),createComment:e=>Vn.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Vn.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,o,s,a){const r=n?n.previousSibling:t.lastChild;if(s&&(s===a||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===a||!(s=s.nextSibling)););else{Nc.innerHTML=o==="svg"?`${e}`:o==="mathml"?`${e}`:e;const i=Nc.content;if(o==="svg"||o==="mathml"){const l=i.firstChild;for(;l.firstChild;)i.appendChild(l.firstChild);i.removeChild(l)}t.insertBefore(i,n)}return[r?r.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},xn="transition",is="animation",Wo=Symbol("_vtc"),bn=(e,{slots:t})=>c(_h,Gp(e),t);bn.displayName="Transition";const Wp={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},m3=bn.props=je({},wp,Wp),oo=(e,t=[])=>{Z(e)?e.forEach(n=>n(...t)):e&&e(...t)},Vc=e=>e?Z(e)?e.some(t=>t.length>1):e.length>1:!1;function Gp(e){const t={};for(const N in e)N in Wp||(t[N]=e[N]);if(e.css===!1)return t;const{name:n="v",type:o,duration:s,enterFromClass:a=`${n}-enter-from`,enterActiveClass:r=`${n}-enter-active`,enterToClass:i=`${n}-enter-to`,appearFromClass:l=a,appearActiveClass:u=r,appearToClass:d=i,leaveFromClass:p=`${n}-leave-from`,leaveActiveClass:f=`${n}-leave-active`,leaveToClass:h=`${n}-leave-to`}=e,m=v3(s),g=m&&m[0],E=m&&m[1],{onBeforeEnter:_,onEnter:B,onEnterCancelled:y,onLeave:C,onLeaveCancelled:M,onBeforeAppear:R=_,onAppear:I=B,onAppearCancelled:P=y}=t,K=(N,se,Me)=>{Rn(N,se?d:i),Rn(N,se?u:r),Me&&Me()},F=(N,se)=>{N._isLeaving=!1,Rn(N,p),Rn(N,h),Rn(N,f),se&&se()},G=N=>(se,Me)=>{const De=N?I:B,J=()=>K(se,N,Me);oo(De,[se,J]),jc(()=>{Rn(se,N?l:a),pn(se,N?d:i),Vc(De)||zc(se,o,g,J)})};return je(t,{onBeforeEnter(N){oo(_,[N]),pn(N,a),pn(N,r)},onBeforeAppear(N){oo(R,[N]),pn(N,l),pn(N,u)},onEnter:G(!1),onAppear:G(!0),onLeave(N,se){N._isLeaving=!0;const Me=()=>F(N,se);pn(N,p),pn(N,f),Jp(),jc(()=>{N._isLeaving&&(Rn(N,p),pn(N,h),Vc(C)||zc(N,o,E,Me))}),oo(C,[N,Me])},onEnterCancelled(N){K(N,!1),oo(y,[N])},onAppearCancelled(N){K(N,!0),oo(P,[N])},onLeaveCancelled(N){F(N),oo(M,[N])}})}function v3(e){if(e==null)return null;if(Oe(e))return[jr(e.enter),jr(e.leave)];{const t=jr(e);return[t,t]}}function jr(e){return v2(e)}function pn(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Wo]||(e[Wo]=new Set)).add(t)}function Rn(e,t){t.split(/\s+/).forEach(o=>o&&e.classList.remove(o));const n=e[Wo];n&&(n.delete(t),n.size||(e[Wo]=void 0))}function jc(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let g3=0;function zc(e,t,n,o){const s=e._endId=++g3,a=()=>{s===e._endId&&o()};if(n)return setTimeout(a,n);const{type:r,timeout:i,propCount:l}=Kp(e,t);if(!r)return o();const u=r+"end";let d=0;const p=()=>{e.removeEventListener(u,f),a()},f=h=>{h.target===e&&++d>=l&&p()};setTimeout(()=>{d(n[m]||"").split(", "),s=o(`${xn}Delay`),a=o(`${xn}Duration`),r=Hc(s,a),i=o(`${is}Delay`),l=o(`${is}Duration`),u=Hc(i,l);let d=null,p=0,f=0;t===xn?r>0&&(d=xn,p=r,f=a.length):t===is?u>0&&(d=is,p=u,f=l.length):(p=Math.max(r,u),d=p>0?r>u?xn:is:null,f=d?d===xn?a.length:l.length:0);const h=d===xn&&/\b(transform|all)(,|$)/.test(o(`${xn}Property`).toString());return{type:d,timeout:p,propCount:f,hasTransform:h}}function Hc(e,t){for(;e.lengthqc(n)+qc(e[o])))}function qc(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Jp(){return document.body.offsetHeight}function y3(e,t,n){const o=e[Wo];o&&(t=(t?[t,...o]:[...o]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Qa=Symbol("_vod"),Yp=Symbol("_vsh"),b3={beforeMount(e,{value:t},{transition:n}){e[Qa]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):ls(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:o}){!t!=!n&&(o?t?(o.beforeEnter(e),ls(e,!0),o.enter(e)):o.leave(e,()=>{ls(e,!1)}):ls(e,t))},beforeUnmount(e,{value:t}){ls(e,t)}};function ls(e,t){e.style.display=t?e[Qa]:"none",e[Yp]=!t}const Qp=Symbol("");function _3(e){const t=ko();if(!t)return;const n=t.ut=(s=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach(a=>Ci(a,s))},o=()=>{const s=e(t.proxy);Ai(t.subTree,s),n(s)};ne(()=>{mh(o);const s=new MutationObserver(o);s.observe(t.subTree.el.parentNode,{childList:!0}),wn(()=>s.disconnect())})}function Ai(e,t){if(e.shapeFlag&128){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push(()=>{Ai(n.activeBranch,t)})}for(;e.component;)e=e.component.subTree;if(e.shapeFlag&1&&e.el)Ci(e.el,t);else if(e.type===$e)e.children.forEach(n=>Ai(n,t));else if(e.type===Vo){let{el:n,anchor:o}=e;for(;n&&(Ci(n,t),n!==o);)n=n.nextSibling}}function Ci(e,t){if(e.nodeType===1){const n=e.style;let o="";for(const s in t)n.setProperty(`--${s}`,t[s]),o+=`--${s}: ${t[s]};`;n[Qp]=o}}const k3=/(^|;)\s*display\s*:/;function w3(e,t,n){const o=e.style,s=Ne(n);let a=!1;if(n&&!s){if(t)if(Ne(t))for(const r of t.split(";")){const i=r.slice(0,r.indexOf(":")).trim();n[i]==null&&Fa(o,i,"")}else for(const r in t)n[r]==null&&Fa(o,r,"");for(const r in n)r==="display"&&(a=!0),Fa(o,r,n[r])}else if(s){if(t!==n){const r=o[Qp];r&&(n+=";"+r),o.cssText=n,a=k3.test(n)}}else t&&e.removeAttribute("style");Qa in e&&(e[Qa]=a?o.display:"",e[Yp]&&(o.display="none"))}const Uc=/\s*!important$/;function Fa(e,t,n){if(Z(n))n.forEach(o=>Fa(e,t,o));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const o=E3(e,t);Uc.test(n)?e.setProperty(Jn(o),n.replace(Uc,""),"important"):e[o]=n}}const Wc=["Webkit","Moz","ms"],zr={};function E3(e,t){const n=zr[t];if(n)return n;let o=Bt(t);if(o!=="filter"&&o in e)return zr[t]=o;o=Us(o);for(let s=0;sHr||(O3.then(()=>Hr=0),Hr=Date.now());function L3(e,t){const n=o=>{if(!o._vts)o._vts=Date.now();else if(o._vts<=n.attached)return;Lt(I3(o,n.value),t,5,[o])};return n.value=e,n.attached=T3(),n}function I3(e,t){if(Z(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(o=>s=>!s._stopped&&o&&o(s))}else return t}const Yc=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,R3=(e,t,n,o,s,a,r,i,l)=>{const u=s==="svg";t==="class"?y3(e,o,u):t==="style"?w3(e,n,o):Hs(t)?il(t)||S3(e,t,n,o,r):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):P3(e,t,o,u))?A3(e,t,o,a,r,i,l):(t==="true-value"?e._trueValue=o:t==="false-value"&&(e._falseValue=o),B3(e,t,o,u))};function P3(e,t,n,o){if(o)return!!(t==="innerHTML"||t==="textContent"||t in e&&Yc(t)&&ie(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const s=e.tagName;if(s==="IMG"||s==="VIDEO"||s==="CANVAS"||s==="SOURCE")return!1}return Yc(t)&&Ne(n)?!1:t in e}const Xp=new WeakMap,Zp=new WeakMap,Xa=Symbol("_moveCb"),Qc=Symbol("_enterCb"),e1={name:"TransitionGroup",props:je({},m3,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=ko(),o=kp();let s,a;return Cp(()=>{if(!s.length)return;const r=e.moveClass||`${e.name||"v"}-move`;if(!V3(s[0].el,n.vnode.el,r))return;s.forEach(M3),s.forEach($3);const i=s.filter(N3);Jp(),i.forEach(l=>{const u=l.el,d=u.style;pn(u,r),d.transform=d.webkitTransform=d.transitionDuration="";const p=u[Xa]=f=>{f&&f.target!==u||(!f||/transform$/.test(f.propertyName))&&(u.removeEventListener("transitionend",p),u[Xa]=null,Rn(u,r))};u.addEventListener("transitionend",p)})}),()=>{const r=_e(e),i=Gp(r);let l=r.tag||$e;if(s=[],a)for(let u=0;udelete e.mode;e1.props;const F3=e1;function M3(e){const t=e.el;t[Xa]&&t[Xa](),t[Qc]&&t[Qc]()}function $3(e){Zp.set(e,e.el.getBoundingClientRect())}function N3(e){const t=Xp.get(e),n=Zp.get(e),o=t.left-n.left,s=t.top-n.top;if(o||s){const a=e.el.style;return a.transform=a.webkitTransform=`translate(${o}px,${s}px)`,a.transitionDuration="0s",e}}function V3(e,t,n){const o=e.cloneNode(),s=e[Wo];s&&s.forEach(i=>{i.split(/\s+/).forEach(l=>l&&o.classList.remove(l))}),n.split(/\s+/).forEach(i=>i&&o.classList.add(i)),o.style.display="none";const a=t.nodeType===1?t:t.parentNode;a.appendChild(o);const{hasTransform:r}=Kp(o);return a.removeChild(o),r}const Gn=e=>{const t=e.props["onUpdate:modelValue"]||!1;return Z(t)?n=>Pa(t,n):t};function j3(e){e.target.composing=!0}function Xc(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Rt=Symbol("_assign"),Zc={created(e,{modifiers:{lazy:t,trim:n,number:o}},s){e[Rt]=Gn(s);const a=o||s.props&&s.props.type==="number";vn(e,t?"change":"input",r=>{if(r.target.composing)return;let i=e.value;n&&(i=i.trim()),a&&(i=za(i)),e[Rt](i)}),n&&vn(e,"change",()=>{e.value=e.value.trim()}),t||(vn(e,"compositionstart",j3),vn(e,"compositionend",Xc),vn(e,"change",Xc))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:o,number:s}},a){if(e[Rt]=Gn(a),e.composing)return;const r=(s||e.type==="number")&&!/^0\d/.test(e.value)?za(e.value):e.value,i=t??"";r!==i&&(document.activeElement===e&&e.type!=="range"&&(n||o&&e.value.trim()===i)||(e.value=i))}},z3={deep:!0,created(e,t,n){e[Rt]=Gn(n),vn(e,"change",()=>{const o=e._modelValue,s=Go(e),a=e.checked,r=e[Rt];if(Z(o)){const i=ul(o,s),l=i!==-1;if(a&&!l)r(o.concat(s));else if(!a&&l){const u=[...o];u.splice(i,1),r(u)}}else if(Yo(o)){const i=new Set(o);a?i.add(s):i.delete(s),r(i)}else r(t1(e,a))})},mounted:eu,beforeUpdate(e,t,n){e[Rt]=Gn(n),eu(e,t,n)}};function eu(e,{value:t,oldValue:n},o){e._modelValue=t,Z(t)?e.checked=ul(t,o.props.value)>-1:Yo(t)?e.checked=t.has(o.props.value):t!==n&&(e.checked=vo(t,t1(e,!0)))}const H3={created(e,{value:t},n){e.checked=vo(t,n.props.value),e[Rt]=Gn(n),vn(e,"change",()=>{e[Rt](Go(e))})},beforeUpdate(e,{value:t,oldValue:n},o){e[Rt]=Gn(o),t!==n&&(e.checked=vo(t,o.props.value))}},q3={deep:!0,created(e,{value:t,modifiers:{number:n}},o){const s=Yo(t);vn(e,"change",()=>{const a=Array.prototype.filter.call(e.options,r=>r.selected).map(r=>n?za(Go(r)):Go(r));e[Rt](e.multiple?s?new Set(a):a:a[0]),e._assigning=!0,ut(()=>{e._assigning=!1})}),e[Rt]=Gn(o)},mounted(e,{value:t,modifiers:{number:n}}){tu(e,t)},beforeUpdate(e,t,n){e[Rt]=Gn(n)},updated(e,{value:t,modifiers:{number:n}}){e._assigning||tu(e,t)}};function tu(e,t,n){const o=e.multiple,s=Z(t);if(!(o&&!s&&!Yo(t))){for(let a=0,r=e.options.length;aString(d)===String(l)):i.selected=ul(t,l)>-1}else i.selected=t.has(l);else if(vo(Go(i),t)){e.selectedIndex!==a&&(e.selectedIndex=a);return}}!o&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function Go(e){return"_value"in e?e._value:e.value}function t1(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const O_={created(e,t,n){wa(e,t,n,null,"created")},mounted(e,t,n){wa(e,t,n,null,"mounted")},beforeUpdate(e,t,n,o){wa(e,t,n,o,"beforeUpdate")},updated(e,t,n,o){wa(e,t,n,o,"updated")}};function U3(e,t){switch(e){case"SELECT":return q3;case"TEXTAREA":return Zc;default:switch(t){case"checkbox":return z3;case"radio":return H3;default:return Zc}}}function wa(e,t,n,o,s){const r=U3(e.tagName,n.props&&n.props.type)[s];r&&r(e,t,n,o)}const W3=["ctrl","shift","alt","meta"],G3={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>W3.some(n=>e[`${n}Key`]&&!t.includes(n))},T_=(e,t)=>{const n=e._withMods||(e._withMods={}),o=t.join(".");return n[o]||(n[o]=(s,...a)=>{for(let r=0;r{const n=e._withKeys||(e._withKeys={}),o=t.join(".");return n[o]||(n[o]=s=>{if(!("key"in s))return;const a=Jn(s.key);if(t.some(r=>r===a||K3[r]===a))return e(s)})},J3=je({patchProp:R3},h3);let qr,nu=!1;function Y3(){return qr=nu?qr:Jh(J3),nu=!0,qr}const Q3=(...e)=>{const t=Y3().createApp(...e),{mount:n}=t;return t.mount=o=>{const s=Z3(o);if(s)return n(s,!0,X3(s))},t};function X3(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Z3(e){return Ne(e)?document.querySelector(e):e}var Zs=e=>/^[a-z][a-z0-9+.-]*:/.test(e)||e.startsWith("//"),em=/.md((\?|#).*)?$/,xl=(e,t="/")=>Zs(e)||e.startsWith("/")&&!e.startsWith(t)&&!em.test(e),Xn=e=>/^(https?:)?\/\//.test(e),ou=e=>{if(!e||e.endsWith("/"))return e;let t=e.replace(/(^|\/)README.md$/i,"$1index.html");return t.endsWith(".md")?t=t.substring(0,t.length-3)+".html":t.endsWith(".html")||(t=t+".html"),t.endsWith("/index.html")&&(t=t.substring(0,t.length-10)),t},tm="http://.",nm=(e,t)=>{if(!e.startsWith("/")&&t){const n=t.slice(0,t.lastIndexOf("/"));return ou(new URL(`${n}/${e}`,tm).pathname)}return ou(e)},om=(e,t)=>{const n=Object.keys(e).sort((o,s)=>{const a=s.split("/").length-o.split("/").length;return a!==0?a:s.length-o.length});for(const o of n)if(t.startsWith(o))return o;return"/"},su=(e,t="/")=>{const n=e.replace(/^(?:https?:)?\/\/[^/]*/,"");return n.startsWith(t)?`/${n.slice(t.length)}`:n},sm=/(#|\?)/,n1=e=>{const[t,...n]=e.split(sm);return{pathname:t,hashAndQueries:n.join("")}},am=["link","meta","script","style","noscript","template"],rm=["title","base"],im=([e,t,n])=>rm.includes(e)?e:am.includes(e)?e==="meta"&&t.name?`${e}.${t.name}`:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,Object.entries(t).map(([o,s])=>typeof s=="boolean"?s?[o,""]:null:[o,s]).filter(o=>o!=null).sort(([o],[s])=>o.localeCompare(s)),n]):null,lm=e=>{const t=new Set,n=[];return e.forEach(o=>{const s=im(o);s&&!t.has(s)&&(t.add(s),n.push(o))}),n},cm=e=>e[0]==="/"?e:`/${e}`,o1=e=>e[e.length-1]==="/"||e.endsWith(".html")?e:`${e}/`,gr=e=>e[e.length-1]==="/"?e.slice(0,-1):e,Ol=e=>e[0]==="/"?e.slice(1):e,um=e=>typeof e=="function",sn=e=>Object.prototype.toString.call(e)==="[object Object]",Le=e=>typeof e=="string";const dm="modulepreload",pm=function(e){return"/"+e},au={},k=function(t,n,o){let s=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const a=document.querySelector("meta[property=csp-nonce]"),r=(a==null?void 0:a.nonce)||(a==null?void 0:a.getAttribute("nonce"));s=Promise.all(n.map(i=>{if(i=pm(i),i in au)return;au[i]=!0;const l=i.endsWith(".css"),u=l?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${i}"]${u}`))return;const d=document.createElement("link");if(d.rel=l?"stylesheet":dm,l||(d.as="script",d.crossOrigin=""),d.href=i,r&&d.setAttribute("nonce",r),document.head.appendChild(d),l)return new Promise((p,f)=>{d.addEventListener("load",p),d.addEventListener("error",()=>f(new Error(`Unable to preload CSS for ${i}`)))})}))}return s.then(()=>t()).catch(a=>{const r=new Event("vite:preloadError",{cancelable:!0});if(r.payload=a,window.dispatchEvent(r),!r.defaultPrevented)throw a})},fm=JSON.parse('{"/posts/Web/Q&A.html":"/posts/Web/Q_A.html","/tutorial/CI:CD/Jenkins.html":"/tutorial/CI_CD/Jenkins.html","/tutorial/CI:CD/":"/tutorial/CI_CD/","/tutorial/CI:CD/vercel-deploy.html":"/tutorial/CI_CD/vercel-deploy.html"}'),hm=Object.fromEntries([["/",{loader:()=>k(()=>import("./index.html-BWtg79U3.js"),[]),meta:{d:167758289e4,e:"「一生短暂,过程很美」 致力于分享自己涉及和了解的内容,包括但不限于编程语言、AI体验、世界探索者、极客知识| Exploration & geek enthusiast,Full-stack Front-end Engineer,UX Designer | 与你一起发现更大的世界。",r:{minutes:.88,words:264},t:"主页",i:"home",y:"h"}}],["/about.html",{loader:()=>k(()=>import("./about.html-CylbYPmv.js"),[]),meta:{d:1678830345e3,l:"2023年3月14日",c:["Blog"],g:["Blog"],e:`
                  +**/const p3="http://www.w3.org/2000/svg",f3="http://www.w3.org/1998/Math/MathML",Vn=typeof document<"u"?document:null,Nc=Vn&&Vn.createElement("template"),h3={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,o)=>{const s=t==="svg"?Vn.createElementNS(p3,e):t==="mathml"?Vn.createElementNS(f3,e):Vn.createElement(e,n?{is:n}:void 0);return e==="select"&&o&&o.multiple!=null&&s.setAttribute("multiple",o.multiple),s},createText:e=>Vn.createTextNode(e),createComment:e=>Vn.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Vn.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,o,s,a){const r=n?n.previousSibling:t.lastChild;if(s&&(s===a||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===a||!(s=s.nextSibling)););else{Nc.innerHTML=o==="svg"?`${e}`:o==="mathml"?`${e}`:e;const i=Nc.content;if(o==="svg"||o==="mathml"){const l=i.firstChild;for(;l.firstChild;)i.appendChild(l.firstChild);i.removeChild(l)}t.insertBefore(i,n)}return[r?r.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},xn="transition",is="animation",Wo=Symbol("_vtc"),bn=(e,{slots:t})=>c(_h,Gp(e),t);bn.displayName="Transition";const Wp={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},m3=bn.props=je({},wp,Wp),oo=(e,t=[])=>{Z(e)?e.forEach(n=>n(...t)):e&&e(...t)},Vc=e=>e?Z(e)?e.some(t=>t.length>1):e.length>1:!1;function Gp(e){const t={};for(const N in e)N in Wp||(t[N]=e[N]);if(e.css===!1)return t;const{name:n="v",type:o,duration:s,enterFromClass:a=`${n}-enter-from`,enterActiveClass:r=`${n}-enter-active`,enterToClass:i=`${n}-enter-to`,appearFromClass:l=a,appearActiveClass:u=r,appearToClass:d=i,leaveFromClass:p=`${n}-leave-from`,leaveActiveClass:f=`${n}-leave-active`,leaveToClass:h=`${n}-leave-to`}=e,m=v3(s),g=m&&m[0],E=m&&m[1],{onBeforeEnter:_,onEnter:B,onEnterCancelled:y,onLeave:C,onLeaveCancelled:M,onBeforeAppear:R=_,onAppear:I=B,onAppearCancelled:P=y}=t,K=(N,se,Me)=>{Rn(N,se?d:i),Rn(N,se?u:r),Me&&Me()},F=(N,se)=>{N._isLeaving=!1,Rn(N,p),Rn(N,h),Rn(N,f),se&&se()},G=N=>(se,Me)=>{const De=N?I:B,J=()=>K(se,N,Me);oo(De,[se,J]),jc(()=>{Rn(se,N?l:a),pn(se,N?d:i),Vc(De)||zc(se,o,g,J)})};return je(t,{onBeforeEnter(N){oo(_,[N]),pn(N,a),pn(N,r)},onBeforeAppear(N){oo(R,[N]),pn(N,l),pn(N,u)},onEnter:G(!1),onAppear:G(!0),onLeave(N,se){N._isLeaving=!0;const Me=()=>F(N,se);pn(N,p),pn(N,f),Jp(),jc(()=>{N._isLeaving&&(Rn(N,p),pn(N,h),Vc(C)||zc(N,o,E,Me))}),oo(C,[N,Me])},onEnterCancelled(N){K(N,!1),oo(y,[N])},onAppearCancelled(N){K(N,!0),oo(P,[N])},onLeaveCancelled(N){F(N),oo(M,[N])}})}function v3(e){if(e==null)return null;if(Oe(e))return[jr(e.enter),jr(e.leave)];{const t=jr(e);return[t,t]}}function jr(e){return v2(e)}function pn(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Wo]||(e[Wo]=new Set)).add(t)}function Rn(e,t){t.split(/\s+/).forEach(o=>o&&e.classList.remove(o));const n=e[Wo];n&&(n.delete(t),n.size||(e[Wo]=void 0))}function jc(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let g3=0;function zc(e,t,n,o){const s=e._endId=++g3,a=()=>{s===e._endId&&o()};if(n)return setTimeout(a,n);const{type:r,timeout:i,propCount:l}=Kp(e,t);if(!r)return o();const u=r+"end";let d=0;const p=()=>{e.removeEventListener(u,f),a()},f=h=>{h.target===e&&++d>=l&&p()};setTimeout(()=>{d(n[m]||"").split(", "),s=o(`${xn}Delay`),a=o(`${xn}Duration`),r=Hc(s,a),i=o(`${is}Delay`),l=o(`${is}Duration`),u=Hc(i,l);let d=null,p=0,f=0;t===xn?r>0&&(d=xn,p=r,f=a.length):t===is?u>0&&(d=is,p=u,f=l.length):(p=Math.max(r,u),d=p>0?r>u?xn:is:null,f=d?d===xn?a.length:l.length:0);const h=d===xn&&/\b(transform|all)(,|$)/.test(o(`${xn}Property`).toString());return{type:d,timeout:p,propCount:f,hasTransform:h}}function Hc(e,t){for(;e.lengthqc(n)+qc(e[o])))}function qc(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Jp(){return document.body.offsetHeight}function y3(e,t,n){const o=e[Wo];o&&(t=(t?[t,...o]:[...o]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Qa=Symbol("_vod"),Yp=Symbol("_vsh"),b3={beforeMount(e,{value:t},{transition:n}){e[Qa]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):ls(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:o}){!t!=!n&&(o?t?(o.beforeEnter(e),ls(e,!0),o.enter(e)):o.leave(e,()=>{ls(e,!1)}):ls(e,t))},beforeUnmount(e,{value:t}){ls(e,t)}};function ls(e,t){e.style.display=t?e[Qa]:"none",e[Yp]=!t}const Qp=Symbol("");function _3(e){const t=ko();if(!t)return;const n=t.ut=(s=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach(a=>Ci(a,s))},o=()=>{const s=e(t.proxy);Ai(t.subTree,s),n(s)};ne(()=>{mh(o);const s=new MutationObserver(o);s.observe(t.subTree.el.parentNode,{childList:!0}),wn(()=>s.disconnect())})}function Ai(e,t){if(e.shapeFlag&128){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push(()=>{Ai(n.activeBranch,t)})}for(;e.component;)e=e.component.subTree;if(e.shapeFlag&1&&e.el)Ci(e.el,t);else if(e.type===$e)e.children.forEach(n=>Ai(n,t));else if(e.type===Vo){let{el:n,anchor:o}=e;for(;n&&(Ci(n,t),n!==o);)n=n.nextSibling}}function Ci(e,t){if(e.nodeType===1){const n=e.style;let o="";for(const s in t)n.setProperty(`--${s}`,t[s]),o+=`--${s}: ${t[s]};`;n[Qp]=o}}const k3=/(^|;)\s*display\s*:/;function w3(e,t,n){const o=e.style,s=Ne(n);let a=!1;if(n&&!s){if(t)if(Ne(t))for(const r of t.split(";")){const i=r.slice(0,r.indexOf(":")).trim();n[i]==null&&Fa(o,i,"")}else for(const r in t)n[r]==null&&Fa(o,r,"");for(const r in n)r==="display"&&(a=!0),Fa(o,r,n[r])}else if(s){if(t!==n){const r=o[Qp];r&&(n+=";"+r),o.cssText=n,a=k3.test(n)}}else t&&e.removeAttribute("style");Qa in e&&(e[Qa]=a?o.display:"",e[Yp]&&(o.display="none"))}const Uc=/\s*!important$/;function Fa(e,t,n){if(Z(n))n.forEach(o=>Fa(e,t,o));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const o=E3(e,t);Uc.test(n)?e.setProperty(Jn(o),n.replace(Uc,""),"important"):e[o]=n}}const Wc=["Webkit","Moz","ms"],zr={};function E3(e,t){const n=zr[t];if(n)return n;let o=Bt(t);if(o!=="filter"&&o in e)return zr[t]=o;o=Us(o);for(let s=0;sHr||(O3.then(()=>Hr=0),Hr=Date.now());function L3(e,t){const n=o=>{if(!o._vts)o._vts=Date.now();else if(o._vts<=n.attached)return;Lt(I3(o,n.value),t,5,[o])};return n.value=e,n.attached=T3(),n}function I3(e,t){if(Z(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(o=>s=>!s._stopped&&o&&o(s))}else return t}const Yc=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,R3=(e,t,n,o,s,a,r,i,l)=>{const u=s==="svg";t==="class"?y3(e,o,u):t==="style"?w3(e,n,o):Hs(t)?il(t)||S3(e,t,n,o,r):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):P3(e,t,o,u))?A3(e,t,o,a,r,i,l):(t==="true-value"?e._trueValue=o:t==="false-value"&&(e._falseValue=o),B3(e,t,o,u))};function P3(e,t,n,o){if(o)return!!(t==="innerHTML"||t==="textContent"||t in e&&Yc(t)&&ie(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const s=e.tagName;if(s==="IMG"||s==="VIDEO"||s==="CANVAS"||s==="SOURCE")return!1}return Yc(t)&&Ne(n)?!1:t in e}const Xp=new WeakMap,Zp=new WeakMap,Xa=Symbol("_moveCb"),Qc=Symbol("_enterCb"),e1={name:"TransitionGroup",props:je({},m3,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=ko(),o=kp();let s,a;return Cp(()=>{if(!s.length)return;const r=e.moveClass||`${e.name||"v"}-move`;if(!V3(s[0].el,n.vnode.el,r))return;s.forEach(M3),s.forEach($3);const i=s.filter(N3);Jp(),i.forEach(l=>{const u=l.el,d=u.style;pn(u,r),d.transform=d.webkitTransform=d.transitionDuration="";const p=u[Xa]=f=>{f&&f.target!==u||(!f||/transform$/.test(f.propertyName))&&(u.removeEventListener("transitionend",p),u[Xa]=null,Rn(u,r))};u.addEventListener("transitionend",p)})}),()=>{const r=_e(e),i=Gp(r);let l=r.tag||$e;if(s=[],a)for(let u=0;udelete e.mode;e1.props;const F3=e1;function M3(e){const t=e.el;t[Xa]&&t[Xa](),t[Qc]&&t[Qc]()}function $3(e){Zp.set(e,e.el.getBoundingClientRect())}function N3(e){const t=Xp.get(e),n=Zp.get(e),o=t.left-n.left,s=t.top-n.top;if(o||s){const a=e.el.style;return a.transform=a.webkitTransform=`translate(${o}px,${s}px)`,a.transitionDuration="0s",e}}function V3(e,t,n){const o=e.cloneNode(),s=e[Wo];s&&s.forEach(i=>{i.split(/\s+/).forEach(l=>l&&o.classList.remove(l))}),n.split(/\s+/).forEach(i=>i&&o.classList.add(i)),o.style.display="none";const a=t.nodeType===1?t:t.parentNode;a.appendChild(o);const{hasTransform:r}=Kp(o);return a.removeChild(o),r}const Gn=e=>{const t=e.props["onUpdate:modelValue"]||!1;return Z(t)?n=>Pa(t,n):t};function j3(e){e.target.composing=!0}function Xc(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Rt=Symbol("_assign"),Zc={created(e,{modifiers:{lazy:t,trim:n,number:o}},s){e[Rt]=Gn(s);const a=o||s.props&&s.props.type==="number";vn(e,t?"change":"input",r=>{if(r.target.composing)return;let i=e.value;n&&(i=i.trim()),a&&(i=za(i)),e[Rt](i)}),n&&vn(e,"change",()=>{e.value=e.value.trim()}),t||(vn(e,"compositionstart",j3),vn(e,"compositionend",Xc),vn(e,"change",Xc))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:o,number:s}},a){if(e[Rt]=Gn(a),e.composing)return;const r=(s||e.type==="number")&&!/^0\d/.test(e.value)?za(e.value):e.value,i=t??"";r!==i&&(document.activeElement===e&&e.type!=="range"&&(n||o&&e.value.trim()===i)||(e.value=i))}},z3={deep:!0,created(e,t,n){e[Rt]=Gn(n),vn(e,"change",()=>{const o=e._modelValue,s=Go(e),a=e.checked,r=e[Rt];if(Z(o)){const i=ul(o,s),l=i!==-1;if(a&&!l)r(o.concat(s));else if(!a&&l){const u=[...o];u.splice(i,1),r(u)}}else if(Yo(o)){const i=new Set(o);a?i.add(s):i.delete(s),r(i)}else r(t1(e,a))})},mounted:eu,beforeUpdate(e,t,n){e[Rt]=Gn(n),eu(e,t,n)}};function eu(e,{value:t,oldValue:n},o){e._modelValue=t,Z(t)?e.checked=ul(t,o.props.value)>-1:Yo(t)?e.checked=t.has(o.props.value):t!==n&&(e.checked=vo(t,t1(e,!0)))}const H3={created(e,{value:t},n){e.checked=vo(t,n.props.value),e[Rt]=Gn(n),vn(e,"change",()=>{e[Rt](Go(e))})},beforeUpdate(e,{value:t,oldValue:n},o){e[Rt]=Gn(o),t!==n&&(e.checked=vo(t,o.props.value))}},q3={deep:!0,created(e,{value:t,modifiers:{number:n}},o){const s=Yo(t);vn(e,"change",()=>{const a=Array.prototype.filter.call(e.options,r=>r.selected).map(r=>n?za(Go(r)):Go(r));e[Rt](e.multiple?s?new Set(a):a:a[0]),e._assigning=!0,ut(()=>{e._assigning=!1})}),e[Rt]=Gn(o)},mounted(e,{value:t,modifiers:{number:n}}){tu(e,t)},beforeUpdate(e,t,n){e[Rt]=Gn(n)},updated(e,{value:t,modifiers:{number:n}}){e._assigning||tu(e,t)}};function tu(e,t,n){const o=e.multiple,s=Z(t);if(!(o&&!s&&!Yo(t))){for(let a=0,r=e.options.length;aString(d)===String(l)):i.selected=ul(t,l)>-1}else i.selected=t.has(l);else if(vo(Go(i),t)){e.selectedIndex!==a&&(e.selectedIndex=a);return}}!o&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function Go(e){return"_value"in e?e._value:e.value}function t1(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const O_={created(e,t,n){wa(e,t,n,null,"created")},mounted(e,t,n){wa(e,t,n,null,"mounted")},beforeUpdate(e,t,n,o){wa(e,t,n,o,"beforeUpdate")},updated(e,t,n,o){wa(e,t,n,o,"updated")}};function U3(e,t){switch(e){case"SELECT":return q3;case"TEXTAREA":return Zc;default:switch(t){case"checkbox":return z3;case"radio":return H3;default:return Zc}}}function wa(e,t,n,o,s){const r=U3(e.tagName,n.props&&n.props.type)[s];r&&r(e,t,n,o)}const W3=["ctrl","shift","alt","meta"],G3={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>W3.some(n=>e[`${n}Key`]&&!t.includes(n))},T_=(e,t)=>{const n=e._withMods||(e._withMods={}),o=t.join(".");return n[o]||(n[o]=(s,...a)=>{for(let r=0;r{const n=e._withKeys||(e._withKeys={}),o=t.join(".");return n[o]||(n[o]=s=>{if(!("key"in s))return;const a=Jn(s.key);if(t.some(r=>r===a||K3[r]===a))return e(s)})},J3=je({patchProp:R3},h3);let qr,nu=!1;function Y3(){return qr=nu?qr:Jh(J3),nu=!0,qr}const Q3=(...e)=>{const t=Y3().createApp(...e),{mount:n}=t;return t.mount=o=>{const s=Z3(o);if(s)return n(s,!0,X3(s))},t};function X3(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Z3(e){return Ne(e)?document.querySelector(e):e}var Zs=e=>/^[a-z][a-z0-9+.-]*:/.test(e)||e.startsWith("//"),em=/.md((\?|#).*)?$/,xl=(e,t="/")=>Zs(e)||e.startsWith("/")&&!e.startsWith(t)&&!em.test(e),Xn=e=>/^(https?:)?\/\//.test(e),ou=e=>{if(!e||e.endsWith("/"))return e;let t=e.replace(/(^|\/)README.md$/i,"$1index.html");return t.endsWith(".md")?t=t.substring(0,t.length-3)+".html":t.endsWith(".html")||(t=t+".html"),t.endsWith("/index.html")&&(t=t.substring(0,t.length-10)),t},tm="http://.",nm=(e,t)=>{if(!e.startsWith("/")&&t){const n=t.slice(0,t.lastIndexOf("/"));return ou(new URL(`${n}/${e}`,tm).pathname)}return ou(e)},om=(e,t)=>{const n=Object.keys(e).sort((o,s)=>{const a=s.split("/").length-o.split("/").length;return a!==0?a:s.length-o.length});for(const o of n)if(t.startsWith(o))return o;return"/"},su=(e,t="/")=>{const n=e.replace(/^(?:https?:)?\/\/[^/]*/,"");return n.startsWith(t)?`/${n.slice(t.length)}`:n},sm=/(#|\?)/,n1=e=>{const[t,...n]=e.split(sm);return{pathname:t,hashAndQueries:n.join("")}},am=["link","meta","script","style","noscript","template"],rm=["title","base"],im=([e,t,n])=>rm.includes(e)?e:am.includes(e)?e==="meta"&&t.name?`${e}.${t.name}`:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,Object.entries(t).map(([o,s])=>typeof s=="boolean"?s?[o,""]:null:[o,s]).filter(o=>o!=null).sort(([o],[s])=>o.localeCompare(s)),n]):null,lm=e=>{const t=new Set,n=[];return e.forEach(o=>{const s=im(o);s&&!t.has(s)&&(t.add(s),n.push(o))}),n},cm=e=>e[0]==="/"?e:`/${e}`,o1=e=>e[e.length-1]==="/"||e.endsWith(".html")?e:`${e}/`,gr=e=>e[e.length-1]==="/"?e.slice(0,-1):e,Ol=e=>e[0]==="/"?e.slice(1):e,um=e=>typeof e=="function",sn=e=>Object.prototype.toString.call(e)==="[object Object]",Le=e=>typeof e=="string";const dm="modulepreload",pm=function(e){return"/"+e},au={},k=function(t,n,o){let s=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const a=document.querySelector("meta[property=csp-nonce]"),r=(a==null?void 0:a.nonce)||(a==null?void 0:a.getAttribute("nonce"));s=Promise.all(n.map(i=>{if(i=pm(i),i in au)return;au[i]=!0;const l=i.endsWith(".css"),u=l?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${i}"]${u}`))return;const d=document.createElement("link");if(d.rel=l?"stylesheet":dm,l||(d.as="script",d.crossOrigin=""),d.href=i,r&&d.setAttribute("nonce",r),document.head.appendChild(d),l)return new Promise((p,f)=>{d.addEventListener("load",p),d.addEventListener("error",()=>f(new Error(`Unable to preload CSS for ${i}`)))})}))}return s.then(()=>t()).catch(a=>{const r=new Event("vite:preloadError",{cancelable:!0});if(r.payload=a,window.dispatchEvent(r),!r.defaultPrevented)throw a})},fm=JSON.parse('{"/posts/Web/Q&A.html":"/posts/Web/Q_A.html","/tutorial/CI:CD/Jenkins.html":"/tutorial/CI_CD/Jenkins.html","/tutorial/CI:CD/":"/tutorial/CI_CD/","/tutorial/CI:CD/vercel-deploy.html":"/tutorial/CI_CD/vercel-deploy.html"}'),hm=Object.fromEntries([["/",{loader:()=>k(()=>import("./index.html-Bn3VH44R.js"),[]),meta:{d:167758289e4,e:"「一生短暂,过程很美」 致力于分享自己涉及和了解的内容,包括但不限于编程语言、AI体验、世界探索者、极客知识| Exploration & geek enthusiast,Full-stack Front-end Engineer,UX Designer | 与你一起发现更大的世界。",r:{minutes:.88,words:264},t:"主页",i:"home",y:"h"}}],["/about.html",{loader:()=>k(()=>import("./about.html-B7wj1tkV.js"),[]),meta:{d:1678830345e3,l:"2023年3月14日",c:["Blog"],g:["Blog"],e:`
                   

                  ✨📒

                  详细记录一下此次建站过程

                  @@ -23,16 +23,16 @@ var c2=Object.defineProperty;var u2=(e,t,n)=>t in e?c2(e,t,{enumerable:!0,config

                  开始

                  之前的博客是基于jekyll打造的,要添加和定制化的东西都只能基于html+js+css完成,有些麻烦,所以一直有想更换引擎的想法
                  直到偶然间发现vuepress,首先是被vue3+typescript+vite吸引,然后看到默认主题属实有点不合符我的期待,自己动手成本又太高,也没有太急着去折腾,直到无意中发现了
                  -vuepress-theme-hope,漂亮的外观一下子就吸引到我了,然后去官网深入研究了一番,发现二次开发的成本并不高,对于我来说比较友好,基本都是基于选项的配置型,和一小部分的定制开发,也可以基于vue来写,这让我觉得很合适。所以,一步步折腾了起来……

                  `,r:{minutes:3.17,words:952},t:"关于本站",i:"info",y:"a"}}],["/collect.html",{loader:()=>k(()=>import("./collect.html-BWbOwF3F.js"),[]),meta:{d:1695892327e3,e:` -`,r:{minutes:1.43,words:429},t:"收藏",i:"home",y:"h"}}],["/friend.html",{loader:()=>k(()=>import("./friend.html-WsXEmezc.js"),[]),meta:{d:1678429841e3,e:`

                  小伙伴

                  -`,r:{minutes:1.42,words:427},t:"友情链接",i:"link",y:"p"}}],["/intro.html",{loader:()=>k(()=>import("./intro.html-B_EmzxVc.js"),[]),meta:{d:16785792e5,l:"2023年3月12日",c:["About"],g:["About"],e:` +vuepress-theme-hope,漂亮的外观一下子就吸引到我了,然后去官网深入研究了一番,发现二次开发的成本并不高,对于我来说比较友好,基本都是基于选项的配置型,和一小部分的定制开发,也可以基于vue来写,这让我觉得很合适。所以,一步步折腾了起来……

                  `,r:{minutes:3.17,words:952},t:"关于本站",i:"info",y:"a"}}],["/collect.html",{loader:()=>k(()=>import("./collect.html-BE99v2Xy.js"),[]),meta:{d:1695892327e3,e:` +`,r:{minutes:1.43,words:429},t:"收藏",i:"home",y:"h"}}],["/friend.html",{loader:()=>k(()=>import("./friend.html-DNiEk61T.js"),[]),meta:{d:1678429841e3,e:`

                  小伙伴

                  +`,r:{minutes:1.42,words:427},t:"友情链接",i:"link",y:"p"}}],["/intro.html",{loader:()=>k(()=>import("./intro.html-DYiJC5Ah.js"),[]),meta:{d:16785792e5,l:"2023年3月12日",c:["About"],g:["About"],e:`

                  Profile

                  Exploration & geek enthusiast, full-stack front-end engineer, UX Designer | Currently focusing on cross-platform development with main directions in iOS, ReactNative, Flutter, and Vue | Discovering a bigger world together with you.

                  Profile

                  探索 & 极客 爱好者,大前端工程师,用户体验设计师 |目前主要研究方向在跨平台开发上,iOS、ReactNative、Flutter、Vue是主要方向| 期待与你一起发现更大的世界

                  -
                  `,r:{minutes:1.08,words:324},t:"关于我",i:"people",y:"a"}}],["/visitorsbook.html",{loader:()=>k(()=>import("./visitorsbook.html-DZUWqHeS.js"),[]),meta:{d:167758289e4,e:` +
                  `,r:{minutes:1.08,words:324},t:"关于我",i:"people",y:"a"}}],["/visitorsbook.html",{loader:()=>k(()=>import("./visitorsbook.html-yLAGP5iK.js"),[]),meta:{d:167758289e4,e:`

                  博主留言✨📒

                  @@ -41,7 +41,7 @@ var c2=Object.defineProperty;var u2=(e,t,n)=>t in e?c2(e,t,{enumerable:!0,config

                  博客是我用来记录生活、思考和感悟的地方,每一篇文章都是我用心写下的文字,希望能够传递给更多的人,与大家一起分享我的所思所想。
                  或许,你此时正在迷茫,或者你已找到了你想要的答案,又或者你只是想要寻找一个宁静的地方,希望我们可以相互启迪,相互学习,共同成长。

                  🏷 如果你有什么想法、问题或者建议,都可以在这里留言,我会认真阅读每一条留言,尽可能地回复你们的问题和疑虑。同时,我也希望我们能够相互尊重、理解和包容,共同营造一个良好的交流环境。🌤

                  -
                  `,r:{minutes:1.05,words:316},t:"留言板 ✨",i:"mark",y:"p"}}],["/blog/",{loader:()=>k(()=>import("./index.html-DWMuixxd.js"),[]),meta:{d:167758289e4,e:` +
                  `,r:{minutes:1.05,words:316},t:"留言板 ✨",i:"mark",y:"p"}}],["/blog/",{loader:()=>k(()=>import("./index.html-FaaF3ODF.js"),[]),meta:{d:167758289e4,e:`

                  🧩

                  这里会记录一些站点建立及后续更新过程中相关的文章

                  @@ -63,15 +63,15 @@ var c2=Object.defineProperty;var u2=(e,t,n)=>t in e?c2(e,t,{enumerable:!0,config
                • 📌 评论系统从多说迁移到disqus

                • -
                `,r:{minutes:.33,words:99},t:"Blog相关",i:"blog",y:"p"}}],["/blog/auto-push.html",{loader:()=>k(()=>import("./auto-push.html-D17FSYQJ.js"),[]),meta:{d:16816896e5,l:"2023年4月17日",c:["Blog"],g:["Blog","GitHub Action"],v:"https://w.wallhaven.cc/full/l3/wallhaven-l3xk6q.jpg",o:!0,e:`
                +
              `,r:{minutes:.33,words:99},t:"Blog相关",i:"blog",y:"p"}}],["/blog/auto-push.html",{loader:()=>k(()=>import("./auto-push.html-BCAij2ta.js"),[]),meta:{d:16816896e5,l:"2023年4月17日",c:["Blog"],g:["Blog","GitHub Action"],v:"https://w.wallhaven.cc/full/l3/wallhaven-l3xk6q.jpg",o:!0,e:`

              相关信息

              这是一个GitHub Actions的配置文件,整体思路是,获取本次更新的url
              (通过对比两次提交的sitemap.xml文件),所以触发条件是deploy分支有推送并修改了sitemap.xml文件,再利用python脚本进行url推送到百度、Bing、Google

              脚本代码请看这里👉提交URL到搜索引擎(百度、Bing、Google)

              -`,r:{minutes:2.8,words:839},t:"如何利用GitHub Action提交URL到搜索引擎",s:"如何自动提交URL到搜索引擎",i:"yaml",y:"a"}}],["/blog/disqus.html",{loader:()=>k(()=>import("./disqus.html-CxYxPEEs.js"),[]),meta:{d:1492128e6,l:"2017年4月14日",c:["Blog"],g:["Blog"],e:`
              +`,r:{minutes:2.8,words:839},t:"如何利用GitHub Action提交URL到搜索引擎",s:"如何自动提交URL到搜索引擎",i:"yaml",y:"a"}}],["/blog/disqus.html",{loader:()=>k(()=>import("./disqus.html-DTh_LgWs.js"),[]),meta:{d:1492128e6,l:"2017年4月14日",c:["Blog"],g:["Blog"],e:`

              由于多说评论系统将于 6 月 1 日下线,所以准备迁移至disqus,相比较的话对于国内环境还是多说好用一点,毕竟加载快,支持各大媒体的分享,也不用小伙伴们翻墙;而 disqus 分享也只支持 Facebook 和 twitter。。PS:貌似现在又被墙了,以后有时间再换吧,目前就先这样,国内据说畅言还不错

              -
              `,r:{minutes:.88,words:263},t:"评论系统从多说迁移到disqus指南",s:"多说迁移到disqus指南",i:"expansion",y:"a"}}],["/blog/jekyll.html",{loader:()=>k(()=>import("./jekyll.html-BrwHzJtx.js"),[]),meta:{d:14781744e5,l:"2016年11月3日",c:["Blog"],g:["Blog"],e:`
              +
              `,r:{minutes:.88,words:263},t:"评论系统从多说迁移到disqus指南",s:"多说迁移到disqus指南",i:"expansion",y:"a"}}],["/blog/jekyll.html",{loader:()=>k(()=>import("./jekyll.html-oBu6pMca.js"),[]),meta:{d:14781744e5,l:"2016年11月3日",c:["Blog"],g:["Blog"],e:`

              “Yeah It's on. ”

              前言

              @@ -79,7 +79,7 @@ var c2=Object.defineProperty;var u2=(e,t,n)=>t in e?c2(e,t,{enumerable:!0,config

              跳过废话,直接看技术实现

              2016 年,11 月 总算有个地方可以好好写点东西了。

              作为一个程序员, 看多了别人的 Blog 这种轮子都是酷炫的不要不要的,自己其实一种想搞一个,前两天发现了 GitHub Pages +Jekyll 的技术方案,一下子就上瘾了。

              -

              终于可以有自己的自留地了,之前一直在简书上写一些技术类的文章,这次可以有个自己的地盘,想怎么写就怎么写。😝 哈哈。不过这些前端的东西对我也是一种挑战,似懂非懂的看着模板,和一堆 js+css+html 的代码。。一顿头大。。对照着效果,一步步自己改。改好了之后也是蛮有成就感的嘛

              `,r:{minutes:2.88,words:865},t:"Jekyll旧站回忆",i:"read",y:"a"}}],["/blog/waline-mail.html",{loader:()=>k(()=>import("./waline-mail.html-TsZNzr0d.js"),[]),meta:{d:1680048e6,l:"2023年3月29日",c:["Blog"],g:["Blog"],e:` +

              终于可以有自己的自留地了,之前一直在简书上写一些技术类的文章,这次可以有个自己的地盘,想怎么写就怎么写。😝 哈哈。不过这些前端的东西对我也是一种挑战,似懂非懂的看着模板,和一堆 js+css+html 的代码。。一顿头大。。对照着效果,一步步自己改。改好了之后也是蛮有成就感的嘛

              `,r:{minutes:2.88,words:865},t:"Jekyll旧站回忆",i:"read",y:"a"}}],["/blog/waline-mail.html",{loader:()=>k(()=>import("./waline-mail.html-L4cGC2sp.js"),[]),meta:{d:1680048e6,l:"2023年3月29日",c:["Blog"],g:["Blog"],e:`

              陆续优化中……这次到了评论的邮件通知,由于 waline 带后端,可以开启评论通知,我是部署在 Vercel 上的,配置一下就可以了,模版要感谢小波同学

              @@ -87,7 +87,7 @@ var c2=Object.defineProperty;var u2=(e,t,n)=>t in e?c2(e,t,{enumerable:!0,config

              1.邮件要注意每日发信限制,短时密集评论会导致直接被封,禁止发信

              2.最好不要使用自己平常使用的邮箱,使用一个单独的邮箱来操作

              3.有服务器的同学,自己部署SMTP服务可以不受限制

              -
              `,r:{minutes:10.09,words:3027},t:"评论插件 Waline 之邮件通知配置",s:"Waline 之邮件通知配置",i:"waline",y:"a"}}],["/demo/",{loader:()=>k(()=>import("./index.html-BfBhj_lQ.js"),[]),meta:{d:167758289e4,c:["使用指南"],e:`

              目录

              +
              `,r:{minutes:10.09,words:3027},t:"评论插件 Waline 之邮件通知配置",s:"Waline 之邮件通知配置",i:"waline",y:"a"}}],["/demo/",{loader:()=>k(()=>import("./index.html-drfter__.js"),[]),meta:{d:167758289e4,c:["使用指南"],e:`

              目录

              `,r:{minutes:.14,words:42},t:"主要功能与配置演示",i:"discover",y:"p"}}],["/demo/disable.html",{loader:()=>k(()=>import("./disable.html-CM4jRKGE.js"),[]),meta:{d:167758289e4,c:["使用指南"],g:["禁用"],e:`

              你可以通过设置页面的 Frontmatter,在页面禁用功能与布局。

              -`,r:{minutes:.44,words:132},t:"布局与功能禁用",i:"config",O:3,I:!1,y:"p"}}],["/demo/encrypt.html",{loader:()=>k(()=>import("./encrypt.html-UwwuLb7K.js"),[]),meta:{d:167758289e4,c:["使用指南"],g:["文章加密"],n:!0,r:{minutes:.53,words:160},t:"密码加密的文章",i:"lock",I:!1,y:"p"}}],["/demo/markdown.html",{loader:()=>k(()=>import("./markdown.html-CJqnZoQf.js"),[]),meta:{d:16760736e5,l:"2023年2月11日",c:["使用指南"],g:["Markdown"],e:`

              VuePress 主要从 Markdown 文件生成页面。因此,你可以使用它轻松生成文档或博客站点。

              +
            `,r:{minutes:.14,words:42},t:"主要功能与配置演示",i:"discover",y:"p"}}],["/demo/disable.html",{loader:()=>k(()=>import("./disable.html-Cxm9wNnA.js"),[]),meta:{d:167758289e4,c:["使用指南"],g:["禁用"],e:`

            你可以通过设置页面的 Frontmatter,在页面禁用功能与布局。

            +`,r:{minutes:.44,words:132},t:"布局与功能禁用",i:"config",O:3,I:!1,y:"p"}}],["/demo/encrypt.html",{loader:()=>k(()=>import("./encrypt.html-KVwIyvJ0.js"),[]),meta:{d:167758289e4,c:["使用指南"],g:["文章加密"],n:!0,r:{minutes:.53,words:160},t:"密码加密的文章",i:"lock",I:!1,y:"p"}}],["/demo/markdown.html",{loader:()=>k(()=>import("./markdown.html-DR_C06GL.js"),[]),meta:{d:16760736e5,l:"2023年2月11日",c:["使用指南"],g:["Markdown"],e:`

            VuePress 主要从 Markdown 文件生成页面。因此,你可以使用它轻松生成文档或博客站点。

            你应该创建和编写 Markdown 文件,以便 VuePress 可以根据文件结构将它们转换为不同的页面。

            -`,r:{minutes:3.32,words:996},t:"Markdown 展示",i:"markdown",O:2,y:"a"}}],["/demo/page.html",{loader:()=>k(()=>import("./page.html-DDz2CsQk.js"),[]),meta:{a:"Ms.Hope",d:15778368e5,l:"2020年1月1日",c:["使用指南"],g:["页面配置","使用指南"],u:!1,e:`

            more 注释之前的内容被视为文章摘要。

            -`,r:{minutes:1.47,words:442},t:"页面配置",i:"page",O:1,I:!1,y:"p"}}],["/demo/slides.html",{loader:()=>k(()=>import("./slides.html-DijKium8.js"),[]),meta:{d:15778368e5,l:"2020年1月1日",e:` -`,r:{minutes:4.52,words:1356},t:"幻灯片页",i:"slides",I:!1,y:"s"}}],["/news/1.html",{loader:()=>k(()=>import("./1.html-DxIDPIch.js"),[]),meta:{d:1685664e6,l:"2023年6月2日",e:`

            我宣布,经过两天的自定义后

            +`,r:{minutes:3.32,words:996},t:"Markdown 展示",i:"markdown",O:2,y:"a"}}],["/demo/page.html",{loader:()=>k(()=>import("./page.html-Coii23ah.js"),[]),meta:{a:"Ms.Hope",d:15778368e5,l:"2020年1月1日",c:["使用指南"],g:["页面配置","使用指南"],u:!1,e:`

            more 注释之前的内容被视为文章摘要。

            +`,r:{minutes:1.47,words:442},t:"页面配置",i:"page",O:1,I:!1,y:"p"}}],["/demo/slides.html",{loader:()=>k(()=>import("./slides.html-DaS4jjEe.js"),[]),meta:{d:15778368e5,l:"2020年1月1日",e:` +`,r:{minutes:4.52,words:1356},t:"幻灯片页",i:"slides",I:!1,y:"s"}}],["/news/1.html",{loader:()=>k(()=>import("./1.html-CCqqooZ8.js"),[]),meta:{d:1685664e6,l:"2023年6月2日",e:`

            我宣布,经过两天的自定义后

            🎉说说开始营业了哈哈!!!散花🎉

            -`,r:{minutes:.15,words:45},t:"从这里开始",i:"support",y:"p"}}],["/news/2.html",{loader:()=>k(()=>import("./2.html-BjF3APTC.js"),[]),meta:{d:16859232e5,l:"2023年6月5日",e:`

            同样的六月

            +`,r:{minutes:.15,words:45},t:"从这里开始",i:"support",y:"p"}}],["/news/2.html",{loader:()=>k(()=>import("./2.html-zscj9y5a.js"),[]),meta:{d:16859232e5,l:"2023年6月5日",e:`

            同样的六月

            加油吧💪🏻

            -`,r:{minutes:.18,words:55},t:"六月",i:"support",y:"p"}}],["/news/3.html",{loader:()=>k(()=>import("./3.html-DWdPtRSF.js"),[]),meta:{d:16859232e5,l:"2023年6月5日",e:`

            “世间多是方展博,人间难寻小犹太”

            -`,r:{minutes:.12,words:35},t:"六月",i:"support",y:"p"}}],["/news/4.html",{loader:()=>k(()=>import("./4.html-CN6JWxUH.js"),[]),meta:{d:16956e8,l:"2023年9月25日",e:`

            一转眼就快十月了,工作比较忙,有点顾不上更新了哈哈

            +`,r:{minutes:.18,words:55},t:"六月",i:"support",y:"p"}}],["/news/3.html",{loader:()=>k(()=>import("./3.html-BxzPupJn.js"),[]),meta:{d:16859232e5,l:"2023年6月5日",e:`

            “世间多是方展博,人间难寻小犹太”

            +`,r:{minutes:.12,words:35},t:"六月",i:"support",y:"p"}}],["/news/4.html",{loader:()=>k(()=>import("./4.html-CcZjx0ar.js"),[]),meta:{d:16956e8,l:"2023年9月25日",e:`

            一转眼就快十月了,工作比较忙,有点顾不上更新了哈哈

            想加一个音乐播放插件,但是没时间(〒︿〒))

            希望接下来一切都好吧,加油!!🎉🎉🎉

            -`,r:{minutes:.23,words:70},t:"九月",i:"support",y:"p"}}],["/news/5.html",{loader:()=>k(()=>import("./5.html-BjDVrj8X.js"),[]),meta:{d:16969824e5,l:"2023年10月11日",e:`

            嘿~

            -`,r:{minutes:.22,words:65},t:"十月",i:"support",y:"p"}}],["/news/",{loader:()=>k(()=>import("./index.html-Dzbu9gXH.js"),[]),meta:{t:"说说",y:"p"}}],["/private/%E4%B8%80%E4%BA%BA%E4%B8%80%E5%8F%A5%E5%AE%8B%E8%AF%8D.html",{loader:()=>k(()=>import("./一人一句宋词.html-D0kxJiVA.js"),[]),meta:{d:14845248e5,l:"2017年1月16日",g:["生活"],e:`
            Bing 每日壁纸
            Bing 每日壁纸
            +`,r:{minutes:.23,words:70},t:"九月",i:"support",y:"p"}}],["/news/5.html",{loader:()=>k(()=>import("./5.html-DlPnxJmp.js"),[]),meta:{d:16969824e5,l:"2023年10月11日",e:`

            嘿~

            +`,r:{minutes:.22,words:65},t:"十月",i:"support",y:"p"}}],["/news/",{loader:()=>k(()=>import("./index.html-B1u2MO_4.js"),[]),meta:{t:"说说",y:"p"}}],["/private/%E4%B8%80%E4%BA%BA%E4%B8%80%E5%8F%A5%E5%AE%8B%E8%AF%8D.html",{loader:()=>k(()=>import("./一人一句宋词.html-DyP3mEz9.js"),[]),meta:{d:14845248e5,l:"2017年1月16日",g:["生活"],e:`
            Bing 每日壁纸
            Bing 每日壁纸

            写来留待日后慢慢欣赏 😜

            @@ -128,39 +128,39 @@ var c2=Object.defineProperty;var u2=(e,t,n)=>t in e?c2(e,t,{enumerable:!0,config 满城春色宫墙柳。

            李清照

            此情无计可消除,
            -才下眉头,却上心头。

            `,r:{minutes:1.8,words:541},t:"一人一句宋词",i:"alias",y:"a"}}],["/site/",{loader:()=>k(()=>import("./index.html-D1Qr__AN.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`
            +才下眉头,却上心头。

            `,r:{minutes:1.8,words:541},t:"一人一句宋词",i:"alias",y:"a"}}],["/site/",{loader:()=>k(()=>import("./index.html-D0hxQGVG.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`

            相关信息

            这里放置站点收藏的相关的内容


            -`,r:{minutes:.11,words:34},t:"站点收藏",i:"sitemap",y:"p"}}],["/site/design.html",{loader:()=>k(()=>import("./design.html-B2WuonX6.js"),__vite__mapDeps([0,1])),meta:{d:16811712e5,l:"2023年4月11日",c:["收藏"],g:["工具网站"],e:`
            +`,r:{minutes:.11,words:34},t:"站点收藏",i:"sitemap",y:"p"}}],["/site/design.html",{loader:()=>k(()=>import("./design.html-Ce15CoAF.js"),__vite__mapDeps([0,1])),meta:{d:16811712e5,l:"2023年4月11日",c:["收藏"],g:["工具网站"],e:`

            相关信息

            素材、设计相关好用的网站

            工具类

            -`,r:{minutes:.24,words:71},t:"素材设计",i:"creative",y:"a"}}],["/site/public-api.html",{loader:()=>k(()=>import("./public-api.html-CQ926TNZ.js"),__vite__mapDeps([2,1])),meta:{d:16799616e5,l:"2023年3月28日",c:["收藏"],g:["工具网站"],e:`
            +`,r:{minutes:.24,words:71},t:"素材设计",i:"creative",y:"a"}}],["/site/public-api.html",{loader:()=>k(()=>import("./public-api.html-BuW-P-mb.js"),__vite__mapDeps([2,1])),meta:{d:16799616e5,l:"2023年3月28日",c:["收藏"],g:["工具网站"],e:`

            相关信息

            免费公开的API网站,提供多种公共接口服务

            -`,r:{minutes:.21,words:63},t:"公开API",i:"api",y:"a"}}],["/tutorial/",{loader:()=>k(()=>import("./index.html-BznIiO4q.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`
            +`,r:{minutes:.21,words:63},t:"公开API",i:"api",y:"a"}}],["/tutorial/",{loader:()=>k(()=>import("./index.html-K24jriUp.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`

            相关信息

            这里放置软件/工具教程相关的内容


            -`,r:{minutes:.13,words:39},t:"软件/工具教程",i:"software",y:"p"}}],["/tutorial/idx-dev.html",{loader:()=>k(()=>import("./idx-dev.html-DX7IIvoO.js"),[]),meta:{d:16920576e5,l:"2023年8月15日",c:["AI"],g:["AI"],o:!0,e:` +`,r:{minutes:.13,words:39},t:"软件/工具教程",i:"software",y:"p"}}],["/tutorial/idx-dev.html",{loader:()=>k(()=>import("./idx-dev.html-Cfn3a_uw.js"),[]),meta:{d:16920576e5,l:"2023年8月15日",c:["AI"],g:["AI"],o:!0,e:`

            8 月 8 日,谷歌宣布推出 AI 代码编辑器 Project IDX,这是一个基于浏览器的开发环境:集成 AI、支持全栈编程语言、跨平台真机预览、一键部署,用于构建全栈网络和多平台应用程序。

            一直以来,从 0 开始构建应用,都是一项复杂的工作。尤其是跨越手机、Web 和桌面平台的程序。

            -

            这是一片无尽的复杂海洋,需要把技术堆栈融合在一起,来引导、编译、测试、部署、监控应用程序。

            `,r:{minutes:8.7,words:2610},t:"谷歌发布多平台应用开发神器Project IDX!PaLM 2加持",i:"support",y:"a"}}],["/posts/Linux/",{loader:()=>k(()=>import("./index.html-EB1YKzwO.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`
            +

            这是一片无尽的复杂海洋,需要把技术堆栈融合在一起,来引导、编译、测试、部署、监控应用程序。

            `,r:{minutes:8.7,words:2610},t:"谷歌发布多平台应用开发神器Project IDX!PaLM 2加持",i:"support",y:"a"}}],["/posts/Linux/",{loader:()=>k(()=>import("./index.html-BYZcSDb0.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`

            相关信息

            这里放置 Linux 相关的内容

            -`,r:{minutes:.09,words:27},t:"Linux",i:"linux",y:"p"}}],["/posts/Linux/iterm2-pure.html",{loader:()=>k(()=>import("./iterm2-pure.html-DozIMjEE.js"),[]),meta:{d:1679676037e3,l:"2023年3月24日",c:["Linux"],g:["terminal","Linux"],e:`
            +`,r:{minutes:.09,words:27},t:"Linux",i:"linux",y:"p"}}],["/posts/Linux/iterm2-pure.html",{loader:()=>k(()=>import("./iterm2-pure.html-Btvy90Go.js"),[]),meta:{d:1679676037e3,l:"2023年3月24日",c:["Linux"],g:["terminal","Linux"],e:`

            提示

            之前介绍了ZSH的安装和使用,这次把最终成果介绍一下,就是ZSH + iTerm2 + Pure

            前置工作:安装ZSH,请参照之前的文章👉zsh安装

            -`,r:{minutes:3.58,words:1075},t:"终端究极美化iTerm2+Pure",i:"hk-zsh",y:"a"}}],["/posts/Linux/unix-linux-note.html",{loader:()=>k(()=>import("./unix-linux-note.html-CNYtSovW.js"),[]),meta:{d:14289696e5,l:"2015年4月14日",c:["Linux"],g:["OS","Unix","Linux"],e:`
            +`,r:{minutes:3.58,words:1075},t:"终端究极美化iTerm2+Pure",i:"hk-zsh",y:"a"}}],["/posts/Linux/unix-linux-note.html",{loader:()=>k(()=>import("./unix-linux-note.html-Cce1iKg6.js"),[]),meta:{d:14289696e5,l:"2015年4月14日",c:["Linux"],g:["OS","Unix","Linux"],e:`

            This document is not completed and will be updated anytime.

            Catagory

            @@ -185,7 +185,7 @@ var c2=Object.defineProperty;var u2=(e,t,n)=>t in e?c2(e,t,{enumerable:!0,config
          • Chromium OS
        • -
        `,r:{minutes:7.66,words:2299},t:"Unix/Linux 扫盲笔记",i:"linux",y:"a"}}],["/posts/Linux/zsh.html",{loader:()=>k(()=>import("./zsh.html-DRFV9i80.js"),[]),meta:{d:15639264e5,l:"2019年7月24日",c:["Linux"],g:["terminal","Linux"],e:`
        +
      `,r:{minutes:7.66,words:2299},t:"Unix/Linux 扫盲笔记",i:"linux",y:"a"}}],["/posts/Linux/zsh.html",{loader:()=>k(()=>import("./zsh.html-CNWm-ibd.js"),[]),meta:{d:15639264e5,l:"2019年7月24日",c:["Linux"],g:["terminal","Linux"],e:`

      MacOS 自带的 bash 作为几乎所有 Linux 发行版的默认终端,正常使用时没什么问题的

      这里介绍一个更强大的终端神器

      @@ -195,65 +195,65 @@ var c2=Object.defineProperty;var u2=(e,t,n)=>t in e?c2(e,t,{enumerable:!0,config

      在 unix 内核的操作系统中,当然现在衍生出好多分支,linux ,OS X 都算.

      shell 就算和上面这些系统内核指令打交道的一座桥梁,我们通过键盘输入一种自己容易记忆识别的符号标识(shell 命令)

      然后 shell 解析这种命令再反馈给内核去执行一系列操作.

      -

      zsh 和 shell 有什么关系呢?

      `,r:{minutes:4.54,words:1361},t:"更优雅强大的终端ZSH",i:"hk-zsh",y:"a"}}],["/posts/Python/",{loader:()=>k(()=>import("./index.html-CogDCXnE.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`
      +

      zsh 和 shell 有什么关系呢?

      `,r:{minutes:4.54,words:1361},t:"更优雅强大的终端ZSH",i:"hk-zsh",y:"a"}}],["/posts/Python/",{loader:()=>k(()=>import("./index.html-DSDflc6d.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`

      相关信息

      这里放置 python相关 内容

      -`,r:{minutes:.09,words:26},t:"Python",i:"python",y:"p"}}],["/posts/Python/submit-bing.html",{loader:()=>k(()=>import("./submit-bing.html-YaLGBYLY.js"),[]),meta:{d:1679655147e3,l:"2023年3月24日",c:["python"],g:["工具脚本"],o:!0,e:`
      +`,r:{minutes:.09,words:26},t:"Python",i:"python",y:"p"}}],["/posts/Python/submit-bing.html",{loader:()=>k(()=>import("./submit-bing.html-ClVwd4sI.js"),[]),meta:{d:1679655147e3,l:"2023年3月24日",c:["python"],g:["工具脚本"],o:!0,e:`

      提示

      最近在做SEO,因为链接没有做同步,需要清除之前旧站的链接,重新提交,让搜索引擎尽快索引,google search console的已经基本做差不多了

      bing最近因为 New Bing 的原因也用的比较多,所以做了一些工作,很方便的是,它可以直接同步GSC的站点数据,不过就只是域数据,URL还是要自己提交

      为了尽快索引,只提交sitemap是不够的,还需要调用API手动提交URL

      -
      `,r:{minutes:1.58,words:473},t:"使用Bing API提交网站URL",i:"tool",y:"a"}}],["/posts/Python/submit-url.html",{loader:()=>k(()=>import("./submit-url.html-BnTcyDhQ.js"),[]),meta:{d:16816896e5,l:"2023年4月17日",c:["python"],g:["工具脚本","GitHub Action"],v:"https://files.codelife.cc/wallhaven/full/ex/wallhaven-ex8j2k.jpg?x-oss-process=image/resize,limit_0,m_fill,w_1366,h_768/quality,Q_92/format,webp",o:!0,e:`
      +
      `,r:{minutes:1.58,words:473},t:"使用Bing API提交网站URL",i:"tool",y:"a"}}],["/posts/Python/submit-url.html",{loader:()=>k(()=>import("./submit-url.html-dIMComOE.js"),[]),meta:{d:16816896e5,l:"2023年4月17日",c:["python"],g:["工具脚本","GitHub Action"],v:"https://files.codelife.cc/wallhaven/full/ex/wallhaven-ex8j2k.jpg?x-oss-process=image/resize,limit_0,m_fill,w_1366,h_768/quality,Q_92/format,webp",o:!0,e:`

      相关信息

      这是一个利用GitHub Actions自动触发的工作流进行解析更新的url并推送到搜索引擎的python脚本,除了之前介绍过的bing api之外,还增加了百度和Google的相关内容

      关于GitHub Actions的介绍可以看这里👉GitHub Actions

      关于GitHub Actions的配置可以看这里👉如何利用GitHub Actions推送URL到搜索引擎

      -`,r:{minutes:2.75,words:826},t:"提交URL到搜索引擎(百度、Bing、Google)",s:"提交URL到主流搜索引擎",i:"result",y:"a"}}],["/posts/Rust/",{loader:()=>k(()=>import("./index.html-l6wcShk-.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`
      +`,r:{minutes:2.75,words:826},t:"提交URL到搜索引擎(百度、Bing、Google)",s:"提交URL到主流搜索引擎",i:"result",y:"a"}}],["/posts/Rust/",{loader:()=>k(()=>import("./index.html-BAPb4F0o.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`

      相关信息

      这里放置Rust相关的内容


      -`,r:{minutes:.09,words:27},t:"Rust",i:"rust",y:"p"}}],["/posts/Rust/first-time.html",{loader:()=>k(()=>import("./first-time.html-J91D8aTI.js"),[]),meta:{d:1701969295e3,l:"2023年12月7日",c:["rust"],g:["rust"],e:`

      Rust 发展历程

      +`,r:{minutes:.09,words:27},t:"Rust",i:"rust",y:"p"}}],["/posts/Rust/first-time.html",{loader:()=>k(()=>import("./first-time.html-CZIHTDO4.js"),[]),meta:{d:1701969295e3,l:"2023年12月7日",c:["rust"],g:["rust"],e:`

      Rust 发展历程

      Rust 最早是 Mozilla 雇员 Graydon Hoare 的个人项目。从 2009 年开始,得到了 Mozilla 研究院的资助,2010 年项目对外公布,2010 ~ 2011 年间实现自举。自此以后,Rust 在部分重构 -> 崩溃的边缘反复横跳(历程极其艰辛),终于,在 2015 年 5 月 15 日发布 1.0 版。

      -

      在紧锣密鼓的开发过程中,Rust 建立了一个强大且活跃的社区,形成一整套完善稳定的项目贡献机制(Rust 能够飞速发展,与这一点密不可分)。Rust 现在由 Rust 项目开发者社区 维护, Rust 基金会赞助支持。

      `,r:{minutes:9.02,words:2706},t:"初识Rust",i:"hk-rust",y:"a"}}],["/posts/Web/Q_A.html",{loader:()=>k(()=>import("./Q_A.html-CRGr32ol.js"),[]),meta:{d:16807392e5,l:"2023年4月6日",c:["浏览器"],g:["前端开发"],e:` +

      在紧锣密鼓的开发过程中,Rust 建立了一个强大且活跃的社区,形成一整套完善稳定的项目贡献机制(Rust 能够飞速发展,与这一点密不可分)。Rust 现在由 Rust 项目开发者社区 维护, Rust 基金会赞助支持。

      `,r:{minutes:9.02,words:2706},t:"初识Rust",i:"hk-rust",y:"a"}}],["/posts/Web/Q_A.html",{loader:()=>k(()=>import("./Q_A.html-WwxGbpRP.js"),[]),meta:{d:16807392e5,l:"2023年4月6日",c:["浏览器"],g:["前端开发"],e:`

      浏览器是如何渲染页面的?

      当浏览器的网络线程收到 HTML 文档后,会产生一个渲染任务,并将其传递给渲染主线程的消息队列。

      在事件循环机制的作用下,渲染主线程取出消息队列中的渲染任务,开启渲染流程。

      -`,r:{minutes:6.68,words:2003},t:"前端-Q&A",i:"question",y:"a"}}],["/posts/Web/",{loader:()=>k(()=>import("./index.html-DDekXDOr.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`
      +`,r:{minutes:6.68,words:2003},t:"前端-Q&A",i:"question",y:"a"}}],["/posts/Web/",{loader:()=>k(()=>import("./index.html-MrE5ZY0h.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`

      相关信息

      这里放置前端相关的内容


      -`,r:{minutes:.1,words:31},t:"前端开发",i:"code",y:"p"}}],["/posts/cross-platform/",{loader:()=>k(()=>import("./index.html-GbvzpQYI.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`
      +`,r:{minutes:.1,words:31},t:"前端开发",i:"code",y:"p"}}],["/posts/cross-platform/",{loader:()=>k(()=>import("./index.html-CrnIL_rN.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`

      相关信息

      这里放置 跨平台开发 内容

      -`,r:{minutes:.11,words:32},t:"跨平台开发",i:"relation",y:"p"}}],["/posts/iOS/",{loader:()=>k(()=>import("./index.html-C-WAz17P.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`
      +`,r:{minutes:.11,words:32},t:"跨平台开发",i:"relation",y:"p"}}],["/posts/iOS/",{loader:()=>k(()=>import("./index.html-Bl3xcPHH.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`

      相关信息

      这里放置 iOS 相关的内容

      -`,r:{minutes:.09,words:28},t:"iOS",i:"hk-apple",y:"p"}}],["/tutorial/CI_CD/Jenkins.html",{loader:()=>k(()=>import("./Jenkins.html-CLfOdyvj.js"),[]),meta:{d:17050176e5,l:"2024年1月12日",c:["工具教程"],g:["Jenkins"],o:!0,e:`
      +`,r:{minutes:.09,words:28},t:"iOS",i:"hk-apple",y:"p"}}],["/tutorial/CI_CD/Jenkins.html",{loader:()=>k(()=>import("./Jenkins.html-BzJTFLBX.js"),[]),meta:{d:17050176e5,l:"2024年1月12日",c:["工具教程"],g:["Jenkins"],o:!0,e:`

      提示

      如果想在代码 Push 后,或者 Merge request 后,自动部署,可以采用多种方案,以下介绍两种

      不知道如何配置的同学,可以参考一下

      1. 通过 Jenkins 提供的【触发远程构建】

      1.1. 勾选【触发远程构建】并填入 token

      -
      勾选远程构建开关
      勾选远程构建开关
      `,r:{minutes:3.21,words:963},t:"Jenkins 远程触发构建踩坑记",i:"shell",O:1,y:"a"}}],["/tutorial/CI_CD/",{loader:()=>k(()=>import("./index.html-LgJKHL3q.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`
      +
      勾选远程构建开关
      勾选远程构建开关
      `,r:{minutes:3.21,words:963},t:"Jenkins 远程触发构建踩坑记",i:"shell",O:1,y:"a"}}],["/tutorial/CI_CD/",{loader:()=>k(()=>import("./index.html-BdqUpayl.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`

      相关信息

      这里放置开CI/CD相关的内容


      -`,r:{minutes:.1,words:31},t:"CI/CD",i:"software",O:1,y:"p"}}],["/tutorial/CI_CD/vercel-deploy.html",{loader:()=>k(()=>import("./vercel-deploy.html-CInOvp_q.js"),[]),meta:{d:16802208e5,l:"2023年3月31日",c:["Vercel"],g:["Vercel"],o:!0,e:` +`,r:{minutes:.1,words:31},t:"CI/CD",i:"software",O:1,y:"p"}}],["/tutorial/CI_CD/vercel-deploy.html",{loader:()=>k(()=>import("./vercel-deploy.html-vNu4dHQV.js"),[]),meta:{d:16802208e5,l:"2023年3月31日",c:["Vercel"],g:["Vercel"],o:!0,e:`

      一招教你解决Vercel deploy时总是任意分支都可以触发,如果你的项目有多个分支,可以指定某一个或几个有提交时触发deploy

      -`,r:{minutes:5.23,words:1568},t:"Vercel deploy忽略指定分支",i:"launch",O:2,y:"a"}}],["/tutorial/OSS/",{loader:()=>k(()=>import("./index.html-DVDNh336.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`
      +`,r:{minutes:5.23,words:1568},t:"Vercel deploy忽略指定分支",i:"launch",O:2,y:"a"}}],["/tutorial/OSS/",{loader:()=>k(()=>import("./index.html-9Svhwsfd.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`

      相关信息

      这里放置开源软件相关的内容


      -`,r:{minutes:.12,words:36},t:"开源项目",i:"software",O:1,y:"p"}}],["/tutorial/OSS/meting2.html",{loader:()=>k(()=>import("./meting2.html-DM0Q7FrO.js"),[]),meta:{d:16969824e5,l:"2023年10月11日",c:["开源软件","GitHub"],g:["GitHub"],o:!0,e:`

      前言

      +`,r:{minutes:.12,words:36},t:"开源项目",i:"software",O:1,y:"p"}}],["/tutorial/OSS/meting2.html",{loader:()=>k(()=>import("./meting2.html-C5C7Ch5k.js"),[]),meta:{d:16969824e5,l:"2023年10月11日",c:["开源软件","GitHub"],g:["GitHub"],o:!0,e:`

      前言

      嘿~
      🍰🍰🍰 播放器有了,撒花✿✿ヽ(°▽°)ノ✿🎉🎉🎉

      @@ -262,60 +262,60 @@ var c2=Object.defineProperty;var u2=(e,t,n)=>t in e?c2(e,t,{enumerable:!0,config downloads  downloads  GitHub license -

      `,r:{minutes:1.09,words:328},t:"vuepress-plugin-meting2",i:"plugin",y:"a"}}],["/tutorial/github/",{loader:()=>k(()=>import("./index.html-DYa_xr2h.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`
      +

      `,r:{minutes:1.09,words:328},t:"vuepress-plugin-meting2",i:"plugin",y:"a"}}],["/tutorial/github/",{loader:()=>k(()=>import("./index.html-BrQ_H2Kp.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`

      相关信息

      这里放置GitHub相关的内容


      -`,r:{minutes:.1,words:30},t:"GitHub",i:"github",O:1,y:"p"}}],["/tutorial/github/github-action.html",{loader:()=>k(()=>import("./github-action.html-BSkHjfHR.js"),[]),meta:{d:16814304e5,l:"2023年4月14日",c:["GitHub"],g:["GitHub Actions"],v:"https://files.codelife.cc/wallhaven/full/j3/wallhaven-j3zvvp.jpg?x-oss-process=image/resize,limit_0,m_fill,w_1366,h_768/quality,Q_92/format,webp",e:` +`,r:{minutes:.1,words:30},t:"GitHub",i:"github",O:1,y:"p"}}],["/tutorial/github/github-action.html",{loader:()=>k(()=>import("./github-action.html-BsrS_oau.js"),[]),meta:{d:16814304e5,l:"2023年4月14日",c:["GitHub"],g:["GitHub Actions"],v:"https://files.codelife.cc/wallhaven/full/j3/wallhaven-j3zvvp.jpg?x-oss-process=image/resize,limit_0,m_fill,w_1366,h_768/quality,Q_92/format,webp",e:`

      GitHub Actions 是什么?

      Github Actions 是 Github 官方出的持续集成服务, 挺早之前就推出了。类似的还有如微软的DevOps、GitLab CI、Circle CI、Travis CI等等。大家知道,持续集成由很多操作组成,比如抓取代码、运行测试、登录远程服务器,发布到第三方服务等等。GitHub 把这些操作就称为 actions。

      -

      很多操作在不同项目里面是类似的,完全可以共享。GitHub 注意到了这一点,想出了一个很妙的点子,允许开发者把每个操作写成独立的脚本文件,存放到代码仓库,使得其他开发者可以引用。

      `,r:{minutes:7.59,words:2277},t:"GitHub Actions 使用介绍",i:"actions",y:"a"}}],["/tutorial/github/ssh-key.html",{loader:()=>k(()=>import("./ssh-key.html-Bajri3jD.js"),[]),meta:{d:17049312e5,l:"2024年1月11日",c:["Git"],g:["ssh_key"],e:`

      在 GitLab 中配置 SSH 密钥

      +

      很多操作在不同项目里面是类似的,完全可以共享。GitHub 注意到了这一点,想出了一个很妙的点子,允许开发者把每个操作写成独立的脚本文件,存放到代码仓库,使得其他开发者可以引用。

      `,r:{minutes:7.59,words:2277},t:"GitHub Actions 使用介绍",i:"actions",y:"a"}}],["/tutorial/github/ssh-key.html",{loader:()=>k(()=>import("./ssh-key.html-2OgT0jvM.js"),[]),meta:{d:17049312e5,l:"2024年1月11日",c:["Git"],g:["ssh_key"],e:`

      在 GitLab 中配置 SSH 密钥

      生成 SSH 密钥对

      如果您还没有 SSH 密钥对,请首先生成一对密钥。在终端中执行以下命令:

      ssh-keygen -t rsa -C "your.email@example.com" -b 4096
      -
      `,r:{minutes:1.99,words:598},t:"Git SSH 密钥配置",i:"safe",y:"a"}}],["/posts/Web/Browser/",{loader:()=>k(()=>import("./index.html-BCbm_nto.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`
      +
      `,r:{minutes:1.99,words:598},t:"Git SSH 密钥配置",i:"safe",y:"a"}}],["/posts/Web/Browser/",{loader:()=>k(()=>import("./index.html-D3BkPgiL.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`

      相关信息

      这里放置浏览器相关的内容


      -`,r:{minutes:.11,words:32},t:"Browser",i:"chrome",O:1,y:"p"}}],["/posts/Web/Browser/event-loop.html",{loader:()=>k(()=>import("./event-loop.html-DHHPCnis.js"),[]),meta:{d:16807392e5,l:"2023年4月6日",c:["浏览器"],g:["前端开发"],e:`

      浏览器的进程模型

      +`,r:{minutes:.11,words:32},t:"Browser",i:"chrome",O:1,y:"p"}}],["/posts/Web/Browser/event-loop.html",{loader:()=>k(()=>import("./event-loop.html-DTHJlo6O.js"),[]),meta:{d:16807392e5,l:"2023年4月6日",c:["浏览器"],g:["前端开发"],e:`

      浏览器的进程模型

      何为进程?

      程序运行需要有它自己专属的内存空间,可以把这块内存空间简单的理解为进程

      -`,r:{minutes:8.14,words:2442},t:"浏览器的事件循环",i:"loop",y:"a"}}],["/posts/Web/CSS/",{loader:()=>k(()=>import("./index.html-pGqmqT-A.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`
      +`,r:{minutes:8.14,words:2442},t:"浏览器的事件循环",i:"loop",y:"a"}}],["/posts/Web/CSS/",{loader:()=>k(()=>import("./index.html-BWL8kdnU.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`

      相关信息

      这里放置css相关的内容


      -`,r:{minutes:.1,words:30},t:"CSS",i:"css",O:3,y:"p"}}],["/posts/Web/CSS/calculation.html",{loader:()=>k(()=>import("./calculation.html-CxxpMJ9g.js"),[]),meta:{d:16807392e5,l:"2023年4月6日",c:["CSS"],g:["前端开发"],e:` +`,r:{minutes:.1,words:30},t:"CSS",i:"css",O:3,y:"p"}}],["/posts/Web/CSS/calculation.html",{loader:()=>k(()=>import("./calculation.html-Blvmw2Mb.js"),[]),meta:{d:16807392e5,l:"2023年4月6日",c:["CSS"],g:["前端开发"],e:`

      你是否了解 CSS 的属性计算过程呢?

      有的同学可能会讲,CSS属性我倒是知道,例如:

      p{
         color : red;
       }
      -
      `,r:{minutes:8.69,words:2606},t:"CSS 属性计算过程",i:"calculate",y:"a"}}],["/posts/Web/CSS/containing-block.html",{loader:()=>k(()=>import("./containing-block.html-llWi_HeU.js"),[]),meta:{d:16807392e5,l:"2023年4月6日",c:["CSS"],g:["前端开发"],e:` +
      `,r:{minutes:8.69,words:2606},t:"CSS 属性计算过程",i:"calculate",y:"a"}}],["/posts/Web/CSS/containing-block.html",{loader:()=>k(()=>import("./containing-block.html-z1ree5Sd.js"),[]),meta:{d:16807392e5,l:"2023年4月6日",c:["CSS"],g:["前端开发"],e:`

      一说到 CSS 盒模型,这是很多小伙伴耳熟能详的知识,甚至有的小伙伴还能说出 border-box 和 content-box 这两种盒模型的区别。

      但是一说到 CSS 包含块,有的小伙伴就懵圈了,什么是包含块?好像从来没有听说过这玩意儿。

      image-20220814222004395 -

      好吧,如果你对包含块的知识一无所知,那么系好安全带,咱们准备出发了。

      `,r:{minutes:8.18,words:2453},t:"你不知道的 CSS 之包含块",i:"box",y:"a"}}],["/posts/Web/JavaScript/",{loader:()=>k(()=>import("./index.html-CTs0dYQ6.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`
      +

      好吧,如果你对包含块的知识一无所知,那么系好安全带,咱们准备出发了。

      `,r:{minutes:8.18,words:2453},t:"你不知道的 CSS 之包含块",i:"box",y:"a"}}],["/posts/Web/JavaScript/",{loader:()=>k(()=>import("./index.html-B4nFf9--.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`

      相关信息

      这里放置javascript相关的内容


      -`,r:{minutes:.1,words:30},t:"JavaScript",i:"javascript",O:2,y:"p"}}],["/posts/Web/JavaScript/js-module-loader.html",{loader:()=>k(()=>import("./js-module-loader.html-BUwixnhk.js"),[]),meta:{d:1432512e6,l:"2015年5月25日",c:["JavaScript"],g:["前端开发","JavaScript"],e:`

      Foreword

      +`,r:{minutes:.1,words:30},t:"JavaScript",i:"javascript",O:2,y:"p"}}],["/posts/Web/JavaScript/js-module-loader.html",{loader:()=>k(()=>import("./js-module-loader.html-8Dh5AOoF.js"),[]),meta:{d:1432512e6,l:"2015年5月25日",c:["JavaScript"],g:["前端开发","JavaScript"],e:`

      Foreword

      Here comes Module!

      随着网站逐渐变成「互联网应用程序」,嵌入网页的 JavaScript 代码越来越庞大,越来越复杂。网页越来越像桌面程序,需要一个团队分工协作、进度管理、单元测试……我们不得不使用软件工程的方法,来管理网页的业务逻辑。

      于是,JavaScript 的模块化成为迫切需求。在 ES6 Module 来临之前,JavaScript 社区提供了强大支持,尝试在现有的运行环境下,实现模块的效果。


      -

      Catalog

      `,r:{minutes:7.88,words:2365},t:"CommonJS,RequireJS,SeaJS 归纳笔记",i:"module",y:"a"}}],["/posts/Web/JavaScript/js-version.html",{loader:()=>k(()=>import("./js-version.html--klunadT.js"),[]),meta:{d:144288e7,l:"2015年9月22日",c:["JavaScript"],g:["JavaScript","翻译"],e:`

      JavaScript 有着很奇怪的命名史。

      +

      Catalog

      `,r:{minutes:7.88,words:2365},t:"CommonJS,RequireJS,SeaJS 归纳笔记",i:"module",y:"a"}}],["/posts/Web/JavaScript/js-version.html",{loader:()=>k(()=>import("./js-version.html-DlLo8W_N.js"),[]),meta:{d:144288e7,l:"2015年9月22日",c:["JavaScript"],g:["JavaScript","翻译"],e:`

      JavaScript 有着很奇怪的命名史。

      1995 年,它作为网景浏览器(Netscape Navigator)的一部分首次发布,网景给这个新语言命名为 LiveScript。一年后,为了搭上当时媒体热炒 Java 的顺风车,临时改名为了 JavaScript (当然,Java 和 JavaScript 的关系,就和雷锋和雷锋塔一样 —— 并没有什么关系)

      歪果仁的笑话怎么一点都不好笑

      译者注:wikipedia 的 JavaScript 词条 更详细的叙述了这段历史

      -
      `,r:{minutes:5.24,words:1572},t:"JavaScript ES6",i:"es6",y:"a"}}],["/posts/Web/JavaScript/judgment.html",{loader:()=>k(()=>import("./judgment.html-rV2tRQhp.js"),[]),meta:{d:14864256e5,l:"2017年2月7日",c:["JavaScript"],g:["JavaScript","前端开发"],e:`
      +
      `,r:{minutes:5.24,words:1572},t:"JavaScript ES6",i:"es6",y:"a"}}],["/posts/Web/JavaScript/judgment.html",{loader:()=>k(()=>import("./judgment.html-Cjw8Ijr0.js"),[]),meta:{d:14864256e5,l:"2017年2月7日",c:["JavaScript"],g:["JavaScript","前端开发"],e:`

      通过 js 判断 moblie 端和 pc 端进而加载不同的 css 或者 js

      废话不多说,上代码

      @@ -345,12 +345,12 @@ var c2=Object.defineProperty;var u2=(e,t,n)=>t in e?c2(e,t,{enumerable:!0,config } browserRedirect(); </script>
      -
      `,r:{minutes:.64,words:191},t:"通过UserAgent判断设备",i:"mobile",y:"a"}}],["/posts/Web/Vue/",{loader:()=>k(()=>import("./index.html--_guqIUT.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`
      +
      `,r:{minutes:.64,words:191},t:"通过UserAgent判断设备",i:"mobile",y:"a"}}],["/posts/Web/Vue/",{loader:()=>k(()=>import("./index.html-I-Yx1wuh.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`

      相关信息

      这里放置Vue相关的内容


      -`,r:{minutes:.1,words:30},t:"Vue",i:"vue",O:5,y:"p"}}],["/posts/Web/Vue/optimization.html",{loader:()=>k(()=>import("./optimization.html-BqV2wMWR.js"),[]),meta:{d:16842816e5,l:"2023年5月17日",c:["Vue"],g:["优化"],v:"https://w.wallhaven.cc/full/57/wallhaven-577og5.jpg",e:`
      +`,r:{minutes:.1,words:30},t:"Vue",i:"vue",O:5,y:"p"}}],["/posts/Web/Vue/optimization.html",{loader:()=>k(()=>import("./optimization.html-BMdYCHox.js"),[]),meta:{d:16842816e5,l:"2023年5月17日",c:["Vue"],g:["优化"],v:"https://w.wallhaven.cc/full/57/wallhaven-577og5.jpg",e:`

      相关信息

      永远不要过早优化,优化也有相应的代价

        @@ -362,47 +362,47 @@ var c2=Object.defineProperty;var u2=(e,t,n)=>t in e?c2(e,t,{enumerable:!0,config

        何时优化,因地制宜,是一门艺术,尽量把优化的思想带入写代码的过程中

      本文章的优化手段基于vue2

      -`,r:{minutes:10.54,words:3161},t:"Vue常见优化手段",i:"support",y:"a"}}],["/posts/Web/Vue/vue2-principle.html",{loader:()=>k(()=>import("./vue2-principle.html-B8LPOH0r.js"),[]),meta:{d:16841952e5,l:"2023年5月16日",c:["Vue"],g:["Vue响应式"],v:"https://files.codelife.cc/wallhaven/full/5w/wallhaven-5wmyo8.jpg?x-oss-process=image/resize,limit_0,m_fill,w_1366,h_768/quality,Q_92/format,webp",e:`
      +`,r:{minutes:10.54,words:3161},t:"Vue常见优化手段",i:"support",y:"a"}}],["/posts/Web/Vue/vue2-principle.html",{loader:()=>k(()=>import("./vue2-principle.html-D_ZIr4FR.js"),[]),meta:{d:16841952e5,l:"2023年5月16日",c:["Vue"],g:["Vue响应式"],v:"https://files.codelife.cc/wallhaven/full/5w/wallhaven-5wmyo8.jpg?x-oss-process=image/resize,limit_0,m_fill,w_1366,h_768/quality,Q_92/format,webp",e:`

      前言

      首先要知道vue2 是2013年 基于 ES5开发出来的,我们常说的重渲染就是重新运行render函数

      vue2 的响应式原理是利⽤ES5 的⼀个 API ,Object.defineProperty()对数据进⾏劫持结合发布订阅模式的⽅式来实现的。

      -`,r:{minutes:11.21,words:3363},t:"Vue2响应式原理解析",i:"customize",y:"a"}}],["/posts/Web/Vue/waline-bug.html",{loader:()=>k(()=>import("./waline-bug.html-Ci_I02zF.js"),[]),meta:{d:17164224e5,l:"2024年5月23日",c:["Vue"],g:["Vue响应式"],v:"https://files.codelife.cc/wallhaven/full/6d/wallhaven-6d7xmx.jpg?x-oss-process=image/resize,limit_0,m_fill,w_1366,h_768/quality,Q_92/format,webp",e:` +`,r:{minutes:11.21,words:3363},t:"Vue2响应式原理解析",i:"customize",y:"a"}}],["/posts/Web/Vue/waline-bug.html",{loader:()=>k(()=>import("./waline-bug.html-DL6_dDeX.js"),[]),meta:{d:17164224e5,l:"2024年5月23日",c:["Vue"],g:["Vue响应式"],v:"https://files.codelife.cc/wallhaven/full/6d/wallhaven-6d7xmx.jpg?x-oss-process=image/resize,limit_0,m_fill,w_1366,h_768/quality,Q_92/format,webp",e:`

      提示

      前言: Waline 评论系统这个 bug 有几个月了,现象就是回复完其他人的评论后,评论内容会保留在顶部输入框中,而且不会自动清空。具体见 👉GitHub issuse #2173

      许久未见修复,正好我有空,就看看这个问题,接下来跟我一起分析一下这个问题

      -
      `,r:{minutes:6.61,words:1983},t:"一个 waline 评论系统bug引发的思考",i:"hk-waline",y:"a"}}],["/posts/Web/node/",{loader:()=>k(()=>import("./index.html-D4W4Hm6R.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`
      +
      `,r:{minutes:6.61,words:1983},t:"一个 waline 评论系统bug引发的思考",i:"hk-waline",y:"a"}}],["/posts/Web/node/",{loader:()=>k(()=>import("./index.html-KqmCeJ_a.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`

      相关信息

      这里放置nodeJS相关的内容


      -`,r:{minutes:.1,words:30},t:"nodeJS",i:"nodeJS",O:4,y:"p"}}],["/posts/Web/node/node-version.html",{loader:()=>k(()=>import("./node-version.html-B2eoMU_-.js"),[]),meta:{d:1585872e6,l:"2020年4月3日",c:["Linux"],g:["Node"],e:`
      +`,r:{minutes:.1,words:30},t:"nodeJS",i:"nodeJS",O:4,y:"p"}}],["/posts/Web/node/node-version.html",{loader:()=>k(()=>import("./node-version.html-CbylZCLO.js"),[]),meta:{d:1585872e6,l:"2020年4月3日",c:["Linux"],g:["Node"],e:`

      鉴于使用 ReactNative 时,会需要不同的 node 版本,提供一种版本切换方式

      使用 n command 来进行 node 版本管理

      概念

      n Node version manager 提供了一个更简单的 CLI,用于在 Node 版本之间进行安装和切换。它仅在 Linux 或 Mac 操作系统上受到支持。

      安装

      -

      如果你已经安装某个版本的 Node 和 npm ,则可以用 npm install -g n 来安装 n,就像安装其他 NPM 包一样。

      `,r:{minutes:2.79,words:836},t:"使用n命令管理node版本",i:"shell",y:"a"}}],["/posts/cross-platform/Flutter/",{loader:()=>k(()=>import("./index.html-WUZJohtd.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`
      +

      如果你已经安装某个版本的 Node 和 npm ,则可以用 npm install -g n 来安装 n,就像安装其他 NPM 包一样。

      `,r:{minutes:2.79,words:836},t:"使用n命令管理node版本",i:"shell",y:"a"}}],["/posts/cross-platform/Flutter/",{loader:()=>k(()=>import("./index.html-C30UK5n0.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`

      相关信息

      这里放置 Flutter 内容

      -`,r:{minutes:.09,words:28},t:"Flutter",i:"hk-flutter",O:2,y:"p"}}],["/posts/cross-platform/Flutter/concurrency.html",{loader:()=>k(()=>import("./concurrency.html-DlO2sR8b.js"),[]),meta:{d:16824672e5,l:"2023年4月26日",c:["Flutter","Dart"],g:["Dart"],v:"https://w.wallhaven.cc/full/72/wallhaven-7286w9.png",e:`

      Dart 通过 async-await、isolate 以及一些异步类型概念(例如 FutureStream)支持了并发代码编程。本篇文章会对 async-await、FutureStream 进行简略的介绍,而侧重点放在 isolate 的讲解上。

      -

      在应用中,所有的 Dart 代码都在 isolate 中运行。每一个 Dart 的 isolate 都有独立的运行线程,它们无法与其他 isolate 共享可变对象。在需要进行通信的场景里,isolate 会使用消息机制。很多 Dart 应用都只使用一个 isolate,也就是 main isolate。你可以创建额外的 isolate 以便在多个处理器核心上执行并行代码。

      `,r:{minutes:13.86,words:4159},t:"Dart 中的并发",i:"asynchronous",y:"a"}}],["/posts/cross-platform/Flutter/newbie.html",{loader:()=>k(()=>import("./newbie.html-CDoxvTAF.js"),[]),meta:{d:16792704e5,l:"2023年3月20日",c:["Flutter","前端跨平台"],g:["Flutter"],e:`
      +`,r:{minutes:.09,words:28},t:"Flutter",i:"hk-flutter",O:2,y:"p"}}],["/posts/cross-platform/Flutter/concurrency.html",{loader:()=>k(()=>import("./concurrency.html-BwoFIWfl.js"),[]),meta:{d:16824672e5,l:"2023年4月26日",c:["Flutter","Dart"],g:["Dart"],v:"https://w.wallhaven.cc/full/72/wallhaven-7286w9.png",e:`

      Dart 通过 async-await、isolate 以及一些异步类型概念(例如 FutureStream)支持了并发代码编程。本篇文章会对 async-await、FutureStream 进行简略的介绍,而侧重点放在 isolate 的讲解上。

      +

      在应用中,所有的 Dart 代码都在 isolate 中运行。每一个 Dart 的 isolate 都有独立的运行线程,它们无法与其他 isolate 共享可变对象。在需要进行通信的场景里,isolate 会使用消息机制。很多 Dart 应用都只使用一个 isolate,也就是 main isolate。你可以创建额外的 isolate 以便在多个处理器核心上执行并行代码。

      `,r:{minutes:13.86,words:4159},t:"Dart 中的并发",i:"asynchronous",y:"a"}}],["/posts/cross-platform/Flutter/newbie.html",{loader:()=>k(()=>import("./newbie.html-hMNUB3XQ.js"),[]),meta:{d:16792704e5,l:"2023年3月20日",c:["Flutter","前端跨平台"],g:["Flutter"],e:`

      提示

      把之前学习时候写的demo拿出来记录一下
      地址:
      flutter_my_app

      -

      demo是照着B站的视频敲的,现在可能用不上了,但是还是觉得当时写的demo对于想学习flutter的新手来说作用还是有的,因为视频课程很零散,所以我边看边写了一个app,里边基本介绍了大部分基础的用法,当然进阶的东西,这部分demo是没有的,最近也在忙,有空了再补一部分进阶的东西吧

      `,r:{minutes:1.38,words:415},t:"Flutter 基础大集合",i:"hk-flutter",y:"a"}}],["/posts/cross-platform/Flutter/principle.html",{loader:()=>k(()=>import("./principle.html-D4GNJ8s5.js"),[]),meta:{d:16824672e5,l:"2023年4月26日",c:["Flutter"],g:["Flutter"],v:"https://files.codelife.cc/wallhaven/full/4v/wallhaven-4vp2x3.png?x-oss-process=image/resize,limit_0,m_fill,w_1366,h_768/quality,Q_92/format,webp",e:` +

      demo是照着B站的视频敲的,现在可能用不上了,但是还是觉得当时写的demo对于想学习flutter的新手来说作用还是有的,因为视频课程很零散,所以我边看边写了一个app,里边基本介绍了大部分基础的用法,当然进阶的东西,这部分demo是没有的,最近也在忙,有空了再补一部分进阶的东西吧

      `,r:{minutes:1.38,words:415},t:"Flutter 基础大集合",i:"hk-flutter",y:"a"}}],["/posts/cross-platform/Flutter/principle.html",{loader:()=>k(()=>import("./principle.html-Dcvt1GUa.js"),[]),meta:{d:16824672e5,l:"2023年4月26日",c:["Flutter"],g:["Flutter"],v:"https://files.codelife.cc/wallhaven/full/4v/wallhaven-4vp2x3.png?x-oss-process=image/resize,limit_0,m_fill,w_1366,h_768/quality,Q_92/format,webp",e:`

      本文档解释了使 Flutter API 正常工作的 Flutter 工具包内部工作原理。由于 Flutter widget 是以积极组合的形式构建的,所以使用 Flutter 构建的用户界面含有大量 widget。为了支撑这些负载,Flutter 使用了次线性算法来布局和构建 widget,这些数据结构使树形结构优化更加高效,并且具有很多常量因子优化。通过一些额外的机制,该设计也允许开发者利用回调(用于构建用户可见的 widget)来轻松创建无限滚动列表。

      积极可组合性

      -

      组合性是 Flutter 最为出众的一个特性。widget 通过组合其他 widget 的方式进行构建,并且这些 widget 自身由更基础的 widget 构建。比如,Padding 是一个 widget 而非其他 widget 的属性。因此,使用 Flutter 创建的用户界面是由多个 widget 组成的。

      `,r:{minutes:28.8,words:8640},t:"Flutter 工作原理",i:"engine",y:"a"}}],["/posts/cross-platform/ReactNative/",{loader:()=>k(()=>import("./index.html-DNP_6u_p.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`
      +

      组合性是 Flutter 最为出众的一个特性。widget 通过组合其他 widget 的方式进行构建,并且这些 widget 自身由更基础的 widget 构建。比如,Padding 是一个 widget 而非其他 widget 的属性。因此,使用 Flutter 创建的用户界面是由多个 widget 组成的。

      `,r:{minutes:28.8,words:8640},t:"Flutter 工作原理",i:"engine",y:"a"}}],["/posts/cross-platform/ReactNative/",{loader:()=>k(()=>import("./index.html-BlBSI3_m.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`

      相关信息

      这里放置 ReactNative 内容

      -`,r:{minutes:.09,words:27},t:"ReactNative",i:"react",O:1,y:"p"}}],["/posts/cross-platform/ReactNative/react1.html",{loader:()=>k(()=>import("./react1.html-BZTNLiU3.js"),[]),meta:{d:1566639519e3,l:"2019年8月24日",c:["前端跨平台"],g:["前端","React Native"],e:`
      +`,r:{minutes:.09,words:27},t:"ReactNative",i:"react",O:1,y:"p"}}],["/posts/cross-platform/ReactNative/react1.html",{loader:()=>k(()=>import("./react1.html-Bwvo7ttA.js"),[]),meta:{d:1566639519e3,l:"2019年8月24日",c:["前端跨平台"],g:["前端","React Native"],e:`

      ReactNative 是 Facebook 开发的一套用于开发跨平台 App 的技术框架

      相比传统开发方式解决了一些痛点:

      1.难以复用

      @@ -411,7 +411,7 @@ var c2=Object.defineProperty;var u2=(e,t,n)=>t in e?c2(e,t,{enumerable:!0,config

      效率带来的缺点也可想而知就是一些原生可以实现的复杂操作,RN 做不到

      前置知识

      -

      React Native 看起来很像 React,只不过其基础组件是原生组件而非 web 组件。要理解 React Native 应用的基本结构,首先需要了解一些基本的 React 的概念,比如 JSX 语法、组件、state状态以及props属性。如果你已经了解了 React,那么还需要掌握一些 React Native 特有的知识,比如原生组件的使用。

      `,r:{minutes:4.16,words:1249},t:"ReactNative介绍",O:1,y:"a"}}],["/posts/cross-platform/ReactNative/react2.html",{loader:()=>k(()=>import("./react2.html-B1J9Rj8R.js"),[]),meta:{d:15666912e5,l:"2019年8月25日",c:["前端跨平台"],g:["前端","React Native"],e:`
      +

      React Native 看起来很像 React,只不过其基础组件是原生组件而非 web 组件。要理解 React Native 应用的基本结构,首先需要了解一些基本的 React 的概念,比如 JSX 语法、组件、state状态以及props属性。如果你已经了解了 React,那么还需要掌握一些 React Native 特有的知识,比如原生组件的使用。

      `,r:{minutes:4.16,words:1249},t:"ReactNative介绍",O:1,y:"a"}}],["/posts/cross-platform/ReactNative/react2.html",{loader:()=>k(()=>import("./react2.html-D0bh5js6.js"),[]),meta:{d:15666912e5,l:"2019年8月25日",c:["前端跨平台"],g:["前端","React Native"],e:`

      接上篇 ReactNative介绍

      创建 ReactNative 项目

      @@ -421,14 +421,14 @@ var c2=Object.defineProperty;var u2=(e,t,n)=>t in e?c2(e,t,{enumerable:!0,config yarn tsc --init --pretty --jsx react-native touch rn-cli.config.js yarn add --dev @types/react @types/react-native
-
`,r:{minutes:4.64,words:1392},t:"ReactNative开发环境配置,ES6语法介绍",O:2,y:"a"}}],["/posts/cross-platform/ReactNative/react3.html",{loader:()=>k(()=>import("./react3.html-Bd0R7thV.js"),[]),meta:{d:15735168e5,l:"2019年11月12日",c:["前端跨平台"],g:["前端","React Native"],e:`
+
`,r:{minutes:4.64,words:1392},t:"ReactNative开发环境配置,ES6语法介绍",O:2,y:"a"}}],["/posts/cross-platform/ReactNative/react3.html",{loader:()=>k(()=>import("./react3.html-QyHI9Zxi.js"),[]),meta:{d:15735168e5,l:"2019年11月12日",c:["前端跨平台"],g:["前端","React Native"],e:`

接上篇 ReactNative开发环境配置,ES6语法介绍

ReactNative State(状态)

概念

通俗来讲,一个组件,或者一个视图,他们都是 Component,Component 用两个最重要的东西,一个props

一个state

-

我们使用两种数据来控制一个组件:propsstateprops是在父组件中指定,而且一经指定,在被指定的组件的生命周期中则不再改变。(props就像一个类的初始化属性一样,只有在创建时可以赋值,并且组件内部不可修改,也就是readonly)

`,r:{minutes:2.51,words:753},t:"ReactNative State(状态)",O:3,y:"a"}}],["/posts/iOS/other/JavaScriptBridge.html",{loader:()=>k(()=>import("./JavaScriptBridge.html-BwZ34i68.js"),[]),meta:{d:15334272e5,l:"2018年8月5日",c:["iOS"],g:["iOS","JavaScript"],e:`
+

我们使用两种数据来控制一个组件:propsstateprops是在父组件中指定,而且一经指定,在被指定的组件的生命周期中则不再改变。(props就像一个类的初始化属性一样,只有在创建时可以赋值,并且组件内部不可修改,也就是readonly)

`,r:{minutes:2.51,words:753},t:"ReactNative State(状态)",O:3,y:"a"}}],["/posts/iOS/other/JavaScriptBridge.html",{loader:()=>k(()=>import("./JavaScriptBridge.html-yHc9vznD.js"),[]),meta:{d:15334272e5,l:"2018年8月5日",c:["iOS"],g:["iOS","JavaScript"],e:`

最近一直在忙,今天抽空写一下 H5 和 Native 的交互

一、选择

@@ -449,14 +449,14 @@ var c2=Object.defineProperty;var u2=(e,t,n)=>t in e?c2(e,t,{enumerable:!0,config
  • Ps :关于 Android 版本库,其中很多是按照 iOS 版的 JavaScriptBridge 改写的。但是其中有很多问题,尤其是各种调用时机问题,上面的链接是经过我旁边的 Android 小哥试了四五个版本之后发现的,修复了各种改写版的问题
  • -`,r:{minutes:2.7,words:809},t:"WebViewJavascriptBridge",y:"a"}}],["/posts/iOS/other/",{loader:()=>k(()=>import("./index.html-0I13WEYH.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`
    +`,r:{minutes:2.7,words:809},t:"WebViewJavascriptBridge",y:"a"}}],["/posts/iOS/other/",{loader:()=>k(()=>import("./index.html-C6A4WyTS.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`

    相关信息

    这里放置 others 相关的内容

    -`,r:{minutes:.1,words:31},t:"其他",i:"others",O:5,y:"p"}}],["/posts/iOS/other/coreML.html",{loader:()=>k(()=>import("./coreML.html-DjJoLv9w.js"),[]),meta:{d:15112224e5,l:"2017年11月21日",c:["iOS"],g:["iOS"],e:`
    +`,r:{minutes:.1,words:31},t:"其他",i:"others",O:5,y:"p"}}],["/posts/iOS/other/coreML.html",{loader:()=>k(()=>import("./coreML.html--pwN-dEN.js"),[]),meta:{d:15112224e5,l:"2017年11月21日",c:["iOS"],g:["iOS"],e:`

    CoreML 是 iOS 11 新推出的机器学习框架,是人工智能的核心内容,他可以在训练好的机器学习模型应用到 APP 中

    -
    `,r:{minutes:3.04,words:912},t:"初探机器学习框架CoreML",y:"a"}}],["/posts/iOS/other/test-Three-ways-to-%20call.html",{loader:()=>k(()=>import("./test-Three-ways-to- call.html-BRk8dPvi.js"),[]),meta:{d:1478953877e3,l:"2016年11月12日",c:["iOS"],g:["iOS"],e:` +
    `,r:{minutes:3.04,words:912},t:"初探机器学习框架CoreML",y:"a"}}],["/posts/iOS/other/test-Three-ways-to-%20call.html",{loader:()=>k(()=>import("./test-Three-ways-to- call.html-Bjh8lx2z.js"),[]),meta:{d:1478953877e3,l:"2016年11月12日",c:["iOS"],g:["iOS"],e:`

    使用 YYtext 实现 label 中的某些文字点击拨打电话---Github

    真机测试结果

    设备型号:iphone6s

    @@ -465,13 +465,13 @@ var c2=Object.defineProperty;var u2=(e,t,n)=>t in e?c2(e,t,{enumerable:!0,config

    三种打电话的方法

    方法一:网上说使用此方法,电话结束后进入联系人列表,测试结果为:正常,电话结束后返回程序

    -
    `,r:{minutes:1.77,words:532},t:"Test Three ways to call",y:"a"}}],["/posts/iOS/other/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E6%A8%A1%E5%9E%8B%E8%AE%AD%E7%BB%83.html",{loader:()=>k(()=>import("./神经网络模型训练.html-C0Li4UWp.js"),[]),meta:{d:1563898105e3,l:"2019年7月23日",c:["iOS"],g:["iOS","AI"],e:` +
    `,r:{minutes:1.77,words:532},t:"Test Three ways to call",y:"a"}}],["/posts/iOS/other/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E6%A8%A1%E5%9E%8B%E8%AE%AD%E7%BB%83.html",{loader:()=>k(()=>import("./神经网络模型训练.html-Dkwirb21.js"),[]),meta:{d:1563898105e3,l:"2019年7月23日",c:["iOS"],g:["iOS","AI"],e:`

    经过之前 coreML 的介绍,自己训练一个模型

    使用 xcodeplayground 训练简单神经网络模型

    详细:

    -

    去年,苹果(Apple)推出了 Core ML:这是一种快速的方法,可以让你用尽可能少的代码将预先培训好的机器学习模型导入应用程序中!今年,有了 Create ML,苹果给了我们开发人员创建我们自己的机器学习模型直接进入 Xcode 的平台的能力!我们只需要一些数据就行了!目前,Create ML 允许文本、图像和表作为数据。然而,由于这是大多数 ML 应用程序的组成部分,这应该很好地服务于您的目的!我将向您展示如何使用这三种类型的数据创建一个 ML 模型.

    `,r:{minutes:4.64,words:1392},t:"神经网络模型训练",y:"a"}}],["/posts/iOS/source/AFNETworking-A-memory-leak.html",{loader:()=>k(()=>import("./AFNETworking-A-memory-leak.html-DS8aVVjh.js"),[]),meta:{d:1484784e6,l:"2017年1月19日",c:["iOS"],g:["iOS","Bug录"],e:`
    +

    去年,苹果(Apple)推出了 Core ML:这是一种快速的方法,可以让你用尽可能少的代码将预先培训好的机器学习模型导入应用程序中!今年,有了 Create ML,苹果给了我们开发人员创建我们自己的机器学习模型直接进入 Xcode 的平台的能力!我们只需要一些数据就行了!目前,Create ML 允许文本、图像和表作为数据。然而,由于这是大多数 ML 应用程序的组成部分,这应该很好地服务于您的目的!我将向您展示如何使用这三种类型的数据创建一个 ML 模型.

    `,r:{minutes:4.64,words:1392},t:"神经网络模型训练",y:"a"}}],["/posts/iOS/source/AFNETworking-A-memory-leak.html",{loader:()=>k(()=>import("./AFNETworking-A-memory-leak.html-DGO_7mOf.js"),[]),meta:{d:1484784e6,l:"2017年1月19日",c:["iOS"],g:["iOS","Bug录"],e:`

    细心的你是否也发现了 AFN 的内存泄漏的问题了呢.

    解决方法

    @@ -492,11 +492,11 @@ var c2=Object.defineProperty;var u2=(e,t,n)=>t in e?c2(e,t,{enumerable:!0,config }); return urlsession; }
    -
    `,r:{minutes:.39,words:117},t:"AFNetworking A memory leak",y:"a"}}],["/posts/iOS/source/",{loader:()=>k(()=>import("./index.html-BHNX8lHa.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`
    +
    `,r:{minutes:.39,words:117},t:"AFNetworking A memory leak",y:"a"}}],["/posts/iOS/source/",{loader:()=>k(()=>import("./index.html-Q-g5HomJ.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`

    相关信息

    这里放置 源码解读 相关的内容

    -`,r:{minutes:.12,words:36},t:"源码解读",i:"code",O:4,y:"p"}}],["/posts/iOS/source/WCDB.html",{loader:()=>k(()=>import("./WCDB.html-C_b8iPW3.js"),[]),meta:{d:15162336e5,l:"2018年1月18日",c:["iOS"],g:["iOS","工具集"],e:`
    +`,r:{minutes:.12,words:36},t:"源码解读",i:"code",O:4,y:"p"}}],["/posts/iOS/source/WCDB.html",{loader:()=>k(()=>import("./WCDB.html-Dm4gbE_q.js"),[]),meta:{d:15162336e5,l:"2018年1月18日",c:["iOS"],g:["iOS","工具集"],e:`

    前言

    @@ -519,16 +519,16 @@ var c2=Object.defineProperty;var u2=(e,t,n)=>t in e?c2(e,t,{enumerable:!0,config
  • 数据库损坏修复工具 WDBRepair

  • -`,r:{minutes:9.65,words:2894},t:"WCDB漫谈",i:"others",y:"a"}}],["/posts/iOS/source/YYMemoryCache.html",{loader:()=>k(()=>import("./YYMemoryCache.html-DyYkpWup.js"),[]),meta:{d:1556294905e3,l:"2019年4月26日",c:["iOS"],g:["iOS"],e:`

    1.1. 前言

    +`,r:{minutes:9.65,words:2894},t:"WCDB漫谈",i:"others",y:"a"}}],["/posts/iOS/source/YYMemoryCache.html",{loader:()=>k(()=>import("./YYMemoryCache.html-BbWxf4Nh.js"),[]),meta:{d:1556294905e3,l:"2019年4月26日",c:["iOS"],g:["iOS"],e:`

    1.1. 前言

    开发中总会用到各种缓存,但是各位有没有考虑过什么样的缓存才能被叫做优秀的缓存,或者说优秀的缓存应该具备哪些特质?
    本文将结合 YYCache 的源码逐步带大家找到答案。
    YYCache 是一个线程安全的高性能键值缓存(该项目是 YYKit 组件之一)
    YYCache 的代码逻辑清晰,注释详尽,加上自身不算太大的代码量使得其阅读非常简单,更加难能可贵的是它的性能还非常高。

    -`,r:{minutes:8.18,words:2453},t:"YYCache优秀的缓存设计",i:"cache",y:"a"}}],["/posts/iOS/swift/",{loader:()=>k(()=>import("./index.html-CMjWH84n.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`
    +`,r:{minutes:8.18,words:2453},t:"YYCache优秀的缓存设计",i:"cache",y:"a"}}],["/posts/iOS/swift/",{loader:()=>k(()=>import("./index.html-D5yblHxC.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`

    相关信息

    这里放置 Swift 相关的内容

    -`,r:{minutes:.1,words:31},t:"Swift",i:"hk-swift",O:6,y:"p"}}],["/posts/iOS/swift/swift%E6%8D%95%E8%8E%B7%E8%AF%AD%E4%B9%89.html",{loader:()=>k(()=>import("./swift捕获语义.html-DwsTQMXU.js"),[]),meta:{d:15083712e5,l:"2017年10月19日",c:["Swift"],g:["iOS","Swift"],e:`
    +`,r:{minutes:.1,words:31},t:"Swift",i:"hk-swift",O:6,y:"p"}}],["/posts/iOS/swift/swift%E6%8D%95%E8%8E%B7%E8%AF%AD%E4%B9%89.html",{loader:()=>k(()=>import("./swift捕获语义.html-C5FYbwVT.js"),[]),meta:{d:15083712e5,l:"2017年10月19日",c:["Swift"],g:["iOS","Swift"],e:`

    参考链接:losures Capture Semantics, Part 1: Catch them all!

    概述

    @@ -541,7 +541,7 @@ YYCache 的代码逻辑清晰,注释详尽,加上自身不算太大的代码 var debugDescription: String { return "\\(name)>" } deinit { print("\\(self) escaped!") } }
    -
    `,r:{minutes:4.26,words:1279},t:"深入理解swift中闭包的捕捉语义",i:"hk-swift",y:"a"}}],["/posts/iOS/system/NSError.html",{loader:()=>k(()=>import("./NSError.html-CFDeKAl3.js"),[]),meta:{d:15277248e5,l:"2018年5月31日",c:["iOS"],g:["iOS"],e:`
    +
    `,r:{minutes:4.26,words:1279},t:"深入理解swift中闭包的捕捉语义",i:"hk-swift",y:"a"}}],["/posts/iOS/system/NSError.html",{loader:()=>k(()=>import("./NSError.html-Cbfa4ghy.js"),[]),meta:{d:15277248e5,l:"2018年5月31日",c:["iOS"],g:["iOS"],e:`

    前言

    整理一下在iOS开发中NSError的错误代码

    @@ -553,7 +553,7 @@ YYCache 的代码逻辑清晰,注释详尽,加上自身不算太大的代码 - (instancetype)initWithDomain:(NSErrorDomain)domain code:(NSInteger)code userInfo:(nullable NSDictionary *)dict; + (instancetype)errorWithDomain:(NSErrorDomain)domain code:(NSInteger)code userInfo:(nullable NSDictionary *)dict;
    -
    `,r:{minutes:3.11,words:934},t:"NSError",y:"a"}}],["/posts/iOS/system/NSOperation%E5%92%8CNSOPerationQueue.html",{loader:()=>k(()=>import("./NSOperation和NSOPerationQueue.html-q2KmhtqX.js"),[]),meta:{d:1482759599e3,l:"2016年12月26日",c:["iOS"],g:["iOS"],e:`
    +
    `,r:{minutes:3.11,words:934},t:"NSError",y:"a"}}],["/posts/iOS/system/NSOperation%E5%92%8CNSOPerationQueue.html",{loader:()=>k(()=>import("./NSOperation和NSOPerationQueue.html-D0EB1Evs.js"),[]),meta:{d:1482759599e3,l:"2016年12月26日",c:["iOS"],g:["iOS"],e:`

    一. NSOperatioin

    1.目的

    @@ -567,14 +567,14 @@ YYCache 的代码逻辑清晰,注释详尽,加上自身不算太大的代码
  • GCD 执行效率高于 NSOperation
  • NSOperation 提供了一些 GCD 中不具备的功能(暂停/恢复/取消)---管理操作-NSOperation 的高级用法
  • -

    3.NSOperation 本身是一个抽象类不可以直接使用,实际开发中使用其子类

    `,r:{minutes:1.77,words:531},t:"NSOperatioin",y:"a"}}],["/posts/iOS/system/",{loader:()=>k(()=>import("./index.html-DiKmiW7_.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`
    +

    3.NSOperation 本身是一个抽象类不可以直接使用,实际开发中使用其子类

    `,r:{minutes:1.77,words:531},t:"NSOperatioin",y:"a"}}],["/posts/iOS/system/",{loader:()=>k(()=>import("./index.html-BKRLUuLY.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`

    相关信息

    这里放置 系统 相关的内容

    -`,r:{minutes:.11,words:33},t:"系统",i:"hk-apple",O:2,y:"p"}}],["/posts/iOS/system/Reduced-App-%20volume.html",{loader:()=>k(()=>import("./Reduced-App- volume.html-hgEX0v9f.js"),[]),meta:{d:1478283116e3,l:"2016年11月4日",c:["iOS"],g:["iOS"],e:`
    +`,r:{minutes:.11,words:33},t:"系统",i:"hk-apple",O:2,y:"p"}}],["/posts/iOS/system/Reduced-App-%20volume.html",{loader:()=>k(()=>import("./Reduced-App- volume.html-BBOCyqv9.js"),[]),meta:{d:1478283116e3,l:"2016年11月4日",c:["iOS"],g:["iOS"],e:`

    把打包好的.ipa 文件的后缀改为.zip 并解压。右键.appbundle 选择显示包内容。有些情况下,大一点的文件压缩后反而比小一点的文件压缩后的体积小,而我们真正关心的时候解压后的真实体积,所以一定要解压里面的资源文件,看解压后的 size。从 APP Store 下载的.ipa 文件要比自己本地打包的要大,因为 APP Store 对 ipa 包又做了加密处理。Xcode 的 Organizer window 的 Estimate Size 功能能估计本地打包文件从 APP Store 下载时的大小。根据优化的 28 定律和常识,首先当然是多媒体资源的体积啦。

    -
    `,r:{minutes:9.24,words:2771},t:"减小iOS-App或者静态库体积",y:"a"}}],["/posts/iOS/system/WKWebView-URL.html",{loader:()=>k(()=>import("./WKWebView-URL.html-CBmYG6d-.js"),[]),meta:{d:14958432e5,l:"2017年5月27日",c:["iOS"],g:["iOS"],e:`
    +
    `,r:{minutes:9.24,words:2771},t:"减小iOS-App或者静态库体积",y:"a"}}],["/posts/iOS/system/WKWebView-URL.html",{loader:()=>k(()=>import("./WKWebView-URL.html-DuqslWhx.js"),[]),meta:{d:14958432e5,l:"2017年5月27日",c:["iOS"],g:["iOS"],e:`

    本文介绍使用 WKWebView 拦截 url 进行原生界面跳转

    3.gif
    3.gif
    @@ -595,7 +595,7 @@ YYCache 的代码逻辑清晰,注释详尽,加上自身不算太大的代码 } }
    -
    `,r:{minutes:.77,words:230},t:"WKWebView拦截URL",y:"a"}}],["/posts/iOS/system/WKWebView.html",{loader:()=>k(()=>import("./WKWebView.html-BaW8vIPH.js"),[]),meta:{d:149581366e4,l:"2017年5月26日",c:["iOS"],g:["iOS"],e:`
    +`,r:{minutes:.77,words:230},t:"WKWebView拦截URL",y:"a"}}],["/posts/iOS/system/WKWebView.html",{loader:()=>k(()=>import("./WKWebView.html-CHZbN4DT.js"),[]),meta:{d:149581366e4,l:"2017年5月26日",c:["iOS"],g:["iOS"],e:`

    记录一下 iOS8 之后的新控件 WKWebView,用以替代之前的 UIWebView,因为需求是在 TableView 的 Cell 中放一个 WebView。就产生了滑动手势冲突,为了解决这个问题就需要让 webView 高度自适应

    一、新特性

    @@ -605,7 +605,7 @@ YYCache 的代码逻辑清晰,注释详尽,加上自身不算太大的代码
  • 支持了更多的 HTML5 特性;
  • 高达 60fps 的滚动刷新率以及内置手势(支持右滑返回);
  • 将 UIWebViewDelegate 与 UIWebView 重构成了 14 类与 3 个协议(查看苹果官方文档);
  • -`,r:{minutes:4.11,words:1233},t:"WKWebView使用及自适应高度",y:"a"}}],["/posts/iOS/system/iOS%E4%B8%AD%E7%9A%84Runloop.html",{loader:()=>k(()=>import("./iOS中的Runloop.html-Dz5uhq0z.js"),[]),meta:{d:1482759599e3,l:"2016年12月26日",c:["iOS"],g:["iOS"],e:` +`,r:{minutes:4.11,words:1233},t:"WKWebView使用及自适应高度",y:"a"}}],["/posts/iOS/system/iOS%E4%B8%AD%E7%9A%84Runloop.html",{loader:()=>k(()=>import("./iOS中的Runloop.html-DFb4h3zI.js"),[]),meta:{d:1482759599e3,l:"2016年12月26日",c:["iOS"],g:["iOS"],e:`

    Runloop 是什么

    `,r:{minutes:3.16,words:948},t:"Runloop",y:"a"}}],["/posts/iOS/system/iOS%E6%9E%9A%E4%B8%BE%E7%B1%BB%E5%9E%8Benum%EF%BC%8CNS_ENUM%EF%BC%8CNS_OPTIONS.html",{loader:()=>k(()=>import("./iOS枚举类型enum,NS_ENUM,NS_OPTIONS.html--IvWD_b3.js"),[]),meta:{d:1483701556e3,l:"2017年1月6日",c:["iOS"],g:["iOS","Objectiv-C语法"],e:`
    +`,r:{minutes:3.16,words:948},t:"Runloop",y:"a"}}],["/posts/iOS/system/iOS%E6%9E%9A%E4%B8%BE%E7%B1%BB%E5%9E%8Benum%EF%BC%8CNS_ENUM%EF%BC%8CNS_OPTIONS.html",{loader:()=>k(()=>import("./iOS枚举类型enum,NS_ENUM,NS_OPTIONS.html-DX_f2v2J.js"),[]),meta:{d:1483701556e3,l:"2017年1月6日",c:["iOS"],g:["iOS","Objectiv-C语法"],e:`

    进入正题,今天介绍一下objective-c中的枚举

    提要

    @@ -657,7 +657,7 @@ YYCache 的代码逻辑清晰,注释详尽,加上自身不算太大的代码

    这两个宏的定义在Foundation.framework的NSObjCRuntime.h中:

    -`,r:{minutes:2.12,words:636},t:"OC 中的枚举类型",y:"a"}}],["/posts/iOS/system/iOS%E7%9A%84Cookie%E4%BD%BF%E7%94%A8.html",{loader:()=>k(()=>import("./iOS的Cookie使用.html-JqeWUp0j.js"),[]),meta:{d:14992128e5,l:"2017年7月5日",c:["iOS"],g:["iOS"],e:`
    +`,r:{minutes:2.12,words:636},t:"OC 中的枚举类型",y:"a"}}],["/posts/iOS/system/iOS%E7%9A%84Cookie%E4%BD%BF%E7%94%A8.html",{loader:()=>k(()=>import("./iOS的Cookie使用.html-n-sbz5-P.js"),[]),meta:{d:14992128e5,l:"2017年7月5日",c:["iOS"],g:["iOS"],e:`

    本文介绍 iOS 中 cookie 的使用包含 AFNetWorking 3.0 中的使用,常用于登录状态信息保存

    什么是 Cookies?

    @@ -674,7 +674,7 @@ Cookie 有什么作用?

  • 浏览器行为跟踪(如跟踪分析用户行为)

  • -`,r:{minutes:3.22,words:965},t:"iOS Cookie的配置及使用",y:"a"}}],["/posts/iOS/system/iOS%E7%A8%8B%E5%BA%8F%E5%90%AF%E5%8A%A8%E5%8E%9F%E7%90%86%EF%BC%88%E4%B8%8A%EF%BC%89.html",{loader:()=>k(()=>import("./iOS程序启动原理(上).html-GXkqB9GE.js"),[]),meta:{d:1483113552e3,l:"2016年12月30日",c:["iOS"],g:["iOS"],e:`
    +`,r:{minutes:3.22,words:965},t:"iOS Cookie的配置及使用",y:"a"}}],["/posts/iOS/system/iOS%E7%A8%8B%E5%BA%8F%E5%90%AF%E5%8A%A8%E5%8E%9F%E7%90%86%EF%BC%88%E4%B8%8A%EF%BC%89.html",{loader:()=>k(()=>import("./iOS程序启动原理(上).html-CPiWHYeZ.js"),[]),meta:{d:1483113552e3,l:"2016年12月30日",c:["iOS"],g:["iOS"],e:`

    本文介绍 iOS 程序中的 Info.plist,pch 文件,UIApplication,openURL 以及 UIWindow 的常用属性及方法;

    info.plist

    @@ -682,26 +682,26 @@ Cookie 有什么作用?

    建立一个工程后,会在 Supporting files 文件夹下看到一个"工程名-Info.plist"的文件,该文件对工程做一些运行期的配置,非常重要,不能删除.
    在旧版 Xcode 创建的工程中,这个配置文件的名字叫做"Info.plist".
    项目中的其他 plist 文件不能带有"Info"这个字眼,不然会被错认为是传说中非常重要的"Info.plist".
    -项目中还有一个"InfoPlist.strings"的文件(Xcode6 之后需手动添加),跟 Info.plist 文件的本地化相关.

    `,r:{minutes:4.91,words:1472},t:"iOS程序启动原理(上)",y:"a"}}],["/posts/iOS/system/iOS%E7%A8%8B%E5%BA%8F%E5%90%AF%E5%8A%A8%E5%8E%9F%E7%90%86%EF%BC%88%E4%B8%8B%EF%BC%89.html",{loader:()=>k(()=>import("./iOS程序启动原理(下).html-Bnp6Wyby.js"),[]),meta:{d:1483113745e3,l:"2016年12月30日",c:["iOS"],g:["iOS"],e:`
    +项目中还有一个"InfoPlist.strings"的文件(Xcode6 之后需手动添加),跟 Info.plist 文件的本地化相关.

    `,r:{minutes:4.91,words:1472},t:"iOS程序启动原理(上)",y:"a"}}],["/posts/iOS/system/iOS%E7%A8%8B%E5%BA%8F%E5%90%AF%E5%8A%A8%E5%8E%9F%E7%90%86%EF%BC%88%E4%B8%8B%EF%BC%89.html",{loader:()=>k(()=>import("./iOS程序启动原理(下).html-CnMq7n7z.js"),[]),meta:{d:1483113745e3,l:"2016年12月30日",c:["iOS"],g:["iOS"],e:`

    接上篇

    iOS 程序启动原理(上)

    下图是一个 iOS 程序启动的完整过程

    -`,r:{minutes:.96,words:288},t:"iOS程序启动原理(下)",y:"a"}}],["/posts/iOS/system/keychain%E6%9B%B4%E6%96%B0.html",{loader:()=>k(()=>import("./keychain更新.html-Cpci4lDi.js"),[]),meta:{d:14894496e5,l:"2017年3月14日",c:["iOS"],g:["iOS"],e:`
    +`,r:{minutes:.96,words:288},t:"iOS程序启动原理(下)",y:"a"}}],["/posts/iOS/system/keychain%E6%9B%B4%E6%96%B0.html",{loader:()=>k(()=>import("./keychain更新.html-BIjWGNVl.js"),[]),meta:{d:14894496e5,l:"2017年3月14日",c:["iOS"],g:["iOS"],e:`

    转载自微信公众号《Mrpeak 杂货铺》

    Paste_Image.png
    Paste_Image.png
    -

    iOS 10.3 还未正式发布,beta 版中一个关于 keychain 特性的小修改,就已经引起了广泛的关注。

    `,r:{minutes:3.65,words:1095},t:"iOS 10.3 keychain 重大更新",y:"a"}}],["/posts/iOS/system/runtime%E5%BF%AB%E9%80%9F%E5%BD%92%E6%A1%A3.html",{loader:()=>k(()=>import("./runtime快速归档.html-CG-pn9AQ.js"),[]),meta:{d:14920416e5,l:"2017年4月13日",c:["iOS"],g:["iOS"],e:`
    +

    iOS 10.3 还未正式发布,beta 版中一个关于 keychain 特性的小修改,就已经引起了广泛的关注。

    `,r:{minutes:3.65,words:1095},t:"iOS 10.3 keychain 重大更新",y:"a"}}],["/posts/iOS/system/runtime%E5%BF%AB%E9%80%9F%E5%BD%92%E6%A1%A3.html",{loader:()=>k(()=>import("./runtime快速归档.html-C5Bn71TC.js"),[]),meta:{d:14920416e5,l:"2017年4月13日",c:["iOS"],g:["iOS"],e:`

    使用 runtime 进行归档,对我们的最大遍历就是高效,快速。尤其适用于 model 中属性非常多的时候

    Person.h

    person.m

    -
    `,r:{minutes:.22,words:66},t:"利用Runtime进行快速归档",y:"a"}}],["/posts/iOS/tool/",{loader:()=>k(()=>import("./index.html-DK5_NOrh.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`
    +
    `,r:{minutes:.22,words:66},t:"利用Runtime进行快速归档",y:"a"}}],["/posts/iOS/tool/",{loader:()=>k(()=>import("./index.html-DlF1_w2E.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`

    相关信息

    这里放置 tool 相关的内容

    -`,r:{minutes:.1,words:30},t:"tools",i:"tool",O:3,y:"p"}}],["/posts/iOS/tool/Update-Cocoapods.html",{loader:()=>k(()=>import("./Update-Cocoapods.html-Du1QI9a2.js"),[]),meta:{d:1478691287e3,l:"2016年11月9日",c:["iOS"],g:["iOS","工具集"],e:`
    +`,r:{minutes:.1,words:30},t:"tools",i:"tool",O:3,y:"p"}}],["/posts/iOS/tool/Update-Cocoapods.html",{loader:()=>k(()=>import("./Update-Cocoapods.html-Cqw1fYxU.js"),[]),meta:{d:1478691287e3,l:"2016年11月9日",c:["iOS"],g:["iOS","工具集"],e:`

    之前采用正常的 sudo gem install cocoapods更新 cocoapods 版本一直不成功,下面为和我遇到同样问题的兄弟们提供一个解决办法

    先切换 gem 源

    @@ -711,16 +711,16 @@ Cookie 有什么作用?

  • 查看是否切换成功 gem source -l
    如果出现下图这样的就说明切换成功了, 如果还是官方的源, 请手动重启电脑尝试
  • -`,r:{minutes:1.01,words:304},t:"Update Cocoapods 1.1.1",y:"a"}}],["/posts/iOS/tool/ijkplayer.html",{loader:()=>k(()=>import("./ijkplayer.html-DYH_59A9.js"),[]),meta:{d:15040512e5,l:"2017年8月30日",c:["iOS"],g:["iOS"],e:`
    +`,r:{minutes:1.01,words:304},t:"Update Cocoapods 1.1.1",y:"a"}}],["/posts/iOS/tool/ijkplayer.html",{loader:()=>k(()=>import("./ijkplayer.html-NYuhLFSW.js"),[]),meta:{d:15040512e5,l:"2017年8月30日",c:["iOS"],g:["iOS"],e:`

    参考地址
    ijkplayer 是一款做视频直播的框架,基于 FFmpeg,支持 Android 和 iOS。这里介绍一下 iOS 中集成 ijkplayer

    一、FFmpeg

    -

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包括了领先的音/视频编码库 libavcodec 等。

    `,r:{minutes:2.94,words:883},t:"ijkPlayer 集成",y:"a"}}],["/posts/iOS/tool/%E5%9B%BE%E7%89%87%E4%B8%8A%E4%BC%A0%E5%8E%8B%E7%BC%A9%E7%AE%97%E6%B3%95.html",{loader:()=>k(()=>import("./图片上传压缩算法.html-DRXgWKw_.js"),[]),meta:{d:1483114185e3,l:"2016年12月30日",c:["iOS"],g:["iOS","工具集","算法"],e:`
    +

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。它包括了领先的音/视频编码库 libavcodec 等。

    `,r:{minutes:2.94,words:883},t:"ijkPlayer 集成",y:"a"}}],["/posts/iOS/tool/%E5%9B%BE%E7%89%87%E4%B8%8A%E4%BC%A0%E5%8E%8B%E7%BC%A9%E7%AE%97%E6%B3%95.html",{loader:()=>k(()=>import("./图片上传压缩算法.html-CTYP-fXm.js"),[]),meta:{d:1483114185e3,l:"2016年12月30日",c:["iOS"],g:["iOS","工具集","算法"],e:`

    由于最近公司在做图片相册选择上传的功能,对于图片的压缩算法这里我借鉴了 ochina 的 ios 端 App。其中有涉及到图片压缩的算法,这里贴出来留待后用;

    -

    GACompressionPicHandle.h

    `,r:{minutes:1.88,words:564},t:"iOS - Image compression algorithm",y:"a"}}],["/posts/iOS/tool/%E9%85%8D%E7%BD%AEhttps.html",{loader:()=>k(()=>import("./配置https.html-D21s0AL2.js"),[]),meta:{d:15028416e5,l:"2017年8月16日",c:["iOS"],g:["iOS"],e:`
    +

    GACompressionPicHandle.h

    `,r:{minutes:1.88,words:564},t:"iOS - Image compression algorithm",y:"a"}}],["/posts/iOS/tool/%E9%85%8D%E7%BD%AEhttps.html",{loader:()=>k(()=>import("./配置https.html-mKeZiEo4.js"),[]),meta:{d:15028416e5,l:"2017年8月16日",c:["iOS"],g:["iOS"],e:`

    昨天试验了 iOS 11 beta6 发现原有的 https 自建证书不能使用,可能是新版本要对 ATS 加强验证,之前一直说的要全面 https 估计在不久的将来就要来临,未接入的可能要像 Apple 说的不允许上架。所以把配置过程记录在此

    要求

    @@ -730,11 +730,11 @@ ijkplayer 是一款做视频直播的框架,基于 FFmpeg,支持 Android 和
  • HTTPS 证书必须使用 SHA 256 以上哈希算法签名
  • HTTPS 证书必须使用 RAS 2048 位或 ECC 356 位以上公钥算法
  • 使用前向加密技术
  • -`,r:{minutes:1.63,words:488},t:"iOS 配置https",y:"a"}}],["/posts/iOS/ui/",{loader:()=>k(()=>import("./index.html-BMbUrkLD.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`
    +`,r:{minutes:1.63,words:488},t:"iOS 配置https",y:"a"}}],["/posts/iOS/ui/",{loader:()=>k(()=>import("./index.html-FY3kdf-A.js"),[]),meta:{d:253152e6,l:"1978年1月9日",e:`

    相关信息

    这里放置 UI 相关的内容

    -`,r:{minutes:.11,words:32},t:"UI相关",i:"style",O:1,y:"p"}}],["/posts/iOS/ui/cell%E5%A4%8D%E7%94%A8-accessoryType%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95.html",{loader:()=>k(()=>import("./cell复用-accessoryType解决办法.html-WzaLR-7a.js"),[]),meta:{d:1486944e6,l:"2017年2月13日",c:["iOS"],g:["iOS","Bug录"],e:`
    +`,r:{minutes:.11,words:32},t:"UI相关",i:"style",O:1,y:"p"}}],["/posts/iOS/ui/cell%E5%A4%8D%E7%94%A8-accessoryType%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95.html",{loader:()=>k(()=>import("./cell复用-accessoryType解决办法.html-CB7NViIw.js"),[]),meta:{d:1486944e6,l:"2017年2月13日",c:["iOS"],g:["iOS","Bug录"],e:`

    今天项目里出现一个问题,就是做一个列表选择,然后点击导航栏的确定按钮返回上级界面,并把选择的 cell 数据传递到上级界面。再使用 accessoryType 属性标记单元格之后会出现重用问题。

    解决办法

    @@ -746,11 +746,11 @@ ijkplayer 是一款做视频直播的框架,基于 FFmpeg,支持 Android 和
  • 在 didSelectRowAtIndexPath 和 didDeselectRowAtIndexPath 方法里面使用了如下方法实现了点击单元格然后用 check mark 标记的方式。

  • -`,r:{minutes:1.52,words:455},t:"Cell的accessoryType属性标记单元格之后,出现的重用问题",y:"a"}}],["/posts/iOS/ui/tableview-radius.html",{loader:()=>k(()=>import("./tableview-radius.html-C3Ulu4x0.js"),[]),meta:{d:1482759599e3,l:"2016年12月26日",c:["iOS"],g:["iOS","性能优化"],e:`

    此子必成大器

    +`,r:{minutes:1.52,words:455},t:"Cell的accessoryType属性标记单元格之后,出现的重用问题",y:"a"}}],["/posts/iOS/ui/tableview-radius.html",{loader:()=>k(()=>import("./tableview-radius.html-PE4lT4t0.js"),[]),meta:{d:1482759599e3,l:"2016年12月26日",c:["iOS"],g:["iOS","性能优化"],e:`

    此子必成大器

    本文介绍内容主要是 tableView 的性能优化之不使用 cornerRadius 设置图片圆角

    -

    有人问我为什么 tableView 滑动不流畅,甚至闪退,其实和 cell 中的圆角头像使用了 cornerRadius 有关

    `,r:{minutes:2.16,words:647},t:"TableView性能优化",y:"a"}}],["/posts/iOS/ui/textfiled%E9%99%90%E5%88%B6%E8%BE%93%E5%85%A5%E5%AD%97%E7%AC%A6.html",{loader:()=>k(()=>import("./textfiled限制输入字符.html-WK9rdb8c.js"),[]),meta:{d:14953248e5,l:"2017年5月21日",c:["iOS"],g:["iOS"],e:`
    +

    有人问我为什么 tableView 滑动不流畅,甚至闪退,其实和 cell 中的圆角头像使用了 cornerRadius 有关

    `,r:{minutes:2.16,words:647},t:"TableView性能优化",y:"a"}}],["/posts/iOS/ui/textfiled%E9%99%90%E5%88%B6%E8%BE%93%E5%85%A5%E5%AD%97%E7%AC%A6.html",{loader:()=>k(()=>import("./textfiled限制输入字符.html-DnsOezjR.js"),[]),meta:{d:14953248e5,l:"2017年5月21日",c:["iOS"],g:["iOS"],e:`

    记录一下限制输入字符的判断。不仅局限于中文或英文

      @@ -758,14 +758,14 @@ ijkplayer 是一款做视频直播的框架,基于 FFmpeg,支持 Android 和
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textFieldEditChanged:)
     	name:@"UITextFieldTextDidChangeNotification" object:self.userTF];
    -
    `,r:{minutes:.98,words:295},t:"textfield限制输入字符",y:"a"}}],["/posts/iOS/ui/timelineLogistics.html",{loader:()=>k(()=>import("./timelineLogistics.html-Bup2gkmj.js"),[]),meta:{d:14998176e5,l:"2017年7月12日",c:["iOS"],g:["iOS","Demo"],e:`
    +
    `,r:{minutes:.98,words:295},t:"textfield限制输入字符",y:"a"}}],["/posts/iOS/ui/timelineLogistics.html",{loader:()=>k(()=>import("./timelineLogistics.html-CN1FRQkW.js"),[]),meta:{d:14998176e5,l:"2017年7月12日",c:["iOS"],g:["iOS","Demo"],e:`

    timelineLogistics 是模仿淘宝物流信息时间轴界面的自定义 View

    效果

    Markdown
    Markdown

    使用正则表达式判断字符是否为电话号码,用 YYLable 进行富文本电话拨打

    -
    `,r:{minutes:1.32,words:397},t:"iOS timelineLogistics",y:"a"}}],["/posts/iOS/ui/%E4%BC%98%E9%9B%85%E7%9A%84cell%E5%8D%95%E9%80%89.html",{loader:()=>k(()=>import("./优雅的cell单选.html-TCn5nVFc.js"),[]),meta:{d:15157152e5,l:"2018年1月12日",c:["iOS"],g:["iOS"],e:`
    +
    `,r:{minutes:1.32,words:397},t:"iOS timelineLogistics",y:"a"}}],["/posts/iOS/ui/%E4%BC%98%E9%9B%85%E7%9A%84cell%E5%8D%95%E9%80%89.html",{loader:()=>k(()=>import("./优雅的cell单选.html-B-xoDQYY.js"),[]),meta:{d:15157152e5,l:"2018年1月12日",c:["iOS"],g:["iOS"],e:`

    最近有些忙,好久没有写博客了。
    分享一个 cell 做单选的思路

    @@ -774,8 +774,8 @@ ijkplayer 是一款做视频直播的框架,基于 FFmpeg,支持 Android 和
  • 在 tableview 的控制器中设立一个变量记录选择的 indexPath,点击 cell 之后刷新表格来和现有 indexPath 对比
  • 和第一种大同小异,做一个和 dataArr 同样的数组,记录 indexPath,循环确定当前 cell 是否为选中 cell
  • 利用 cell 的- (void)setSelected:(BOOL)selected animated:(BOOL)animated方法
  • -`,r:{minutes:1.39,words:417},t:"优雅的实现TableViewCell单选",y:"a"}}],["/404.html",{loader:()=>k(()=>import("./404.html-BOcMMntT.js"),[]),meta:{e:`

    404 Not Found

    -`,r:{minutes:.01,words:3},t:"",y:"p"}}],["/private/",{loader:()=>k(()=>import("./index.html-CGZoWHUA.js"),[]),meta:{r:{minutes:0,words:1},t:"Private",y:"p"}}],["/posts/",{loader:()=>k(()=>import("./index.html-DbQEnJ5X.js"),[]),meta:{r:{minutes:0,words:1},t:"Posts",y:"p"}}],["/category/",{loader:()=>k(()=>import("./index.html-DNc1Kv9t.js"),[]),meta:{t:"分类",I:!1,y:"p"}}],["/category/blog/",{loader:()=>k(()=>import("./index.html-VeopVlz7.js"),[]),meta:{t:"Blog 分类",I:!1,y:"p"}}],["/category/about/",{loader:()=>k(()=>import("./index.html-ClzqIRhn.js"),[]),meta:{t:"About 分类",I:!1,y:"p"}}],["/category/%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/",{loader:()=>k(()=>import("./index.html-CQO5u6cq.js"),[]),meta:{t:"使用指南 分类",I:!1,y:"p"}}],["/category/%E6%94%B6%E8%97%8F/",{loader:()=>k(()=>import("./index.html-B8IfBxJw.js"),[]),meta:{t:"收藏 分类",I:!1,y:"p"}}],["/category/ai/",{loader:()=>k(()=>import("./index.html-BANwDHHg.js"),[]),meta:{t:"AI 分类",I:!1,y:"p"}}],["/category/linux/",{loader:()=>k(()=>import("./index.html-DvdbYPdV.js"),[]),meta:{t:"Linux 分类",I:!1,y:"p"}}],["/category/python/",{loader:()=>k(()=>import("./index.html-kZ_twGmY.js"),[]),meta:{t:"python 分类",I:!1,y:"p"}}],["/category/rust/",{loader:()=>k(()=>import("./index.html-D6f8IMME.js"),[]),meta:{t:"rust 分类",I:!1,y:"p"}}],["/category/%E6%B5%8F%E8%A7%88%E5%99%A8/",{loader:()=>k(()=>import("./index.html-CcIJ9lCh.js"),[]),meta:{t:"浏览器 分类",I:!1,y:"p"}}],["/category/%E5%B7%A5%E5%85%B7%E6%95%99%E7%A8%8B/",{loader:()=>k(()=>import("./index.html-BKzgiLbn.js"),[]),meta:{t:"工具教程 分类",I:!1,y:"p"}}],["/category/vercel/",{loader:()=>k(()=>import("./index.html-CUlzZydO.js"),[]),meta:{t:"Vercel 分类",I:!1,y:"p"}}],["/category/%E5%BC%80%E6%BA%90%E8%BD%AF%E4%BB%B6/",{loader:()=>k(()=>import("./index.html-BT5Al4Uh.js"),[]),meta:{t:"开源软件 分类",I:!1,y:"p"}}],["/category/github/",{loader:()=>k(()=>import("./index.html-BeDYnZcj.js"),[]),meta:{t:"GitHub 分类",I:!1,y:"p"}}],["/category/git/",{loader:()=>k(()=>import("./index.html-yUURlVM8.js"),[]),meta:{t:"Git 分类",I:!1,y:"p"}}],["/category/css/",{loader:()=>k(()=>import("./index.html-BRlFmOM3.js"),[]),meta:{t:"CSS 分类",I:!1,y:"p"}}],["/category/javascript/",{loader:()=>k(()=>import("./index.html-D8VyuQ47.js"),[]),meta:{t:"JavaScript 分类",I:!1,y:"p"}}],["/category/vue/",{loader:()=>k(()=>import("./index.html-D7y4HPEe.js"),[]),meta:{t:"Vue 分类",I:!1,y:"p"}}],["/category/flutter/",{loader:()=>k(()=>import("./index.html-DIodQO6H.js"),[]),meta:{t:"Flutter 分类",I:!1,y:"p"}}],["/category/dart/",{loader:()=>k(()=>import("./index.html-D3FUjzrj.js"),[]),meta:{t:"Dart 分类",I:!1,y:"p"}}],["/category/%E5%89%8D%E7%AB%AF%E8%B7%A8%E5%B9%B3%E5%8F%B0/",{loader:()=>k(()=>import("./index.html-7BmsLxpe.js"),[]),meta:{t:"前端跨平台 分类",I:!1,y:"p"}}],["/category/ios/",{loader:()=>k(()=>import("./index.html-KcOjwPEG.js"),[]),meta:{t:"iOS 分类",I:!1,y:"p"}}],["/category/swift/",{loader:()=>k(()=>import("./index.html-DaF1LWFa.js"),[]),meta:{t:"Swift 分类",I:!1,y:"p"}}],["/tag/",{loader:()=>k(()=>import("./index.html-Bh_shHQG.js"),[]),meta:{t:"标签",I:!1,y:"p"}}],["/tag/blog/",{loader:()=>k(()=>import("./index.html-DcucDcOI.js"),[]),meta:{t:"标签: Blog",I:!1,y:"p"}}],["/tag/about/",{loader:()=>k(()=>import("./index.html-DlXp6cK_.js"),[]),meta:{t:"标签: About",I:!1,y:"p"}}],["/tag/github-action/",{loader:()=>k(()=>import("./index.html-DaoaCAaT.js"),[]),meta:{t:"标签: GitHub Action",I:!1,y:"p"}}],["/tag/%E7%A6%81%E7%94%A8/",{loader:()=>k(()=>import("./index.html-h4hAdFFl.js"),[]),meta:{t:"标签: 禁用",I:!1,y:"p"}}],["/tag/%E6%96%87%E7%AB%A0%E5%8A%A0%E5%AF%86/",{loader:()=>k(()=>import("./index.html-aHrvJB7m.js"),[]),meta:{t:"标签: 文章加密",I:!1,y:"p"}}],["/tag/markdown/",{loader:()=>k(()=>import("./index.html-rvgR71_h.js"),[]),meta:{t:"标签: Markdown",I:!1,y:"p"}}],["/tag/%E9%A1%B5%E9%9D%A2%E9%85%8D%E7%BD%AE/",{loader:()=>k(()=>import("./index.html-BfTo8ZXh.js"),[]),meta:{t:"标签: 页面配置",I:!1,y:"p"}}],["/tag/%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/",{loader:()=>k(()=>import("./index.html-CkOyTSf1.js"),[]),meta:{t:"标签: 使用指南",I:!1,y:"p"}}],["/tag/%E7%94%9F%E6%B4%BB/",{loader:()=>k(()=>import("./index.html-DIYXcKUa.js"),[]),meta:{t:"标签: 生活",I:!1,y:"p"}}],["/tag/%E5%B7%A5%E5%85%B7%E7%BD%91%E7%AB%99/",{loader:()=>k(()=>import("./index.html-DbxZmXuN.js"),[]),meta:{t:"标签: 工具网站",I:!1,y:"p"}}],["/tag/ai/",{loader:()=>k(()=>import("./index.html-DUUsKQyS.js"),[]),meta:{t:"标签: AI",I:!1,y:"p"}}],["/tag/terminal/",{loader:()=>k(()=>import("./index.html-B24UmZ3c.js"),[]),meta:{t:"标签: terminal",I:!1,y:"p"}}],["/tag/linux/",{loader:()=>k(()=>import("./index.html-DXLy607X.js"),[]),meta:{t:"标签: Linux",I:!1,y:"p"}}],["/tag/os/",{loader:()=>k(()=>import("./index.html-DHi8T-Ot.js"),[]),meta:{t:"标签: OS",I:!1,y:"p"}}],["/tag/unix/",{loader:()=>k(()=>import("./index.html-BdOkWTBv.js"),[]),meta:{t:"标签: Unix",I:!1,y:"p"}}],["/tag/%E5%B7%A5%E5%85%B7%E8%84%9A%E6%9C%AC/",{loader:()=>k(()=>import("./index.html-CvUfUCig.js"),[]),meta:{t:"标签: 工具脚本",I:!1,y:"p"}}],["/tag/rust/",{loader:()=>k(()=>import("./index.html-CjY8Uucp.js"),[]),meta:{t:"标签: rust",I:!1,y:"p"}}],["/tag/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/",{loader:()=>k(()=>import("./index.html-Dq_Hy3CT.js"),[]),meta:{t:"标签: 前端开发",I:!1,y:"p"}}],["/tag/jenkins/",{loader:()=>k(()=>import("./index.html-CTSDmUDd.js"),[]),meta:{t:"标签: Jenkins",I:!1,y:"p"}}],["/tag/vercel/",{loader:()=>k(()=>import("./index.html-wTSB8jdo.js"),[]),meta:{t:"标签: Vercel",I:!1,y:"p"}}],["/tag/github/",{loader:()=>k(()=>import("./index.html-Cz9bRKQf.js"),[]),meta:{t:"标签: GitHub",I:!1,y:"p"}}],["/tag/github-actions/",{loader:()=>k(()=>import("./index.html-COBE3tfZ.js"),[]),meta:{t:"标签: GitHub Actions",I:!1,y:"p"}}],["/tag/ssh-key/",{loader:()=>k(()=>import("./index.html-Ck1-pcnf.js"),[]),meta:{t:"标签: ssh_key",I:!1,y:"p"}}],["/tag/javascript/",{loader:()=>k(()=>import("./index.html-B6SQcRYY.js"),[]),meta:{t:"标签: JavaScript",I:!1,y:"p"}}],["/tag/%E7%BF%BB%E8%AF%91/",{loader:()=>k(()=>import("./index.html-BcKeSK_s.js"),[]),meta:{t:"标签: 翻译",I:!1,y:"p"}}],["/tag/%E4%BC%98%E5%8C%96/",{loader:()=>k(()=>import("./index.html-BMnaZ-jn.js"),[]),meta:{t:"标签: 优化",I:!1,y:"p"}}],["/tag/vue%E5%93%8D%E5%BA%94%E5%BC%8F/",{loader:()=>k(()=>import("./index.html-Dk_3wF-1.js"),[]),meta:{t:"标签: Vue响应式",I:!1,y:"p"}}],["/tag/node/",{loader:()=>k(()=>import("./index.html-Djn19ujE.js"),[]),meta:{t:"标签: Node",I:!1,y:"p"}}],["/tag/dart/",{loader:()=>k(()=>import("./index.html-BsGg9JHG.js"),[]),meta:{t:"标签: Dart",I:!1,y:"p"}}],["/tag/flutter/",{loader:()=>k(()=>import("./index.html-CW51vxDQ.js"),[]),meta:{t:"标签: Flutter",I:!1,y:"p"}}],["/tag/%E5%89%8D%E7%AB%AF/",{loader:()=>k(()=>import("./index.html-DCAqAoLH.js"),[]),meta:{t:"标签: 前端",I:!1,y:"p"}}],["/tag/react-native/",{loader:()=>k(()=>import("./index.html-_UHNWYY4.js"),[]),meta:{t:"标签: React Native",I:!1,y:"p"}}],["/tag/ios/",{loader:()=>k(()=>import("./index.html-fw3gb88Y.js"),[]),meta:{t:"标签: iOS",I:!1,y:"p"}}],["/tag/bug%E5%BD%95/",{loader:()=>k(()=>import("./index.html-2wxImmTk.js"),[]),meta:{t:"标签: Bug录",I:!1,y:"p"}}],["/tag/%E5%B7%A5%E5%85%B7%E9%9B%86/",{loader:()=>k(()=>import("./index.html-CpJRsOgm.js"),[]),meta:{t:"标签: 工具集",I:!1,y:"p"}}],["/tag/swift/",{loader:()=>k(()=>import("./index.html-H6iun3DI.js"),[]),meta:{t:"标签: Swift",I:!1,y:"p"}}],["/tag/objectiv-c%E8%AF%AD%E6%B3%95/",{loader:()=>k(()=>import("./index.html-DXN0rgeW.js"),[]),meta:{t:"标签: Objectiv-C语法",I:!1,y:"p"}}],["/tag/%E7%AE%97%E6%B3%95/",{loader:()=>k(()=>import("./index.html-CgOaQnuR.js"),[]),meta:{t:"标签: 算法",I:!1,y:"p"}}],["/tag/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/",{loader:()=>k(()=>import("./index.html-CFn43VWC.js"),[]),meta:{t:"标签: 性能优化",I:!1,y:"p"}}],["/tag/demo/",{loader:()=>k(()=>import("./index.html-DefDrGlr.js"),[]),meta:{t:"标签: Demo",I:!1,y:"p"}}],["/article/",{loader:()=>k(()=>import("./index.html-BGrS7w8j.js"),[]),meta:{t:"文章",I:!1,y:"p"}}],["/star/",{loader:()=>k(()=>import("./index.html-DO4g9yRu.js"),[]),meta:{t:"星标",I:!1,y:"p"}}],["/timeline/",{loader:()=>k(()=>import("./index.html-Cx8V59AO.js"),[]),meta:{t:"时间轴",I:!1,y:"p"}}],["/news/",{loader:()=>k(()=>import("./index.html-Dzbu9gXH.js"),[]),meta:{t:"说说",y:"p"}}]]);/*! +`,r:{minutes:1.39,words:417},t:"优雅的实现TableViewCell单选",y:"a"}}],["/404.html",{loader:()=>k(()=>import("./404.html-CbM9U-XQ.js"),[]),meta:{e:`

    404 Not Found

    +`,r:{minutes:.01,words:3},t:"",y:"p"}}],["/private/",{loader:()=>k(()=>import("./index.html-CEdM5y8Q.js"),[]),meta:{r:{minutes:0,words:1},t:"Private",y:"p"}}],["/posts/",{loader:()=>k(()=>import("./index.html-xvmnzafi.js"),[]),meta:{r:{minutes:0,words:1},t:"Posts",y:"p"}}],["/category/",{loader:()=>k(()=>import("./index.html-r68CX44k.js"),[]),meta:{t:"分类",I:!1,y:"p"}}],["/category/blog/",{loader:()=>k(()=>import("./index.html-DedbjYJJ.js"),[]),meta:{t:"Blog 分类",I:!1,y:"p"}}],["/category/about/",{loader:()=>k(()=>import("./index.html-C8oF08Dp.js"),[]),meta:{t:"About 分类",I:!1,y:"p"}}],["/category/%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/",{loader:()=>k(()=>import("./index.html-DQ_7XhEp.js"),[]),meta:{t:"使用指南 分类",I:!1,y:"p"}}],["/category/%E6%94%B6%E8%97%8F/",{loader:()=>k(()=>import("./index.html-DxwaqKH9.js"),[]),meta:{t:"收藏 分类",I:!1,y:"p"}}],["/category/ai/",{loader:()=>k(()=>import("./index.html-DDqhSXqm.js"),[]),meta:{t:"AI 分类",I:!1,y:"p"}}],["/category/linux/",{loader:()=>k(()=>import("./index.html-BQac0K5Y.js"),[]),meta:{t:"Linux 分类",I:!1,y:"p"}}],["/category/python/",{loader:()=>k(()=>import("./index.html-jtexITn6.js"),[]),meta:{t:"python 分类",I:!1,y:"p"}}],["/category/rust/",{loader:()=>k(()=>import("./index.html-BtlEGfSt.js"),[]),meta:{t:"rust 分类",I:!1,y:"p"}}],["/category/%E6%B5%8F%E8%A7%88%E5%99%A8/",{loader:()=>k(()=>import("./index.html-Bsbslkjk.js"),[]),meta:{t:"浏览器 分类",I:!1,y:"p"}}],["/category/%E5%B7%A5%E5%85%B7%E6%95%99%E7%A8%8B/",{loader:()=>k(()=>import("./index.html-DKMQMtsw.js"),[]),meta:{t:"工具教程 分类",I:!1,y:"p"}}],["/category/vercel/",{loader:()=>k(()=>import("./index.html-DW-WOzr1.js"),[]),meta:{t:"Vercel 分类",I:!1,y:"p"}}],["/category/%E5%BC%80%E6%BA%90%E8%BD%AF%E4%BB%B6/",{loader:()=>k(()=>import("./index.html-DpQLdC0v.js"),[]),meta:{t:"开源软件 分类",I:!1,y:"p"}}],["/category/github/",{loader:()=>k(()=>import("./index.html-CWIFXLnI.js"),[]),meta:{t:"GitHub 分类",I:!1,y:"p"}}],["/category/git/",{loader:()=>k(()=>import("./index.html-C-QBf6dH.js"),[]),meta:{t:"Git 分类",I:!1,y:"p"}}],["/category/css/",{loader:()=>k(()=>import("./index.html-uuvvCu8H.js"),[]),meta:{t:"CSS 分类",I:!1,y:"p"}}],["/category/javascript/",{loader:()=>k(()=>import("./index.html-Car7NfWM.js"),[]),meta:{t:"JavaScript 分类",I:!1,y:"p"}}],["/category/vue/",{loader:()=>k(()=>import("./index.html-BcEf0byl.js"),[]),meta:{t:"Vue 分类",I:!1,y:"p"}}],["/category/flutter/",{loader:()=>k(()=>import("./index.html-CQu51ghK.js"),[]),meta:{t:"Flutter 分类",I:!1,y:"p"}}],["/category/dart/",{loader:()=>k(()=>import("./index.html-Ctz6axG9.js"),[]),meta:{t:"Dart 分类",I:!1,y:"p"}}],["/category/%E5%89%8D%E7%AB%AF%E8%B7%A8%E5%B9%B3%E5%8F%B0/",{loader:()=>k(()=>import("./index.html-BVPdmsjv.js"),[]),meta:{t:"前端跨平台 分类",I:!1,y:"p"}}],["/category/ios/",{loader:()=>k(()=>import("./index.html-BxnYvGC_.js"),[]),meta:{t:"iOS 分类",I:!1,y:"p"}}],["/category/swift/",{loader:()=>k(()=>import("./index.html-BeLRD4Yx.js"),[]),meta:{t:"Swift 分类",I:!1,y:"p"}}],["/tag/",{loader:()=>k(()=>import("./index.html-biwu7jVA.js"),[]),meta:{t:"标签",I:!1,y:"p"}}],["/tag/blog/",{loader:()=>k(()=>import("./index.html-BKJxcFUr.js"),[]),meta:{t:"标签: Blog",I:!1,y:"p"}}],["/tag/about/",{loader:()=>k(()=>import("./index.html-C-kWV9qV.js"),[]),meta:{t:"标签: About",I:!1,y:"p"}}],["/tag/github-action/",{loader:()=>k(()=>import("./index.html-zhf6P558.js"),[]),meta:{t:"标签: GitHub Action",I:!1,y:"p"}}],["/tag/%E7%A6%81%E7%94%A8/",{loader:()=>k(()=>import("./index.html-nFX9x8bi.js"),[]),meta:{t:"标签: 禁用",I:!1,y:"p"}}],["/tag/%E6%96%87%E7%AB%A0%E5%8A%A0%E5%AF%86/",{loader:()=>k(()=>import("./index.html-YtXRvkY0.js"),[]),meta:{t:"标签: 文章加密",I:!1,y:"p"}}],["/tag/markdown/",{loader:()=>k(()=>import("./index.html-jz9ozQ2P.js"),[]),meta:{t:"标签: Markdown",I:!1,y:"p"}}],["/tag/%E9%A1%B5%E9%9D%A2%E9%85%8D%E7%BD%AE/",{loader:()=>k(()=>import("./index.html-DeUOGLR-.js"),[]),meta:{t:"标签: 页面配置",I:!1,y:"p"}}],["/tag/%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/",{loader:()=>k(()=>import("./index.html-DyORhmjT.js"),[]),meta:{t:"标签: 使用指南",I:!1,y:"p"}}],["/tag/%E7%94%9F%E6%B4%BB/",{loader:()=>k(()=>import("./index.html-BB5WG04t.js"),[]),meta:{t:"标签: 生活",I:!1,y:"p"}}],["/tag/%E5%B7%A5%E5%85%B7%E7%BD%91%E7%AB%99/",{loader:()=>k(()=>import("./index.html-reAB6b_k.js"),[]),meta:{t:"标签: 工具网站",I:!1,y:"p"}}],["/tag/ai/",{loader:()=>k(()=>import("./index.html-E11HoSRw.js"),[]),meta:{t:"标签: AI",I:!1,y:"p"}}],["/tag/terminal/",{loader:()=>k(()=>import("./index.html-_040GXi2.js"),[]),meta:{t:"标签: terminal",I:!1,y:"p"}}],["/tag/linux/",{loader:()=>k(()=>import("./index.html-D5dtrMjH.js"),[]),meta:{t:"标签: Linux",I:!1,y:"p"}}],["/tag/os/",{loader:()=>k(()=>import("./index.html-CwvQP2OC.js"),[]),meta:{t:"标签: OS",I:!1,y:"p"}}],["/tag/unix/",{loader:()=>k(()=>import("./index.html-VpBGDvKe.js"),[]),meta:{t:"标签: Unix",I:!1,y:"p"}}],["/tag/%E5%B7%A5%E5%85%B7%E8%84%9A%E6%9C%AC/",{loader:()=>k(()=>import("./index.html-T3NHi-RL.js"),[]),meta:{t:"标签: 工具脚本",I:!1,y:"p"}}],["/tag/rust/",{loader:()=>k(()=>import("./index.html-Cba8QdGN.js"),[]),meta:{t:"标签: rust",I:!1,y:"p"}}],["/tag/%E5%89%8D%E7%AB%AF%E5%BC%80%E5%8F%91/",{loader:()=>k(()=>import("./index.html-quL8V4n2.js"),[]),meta:{t:"标签: 前端开发",I:!1,y:"p"}}],["/tag/jenkins/",{loader:()=>k(()=>import("./index.html-BpO-VD-a.js"),[]),meta:{t:"标签: Jenkins",I:!1,y:"p"}}],["/tag/vercel/",{loader:()=>k(()=>import("./index.html-z-iiftO3.js"),[]),meta:{t:"标签: Vercel",I:!1,y:"p"}}],["/tag/github/",{loader:()=>k(()=>import("./index.html-BJZL820F.js"),[]),meta:{t:"标签: GitHub",I:!1,y:"p"}}],["/tag/github-actions/",{loader:()=>k(()=>import("./index.html-ohezDRYQ.js"),[]),meta:{t:"标签: GitHub Actions",I:!1,y:"p"}}],["/tag/ssh-key/",{loader:()=>k(()=>import("./index.html-9bA2I36u.js"),[]),meta:{t:"标签: ssh_key",I:!1,y:"p"}}],["/tag/javascript/",{loader:()=>k(()=>import("./index.html-Dn8zudZ_.js"),[]),meta:{t:"标签: JavaScript",I:!1,y:"p"}}],["/tag/%E7%BF%BB%E8%AF%91/",{loader:()=>k(()=>import("./index.html-DoufG9FB.js"),[]),meta:{t:"标签: 翻译",I:!1,y:"p"}}],["/tag/%E4%BC%98%E5%8C%96/",{loader:()=>k(()=>import("./index.html-BwFAYx8q.js"),[]),meta:{t:"标签: 优化",I:!1,y:"p"}}],["/tag/vue%E5%93%8D%E5%BA%94%E5%BC%8F/",{loader:()=>k(()=>import("./index.html-CHApeAwm.js"),[]),meta:{t:"标签: Vue响应式",I:!1,y:"p"}}],["/tag/node/",{loader:()=>k(()=>import("./index.html-C2h_ShYj.js"),[]),meta:{t:"标签: Node",I:!1,y:"p"}}],["/tag/dart/",{loader:()=>k(()=>import("./index.html-CJF8hNWH.js"),[]),meta:{t:"标签: Dart",I:!1,y:"p"}}],["/tag/flutter/",{loader:()=>k(()=>import("./index.html-Cm1KHd5m.js"),[]),meta:{t:"标签: Flutter",I:!1,y:"p"}}],["/tag/%E5%89%8D%E7%AB%AF/",{loader:()=>k(()=>import("./index.html-cRjlRdX8.js"),[]),meta:{t:"标签: 前端",I:!1,y:"p"}}],["/tag/react-native/",{loader:()=>k(()=>import("./index.html-mTrHRkVv.js"),[]),meta:{t:"标签: React Native",I:!1,y:"p"}}],["/tag/ios/",{loader:()=>k(()=>import("./index.html-BLiw6rQM.js"),[]),meta:{t:"标签: iOS",I:!1,y:"p"}}],["/tag/bug%E5%BD%95/",{loader:()=>k(()=>import("./index.html-CPG8Do3L.js"),[]),meta:{t:"标签: Bug录",I:!1,y:"p"}}],["/tag/%E5%B7%A5%E5%85%B7%E9%9B%86/",{loader:()=>k(()=>import("./index.html-BM37uq2n.js"),[]),meta:{t:"标签: 工具集",I:!1,y:"p"}}],["/tag/swift/",{loader:()=>k(()=>import("./index.html-CVqxBa1g.js"),[]),meta:{t:"标签: Swift",I:!1,y:"p"}}],["/tag/objectiv-c%E8%AF%AD%E6%B3%95/",{loader:()=>k(()=>import("./index.html-D7sIzWMn.js"),[]),meta:{t:"标签: Objectiv-C语法",I:!1,y:"p"}}],["/tag/%E7%AE%97%E6%B3%95/",{loader:()=>k(()=>import("./index.html-DRl9TOil.js"),[]),meta:{t:"标签: 算法",I:!1,y:"p"}}],["/tag/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/",{loader:()=>k(()=>import("./index.html-CxHv6NTM.js"),[]),meta:{t:"标签: 性能优化",I:!1,y:"p"}}],["/tag/demo/",{loader:()=>k(()=>import("./index.html-D46cQoy9.js"),[]),meta:{t:"标签: Demo",I:!1,y:"p"}}],["/article/",{loader:()=>k(()=>import("./index.html-BMR3aWYF.js"),[]),meta:{t:"文章",I:!1,y:"p"}}],["/star/",{loader:()=>k(()=>import("./index.html-B2JfQS0V.js"),[]),meta:{t:"星标",I:!1,y:"p"}}],["/timeline/",{loader:()=>k(()=>import("./index.html-CxKychrZ.js"),[]),meta:{t:"时间轴",I:!1,y:"p"}}],["/news/",{loader:()=>k(()=>import("./index.html-B1u2MO_4.js"),[]),meta:{t:"说说",y:"p"}}]]);/*! * vue-router v4.3.2 * (c) 2024 Eduardo San Martin Morote * @license MIT @@ -784,7 +784,7 @@ ijkplayer 是一款做视频直播的框架,基于 FFmpeg,支持 Android 和 `)},rootComponents:[]}),M6=Object.freeze(Object.defineProperty({__proto__:null,default:F6},Symbol.toStringTag,{value:"Module"})),Tu=async(e,t)=>{const{path:n,query:o}=e.currentRoute.value,{scrollBehavior:s}=e.options;e.options.scrollBehavior=void 0,await e.replace({path:n,query:o,hash:t}),e.options.scrollBehavior=s},$6=({headerLinkSelector:e,headerAnchorSelector:t,delay:n,offset:o=5})=>{const s=gt();xe("scroll",Fl(()=>{var m,g;const r=Math.max(window.scrollY,document.documentElement.scrollTop,document.body.scrollTop);if(Math.abs(r-0)p.some(_=>_.hash===E.hash));for(let E=0;E=(((m=_.parentElement)==null?void 0:m.offsetTop)??0)-o,C=!B||r<(((g=B.parentElement)==null?void 0:g.offsetTop)??0)-o;if(!(y&&C))continue;const R=decodeURIComponent(s.currentRoute.value.hash),I=decodeURIComponent(_.hash);if(R===I)return;if(d){for(let P=E+1;PLe(e.title)?{title:e.title}:null;const z1=Symbol(""),U6=e=>{j1=e},W6=()=>we(z1),G6=e=>{e.provide(z1,j1)};var K6={"/":{title:"目录",empty:"暂无目录"}};const J6=L({name:"Catalog",props:{base:{type:String,default:""},level:{type:Number,default:3},index:Boolean,hideHeading:Boolean},setup(e){const t=W6(),n=Zn(K6),o=Ee(),s=w4(),a=h1(),i=ke(eo(s.value).map(([u,{meta:d}])=>{const p=t(d);if(!p)return null;const f=u.split("/").length;return{level:G4(u,"/")?f-2:f-1,base:u.replace(/\/[^/]+\/?$/,"/"),path:u,...p}}).filter(u=>sn(u)&&Le(u.title))),l=w(()=>{const u=e.base?cm(o1(e.base)):o.value.path.replace(/\/[^/]+$/,"/"),d=u.split("/").length-2,p=[];return i.value.filter(({level:f,path:h})=>{if(!Ds(h,u)||h===u)return!1;if(u==="/"){const m=Dt(a.value.locales).filter(g=>g!=="/");if(h==="/404.html"||m.some(g=>Ds(h,g)))return!1}return f-d<=e.level}).sort(({title:f,level:h,order:m},{title:g,level:E,order:_})=>{const B=h-E;return B||(Yr(m)?Yr(_)?m>0?_>0?m-_:-1:_<0?m-_:1:m:Yr(_)?_:f.localeCompare(g))}).forEach(f=>{var g;const{base:h,level:m}=f;switch(m-d){case 1:{p.push(f);break}case 2:{const E=p.find(_=>_.path===h);E&&(E.children??(E.children=[])).push(f);break}default:{const E=p.find(_=>_.path===h.replace(/\/[^/]+\/$/,"/"));if(E){const _=(g=E.children)==null?void 0:g.find(B=>B.path===h);_&&(_.children??(_.children=[])).push(f)}}}}),p});return()=>{const u=l.value.some(d=>d.children);return c("div",{class:["vp-catalog-wrapper",{index:e.index}]},[e.hideHeading?null:c("h2",{class:"vp-catalog-main-title"},n.value.title),l.value.length?c(e.index?"ol":"ul",{class:["vp-catalogs",{deep:u}]},l.value.map(({children:d=[],title:p,path:f,content:h})=>{const m=c(Je,{class:"vp-catalog-title",to:f},()=>h?c(h):p);return c("li",{class:"vp-catalog"},u?[c("h3",{id:p,class:["vp-catalog-child-title",{"has-children":d.length}]},[c("a",{href:`#${p}`,class:"vp-catalog-header-anchor","aria-hidden":!0},"#"),m]),d.length?c(e.index?"ol":"ul",{class:"vp-child-catalogs"},d.map(({children:g=[],content:E,path:_,title:B})=>c("li",{class:"vp-child-catalog"},[c("div",{class:["vp-catalog-sub-title",{"has-children":g.length}]},[c("a",{href:`#${B}`,class:"vp-catalog-header-anchor"},"#"),c(Je,{class:"vp-catalog-title",to:_},()=>E?c(E):B)]),g.length?c(e.index?"ol":"div",{class:e.index?"vp-sub-catalogs":"vp-sub-catalogs-wrapper"},g.map(({content:y,path:C,title:M})=>e.index?c("li",{class:"vp-sub-catalog"},c(Je,{to:C},()=>y?c(y):M)):c(Je,{class:"vp-sub-catalog-link",to:C},()=>y?c(y):M))):null]))):null]:c("div",{class:"vp-catalog-child-title"},m))})):c("p",{class:"vp-empty-catalog"},n.value.empty)])}}}),Y6=Ve({enhance:({app:e})=>{G6(e),Et("Catalog",e)||e.component("Catalog",J6)}}),Q6=Object.freeze(Object.defineProperty({__proto__:null,default:Y6},Symbol.toStringTag,{value:"Module"}));var X6={"/":{backToTop:"返回顶部"}};const Z6=L({name:"BackToTop",setup(){const e=me(),t=Zn(X6),n=ke(),{height:o}=k6(n),{height:s}=A6(),{y:a}=B6(),r=w(()=>e.value.backToTop!==!1&&a.value>100),i=w(()=>a.value/(o.value-s.value)*100);return ne(()=>{n.value=document.body}),()=>c(bn,{name:"back-to-top"},()=>r.value?c("button",{type:"button",class:"vp-back-to-top-button","aria-label":t.value.backToTop,onClick:()=>{window.scrollTo({top:0,behavior:"smooth"})}},[c("span",{class:"vp-scroll-progress",role:"progressbar","aria-labelledby":"loadinglabel","aria-valuenow":i.value},c("svg",c("circle",{cx:"26",cy:"26",r:"24",fill:"none",stroke:"currentColor","stroke-width":"4","stroke-dasharray":`${Math.PI*i.value*.48} ${Math.PI*(100-i.value)*.48}`}))),c("div",{class:"back-to-top-icon"})]):null)}}),e5=Ve({rootComponents:[Z6]}),t5=Object.freeze(Object.defineProperty({__proto__:null,default:e5},Symbol.toStringTag,{value:"Module"}));/** * NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress * @license MIT - */const ye={settings:{minimum:.08,easing:"ease",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,barSelector:'[role="bar"]',parent:"body",template:'
    '},status:null,set:e=>{const t=ye.isStarted();e=Zr(e,ye.settings.minimum,1),ye.status=e===1?null:e;const n=ye.render(!t),o=n.querySelector(ye.settings.barSelector),s=ye.settings.speed,a=ye.settings.easing;return n.offsetWidth,n5(r=>{Aa(o,{transform:"translate3d("+Lu(e)+"%,0,0)",transition:"all "+s+"ms "+a}),e===1?(Aa(n,{transition:"none",opacity:"1"}),n.offsetWidth,setTimeout(()=>{Aa(n,{transition:"all "+s+"ms linear",opacity:"0"}),setTimeout(()=>{ye.remove(),r()},s)},s)):setTimeout(()=>r(),s)}),ye},isStarted:()=>typeof ye.status=="number",start:()=>{ye.status||ye.set(0);const e=()=>{setTimeout(()=>{ye.status&&(ye.trickle(),e())},ye.settings.trickleSpeed)};return ye.settings.trickle&&e(),ye},done:e=>!e&&!ye.status?ye:ye.inc(.3+.5*Math.random()).set(1),inc:e=>{let t=ye.status;return t?(typeof e!="number"&&(e=(1-t)*Zr(Math.random()*t,.1,.95)),t=Zr(t+e,0,.994),ye.set(t)):ye.start()},trickle:()=>ye.inc(Math.random()*ye.settings.trickleRate),render:e=>{if(ye.isRendered())return document.getElementById("nprogress");Iu(document.documentElement,"nprogress-busy");const t=document.createElement("div");t.id="nprogress",t.innerHTML=ye.settings.template;const n=t.querySelector(ye.settings.barSelector),o=e?"-100":Lu(ye.status||0),s=document.querySelector(ye.settings.parent);return Aa(n,{transition:"all 0 linear",transform:"translate3d("+o+"%,0,0)"}),s!==document.body&&Iu(s,"nprogress-custom-parent"),s==null||s.appendChild(t),t},remove:()=>{Ru(document.documentElement,"nprogress-busy"),Ru(document.querySelector(ye.settings.parent),"nprogress-custom-parent");const e=document.getElementById("nprogress");e&&o5(e)},isRendered:()=>!!document.getElementById("nprogress")},Zr=(e,t,n)=>en?n:e,Lu=e=>(-1+e)*100,n5=function(){const e=[];function t(){const n=e.shift();n&&n(t)}return function(n){e.push(n),e.length===1&&t()}}(),Aa=function(){const e=["Webkit","O","Moz","ms"],t={};function n(r){return r.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,function(i,l){return l.toUpperCase()})}function o(r){const i=document.body.style;if(r in i)return r;let l=e.length;const u=r.charAt(0).toUpperCase()+r.slice(1);let d;for(;l--;)if(d=e[l]+u,d in i)return d;return r}function s(r){return r=n(r),t[r]??(t[r]=o(r))}function a(r,i,l){i=s(i),r.style[i]=l}return function(r,i){for(const l in i){const u=i[l];u!==void 0&&Object.prototype.hasOwnProperty.call(i,l)&&a(r,l,u)}}}(),H1=(e,t)=>(typeof e=="string"?e:zl(e)).indexOf(" "+t+" ")>=0,Iu=(e,t)=>{const n=zl(e),o=n+t;H1(n,t)||(e.className=o.substring(1))},Ru=(e,t)=>{const n=zl(e);if(!H1(e,t))return;const o=n.replace(" "+t+" "," ");e.className=o.substring(1,o.length-1)},zl=e=>(" "+(e.className||"")+" ").replace(/\s+/gi," "),o5=e=>{e&&e.parentNode&&e.parentNode.removeChild(e)},s5=()=>{ne(()=>{const e=gt(),t=new Set;t.add(e.currentRoute.value.path),e.beforeEach(n=>{t.has(n.path)||ye.start()}),e.afterEach(n=>{t.add(n.path),ye.done()})})},a5=Ve({setup(){s5()}}),r5=Object.freeze(Object.defineProperty({__proto__:null,default:a5},Symbol.toStringTag,{value:"Module"})),i5=JSON.parse('{"encrypt":{"config":{"/demo/encrypt.html":["$2a$10$rHN7rKv6t3gWSnEe3kuaxOTcOR5WABULXRlx5s8eTTeo4C/KyIt8i"]}},"themeColor":true,"fullscreen":true,"author":{"name":"Oragekk","url":"https://orgaekk.me"},"logo":"/logo.svg","repo":"OrageKK/oragekk.github.io","docsDir":"src","navbarLayout":{"start":["Brand"],"center":["Links"],"end":["Language","Repo","Wormhole","Travelling","Outlook","Search"]},"blog":{"medias":{"Email":"mailto:oragekk@163.com","GitHub":"https://github.com/OrageKK","Gmail":"mailto:oragekk@gmail.com","Rss":"./rss.xml"},"name":"上冬十二"},"locales":{"/":{"lang":"zh-CN","navbarLocales":{"langName":"简体中文","selectLangAriaLabel":"选择语言"},"metaLocales":{"author":"作者","date":"写作日期","origin":"原创","views":"访问量","category":"分类","tag":"标签","readingTime":"阅读时间","words":"字数","toc":"此页内容","prev":"上一页","next":"下一页","lastUpdated":"上次编辑于","contributors":"贡献者","editLink":"在 GitHub 上编辑此页","print":"打印"},"blogLocales":{"article":"文章","articleList":"文章列表","category":"分类","tag":"标签","timeline":"时间轴","timelineTitle":"昨日不在","all":"全部","intro":"个人介绍","star":"星标","empty":"$text 为空"},"paginationLocales":{"prev":"上一页","next":"下一页","navigate":"跳转到","action":"前往","errorText":"请输入 1 到 $page 之前的页码!"},"outlookLocales":{"themeColor":"主题色","darkmode":"外观","fullscreen":"全屏"},"encryptLocales":{"iconLabel":"文章已加密","placeholder":"输入密码","remember":"记住密码","errorHint":"请输入正确的密码"},"routeLocales":{"skipToContent":"跳至主要內容","notFoundTitle":"页面不存在","notFoundMsg":["这里什么也没有","我们是怎么来到这儿的?","这 是 四 零 四 !","看起来你访问了一个失效的链接"],"back":"返回上一页","home":"带我回家","openInNewWindow":"Open in new window"},"navbar":["/",{"text":"导航","icon":"discover","link":"/demo/"},{"text":"笔记分类","icon":"edit","children":[{"text":"代码笔记","prefix":"/posts/","children":[{"text":"iOS笔记","icon":"hk-apple","link":"iOS/"},{"text":"前端笔记","icon":"code","link":"Web/"},{"text":"Linux","icon":"linux","link":"Linux/"},{"text":"Python","icon":"python","link":"Python/"},{"text":"Rust","icon":"hk-rust","link":"Rust/"},{"text":"React","icon":"react","link":"cross-platform/ReactNative/"},{"text":"Flutter","icon":"hk-flutter","link":"cross-platform/Flutter/"}]},{"text":"博客相关","prefix":"/blog/","children":[{"text":"博客相关","icon":"blog","link":""}]}]},{"text":"软件教程","icon":"software","link":"/tutorial/"},{"text":"收藏","icon":"hk-shoucang1","link":"/collect"},{"text":"说说","icon":"news","link":"/news/"},{"text":"留言板","icon":"mark","link":"/visitorsbook"},{"text":"友链","icon":"link","link":"/friend"},{"text":"关于","icon":"info","children":[{"text":"关于我","icon":"people","link":"/intro"},{"text":"关于本站","icon":"info","link":"/about"}]}],"sidebar":{"/":["",{"text":"如何使用","icon":"creative","prefix":"demo/","link":"demo/","children":"structure"},{"text":"代码笔记","icon":"note","prefix":"posts/","children":[{"text":"iOS","icon":"hk-apple","prefix":"iOS/","link":"iOS/"},{"text":"跨平台开发","icon":"relation","prefix":"cross-platform/","link":"cross-platform/"},{"text":"前端开发","icon":"code","prefix":"Web/","link":"Web/"},{"text":"Linux","icon":"linux","prefix":"Linux/","link":"Linux/"},{"text":"Python","icon":"python","prefix":"Python/","link":"Python/"},{"text":"Rust","icon":"hk-rust","prefix":"Rust/","link":"Rust/"}]},{"text":"软件/工具教程","icon":"software","prefix":"tutorial/","link":"tutorial/"},{"text":"博客相关","icon":"blog","prefix":"blog/","link":"blog/"},{"text":"站点收藏","icon":"sitemap","prefix":"site","link":"site/","children":"structure"},{"text":"随笔","icon":"flower","prefix":"private/","children":"structure"},{"text":"关于","icon":"info","prefix":"about/","link":"about"}],"/posts/Linux/":"structure","/posts/Python/":"structure","/posts/cross-platform/Flutter/":"structure","/posts/cross-platform/ReactNative/":"structure","/posts/iOS/":"structure","/posts/Web/":"structure","/site/":"structure","/blog":"structure","/tutorial":"structure"},"footer":"默认页脚","displayFooter":false,"blog":{"description":"到最后,竟庆幸于夕阳仍留在身上","intro":"/intro.html"}}}}'),l5=$(i5),q1=()=>l5,U1=Symbol(""),c5=()=>{const e=we(U1);if(!e)throw new Error("useThemeLocaleData() is called without provider.");return e},u5=(e,t)=>{const{locales:n,...o}=e;return{...o,...n==null?void 0:n[t]}},d5=Ve({enhance({app:e}){const t=q1(),n=e._context.provides[Il],o=w(()=>u5(t.value,n.routeLocale.value));e.provide(U1,o),Object.defineProperties(e.config.globalProperties,{$theme:{get(){return t.value}},$themeLocale:{get(){return o.value}}})}}),p5=Object.freeze(Object.defineProperty({__proto__:null,default:d5},Symbol.toStringTag,{value:"Module"})),f5={"Content-Type":"application/json"},W1=e=>`${e.replace(/\/?$/,"/")}api/`,G1=(e,t="")=>{if(typeof e=="object"&&e.errno)throw new TypeError(`${t} failed with ${e.errno}: ${e.errmsg}`);return e},h5=({serverURL:e,lang:t,paths:n,type:o,signal:s})=>fetch(`${W1(e)}article?path=${encodeURIComponent(n.join(","))}&type=${encodeURIComponent(o.join(","))}&lang=${t}`,{signal:s}).then(a=>a.json()).then(a=>G1(a,"Get counter").data),m5=({serverURL:e,lang:t,path:n,type:o,action:s})=>fetch(`${W1(e)}article?lang=${t}`,{method:"POST",headers:f5,body:JSON.stringify({path:n,type:o,action:s})}).then(a=>a.json()).then(a=>G1(a,"Update counter").data),v5=({serverURL:e,lang:t,paths:n,signal:o})=>h5({serverURL:e,lang:t,paths:n,type:["time"],signal:o}),g5=e=>m5({...e,type:"time",action:"inc"}),y5=(e="")=>e.replace(/\/$/u,""),b5=e=>/^(https?:)?\/\//.test(e),Pu=e=>{const t=y5(e);return b5(t)?t:`https://${t}`},_5=e=>{e.name!=="AbortError"&&console.error(e.message)},Du=e=>e.dataset.path??null,Fu=(e,t)=>{t.forEach((n,o)=>{const s=e[o].time;typeof s=="number"&&(n.innerText=s.toString())})},K1=({serverURL:e,path:t=window.location.pathname,selector:n=".waline-pageview-count",update:o=!0,lang:s=navigator.language})=>{const a=new AbortController,r=Array.from(document.querySelectorAll(n)),i=u=>{const d=Du(u);return d!==null&&t!==d},l=u=>v5({serverURL:Pu(e),paths:u.map(d=>Du(d)??t),lang:s,signal:a.signal}).then(d=>Fu(d,u)).catch(_5);if(o){const u=r.filter(p=>!i(p)),d=r.filter(i);g5({serverURL:Pu(e),path:t,lang:s}).then(p=>Fu(p,u)),d.length&&l(d)}else l(r);return a.abort.bind(a)};var k5={provider:"Waline",dark:'html[data-theme="dark"]',serverURL:"https://talk.oragekk.me/",reaction:!0,requiredMeta:["nick","mail"],wordLimit:300,emoji:["https://unpkg.com/@waline/emojis@1.1.0/tieba","https://unpkg.com/@waline/emojis@1.1.0/weibo","https://emoji.shojo.cn/bili/webp/tv_小电视_动图","https://emoji.shojo.cn/bili/webp/罗小黑战记","https://emoji.shojo.cn/bili/webp/2233娘","https://emoji.shojo.cn/bili/webp/装扮小姐姐梦幻冬季","https://emoji.shojo.cn/bili/webp/装扮小姐姐·秋日午后","https://emoji.shojo.cn/bili/webp/星尘","https://emoji.shojo.cn/bili/webp/池年"]};const w5=k5,E5=$(w5),J1=Symbol(""),Y1=()=>we(J1),Q1=Y1,B5=e=>{e.provide(J1,E5)},X1=()=>c("svg",{xmlns:"http://www.w3.org/2000/svg",width:"32",height:"32",preserveAspectRatio:"xMidYMid",viewBox:"0 0 100 100"},[c("circle",{cx:"28",cy:"75",r:"11",fill:"currentColor"},c("animate",{attributeName:"fill-opacity",begin:"0s",dur:"1s",keyTimes:"0;0.2;1",repeatCount:"indefinite",values:"0;1;1"})),c("path",{fill:"none",stroke:"#88baf0","stroke-width":"10",d:"M28 47a28 28 0 0 1 28 28"},c("animate",{attributeName:"stroke-opacity",begin:"0.1s",dur:"1s",keyTimes:"0;0.2;1",repeatCount:"indefinite",values:"0;1;1"})),c("path",{fill:"none",stroke:"#88baf0","stroke-width":"10",d:"M28 25a50 50 0 0 1 50 50"},c("animate",{attributeName:"stroke-opacity",begin:"0.2s",dur:"1s",keyTimes:"0;0.2;1",repeatCount:"indefinite",values:"0;1;1"}))]);X1.displayName="LoadingIcon";var A5={"/":{placeholder:"请留言。(填写邮箱可在被回复时收到邮件提醒)"}};const C5=A5;k(()=>import("./waline-meta-l0sNRNKZ.js"),[]);const S5=L({name:"WalineComment",props:{identifier:{type:String,required:!0}},setup(e){const t=Q1(),n=me(),o=_r(),s=Zn(C5);let a;const r=w(()=>!!t.value.serverURL),i=w(()=>{if(!r.value)return!1;const u=t.value.pageview!==!1,d=n.value.pageview;return!!d||u!==!1&&d!==!1}),l=w(()=>({lang:o.value==="zh-CN"?"zh-CN":"en",locale:s.value,dark:"html.dark",...t.value,path:e.identifier}));return ne(()=>{ce(()=>[e.identifier,t.value.serverURL,t.value.delay,i.value],()=>{a==null||a(),i.value&&ut().then(()=>Rl(t.value.delay||800)).then(()=>{setTimeout(()=>{a=K1({serverURL:t.value.serverURL,path:e.identifier})})})},{immediate:!0})}),()=>r.value?c("div",{id:"comment",class:"waline-wrapper"},c(Bp({loader:async()=>(await k(()=>import("./component-5fPsKYVS.js"),__vite__mapDeps([3,4]))).Waline,loadingComponent:X1}),l.value)):null}}),x5=L({name:"CommentService",props:{darkmode:Boolean},setup(e){const t=Y1(),n=Ee(),o=me(),s=w(()=>t.value.comment!==!1),a=w(()=>o.value.comment||s.value&&o.value.comment!==!1);return()=>c(S5,{id:"vp-comment",identifier:o.value.commentID||n.value.path,darkmode:e.darkmode,style:{display:a.value?"block":"none"}})}}),O5=Ve({enhance:({app:e})=>{B5(e),e.component("CommentService",x5)}}),T5=Object.freeze(Object.defineProperty({__proto__:null,default:O5},Symbol.toStringTag,{value:"Module"})),L5=/language-(shellscript|shell|bash|sh|zsh)/,I5=({delay:e=500,duration:t=2e3,locales:n,selector:o,showInMobile:s,ignoreSelector:a=[],transform:r})=>{const i=Nl("(max-width: 419px)"),l=w(()=>!i.value||s),u=Zn(n),d=Ee(),p=E=>{var B;if(E.hasAttribute("copy-code-registered"))return;const _=document.createElement("button");_.type="button",_.classList.add("vp-copy-code-button"),_.setAttribute("aria-label",u.value.copy),_.setAttribute("data-copied",u.value.copied),(B=E.parentElement)==null||B.insertBefore(_,E),E.setAttribute("copy-code-registered","")};ce(()=>[d.value.path,l.value],async()=>{document.body.classList.toggle("copy-code-disabled",!l.value),l.value&&(await ut(),await Rl(e),document.querySelectorAll(o.join(",")).forEach(p))},{immediate:!0});const{copy:h}=f6({legacy:!0}),m=new WeakMap,g=(E,_,B)=>{const y=_.cloneNode(!0);a.length&&y.querySelectorAll(a.join(",")).forEach(M=>M.remove()),r&&r(y);let C=y.textContent||"";L5.test(E.className)&&(C=C.replace(/^ *(\$|>) /gm,"")),h(C).then(()=>{if(t<=0)return;B.classList.add("copied"),clearTimeout(m.get(B));const M=setTimeout(()=>{B.classList.remove("copied"),B.blur(),m.delete(B)},t);m.set(B,M)})};xe("click",E=>{const _=E.target;if(l.value&&_.matches('div[class*="language-"] > button.vp-copy-code-button')){const B=_.parentElement,y=_.nextElementSibling;if(!B||!y)return;g(B,y,_)}})};var R5={"/":{copy:"复制代码",copied:"已复制"}},P5=['.theme-hope-content div[class*="language-"] pre'];const D5=Ve({setup:()=>{I5({selector:P5,locales:R5,duration:2e3,delay:500,showInMobile:!1})}}),F5=Object.freeze(Object.defineProperty({__proto__:null,default:D5},Symbol.toStringTag,{value:"Module"}));var M5={"/":{author:"著作权归:author所有",license:"基于:license协议",link:"原文链接::link"}},$5={canonical:"https://oragekk.me",author:"Oragekk",license:"CC BY-NC-SA 4.0",global:!0,disableCopy:!1,disableSelection:!1,triggerLength:100,maxLength:0};const Pn=$5,{canonical:Ca}=Pn,N5=()=>{const e=me(),t=Zn(M5),n=Ee(),o=w(()=>!!e.value.copy||e.value.copy!==!1&&Pn.global),s=w(()=>sn(e.value.copy)?e.value.copy:null),a=w(()=>{var h;return((h=s.value)==null?void 0:h.disableCopy)??Pn.disableCopy}),r=w(()=>{var h;return o.value?((h=s.value)==null?void 0:h.disableSelection)??Pn.disableSelection:!1}),i=w(()=>{var h;return o.value?((h=s.value)==null?void 0:h.maxLength)??Pn.maxLength:0}),l=w(()=>{var h;return((h=s.value)==null?void 0:h.triggerLength)??Pn.triggerLength}),u=()=>Ca?`${gr(Xn(Ca)?Ca:`https://${Ca}`)}${n.value.path}`:window.location.href,d=(h,m)=>{const{author:g,license:E,link:_}=t.value;return[h?g.replace(":author",h):"",m?E.replace(":license",m):"",_.replace(":link",u())].filter(B=>B).join(` + */const ye={settings:{minimum:.08,easing:"ease",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,barSelector:'[role="bar"]',parent:"body",template:'
    '},status:null,set:e=>{const t=ye.isStarted();e=Zr(e,ye.settings.minimum,1),ye.status=e===1?null:e;const n=ye.render(!t),o=n.querySelector(ye.settings.barSelector),s=ye.settings.speed,a=ye.settings.easing;return n.offsetWidth,n5(r=>{Aa(o,{transform:"translate3d("+Lu(e)+"%,0,0)",transition:"all "+s+"ms "+a}),e===1?(Aa(n,{transition:"none",opacity:"1"}),n.offsetWidth,setTimeout(()=>{Aa(n,{transition:"all "+s+"ms linear",opacity:"0"}),setTimeout(()=>{ye.remove(),r()},s)},s)):setTimeout(()=>r(),s)}),ye},isStarted:()=>typeof ye.status=="number",start:()=>{ye.status||ye.set(0);const e=()=>{setTimeout(()=>{ye.status&&(ye.trickle(),e())},ye.settings.trickleSpeed)};return ye.settings.trickle&&e(),ye},done:e=>!e&&!ye.status?ye:ye.inc(.3+.5*Math.random()).set(1),inc:e=>{let t=ye.status;return t?(typeof e!="number"&&(e=(1-t)*Zr(Math.random()*t,.1,.95)),t=Zr(t+e,0,.994),ye.set(t)):ye.start()},trickle:()=>ye.inc(Math.random()*ye.settings.trickleRate),render:e=>{if(ye.isRendered())return document.getElementById("nprogress");Iu(document.documentElement,"nprogress-busy");const t=document.createElement("div");t.id="nprogress",t.innerHTML=ye.settings.template;const n=t.querySelector(ye.settings.barSelector),o=e?"-100":Lu(ye.status||0),s=document.querySelector(ye.settings.parent);return Aa(n,{transition:"all 0 linear",transform:"translate3d("+o+"%,0,0)"}),s!==document.body&&Iu(s,"nprogress-custom-parent"),s==null||s.appendChild(t),t},remove:()=>{Ru(document.documentElement,"nprogress-busy"),Ru(document.querySelector(ye.settings.parent),"nprogress-custom-parent");const e=document.getElementById("nprogress");e&&o5(e)},isRendered:()=>!!document.getElementById("nprogress")},Zr=(e,t,n)=>en?n:e,Lu=e=>(-1+e)*100,n5=function(){const e=[];function t(){const n=e.shift();n&&n(t)}return function(n){e.push(n),e.length===1&&t()}}(),Aa=function(){const e=["Webkit","O","Moz","ms"],t={};function n(r){return r.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,function(i,l){return l.toUpperCase()})}function o(r){const i=document.body.style;if(r in i)return r;let l=e.length;const u=r.charAt(0).toUpperCase()+r.slice(1);let d;for(;l--;)if(d=e[l]+u,d in i)return d;return r}function s(r){return r=n(r),t[r]??(t[r]=o(r))}function a(r,i,l){i=s(i),r.style[i]=l}return function(r,i){for(const l in i){const u=i[l];u!==void 0&&Object.prototype.hasOwnProperty.call(i,l)&&a(r,l,u)}}}(),H1=(e,t)=>(typeof e=="string"?e:zl(e)).indexOf(" "+t+" ")>=0,Iu=(e,t)=>{const n=zl(e),o=n+t;H1(n,t)||(e.className=o.substring(1))},Ru=(e,t)=>{const n=zl(e);if(!H1(e,t))return;const o=n.replace(" "+t+" "," ");e.className=o.substring(1,o.length-1)},zl=e=>(" "+(e.className||"")+" ").replace(/\s+/gi," "),o5=e=>{e&&e.parentNode&&e.parentNode.removeChild(e)},s5=()=>{ne(()=>{const e=gt(),t=new Set;t.add(e.currentRoute.value.path),e.beforeEach(n=>{t.has(n.path)||ye.start()}),e.afterEach(n=>{t.add(n.path),ye.done()})})},a5=Ve({setup(){s5()}}),r5=Object.freeze(Object.defineProperty({__proto__:null,default:a5},Symbol.toStringTag,{value:"Module"})),i5=JSON.parse('{"encrypt":{"config":{"/demo/encrypt.html":["$2a$10$dBfCBUP2yE2DSWb7/B2zy.Ky5DOrzBV3lu.ka0Xt8KxVc9Tk/ngiG"]}},"themeColor":true,"fullscreen":true,"author":{"name":"Oragekk","url":"https://orgaekk.me"},"logo":"/logo.svg","repo":"OrageKK/oragekk.github.io","docsDir":"src","navbarLayout":{"start":["Brand"],"center":["Links"],"end":["Language","Repo","Wormhole","Travelling","Outlook","Search"]},"blog":{"medias":{"Email":"mailto:oragekk@163.com","GitHub":"https://github.com/OrageKK","Gmail":"mailto:oragekk@gmail.com","Rss":"./rss.xml"},"name":"上冬十二"},"locales":{"/":{"lang":"zh-CN","navbarLocales":{"langName":"简体中文","selectLangAriaLabel":"选择语言"},"metaLocales":{"author":"作者","date":"写作日期","origin":"原创","views":"访问量","category":"分类","tag":"标签","readingTime":"阅读时间","words":"字数","toc":"此页内容","prev":"上一页","next":"下一页","lastUpdated":"上次编辑于","contributors":"贡献者","editLink":"在 GitHub 上编辑此页","print":"打印"},"blogLocales":{"article":"文章","articleList":"文章列表","category":"分类","tag":"标签","timeline":"时间轴","timelineTitle":"昨日不在","all":"全部","intro":"个人介绍","star":"星标","empty":"$text 为空"},"paginationLocales":{"prev":"上一页","next":"下一页","navigate":"跳转到","action":"前往","errorText":"请输入 1 到 $page 之前的页码!"},"outlookLocales":{"themeColor":"主题色","darkmode":"外观","fullscreen":"全屏"},"encryptLocales":{"iconLabel":"文章已加密","placeholder":"输入密码","remember":"记住密码","errorHint":"请输入正确的密码"},"routeLocales":{"skipToContent":"跳至主要內容","notFoundTitle":"页面不存在","notFoundMsg":["这里什么也没有","我们是怎么来到这儿的?","这 是 四 零 四 !","看起来你访问了一个失效的链接"],"back":"返回上一页","home":"带我回家","openInNewWindow":"Open in new window"},"navbar":["/",{"text":"导航","icon":"discover","link":"/demo/"},{"text":"笔记分类","icon":"edit","children":[{"text":"代码笔记","prefix":"/posts/","children":[{"text":"iOS笔记","icon":"hk-apple","link":"iOS/"},{"text":"前端笔记","icon":"code","link":"Web/"},{"text":"Linux","icon":"linux","link":"Linux/"},{"text":"Python","icon":"python","link":"Python/"},{"text":"Rust","icon":"hk-rust","link":"Rust/"},{"text":"React","icon":"react","link":"cross-platform/ReactNative/"},{"text":"Flutter","icon":"hk-flutter","link":"cross-platform/Flutter/"}]},{"text":"博客相关","prefix":"/blog/","children":[{"text":"博客相关","icon":"blog","link":""}]}]},{"text":"软件教程","icon":"software","link":"/tutorial/"},{"text":"收藏","icon":"hk-shoucang1","link":"/collect"},{"text":"说说","icon":"news","link":"/news/"},{"text":"留言板","icon":"mark","link":"/visitorsbook"},{"text":"友链","icon":"link","link":"/friend"},{"text":"关于","icon":"info","children":[{"text":"关于我","icon":"people","link":"/intro"},{"text":"关于本站","icon":"info","link":"/about"}]}],"sidebar":{"/":["",{"text":"如何使用","icon":"creative","prefix":"demo/","link":"demo/","children":"structure"},{"text":"代码笔记","icon":"note","prefix":"posts/","children":[{"text":"iOS","icon":"hk-apple","prefix":"iOS/","link":"iOS/"},{"text":"跨平台开发","icon":"relation","prefix":"cross-platform/","link":"cross-platform/"},{"text":"前端开发","icon":"code","prefix":"Web/","link":"Web/"},{"text":"Linux","icon":"linux","prefix":"Linux/","link":"Linux/"},{"text":"Python","icon":"python","prefix":"Python/","link":"Python/"},{"text":"Rust","icon":"hk-rust","prefix":"Rust/","link":"Rust/"}]},{"text":"软件/工具教程","icon":"software","prefix":"tutorial/","link":"tutorial/"},{"text":"博客相关","icon":"blog","prefix":"blog/","link":"blog/"},{"text":"站点收藏","icon":"sitemap","prefix":"site","link":"site/","children":"structure"},{"text":"随笔","icon":"flower","prefix":"private/","children":"structure"},{"text":"关于","icon":"info","prefix":"about/","link":"about"}],"/posts/Linux/":"structure","/posts/Python/":"structure","/posts/cross-platform/Flutter/":"structure","/posts/cross-platform/ReactNative/":"structure","/posts/iOS/":"structure","/posts/Web/":"structure","/site/":"structure","/blog":"structure","/tutorial":"structure"},"footer":"默认页脚","displayFooter":false,"blog":{"description":"到最后,竟庆幸于夕阳仍留在身上","intro":"/intro.html"}}}}'),l5=$(i5),q1=()=>l5,U1=Symbol(""),c5=()=>{const e=we(U1);if(!e)throw new Error("useThemeLocaleData() is called without provider.");return e},u5=(e,t)=>{const{locales:n,...o}=e;return{...o,...n==null?void 0:n[t]}},d5=Ve({enhance({app:e}){const t=q1(),n=e._context.provides[Il],o=w(()=>u5(t.value,n.routeLocale.value));e.provide(U1,o),Object.defineProperties(e.config.globalProperties,{$theme:{get(){return t.value}},$themeLocale:{get(){return o.value}}})}}),p5=Object.freeze(Object.defineProperty({__proto__:null,default:d5},Symbol.toStringTag,{value:"Module"})),f5={"Content-Type":"application/json"},W1=e=>`${e.replace(/\/?$/,"/")}api/`,G1=(e,t="")=>{if(typeof e=="object"&&e.errno)throw new TypeError(`${t} failed with ${e.errno}: ${e.errmsg}`);return e},h5=({serverURL:e,lang:t,paths:n,type:o,signal:s})=>fetch(`${W1(e)}article?path=${encodeURIComponent(n.join(","))}&type=${encodeURIComponent(o.join(","))}&lang=${t}`,{signal:s}).then(a=>a.json()).then(a=>G1(a,"Get counter").data),m5=({serverURL:e,lang:t,path:n,type:o,action:s})=>fetch(`${W1(e)}article?lang=${t}`,{method:"POST",headers:f5,body:JSON.stringify({path:n,type:o,action:s})}).then(a=>a.json()).then(a=>G1(a,"Update counter").data),v5=({serverURL:e,lang:t,paths:n,signal:o})=>h5({serverURL:e,lang:t,paths:n,type:["time"],signal:o}),g5=e=>m5({...e,type:"time",action:"inc"}),y5=(e="")=>e.replace(/\/$/u,""),b5=e=>/^(https?:)?\/\//.test(e),Pu=e=>{const t=y5(e);return b5(t)?t:`https://${t}`},_5=e=>{e.name!=="AbortError"&&console.error(e.message)},Du=e=>e.dataset.path??null,Fu=(e,t)=>{t.forEach((n,o)=>{const s=e[o].time;typeof s=="number"&&(n.innerText=s.toString())})},K1=({serverURL:e,path:t=window.location.pathname,selector:n=".waline-pageview-count",update:o=!0,lang:s=navigator.language})=>{const a=new AbortController,r=Array.from(document.querySelectorAll(n)),i=u=>{const d=Du(u);return d!==null&&t!==d},l=u=>v5({serverURL:Pu(e),paths:u.map(d=>Du(d)??t),lang:s,signal:a.signal}).then(d=>Fu(d,u)).catch(_5);if(o){const u=r.filter(p=>!i(p)),d=r.filter(i);g5({serverURL:Pu(e),path:t,lang:s}).then(p=>Fu(p,u)),d.length&&l(d)}else l(r);return a.abort.bind(a)};var k5={provider:"Waline",dark:'html[data-theme="dark"]',serverURL:"https://talk.oragekk.me/",reaction:!0,requiredMeta:["nick","mail"],wordLimit:300,emoji:["https://unpkg.com/@waline/emojis@1.1.0/tieba","https://unpkg.com/@waline/emojis@1.1.0/weibo","https://emoji.shojo.cn/bili/webp/tv_小电视_动图","https://emoji.shojo.cn/bili/webp/罗小黑战记","https://emoji.shojo.cn/bili/webp/2233娘","https://emoji.shojo.cn/bili/webp/装扮小姐姐梦幻冬季","https://emoji.shojo.cn/bili/webp/装扮小姐姐·秋日午后","https://emoji.shojo.cn/bili/webp/星尘","https://emoji.shojo.cn/bili/webp/池年"]};const w5=k5,E5=$(w5),J1=Symbol(""),Y1=()=>we(J1),Q1=Y1,B5=e=>{e.provide(J1,E5)},X1=()=>c("svg",{xmlns:"http://www.w3.org/2000/svg",width:"32",height:"32",preserveAspectRatio:"xMidYMid",viewBox:"0 0 100 100"},[c("circle",{cx:"28",cy:"75",r:"11",fill:"currentColor"},c("animate",{attributeName:"fill-opacity",begin:"0s",dur:"1s",keyTimes:"0;0.2;1",repeatCount:"indefinite",values:"0;1;1"})),c("path",{fill:"none",stroke:"#88baf0","stroke-width":"10",d:"M28 47a28 28 0 0 1 28 28"},c("animate",{attributeName:"stroke-opacity",begin:"0.1s",dur:"1s",keyTimes:"0;0.2;1",repeatCount:"indefinite",values:"0;1;1"})),c("path",{fill:"none",stroke:"#88baf0","stroke-width":"10",d:"M28 25a50 50 0 0 1 50 50"},c("animate",{attributeName:"stroke-opacity",begin:"0.2s",dur:"1s",keyTimes:"0;0.2;1",repeatCount:"indefinite",values:"0;1;1"}))]);X1.displayName="LoadingIcon";var A5={"/":{placeholder:"请留言。(填写邮箱可在被回复时收到邮件提醒)"}};const C5=A5;k(()=>import("./waline-meta-l0sNRNKZ.js"),[]);const S5=L({name:"WalineComment",props:{identifier:{type:String,required:!0}},setup(e){const t=Q1(),n=me(),o=_r(),s=Zn(C5);let a;const r=w(()=>!!t.value.serverURL),i=w(()=>{if(!r.value)return!1;const u=t.value.pageview!==!1,d=n.value.pageview;return!!d||u!==!1&&d!==!1}),l=w(()=>({lang:o.value==="zh-CN"?"zh-CN":"en",locale:s.value,dark:"html.dark",...t.value,path:e.identifier}));return ne(()=>{ce(()=>[e.identifier,t.value.serverURL,t.value.delay,i.value],()=>{a==null||a(),i.value&&ut().then(()=>Rl(t.value.delay||800)).then(()=>{setTimeout(()=>{a=K1({serverURL:t.value.serverURL,path:e.identifier})})})},{immediate:!0})}),()=>r.value?c("div",{id:"comment",class:"waline-wrapper"},c(Bp({loader:async()=>(await k(()=>import("./component-XzbOLqsv.js"),__vite__mapDeps([3,4]))).Waline,loadingComponent:X1}),l.value)):null}}),x5=L({name:"CommentService",props:{darkmode:Boolean},setup(e){const t=Y1(),n=Ee(),o=me(),s=w(()=>t.value.comment!==!1),a=w(()=>o.value.comment||s.value&&o.value.comment!==!1);return()=>c(S5,{id:"vp-comment",identifier:o.value.commentID||n.value.path,darkmode:e.darkmode,style:{display:a.value?"block":"none"}})}}),O5=Ve({enhance:({app:e})=>{B5(e),e.component("CommentService",x5)}}),T5=Object.freeze(Object.defineProperty({__proto__:null,default:O5},Symbol.toStringTag,{value:"Module"})),L5=/language-(shellscript|shell|bash|sh|zsh)/,I5=({delay:e=500,duration:t=2e3,locales:n,selector:o,showInMobile:s,ignoreSelector:a=[],transform:r})=>{const i=Nl("(max-width: 419px)"),l=w(()=>!i.value||s),u=Zn(n),d=Ee(),p=E=>{var B;if(E.hasAttribute("copy-code-registered"))return;const _=document.createElement("button");_.type="button",_.classList.add("vp-copy-code-button"),_.setAttribute("aria-label",u.value.copy),_.setAttribute("data-copied",u.value.copied),(B=E.parentElement)==null||B.insertBefore(_,E),E.setAttribute("copy-code-registered","")};ce(()=>[d.value.path,l.value],async()=>{document.body.classList.toggle("copy-code-disabled",!l.value),l.value&&(await ut(),await Rl(e),document.querySelectorAll(o.join(",")).forEach(p))},{immediate:!0});const{copy:h}=f6({legacy:!0}),m=new WeakMap,g=(E,_,B)=>{const y=_.cloneNode(!0);a.length&&y.querySelectorAll(a.join(",")).forEach(M=>M.remove()),r&&r(y);let C=y.textContent||"";L5.test(E.className)&&(C=C.replace(/^ *(\$|>) /gm,"")),h(C).then(()=>{if(t<=0)return;B.classList.add("copied"),clearTimeout(m.get(B));const M=setTimeout(()=>{B.classList.remove("copied"),B.blur(),m.delete(B)},t);m.set(B,M)})};xe("click",E=>{const _=E.target;if(l.value&&_.matches('div[class*="language-"] > button.vp-copy-code-button')){const B=_.parentElement,y=_.nextElementSibling;if(!B||!y)return;g(B,y,_)}})};var R5={"/":{copy:"复制代码",copied:"已复制"}},P5=['.theme-hope-content div[class*="language-"] pre'];const D5=Ve({setup:()=>{I5({selector:P5,locales:R5,duration:2e3,delay:500,showInMobile:!1})}}),F5=Object.freeze(Object.defineProperty({__proto__:null,default:D5},Symbol.toStringTag,{value:"Module"}));var M5={"/":{author:"著作权归:author所有",license:"基于:license协议",link:"原文链接::link"}},$5={canonical:"https://oragekk.me",author:"Oragekk",license:"CC BY-NC-SA 4.0",global:!0,disableCopy:!1,disableSelection:!1,triggerLength:100,maxLength:0};const Pn=$5,{canonical:Ca}=Pn,N5=()=>{const e=me(),t=Zn(M5),n=Ee(),o=w(()=>!!e.value.copy||e.value.copy!==!1&&Pn.global),s=w(()=>sn(e.value.copy)?e.value.copy:null),a=w(()=>{var h;return((h=s.value)==null?void 0:h.disableCopy)??Pn.disableCopy}),r=w(()=>{var h;return o.value?((h=s.value)==null?void 0:h.disableSelection)??Pn.disableSelection:!1}),i=w(()=>{var h;return o.value?((h=s.value)==null?void 0:h.maxLength)??Pn.maxLength:0}),l=w(()=>{var h;return((h=s.value)==null?void 0:h.triggerLength)??Pn.triggerLength}),u=()=>Ca?`${gr(Xn(Ca)?Ca:`https://${Ca}`)}${n.value.path}`:window.location.href,d=(h,m)=>{const{author:g,license:E,link:_}=t.value;return[h?g.replace(":author",h):"",m?E.replace(":license",m):"",_.replace(":link",u())].filter(B=>B).join(` `)},p=()=>{if(Le(n.value.copyright))return n.value.copyright.replace(":link",u());const{author:h,license:m}=n.value.copyright||{};return d(h??Pn.author,m??Pn.license)},f=h=>{const m=getSelection();if(m){const g=m.getRangeAt(0);if(o.value){const E=g.toString().length;if(a.value||i.value&&E>i.value)return h.preventDefault();if(E>=l.value){h.preventDefault();const _=p(),B=document.createElement("div");B.appendChild(m.getRangeAt(0).cloneContents()),h.clipboardData&&(h.clipboardData.setData("text/html",`${B.innerHTML}
    `),h.clipboardData.setData("text/plain",`${m.getRangeAt(0).cloneContents().textContent||""} ------ ${_}`))}}}};ne(()=>{const h=document.querySelector("#app");xe(h,"copy",f),wl(()=>{h.style.userSelect=r.value?"none":"auto"})})},V5=Ve({setup:()=>{N5()}}),j5=Object.freeze(Object.defineProperty({__proto__:null,default:V5},Symbol.toStringTag,{value:"Module"})),er=()=>{const e=document.documentElement;return e.classList.contains("dark")||e.getAttribute("data-theme")==="dark"},z5=(e,t)=>t==="json"?JSON.parse(e):new Function(`let config,__chart_js_config__; @@ -802,10 +802,10 @@ ${e} __echarts_config__={width,height,option}; } return __echarts_config__; -`)(n):Promise.resolve({option:JSON.parse(e)});var _v=L({name:"ECharts",props:{config:{type:String,required:!0},id:{type:String,required:!0},title:{type:String,default:""},type:{type:String,default:"json"}},setup(e){const t=vv(),n=$(!0),o=ke();let s;return xe("resize",Fl(()=>s==null?void 0:s.resize(),100)),ne(()=>{Promise.all([k(()=>import("./index-wZ-hXvzw.js"),[]),new Promise(a=>setTimeout(a,800))]).then(async([a])=>{var l;await((l=t.setup)==null?void 0:l.call(t)),s=a.init(o.value);const{option:r,...i}=await bv(Kn(e.config),e.type,s);s.resize(i),s.setOption({...t.option,...r}),n.value=!1})}),wn(()=>{s==null||s.dispose()}),()=>[e.title?c("div",{class:"echarts-title"},decodeURIComponent(e.title)):null,c("div",{class:"echarts-wrapper"},[c("div",{ref:o,class:"echarts-container",id:e.id}),n.value?c(En,{class:"echarts-loading",height:360}):null])]}}),ql={x:0,y:0,"line-width":2,"line-length":40,"text-margin":8,"font-size":14,"font-color":"#8DA1AC","line-color":"#8DA1AC","element-color":"black",fill:"white","yes-text":"Yes","no-text":"No","arrow-end":"block",scale:1},kv={...ql,symbols:{start:{class:"start-element","font-color":"#fff",fill:"#595959","line-width":"0px"},end:{class:"end-element","font-color":"#fff",fill:"#595959","line-width":"0px"},operation:{class:"operation-element","font-color":"#fff",fill:"#1890ff","line-width":"0px"},inputoutput:{class:"inputoutput-element","font-color":"#fff",fill:"#1890ff","line-width":"0px"},subroutine:{class:"subroutine-element","font-color":"#fff",fill:"#FF485E","element-color":"#fff","line-color":"red"},condition:{class:"condition-element","font-color":"#fff",fill:"#FF485E","line-width":"0px"},parallel:{class:"parallel-element","font-color":"#fff",fill:"#1890ff","line-width":"0px"}}},wv={...ql,"line-width":1,symbols:{start:{class:"start-element",fill:"#ccc","line-color":"#5c6ac4","font-color":"#000"},end:{class:"end-element",fill:"#ccc","line-color":"#5c6ac4","font-color":"#000"},operation:{class:"operation-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},inputoutput:{class:"inputoutput-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},subroutine:{class:"subroutine-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},condition:{class:"condition-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},parallel:{class:"parallel-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"}}},Ev={...ql,symbols:{start:{class:"start-element","font-color":"#fff",fill:"#2F495F","line-width":"0px"},end:{class:"end-element","font-color":"#fff",fill:"#2F495F","line-width":"0px"},operation:{class:"operation-element","font-color":"#fff",fill:"#00BC7D","line-width":"0px"},inputoutput:{class:"inputoutput-element","font-color":"#fff",fill:"#EB4D5D","line-width":"0px"},subroutine:{class:"subroutine-element","font-color":"#fff",fill:"#937AC4","element-color":"#fff","line-color":"red"},condition:{class:"condition-element","font-color":"#fff",fill:"#FFB500","line-width":"0px"},parallel:{class:"parallel-element","font-color":"#fff",fill:"#2F495F","line-width":"0px"}}};const $u={ant:kv,vue:Ev,pie:wv};let Bv={};const of=Symbol(""),Av=()=>we(of),Cv=e=>{e.provide(of,Bv)};let Sv={};const sf=Symbol(""),xv=()=>we(sf),Ov=e=>{e.provide(sf,Sv)},Tv={autoResize:!0,showCompileOutput:!1,clearConsole:!1,layout:"horizontal",ssr:!1};let Lv=Tv;const af=Symbol(""),Iv=()=>we(af),Rv=e=>{e.provide(af,Lv)};var Pv=L({name:"FlowChart",props:{code:{type:String,required:!0},id:{type:String,required:!0},preset:{type:String,default:"vue"}},setup(e){let t=null;const n=ke(),o=$(!0),s=$(1),a=w(()=>$u[e.preset]||(console.warn(`[md-enhance:flowchart] Unknown preset: ${e.preset}`),$u.vue)),r=i=>i<419?.8:i>1280?1:.9;return ne(()=>{Promise.all([k(()=>import("./flowchart-966sEcGG.js"),[]),new Promise(i=>setTimeout(i,800))]).then(([{parse:i}])=>{t=i(Kn(e.code)),s.value=r(window.innerWidth),o.value=!1,t.draw(e.id,{...a.value,scale:s.value})}),xe("resize",Fl(()=>{if(t){const i=r(window.innerWidth);s.value!==i&&(s.value=i,t.draw(e.id,{...a.value,scale:i}))}},100))}),()=>[o.value?c(En,{class:"flowchart-loading",height:192}):null,c("div",{ref:n,class:["flowchart-wrapper",e.preset],id:e.id,style:{display:o.value?"none":"block"}})]}});const Dv=()=>{xe("beforeprint",()=>{document.querySelectorAll("details").forEach(e=>{e.open=!0})})},Co={useMaxWidth:!1},Fv=e=>({dark:e,background:e?"#1e1e1e":"#fff",primaryColor:e?"#389d70":"#4abf8a",primaryBorderColor:e?"#389d70":"#4abf8a",primaryTextColor:e?"#fff":"#000",secondaryColor:"#ffb500",secondaryBorderColor:e?"#fff":"#000",secondaryTextColor:e?"#ddd":"#333",tertiaryColor:e?"#282828":"#efeef4",tertiaryBorderColor:e?"#bbb":"#242424",tertiaryTextColor:e?"#ddd":"#333",noteBkgColor:e?"#f6d365":"#fff5ad",noteTextColor:"#242424",noteBorderColor:e?"#f6d365":"#333",lineColor:e?"#d3d3d3":"#333",textColor:e?"#fff":"#242424",mainBkg:e?"#389d70":"#4abf8a",errorBkgColor:"#eb4d5d",errorTextColor:"#fff",nodeBorder:e?"#389d70":"#4abf8a",nodeTextColor:e?"#fff":"#242424",signalTextColor:e?"#9e9e9e":"#242424",classText:"#fff",labelColor:"#fff",attributeBackgroundColorEven:e?"#0d1117":"#fff",attributeBackgroundColorOdd:e?"#161b22":"#f8f8f8",fillType0:e?"#cf1322":"#f1636e",fillType1:"#f39c12",fillType2:"#2ecc71",fillType3:"#fa541c",fillType4:"#25a55b",fillType5:"#13c2c2",fillType6:"#096dd9",fillType7:"#aa6fe9"});var Mv=L({name:"Mermaid",props:{id:{type:String,required:!0},code:{type:String,required:!0},title:{type:String,default:""}},setup(e){const{themeVariables:t,...n}=Av(),o=ke(),s=w(()=>Kn(e.code)),a=$(""),r=$(!1);let i=!1;const l=async()=>{const[{default:p}]=await Promise.all([k(()=>import("./mermaid.core-H5Ux720q.js").then(f=>f.b6),__vite__mapDeps([5,4])),i?Promise.resolve():(i=!0,new Promise(f=>setTimeout(f,800)))]);p.initialize({theme:"base",themeVariables:{...Fv(r.value),...um(t)?t(r.value):t},flowchart:Co,sequence:Co,journey:Co,gantt:Co,er:Co,pie:Co,...n,startOnLoad:!1}),a.value=(await p.render(e.id,s.value)).svg},u=()=>{const{body:p}=document,f=document.createElement("div");f.classList.add("mermaid-preview"),f.innerHTML=a.value,p.appendChild(f),f.addEventListener("click",()=>{p.removeChild(f)})},d=()=>{const p=`data:image/svg+xml;charset=utf8,${a.value.replace(/
    /g,"
    ").replace(/%/g,"%25").replace(/"/g,"%22").replace(/'/g,"%27").replace(/&/g,"%26").replace(/#/g,"%23").replace(/{/g,"%7B").replace(/}/g,"%7D").replace(//g,"%3E")}`,f=document.createElement("a");f.setAttribute("href",p),f.setAttribute("download",`${e.title?Kn(e.title):e.id}.svg`),f.click()};return ne(()=>{r.value=er(),l(),$l(document.documentElement,()=>{r.value=er()},{attributeFilter:["class","data-theme"],attributes:!0}),ce(r,()=>l())}),()=>[c("div",{class:"mermaid-actions"},[c("button",{class:"preview-button",onClick:()=>u(),title:"preview",innerHTML:''}),c("button",{class:"download-button",onClick:()=>d(),title:"download",innerHTML:''})]),c("div",{ref:o,class:"mermaid-wrapper"},a.value?c("div",{class:"mermaid-content",innerHTML:a.value}):c(En,{class:"mermaid-loading",height:96}))]}});const rf=({title:e="",link:t})=>c("div",{class:"vp-playground"},[c("div",{class:"vp-playground-header"},[e?c("div",{class:"vp-playground-title"},decodeURIComponent(e)):null,c("div",{class:"vp-playground-actions"},[c("a",{class:"vp-playground-action",href:decodeURIComponent(t),target:"_blank",innerHTML:J5})])]),c("div",{class:"vp-playground-container"},c("iframe",{src:decodeURIComponent(t)}))]);rf.displayName="Playground";const $v=()=>[k(()=>import("./reveal.esm-CYbl4_PU.js"),[]),k(()=>import("./markdown.esm-BG2Xu2Hd.js"),[]),k(()=>import("./highlight.esm-C34tS8ua.js"),[]),k(()=>import("./math.esm-DN7Rh_EM.js"),[]),k(()=>import("./search.esm-DuBqnxcF.js"),[]),k(()=>import("./notes.esm-DcquA2oP.js"),[]),k(()=>import("./zoom.esm-Ctj_eavO.js"),[])];var Nv=L({name:"RevealJs",props:{id:{type:String,required:!0},code:{type:String,required:!0},theme:{type:String,default:"auto"}},setup(e){const t=xv(),n=me(),o=$(""),s=$(!0),a=ke();let r=null;const i=async l=>{const u=[new Promise(h=>setTimeout(h,800)),...$v()],[,d,...p]=await Promise.all(u),f=new d.default(l,{backgroundTransition:"slide",hash:n.value.layout==="Slide",mouseWheel:n.value.layout==="Slide",transition:"slide",slideNumber:!0,...t,...n.value.revealJs,embedded:n.value.layout!=="Slide",markdown:{separator:`^\r?\\n---\r? +`)(n):Promise.resolve({option:JSON.parse(e)});var _v=L({name:"ECharts",props:{config:{type:String,required:!0},id:{type:String,required:!0},title:{type:String,default:""},type:{type:String,default:"json"}},setup(e){const t=vv(),n=$(!0),o=ke();let s;return xe("resize",Fl(()=>s==null?void 0:s.resize(),100)),ne(()=>{Promise.all([k(()=>import("./index-wZ-hXvzw.js"),[]),new Promise(a=>setTimeout(a,800))]).then(async([a])=>{var l;await((l=t.setup)==null?void 0:l.call(t)),s=a.init(o.value);const{option:r,...i}=await bv(Kn(e.config),e.type,s);s.resize(i),s.setOption({...t.option,...r}),n.value=!1})}),wn(()=>{s==null||s.dispose()}),()=>[e.title?c("div",{class:"echarts-title"},decodeURIComponent(e.title)):null,c("div",{class:"echarts-wrapper"},[c("div",{ref:o,class:"echarts-container",id:e.id}),n.value?c(En,{class:"echarts-loading",height:360}):null])]}}),ql={x:0,y:0,"line-width":2,"line-length":40,"text-margin":8,"font-size":14,"font-color":"#8DA1AC","line-color":"#8DA1AC","element-color":"black",fill:"white","yes-text":"Yes","no-text":"No","arrow-end":"block",scale:1},kv={...ql,symbols:{start:{class:"start-element","font-color":"#fff",fill:"#595959","line-width":"0px"},end:{class:"end-element","font-color":"#fff",fill:"#595959","line-width":"0px"},operation:{class:"operation-element","font-color":"#fff",fill:"#1890ff","line-width":"0px"},inputoutput:{class:"inputoutput-element","font-color":"#fff",fill:"#1890ff","line-width":"0px"},subroutine:{class:"subroutine-element","font-color":"#fff",fill:"#FF485E","element-color":"#fff","line-color":"red"},condition:{class:"condition-element","font-color":"#fff",fill:"#FF485E","line-width":"0px"},parallel:{class:"parallel-element","font-color":"#fff",fill:"#1890ff","line-width":"0px"}}},wv={...ql,"line-width":1,symbols:{start:{class:"start-element",fill:"#ccc","line-color":"#5c6ac4","font-color":"#000"},end:{class:"end-element",fill:"#ccc","line-color":"#5c6ac4","font-color":"#000"},operation:{class:"operation-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},inputoutput:{class:"inputoutput-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},subroutine:{class:"subroutine-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},condition:{class:"condition-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"},parallel:{class:"parallel-element",fill:"#f1f1f1","line-color":"#5c6ac4","font-color":"#000"}}},Ev={...ql,symbols:{start:{class:"start-element","font-color":"#fff",fill:"#2F495F","line-width":"0px"},end:{class:"end-element","font-color":"#fff",fill:"#2F495F","line-width":"0px"},operation:{class:"operation-element","font-color":"#fff",fill:"#00BC7D","line-width":"0px"},inputoutput:{class:"inputoutput-element","font-color":"#fff",fill:"#EB4D5D","line-width":"0px"},subroutine:{class:"subroutine-element","font-color":"#fff",fill:"#937AC4","element-color":"#fff","line-color":"red"},condition:{class:"condition-element","font-color":"#fff",fill:"#FFB500","line-width":"0px"},parallel:{class:"parallel-element","font-color":"#fff",fill:"#2F495F","line-width":"0px"}}};const $u={ant:kv,vue:Ev,pie:wv};let Bv={};const of=Symbol(""),Av=()=>we(of),Cv=e=>{e.provide(of,Bv)};let Sv={};const sf=Symbol(""),xv=()=>we(sf),Ov=e=>{e.provide(sf,Sv)},Tv={autoResize:!0,showCompileOutput:!1,clearConsole:!1,layout:"horizontal",ssr:!1};let Lv=Tv;const af=Symbol(""),Iv=()=>we(af),Rv=e=>{e.provide(af,Lv)};var Pv=L({name:"FlowChart",props:{code:{type:String,required:!0},id:{type:String,required:!0},preset:{type:String,default:"vue"}},setup(e){let t=null;const n=ke(),o=$(!0),s=$(1),a=w(()=>$u[e.preset]||(console.warn(`[md-enhance:flowchart] Unknown preset: ${e.preset}`),$u.vue)),r=i=>i<419?.8:i>1280?1:.9;return ne(()=>{Promise.all([k(()=>import("./flowchart-966sEcGG.js"),[]),new Promise(i=>setTimeout(i,800))]).then(([{parse:i}])=>{t=i(Kn(e.code)),s.value=r(window.innerWidth),o.value=!1,t.draw(e.id,{...a.value,scale:s.value})}),xe("resize",Fl(()=>{if(t){const i=r(window.innerWidth);s.value!==i&&(s.value=i,t.draw(e.id,{...a.value,scale:i}))}},100))}),()=>[o.value?c(En,{class:"flowchart-loading",height:192}):null,c("div",{ref:n,class:["flowchart-wrapper",e.preset],id:e.id,style:{display:o.value?"none":"block"}})]}});const Dv=()=>{xe("beforeprint",()=>{document.querySelectorAll("details").forEach(e=>{e.open=!0})})},Co={useMaxWidth:!1},Fv=e=>({dark:e,background:e?"#1e1e1e":"#fff",primaryColor:e?"#389d70":"#4abf8a",primaryBorderColor:e?"#389d70":"#4abf8a",primaryTextColor:e?"#fff":"#000",secondaryColor:"#ffb500",secondaryBorderColor:e?"#fff":"#000",secondaryTextColor:e?"#ddd":"#333",tertiaryColor:e?"#282828":"#efeef4",tertiaryBorderColor:e?"#bbb":"#242424",tertiaryTextColor:e?"#ddd":"#333",noteBkgColor:e?"#f6d365":"#fff5ad",noteTextColor:"#242424",noteBorderColor:e?"#f6d365":"#333",lineColor:e?"#d3d3d3":"#333",textColor:e?"#fff":"#242424",mainBkg:e?"#389d70":"#4abf8a",errorBkgColor:"#eb4d5d",errorTextColor:"#fff",nodeBorder:e?"#389d70":"#4abf8a",nodeTextColor:e?"#fff":"#242424",signalTextColor:e?"#9e9e9e":"#242424",classText:"#fff",labelColor:"#fff",attributeBackgroundColorEven:e?"#0d1117":"#fff",attributeBackgroundColorOdd:e?"#161b22":"#f8f8f8",fillType0:e?"#cf1322":"#f1636e",fillType1:"#f39c12",fillType2:"#2ecc71",fillType3:"#fa541c",fillType4:"#25a55b",fillType5:"#13c2c2",fillType6:"#096dd9",fillType7:"#aa6fe9"});var Mv=L({name:"Mermaid",props:{id:{type:String,required:!0},code:{type:String,required:!0},title:{type:String,default:""}},setup(e){const{themeVariables:t,...n}=Av(),o=ke(),s=w(()=>Kn(e.code)),a=$(""),r=$(!1);let i=!1;const l=async()=>{const[{default:p}]=await Promise.all([k(()=>import("./mermaid.core-Bk1eNDay.js").then(f=>f.b6),__vite__mapDeps([5,4])),i?Promise.resolve():(i=!0,new Promise(f=>setTimeout(f,800)))]);p.initialize({theme:"base",themeVariables:{...Fv(r.value),...um(t)?t(r.value):t},flowchart:Co,sequence:Co,journey:Co,gantt:Co,er:Co,pie:Co,...n,startOnLoad:!1}),a.value=(await p.render(e.id,s.value)).svg},u=()=>{const{body:p}=document,f=document.createElement("div");f.classList.add("mermaid-preview"),f.innerHTML=a.value,p.appendChild(f),f.addEventListener("click",()=>{p.removeChild(f)})},d=()=>{const p=`data:image/svg+xml;charset=utf8,${a.value.replace(/
    /g,"
    ").replace(/%/g,"%25").replace(/"/g,"%22").replace(/'/g,"%27").replace(/&/g,"%26").replace(/#/g,"%23").replace(/{/g,"%7B").replace(/}/g,"%7D").replace(//g,"%3E")}`,f=document.createElement("a");f.setAttribute("href",p),f.setAttribute("download",`${e.title?Kn(e.title):e.id}.svg`),f.click()};return ne(()=>{r.value=er(),l(),$l(document.documentElement,()=>{r.value=er()},{attributeFilter:["class","data-theme"],attributes:!0}),ce(r,()=>l())}),()=>[c("div",{class:"mermaid-actions"},[c("button",{class:"preview-button",onClick:()=>u(),title:"preview",innerHTML:''}),c("button",{class:"download-button",onClick:()=>d(),title:"download",innerHTML:''})]),c("div",{ref:o,class:"mermaid-wrapper"},a.value?c("div",{class:"mermaid-content",innerHTML:a.value}):c(En,{class:"mermaid-loading",height:96}))]}});const rf=({title:e="",link:t})=>c("div",{class:"vp-playground"},[c("div",{class:"vp-playground-header"},[e?c("div",{class:"vp-playground-title"},decodeURIComponent(e)):null,c("div",{class:"vp-playground-actions"},[c("a",{class:"vp-playground-action",href:decodeURIComponent(t),target:"_blank",innerHTML:J5})])]),c("div",{class:"vp-playground-container"},c("iframe",{src:decodeURIComponent(t)}))]);rf.displayName="Playground";const $v=()=>[k(()=>import("./reveal.esm-CYbl4_PU.js"),[]),k(()=>import("./markdown.esm-BG2Xu2Hd.js"),[]),k(()=>import("./highlight.esm-C34tS8ua.js"),[]),k(()=>import("./math.esm-DN7Rh_EM.js"),[]),k(()=>import("./search.esm-DuBqnxcF.js"),[]),k(()=>import("./notes.esm-DcquA2oP.js"),[]),k(()=>import("./zoom.esm-Ctj_eavO.js"),[])];var Nv=L({name:"RevealJs",props:{id:{type:String,required:!0},code:{type:String,required:!0},theme:{type:String,default:"auto"}},setup(e){const t=xv(),n=me(),o=$(""),s=$(!0),a=ke();let r=null;const i=async l=>{const u=[new Promise(h=>setTimeout(h,800)),...$v()],[,d,...p]=await Promise.all(u),f=new d.default(l,{backgroundTransition:"slide",hash:n.value.layout==="Slide",mouseWheel:n.value.layout==="Slide",transition:"slide",slideNumber:!0,...t,...n.value.revealJs,embedded:n.value.layout!=="Slide",markdown:{separator:`^\r?\\n---\r? $`,verticalSeparator:`^\r? --\r? -$`},plugins:[...p.map(({default:h})=>h),...t.plugins??[]]});return await f.initialize(),f};return ne(async()=>{const l=a.value;l&&(o.value=Kn(e.code),l.setAttribute("id",e.id),l.setAttribute("data-theme",e.theme),r=await i(l),s.value=!1)}),wn(()=>{r==null||r.destroy()}),()=>c("div",{class:"vp-reveal"},[c("div",{ref:a,class:["reveal","reveal-viewport"]},c("div",{class:"slides",innerHTML:`
    如何利用GitHub Action提交URL到搜索引擎 | Oragekk's Blog - + @@ -100,6 +100,6 @@ path: prev
  • 拉取main分支代码到路径main

  • 安装python环境并设置缓存

  • 安装python依赖库

  • 运行脚本读取配置在仓库-->Settings-->Secrets and variables-->Actions-->Repository secrets中的环境变量,并把上次提交的sitemap.xml和本次提交的sitemap.xml作为命令行参数提交给python脚本

    Repository secrets
    Repository secrets

    1. 设置步骤的输出参数 ↩︎

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/blog/disqus.html b/blog/disqus.html index b27fa215a..7d772ecbe 100644 --- a/blog/disqus.html +++ b/blog/disqus.html @@ -30,13 +30,13 @@ 评论系统从多说迁移到disqus指南 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/blog/index.html b/blog/index.html index 539525f81..bd3615643 100644 --- a/blog/index.html +++ b/blog/index.html @@ -30,13 +30,13 @@ Blog相关 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/blog/jekyll.html b/blog/jekyll.html index 42d43151c..2f6ab9493 100644 --- a/blog/jekyll.html +++ b/blog/jekyll.html @@ -30,13 +30,13 @@ Jekyll旧站回忆 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/blog/waline-mail.html b/blog/waline-mail.html index 63601c8fb..570116379 100644 --- a/blog/waline-mail.html +++ b/blog/waline-mail.html @@ -30,7 +30,7 @@ 评论插件 Waline 之邮件通知配置 | Oragekk's Blog - + @@ -145,6 +145,6 @@ });

    4. 结语

    至此,大功告成,所有的注意点我都写在上边了

    此模版来自SaraKale[4],经小波同学修改美化
    其他模版同理,可以去SaraKale这里看看


    1. https://waline.js.org/guide/features/notification.html ↩︎

    2. 如 163 的 SMTP 授权码只生成一次,要复制存下来,如果丢失,后续不会再显示,只能重新生成 ↩︎

    3. Vercel 的环境变量大小限制为 4KB ,所以如果您的模板很长,请使用代码配置, ↩︎

    4. waline 邮件通知模板样式一览 ↩︎

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/category/about/index.html b/category/about/index.html index a88267546..ba8f43806 100644 --- a/category/about/index.html +++ b/category/about/index.html @@ -30,7 +30,7 @@ About 分类 | Oragekk's Blog - + @@ -44,6 +44,6 @@

    Profile


    Oragekk...大约 1 分钟AboutAbout
    - + diff --git a/category/ai/index.html b/category/ai/index.html index dfdcf9a63..7f5ff8a87 100644 --- a/category/ai/index.html +++ b/category/ai/index.html @@ -30,7 +30,7 @@ AI 分类 | Oragekk's Blog - + @@ -41,6 +41,6 @@

    这是一片无尽的复杂海洋,需要把技术堆栈融合在一起,来引导、编译、测试、部署、监控应用程序。


    Oragekk原创...大约 9 分钟AIAI
    - + diff --git a/category/blog/index.html b/category/blog/index.html index 48e14d08a..fefc964d6 100644 --- a/category/blog/index.html +++ b/category/blog/index.html @@ -30,7 +30,7 @@ Blog 分类 | Oragekk's Blog - + @@ -69,6 +69,6 @@

    前言

    终于可以有自己的自留地了,之前一直在简书上写一些技术类的文章,这次可以有个自己的地盘,想怎么写就怎么写。😝 哈哈。不过这些前端的东西对我也是一种挑战,似懂非懂的看着模板,和一堆 js+css+html 的代码。。一顿头大。。对照着效果,一步步自己改。改好了之后也是蛮有成就感的嘛


    Oragekk...大约 3 分钟BlogBlog
    - + diff --git a/category/css/index.html b/category/css/index.html index b607b2852..2854e4c05 100644 --- a/category/css/index.html +++ b/category/css/index.html @@ -30,7 +30,7 @@ CSS 分类 | Oragekk's Blog - + @@ -47,6 +47,6 @@

    好吧,如果你对包含块的知识一无所知,那么系好安全带,咱们准备出发了。


    Oragekk...大约 8 分钟CSS前端开发
    - + diff --git a/category/dart/index.html b/category/dart/index.html index 08664a860..ef55f67e2 100644 --- a/category/dart/index.html +++ b/category/dart/index.html @@ -30,7 +30,7 @@ Dart 分类 | Oragekk's Blog - + @@ -38,6 +38,6 @@

    在应用中,所有的 Dart 代码都在 isolate 中运行。每一个 Dart 的 isolate 都有独立的运行线程,它们无法与其他 isolate 共享可变对象。在需要进行通信的场景里,isolate 会使用消息机制。很多 Dart 应用都只使用一个 isolate,也就是 main isolate。你可以创建额外的 isolate 以便在多个处理器核心上执行并行代码。


    Oragekk...大约 14 分钟FlutterDartDart
    - + diff --git a/category/flutter/index.html b/category/flutter/index.html index e89f16159..d87cf98a3 100644 --- a/category/flutter/index.html +++ b/category/flutter/index.html @@ -30,7 +30,7 @@ Flutter 分类 | Oragekk's Blog - + @@ -47,6 +47,6 @@

    积极可组合性

    demo是照着B站的视频敲的,现在可能用不上了,但是还是觉得当时写的demo对于想学习flutter的新手来说作用还是有的,因为视频课程很零散,所以我边看边写了一个app,里边基本介绍了大部分基础的用法,当然进阶的东西,这部分demo是没有的,最近也在忙,有空了再补一部分进阶的东西吧


    Oragekk...大约 1 分钟Flutter前端跨平台Flutter
    - + diff --git a/category/git/index.html b/category/git/index.html index 1997d2ce7..8e972eac2 100644 --- a/category/git/index.html +++ b/category/git/index.html @@ -30,7 +30,7 @@ Git 分类 | Oragekk's Blog - + @@ -41,6 +41,6 @@

    生成 SSH 密钥对


    Oragekk...大约 2 分钟Gitssh_key
    - + diff --git a/category/github/index.html b/category/github/index.html index 64cf8264e..4abeb1aad 100644 --- a/category/github/index.html +++ b/category/github/index.html @@ -30,7 +30,7 @@ GitHub 分类 | Oragekk's Blog - + @@ -50,6 +50,6 @@

    GitHub Actions 是什么?

    很多操作在不同项目里面是类似的,完全可以共享。GitHub 注意到了这一点,想出了一个很妙的点子,允许开发者把每个操作写成独立的脚本文件,存放到代码仓库,使得其他开发者可以引用。


    Oragekk...大约 8 分钟GitHubGitHub Actions
    - + diff --git a/category/index.html b/category/index.html index 59e63c35b..0523458bc 100644 --- a/category/index.html +++ b/category/index.html @@ -30,13 +30,13 @@ 分类 | Oragekk's Blog - + - + diff --git a/category/ios/index.html b/category/ios/index.html index f63787fdd..54beedda0 100644 --- a/category/ios/index.html +++ b/category/ios/index.html @@ -30,7 +30,7 @@ iOS 分类 | Oragekk's Blog - + @@ -138,6 +138,6 @@

    效果


    Oragekk...大约 1 分钟iOSiOSDemo
    - + diff --git a/category/javascript/index.html b/category/javascript/index.html index 208e7dec0..0da6f1d91 100644 --- a/category/javascript/index.html +++ b/category/javascript/index.html @@ -30,7 +30,7 @@ JavaScript 分类 | Oragekk's Blog - + @@ -79,6 +79,6 @@

    废话不多说,上代码

    Catalog


    Oragekk...大约 8 分钟JavaScript前端开发JavaScript
    - + diff --git a/category/linux/index.html b/category/linux/index.html index c320159b7..3fa871a21 100644 --- a/category/linux/index.html +++ b/category/linux/index.html @@ -30,7 +30,7 @@ Linux 分类 | Oragekk's Blog - + @@ -84,6 +84,6 @@

    Catagory


    Oragekk...大约 8 分钟LinuxOSUnixLinux
    - + diff --git a/category/python/index.html b/category/python/index.html index b48ae4993..a58cd99a1 100644 --- a/category/python/index.html +++ b/category/python/index.html @@ -30,7 +30,7 @@ python 分类 | Oragekk's Blog - + @@ -48,6 +48,6 @@
    Oragekk原创...大约 2 分钟python工具脚本
    - + diff --git a/category/rust/index.html b/category/rust/index.html index 5a524ffb7..389e189bf 100644 --- a/category/rust/index.html +++ b/category/rust/index.html @@ -30,7 +30,7 @@ rust 分类 | Oragekk's Blog - + @@ -39,6 +39,6 @@

    在紧锣密鼓的开发过程中,Rust 建立了一个强大且活跃的社区,形成一整套完善稳定的项目贡献机制(Rust 能够飞速发展,与这一点密不可分)。Rust 现在由 Rust 项目开发者社区 维护, Rust 基金会赞助支持。


    Oragekk...大约 9 分钟rustrust
    - + diff --git a/category/swift/index.html b/category/swift/index.html index 8b32860cf..e852aa4d7 100644 --- a/category/swift/index.html +++ b/category/swift/index.html @@ -30,7 +30,7 @@ Swift 分类 | Oragekk's Blog - + @@ -50,6 +50,6 @@

    概述


    Oragekk...大约 4 分钟SwiftiOSSwift
    - + diff --git a/category/vercel/index.html b/category/vercel/index.html index d1e16155f..20a7e3496 100644 --- a/category/vercel/index.html +++ b/category/vercel/index.html @@ -30,7 +30,7 @@ Vercel 分类 | Oragekk's Blog - + @@ -39,6 +39,6 @@
    Oragekk原创...大约 5 分钟VercelVercel
    - + diff --git a/category/vue/index.html b/category/vue/index.html index d9870d6e8..1bc326758 100644 --- a/category/vue/index.html +++ b/category/vue/index.html @@ -30,7 +30,7 @@ Vue 分类 | Oragekk's Blog - + @@ -59,6 +59,6 @@
    Oragekk...大约 11 分钟VueVue响应式
    - + diff --git "a/category/\344\275\277\347\224\250\346\214\207\345\215\227/index.html" "b/category/\344\275\277\347\224\250\346\214\207\345\215\227/index.html" index 9d9887655..fff4ac138 100644 --- "a/category/\344\275\277\347\224\250\346\214\207\345\215\227/index.html" +++ "b/category/\344\275\277\347\224\250\346\214\207\345\215\227/index.html" @@ -30,7 +30,7 @@ 使用指南 分类 | Oragekk's Blog - + @@ -55,6 +55,6 @@
    Ms.Hope...大约 1 分钟使用指南页面配置使用指南
    - + diff --git "a/category/\345\211\215\347\253\257\350\267\250\345\271\263\345\217\260/index.html" "b/category/\345\211\215\347\253\257\350\267\250\345\271\263\345\217\260/index.html" index 01441d714..23caebf83 100644 --- "a/category/\345\211\215\347\253\257\350\267\250\345\271\263\345\217\260/index.html" +++ "b/category/\345\211\215\347\253\257\350\267\250\345\271\263\345\217\260/index.html" @@ -30,7 +30,7 @@ 前端跨平台 分类 | Oragekk's Blog - + @@ -69,6 +69,6 @@

    前置知识

    React Native 看起来很像 React,只不过其基础组件是原生组件而非 web 组件。要理解 React Native 应用的基本结构,首先需要了解一些基本的 React 的概念,比如 JSX 语法、组件、state状态以及props属性。如果你已经了解了 React,那么还需要掌握一些 React Native 特有的知识,比如原生组件的使用。


    Oragekk...大约 4 分钟前端跨平台前端React Native
    - + diff --git "a/category/\345\267\245\345\205\267\346\225\231\347\250\213/index.html" "b/category/\345\267\245\345\205\267\346\225\231\347\250\213/index.html" index 36eaffeed..f5cc15afa 100644 --- "a/category/\345\267\245\345\205\267\346\225\231\347\250\213/index.html" +++ "b/category/\345\267\245\345\205\267\346\225\231\347\250\213/index.html" @@ -30,7 +30,7 @@ 工具教程 分类 | Oragekk's Blog - + @@ -44,6 +44,6 @@

    1.1. 勾选【触发远程构建】并填入 token

    勾选远程构建开关
    勾选远程构建开关

    Oragekk原创...大约 3 分钟工具教程Jenkins
    - + diff --git "a/category/\345\274\200\346\272\220\350\275\257\344\273\266/index.html" "b/category/\345\274\200\346\272\220\350\275\257\344\273\266/index.html" index c6bbb5349..03cd099d7 100644 --- "a/category/\345\274\200\346\272\220\350\275\257\344\273\266/index.html" +++ "b/category/\345\274\200\346\272\220\350\275\257\344\273\266/index.html" @@ -30,7 +30,7 @@ 开源软件 分类 | Oragekk's Blog - + @@ -46,6 +46,6 @@


    Oragekk原创...大约 1 分钟开源软件GitHubGitHub
    - + diff --git "a/category/\346\224\266\350\227\217/index.html" "b/category/\346\224\266\350\227\217/index.html" index 58e80595a..a03ae1a1f 100644 --- "a/category/\346\224\266\350\227\217/index.html" +++ "b/category/\346\224\266\350\227\217/index.html" @@ -30,7 +30,7 @@ 收藏 分类 | Oragekk's Blog - + @@ -46,6 +46,6 @@

    工具类


    Oragekk...小于 1 分钟收藏工具网站
    - + diff --git "a/category/\346\265\217\350\247\210\345\231\250/index.html" "b/category/\346\265\217\350\247\210\345\231\250/index.html" index 68d49e7b7..27d7ef6b6 100644 --- "a/category/\346\265\217\350\247\210\345\231\250/index.html" +++ "b/category/\346\265\217\350\247\210\345\231\250/index.html" @@ -30,7 +30,7 @@ 浏览器 分类 | Oragekk's Blog - + @@ -44,6 +44,6 @@

    何为进程?


    Oragekk...大约 8 分钟浏览器前端开发
    - + diff --git a/collect.html b/collect.html index 401a68e15..ac871ecd1 100644 --- a/collect.html +++ b/collect.html @@ -30,13 +30,13 @@ 收藏 | Oragekk's Blog - + - + diff --git a/demo/disable.html b/demo/disable.html index 8b932e5b8..4464e8625 100644 --- a/demo/disable.html +++ b/demo/disable.html @@ -30,13 +30,13 @@ 布局与功能禁用 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/demo/encrypt.html b/demo/encrypt.html index b1ed11be6..af4c690d0 100644 --- a/demo/encrypt.html +++ b/demo/encrypt.html @@ -30,13 +30,13 @@ 密码加密的文章 | Oragekk's Blog - + - + diff --git a/demo/index.html b/demo/index.html index 3ad67bad7..d6b7a9fc4 100644 --- a/demo/index.html +++ b/demo/index.html @@ -30,13 +30,13 @@ 主要功能与配置演示 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/demo/markdown.html b/demo/markdown.html index a794c7b58..c805c518e 100644 --- a/demo/markdown.html +++ b/demo/markdown.html @@ -30,7 +30,7 @@ Markdown 展示 | Oragekk's Blog - + @@ -47,6 +47,6 @@ }

    样式化

    向 Mr.Hope 捐赠一杯咖啡。 Recommended

    交互演示

    TS 案例

    Vue 交互演示

    Vue 交互演示

    幻灯片


    1. 这是脚注内容 ↩︎

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/demo/page.html b/demo/page.html index 0d798ee87..0ab6b44d7 100644 --- a/demo/page.html +++ b/demo/page.html @@ -30,13 +30,13 @@ 页面配置 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/demo/slides.html b/demo/slides.html index 3c786c3bd..28e04bdc9 100644 --- a/demo/slides.html +++ b/demo/slides.html @@ -30,11 +30,11 @@ 幻灯片页 | Oragekk's Blog - +
    - + diff --git a/friend.html b/friend.html index 6c57e2faa..30670e870 100644 --- a/friend.html +++ b/friend.html @@ -30,7 +30,7 @@ 友情链接 | Oragekk's Blog - + @@ -51,6 +51,6 @@ 链接: 站点连接

    免责声明

    1. 本站将定期检查友情链接,确保所有链接都是有效的,避免死链等无效链接影响用户体验。
    2. 本站不接受涉及政治和非法内容的网站申请友情链接,维护健康和谐的网络环境。
    3. 长期无更新、无法访问的博客将被视为失效链接,本站有权终止相关的友情链接。
    4. 在友情链接之后,希望能够互勉互动,共同促进博客的发展和进步。
    5. 为了避免友情链接中断和影响用户体验,本站建议申请友情链接前请确保贵站能够长期稳定运营下去。
    6. 如有链接变更,请及时联系本站并告知变更信息,同时请填写正确的邮箱账号,方便联系和告知。
    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/index.html b/index.html index 6cfe1289f..3cf28a855 100644 --- a/index.html +++ b/index.html @@ -30,7 +30,7 @@ 主页 | Oragekk's Blog - + @@ -89,6 +89,6 @@

    积极可组合性

    组合性是 Flutter 最为出众的一个特性。widget 通过组合其他 widget 的方式进行构建,并且这些 widget 自身由更基础的 widget 构建。比如,Padding 是一个 widget 而非其他 widget 的属性。因此,使用 Flutter 创建的用户界面是由多个 widget 组成的。


    Oragekk...大约 29 分钟FlutterFlutter
    - + diff --git a/intro.html b/intro.html index bf2983bc4..3dfd27ffa 100644 --- a/intro.html +++ b/intro.html @@ -30,13 +30,13 @@ 关于我 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/news/1.html b/news/1.html index 2e84fcd2e..3b420366e 100644 --- a/news/1.html +++ b/news/1.html @@ -30,13 +30,13 @@ 从这里开始 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/news/2.html b/news/2.html index 8ae17d72f..e10c85d5d 100644 --- a/news/2.html +++ b/news/2.html @@ -30,13 +30,13 @@ 六月 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/news/3.html b/news/3.html index d30ab8199..11b62aad6 100644 --- a/news/3.html +++ b/news/3.html @@ -30,13 +30,13 @@ 六月 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/news/4.html b/news/4.html index e3c0aba77..2b9ef5496 100644 --- a/news/4.html +++ b/news/4.html @@ -30,13 +30,13 @@ 九月 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/news/5.html b/news/5.html index 74f50074c..0c8d7c582 100644 --- a/news/5.html +++ b/news/5.html @@ -30,13 +30,13 @@ 十月 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/news/index.html b/news/index.html index dc6d1be7c..95305e5c1 100644 --- a/news/index.html +++ b/news/index.html @@ -30,13 +30,13 @@ 说说 | Oragekk's Blog - +
    跳至主要內容跳至主要內容
    - + diff --git a/posts/Linux/index.html b/posts/Linux/index.html index 5d85d4d0d..6c50c5a61 100644 --- a/posts/Linux/index.html +++ b/posts/Linux/index.html @@ -30,13 +30,13 @@ Linux | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/Linux/iterm2-pure.html b/posts/Linux/iterm2-pure.html index e5d38f397..a9645f0aa 100644 --- a/posts/Linux/iterm2-pure.html +++ b/posts/Linux/iterm2-pure.html @@ -30,7 +30,7 @@ 终端究极美化iTerm2+Pure | Oragekk's Blog - + @@ -66,6 +66,6 @@ [lindex $argv 3]:服务器密码

    插入完成后键盘esc 然后输入:wq退出,接下来给文件赋权

    chmod 777 myserver.sh
    打开iTerm2,打开Preferences配置界面,Profiles -> general,左下角点击+号,新建profile,参考下面图片在对应位置输入内容即可。

    Name:根据需求输入,通常选择标识性较强的内容便于区分,例如服务器的IP地址

    Command:这里选择login Shell

    Send text at start :填写格式形如A B C D E这样,每一个部分之间用空格隔开,根据自己实际情况填写,下面是对每一部分内容的解释

    相关信息

    A 代表咱们上面写的本机保存sh脚本的路径:/Users/iterm/myserver.sh

    B 代表服务器端口号一般远程连接端口为:22

    C 代表服务器用户名一般为:root

    D 代表服务器IP:公网IP填写

    E 代表服务器密码:根据自己实际的服务器密码填写
    设置好之后打开iTerm2,点击profiles,点击前面自己新增的连接远程服务器的profile的名字

    首次连接需要输入一次服务器密码,之后再连接就免密码登陆了

    结语

    当然这里只介绍一部分,还有很多高级玩法,需要用到的时候自己去研究一下了

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/Linux/unix-linux-note.html b/posts/Linux/unix-linux-note.html index 58f370596..b45935bae 100644 --- a/posts/Linux/unix-linux-note.html +++ b/posts/Linux/unix-linux-note.html @@ -30,13 +30,13 @@ Unix/Linux 扫盲笔记 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/Linux/zsh.html b/posts/Linux/zsh.html index c8461d137..9e945fdae 100644 --- a/posts/Linux/zsh.html +++ b/posts/Linux/zsh.html @@ -30,7 +30,7 @@ 更优雅强大的终端ZSH | Oragekk's Blog - + @@ -82,6 +82,6 @@ alias -s bz2='tar -xjvf'

    【其他】

    主题设置:

    oh my zsh 提供了数十种主题,相关文件在~/.oh-my-zsh/themes目录下,你可以自己选择,也可以自己编写主题。

    .zshrc里找到ZSH_THEME,就可以设置主题了,默认主题是:ZSH_THEME=”robbyrussell”

    ZSH_THEME="random",主题设置为随机,这样我们每打开一个窗口,都会随机在默认主题中选择一个。

    插件设置:

    oh my zsh项目提供了完善的插件体系,相关的文件在~/.oh-my-zsh/plugins目录下,默认提供了 100 多种,大家可以根据自己的实际学习和工作环境采用,想了解每个插件的功能,只要打开相关目录下的 zsh 文件看一下就知道了。插件也是在.zshrc里配置,找到plugins关键字,你就可以加载自己的插件了,系统默认加载git,你可以在后面追加内容,如下:

    plugins=(git zsh-autosuggestions autojump zsh-syntax-highlighting)
    安装 zsh-autosuggestions

    autosuggestions 它是 Oh-myszh 的一个插件,作用基本上是根据历史输入指令的记录即时的提示,能够很大的提高效率

    git clone git://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions

    添加至 plugins

    安装 zsh-syntax-highlighting

    代码高亮插件可以让终端颜色更加绚丽

    git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting

    添加至 plugins

    plugins=(zsh-autosuggestions git zsh-syntax-highlighting)

    效果图

    MarNhq.md.png
    MarNhq.md.png

    卸载 oh my zsh

    直接在终端中,运行uninstall_oh_my_zsh既可以卸载。

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/Python/index.html b/posts/Python/index.html index acbb3a118..8ea2380b7 100644 --- a/posts/Python/index.html +++ b/posts/Python/index.html @@ -30,13 +30,13 @@ Python | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/Python/submit-bing.html b/posts/Python/submit-bing.html index e6170894e..17d72510a 100644 --- a/posts/Python/submit-bing.html +++ b/posts/Python/submit-bing.html @@ -30,7 +30,7 @@ 使用Bing API提交网站URL | Oragekk's Blog - + @@ -71,6 +71,6 @@ print("Error submitting URLs: ", response.content)

    解读

    在上面的脚本中,我们首先指定了Sitemap的URL。然后,我们使用Python中的requests库获取Sitemap的内容,并使用Python中的xml.etree.ElementTree库解析Sitemap中的URL。

    接下来,我们使用Bing API提交URL。我们首先指定Bing API的密钥和API URL,并设置请求头。然后,我们将Sitemap中提取的URL列表作为数据,将其作为JSON格式发送到Bing API。最后,我们检查响应的状态码,以确保URL已成功提交。

    注意:在使用Bing API提交URL之前,需要先注册Bing Webmaster工具,并获取Bing API密钥。还需要将"https://example.com"替换为自己的站点URL。

    API密钥生成↘️

    1. 访问Bing Webmaster Tools
    2. 右上角设置
    API密钥生成
    API密钥生成
    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/Python/submit-url.html b/posts/Python/submit-url.html index 44061a436..6bcd49ef3 100644 --- a/posts/Python/submit-url.html +++ b/posts/Python/submit-url.html @@ -30,7 +30,7 @@ 提交URL到搜索引擎(百度、Bing、Google) | Oragekk's Blog - + @@ -174,6 +174,6 @@ requests==2.28.2

    注意点

    1. 此脚本不可直接使用,需配合GitHub Action,如果想要直接使用,请替换其中的环境变量为你的内容

      • os.environ["BAIDU_KEY"] 百度推送token
      • os.environ["BING_KEY"] bing_api_key
      • os.environ["GOOGLE_JSON"] google indexing api 认证json
      • 取消 从命令行参数提取sitemap的步骤,直接赋值
    2. google indexing api参考这里👉Indexing API 快速入门

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/Rust/first-time.html b/posts/Rust/first-time.html index 064bb7823..335a82656 100644 --- a/posts/Rust/first-time.html +++ b/posts/Rust/first-time.html @@ -30,13 +30,13 @@ 初识Rust | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/Rust/index.html b/posts/Rust/index.html index 29ffad94f..286d20541 100644 --- a/posts/Rust/index.html +++ b/posts/Rust/index.html @@ -30,13 +30,13 @@ Rust | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/Web/Browser/event-loop.html b/posts/Web/Browser/event-loop.html index 5f1971f19..2aac39e16 100644 --- a/posts/Web/Browser/event-loop.html +++ b/posts/Web/Browser/event-loop.html @@ -30,7 +30,7 @@ 浏览器的事件循环 | Oragekk's Blog - + @@ -54,6 +54,6 @@ Promise.resolve().then(函数)

    浏览器还有很多其他的队列,由于和我们开发关系不大,不作考虑

    面试题:阐述一下 JS 的事件循环

    参考答案:

    事件循环又叫做消息循环,是浏览器渲染主线程的工作方式。

    在 Chrome 的源码中,它开启一个不会结束的 for 循环,每次循环从消息队列中取出第一个任务执行,而其他线程只需要在合适的时候将任务加入到队列末尾即可。

    过去把消息队列简单分为宏队列和微队列,这种说法目前已无法满足复杂的浏览器环境,取而代之的是一种更加灵活多变的处理方式。

    根据 W3C 官方的解释,每个任务有不同的类型,同类型的任务必须在同一个队列,不同的任务可以属于不同的队列。不同任务队列有不同的优先级,在一次事件循环中,由浏览器自行决定取哪一个队列的任务。但浏览器必须有一个微队列,微队列的任务一定具有最高的优先级,必须优先调度执行

    面试题:JS 中的计时器能做到精确计时吗?为什么?

    参考答案:

    不行,因为:

    1. 计算机硬件没有原子钟,无法做到精确计时
    2. 操作系统的计时函数本身就有少量偏差,由于 JS 的计时器最终调用的是操作系统的函数,也就携带了这些偏差
    3. 按照 W3C 的标准,浏览器实现计时器时,如果嵌套层级超过 5 层,则会带有 4 毫秒的最少时间,这样在计时时间少于 4 毫秒时又带来了偏差
    4. 受事件循环的影响,计时器的回调函数只能在主线程空闲时运行,因此又带来了偏差
    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/Web/Browser/index.html b/posts/Web/Browser/index.html index cc6410365..a6955c529 100644 --- a/posts/Web/Browser/index.html +++ b/posts/Web/Browser/index.html @@ -30,13 +30,13 @@ Browser | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/Web/CSS/calculation.html b/posts/Web/CSS/calculation.html index d8dbd0d0d..9a7d263d7 100644 --- a/posts/Web/CSS/calculation.html +++ b/posts/Web/CSS/calculation.html @@ -30,7 +30,7 @@ CSS 属性计算过程 | Oragekk's Blog - + @@ -80,6 +80,6 @@ }

    大家能说出为什么会呈现这样的结果么?

    解答如下:

    image-20220813151941113
    image-20220813151941113

    实际上原因很简单,因为 a 元素在用户代理样式表中已经设置了 color 属性对应的值,因此会应用此声明值。而在 p 元素中无论是作者样式表还是用户代理样式表,都没有对此属性进行声明,然而由于 color 属性是可以继承的,因此最终 p 元素的 color 属性值通过继承来自于父元素。

    你答对了么?-)


    -EOF-

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/Web/CSS/containing-block.html b/posts/Web/CSS/containing-block.html index 28fc596c2..db54f00da 100644 --- a/posts/Web/CSS/containing-block.html +++ b/posts/Web/CSS/containing-block.html @@ -30,7 +30,7 @@ 你不知道的 CSS 之包含块 | Oragekk's Blog - + @@ -130,6 +130,6 @@ }

    这里我们对 em1 同样进行了 absolute 绝对定位,你想一想会有什么样的变化?

    没错,聪明的你大概应该知道,em1 的包含块不再是 p2,而变成了 div1,而 strong1 的包含块也不再是 p2 了,而是变成了 em1。

    如下表所示:

    元素包含块
    htmlinitial C.B. (UA-dependent)
    bodyhtml
    div1initial C.B. (UA-dependent)
    p1div1
    p2div1
    em1div1(因为定位了,参阅非根元素包含块确定规则的第三条)
    strong1em1(因为 em1 变为了块容器,参阅非根元素包含块确定规则的第一条)

    好了,这就是 CSS 规范中所举的例子。如果你全都能看明白,以后你还能跟别人说你是看过这一块知识对应的 CSS 规范的人。

    image-20220815093518833

    另外,关于包含块的知识,在 MDN 上除了解说了什么是包含块以外,也举出了很多简单易懂的示例。

    具体你可以移步到:https://developer.mozilla.org/zh-CN/docs/Web/CSS/Containing_block

    好了,这就是有关包含块的所有内容了,你学会了么?-)


    -EOF-

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/Web/CSS/index.html b/posts/Web/CSS/index.html index 9ef7032d7..c24d8a980 100644 --- a/posts/Web/CSS/index.html +++ b/posts/Web/CSS/index.html @@ -30,13 +30,13 @@ CSS | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/Web/JavaScript/index.html b/posts/Web/JavaScript/index.html index a08f86f04..137c0be30 100644 --- a/posts/Web/JavaScript/index.html +++ b/posts/Web/JavaScript/index.html @@ -30,13 +30,13 @@ JavaScript | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/Web/JavaScript/js-module-loader.html b/posts/Web/JavaScript/js-module-loader.html index 04c18a2bc..04ebd8390 100644 --- a/posts/Web/JavaScript/js-module-loader.html +++ b/posts/Web/JavaScript/js-module-loader.html @@ -30,7 +30,7 @@ CommonJS,RequireJS,SeaJS 归纳笔记 | Oragekk's Blog - + @@ -125,6 +125,6 @@ });

    WebPack

    working...

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/Web/JavaScript/js-version.html b/posts/Web/JavaScript/js-version.html index 6bd0030fb..3254c9089 100644 --- a/posts/Web/JavaScript/js-version.html +++ b/posts/Web/JavaScript/js-version.html @@ -30,13 +30,13 @@ JavaScript ES6 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/Web/JavaScript/judgment.html b/posts/Web/JavaScript/judgment.html index 4e28979c4..3540826ab 100644 --- a/posts/Web/JavaScript/judgment.html +++ b/posts/Web/JavaScript/judgment.html @@ -30,7 +30,7 @@ 通过UserAgent判断设备 | Oragekk's Blog - + @@ -62,6 +62,6 @@ </script>

    需要注意的是字符转义和引号嵌套的问题

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/Web/Q_A.html b/posts/Web/Q_A.html index 293099aae..f6a4cee24 100644 --- a/posts/Web/Q_A.html +++ b/posts/Web/Q_A.html @@ -30,13 +30,13 @@ 前端-Q&A | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/Web/Vue/index.html b/posts/Web/Vue/index.html index 4a77450d7..871531fa0 100644 --- a/posts/Web/Vue/index.html +++ b/posts/Web/Vue/index.html @@ -30,13 +30,13 @@ Vue | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/Web/Vue/optimization.html b/posts/Web/Vue/optimization.html index 0394f5744..563ed2d42 100644 --- a/posts/Web/Vue/optimization.html +++ b/posts/Web/Vue/optimization.html @@ -30,7 +30,7 @@ Vue常见优化手段 | Oragekk's Blog - + @@ -138,6 +138,6 @@ </script>

    使用keep-alive

    用于缓存内部组件实例,里面有include和exclude属性,max设置最大缓存数,超过后,自动删除最久没用的。

    受到keep-alive影响,其内部的组件都具有两个生命周期,activateddeactivated ,分别再组件激活和失活时触发,第一次activated是在mounted之后。

    一般用在需要多个页面频繁操作的场景(导航条)

    长列表优化

    一般用在app端下拉的时候,或者列表很长的时候,通过一个固定大小的渲染池来解决。通过滚动条等一些操作,减少页面渲染市场,有现成的库,vue-virtual-scroller

    https://github.com/Akryum/vue-virtual-scroller

    通过v-once创建低开销的静态组件,渲染一次后就缓存起来了,除非你非常留意渲染速度,不然最好不要用,因为有的开发者不知道这个属性或者看漏了,然后花费好几个小时来找为什么模板无法正确更新。

    打包体积优化

    • Webpack 对图片进行压缩
    • 静态资源的优化使用对象存储加CDN
    • 减少 ES6 转为 ES5 的冗余代码
    • 提取公共代码
    • 模板预编译
    • 提取组件的 CSS
    • 优化 SourceMap
    • 构建结果输出分析
    • Vue 项目的编译优化

    基础优化

    • 开启 gzip 压缩
    • 浏览器缓存
    • CDN 的使用
    • 使用 Chrome Performance 查找性能瓶颈
    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/Web/Vue/vue2-principle.html b/posts/Web/Vue/vue2-principle.html index b785c999d..fa846ad88 100644 --- a/posts/Web/Vue/vue2-principle.html +++ b/posts/Web/Vue/vue2-principle.html @@ -30,7 +30,7 @@ Vue2响应式原理解析 | Oragekk's Blog - + @@ -270,6 +270,6 @@ </script>

    9. 总流程图


    1. 依赖:某个函数在运行期间用到这个属性的get方法 ↩︎

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/Web/Vue/waline-bug.html b/posts/Web/Vue/waline-bug.html index dcaf2dbb4..08f3a9db5 100644 --- a/posts/Web/Vue/waline-bug.html +++ b/posts/Web/Vue/waline-bug.html @@ -30,7 +30,7 @@ 一个 waline 评论系统bug引发的思考 | Oragekk's Blog - + @@ -154,6 +154,6 @@ await nextTick()

    3.1. 至此问题解决

    相关信息

    nextTick()

    等待下一次 DOM 更新刷新的工具方法。

    • 类型
    function nextTick(callback?: () => void): Promise<void>
    • 详细信息

    当你在 Vue 中更改响应式状态时,最终的 DOM 更新并不是同步生效的,而是由 Vue 将它们缓存在一个队列中,直到下一个“tick”才一起执行。这样是为了确保每个组件无论发生多少状态改变,都仅执行一次更新。

    nextTick() 可以在状态改变后立即使用,以等待 DOM 更新完成。你可以传递一个回调函数作为参数,或者 await 返回的 Promise。

    4. 思考

    vueusejs的文档中,其实useStorage应该是一个同步操作,它还有一个useStorageAsync的API,支持异步的响应式Storage,按理说里边不应该包含太多异步的或者延时性的代码,我也找到源码浅浅看了一下,目前还没找到问题在哪里,按照替换localStorage.setItem('WALINE_COMMENT_BOX_EDITOR', '');可行来看,问题就在useStorage身上无疑,后续有时间,会继续探索一下,给官方的PR#2524也已经提了

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/Web/index.html b/posts/Web/index.html index 39728b201..8f23c80ca 100644 --- a/posts/Web/index.html +++ b/posts/Web/index.html @@ -30,13 +30,13 @@ 前端开发 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/Web/node/index.html b/posts/Web/node/index.html index 35ce8b0dc..79a68a9f1 100644 --- a/posts/Web/node/index.html +++ b/posts/Web/node/index.html @@ -30,13 +30,13 @@ nodeJS | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/Web/node/node-version.html b/posts/Web/node/node-version.html index fa9c0b360..e886f9706 100644 --- a/posts/Web/node/node-version.html +++ b/posts/Web/node/node-version.html @@ -30,7 +30,7 @@ 使用n命令管理node版本 | Oragekk's Blog - + @@ -62,6 +62,6 @@ Node version: v13.12.0

    请注意,n use 命令所请求的 Node 版本需要由 n 安装。

    在某些情况下,这个功能非常有用。例如,有一个构建服务器,用于构建需要不同 Node 版本的程序。可以用 n use 命令触发每个构建,并能够指定该程序所需的 Node 版本。

    差异化

    NVM for Windows 和 n 有许多常见功能,也有一些独特的功能,这些功能会影响你使用每个工具的方式和位置。以下是一些主要差异的摘要:

    能力NVM for Windowsn
    安装Windows 安装程序或独立安装Bash 脚本或 npm 包
    操作系统支持Windows(适用于 Linux/Mac 的不同实现)仅限 Linux/Mac
    列出要安装的 Node 的可用版本?YesNo
    列出已安装的 Node 版本?YesYes
    在不同的 Node 版本之间安装和切换?YesYes
    直接访问 Node 二进制文件?NoYes
    选择要安装的架构(x86,x64)?YesYes

    如果你使用 Linux/Mac 那么我很推荐你使用 n,因为它安装方便,并且 API 简单。我还是用过 homebrew 安装两个办版本,使用brew link --overwrite --force node命令来更改版本,很不方便,并且容错率很低

    或者你可以在 Windows 上选择 NVM for Windows,同时在 Linux 构建服务器上选择 n

    无论怎样,这两种工具都能很好地满足能够动态切换 Node 版本的需求。

    就是这么简单了

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/cross-platform/Flutter/concurrency.html b/posts/cross-platform/Flutter/concurrency.html index 0fd68ae5c..331e62a98 100644 --- a/posts/cross-platform/Flutter/concurrency.html +++ b/posts/cross-platform/Flutter/concurrency.html @@ -30,7 +30,7 @@ Dart 中的并发 | Oragekk's Blog - + @@ -83,6 +83,6 @@ }

    这个例子的完成情况与前一个例子相同。一个新的隔离器产生了,计算了一些东西,并把结果送了回来。

    不过,现在这个隔离体发送的是一个闭包。与典型的命名函数相比,闭包的限制较少,无论是在功能上还是在代码中的编写方式上。在这个例子中,Isolate.run()执行的是看起来像本地代码的东西,同时进行。在这个意义上,你可以把run()想象成一个 "并行运行 "的控制流操作符

    实现一个简单的 isolate 工作对象

    Isolate.run() a抽取了一些较低级别的、与隔离物相关的API,以简化隔离物管理:

    您可以直接使用这些基元来对隔离区的功能进行更精细的控制。例如,run()在返回一条消息后就会关闭其隔离区。如果您想允许多个消息在隔离区之间传递,该怎么办呢?您可以用与run()的实现方式大致相同的方式来设置自己的隔离区,只是以稍微不同的方式利用SendPortsend()方法

    如果你想在 isolate 之间建立更多的通信,那么你需要使用 SendPortsend() 方法。下图展示了一种常见的场景,主 isolate 会发送请求消息至 isolate 工作对象,然后它们之间会继续进行多次通信,进行请求和回复。

    图中显示了主隔离器催生隔离器,然后发送请求消息,工作隔离器用回复消息进行响应;显示了两个请求-回复循环。
    图中显示了主隔离器催生隔离器,然后发送请求消息,工作隔离器用回复消息进行响应;显示了两个请求-回复循环。

    下方列举的 isolate 示例 包含了发送多次消息的使用方法:

    • send_and_receive.dart 展示了如何从主 isolate 发送消息至生成的 isolate,与前面的示例较为接近,不过没有使用 run() 方法;
    • long_running_isolate.dart 展示了如何生成一个长期运行、且多次发送和接收消息的 isolate。

    性能和 isolate 组

    当一个 isolate 调用了 Isolate.spawn(),两个 isolate 将拥有同样的执行代码,并归入同一个 isolate 组 中。 Isolate 组会带来性能优化,例如新的 isolate 会运行由 isolate 组持有的代码,即共享代码调用。同时,Isolate.exit() 仅在对应的 isolate 属于同一组时有效。

    某些场景下,你可能需要使用 Isolate.spawnUri(),使用执行的 URI 生成新的 isolate,并且包含代码的副本。然而,spawnUri() 会比 spawn() 慢很多,并且新生成的 isolate 会位于新的 isolate 组。另外,当 isolate 在不同的组中,它们之间的消息传递会变得更慢。

    备注

    Flutter logoFlutter 不支持 Isolate.spawnUri()

    在Web的并发

    所有的Dart应用程序都可以使用async-awaitFutureStream进行非阻塞、交错的计算。然而,Dart web 平台并不支持隔离器。Dart网络应用程序可以使用网络工作者在后台线程中运行脚本,这与隔离程序类似。不过,web workers的功能和能力与隔离器有些不同。

    例如,当Web工作者在线程之间发送数据时,他们会来回复制数据。不过,数据复制的速度可能非常慢,尤其是对于大的消息。隔离器也做同样的事情,但也提供了API,可以更有效地传输保存消息的内存。

    创建Web Worker和Isolates也有不同。你只能通过声明一个单独的程序入口并单独编译来创建网络工作者。启动Web Worker类似于使用Isolate.spoonUri来启动一个隔离器。您也可以使用Isolate.spown来启动一个隔离器,这需要的资源较少,因为它重用了一些与催生隔离器相同的代码和数据。Web Worker没有一个同等的API。

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/cross-platform/Flutter/index.html b/posts/cross-platform/Flutter/index.html index dbe4ede80..f8b754ca8 100644 --- a/posts/cross-platform/Flutter/index.html +++ b/posts/cross-platform/Flutter/index.html @@ -30,13 +30,13 @@ Flutter | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/cross-platform/Flutter/newbie.html b/posts/cross-platform/Flutter/newbie.html index 9d1ad0122..53afa838e 100644 --- a/posts/cross-platform/Flutter/newbie.html +++ b/posts/cross-platform/Flutter/newbie.html @@ -30,13 +30,13 @@ Flutter 基础大集合 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/cross-platform/Flutter/principle.html b/posts/cross-platform/Flutter/principle.html index da94a94f0..47172a59c 100644 --- a/posts/cross-platform/Flutter/principle.html +++ b/posts/cross-platform/Flutter/principle.html @@ -30,13 +30,13 @@ Flutter 工作原理 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/cross-platform/ReactNative/index.html b/posts/cross-platform/ReactNative/index.html index 5601a8995..5b3a6138b 100644 --- a/posts/cross-platform/ReactNative/index.html +++ b/posts/cross-platform/ReactNative/index.html @@ -30,13 +30,13 @@ ReactNative | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/cross-platform/ReactNative/react1.html b/posts/cross-platform/ReactNative/react1.html index 9fb1ec573..806f3d85b 100644 --- a/posts/cross-platform/ReactNative/react1.html +++ b/posts/cross-platform/ReactNative/react1.html @@ -30,13 +30,13 @@ ReactNative介绍 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/cross-platform/ReactNative/react2.html b/posts/cross-platform/ReactNative/react2.html index 0b0ca24cc..6e22c3878 100644 --- a/posts/cross-platform/ReactNative/react2.html +++ b/posts/cross-platform/ReactNative/react2.html @@ -30,7 +30,7 @@ ReactNative开发环境配置,ES6语法介绍 | Oragekk's Blog - + @@ -156,6 +156,6 @@ }

    参考资料:

    官方文档

    ES6 延展操作符(...)

    typeScriptg 中文文档

    ReactNative 入门与进阶

    https://docs.nativebase.io

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/cross-platform/ReactNative/react3.html b/posts/cross-platform/ReactNative/react3.html index 166192747..f6a196ee6 100644 --- a/posts/cross-platform/ReactNative/react3.html +++ b/posts/cross-platform/ReactNative/react3.html @@ -30,7 +30,7 @@ ReactNative State(状态) | Oragekk's Blog - + @@ -66,6 +66,6 @@ });

    参考资料:

    官方文档

    ES6 延展操作符(...)

    typeScriptg 中文文档

    ReactNative 入门与进阶

    https://docs.nativebase.io

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/cross-platform/index.html b/posts/cross-platform/index.html index 623a9e973..887d0c6ba 100644 --- a/posts/cross-platform/index.html +++ b/posts/cross-platform/index.html @@ -30,13 +30,13 @@ 跨平台开发 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/iOS/index.html b/posts/iOS/index.html index 286188193..a70580b85 100644 --- a/posts/iOS/index.html +++ b/posts/iOS/index.html @@ -30,13 +30,13 @@ iOS | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/iOS/other/JavaScriptBridge.html b/posts/iOS/other/JavaScriptBridge.html index 9eea2aa29..8e882dd3c 100644 --- a/posts/iOS/other/JavaScriptBridge.html +++ b/posts/iOS/other/JavaScriptBridge.html @@ -30,7 +30,7 @@ WebViewJavascriptBridge | Oragekk's Blog - + @@ -93,6 +93,6 @@ });

    六、注意事项

    • 如果产生调用不通的问题,多为 JavaScript 调用时机问题
    • 注意桥接的代理
    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/iOS/other/coreML.html b/posts/iOS/other/coreML.html index 5261aa508..934779fec 100644 --- a/posts/iOS/other/coreML.html +++ b/posts/iOS/other/coreML.html @@ -30,7 +30,7 @@ 初探机器学习框架CoreML | Oragekk's Blog - + @@ -66,6 +66,6 @@ }

    运行效果

    Snip20171121_3.md.png
    Snip20171121_4.md.png
    Snip20171121_5.md.png

    Demo

    👉Demo 下载
    如果有帮助烦请点 star

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/iOS/other/index.html b/posts/iOS/other/index.html index c01688f60..a0958b82f 100644 --- a/posts/iOS/other/index.html +++ b/posts/iOS/other/index.html @@ -30,13 +30,13 @@ 其他 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/iOS/other/test-Three-ways-to- call.html b/posts/iOS/other/test-Three-ways-to- call.html index fb94b0724..d63f12990 100644 --- a/posts/iOS/other/test-Three-ways-to- call.html +++ b/posts/iOS/other/test-Three-ways-to- call.html @@ -30,7 +30,7 @@ Test Three ways to call | Oragekk's Blog - + @@ -61,6 +61,6 @@ }
    • 总结来说除了第二种不知是否可以通过审核,其余方法均可实现呼叫并返回程序功能。

    • 只是第一种方法爱需要手动弹出 AlertViewController;

    • 第三种方法优势在于可以自动识别电话格式并弹窗,如号码为:01088867777 弹窗为 010-88867777。并且代码相对于第一种来说极为精简,少了自定义 AlertViewController 的步骤

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git "a/posts/iOS/other/\347\245\236\347\273\217\347\275\221\347\273\234\346\250\241\345\236\213\350\256\255\347\273\203.html" "b/posts/iOS/other/\347\245\236\347\273\217\347\275\221\347\273\234\346\250\241\345\236\213\350\256\255\347\273\203.html" index bc2dfc215..770bc1099 100644 --- "a/posts/iOS/other/\347\245\236\347\273\217\347\275\221\347\273\234\346\250\241\345\236\213\350\256\255\347\273\203.html" +++ "b/posts/iOS/other/\347\245\236\347\273\217\347\275\221\347\273\234\346\250\241\345\236\213\350\256\255\347\273\203.html" @@ -30,13 +30,13 @@ 神经网络模型训练 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/iOS/source/AFNETworking-A-memory-leak.html b/posts/iOS/source/AFNETworking-A-memory-leak.html index 27bdd6f8d..fabb5de97 100644 --- a/posts/iOS/source/AFNETworking-A-memory-leak.html +++ b/posts/iOS/source/AFNETworking-A-memory-leak.html @@ -30,7 +30,7 @@ AFNetworking A memory leak | Oragekk's Blog - + @@ -53,6 +53,6 @@ }

    将有问题的语句全部替换成单例后,再用 instruments 检查,再也没有出现泄漏的红叉了。O(∩_∩)O 哈哈~

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/iOS/source/WCDB.html b/posts/iOS/source/WCDB.html index 6ec3ad4cb..c98c465c5 100644 --- a/posts/iOS/source/WCDB.html +++ b/posts/iOS/source/WCDB.html @@ -30,7 +30,7 @@ WCDB漫谈 | Oragekk's Blog - + @@ -50,6 +50,6 @@ return [database updateRowsInTable:TABLE_WCDB_NAME onProperties:Person.name withObject:person where:Person.studentId == studentId];
  • NSArray<Person *> * person = [database getObjectsOfClass:Person.class fromTable:TABLE_WCDB_NAME orderBy:Person.localID.order()];
  • Transaction

    WCDB 内可通过两种方式执行 Transaction(事务),一是 runTransaction:接口

    Ma6AnU.md.png
    Ma6AnU.md.png

    这种方式要求数据库操作在一个 BLOCK 内完成,简单易用。

    另一种方式则是获取 WCTTransaction 对象

    Ma6eAJ.md.png
    Ma6eAJ.md.png

    WCTTransaction 对象可以在类或函数间传递,因此这种方式也更具灵活性。

    WINQ

    WINQ(WCDB Integrated Query,音'wink'),即 WCDB 集成查询,是将自然查询的 SQL 集成到 WCDB 框架中的技术,基于 C++实现。

    • 免去拼接 SQL 字符串、防注入
    • 借助 IDE 代码提示和编译器语法检查
    • 对于一个已绑定 ORM 的类,可以通过 className.propertyName 的方式,获得数据库内字段的映射
    • WINQ 的接口包括但不限于:
      • 一元操作符:+、-、!等
      • 二元操作符:||、&&、+、-、*、/、|、&、<<、>>、<、<=、==、!=、>、>=等
      • 范围比较:IN、BETWEEN 等
      • 字符串匹配:LIKE、GLOB、MATCH、REGEXP 等
      • 聚合函数:AVG、COUNT、MAX、MIN、SUM 等
      • ...

    原理

    • 初衷,适应 WCDB+ORM 解决 SQL 字符串的代码冗余和难以被编译器进行语法检查而造成的错误和时间浪费。SQL 字符串太容易被注入
    • SQL 抽象
    • 封装常用操作,覆盖 80%的使用场景
    • 暴露底层接口,适配剩余 20%的特殊情况
    • 定义常用操作
    • 特殊场景所暴露的底层接口,应该以什么形式存在?
    • SELECT、DISTINCT、ALL 等等大写字母是 keyword,属于 SQL 的保留字。
    • result-column、``table-or-subquery、expr 等等小写字母是 token。token 可以再进一步地展开其构成的语法规则。
    • 将固定的 keyword,封装为函数名,作为连接。
    • 将可以展开的 token,封装为类,并在类内实现其不同的组合。
    • 在语法规则中,WHERE、LIMIT 等都接受 expr 作为参数。因此,不管 SQL 多么复杂,StatementSelect 也只接受 Expr 的参数。而其组合的能力,则在 Expr 类内实现。

    高级用法

    as 重定向

    基于 ORM 的支持,我们可以从数据库直接取出一个 Object。然而,有时候需要取出并非是某个字段,而是有一些组合。例如:

    img
    img

    这段代码从数据库中取出了消息的最新的修改时间,并以此将此时间作为消息的创建时间,新建了一个 message。这种情况下,就可以使用 as 重定向。

    as 重定向,它可以将一个查询结果重定向到某一个字段,如下:

    img
    img

    通过 as(Message.createTime)的语法,将查询结果重新指向了 createTime。因此只需一行代码便可完成原来的任务。

    链式调用

    链式调用是指对象的接口返回一个对象,从而允许在单个语句中将调用链接在一起,而不需要变量来存储中间结果。

    WCDB 对于增删改查操作,都提供了对应的类以实现链式调用

    • WCTInsert
    • WCTDelete
    • WCTUpdate
    • WCTSelect
    • WCTRowSelect
    • WCTMultiSelect
    img
    img

    where、orderBy、limit 等接口的返回值均为 self,因此可以通过链式调用,更自然更灵活的写出对应的查询。

    传统的接口方便快捷,可以直接获得操作结果;链式接口则更具灵活性,开发者可以获取数据库操作的耗时、错误信息;也可以通过遍历逐个生成 object。

    img
    img

    WCDB 内同时支持这两种接口,优势互补,开发者可以根据需求,选择使用。

    多表查询

    SQLite 支持联表查询,在某些特定的场景下,可以起到优化性能、简化表结构的作用。

    WCDB 同样提供了对应的接口,并在 ORM 的支持下,通过 WCTMultiSelect 的链式接口,可以同时从表中取出多个类的对象。

    img
    img

    类字段绑定

    在 ORM 中,我们通过宏,将 ObjC 类的 property 绑定为数据库的一个字段。但并非所有 property 的类型都能绑定到字段。

    WCDB 内置支持的类型有:

    • const char*的 C 字符串类型
    • 包括但不限于 int、unsigned、long、unsigned long、long long、unsigned long long 等所有基于整型的 C 基本类型
    • 包括但不限于 float、double、long double 等所有基于浮点型的 C 基本类型
    • enum 及所有基于枚举型的 C 基本类型
    • NSString、NSMutableString
    • NSData、NSMutableData
    • NSArray、NSMutableArray
    • NSDictionary、NSMutableDictionary
    • NSSet、NSMutableSet
    • NSValue
    • NSDate
    • NSNumber
    • NSURL

    然而,内置支持得再多,也不可能完全覆盖开发者所有的需求。因此 WCDB 支持开发者自定义类字段绑定。

    类只需实现 WCTColumnCoding 协议,即可支持绑定。

    img
    img
    • columnTypeForWCDB 接口定义类对应数据库中的类型
    • unarchiveWithWCTValue:接口定义从数据库类型反序列化到类的转换方式
    • archivedWCTValue 接口定义从类序列化到数据库类型的转换方式

    数据库修复

    • 官方的 Dump 恢复方案 - 遍历 sqlite_master 表,将未损坏的表和已损坏的前半部分读取出来将 dump 出来的 SQL 语句逐行执行,最终可以得到一个等效的新 DB
      功率约为 30%。 - 第一页就损坏后续无法读取
    • 备份恢复方案
      • COPY
      • 在 DB 完好的时候执行.dump
      • Backup API: SQLite 自身提供的一套备份机制,按 Page 为单位复制到新 DB, 支持热备份。
      • 最终选择 Dump + 压缩,恢复成功率达到 72%
    • 解析 B-tree 恢复方案(RepairKit)
      • 成功率约为 78%
    • 不同方案的组合
      • RepairKit 尝试恢复最新数据
      • 备份恢复 遇到错误填补漏缺
      • Dump 最后的尝试

    For Android

    • 基本功能

      • 基于 SQLCipher 的数据库加密
      • 使用连接池实现并发读写
      • 内建 Repair Kit 可用于修复损坏数据
      • 针对占用空间大小优化的数据库备份/恢复功能
      • 日志输出重定向以及性能跟踪接口
      • 内建用于全文搜索的 mmicu FTS3/4 分词器
    • 接入与迁移

      • WCDB for Android 可通过 Maven 或 AAR 包引用,API 接口与 Android SDK 非常相近, 所以将已有的 App 迁移到 WCDB 是相当容易的。
      • Android 接入与迁移
    • 数据库修复

    • 从源码编译

      • 你可以使用预编译的依赖库(OpenSSL crypto 和 SQLCipher)来编译 WCDB for Android, 使用 Gradle 或 Android Studio 皆可。Android Studio 请导入 android 目录作为 Root Project。
      • 编译 WCDB 需要安装 Android NDK r11c 或以上,并在 android/local.properties 上配置好 SDK 与 NDK 路径。Android Studio 一般会帮你配置好。
      • 如果你需要自己编译 OpenSSL 等依赖项,你需要一个 Bash 环境(Windows 可以安装 Cygwin 或 MSys)、target 为本机的 C 编译器(如 GCC)、Perl 5 以及 Tcl。之后执行下面命令即可编译依赖项。

    参考资料

    Demo

    微信移动端数据库组件 WCDB 系列(一)-iOS 基础篇

    微信移动端数据库组件 WCDB 系列(二) — 数据库修复三板斧

    微信移动端数据库组件 WCDB 系列(三) — WINQ 原理篇

    微信移动数据库组件 WCDB(四) — Android 特性篇

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/iOS/source/YYMemoryCache.html b/posts/iOS/source/YYMemoryCache.html index e9357c8c2..8c4e2ebc8 100644 --- a/posts/iOS/source/YYMemoryCache.html +++ b/posts/iOS/source/YYMemoryCache.html @@ -30,7 +30,7 @@ YYCache优秀的缓存设计 | Oragekk's Blog - + @@ -233,6 +233,6 @@ }
    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/iOS/source/index.html b/posts/iOS/source/index.html index 5b30a9aaa..f2b48785a 100644 --- a/posts/iOS/source/index.html +++ b/posts/iOS/source/index.html @@ -30,13 +30,13 @@ 源码解读 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/iOS/swift/index.html b/posts/iOS/swift/index.html index 4df143db1..124ea1453 100644 --- a/posts/iOS/swift/index.html +++ b/posts/iOS/swift/index.html @@ -30,13 +30,13 @@ Swift | Oragekk's Blog - +
    跳至主要內容
    - + diff --git "a/posts/iOS/swift/swift\346\215\225\350\216\267\350\257\255\344\271\211.html" "b/posts/iOS/swift/swift\346\215\225\350\216\267\350\257\255\344\271\211.html" index eb8dade6a..5d530d852 100644 --- "a/posts/iOS/swift/swift\346\215\225\350\216\267\350\257\255\344\271\211.html" +++ "b/posts/iOS/swift/swift\346\215\225\350\216\267\350\257\255\344\271\211.html" @@ -30,7 +30,7 @@ 深入理解swift中闭包的捕捉语义 | Oragekk's Blog - + @@ -104,6 +104,6 @@ }

    这就好像,如果我们创建一个中间变量去指向同一个 pokemon,并且捕获这个变量
    事实上,使用这个捕获列表和上面的代码一样… 除了这个 pokemonCopy 的中间变量是闭包的局部变量,并且将只能在闭包内被访问。

    总结

    • Swift 闭包捕获了一个对外部变量需要在闭包内部使用的一个引用。
    • 那个引用在闭包被执行的时候获得定值。
    • 作为对这个变量的引用的捕捉(并且不是这个变量自身),你能从闭包内部修改这个变量的值(当然,如果这个变量被声明为 var 并且不是 let)
    • 相反,你能告诉 Swfit 在闭包创建的时候对这个变量定值 并且把这个值保存在本地的一个静态变量中,而不是捕获变量本身。你可以通过使用捕获列表(中括号),在括号内表达。

    注意:因为捕获列表是一个列表你还可以放多个参数,用逗号隔开,像数组一样

    最后感谢原文作者

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/iOS/system/NSError.html b/posts/iOS/system/NSError.html index 54e59852c..108ba23d4 100644 --- a/posts/iOS/system/NSError.html +++ b/posts/iOS/system/NSError.html @@ -30,7 +30,7 @@ NSError | Oragekk's Blog - + @@ -266,6 +266,6 @@ break;
    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git "a/posts/iOS/system/NSOperation\345\222\214NSOPerationQueue.html" "b/posts/iOS/system/NSOperation\345\222\214NSOPerationQueue.html" index d1c38659c..f7e8046c5 100644 --- "a/posts/iOS/system/NSOperation\345\222\214NSOPerationQueue.html" +++ "b/posts/iOS/system/NSOperation\345\222\214NSOPerationQueue.html" @@ -30,7 +30,7 @@ NSOperatioin | Oragekk's Blog - + @@ -43,6 +43,6 @@ }];
  • 缺点:

    • 有过在主队列执行操作,有一个操作在主线程执行(随机),其他操作在子线程执行 - 如果直接调用 start 方法执行操作,无法确定每一个操作在哪条线程执行
    • 一般不要追加操作,除非就是在非主队列执行
  • 操作依赖 (串行/线程同步技术)添加数量不要太多

    • 对于不同的操作队列中的操作依然有效
    • 添加操作依赖要在添加操作队列之前
    • 只能对添加在操作队列的操作添加依赖
    • 一定不要添加循环依赖

  • 一. NSOperatioinQueue

    1.主队列

    • 放在主队列中的操作,都在主线程执行
    NSOPerationQueue mainQueue

    2.非主队列

    • 放在非主队列中的操作,都在子线程执行
    [[NSOPerationQueue alloc] init]

    3.一般定义成全局属性


    4.每一个操作都有一个 start 方法,用来在当前线程执行

    • 本质:将操作添加到操作队列之后,内部会自动调用内部 start 方法,操作就会自动执行

    • 主队列和非主队列决定操作在哪条线程执行(在哪条线程启动操作的 start 方法)

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/iOS/system/Reduced-App- volume.html b/posts/iOS/system/Reduced-App- volume.html index 36893bf77..1e7ad7aaf 100644 --- a/posts/iOS/system/Reduced-App- volume.html +++ b/posts/iOS/system/Reduced-App- volume.html @@ -30,13 +30,13 @@ 减小iOS-App或者静态库体积 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/iOS/system/WKWebView-URL.html b/posts/iOS/system/WKWebView-URL.html index 2bf8377c8..215243015 100644 --- a/posts/iOS/system/WKWebView-URL.html +++ b/posts/iOS/system/WKWebView-URL.html @@ -30,7 +30,7 @@ WKWebView拦截URL | Oragekk's Blog - + @@ -65,6 +65,6 @@ }
    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/iOS/system/WKWebView.html b/posts/iOS/system/WKWebView.html index 3d3757473..b019f3394 100644 --- a/posts/iOS/system/WKWebView.html +++ b/posts/iOS/system/WKWebView.html @@ -30,7 +30,7 @@ WKWebView使用及自适应高度 | Oragekk's Blog - + @@ -115,6 +115,6 @@ }

    六、小结

    自适应行高是本文的重点,是我自己试验了多种方法之后确定可行的方法

    下篇文章将介绍拦截 url 进行原生跳转

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git "a/posts/iOS/system/iOS\344\270\255\347\232\204Runloop.html" "b/posts/iOS/system/iOS\344\270\255\347\232\204Runloop.html" index cf1c87305..bfc3285c6 100644 --- "a/posts/iOS/system/iOS\344\270\255\347\232\204Runloop.html" +++ "b/posts/iOS/system/iOS\344\270\255\347\232\204Runloop.html" @@ -30,7 +30,7 @@ Runloop | Oragekk's Blog - + @@ -40,6 +40,6 @@
  • 维护线程的生命周期,让线程不自动退出,isFinished
      为  Yes时退出

  • 在一定时间内监听某种事件,或执行某种任务的线程


  • ####提示:一般在开发中很少会主动创建 Runloop,而通常会把事件添加到 Runloop 中。

    ###参考文章
    官方文档
    深入理解 Runloop
    Runloop 原理和核心机制

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git "a/posts/iOS/system/iOS\346\236\232\344\270\276\347\261\273\345\236\213enum\357\274\214NS_ENUM\357\274\214NS_OPTIONS.html" "b/posts/iOS/system/iOS\346\236\232\344\270\276\347\261\273\345\236\213enum\357\274\214NS_ENUM\357\274\214NS_OPTIONS.html" index 1ef06322f..efdf33160 100644 --- "a/posts/iOS/system/iOS\346\236\232\344\270\276\347\261\273\345\236\213enum\357\274\214NS_ENUM\357\274\214NS_OPTIONS.html" +++ "b/posts/iOS/system/iOS\346\236\232\344\270\276\347\261\273\345\236\213enum\357\274\214NS_ENUM\357\274\214NS_OPTIONS.html" @@ -30,7 +30,7 @@ OC 中的枚举类型 | Oragekk's Blog - + @@ -76,6 +76,6 @@ };

    共同学习共同进步,加油。fighting😆

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git "a/posts/iOS/system/iOS\347\232\204Cookie\344\275\277\347\224\250.html" "b/posts/iOS/system/iOS\347\232\204Cookie\344\275\277\347\224\250.html" index 9295e8fa5..e095d2e86 100644 --- "a/posts/iOS/system/iOS\347\232\204Cookie\344\275\277\347\224\250.html" +++ "b/posts/iOS/system/iOS\347\232\204Cookie\344\275\277\347\224\250.html" @@ -30,7 +30,7 @@ iOS Cookie的配置及使用 | Oragekk's Blog - + @@ -98,6 +98,6 @@ }];
    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git "a/posts/iOS/system/iOS\347\250\213\345\272\217\345\220\257\345\212\250\345\216\237\347\220\206\357\274\210\344\270\212\357\274\211.html" "b/posts/iOS/system/iOS\347\250\213\345\272\217\345\220\257\345\212\250\345\216\237\347\220\206\357\274\210\344\270\212\357\274\211.html" index 161d08c6a..d70c5a40e 100644 --- "a/posts/iOS/system/iOS\347\250\213\345\272\217\345\220\257\345\212\250\345\216\237\347\220\206\357\274\210\344\270\212\357\274\211.html" +++ "b/posts/iOS/system/iOS\347\250\213\345\272\217\345\220\257\345\212\250\345\216\237\347\220\206\357\274\210\344\270\212\357\274\211.html" @@ -30,7 +30,7 @@ iOS程序启动原理(上) | Oragekk's Blog - + @@ -61,6 +61,6 @@

    获得某个 UIView 所在的 UIWindow.

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git "a/posts/iOS/system/iOS\347\250\213\345\272\217\345\220\257\345\212\250\345\216\237\347\220\206\357\274\210\344\270\213\357\274\211.html" "b/posts/iOS/system/iOS\347\250\213\345\272\217\345\220\257\345\212\250\345\216\237\347\220\206\357\274\210\344\270\213\357\274\211.html" index 0731e6147..fefb9cfff 100644 --- "a/posts/iOS/system/iOS\347\250\213\345\272\217\345\220\257\345\212\250\345\216\237\347\220\206\357\274\210\344\270\213\357\274\211.html" +++ "b/posts/iOS/system/iOS\347\250\213\345\272\217\345\220\257\345\212\250\345\216\237\347\220\206\357\274\210\344\270\213\357\274\211.html" @@ -30,7 +30,7 @@ iOS程序启动原理(下) | Oragekk's Blog - + @@ -44,6 +44,6 @@

    argc, argv:直接传递给 UIApplicationMain 进行相关处理即可;

    principalClassName:指定应用程序类名(app 象征),该类必须是 UIApplication(或子类).如果为 nil,则用 UIApplication 类作为默认值.

    delegateClassName:指定应用程序的代理类,该类必须遵守 UIApplicationDelegate 协议.

    UIApplicationMain 函数会根据 principalClassName 创建 UIApplication 对象,根据 delegateClassName 创建一个 delegate 对象,并将该 delegate 对象赋值给 UIApplication 对象中的 delegate 属性.

    接着会建立应用程序的 Main Runloop(事件循环),进行事件的处理(首先会在程序启动完毕后调用 delegate 对象的 application:didFinishLaunchingWithOptions:方法)

    程序正常退出时 UIApplicationMain 函数才返回.

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/iOS/system/index.html b/posts/iOS/system/index.html index 0e23b431b..35ac0d8f3 100644 --- a/posts/iOS/system/index.html +++ b/posts/iOS/system/index.html @@ -30,13 +30,13 @@ 系统 | Oragekk's Blog - + - + diff --git "a/posts/iOS/system/keychain\346\233\264\346\226\260.html" "b/posts/iOS/system/keychain\346\233\264\346\226\260.html" index 3ab926bb9..a46faabef 100644 --- "a/posts/iOS/system/keychain\346\233\264\346\226\260.html" +++ "b/posts/iOS/system/keychain\346\233\264\346\226\260.html" @@ -30,13 +30,13 @@ iOS 10.3 keychain 重大更新 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git "a/posts/iOS/system/runtime\345\277\253\351\200\237\345\275\222\346\241\243.html" "b/posts/iOS/system/runtime\345\277\253\351\200\237\345\275\222\346\241\243.html" index 001fb0e33..3c00f4fa7 100644 --- "a/posts/iOS/system/runtime\345\277\253\351\200\237\345\275\222\346\241\243.html" +++ "b/posts/iOS/system/runtime\345\277\253\351\200\237\345\275\222\346\241\243.html" @@ -30,13 +30,13 @@ 利用Runtime进行快速归档 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/iOS/tool/Update-Cocoapods.html b/posts/iOS/tool/Update-Cocoapods.html index 0db1fdcee..02b606f8f 100644 --- a/posts/iOS/tool/Update-Cocoapods.html +++ b/posts/iOS/tool/Update-Cocoapods.html @@ -30,13 +30,13 @@ Update Cocoapods 1.1.1 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/iOS/tool/ijkplayer.html b/posts/iOS/tool/ijkplayer.html index d5fbcbb1b..92be3a5ce 100644 --- a/posts/iOS/tool/ijkplayer.html +++ b/posts/iOS/tool/ijkplayer.html @@ -30,13 +30,13 @@ ijkPlayer 集成 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/iOS/tool/index.html b/posts/iOS/tool/index.html index 554306673..3c9d50745 100644 --- a/posts/iOS/tool/index.html +++ b/posts/iOS/tool/index.html @@ -30,13 +30,13 @@ tools | Oragekk's Blog - +
    跳至主要內容
    - + diff --git "a/posts/iOS/tool/\345\233\276\347\211\207\344\270\212\344\274\240\345\216\213\347\274\251\347\256\227\346\263\225.html" "b/posts/iOS/tool/\345\233\276\347\211\207\344\270\212\344\274\240\345\216\213\347\274\251\347\256\227\346\263\225.html" index 3262b4def..edc5f3098 100644 --- "a/posts/iOS/tool/\345\233\276\347\211\207\344\270\212\344\274\240\345\216\213\347\274\251\347\256\227\346\263\225.html" +++ "b/posts/iOS/tool/\345\233\276\347\211\207\344\270\212\344\274\240\345\216\213\347\274\251\347\256\227\346\263\225.html" @@ -30,7 +30,7 @@ iOS - Image compression algorithm | Oragekk's Blog - + @@ -192,6 +192,6 @@ }
    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git "a/posts/iOS/tool/\351\205\215\347\275\256https.html" "b/posts/iOS/tool/\351\205\215\347\275\256https.html" index 5f75b0420..d81da8d50 100644 --- "a/posts/iOS/tool/\351\205\215\347\275\256https.html" +++ "b/posts/iOS/tool/\351\205\215\347\275\256https.html" @@ -30,7 +30,7 @@ iOS 配置https | Oragekk's Blog - + @@ -49,6 +49,6 @@ [httpManager setSecurityPolicy:securityPolicy];
    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git "a/posts/iOS/ui/cell\345\244\215\347\224\250-accessoryType\350\247\243\345\206\263\345\212\236\346\263\225.html" "b/posts/iOS/ui/cell\345\244\215\347\224\250-accessoryType\350\247\243\345\206\263\345\212\236\346\263\225.html" index 3e0f585fc..3b1b5a8c6 100644 --- "a/posts/iOS/ui/cell\345\244\215\347\224\250-accessoryType\350\247\243\345\206\263\345\212\236\346\263\225.html" +++ "b/posts/iOS/ui/cell\345\244\215\347\224\250-accessoryType\350\247\243\345\206\263\345\212\236\346\263\225.html" @@ -30,7 +30,7 @@ Cell的accessoryType属性标记单元格之后,出现的重用问题 | Oragekk's Blog - + @@ -98,6 +98,6 @@ [self.tableView indexPathsForVisibleRows];
    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/iOS/ui/index.html b/posts/iOS/ui/index.html index 67f38b52f..66444a7e0 100644 --- a/posts/iOS/ui/index.html +++ b/posts/iOS/ui/index.html @@ -30,13 +30,13 @@ UI相关 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/posts/iOS/ui/tableview-radius.html b/posts/iOS/ui/tableview-radius.html index bfb770581..860a2168e 100644 --- a/posts/iOS/ui/tableview-radius.html +++ b/posts/iOS/ui/tableview-radius.html @@ -30,7 +30,7 @@ TableView性能优化 | Oragekk's Blog - + @@ -78,6 +78,6 @@

    4.模拟器Color Blended LayersColor Misaligned Images检测结果如下图

    优化之后
    优化之后

    5.Color Misaligned Images 如果是黄色说明图像做过拉伸处理,如果在 tableView 快速滚动中,附加操作越多,性能越差
    使用如上方法不仅可以裁切圆角头像,同时解决了 800***800 设置在 200*200 的 ImageView 上会拉伸的问题
    此举可以帮助 tableView 提升一部分性能

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git "a/posts/iOS/ui/textfiled\351\231\220\345\210\266\350\276\223\345\205\245\345\255\227\347\254\246.html" "b/posts/iOS/ui/textfiled\351\231\220\345\210\266\350\276\223\345\205\245\345\255\227\347\254\246.html" index fca64cc9b..83fc833c5 100644 --- "a/posts/iOS/ui/textfiled\351\231\220\345\210\266\350\276\223\345\205\245\345\255\227\347\254\246.html" +++ "b/posts/iOS/ui/textfiled\351\231\220\345\210\266\350\276\223\345\205\245\345\255\227\347\254\246.html" @@ -30,7 +30,7 @@ textfield限制输入字符 | Oragekk's Blog - + @@ -99,6 +99,6 @@ }
    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/iOS/ui/timelineLogistics.html b/posts/iOS/ui/timelineLogistics.html index 5fa615a81..b16200625 100644 --- a/posts/iOS/ui/timelineLogistics.html +++ b/posts/iOS/ui/timelineLogistics.html @@ -30,7 +30,7 @@ iOS timelineLogistics | Oragekk's Blog - + @@ -65,6 +65,6 @@ [self.view addSubview:logis];

    Demo下载,如果对你有帮助麻烦点个Star

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git "a/posts/iOS/ui/\344\274\230\351\233\205\347\232\204cell\345\215\225\351\200\211.html" "b/posts/iOS/ui/\344\274\230\351\233\205\347\232\204cell\345\215\225\351\200\211.html" index 8c3d246ff..0cdeb69e3 100644 --- "a/posts/iOS/ui/\344\274\230\351\233\205\347\232\204cell\345\215\225\351\200\211.html" +++ "b/posts/iOS/ui/\344\274\230\351\233\205\347\232\204cell\345\215\225\351\200\211.html" @@ -30,7 +30,7 @@ 优雅的实现TableViewCell单选 | Oragekk's Blog - + @@ -45,6 +45,6 @@ }
  • didSelectRowAtIndexPath方法中给点击的 cell 手动选中,并不需要刷新表格

    [tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone];
  • 至此结束,可以看一下效果
    效果图.md.gif

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/posts/index.html b/posts/index.html index fb0774393..4cad8e7e1 100644 --- a/posts/index.html +++ b/posts/index.html @@ -30,13 +30,13 @@ Posts | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/private/index.html b/private/index.html index ec6eb0a6c..ec23b1d34 100644 --- a/private/index.html +++ b/private/index.html @@ -30,13 +30,13 @@ Private | Oragekk's Blog - +
    跳至主要內容
    - + diff --git "a/private/\344\270\200\344\272\272\344\270\200\345\217\245\345\256\213\350\257\215.html" "b/private/\344\270\200\344\272\272\344\270\200\345\217\245\345\256\213\350\257\215.html" index 28ebcf77e..c5bcb72a8 100644 --- "a/private/\344\270\200\344\272\272\344\270\200\345\217\245\345\256\213\350\257\215.html" +++ "b/private/\344\270\200\344\272\272\344\270\200\345\217\245\345\256\213\350\257\215.html" @@ -30,13 +30,13 @@ 一人一句宋词 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/rss.xml b/rss.xml index cc8d9dbd1..cb2c21fe4 100644 --- a/rss.xml +++ b/rss.xml @@ -6,8 +6,8 @@ https://oragekk.me/ 上冬十二的博客 zh-CN - Thu, 30 May 2024 12:12:59 GMT - Thu, 30 May 2024 12:12:59 GMT + Thu, 30 May 2024 12:14:51 GMT + Thu, 30 May 2024 12:14:51 GMT @vuepress/plugin-feed https://validator.w3.org/feed/docs/rss2.html Vue diff --git a/service-worker.js b/service-worker.js index 33b3ee586..5295fbd2a 100644 --- a/service-worker.js +++ b/service-worker.js @@ -1 +1 @@ -if(!self.define){let e,s={};const a=(a,i)=>(a=new URL(a+".js",i).href,s[a]||new Promise((s=>{if("document"in self){const e=document.createElement("script");e.src=a,e.onload=s,document.head.appendChild(e)}else e=a,importScripts(a),s()})).then((()=>{let e=s[a];if(!e)throw new Error(`Module ${a} didn’t register its module`);return e})));self.define=(i,d)=>{const r=e||("document"in self?document.currentScript.src:"")||location.href;if(s[r])return;let c={};const f=e=>a(e,r),t={module:{uri:r},exports:c,require:f};s[r]=Promise.all(i.map((e=>t[e]||f(e)))).then((e=>(d(...e),c)))}}define(["./workbox-b584cb72"],(function(e){"use strict";self.addEventListener("message",(e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()})),e.clientsClaim(),e.precacheAndRoute([{url:"assets/1.html-DxIDPIch.js",revision:"d3030d1d47823e83738fe5d5d73622b4"},{url:"assets/2.html-BjF3APTC.js",revision:"42a739680f6a78f3f7e043c22199babf"},{url:"assets/3.html-DWdPtRSF.js",revision:"0635b447b6bb42fabe95abdbc277ad6c"},{url:"assets/4.html-CN6JWxUH.js",revision:"d86e2172c3dd736f9f6f2883b2fb9b0a"},{url:"assets/404.html-BOcMMntT.js",revision:"a937fc61adf9bd99be3e72df513f5944"},{url:"assets/5.html-BjDVrj8X.js",revision:"0c8ec7beb4627c85ade5a418be5ae3fb"},{url:"assets/about.html-CylbYPmv.js",revision:"fd7c9f27cbcd2a4431d05fc2b4cd0115"},{url:"assets/AFNETworking-A-memory-leak.html-DS8aVVjh.js",revision:"84ee997eef719bdbece3956309b78564"},{url:"assets/APlayer.min-CAgWaKXK.js",revision:"497ca75d3d002890ca0ece0b4c1b80d7"},{url:"assets/APlayer.min-l0sNRNKZ.js",revision:"68b329da9893e34099c7d8ad5cb9c940"},{url:"assets/app-DK0NGD4b.js",revision:"e99d1487f300d7ac844b76203b9e3f27"},{url:"assets/arc-CDlJoJew.js",revision:"41a922cee3c0d32657ccb40181b8338e"},{url:"assets/array-BKyUJesY.js",revision:"17dcebeaf673b09a1ca5da014d20022f"},{url:"assets/auto-CAdRPfCH.js",revision:"7f70af0686c2be25e7afd510cd83c172"},{url:"assets/auto-push.html-D17FSYQJ.js",revision:"ee8281e2fc69ac7dee41ca891cef3736"},{url:"assets/bg.svg",revision:"cf398a4e163baf4a18104368cbe4b813"},{url:"assets/blockDiagram-9f4a6865-CJZvLd5l.js",revision:"964821188b6cfd46f2785961bc66af9c"},{url:"assets/c4Diagram-ae766693-CFbNl8xZ.js",revision:"d31304d0ef2ca03c61022d1173881e6b"},{url:"assets/calculation.html-CxxpMJ9g.js",revision:"906e82e190bab5341bea952ba38dbe92"},{url:"assets/cell复用-accessoryType解决办法.html-WzaLR-7a.js",revision:"cc0e5bd2d93ce1a430f18d55cc59e23b"},{url:"assets/channel-CEcVRXZH.js",revision:"620a9318e730232287446830908f3e11"},{url:"assets/classDiagram-fb54d2a0--DERepoS.js",revision:"640e26afdf03014cfa69e8110f044101"},{url:"assets/classDiagram-v2-a2b738ad-DYu116ai.js",revision:"de3dc43263828909dc1490b8c662ae3e"},{url:"assets/clone-BRRhknar.js",revision:"46fcd6bb523470a2af79ade970047387"},{url:"assets/codemirror-editor-rzQ_Hkkw.js",revision:"0bf504ad5fb3a74ff54645e211fc4187"},{url:"assets/collect.html-BWbOwF3F.js",revision:"4b6cd8030c7a00a9b3a8ba5f859329e8"},{url:"assets/commonjsHelpers-Cpj98o6Y.js",revision:"146eaf85c344cee008c91f2685dbf82f"},{url:"assets/component-5fPsKYVS.js",revision:"bdbbc178ff2b9ceb83ea5353023ad071"},{url:"assets/concurrency.html-DlO2sR8b.js",revision:"652223ded4591eb223116992625f145f"},{url:"assets/containing-block.html-llWi_HeU.js",revision:"3a5064794051e8565d1fbec271cab033"},{url:"assets/coreML.html-DjJoLv9w.js",revision:"25f382e6776b58bbb90d2fdbe2547ed5"},{url:"assets/createText-ca0c5216-WShyIQHK.js",revision:"0fe9be4742bf8d52239e572a58ef9561"},{url:"assets/design.html-B2WuonX6.js",revision:"d160868ec75f22bda03312669c4d0125"},{url:"assets/disable.html-CM4jRKGE.js",revision:"85a50ef4014fa3153ea5cfd5d263a80a"},{url:"assets/disqus.html-CxYxPEEs.js",revision:"b8409c9e63bf8c549be7534ef355cab8"},{url:"assets/docsearch-l0sNRNKZ.js",revision:"68b329da9893e34099c7d8ad5cb9c940"},{url:"assets/edges-066a5561-Bi8FBbqv.js",revision:"f05c13c92529d9e4f18c6be6f4021c27"},{url:"assets/encrypt.html-UwwuLb7K.js",revision:"1a3b04545ca1bfc06f11b9671a6ca48d"},{url:"assets/erDiagram-09d1c15f-BaBhXm13.js",revision:"7c158ddc86531b863d64b9562060ff0e"},{url:"assets/event-loop.html-DHHPCnis.js",revision:"18daa6a99efe5eb50ff47c5adeca9fdb"},{url:"assets/first-time.html-J91D8aTI.js",revision:"0cacc670e59a062a626f00dbdd6b2545"},{url:"assets/flowchart-966sEcGG.js",revision:"22ae562fadded7c906d7297d1f7c64f0"},{url:"assets/flowchart-elk-definition-ae0efee6-D-4jAEoh.js",revision:"7a60b392037befe879f8fb5710580a3e"},{url:"assets/flowDb-c1833063-BHTgQC9h.js",revision:"b910050c764d77c7af49cfd5b6f390bf"},{url:"assets/flowDiagram-b222e15a-BPa11VDl.js",revision:"448047327d4e05ff9683e4911b56a6f6"},{url:"assets/flowDiagram-v2-13329dc7-B0yugrmJ.js",revision:"f7928aa47da08862624390e4a0186d11"},{url:"assets/friend.html-WsXEmezc.js",revision:"730c5b523e69fcad7994041956133fc7"},{url:"assets/ganttDiagram-b62c793e-DcvMxze5.js",revision:"71101f523e51fba648ae5f6bf07a50b9"},{url:"assets/gitGraphDiagram-942e62fe-DnWWCpdw.js",revision:"6b45d54096a84ea1fee4a2c8fe606985"},{url:"assets/github-action.html-BSkHjfHR.js",revision:"f0e9360b1b84ce2ce81eeb07d9bbd6e4"},{url:"assets/github.svg",revision:"46049e5d9defd62a673d36f226fd3fe5"},{url:"assets/graph-t0m-0ZBC.js",revision:"0a1fa2097409df6e453fe55aee892c95"},{url:"assets/highlight.esm-C34tS8ua.js",revision:"9f54844d940e046894f2d0fc42704cf6"},{url:"assets/idx-dev.html-DX7IIvoO.js",revision:"8880fd0ef11f75f23e1494fce13b6906"},{url:"assets/ijkplayer.html-DYH_59A9.js",revision:"d8f2dfdba23c75c219acc10b9ccda43b"},{url:"assets/images/github.svg",revision:"471d3c2c209dba9c47637de6fae15a1f"},{url:"assets/index-01f381cb-B4SIcTsY.js",revision:"d966e768131000c1686b17ec3d6ca746"},{url:"assets/index-DTEEl-sV.js",revision:"46a193641571106d3b7b43f9bc2a2735"},{url:"assets/index-wZ-hXvzw.js",revision:"e80f63302e5fb9e9be29399c386ef22f"},{url:"assets/index-zMbLkDvU.js",revision:"31f36bdf766eca20dff7683b6d0b15c7"},{url:"assets/index.html-_UHNWYY4.js",revision:"ec6bab5fa99e5dd6adabeb120618316f"},{url:"assets/index.html--_guqIUT.js",revision:"176af5526c012980b80ed82ae0d1517d"},{url:"assets/index.html-0I13WEYH.js",revision:"cd3a17796bd46b3e2d464b661c1cd6a3"},{url:"assets/index.html-2wxImmTk.js",revision:"ee3774561f1e2957d86fa0bef9c38538"},{url:"assets/index.html-7BmsLxpe.js",revision:"c17e4addee9d40de2795c559cd7ed2c7"},{url:"assets/index.html-aHrvJB7m.js",revision:"b400b3b14d4825603584f7eabd08d913"},{url:"assets/index.html-B24UmZ3c.js",revision:"58712ab30a520f08ded7d34930accc40"},{url:"assets/index.html-B6SQcRYY.js",revision:"fdd810b95d540c1b167cc64827d47255"},{url:"assets/index.html-B8IfBxJw.js",revision:"dea4caa9afc8934321e0cb7c94bda056"},{url:"assets/index.html-BANwDHHg.js",revision:"8403753fca1edaefaaf2b326e6991c21"},{url:"assets/index.html-BCbm_nto.js",revision:"73afdcacbe8ea8e39f23e563b7fce8ee"},{url:"assets/index.html-BcKeSK_s.js",revision:"6f91cc9ca4be7b48582e013b993898bd"},{url:"assets/index.html-BdOkWTBv.js",revision:"495b462b1771c8134fcb31e90b12c8d6"},{url:"assets/index.html-BeDYnZcj.js",revision:"f698a3656040f86fb244d0e3a8b3534f"},{url:"assets/index.html-BfBhj_lQ.js",revision:"a676283aa3f92c0dc92c81adb0fa4085"},{url:"assets/index.html-BfTo8ZXh.js",revision:"f3ff3363189e003bea74a3e5d9b081d6"},{url:"assets/index.html-BGrS7w8j.js",revision:"9daef5888cf26af9ae7c2cceea98f830"},{url:"assets/index.html-Bh_shHQG.js",revision:"6c507101ab8aebd311e1e4a0c6164675"},{url:"assets/index.html-BHNX8lHa.js",revision:"7235d5a8a21d8c1fc05c0e71fccbadde"},{url:"assets/index.html-BKzgiLbn.js",revision:"c70d792ee8a77127b46d10df962dfa28"},{url:"assets/index.html-BMbUrkLD.js",revision:"a359fa942e68544c529a682fe4e7cbcd"},{url:"assets/index.html-BMnaZ-jn.js",revision:"f5f8d33d821f284eaf39c4dfbd4f4526"},{url:"assets/index.html-BRlFmOM3.js",revision:"bd7b2005682aa79e0a09ab6dd01d03b6"},{url:"assets/index.html-BsGg9JHG.js",revision:"95c2366aca9d9a502bc72921d3563693"},{url:"assets/index.html-BT5Al4Uh.js",revision:"a235146b8ae9457b554a02128b8c946a"},{url:"assets/index.html-BWtg79U3.js",revision:"ef87b5861dc4464b28f5ca615bd83c55"},{url:"assets/index.html-BznIiO4q.js",revision:"d21ea2b50c134bcc4c8006fd6bd88294"},{url:"assets/index.html-C-WAz17P.js",revision:"9a8c2d94385419feb3284e6fb7a8da3b"},{url:"assets/index.html-CcIJ9lCh.js",revision:"f805a3ade06a7bd19e71ce8471c2c7d8"},{url:"assets/index.html-CFn43VWC.js",revision:"da327f86616564b12dd30c74b70235d2"},{url:"assets/index.html-CgOaQnuR.js",revision:"db33c088a3a2f4d28a69685634559f35"},{url:"assets/index.html-CGZoWHUA.js",revision:"7c2ace1b055978208d7778285ffc70f1"},{url:"assets/index.html-CjY8Uucp.js",revision:"c36d7913dc1f74c925ed4037ef58df2a"},{url:"assets/index.html-Ck1-pcnf.js",revision:"bf89411bcd33a33cf0fc687c12e37060"},{url:"assets/index.html-CkOyTSf1.js",revision:"3b0d41bfddc14636f229c7bfdf0973e3"},{url:"assets/index.html-ClzqIRhn.js",revision:"da9ec7ecd592ff8bb5c5018c0eb4e6f1"},{url:"assets/index.html-CMjWH84n.js",revision:"b31a108b4049c08df217736fdc56587c"},{url:"assets/index.html-COBE3tfZ.js",revision:"bf930d81c656a9daab4cb5be7d2376fb"},{url:"assets/index.html-CogDCXnE.js",revision:"d0cca341669bc0ea6313e6dc88da334a"},{url:"assets/index.html-CpJRsOgm.js",revision:"9592a60055210aeeb62a9dbacc1a690f"},{url:"assets/index.html-CQO5u6cq.js",revision:"af5ee6567a6707d114d3fa4834f5ac21"},{url:"assets/index.html-CTs0dYQ6.js",revision:"46eebbfd4ab9902c5a2ad03111711417"},{url:"assets/index.html-CTSDmUDd.js",revision:"2e390a919368d30593e4f2d226804f5c"},{url:"assets/index.html-CUlzZydO.js",revision:"a8226b30b66db8c2873fe497a151fdbe"},{url:"assets/index.html-CvUfUCig.js",revision:"870afe5d0b673bc8fbc89915946d6756"},{url:"assets/index.html-CW51vxDQ.js",revision:"f2b9f2beacfcb30a512fa853750be42f"},{url:"assets/index.html-Cx8V59AO.js",revision:"f23e3a9925ed80a8694a0863713ceb43"},{url:"assets/index.html-Cz9bRKQf.js",revision:"c0d726cf19a3e5b78cd134cb561519c9"},{url:"assets/index.html-D1Qr__AN.js",revision:"3ded929a09e73cc67b722eedcd4e150a"},{url:"assets/index.html-D3FUjzrj.js",revision:"81f7a6230b059ae520353969d76d5d7f"},{url:"assets/index.html-D4W4Hm6R.js",revision:"c0100a956a27dcb3e2bc4b486207dd13"},{url:"assets/index.html-D6f8IMME.js",revision:"4a9e7a79a683d9b7f5a4d1e48eb90e60"},{url:"assets/index.html-D7y4HPEe.js",revision:"50f90da52f33c245a9c4de3a2d2b094f"},{url:"assets/index.html-D8VyuQ47.js",revision:"265f6044ac9b9496a5f2320aff88f519"},{url:"assets/index.html-DaF1LWFa.js",revision:"8885caf3c35ead6d6d08dccabc5d8b26"},{url:"assets/index.html-DaoaCAaT.js",revision:"8804f48dda5357b645acedef4db92520"},{url:"assets/index.html-DbQEnJ5X.js",revision:"63ad802879614566e2841f7f7d24a5b6"},{url:"assets/index.html-DbxZmXuN.js",revision:"5e56ee8339083d63e16348c64d00b9b3"},{url:"assets/index.html-DCAqAoLH.js",revision:"f2f2221cf756af6561a3fdaca0d1e722"},{url:"assets/index.html-DcucDcOI.js",revision:"424f7911803910c791a7a9dec69ef2fa"},{url:"assets/index.html-DDekXDOr.js",revision:"b48fe1c917fd2f54d1aa285e609df548"},{url:"assets/index.html-DefDrGlr.js",revision:"8daa7446ee62c5019305aa8da850052a"},{url:"assets/index.html-DHi8T-Ot.js",revision:"ad9b644afc747c2f8fd35668941ad1d7"},{url:"assets/index.html-DiKmiW7_.js",revision:"6795c2cfed663f6ba90709da0ed58300"},{url:"assets/index.html-DIodQO6H.js",revision:"007d7535a434e26affebccd578d5db31"},{url:"assets/index.html-DIYXcKUa.js",revision:"10a341ae9a8c97f7374064d93928e139"},{url:"assets/index.html-Djn19ujE.js",revision:"db64731ad9506aefc43f96c4c33b5897"},{url:"assets/index.html-Dk_3wF-1.js",revision:"ea17188f15ffb26f403b27c54af3c5fe"},{url:"assets/index.html-DK5_NOrh.js",revision:"389036e56f779d56512194e0963d9783"},{url:"assets/index.html-DlXp6cK_.js",revision:"e42688491e052fdb7270b9271ceb8416"},{url:"assets/index.html-DNc1Kv9t.js",revision:"296703aeba3e37428265b5778481e66a"},{url:"assets/index.html-DNP_6u_p.js",revision:"7b6358f9863322fa956d28bbbab732a6"},{url:"assets/index.html-DO4g9yRu.js",revision:"b58793063e6f40e5289a3bd03356aeaa"},{url:"assets/index.html-Dq_Hy3CT.js",revision:"8f6aaa4d89f2505b1a8f3966b05b94b6"},{url:"assets/index.html-DUUsKQyS.js",revision:"dfd4c8b4aec8a39d8d80b20a95b290d9"},{url:"assets/index.html-DvdbYPdV.js",revision:"1d936b5de46624ea34edd8a77589fe24"},{url:"assets/index.html-DVDNh336.js",revision:"497bff5673ee5ba48c7f0d9d28559ba0"},{url:"assets/index.html-DWMuixxd.js",revision:"3fe16126be0483424ffab632609fa481"},{url:"assets/index.html-DXLy607X.js",revision:"317922013b26744ecebf01d32b063121"},{url:"assets/index.html-DXN0rgeW.js",revision:"9a3b7acda5ad57cddff1e343b2e0e62c"},{url:"assets/index.html-DYa_xr2h.js",revision:"e49a4b3734563b0883123d8839e3d020"},{url:"assets/index.html-Dzbu9gXH.js",revision:"4300316d436ef88f9897eb0ed7125386"},{url:"assets/index.html-EB1YKzwO.js",revision:"4bed9dd5f585d3eb0e8658627d963d97"},{url:"assets/index.html-fw3gb88Y.js",revision:"6dca77d9e972d4f1f4da47fcd6ecdaaa"},{url:"assets/index.html-GbvzpQYI.js",revision:"06434761894f2517a42c13cd99a44ba8"},{url:"assets/index.html-h4hAdFFl.js",revision:"6ac5a8fc276806e10c643f9aa75f7e69"},{url:"assets/index.html-H6iun3DI.js",revision:"47f439f0aaa403fa61aecbf9cf1079af"},{url:"assets/index.html-KcOjwPEG.js",revision:"3d8b4eeb86ae74e9c404509227f4e034"},{url:"assets/index.html-kZ_twGmY.js",revision:"e57602748537ff6c653f1583454e24f0"},{url:"assets/index.html-l6wcShk-.js",revision:"a240753563ce8dd6cdfec82c65e18f3f"},{url:"assets/index.html-LgJKHL3q.js",revision:"0cd338c2c1dbb65492f3d65327d9d552"},{url:"assets/index.html-pGqmqT-A.js",revision:"0d986c227609f2d2caf809e4c1c1b696"},{url:"assets/index.html-rvgR71_h.js",revision:"f3c16091a5629ba53dea9128b0fe7b1f"},{url:"assets/index.html-VeopVlz7.js",revision:"579f6033f6e7813d42ed4ebd1580459e"},{url:"assets/index.html-wTSB8jdo.js",revision:"f000ceba653fb23e8bf90fe37eaec067"},{url:"assets/index.html-WUZJohtd.js",revision:"187f6fec61d171d2cf896547eaa476fa"},{url:"assets/index.html-yUURlVM8.js",revision:"affb209ababb17683d8b420126c24276"},{url:"assets/infoDiagram-94cd232f-DpWz73TC.js",revision:"e2c08ba9d4dad86130c418fe2904fd4a"},{url:"assets/init-Gi6I4Gst.js",revision:"3ce28180466443e9b617d7b96e9f7b8f"},{url:"assets/intro.html-B_EmzxVc.js",revision:"70651be290cb13af13a23cca721b064a"},{url:"assets/iOS中的Runloop.html-Dz5uhq0z.js",revision:"eaf520731ff8393698a99951b192d0cd"},{url:"assets/iOS枚举类型enum,NS_ENUM,NS_OPTIONS.html--IvWD_b3.js",revision:"c6f96e02c8fcfd77ebdb0ee547c7e673"},{url:"assets/iOS的Cookie使用.html-JqeWUp0j.js",revision:"13476fcb0f48134a015e5652aeafe3db"},{url:"assets/iOS程序启动原理(上).html-GXkqB9GE.js",revision:"7672a66d58ccb09e5702e4989edb38e9"},{url:"assets/iOS程序启动原理(下).html-Bnp6Wyby.js",revision:"3c2c2db0760f9fc19907356c57d85a53"},{url:"assets/iterm2-pure.html-DozIMjEE.js",revision:"b1adf9c46ae19b58954356b6859d47d5"},{url:"assets/JavaScriptBridge.html-BwZ34i68.js",revision:"ccacfd62b7b303176f87459cff555cd3"},{url:"assets/jekyll.html-BrwHzJtx.js",revision:"19b2983be33532a9905842aba1e4704a"},{url:"assets/Jenkins.html-CLfOdyvj.js",revision:"aad18fd2400ec16dbaf9595d22f37d25"},{url:"assets/journeyDiagram-6625b456-B4WkbxvH.js",revision:"0ca91cc184a7ddbbed4390d19d4319c5"},{url:"assets/js-module-loader.html-BUwixnhk.js",revision:"1a74f50d541037dfddd08ebb99c1c47a"},{url:"assets/js-version.html--klunadT.js",revision:"1e6a70db0fdde7c9f79d7a19fd3012c6"},{url:"assets/judgment.html-rV2tRQhp.js",revision:"711f36e09e73b5ea9d3a551199ef1297"},{url:"assets/KaTeX_AMS-Regular-BQhdFMY1.woff2",revision:"66c678209ce93b6e2b583f02ce41529e"},{url:"assets/KaTeX_AMS-Regular-DMm9YOAa.woff",revision:"10824af77e9961cfd548c8a458f10851"},{url:"assets/KaTeX_AMS-Regular-DRggAlZN.ttf",revision:"56573229753fad48910bda2ea1a6dd54"},{url:"assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf",revision:"497bf407c4c609c6cf1f1ad38f437f7f"},{url:"assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff",revision:"de2ba279933d60f7819ff61f71c17bed"},{url:"assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2",revision:"a9e9b0953b078cd40f5e19ef4face6fc"},{url:"assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff",revision:"a25140fbe6692bffe71a2ab861572eb3"},{url:"assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2",revision:"08d95d99bf4a2b2dc7a876653857f154"},{url:"assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf",revision:"e6fb499fc8f9925eea3138cccba17fff"},{url:"assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf",revision:"b9d7c4497cab3702487214651ab03744"},{url:"assets/KaTeX_Fraktur-Bold-BsDP51OF.woff",revision:"40934fc076960bb989d590db044fef62"},{url:"assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2",revision:"796f3797cdf36fcaea18c3070a608378"},{url:"assets/KaTeX_Fraktur-Regular-CB_wures.ttf",revision:"97a699d83318e9334a0deaea6ae5eda2"},{url:"assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2",revision:"f9e6a99f4a543b7d6cad1efb6cf1e4b1"},{url:"assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff",revision:"e435cda5784e21b26ab2d03fbcb56a99"},{url:"assets/KaTeX_Main-Bold-Cx986IdX.woff2",revision:"a9382e25bcf75d856718fcef54d7acdb"},{url:"assets/KaTeX_Main-Bold-Jm3AIy58.woff",revision:"4cdba6465ab9fac5d3833c6cdba7a8c3"},{url:"assets/KaTeX_Main-Bold-waoOVXN0.ttf",revision:"8e431f7ece346b6282dae3d9d0e7a970"},{url:"assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2",revision:"d873734390c716d6e18ff3f71ac6eb8b"},{url:"assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf",revision:"52fb39b0434c463d5df32419608ab08a"},{url:"assets/KaTeX_Main-BoldItalic-SpSLRI95.woff",revision:"5f875f986a9bce1264e8c42417b56f74"},{url:"assets/KaTeX_Main-Italic-3WenGoN9.ttf",revision:"39349e0a2b366f38e2672b45aded2030"},{url:"assets/KaTeX_Main-Italic-BMLOBm91.woff",revision:"8ffd28f6390231548ead99d7835887fa"},{url:"assets/KaTeX_Main-Italic-NWA7e6Wa.woff2",revision:"652970624cde999882102fa2b6a8871f"},{url:"assets/KaTeX_Main-Regular-B22Nviop.woff2",revision:"f8a7f19f45060f7a177314855b8c7aa3"},{url:"assets/KaTeX_Main-Regular-Dr94JaBh.woff",revision:"f1cdb692ee31c10b37262caffced5271"},{url:"assets/KaTeX_Main-Regular-ypZvNtVU.ttf",revision:"818582dae57e6fac46202cfd844afabb"},{url:"assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf",revision:"6589c4f1f587f73f0ad0af8ae35ccb53"},{url:"assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2",revision:"1320454d951ec809a7dbccb4f23fccf0"},{url:"assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff",revision:"48155e43d9a284b54753e50e4ba586dc"},{url:"assets/KaTeX_Math-Italic-DA0__PXp.woff",revision:"ed7aea12d765f9e2d0f9bc7fa2be626c"},{url:"assets/KaTeX_Math-Italic-flOr_0UB.ttf",revision:"fe5ed5875d95b18c98546cb4f47304ff"},{url:"assets/KaTeX_Math-Italic-t53AETM-.woff2",revision:"d8b7a801bd87b324efcbae7394119c24"},{url:"assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf",revision:"f2ac73121357210d91e5c3eaa42f72ea"},{url:"assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2",revision:"ad546b4719bcf690a3604944b90b7e42"},{url:"assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff",revision:"0e897d27f063facef504667290e408bd"},{url:"assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2",revision:"e934cbc86e2d59ceaf04102c43dc0b50"},{url:"assets/KaTeX_SansSerif-Italic-DN2j7dab.woff",revision:"ef725de572b71381dccf53918e300744"},{url:"assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf",revision:"f60b4a34842bb524b562df092917a542"},{url:"assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf",revision:"3243452ee6817acd761c9757aef93c29"},{url:"assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff",revision:"5f8637ee731482c44a37789723f5e499"},{url:"assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2",revision:"1ac3ed6ebe34e473519ca1da86f7a384"},{url:"assets/KaTeX_Script-Regular-C5JkGWo-.ttf",revision:"a189c37d73ffce63464635dc12cbbc96"},{url:"assets/KaTeX_Script-Regular-D3wIWfF6.woff2",revision:"1b3161eb8cc67462d6e8c2fb96c68507"},{url:"assets/KaTeX_Script-Regular-D5yQViql.woff",revision:"a82fa2a7e18b8c7a1a9f6069844ebfb9"},{url:"assets/KaTeX_Size1-Regular-C195tn64.woff",revision:"4788ba5b6247e336f734b742fe9900d5"},{url:"assets/KaTeX_Size1-Regular-Dbsnue_I.ttf",revision:"0d8d9204004bdf126342605f7bbdffe6"},{url:"assets/KaTeX_Size1-Regular-mCD8mA8B.woff2",revision:"82ef26dc680ba60d884e051c73d9a42d"},{url:"assets/KaTeX_Size2-Regular-B7gKUWhC.ttf",revision:"1fdda0e59ed35495ebac28badf210574"},{url:"assets/KaTeX_Size2-Regular-Dy4dx90m.woff2",revision:"95a1da914c20455a07b7c9e2dcf2836d"},{url:"assets/KaTeX_Size2-Regular-oD1tc_U0.woff",revision:"b0628bfd27c979a09f702a2277979888"},{url:"assets/KaTeX_Size3-Regular-CTq5MqoE.woff",revision:"4de844d4552e941f6b9c38837a8d487b"},{url:"assets/KaTeX_Size3-Regular-DgpXs0kz.ttf",revision:"963af864cbb10611ba33267ba7953777"},{url:"assets/KaTeX_Size4-Regular-BF-4gkZK.woff",revision:"3045a61f722bc4b198450ce69b3e3824"},{url:"assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2",revision:"61522cd3d9043622e235ab57762754f2"},{url:"assets/KaTeX_Size4-Regular-DWFBv043.ttf",revision:"27a23ee69999affa55491c7dab8e53bf"},{url:"assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff",revision:"0e0460587676d22eae09accd6dcfebc6"},{url:"assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2",revision:"b8b8393d2e65fcebda5fa99fa3264f41"},{url:"assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf",revision:"6bf4287568e1d3004b54d5d60f9f08f9"},{url:"assets/katex-rPiVaalG.js",revision:"5915c991bada2201323e84d17c8b9786"},{url:"assets/keychain更新.html-Cpci4lDi.js",revision:"74bcfd88c9d855dfc871d0834286c46e"},{url:"assets/layout-DTGtEDeo.js",revision:"bfe1043eb1caa1530836e149cc578172"},{url:"assets/line-BR-I_ZNT.js",revision:"67b0dd08542e36aedc26c518a6a2a1e2"},{url:"assets/linear-q1oLBG81.js",revision:"e826346e542aedbd77cce5bf9be5053f"},{url:"assets/link.svg",revision:"9aeae0bbc4c1f0930ea450f7d107f109"},{url:"assets/lyb.svg",revision:"a9d999489d8f17aee495168cd8cc36e7"},{url:"assets/markdown.esm-BG2Xu2Hd.js",revision:"dfebc8121864151002204ef714f81472"},{url:"assets/markdown.html-CJqnZoQf.js",revision:"a7f034cf5d9069161e422216f1610ced"},{url:"assets/math.esm-DN7Rh_EM.js",revision:"fa8c95f2f175318b750e4e8a7aa52fbd"},{url:"assets/mermaid.core-H5Ux720q.js",revision:"f4151328e94be132ef3fb08f0e995725"},{url:"assets/meting2.html-DM0Q7FrO.js",revision:"4746ff47bddfacffba4aa5bdad300588"},{url:"assets/mindmap-definition-307c710a-CvV5XMmV.js",revision:"4dcc91c791aa7cfd63eb40a46f8d1cf0"},{url:"assets/Mylink-eoVYxaQz.js",revision:"888554fcd42bcf2faf7c8b094452b446"},{url:"assets/newbie.html-CDoxvTAF.js",revision:"f61c3e72dae29b767b78deaa2d7ac5b3"},{url:"assets/node-version.html-B2eoMU_-.js",revision:"c1a2229aabe85b071f2017830b7715ab"},{url:"assets/notes.esm-DcquA2oP.js",revision:"ffb473d9bd174a823a767319a6caccfe"},{url:"assets/NSError.html-CFDeKAl3.js",revision:"a3701b9b6c2fa367c88027de37ffdf36"},{url:"assets/NSOperation和NSOPerationQueue.html-q2KmhtqX.js",revision:"84f0443e0e700e866a32c733b9581603"},{url:"assets/optimization.html-BqV2wMWR.js",revision:"0ca3646c8c8a6e547a78b2dba472812f"},{url:"assets/ordinal-Cboi1Yqb.js",revision:"a1d5f6bb98dd6182ddcb9cde64c37dab"},{url:"assets/page.html-DDz2CsQk.js",revision:"dc66ad2478243aeedc0bf9362e2cc194"},{url:"assets/path-CbwjOpE9.js",revision:"f86c0243cb45746453c6b4f7dbd9f34d"},{url:"assets/photoswipe.esm-GXRgw7eJ.js",revision:"9252721b01cd263ae52f9296614a7ddb"},{url:"assets/pieDiagram-bb1d19e5-BdZw2YbP.js",revision:"e60fdc26a72ac37855f58e22c5cc133a"},{url:"assets/principle.html-D4GNJ8s5.js",revision:"792c60de66fa054de9d7fc18772fe05a"},{url:"assets/public-api.html-CQ926TNZ.js",revision:"6900e4373aefb9f7f97608bff7386c14"},{url:"assets/Q_A.html-CRGr32ol.js",revision:"506bcc560f1b84c0f4c90a04b7ca5936"},{url:"assets/quadrantDiagram-c759a472-Z3UKamSk.js",revision:"a6d94d3c957df7b90b5d5dabfbebdd19"},{url:"assets/react1.html-BZTNLiU3.js",revision:"9782d502bfdd430104b57eaab67a7a25"},{url:"assets/react2.html-B1J9Rj8R.js",revision:"e2fb06d96a8f649e101212ed707cebd4"},{url:"assets/react3.html-Bd0R7thV.js",revision:"97f70d780ae790c7e5961e12b4dea2a5"},{url:"assets/Reduced-App- volume.html-hgEX0v9f.js",revision:"f8d2dbab168ced04f0578da578bf98c1"},{url:"assets/requirementDiagram-87253d64-B0Jx20tu.js",revision:"e040e23a59dd4897431c7f70c12c7a2c"},{url:"assets/reveal.esm-CYbl4_PU.js",revision:"d7a2a78c9e57530577ca771ebd6203f1"},{url:"assets/runtime快速归档.html-CG-pn9AQ.js",revision:"3c74aec6ecb919d10ed9f8609b35ad50"},{url:"assets/sankeyDiagram-707fac0f-C98LRDFY.js",revision:"2e127ddc8c628b49e877d0709f9035e9"},{url:"assets/search.esm-DuBqnxcF.js",revision:"d39092c5e0d9959995df72297767dc3f"},{url:"assets/sequenceDiagram-6894f283-B5eYuBCV.js",revision:"8d340970fc26559cca7d61f299272327"},{url:"assets/shoucang.svg",revision:"529e78b2c5188570b6de69fe69a9a0d9"},{url:"assets/slides.html-DijKium8.js",revision:"f2d6cb4e88029b7c87835a4c7c547666"},{url:"assets/ssh-key.html-Bajri3jD.js",revision:"0cdff5a413fa7a145af410f43009eea3"},{url:"assets/stateDiagram-5dee940d-DKP87uom.js",revision:"78dbe548c8fd81bc9a9f179ef35cc731"},{url:"assets/stateDiagram-v2-1992cada-Iu2da0cJ.js",revision:"67f073ddd19ece5d75b7f4672f7ba3f1"},{url:"assets/style-C0ErpWYu.css",revision:"e7e86abadba691307fc2f6c127c56a93"},{url:"assets/style-l0sNRNKZ.js",revision:"68b329da9893e34099c7d8ad5cb9c940"},{url:"assets/styles-0784dbeb-DJqSZ11o.js",revision:"74df631d54f2f1f5111702c4783e4d95"},{url:"assets/styles-483fbfea-BHdKmZ_h.js",revision:"64ed24697a89abcb15a64328665a7504"},{url:"assets/styles-b83b31c9-Bf3Kjyjm.js",revision:"49e5c3edd3ee274abd1a6188e26e9806"},{url:"assets/submit-bing.html-YaLGBYLY.js",revision:"59ff48065fcff8d6b806ce13326fa0c4"},{url:"assets/submit-url.html-BnTcyDhQ.js",revision:"15fd170e134d506011c00d98f1a4df9b"},{url:"assets/svgDrawCommon-5e1cfd1d-BAYeGwwT.js",revision:"38631fc8a0d4bfade0597a6e7d148b08"},{url:"assets/swift捕获语义.html-DwsTQMXU.js",revision:"61ccf154c050d2dabd7d3991628d226c"},{url:"assets/Tableau10-B-NsZVaP.js",revision:"f2197f44250cada74e1e663d3abfba3e"},{url:"assets/tableview-radius.html-C3Ulu4x0.js",revision:"360ee8670d5026bdc6a145747b3afa60"},{url:"assets/test-Three-ways-to- call.html-BRk8dPvi.js",revision:"85c3c3354cb5b181a48929fca499c19c"},{url:"assets/textfiled限制输入字符.html-WK9rdb8c.js",revision:"881263530a1ffcc8be26503b4ecbcb8b"},{url:"assets/timeline-definition-bf702344-dL4dEzfo.js",revision:"49b10ace1e43abed6f2e70091cb0b7b8"},{url:"assets/timelineLogistics.html-Bup2gkmj.js",revision:"5d93fe2e6a99c8eff828267096387b4f"},{url:"assets/unix-linux-note.html-CNYtSovW.js",revision:"c1530901814fa1c45989c14a822a7ec9"},{url:"assets/Update-Cocoapods.html-Du1QI9a2.js",revision:"179661c70c21664c5a66e48379196287"},{url:"assets/utils-X8EomH4B-BP_hkFrF.js",revision:"f6f9109c6681259ecd31fbd4e3316320"},{url:"assets/vercel-deploy.html-CInOvp_q.js",revision:"4cef32d312f29b7f3ff65b4a3b5ab203"},{url:"assets/visitorsbook.html-DZUWqHeS.js",revision:"73fc0bac83e1b27507cd4e6e95ed6679"},{url:"assets/vue-repl-23a9KZvI.js",revision:"b0b1ad1409acb2bec4dde6f98dd3173c"},{url:"assets/vue2-principle.html-B8LPOH0r.js",revision:"7bfa2ff159e29fe0b85b60a7489a871d"},{url:"assets/waline-bug.html-Ci_I02zF.js",revision:"4814ffc8d1a615ec14f90169b950f9f1"},{url:"assets/waline-mail.html-TsZNzr0d.js",revision:"fcb290ea00e7ae310d5f5a08b29d4b23"},{url:"assets/waline-meta-l0sNRNKZ.js",revision:"68b329da9893e34099c7d8ad5cb9c940"},{url:"assets/WCDB.html-C_b8iPW3.js",revision:"4752ec3cc0bf5a5ef132173a49bf1002"},{url:"assets/WKWebView-URL.html-CBmYG6d-.js",revision:"aee9bfc2b1791aaee5677d271d5e355b"},{url:"assets/WKWebView.html-BaW8vIPH.js",revision:"c80befda96efca60fcbcc67722976ab7"},{url:"assets/xychartDiagram-f11f50a6-BJ-nGkbD.js",revision:"fc40eb158d3e4638654a0e74ba3b2801"},{url:"assets/YYMemoryCache.html-DyYkpWup.js",revision:"64118bb8e4924feab52f21ab31d1d895"},{url:"assets/zoom.esm-Ctj_eavO.js",revision:"e6e8f9a61302e3ca14aa4dbeec242607"},{url:"assets/zsh.html-DRFV9i80.js",revision:"0ceaed950045ce00040072ea17b63404"},{url:"assets/一人一句宋词.html-D0kxJiVA.js",revision:"9c0df71c96b1d9fa52cc124c21c24d38"},{url:"assets/优雅的cell单选.html-TCn5nVFc.js",revision:"a646cc65a1a04e5729d0f4978b8af4bb"},{url:"assets/图片上传压缩算法.html-DRXgWKw_.js",revision:"58e7fbd82e80183402b8853af9a8b7fa"},{url:"assets/神经网络模型训练.html-C0Li4UWp.js",revision:"02011c72890b64448caea5882c0eafef"},{url:"assets/配置https.html-D21s0AL2.js",revision:"9f34dd088bbdace1c98fe28b6cc1db01"},{url:"logo.svg",revision:"cf22c0d91fdc6379874c2d9111a51e08"},{url:"404.html",revision:"ac0d85ad2d9294ddde9b7928ed1a1ba6"},{url:"about.html",revision:"30796401fd866bc7d3a0041e4bb2c426"},{url:"article/index.html",revision:"05b94bff74d36ebf19d17e7dbd4286a4"},{url:"blog/auto-push.html",revision:"7f360910a450c1fc3838f48a8a00816d"},{url:"blog/disqus.html",revision:"d30294bca5c8e05f6ae82b18a24fc0ff"},{url:"blog/index.html",revision:"b5f15c6d19b6f5463b4f914317780753"},{url:"blog/jekyll.html",revision:"2434fdcf121c5d8cacfb219dbded0341"},{url:"blog/waline-mail.html",revision:"cf739c9e8e54173f36e0e5556c5f7698"},{url:"category/about/index.html",revision:"5c8b7c6af25f2043f2d60c2595ee7d03"},{url:"category/ai/index.html",revision:"046887e0efadcda7d9a1ee401ea8861d"},{url:"category/blog/index.html",revision:"7606a8c380f5e5c350d6308629bad01c"},{url:"category/css/index.html",revision:"4f8c51caee3e31d13d5b3c91eb79a770"},{url:"category/dart/index.html",revision:"6162444fc39ccfdd73bd638b3e74fe65"},{url:"category/flutter/index.html",revision:"37f47270aad298b4493347afc55fe6d4"},{url:"category/git/index.html",revision:"65ff0f0e2ac199094102c53a6cc575c7"},{url:"category/github/index.html",revision:"11d249bfddf767c05ca521b0f3835ff6"},{url:"category/index.html",revision:"16ebd124487ea334257d7872e57cbc6c"},{url:"category/ios/index.html",revision:"d0abb171e29591af138008144ccced56"},{url:"category/javascript/index.html",revision:"39fffa779234cb2477c911573ec2470f"},{url:"category/linux/index.html",revision:"a951e679d95d7956568b6dd4861d2864"},{url:"category/python/index.html",revision:"cb2ce27560246e8c5b52cd406ffa0806"},{url:"category/rust/index.html",revision:"1e0be266f5219d73a7de7f91e82b743f"},{url:"category/swift/index.html",revision:"7a2825cf7423acab6e6f95d6b425a4cc"},{url:"category/vercel/index.html",revision:"e06c94aa7ce857c7b8c0e23947a9d058"},{url:"category/vue/index.html",revision:"d6c3d65650049e17e1bfd935a486d119"},{url:"category/使用指南/index.html",revision:"70a4439bbc9291d1071294e710758b6f"},{url:"category/前端跨平台/index.html",revision:"eb354d3926074d45e38147bbcb5ae666"},{url:"category/工具教程/index.html",revision:"177cd5a9e35e9661787e1f7520d1b3de"},{url:"category/开源软件/index.html",revision:"9abb6c7374b5d0b7491828f452ff5554"},{url:"category/收藏/index.html",revision:"dc73b6f19587d2a4e8735c047f721f13"},{url:"category/浏览器/index.html",revision:"48935848d7effb995e2995c7a8a81bc8"},{url:"collect.html",revision:"7ad31754aff3d0f296642285915ce256"},{url:"demo/disable.html",revision:"dd0d57a7b23b5269b1781fc81a075712"},{url:"demo/encrypt.html",revision:"11db449acaf9a0d6f8160fd18ec3c20e"},{url:"demo/index.html",revision:"10e1ebff3ec23ab7bf97207e290e7b1e"},{url:"demo/markdown.html",revision:"46d5fcfe4f840619b788a8ed84c0799e"},{url:"demo/page.html",revision:"888e269c5f8dd612b62ca742d69f3689"},{url:"demo/slides.html",revision:"793bd054ba526f5b7d19ab988f458024"},{url:"friend.html",revision:"8c19839b3db0904c6679e8149203ca56"},{url:"index.html",revision:"cda45b9906d620da458130907446f4be"},{url:"intro.html",revision:"c7b8091d99cc83bf240fcbd3d0ee6e02"},{url:"news/1.html",revision:"764d454494e1edd372696a78c9bf6a99"},{url:"news/2.html",revision:"6d6cd3bc05d68ba1f592bd10a4554838"},{url:"news/3.html",revision:"66d71049cf2c3ff3a718f7ec03d4b6b5"},{url:"news/4.html",revision:"2a171345b0ade7fc173c262d42b7c821"},{url:"news/5.html",revision:"de73939919855cea10401cce0c709959"},{url:"news/index.html",revision:"86d543a089a8284d855cb91789da41e5"},{url:"posts/cross-platform/Flutter/concurrency.html",revision:"0ce09ae3ecf9c10a40d22ee50a1bbca7"},{url:"posts/cross-platform/Flutter/index.html",revision:"af8081d5090ac39841eb11808099f0f8"},{url:"posts/cross-platform/Flutter/newbie.html",revision:"655089165c293e624c500562a86c6c67"},{url:"posts/cross-platform/Flutter/principle.html",revision:"8248ecaf451c093fb4fcd1d4b4ea11cc"},{url:"posts/cross-platform/index.html",revision:"6800574fa5543254dc11fa469f4dc57a"},{url:"posts/cross-platform/ReactNative/index.html",revision:"4856c14450ee9bb6b8399d83c90c3695"},{url:"posts/cross-platform/ReactNative/react1.html",revision:"e44943079a34f41d1e4c596eb51c31a8"},{url:"posts/cross-platform/ReactNative/react2.html",revision:"bdcc7e41564cc0492578b18aef44f8fb"},{url:"posts/cross-platform/ReactNative/react3.html",revision:"ec30e933a0b58d607ca75d7bdfaaffa5"},{url:"posts/index.html",revision:"bd71a908f406f98b4d87e6be55c62881"},{url:"posts/iOS/index.html",revision:"801de008744f644758ae26539a822011"},{url:"posts/iOS/other/coreML.html",revision:"40cf08e5e272a99c4cc58e257689ae5f"},{url:"posts/iOS/other/index.html",revision:"790d7efd2bac35f77b3ac795c7b5de84"},{url:"posts/iOS/other/JavaScriptBridge.html",revision:"c55851aa7b8fe2221e7e59ef90bf696f"},{url:"posts/iOS/other/test-Three-ways-to- call.html",revision:"28b5dcc18dece717e4ddb0a79d008f3d"},{url:"posts/iOS/other/神经网络模型训练.html",revision:"02eb4ea5c1ac3e1577b56b80f9977772"},{url:"posts/iOS/source/AFNETworking-A-memory-leak.html",revision:"38bbc85e7d3ac29da3987aaf981ea6da"},{url:"posts/iOS/source/index.html",revision:"249568f94e205007fdd084397bfdb7a7"},{url:"posts/iOS/source/WCDB.html",revision:"49ef0773ed5e4af5d189911001d13c07"},{url:"posts/iOS/source/YYMemoryCache.html",revision:"7127940c14bf1725ab4b2078f45b8941"},{url:"posts/iOS/swift/index.html",revision:"66aa05d86c1b3f66398606679ab8ebfb"},{url:"posts/iOS/swift/swift捕获语义.html",revision:"bf322bda1bbe9584a203a2bc4c517a6c"},{url:"posts/iOS/system/index.html",revision:"046286fa553b40b6cb89cb0fe09a8886"},{url:"posts/iOS/system/iOS中的Runloop.html",revision:"cbc75b11bc0bcd218ac6a2f3edad9cd3"},{url:"posts/iOS/system/iOS枚举类型enum,NS_ENUM,NS_OPTIONS.html",revision:"05f8cefd95eb2e184c8e9b740f0406f9"},{url:"posts/iOS/system/iOS的Cookie使用.html",revision:"a93d501cd03c72dc0cde07182d8793fb"},{url:"posts/iOS/system/iOS程序启动原理(上).html",revision:"706e517c0d684a1ede60bafd61877797"},{url:"posts/iOS/system/iOS程序启动原理(下).html",revision:"39b11e8454defbcd8d909cbaf702a3db"},{url:"posts/iOS/system/keychain更新.html",revision:"8a8501a03b6086d6d81d7909bd52bc54"},{url:"posts/iOS/system/NSError.html",revision:"f2a42e03414492a3c7cb3e720432e893"},{url:"posts/iOS/system/NSOperation和NSOPerationQueue.html",revision:"24e57c41490f45b3d43efc5273548fb8"},{url:"posts/iOS/system/Reduced-App- volume.html",revision:"61b83f546acf7d72b6f69a4978c94ce8"},{url:"posts/iOS/system/runtime快速归档.html",revision:"5b60a8271e33b4ce2d5a468096b5aca8"},{url:"posts/iOS/system/WKWebView-URL.html",revision:"459d33266db701ea7e68de71156ea4d1"},{url:"posts/iOS/system/WKWebView.html",revision:"d09a35e226b01548f31e930d67215e8b"},{url:"posts/iOS/tool/ijkplayer.html",revision:"72e3bd31c1a489c0428cd8f4e2c165d9"},{url:"posts/iOS/tool/index.html",revision:"45bdc343bf59993e2415fd423365c5f3"},{url:"posts/iOS/tool/Update-Cocoapods.html",revision:"2572cb9408dc545020cd89ba4db596d7"},{url:"posts/iOS/tool/图片上传压缩算法.html",revision:"95e16d9884d17d64e177546cf96a249c"},{url:"posts/iOS/tool/配置https.html",revision:"c8b684eaff1976d3d11362caf983ecb3"},{url:"posts/iOS/ui/cell复用-accessoryType解决办法.html",revision:"91f218e16992020b981d1ce08179ec67"},{url:"posts/iOS/ui/index.html",revision:"bb89c15447b6366cdf3ad9804865db25"},{url:"posts/iOS/ui/tableview-radius.html",revision:"9d8dcffa989164f2019fd6473b73328d"},{url:"posts/iOS/ui/textfiled限制输入字符.html",revision:"13a412719e3131d3aac10e84a6730597"},{url:"posts/iOS/ui/timelineLogistics.html",revision:"b71294549a5db3ca67db286474195af4"},{url:"posts/iOS/ui/优雅的cell单选.html",revision:"00472e1d0b175136aac56af0810ca97d"},{url:"posts/Linux/index.html",revision:"aed4529027894334b31b2a0b732e4a06"},{url:"posts/Linux/iterm2-pure.html",revision:"8bf54e696c6b566db646b6f507e97b33"},{url:"posts/Linux/unix-linux-note.html",revision:"8215fa4422535b094297ad810d6a9ae5"},{url:"posts/Linux/zsh.html",revision:"8538d6cf297bc37143e959bee2413521"},{url:"posts/Python/index.html",revision:"5b0522c9f6dc97c81f19796d072fc5af"},{url:"posts/Python/submit-bing.html",revision:"391196aa1e7aeaa14ccaf0cfa8ad5932"},{url:"posts/Python/submit-url.html",revision:"c94a6f94da6ed7c2884bb424df25196a"},{url:"posts/Rust/first-time.html",revision:"8963f544d72ae769c651349c9ec2c1cd"},{url:"posts/Rust/index.html",revision:"bf2f0eaddf005ff377f9e424b9e8403a"},{url:"posts/Web/Browser/event-loop.html",revision:"dc1b181494f0f5e9d1d20b59e53b7f67"},{url:"posts/Web/Browser/index.html",revision:"7b4dd1da21c22a6756c6263e66ffbadb"},{url:"posts/Web/CSS/calculation.html",revision:"8c3108e38ae056f6c95289169185b29b"},{url:"posts/Web/CSS/containing-block.html",revision:"d9caac10ba8544d804d3ad8198d4e096"},{url:"posts/Web/CSS/index.html",revision:"b3bde59d88fa30a01a07642ad9782b30"},{url:"posts/Web/index.html",revision:"ae8357343cc452603a388bfafc45be91"},{url:"posts/Web/JavaScript/index.html",revision:"54633062a1e62158db8b16cbd1ef2d71"},{url:"posts/Web/JavaScript/js-module-loader.html",revision:"1f72e80d3b30028b7914b3ed446c054f"},{url:"posts/Web/JavaScript/js-version.html",revision:"bf413c1ccd9aba01ff39e82a6c8c0cd3"},{url:"posts/Web/JavaScript/judgment.html",revision:"204b9939cb195ab565534084c0802b2f"},{url:"posts/Web/node/index.html",revision:"6cd730133c86511d1c684aa02b32cd28"},{url:"posts/Web/node/node-version.html",revision:"debf1a5f15a3553eedc8d37348344d89"},{url:"posts/Web/Q_A.html",revision:"d1acf659b96ece71694cb34c04104188"},{url:"posts/Web/Vue/index.html",revision:"d0465ec658f11c3bfe16cfecddaff98d"},{url:"posts/Web/Vue/optimization.html",revision:"921260dfd2df2a51121982b913e457fb"},{url:"posts/Web/Vue/vue2-principle.html",revision:"8a5da7f28ec11f0cf754126b0cef4ef4"},{url:"posts/Web/Vue/waline-bug.html",revision:"677dd2861499b7ecb60288e6d2f1f828"},{url:"private/index.html",revision:"19b2fdedb762abdc336c7237578ee458"},{url:"private/一人一句宋词.html",revision:"9bbf65f5b24b534f0ce4d4bdb41f7915"},{url:"site/design.html",revision:"5c99c20fb92494fa4e06efdbb3d5c519"},{url:"site/index.html",revision:"53891e3bf1d9284d614b35968b51519b"},{url:"site/public-api.html",revision:"db59601735c36b2f9e98dc878862166e"},{url:"star/index.html",revision:"61e667eeb72ee931bd9c28f8be222d44"},{url:"tag/about/index.html",revision:"a304ef2d31847415485aa678ded35259"},{url:"tag/ai/index.html",revision:"2d25aa46e64c77cf0edd85177f6e7173"},{url:"tag/blog/index.html",revision:"b6a2f9631c4f2e788c78c37fd62193ba"},{url:"tag/bug录/index.html",revision:"2df393cc245eacc0268d249e678cc361"},{url:"tag/dart/index.html",revision:"38aec59ff473ebaae377a5093b7659ca"},{url:"tag/demo/index.html",revision:"df072066a58fdbee62aeb145189c4f45"},{url:"tag/flutter/index.html",revision:"1dd786256546fc144ee23bd9dd490b0d"},{url:"tag/github-action/index.html",revision:"5fa853ae53d4ba311b92e82cfe6d7e77"},{url:"tag/github-actions/index.html",revision:"006c3cf44733abf5bf2b47440c5e1a22"},{url:"tag/github/index.html",revision:"d2807a373e66ea700b6c9fe4fb4b222c"},{url:"tag/index.html",revision:"64c0f3c3d294b445ac55a177331901f9"},{url:"tag/ios/index.html",revision:"5a9aa10fb0187a376e3e96146f712c71"},{url:"tag/javascript/index.html",revision:"86c3cbd340807ebe76c61aa3102d7d4d"},{url:"tag/jenkins/index.html",revision:"8b29c837804c5e8c954ee7fbd9a14ef1"},{url:"tag/linux/index.html",revision:"9baffbb6c677975482f1c13c0e2a71f0"},{url:"tag/markdown/index.html",revision:"70d9b05120ddcdfc1c9d0e6516389205"},{url:"tag/node/index.html",revision:"00abfdaa456775a4840d47c527a4c400"},{url:"tag/objectiv-c语法/index.html",revision:"dcc064f570adfc058773c9968dde6e8e"},{url:"tag/os/index.html",revision:"a9c8e51bd6a3d24f562c68f858c46214"},{url:"tag/react-native/index.html",revision:"4b73304c181544c7e6fdb35e4e51de40"},{url:"tag/rust/index.html",revision:"8022033bac4d8da3db7f41fed4c541c6"},{url:"tag/ssh-key/index.html",revision:"6891498d49260d29c49602bf91d5b29f"},{url:"tag/swift/index.html",revision:"1ee2831291caf0954e28589285edf358"},{url:"tag/terminal/index.html",revision:"8ad12126d91818722b333e7b82a03378"},{url:"tag/unix/index.html",revision:"c33b7120695b33eedf4b8eeb2b4c0153"},{url:"tag/vercel/index.html",revision:"f641c18da61046f84507b07e0fcf817b"},{url:"tag/vue响应式/index.html",revision:"83202b509d31e50b43bb5679abab5a28"},{url:"tag/优化/index.html",revision:"8d0e85226f5562d12b0b0ff8876b9e16"},{url:"tag/使用指南/index.html",revision:"b4a92e285cd9c9fc733d9ee0949c5e94"},{url:"tag/前端/index.html",revision:"8dd491271f3457ae03b62f606b868085"},{url:"tag/前端开发/index.html",revision:"e465ff0b284898a4d638cef1226311e9"},{url:"tag/工具网站/index.html",revision:"aa1e67df8fc635d844de7cf9089bee08"},{url:"tag/工具脚本/index.html",revision:"3c6156067dd89c3e3121c89dd0decdde"},{url:"tag/工具集/index.html",revision:"b305911239283195469b9444ef71f648"},{url:"tag/性能优化/index.html",revision:"4ebf483de83457ea2ef3361975a6cf02"},{url:"tag/文章加密/index.html",revision:"dd75d8b3381904fbafa7280a46fca158"},{url:"tag/生活/index.html",revision:"1a22cc22d3f0ece768ef129b715a7586"},{url:"tag/禁用/index.html",revision:"259ae9056a5a170b1b33a123b15288bb"},{url:"tag/算法/index.html",revision:"764a6aea8065c9b8db7ccaca6867d7f8"},{url:"tag/翻译/index.html",revision:"ecbbff68c33740342b30a602f2d651ef"},{url:"tag/页面配置/index.html",revision:"933eef5ab134de8c990ea66562703b35"},{url:"timeline/index.html",revision:"7f396241cafcbbc75baa8aae9935ef11"},{url:"tutorial/CI_CD/index.html",revision:"a5e82d1ece6e26f00dd4b43700d6492c"},{url:"tutorial/CI_CD/Jenkins.html",revision:"aaa6298d99bd34860fa8177c45a16658"},{url:"tutorial/CI_CD/vercel-deploy.html",revision:"417b2e82526bcf46311ede0ce203304c"},{url:"tutorial/github/github-action.html",revision:"7bc9f463b056bb84de810375d2690d48"},{url:"tutorial/github/index.html",revision:"984aa3c6a415d5f48b2e3f046dd4c7a0"},{url:"tutorial/github/ssh-key.html",revision:"44e695f0d1affc9b323ca3f2209c5301"},{url:"tutorial/idx-dev.html",revision:"e29918603f613cba7b3681cbae2b56c9"},{url:"tutorial/index.html",revision:"d19033dd2fed6acebaccefaf96557cb7"},{url:"tutorial/OSS/index.html",revision:"31cff606690e8ae5170554777f3846e6"},{url:"tutorial/OSS/meting2.html",revision:"580ace077b0eea1d65f0f87c27d815f1"},{url:"visitorsbook.html",revision:"8f6de09a98a2a60e37b09551df4065cf"},{url:"assets/avatar.webp",revision:"997bea621198efba02fa6b2f038bcbb8"},{url:"assets/home_bg.jpg",revision:"4c0b753c0a723e18aa0fb2351e752520"},{url:"assets/home_bg2.jpg",revision:"632661e880028e0127447ec2ce5e0e95"},{url:"assets/home_bg3.jpg",revision:"f64f770ebda7f9a1fad82ac105d2d421"},{url:"assets/icon/apple-icon-152.png",revision:"c0a3bcb409613815ff6ce72b4bac0bea"},{url:"assets/icon/chrome-192.png",revision:"ca2a7063362bd225e5b7283ba6d5ffda"},{url:"assets/icon/chrome-512.png",revision:"a6b822c08dc54833922e2f90ec680536"},{url:"assets/icon/chrome-mask-192.png",revision:"621031a4547f156928e450f72d44e0bf"},{url:"assets/icon/chrome-mask-512.png",revision:"420d2bf7f611e53bc7329b213f9df13f"},{url:"assets/icon/guide-maskable.png",revision:"99cc77cf2bc792acd6b847b5e3e151e9"},{url:"assets/icon/ms-icon-144.png",revision:"cbc84abd796f4c15c496b96b205f013d"},{url:"assets/images/404_bg_1.png",revision:"aefdd1d2318534ff6d73df6fdba8f1b0"},{url:"assets/images/404_bg_2.png",revision:"bc7e37f220768db31ace324f70155567"},{url:"assets/images/AliPayQR.jpg",revision:"b5f1af7c051878cbbb120706886fdbf2"},{url:"logo.png",revision:"c34d71b5428eff4dfc9b3022adc95b4f"}],{}),e.cleanupOutdatedCaches()})); +if(!self.define){let e,s={};const a=(a,i)=>(a=new URL(a+".js",i).href,s[a]||new Promise((s=>{if("document"in self){const e=document.createElement("script");e.src=a,e.onload=s,document.head.appendChild(e)}else e=a,importScripts(a),s()})).then((()=>{let e=s[a];if(!e)throw new Error(`Module ${a} didn’t register its module`);return e})));self.define=(i,d)=>{const r=e||("document"in self?document.currentScript.src:"")||location.href;if(s[r])return;let c={};const f=e=>a(e,r),t={module:{uri:r},exports:c,require:f};s[r]=Promise.all(i.map((e=>t[e]||f(e)))).then((e=>(d(...e),c)))}}define(["./workbox-b584cb72"],(function(e){"use strict";self.addEventListener("message",(e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()})),e.clientsClaim(),e.precacheAndRoute([{url:"assets/1.html-CCqqooZ8.js",revision:"9308b8579b2f64b145ab2ab1e9e645db"},{url:"assets/2.html-zscj9y5a.js",revision:"9cfdfd883d48ca519d43dee61b710f29"},{url:"assets/3.html-BxzPupJn.js",revision:"3175cbcbd2434cce616175b17c931937"},{url:"assets/4.html-CcZjx0ar.js",revision:"5eb4703ed35c93cebb020976113f3e1a"},{url:"assets/404.html-CbM9U-XQ.js",revision:"381f73d2284a22b69fe78c630eaa3e21"},{url:"assets/5.html-DlPnxJmp.js",revision:"298923ec0729bb557528b0087b9b49f0"},{url:"assets/about.html-B7wj1tkV.js",revision:"b5bac74df7e8f1dfddfb0fcb76f2a359"},{url:"assets/AFNETworking-A-memory-leak.html-DGO_7mOf.js",revision:"24b7c714da21f72440be6b5ab16e91c6"},{url:"assets/APlayer.min-CAgWaKXK.js",revision:"497ca75d3d002890ca0ece0b4c1b80d7"},{url:"assets/APlayer.min-l0sNRNKZ.js",revision:"68b329da9893e34099c7d8ad5cb9c940"},{url:"assets/app-B-uzNdhT.js",revision:"4a01cf390a55328615ee2922750dda10"},{url:"assets/arc-Dfoc_SzS.js",revision:"7785996ecf2d930755ee966cd500cda3"},{url:"assets/array-BKyUJesY.js",revision:"17dcebeaf673b09a1ca5da014d20022f"},{url:"assets/auto-CAdRPfCH.js",revision:"7f70af0686c2be25e7afd510cd83c172"},{url:"assets/auto-push.html-BCAij2ta.js",revision:"41513a194643e83e594b09f2abe3a300"},{url:"assets/bg.svg",revision:"cf398a4e163baf4a18104368cbe4b813"},{url:"assets/blockDiagram-9f4a6865-BWPj3S85.js",revision:"6a491426fcf9f341b4339efb91cf0173"},{url:"assets/c4Diagram-ae766693-DymfeAst.js",revision:"420de5758f1894661e1e86c2ca286c84"},{url:"assets/calculation.html-Blvmw2Mb.js",revision:"0fa158e567242d83f4b5b3b7c8430be4"},{url:"assets/cell复用-accessoryType解决办法.html-CB7NViIw.js",revision:"df2038d43c5e6c2066e4ea51eb3e4624"},{url:"assets/channel-CP-kBCkc.js",revision:"16bc02b6598cb71442414f65c147d346"},{url:"assets/classDiagram-fb54d2a0-BIg3oXNi.js",revision:"37c3258cd649895fedbd2b3e961e1371"},{url:"assets/classDiagram-v2-a2b738ad-CGUI8b20.js",revision:"2c5e8a2cc6e86c9ddac785bf1b01ecad"},{url:"assets/clone-D8r3nS7N.js",revision:"75d814224562d0050f68a457480ac0ae"},{url:"assets/codemirror-editor-B3dqp7I9.js",revision:"cb921e17982baa05e347f85ea845ad96"},{url:"assets/collect.html-BE99v2Xy.js",revision:"629e8d40deac19399560eb6e7852be4a"},{url:"assets/commonjsHelpers-Cpj98o6Y.js",revision:"146eaf85c344cee008c91f2685dbf82f"},{url:"assets/component-XzbOLqsv.js",revision:"a436d235e31baa7ac2dbd8c31a41f12d"},{url:"assets/concurrency.html-BwoFIWfl.js",revision:"d5ec35f2c55d1f5119aa26ed82edb100"},{url:"assets/containing-block.html-z1ree5Sd.js",revision:"dafbded59a5f8fe4579a953dabdb3feb"},{url:"assets/coreML.html--pwN-dEN.js",revision:"f51b4e0100971d96def1af4c1bfd39cc"},{url:"assets/createText-ca0c5216-CsQqz8DO.js",revision:"e62bddae3c0c6bcfbe2513705cf74cd7"},{url:"assets/design.html-Ce15CoAF.js",revision:"4ebdc46b5f40282d7e14a0f23b06cd66"},{url:"assets/disable.html-Cxm9wNnA.js",revision:"d1998e2db84c2e51169665bd881e0e6b"},{url:"assets/disqus.html-DTh_LgWs.js",revision:"490e9e5a8697336c80d5e37545831d95"},{url:"assets/docsearch-l0sNRNKZ.js",revision:"68b329da9893e34099c7d8ad5cb9c940"},{url:"assets/edges-066a5561-UJR5dA4t.js",revision:"f5f04567412b670715693e97a658585a"},{url:"assets/encrypt.html-KVwIyvJ0.js",revision:"00fcdd0fa4f3bbea1206fa2fd2a40520"},{url:"assets/erDiagram-09d1c15f-DYKODAju.js",revision:"743efb258c2c1a00218020c6f5ac9006"},{url:"assets/event-loop.html-DTHJlo6O.js",revision:"4e1dbacdce125afeb48e5741921c0c6c"},{url:"assets/first-time.html-CZIHTDO4.js",revision:"6a12601d5b3b7baea7ca588a40a8f105"},{url:"assets/flowchart-966sEcGG.js",revision:"22ae562fadded7c906d7297d1f7c64f0"},{url:"assets/flowchart-elk-definition-ae0efee6-DoWOPYhu.js",revision:"b8a47fcf219c49735aa11aa30a854056"},{url:"assets/flowDb-c1833063-Dr3WsCKy.js",revision:"148a852b22d19af804bd0180f91d8c97"},{url:"assets/flowDiagram-b222e15a-BSAzP3jv.js",revision:"06826e19738a6291429479a930cf2449"},{url:"assets/flowDiagram-v2-13329dc7-D_6NILQ7.js",revision:"00d037c75f998e8b0ab3dfd7a9db4760"},{url:"assets/friend.html-DNiEk61T.js",revision:"6d50e9d3211479c866fa77f492edf6cc"},{url:"assets/ganttDiagram-b62c793e-D7cNcJ00.js",revision:"42e9756773b4976e9354270bc4e616e9"},{url:"assets/gitGraphDiagram-942e62fe-jf4Nz2CG.js",revision:"724cab36e7f90b42afd445b5b7ad7cb4"},{url:"assets/github-action.html-BsrS_oau.js",revision:"689187bd25990b1722e344daa3f9d86d"},{url:"assets/github.svg",revision:"46049e5d9defd62a673d36f226fd3fe5"},{url:"assets/graph-DBt_Q8SI.js",revision:"ec55ad2789b8c4eba7c2ba07aa2a3550"},{url:"assets/highlight.esm-C34tS8ua.js",revision:"9f54844d940e046894f2d0fc42704cf6"},{url:"assets/idx-dev.html-Cfn3a_uw.js",revision:"1bcff92ede29713a9c1add540138baee"},{url:"assets/ijkplayer.html-NYuhLFSW.js",revision:"2cc9992e6ff9053d3306ce6cc17ae6b9"},{url:"assets/images/github.svg",revision:"471d3c2c209dba9c47637de6fae15a1f"},{url:"assets/index-01f381cb-DOEktJ15.js",revision:"1d2b92fe537c4f07c49a86c268ffb1c3"},{url:"assets/index-DTEEl-sV.js",revision:"46a193641571106d3b7b43f9bc2a2735"},{url:"assets/index-wZ-hXvzw.js",revision:"e80f63302e5fb9e9be29399c386ef22f"},{url:"assets/index-zMbLkDvU.js",revision:"31f36bdf766eca20dff7683b6d0b15c7"},{url:"assets/index.html-_040GXi2.js",revision:"570e53cc5d6d11345d92673ebd582ede"},{url:"assets/index.html-9bA2I36u.js",revision:"1e7340320b208cc7630d704578f4b8e8"},{url:"assets/index.html-9Svhwsfd.js",revision:"c5a2726ce7cd0f83be9530dd2fd6d796"},{url:"assets/index.html-B1u2MO_4.js",revision:"7c84b38e524e697bd9dc0dd81cc3154e"},{url:"assets/index.html-B2JfQS0V.js",revision:"a780e6d3a0d29e8e2ba0c9e1148ad638"},{url:"assets/index.html-B4nFf9--.js",revision:"0825e6d6495ee26c30120308ee672743"},{url:"assets/index.html-BAPb4F0o.js",revision:"a6630a893a4bf2d6ae81e947ae425fe2"},{url:"assets/index.html-BB5WG04t.js",revision:"74795a7c39e711336d7dd0955df2381a"},{url:"assets/index.html-BcEf0byl.js",revision:"01a62f4e24044be76597426820063178"},{url:"assets/index.html-BdqUpayl.js",revision:"c2b6106b2d9fa14c352ba46bdd46da9a"},{url:"assets/index.html-BeLRD4Yx.js",revision:"d0ba26ba593aeec9564aa0497d2f6bc3"},{url:"assets/index.html-biwu7jVA.js",revision:"c029912b82d7aa862d025fd9539c2a10"},{url:"assets/index.html-BJZL820F.js",revision:"ab3abd889e9377aee1c1c3884a10749b"},{url:"assets/index.html-BKJxcFUr.js",revision:"4101086f91c77d35947601d264269427"},{url:"assets/index.html-BKRLUuLY.js",revision:"3aba161bd5ee15d72f2cb33615767bff"},{url:"assets/index.html-Bl3xcPHH.js",revision:"c5561bb94afa11c7e25510443adbf02b"},{url:"assets/index.html-BlBSI3_m.js",revision:"27c66d19d38ba3a139710626cc65327a"},{url:"assets/index.html-BLiw6rQM.js",revision:"41c6b3dd62cf844da2b1250c090a0f4a"},{url:"assets/index.html-BM37uq2n.js",revision:"4471ef6b2fbcc3a5a8aed46d35f356ae"},{url:"assets/index.html-BMR3aWYF.js",revision:"48c82841e619d302bed3309604e19e1c"},{url:"assets/index.html-Bn3VH44R.js",revision:"e85f2a98208651f8f36bbfd0e8f534fb"},{url:"assets/index.html-BpO-VD-a.js",revision:"1b58441010aaab7510f4aa39deab665d"},{url:"assets/index.html-BQac0K5Y.js",revision:"cdc4dc674b0d4d10d448fc0c2f44d02a"},{url:"assets/index.html-BrQ_H2Kp.js",revision:"bd2fdd392547c40e0d94c14035c28ae7"},{url:"assets/index.html-Bsbslkjk.js",revision:"967d578826cee40aeaf0347f7e13a17e"},{url:"assets/index.html-BtlEGfSt.js",revision:"813a5dc4785e60682bccf62f6a0cb3fc"},{url:"assets/index.html-BVPdmsjv.js",revision:"27cc8dc7c67c97e8281a077c8f4fdcc7"},{url:"assets/index.html-BwFAYx8q.js",revision:"c2d99a0b5ee56c8d0b4665cac841c6cd"},{url:"assets/index.html-BWL8kdnU.js",revision:"c224106156bc4b5b4f18932039e1a31c"},{url:"assets/index.html-BxnYvGC_.js",revision:"ce51402d30d05b19b9d74cac0eb81e3f"},{url:"assets/index.html-BYZcSDb0.js",revision:"11b301b70ef0e7f2b1ceec393a742c70"},{url:"assets/index.html-C-kWV9qV.js",revision:"95d67c75a01f62442396a2f579bf2cd1"},{url:"assets/index.html-C-QBf6dH.js",revision:"ed8f1f3a8a1cccd882bc48b6d5ebf9b3"},{url:"assets/index.html-C2h_ShYj.js",revision:"ff2cbf795ad56469c8b1629fd994e980"},{url:"assets/index.html-C30UK5n0.js",revision:"e9ddb78a9153937dce4f46faf4e06e11"},{url:"assets/index.html-C6A4WyTS.js",revision:"50b3b7c37d77b5dabcc207511b9da770"},{url:"assets/index.html-C8oF08Dp.js",revision:"53d430861a5683b5bbeeb49df7c610ae"},{url:"assets/index.html-Car7NfWM.js",revision:"23c03d3450dffbb6436ce20de334266e"},{url:"assets/index.html-Cba8QdGN.js",revision:"eff31fa160266b7a0c01114376838971"},{url:"assets/index.html-CEdM5y8Q.js",revision:"4b93b53e64ddb34d40339e5e377f9d47"},{url:"assets/index.html-CHApeAwm.js",revision:"11fdd2142da0a8407ff1e448e7282783"},{url:"assets/index.html-CJF8hNWH.js",revision:"d4eb1c436df602271e2a73868d51f864"},{url:"assets/index.html-Cm1KHd5m.js",revision:"d02d72563931750b2879617798d83b1c"},{url:"assets/index.html-CPG8Do3L.js",revision:"d96133da283cc795f919c59255a2882f"},{url:"assets/index.html-CQu51ghK.js",revision:"10af9e7bca7c29742abdcbb18d617bde"},{url:"assets/index.html-cRjlRdX8.js",revision:"f63abfeefb23696a4a185b5dc4d616e8"},{url:"assets/index.html-CrnIL_rN.js",revision:"3d54302b67f806273278d961f2d06bba"},{url:"assets/index.html-Ctz6axG9.js",revision:"503ab009375091e2f88ca0670812aca1"},{url:"assets/index.html-CVqxBa1g.js",revision:"9a61136bdd2261dc913891b86a5d7774"},{url:"assets/index.html-CWIFXLnI.js",revision:"50f447b469028d81a7d2e9efee367e93"},{url:"assets/index.html-CwvQP2OC.js",revision:"dc0cf99c47f343d3ae6790ada356c39a"},{url:"assets/index.html-CxHv6NTM.js",revision:"0fc33312f22bad6520cdf4f8f010e047"},{url:"assets/index.html-CxKychrZ.js",revision:"b566fcce155f589da500a8d667af25c6"},{url:"assets/index.html-D0hxQGVG.js",revision:"5fb0b019f13aa275351811838a1b83a2"},{url:"assets/index.html-D3BkPgiL.js",revision:"d897a53a00003262cc79e0b5591f1829"},{url:"assets/index.html-D46cQoy9.js",revision:"d4f5b5dcaf7e4ffb774c11958f2809a1"},{url:"assets/index.html-D5dtrMjH.js",revision:"ba7ceb5efa25db5c7a11b854b769e221"},{url:"assets/index.html-D5yblHxC.js",revision:"820357a87d9ce5253bd717f738ffc07a"},{url:"assets/index.html-D7sIzWMn.js",revision:"e75c68f5e9e835f5c725882819377927"},{url:"assets/index.html-DDqhSXqm.js",revision:"64c9822c06d0a68b5842fc361c912d50"},{url:"assets/index.html-DedbjYJJ.js",revision:"e2155213e3b4bbade3852420e5f4c1f6"},{url:"assets/index.html-DeUOGLR-.js",revision:"85f3a789352fe785f2baccaa45c686d5"},{url:"assets/index.html-DKMQMtsw.js",revision:"3f780a3530c5f0f19dcbc013137166c7"},{url:"assets/index.html-DlF1_w2E.js",revision:"f33086abbd19f20ce6f7d00dbce30b8d"},{url:"assets/index.html-Dn8zudZ_.js",revision:"b7fd052f7ea086094b8a173d2b93f949"},{url:"assets/index.html-DoufG9FB.js",revision:"1e7a517e0706bb001c821f23628d747b"},{url:"assets/index.html-DpQLdC0v.js",revision:"2a92adbd84b0d817c4f19311548926e3"},{url:"assets/index.html-DQ_7XhEp.js",revision:"447e192d9fae521d62cbd3eedac3c6d1"},{url:"assets/index.html-drfter__.js",revision:"c1e5d70453b271401b799bcc3cc99eea"},{url:"assets/index.html-DRl9TOil.js",revision:"33401a6badfe0956795c0e8cc1a18587"},{url:"assets/index.html-DSDflc6d.js",revision:"37abdf6c7f1756316f6ae333f91e4fb9"},{url:"assets/index.html-DW-WOzr1.js",revision:"bd7f2e62eba5f7ee1e8070bbad4060d1"},{url:"assets/index.html-DxwaqKH9.js",revision:"3a65de82da578b5aa05696e3dcf8fae4"},{url:"assets/index.html-DyORhmjT.js",revision:"89e6a86a164970e4e5f2e8d2311c2a2e"},{url:"assets/index.html-E11HoSRw.js",revision:"f6b7bc12003b18a1bd17f959c3f58d71"},{url:"assets/index.html-FaaF3ODF.js",revision:"5496897bab78aebc0db1a362db761871"},{url:"assets/index.html-FY3kdf-A.js",revision:"278733cf2006c8f34590d60dd802052d"},{url:"assets/index.html-I-Yx1wuh.js",revision:"0aae8b3be7225bccd359e886184c0b61"},{url:"assets/index.html-jtexITn6.js",revision:"ebdf1e9c6e51b766da5ebbef9285d2f9"},{url:"assets/index.html-jz9ozQ2P.js",revision:"0a1301297c8da788c5e80c0962307690"},{url:"assets/index.html-K24jriUp.js",revision:"93e26e8254579c67c08f58dc244d22d5"},{url:"assets/index.html-KqmCeJ_a.js",revision:"2fe6d1fa5a55a4840c5cedd183c1dee8"},{url:"assets/index.html-MrE5ZY0h.js",revision:"54e3025331f627dd46015af5daea5d00"},{url:"assets/index.html-mTrHRkVv.js",revision:"192073e495cfad93cdfaf7edcdfacb59"},{url:"assets/index.html-nFX9x8bi.js",revision:"f10c447153b7a370491e3daf25cfc5ab"},{url:"assets/index.html-ohezDRYQ.js",revision:"68d439a9c446d71dd1c4f27bcfcf85d9"},{url:"assets/index.html-Q-g5HomJ.js",revision:"391fb7ea0feb5a5ba8ced8fca1d863f9"},{url:"assets/index.html-quL8V4n2.js",revision:"7660c71ea2b4f694d9c421332721f6f8"},{url:"assets/index.html-r68CX44k.js",revision:"d91ad61ca6a806ca961f0ec4a4df02fe"},{url:"assets/index.html-reAB6b_k.js",revision:"182abc6cb6b506155e92b2c004f22e55"},{url:"assets/index.html-T3NHi-RL.js",revision:"e3ab2bd564f5b39fc050940ca7369bce"},{url:"assets/index.html-uuvvCu8H.js",revision:"dc9d7755c7eafb06101cf94bf0dbd1e7"},{url:"assets/index.html-VpBGDvKe.js",revision:"5fc83dc821a21bc913ab90a8e3bb9c1e"},{url:"assets/index.html-xvmnzafi.js",revision:"977bd45f9bc079c51467c1aeddbfe19d"},{url:"assets/index.html-YtXRvkY0.js",revision:"f927f4daff99caa5a1887733e8e66185"},{url:"assets/index.html-z-iiftO3.js",revision:"cf56903adef8b12a379b2f34bdad8147"},{url:"assets/index.html-zhf6P558.js",revision:"7142f18e2d1ea481d9bf14588152be82"},{url:"assets/infoDiagram-94cd232f-DmmXjRFz.js",revision:"ca0e092c59cb1b71750762bee474d512"},{url:"assets/init-Gi6I4Gst.js",revision:"3ce28180466443e9b617d7b96e9f7b8f"},{url:"assets/intro.html-DYiJC5Ah.js",revision:"d7b25f11faf08254c4106892b7a17e02"},{url:"assets/iOS中的Runloop.html-DFb4h3zI.js",revision:"944508435ef7fde6e5e3ecfe56fee935"},{url:"assets/iOS枚举类型enum,NS_ENUM,NS_OPTIONS.html-DX_f2v2J.js",revision:"5cfd6a54880bd84200c08b42346ef8b6"},{url:"assets/iOS的Cookie使用.html-n-sbz5-P.js",revision:"914b0e674caf3a0cbe4b3745651e933c"},{url:"assets/iOS程序启动原理(上).html-CPiWHYeZ.js",revision:"b9bb5bc9ce3ea2e079c21cb5b0957d11"},{url:"assets/iOS程序启动原理(下).html-CnMq7n7z.js",revision:"727b08d619b9ed89940801a3ee6a657c"},{url:"assets/iterm2-pure.html-Btvy90Go.js",revision:"bc3b80ad5c846818f111c47945f5c180"},{url:"assets/JavaScriptBridge.html-yHc9vznD.js",revision:"36676da2c6fbde95bfa64aba5ec489bb"},{url:"assets/jekyll.html-oBu6pMca.js",revision:"9351f485d18ca32cf2a59012e32444bc"},{url:"assets/Jenkins.html-BzJTFLBX.js",revision:"fb9dd3ff38c146ba28609dd6f8c0b12b"},{url:"assets/journeyDiagram-6625b456-8gU7P5XX.js",revision:"7e62ac8f64fe1efd0d7b53b221b082cc"},{url:"assets/js-module-loader.html-8Dh5AOoF.js",revision:"ff75c22421421aa976b9116e0a191610"},{url:"assets/js-version.html-DlLo8W_N.js",revision:"0560eb4c4c2cf50865d0a5f14ad208e6"},{url:"assets/judgment.html-Cjw8Ijr0.js",revision:"205f980178e51cebfef2b058d5fcc554"},{url:"assets/KaTeX_AMS-Regular-BQhdFMY1.woff2",revision:"66c678209ce93b6e2b583f02ce41529e"},{url:"assets/KaTeX_AMS-Regular-DMm9YOAa.woff",revision:"10824af77e9961cfd548c8a458f10851"},{url:"assets/KaTeX_AMS-Regular-DRggAlZN.ttf",revision:"56573229753fad48910bda2ea1a6dd54"},{url:"assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf",revision:"497bf407c4c609c6cf1f1ad38f437f7f"},{url:"assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff",revision:"de2ba279933d60f7819ff61f71c17bed"},{url:"assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2",revision:"a9e9b0953b078cd40f5e19ef4face6fc"},{url:"assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff",revision:"a25140fbe6692bffe71a2ab861572eb3"},{url:"assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2",revision:"08d95d99bf4a2b2dc7a876653857f154"},{url:"assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf",revision:"e6fb499fc8f9925eea3138cccba17fff"},{url:"assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf",revision:"b9d7c4497cab3702487214651ab03744"},{url:"assets/KaTeX_Fraktur-Bold-BsDP51OF.woff",revision:"40934fc076960bb989d590db044fef62"},{url:"assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2",revision:"796f3797cdf36fcaea18c3070a608378"},{url:"assets/KaTeX_Fraktur-Regular-CB_wures.ttf",revision:"97a699d83318e9334a0deaea6ae5eda2"},{url:"assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2",revision:"f9e6a99f4a543b7d6cad1efb6cf1e4b1"},{url:"assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff",revision:"e435cda5784e21b26ab2d03fbcb56a99"},{url:"assets/KaTeX_Main-Bold-Cx986IdX.woff2",revision:"a9382e25bcf75d856718fcef54d7acdb"},{url:"assets/KaTeX_Main-Bold-Jm3AIy58.woff",revision:"4cdba6465ab9fac5d3833c6cdba7a8c3"},{url:"assets/KaTeX_Main-Bold-waoOVXN0.ttf",revision:"8e431f7ece346b6282dae3d9d0e7a970"},{url:"assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2",revision:"d873734390c716d6e18ff3f71ac6eb8b"},{url:"assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf",revision:"52fb39b0434c463d5df32419608ab08a"},{url:"assets/KaTeX_Main-BoldItalic-SpSLRI95.woff",revision:"5f875f986a9bce1264e8c42417b56f74"},{url:"assets/KaTeX_Main-Italic-3WenGoN9.ttf",revision:"39349e0a2b366f38e2672b45aded2030"},{url:"assets/KaTeX_Main-Italic-BMLOBm91.woff",revision:"8ffd28f6390231548ead99d7835887fa"},{url:"assets/KaTeX_Main-Italic-NWA7e6Wa.woff2",revision:"652970624cde999882102fa2b6a8871f"},{url:"assets/KaTeX_Main-Regular-B22Nviop.woff2",revision:"f8a7f19f45060f7a177314855b8c7aa3"},{url:"assets/KaTeX_Main-Regular-Dr94JaBh.woff",revision:"f1cdb692ee31c10b37262caffced5271"},{url:"assets/KaTeX_Main-Regular-ypZvNtVU.ttf",revision:"818582dae57e6fac46202cfd844afabb"},{url:"assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf",revision:"6589c4f1f587f73f0ad0af8ae35ccb53"},{url:"assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2",revision:"1320454d951ec809a7dbccb4f23fccf0"},{url:"assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff",revision:"48155e43d9a284b54753e50e4ba586dc"},{url:"assets/KaTeX_Math-Italic-DA0__PXp.woff",revision:"ed7aea12d765f9e2d0f9bc7fa2be626c"},{url:"assets/KaTeX_Math-Italic-flOr_0UB.ttf",revision:"fe5ed5875d95b18c98546cb4f47304ff"},{url:"assets/KaTeX_Math-Italic-t53AETM-.woff2",revision:"d8b7a801bd87b324efcbae7394119c24"},{url:"assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf",revision:"f2ac73121357210d91e5c3eaa42f72ea"},{url:"assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2",revision:"ad546b4719bcf690a3604944b90b7e42"},{url:"assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff",revision:"0e897d27f063facef504667290e408bd"},{url:"assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2",revision:"e934cbc86e2d59ceaf04102c43dc0b50"},{url:"assets/KaTeX_SansSerif-Italic-DN2j7dab.woff",revision:"ef725de572b71381dccf53918e300744"},{url:"assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf",revision:"f60b4a34842bb524b562df092917a542"},{url:"assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf",revision:"3243452ee6817acd761c9757aef93c29"},{url:"assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff",revision:"5f8637ee731482c44a37789723f5e499"},{url:"assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2",revision:"1ac3ed6ebe34e473519ca1da86f7a384"},{url:"assets/KaTeX_Script-Regular-C5JkGWo-.ttf",revision:"a189c37d73ffce63464635dc12cbbc96"},{url:"assets/KaTeX_Script-Regular-D3wIWfF6.woff2",revision:"1b3161eb8cc67462d6e8c2fb96c68507"},{url:"assets/KaTeX_Script-Regular-D5yQViql.woff",revision:"a82fa2a7e18b8c7a1a9f6069844ebfb9"},{url:"assets/KaTeX_Size1-Regular-C195tn64.woff",revision:"4788ba5b6247e336f734b742fe9900d5"},{url:"assets/KaTeX_Size1-Regular-Dbsnue_I.ttf",revision:"0d8d9204004bdf126342605f7bbdffe6"},{url:"assets/KaTeX_Size1-Regular-mCD8mA8B.woff2",revision:"82ef26dc680ba60d884e051c73d9a42d"},{url:"assets/KaTeX_Size2-Regular-B7gKUWhC.ttf",revision:"1fdda0e59ed35495ebac28badf210574"},{url:"assets/KaTeX_Size2-Regular-Dy4dx90m.woff2",revision:"95a1da914c20455a07b7c9e2dcf2836d"},{url:"assets/KaTeX_Size2-Regular-oD1tc_U0.woff",revision:"b0628bfd27c979a09f702a2277979888"},{url:"assets/KaTeX_Size3-Regular-CTq5MqoE.woff",revision:"4de844d4552e941f6b9c38837a8d487b"},{url:"assets/KaTeX_Size3-Regular-DgpXs0kz.ttf",revision:"963af864cbb10611ba33267ba7953777"},{url:"assets/KaTeX_Size4-Regular-BF-4gkZK.woff",revision:"3045a61f722bc4b198450ce69b3e3824"},{url:"assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2",revision:"61522cd3d9043622e235ab57762754f2"},{url:"assets/KaTeX_Size4-Regular-DWFBv043.ttf",revision:"27a23ee69999affa55491c7dab8e53bf"},{url:"assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff",revision:"0e0460587676d22eae09accd6dcfebc6"},{url:"assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2",revision:"b8b8393d2e65fcebda5fa99fa3264f41"},{url:"assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf",revision:"6bf4287568e1d3004b54d5d60f9f08f9"},{url:"assets/katex-rPiVaalG.js",revision:"5915c991bada2201323e84d17c8b9786"},{url:"assets/keychain更新.html-BIjWGNVl.js",revision:"19c2a20f46dee1ee291ad58a1252531b"},{url:"assets/layout-COayN60m.js",revision:"fe8ca331339d3aa8f50a891e8b860ad4"},{url:"assets/line-Bv-I6acW.js",revision:"6039e5551e378b4e306d5290393b210c"},{url:"assets/linear-1psG1MhO.js",revision:"ca8206084b4d888982a8c1c609442d86"},{url:"assets/link.svg",revision:"9aeae0bbc4c1f0930ea450f7d107f109"},{url:"assets/lyb.svg",revision:"a9d999489d8f17aee495168cd8cc36e7"},{url:"assets/markdown.esm-BG2Xu2Hd.js",revision:"dfebc8121864151002204ef714f81472"},{url:"assets/markdown.html-DR_C06GL.js",revision:"d15899fad0f6e1b86d54d571aa465a32"},{url:"assets/math.esm-DN7Rh_EM.js",revision:"fa8c95f2f175318b750e4e8a7aa52fbd"},{url:"assets/mermaid.core-Bk1eNDay.js",revision:"4b50eff29ee75344e04b2f9066cd91b8"},{url:"assets/meting2.html-C5C7Ch5k.js",revision:"631aee45fc6e64747ab71413f5a4d1ae"},{url:"assets/mindmap-definition-307c710a-DiKVzUnA.js",revision:"7415c75791bdda171b0b1810afcf233f"},{url:"assets/Mylink-BokaCp9V.js",revision:"83bf54228381db99876202218a5d8526"},{url:"assets/newbie.html-hMNUB3XQ.js",revision:"05c235f15e1d1d0de8e1782256f0bad7"},{url:"assets/node-version.html-CbylZCLO.js",revision:"140ed266f9dae29e4631a51c18ead726"},{url:"assets/notes.esm-DcquA2oP.js",revision:"ffb473d9bd174a823a767319a6caccfe"},{url:"assets/NSError.html-Cbfa4ghy.js",revision:"bb88ceebeb4fdb3c1734d71af70eb844"},{url:"assets/NSOperation和NSOPerationQueue.html-D0EB1Evs.js",revision:"77f30a591f7541769101b83822c3fef8"},{url:"assets/optimization.html-BMdYCHox.js",revision:"b7854b71e10be6d2054db1cf93c23ab9"},{url:"assets/ordinal-Cboi1Yqb.js",revision:"a1d5f6bb98dd6182ddcb9cde64c37dab"},{url:"assets/page.html-Coii23ah.js",revision:"1028792249bcd1e9006adc655c007cb5"},{url:"assets/path-CbwjOpE9.js",revision:"f86c0243cb45746453c6b4f7dbd9f34d"},{url:"assets/photoswipe.esm-GXRgw7eJ.js",revision:"9252721b01cd263ae52f9296614a7ddb"},{url:"assets/pieDiagram-bb1d19e5-CI24PBGY.js",revision:"3dbd022c478e39778270e173f78442bd"},{url:"assets/principle.html-Dcvt1GUa.js",revision:"704d61d3b7ea01cb36cb438644b7a360"},{url:"assets/public-api.html-BuW-P-mb.js",revision:"b8e61468803468689408b360dfafadda"},{url:"assets/Q_A.html-WwxGbpRP.js",revision:"89e54dfc213d01634841e5fe63632265"},{url:"assets/quadrantDiagram-c759a472-Ypp4SRjX.js",revision:"37ea9d990e8e1c3eda849d655d7af620"},{url:"assets/react1.html-Bwvo7ttA.js",revision:"ffd4982fcc936b3af87b3b30cd695272"},{url:"assets/react2.html-D0bh5js6.js",revision:"28f0ae6da320d07da15d17a8570edde0"},{url:"assets/react3.html-QyHI9Zxi.js",revision:"d78f0c05f09c261eae6a902d8c5b6ff6"},{url:"assets/Reduced-App- volume.html-BBOCyqv9.js",revision:"75f85ba818fc2d1b4631fab92458fe78"},{url:"assets/requirementDiagram-87253d64-3BtoL7U_.js",revision:"ec19f1825138c57d35e70245169c8e7d"},{url:"assets/reveal.esm-CYbl4_PU.js",revision:"d7a2a78c9e57530577ca771ebd6203f1"},{url:"assets/runtime快速归档.html-C5Bn71TC.js",revision:"aa223586ab9e7f9ff0439330fef62cd5"},{url:"assets/sankeyDiagram-707fac0f-D27-WYzb.js",revision:"476a4839a577fddce85d242695f8bdd5"},{url:"assets/search.esm-DuBqnxcF.js",revision:"d39092c5e0d9959995df72297767dc3f"},{url:"assets/sequenceDiagram-6894f283-DVVWFKdC.js",revision:"72ac80a21322c9066f41f49ac30ca3e9"},{url:"assets/shoucang.svg",revision:"529e78b2c5188570b6de69fe69a9a0d9"},{url:"assets/slides.html-DaS4jjEe.js",revision:"1f641d20da79937698980cd256657b24"},{url:"assets/ssh-key.html-2OgT0jvM.js",revision:"1e49824b64c62b9bdac847fb39cb394c"},{url:"assets/stateDiagram-5dee940d-COgYniQT.js",revision:"e056af56799075e2a294e839fc2a600b"},{url:"assets/stateDiagram-v2-1992cada-B0rwOF8Z.js",revision:"cae21e0dab88b6e8335eacd5e0036d0e"},{url:"assets/style-C0ErpWYu.css",revision:"e7e86abadba691307fc2f6c127c56a93"},{url:"assets/style-l0sNRNKZ.js",revision:"68b329da9893e34099c7d8ad5cb9c940"},{url:"assets/styles-0784dbeb-Bq1pAJYr.js",revision:"e334b791f58b85793f46121d12569712"},{url:"assets/styles-483fbfea-CmfA1jth.js",revision:"09792f3348fb721511079344399d597a"},{url:"assets/styles-b83b31c9-PviQsPN-.js",revision:"cfa3a4d20e770ae3b189199237476234"},{url:"assets/submit-bing.html-ClVwd4sI.js",revision:"dfa5d7b42b3b0ce82af9510eb2c8f59c"},{url:"assets/submit-url.html-dIMComOE.js",revision:"d5d547dcc7f1901eeb7699c66c70103b"},{url:"assets/svgDrawCommon-5e1cfd1d-CUx3nwN9.js",revision:"8ea5745a8950236f3b9e8f05ff34abdd"},{url:"assets/swift捕获语义.html-C5FYbwVT.js",revision:"dfdfb018e165ad51869a49f2bc9f48f4"},{url:"assets/Tableau10-B-NsZVaP.js",revision:"f2197f44250cada74e1e663d3abfba3e"},{url:"assets/tableview-radius.html-PE4lT4t0.js",revision:"57b6810b40f5e4cca42afca5eea2724b"},{url:"assets/test-Three-ways-to- call.html-Bjh8lx2z.js",revision:"0874ebc1e79bcc657421fa959e994c9c"},{url:"assets/textfiled限制输入字符.html-DnsOezjR.js",revision:"b4f448de797fefde0d28c75957cea4c6"},{url:"assets/timeline-definition-bf702344-Dzmnqusa.js",revision:"f711fffbe3f5eefb7859db5330da0440"},{url:"assets/timelineLogistics.html-CN1FRQkW.js",revision:"675a1e83c15e36ce5967251eb647673f"},{url:"assets/unix-linux-note.html-Cce1iKg6.js",revision:"66996158aba93d0589818f42ca239e62"},{url:"assets/Update-Cocoapods.html-Cqw1fYxU.js",revision:"d2fbfd9b51455e413d1c65cb3b1331e0"},{url:"assets/utils-X8EomH4B-BP_hkFrF.js",revision:"f6f9109c6681259ecd31fbd4e3316320"},{url:"assets/vercel-deploy.html-vNu4dHQV.js",revision:"84c866a35e231d75c951c11e088fa886"},{url:"assets/visitorsbook.html-yLAGP5iK.js",revision:"e89293fa95c06d359885b1f0f116edcb"},{url:"assets/vue-repl-Dk163GK1.js",revision:"9c37af783e8581cecd845c3dd5d4ff0d"},{url:"assets/vue2-principle.html-D_ZIr4FR.js",revision:"93110c4004a9b1e6cb1c52443233c26e"},{url:"assets/waline-bug.html-DL6_dDeX.js",revision:"6f7711792f1e0240820b31d2656fbb02"},{url:"assets/waline-mail.html-L4cGC2sp.js",revision:"65a53ac804cbd5ae52783b629b9d81aa"},{url:"assets/waline-meta-l0sNRNKZ.js",revision:"68b329da9893e34099c7d8ad5cb9c940"},{url:"assets/WCDB.html-Dm4gbE_q.js",revision:"9908e1c8c64eb9415f400669e4aac1dd"},{url:"assets/WKWebView-URL.html-DuqslWhx.js",revision:"e91c403fdeaee613430c3ea89471383b"},{url:"assets/WKWebView.html-CHZbN4DT.js",revision:"68c45b2430ac82951ad2655be56d116e"},{url:"assets/xychartDiagram-f11f50a6-DGa-Rf9F.js",revision:"e33e32a760c0256492c4fd339ffb04d8"},{url:"assets/YYMemoryCache.html-BbWxf4Nh.js",revision:"d0656ea675f42751d1a4c9863b5de720"},{url:"assets/zoom.esm-Ctj_eavO.js",revision:"e6e8f9a61302e3ca14aa4dbeec242607"},{url:"assets/zsh.html-CNWm-ibd.js",revision:"acc93a841c37041b36c713d3f4a08a1e"},{url:"assets/一人一句宋词.html-DyP3mEz9.js",revision:"5e7556ef7f42b61de5ef84c83beefcb5"},{url:"assets/优雅的cell单选.html-B-xoDQYY.js",revision:"b7657d19f7496a8b4609e6f406acea1b"},{url:"assets/图片上传压缩算法.html-CTYP-fXm.js",revision:"4179da0a286325e42b3b65f2dce4e60a"},{url:"assets/神经网络模型训练.html-Dkwirb21.js",revision:"d23ec1693f085341d7a22dc6d31de9f8"},{url:"assets/配置https.html-mKeZiEo4.js",revision:"8f6dfe87bbe836b97200a6de00c04dd2"},{url:"logo.svg",revision:"cf22c0d91fdc6379874c2d9111a51e08"},{url:"404.html",revision:"92d7c199cd12e91bae7bb5f0b4ee4900"},{url:"about.html",revision:"696d114dfe13682148f4909739d860fd"},{url:"article/index.html",revision:"ad45c50b9d223f9fa3576707fd58df4d"},{url:"blog/auto-push.html",revision:"87abacdcb539930b7f3fdd67de9603bb"},{url:"blog/disqus.html",revision:"008beb207e3471739be8070cd8152032"},{url:"blog/index.html",revision:"2382926288cce7925ec51c4e2af552fd"},{url:"blog/jekyll.html",revision:"66993fd310d33daa9d0a5b91091f8277"},{url:"blog/waline-mail.html",revision:"2474349b0a79bf4531d98a33293e6b26"},{url:"category/about/index.html",revision:"2aed6f312599f94eb9fc30ac25c28a9e"},{url:"category/ai/index.html",revision:"5f8cb9bc99272e93b229715554547ad8"},{url:"category/blog/index.html",revision:"cf130d80c8b5a6ecec24f0a1882cdb80"},{url:"category/css/index.html",revision:"bafcb76e00fa3b3613b22319ffdf0697"},{url:"category/dart/index.html",revision:"cd04eaae52bf0968994f3d0e1fa84ae7"},{url:"category/flutter/index.html",revision:"508157f1e1b0f460197e27328c14c245"},{url:"category/git/index.html",revision:"c347f918aa8c756b44009cca47fe1a8d"},{url:"category/github/index.html",revision:"011ca64f67e6ba160dd25814c92fb77e"},{url:"category/index.html",revision:"fb45fbbec3aa818824dd7531c7c5b30d"},{url:"category/ios/index.html",revision:"143141944d317e619cbc7bfee38f2f25"},{url:"category/javascript/index.html",revision:"691cf10bd26e56bb42d306f7be54ea3d"},{url:"category/linux/index.html",revision:"a275e78dd17c837ecdcb261acba78986"},{url:"category/python/index.html",revision:"eccfd5bb8b4fab69634a0a96b11ffd3e"},{url:"category/rust/index.html",revision:"8b5c698eaf485c981881db1faaac87d3"},{url:"category/swift/index.html",revision:"357a54da2d00ed5a875d43db43897b47"},{url:"category/vercel/index.html",revision:"20ec60d0f37d42dc8cb5e8c9f9f0ce54"},{url:"category/vue/index.html",revision:"8bed4cf995b3dc54a31e3b289ad153e4"},{url:"category/使用指南/index.html",revision:"d8e358ab10462f80bead66a499dc523e"},{url:"category/前端跨平台/index.html",revision:"d1f28699fe423c5c27b1a34d8341ea5c"},{url:"category/工具教程/index.html",revision:"f611f1d5264973e30305d487197f257d"},{url:"category/开源软件/index.html",revision:"7624765912204ab3e100ec26b3db17fc"},{url:"category/收藏/index.html",revision:"26dcfe9c368064121421932a7abf251c"},{url:"category/浏览器/index.html",revision:"182e96c66a7d8d95b7358bfe214d9930"},{url:"collect.html",revision:"070adeb6f2791e6a45f6e942518edd5b"},{url:"demo/disable.html",revision:"02bc863d036761c1508620f3abf255af"},{url:"demo/encrypt.html",revision:"bd2863a2eef302cca1ee8c8b2790badf"},{url:"demo/index.html",revision:"5ab632f6ec04ca990f63eb9a0b57fa56"},{url:"demo/markdown.html",revision:"9beb4b79c45e517dca47aabd402eb0da"},{url:"demo/page.html",revision:"7119db4c512e91ac9ee47d92bdffbcf5"},{url:"demo/slides.html",revision:"a0001a56cf0b2b9633d8624a9703459b"},{url:"friend.html",revision:"3da12b64121a09c46090c43cd9a8d972"},{url:"index.html",revision:"bd46abb3908bb9bee2b49f2e81746fe0"},{url:"intro.html",revision:"cbb486f1ba2248be05f45cde2c549c80"},{url:"news/1.html",revision:"7ea1352f02c5c0ce664c5de1c1e36042"},{url:"news/2.html",revision:"bbf2e19824189d984407616ba1cd570c"},{url:"news/3.html",revision:"0c80afb74994e14ea62ef8ae5c5e6aa8"},{url:"news/4.html",revision:"402af94dff281b514ac60b54f1154f9e"},{url:"news/5.html",revision:"c67c9c85cea194f57103be728f111b76"},{url:"news/index.html",revision:"c71d70f05dde015f99ea8387009b897b"},{url:"posts/cross-platform/Flutter/concurrency.html",revision:"fef3ddec2e8720e67b005db01816410d"},{url:"posts/cross-platform/Flutter/index.html",revision:"01287a963e889ce0ed61cd740c5c8c6f"},{url:"posts/cross-platform/Flutter/newbie.html",revision:"e6f47149adc6ea24ddc57909cc23d37c"},{url:"posts/cross-platform/Flutter/principle.html",revision:"81c865f4b07f4e2ebe97740faaf8f6f0"},{url:"posts/cross-platform/index.html",revision:"9e804d85ef4e8ef166f1568864717f00"},{url:"posts/cross-platform/ReactNative/index.html",revision:"b1dd6ec41b683f78c2bdf5a4c9ef598f"},{url:"posts/cross-platform/ReactNative/react1.html",revision:"0514b88c163a9b7c843065a00a13af0e"},{url:"posts/cross-platform/ReactNative/react2.html",revision:"b2bd3ffaada5bf8f66f063deff93d5ac"},{url:"posts/cross-platform/ReactNative/react3.html",revision:"9d180f27d5b76ff7b947ffed11a03eef"},{url:"posts/index.html",revision:"68dcac8fd26b92a7408a52986c5b544c"},{url:"posts/iOS/index.html",revision:"da0dd02a92e5455e7791507f5b06ac5d"},{url:"posts/iOS/other/coreML.html",revision:"f5830dba0fbc3bf0d1f90f342df90b69"},{url:"posts/iOS/other/index.html",revision:"b5181dc7268686b554263c1f92b63662"},{url:"posts/iOS/other/JavaScriptBridge.html",revision:"b927302f1ddf797ae220d25f7f49bcd3"},{url:"posts/iOS/other/test-Three-ways-to- call.html",revision:"6bb53631a1f240a5a1007e4c225e8759"},{url:"posts/iOS/other/神经网络模型训练.html",revision:"4923173197d27437c81d907e923d25e1"},{url:"posts/iOS/source/AFNETworking-A-memory-leak.html",revision:"7257cfd089cea7d721028eab1c07f291"},{url:"posts/iOS/source/index.html",revision:"05c254721644ebb68a51f0910ee853e4"},{url:"posts/iOS/source/WCDB.html",revision:"35c86e5b3f133221adc453b8ad9e6067"},{url:"posts/iOS/source/YYMemoryCache.html",revision:"6d1263ce3cf64f3e5bd222ffd2feb719"},{url:"posts/iOS/swift/index.html",revision:"31aff5972e86a81cfc1957eaf4531eb1"},{url:"posts/iOS/swift/swift捕获语义.html",revision:"d1f892f067d1fd33486514ccd510bdd3"},{url:"posts/iOS/system/index.html",revision:"b40f475f39b719780ff71e683b059c99"},{url:"posts/iOS/system/iOS中的Runloop.html",revision:"52261c2afe11aad58e39a5428721560d"},{url:"posts/iOS/system/iOS枚举类型enum,NS_ENUM,NS_OPTIONS.html",revision:"63b2b28f41ebdf98c4ba0e197dbfa06c"},{url:"posts/iOS/system/iOS的Cookie使用.html",revision:"e3d2e36834c350acbed6344d023ed34d"},{url:"posts/iOS/system/iOS程序启动原理(上).html",revision:"e2cc2b150e93af8badfee2d5fdd247fc"},{url:"posts/iOS/system/iOS程序启动原理(下).html",revision:"1fc94f5bdd8e9a7d762d62b12456dd65"},{url:"posts/iOS/system/keychain更新.html",revision:"6653fd02005474de18994e9d68dd7a33"},{url:"posts/iOS/system/NSError.html",revision:"659541e044ae782f449e393b36452ccb"},{url:"posts/iOS/system/NSOperation和NSOPerationQueue.html",revision:"11483b77590f2163c32d6088ca1ed849"},{url:"posts/iOS/system/Reduced-App- volume.html",revision:"6be1be1ba98f7d59dc65f74136894993"},{url:"posts/iOS/system/runtime快速归档.html",revision:"cfc68c75463ad777a287f60152f6c272"},{url:"posts/iOS/system/WKWebView-URL.html",revision:"5b6f5c25d964dc6ec2e685dc93406b80"},{url:"posts/iOS/system/WKWebView.html",revision:"f17507db7539365a639e7b25b5c1426d"},{url:"posts/iOS/tool/ijkplayer.html",revision:"adfbf538d80dce3e789586aeefd40843"},{url:"posts/iOS/tool/index.html",revision:"8f7032d5aef589896a0d6a64f029ef15"},{url:"posts/iOS/tool/Update-Cocoapods.html",revision:"2cb4f817b839a5d722490c69e680e449"},{url:"posts/iOS/tool/图片上传压缩算法.html",revision:"011974b2683450697adf954221d4b706"},{url:"posts/iOS/tool/配置https.html",revision:"7e2a9a57f0338a1af41448b7571da4a3"},{url:"posts/iOS/ui/cell复用-accessoryType解决办法.html",revision:"c9913f1e97c0c09be89dc7be65145e3d"},{url:"posts/iOS/ui/index.html",revision:"7ece3776437b4e45b574c97ae7baae9c"},{url:"posts/iOS/ui/tableview-radius.html",revision:"64d843504167a61efcc3941b0a7e9148"},{url:"posts/iOS/ui/textfiled限制输入字符.html",revision:"f6079c748b7f5776d04788fdaf2a31ba"},{url:"posts/iOS/ui/timelineLogistics.html",revision:"839e91f183c175b40dfa79d735911942"},{url:"posts/iOS/ui/优雅的cell单选.html",revision:"bda80e27466b045fe5ada24e98621527"},{url:"posts/Linux/index.html",revision:"928515c4b3b80571b8b6336a49b31e11"},{url:"posts/Linux/iterm2-pure.html",revision:"c1cee1c6ad455ec99277939f3a57f10c"},{url:"posts/Linux/unix-linux-note.html",revision:"63ff571000e9d86275d11c0032e4e647"},{url:"posts/Linux/zsh.html",revision:"d0366f6520f9871fe16d7ad86f17c2ef"},{url:"posts/Python/index.html",revision:"f83f63158d6176feb622f9038dca6ab0"},{url:"posts/Python/submit-bing.html",revision:"116f517b69711c6556f4c9c8a5bad5f9"},{url:"posts/Python/submit-url.html",revision:"6b7b359025aa7ee449ce59fedfe10d17"},{url:"posts/Rust/first-time.html",revision:"bacdd695e8ceaa1ce23199524ee72ce0"},{url:"posts/Rust/index.html",revision:"39af6f6cfd9937eb8ef31914493edc23"},{url:"posts/Web/Browser/event-loop.html",revision:"0e18c0894790a8b9795af4ac9cbdf0b3"},{url:"posts/Web/Browser/index.html",revision:"c27b92953a686f19473ff6e3fbead88e"},{url:"posts/Web/CSS/calculation.html",revision:"818e6a612193e0c3cc070f8db9371757"},{url:"posts/Web/CSS/containing-block.html",revision:"00df68421a3918fff9caa59b136b241e"},{url:"posts/Web/CSS/index.html",revision:"b96b3f2ee07b5a3763d9326cb29435aa"},{url:"posts/Web/index.html",revision:"0910de252f4948ca8ab8068e1ec25b26"},{url:"posts/Web/JavaScript/index.html",revision:"f9e90279a62ababdd8f3935cba7393d3"},{url:"posts/Web/JavaScript/js-module-loader.html",revision:"66ec7073ff8e9fe827a9f39b86bb4698"},{url:"posts/Web/JavaScript/js-version.html",revision:"7d9ebc55e301b5d15e97404c6cba972d"},{url:"posts/Web/JavaScript/judgment.html",revision:"fe0b622376ad36d65af4d6a680adb4a9"},{url:"posts/Web/node/index.html",revision:"3947af2cfabd44dcfa3596fdeb320678"},{url:"posts/Web/node/node-version.html",revision:"d449f1a2a0162a1af494b050a85e80cf"},{url:"posts/Web/Q_A.html",revision:"6be9d11e15b84e2ccac5340f3196fd47"},{url:"posts/Web/Vue/index.html",revision:"09835585a1ef1d2d72ea2a319aa7eb6e"},{url:"posts/Web/Vue/optimization.html",revision:"5a3b91fdcbf03f5acd30be985ed95f60"},{url:"posts/Web/Vue/vue2-principle.html",revision:"cd96d09d5846450516818329f80b12cc"},{url:"posts/Web/Vue/waline-bug.html",revision:"ee37cff8fba7a8beedc439f31e0d89ec"},{url:"private/index.html",revision:"5c09ce8b1e5c80f3a06a59825d9c489d"},{url:"private/一人一句宋词.html",revision:"bed52f73355bbe9f97cad0c2c5a2aebe"},{url:"site/design.html",revision:"b869a6f5cba2cd5741d8fca94ce19701"},{url:"site/index.html",revision:"19fa7cd773b4b8fa05950cacbf660bf7"},{url:"site/public-api.html",revision:"26f7af66139444b933d5577625a48388"},{url:"star/index.html",revision:"3be9c7e2c8a0d4eead097f1fcc2f3832"},{url:"tag/about/index.html",revision:"aab6dc1e2cbad04a7a0eb77d67afb6bf"},{url:"tag/ai/index.html",revision:"65f30b71df77e52b64d34895d2d1d38b"},{url:"tag/blog/index.html",revision:"a191383537d116add893691c6e7c1952"},{url:"tag/bug录/index.html",revision:"fd7ecaaa538019535c8c93e17c27e726"},{url:"tag/dart/index.html",revision:"78f935cf5e67098dc21a6a20dfe3e838"},{url:"tag/demo/index.html",revision:"6c827f69559c16ac4302759d10928c86"},{url:"tag/flutter/index.html",revision:"949a0c5f8fa9905e4b373275eec9fe5d"},{url:"tag/github-action/index.html",revision:"313b093eb06a6921ca98778d2da81f9f"},{url:"tag/github-actions/index.html",revision:"980a1b4498193aeb017f930e5338940f"},{url:"tag/github/index.html",revision:"b3a8210dcb443bf24416c6fa91dd8bd9"},{url:"tag/index.html",revision:"0553517eeb59904c6fdbbf5b030a3f56"},{url:"tag/ios/index.html",revision:"c0cd164c7f89cc65a132e1ca2b4994ca"},{url:"tag/javascript/index.html",revision:"30f07a34975031c789f76a9fe5bcc63c"},{url:"tag/jenkins/index.html",revision:"af2b82d0af108a07aa9066a7440a80db"},{url:"tag/linux/index.html",revision:"5729089a7ab6f350177a29fe5a74fd0c"},{url:"tag/markdown/index.html",revision:"4e4d3206a4e181b4bb867415c5a9b057"},{url:"tag/node/index.html",revision:"5d09a2434b264392dd12066d80543839"},{url:"tag/objectiv-c语法/index.html",revision:"ca4d6062b5e7cb5584736fa9a3c5b342"},{url:"tag/os/index.html",revision:"ec20dc7334747901119893fc82951c77"},{url:"tag/react-native/index.html",revision:"d6ba9288d735ae5a194e2f289b970ece"},{url:"tag/rust/index.html",revision:"b4a03c6a6737a9bced1b64379487b4b4"},{url:"tag/ssh-key/index.html",revision:"551649b4dd3c5ab9eb19fec2c727fadd"},{url:"tag/swift/index.html",revision:"9647d8dd70bf82caf1b6fb2c9fe63851"},{url:"tag/terminal/index.html",revision:"8d35eb59078a9b60e0bce10113d0c4cc"},{url:"tag/unix/index.html",revision:"23757ddd3a61d74d4f29d0be18e0e3d5"},{url:"tag/vercel/index.html",revision:"4b9954d6dab1377c526aecaf1352c12d"},{url:"tag/vue响应式/index.html",revision:"63bb1b98e3aa682a448387a0479f7208"},{url:"tag/优化/index.html",revision:"7d365296ce8c883e9b857044f5d73888"},{url:"tag/使用指南/index.html",revision:"dd76e6ad671d5c1196db1bf883374b83"},{url:"tag/前端/index.html",revision:"b338aad34b5a51df684370002531b4d7"},{url:"tag/前端开发/index.html",revision:"b327fe7df08348801abff6b7427531c1"},{url:"tag/工具网站/index.html",revision:"a873f86c5c0cf6286678fd187867fed1"},{url:"tag/工具脚本/index.html",revision:"880a027d28a5fe588f41a76d3c80c0c1"},{url:"tag/工具集/index.html",revision:"c845f2c0945e9243eeefcac3bf12cd39"},{url:"tag/性能优化/index.html",revision:"0e11e697c74b8bbe56ac759d6f13cc3e"},{url:"tag/文章加密/index.html",revision:"b69df484c3e7b51bc646508e00eb5f5a"},{url:"tag/生活/index.html",revision:"d2c2537db0c481d0cc79f75b56693c8c"},{url:"tag/禁用/index.html",revision:"fe805a39b36e01cb8aae1cfc9d29c496"},{url:"tag/算法/index.html",revision:"ce147452120963b4925a611d4418ecf8"},{url:"tag/翻译/index.html",revision:"9872de003a933ded96a3f24901f03673"},{url:"tag/页面配置/index.html",revision:"5b5cd029defd63287c7bd35a6b92cd3c"},{url:"timeline/index.html",revision:"f8867d6a4792384c314d2669434b76e4"},{url:"tutorial/CI_CD/index.html",revision:"c8c25d770a62afb30959d2f036c3439e"},{url:"tutorial/CI_CD/Jenkins.html",revision:"58b38d4f9da4c821dda2179122c39eee"},{url:"tutorial/CI_CD/vercel-deploy.html",revision:"f8cad2a39e7740e053c2df92efe093c5"},{url:"tutorial/github/github-action.html",revision:"564c36a253682f36e34db93725588d63"},{url:"tutorial/github/index.html",revision:"b260e9ba33ea81fbce9ef453cfc27a5f"},{url:"tutorial/github/ssh-key.html",revision:"85f7d709faf7fa52391043fe82d68268"},{url:"tutorial/idx-dev.html",revision:"856a91a995e03c55e112ad3814703ce8"},{url:"tutorial/index.html",revision:"85b33a3baa8ee018633f880eaec4df70"},{url:"tutorial/OSS/index.html",revision:"fc1282107e878fbe292d27b950db23bd"},{url:"tutorial/OSS/meting2.html",revision:"a4e696ca60bdfcfea5b4e1a7e5780d5d"},{url:"visitorsbook.html",revision:"777e36eea7e49eba13229d5403df4418"},{url:"assets/avatar.webp",revision:"997bea621198efba02fa6b2f038bcbb8"},{url:"assets/home_bg.jpg",revision:"4c0b753c0a723e18aa0fb2351e752520"},{url:"assets/home_bg2.jpg",revision:"632661e880028e0127447ec2ce5e0e95"},{url:"assets/home_bg3.jpg",revision:"f64f770ebda7f9a1fad82ac105d2d421"},{url:"assets/icon/apple-icon-152.png",revision:"c0a3bcb409613815ff6ce72b4bac0bea"},{url:"assets/icon/chrome-192.png",revision:"ca2a7063362bd225e5b7283ba6d5ffda"},{url:"assets/icon/chrome-512.png",revision:"a6b822c08dc54833922e2f90ec680536"},{url:"assets/icon/chrome-mask-192.png",revision:"621031a4547f156928e450f72d44e0bf"},{url:"assets/icon/chrome-mask-512.png",revision:"420d2bf7f611e53bc7329b213f9df13f"},{url:"assets/icon/guide-maskable.png",revision:"99cc77cf2bc792acd6b847b5e3e151e9"},{url:"assets/icon/ms-icon-144.png",revision:"cbc84abd796f4c15c496b96b205f013d"},{url:"assets/images/404_bg_1.png",revision:"aefdd1d2318534ff6d73df6fdba8f1b0"},{url:"assets/images/404_bg_2.png",revision:"bc7e37f220768db31ace324f70155567"},{url:"assets/images/AliPayQR.jpg",revision:"b5f1af7c051878cbbb120706886fdbf2"},{url:"logo.png",revision:"c34d71b5428eff4dfc9b3022adc95b4f"}],{}),e.cleanupOutdatedCaches()})); diff --git a/site/design.html b/site/design.html index d84c6e8db..6bc406d01 100644 --- a/site/design.html +++ b/site/design.html @@ -30,13 +30,13 @@ 素材设计 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/site/index.html b/site/index.html index 7382ee95c..a2fed95f3 100644 --- a/site/index.html +++ b/site/index.html @@ -30,13 +30,13 @@ 站点收藏 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/site/public-api.html b/site/public-api.html index 69902bcc7..e5b9e0734 100644 --- a/site/public-api.html +++ b/site/public-api.html @@ -30,13 +30,13 @@ 公开API | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/star/index.html b/star/index.html index 78c14c1bd..ae6004717 100644 --- a/star/index.html +++ b/star/index.html @@ -30,7 +30,7 @@ 星标 | Oragekk's Blog - + @@ -97,6 +97,6 @@

    GitHub Actions 是什么?


    Oragekk...大约 4 分钟LinuxterminalLinux
    - + diff --git a/tag/about/index.html b/tag/about/index.html index 14d401118..9e8b80a8a 100644 --- a/tag/about/index.html +++ b/tag/about/index.html @@ -30,7 +30,7 @@ 标签: About | Oragekk's Blog - + @@ -44,6 +44,6 @@

    Profile


    Oragekk...大约 1 分钟AboutAbout
    - + diff --git a/tag/ai/index.html b/tag/ai/index.html index 620c2d7f7..d7860702c 100644 --- a/tag/ai/index.html +++ b/tag/ai/index.html @@ -30,7 +30,7 @@ 标签: AI | Oragekk's Blog - + @@ -47,6 +47,6 @@

    详细:

    去年,苹果(Apple)推出了 Core ML:这是一种快速的方法,可以让你用尽可能少的代码将预先培训好的机器学习模型导入应用程序中!今年,有了 Create ML,苹果给了我们开发人员创建我们自己的机器学习模型直接进入 Xcode 的平台的能力!我们只需要一些数据就行了!目前,Create ML 允许文本、图像和表作为数据。然而,由于这是大多数 ML 应用程序的组成部分,这应该很好地服务于您的目的!我将向您展示如何使用这三种类型的数据创建一个 ML 模型.


    Oragekk...大约 5 分钟iOSiOSAI
    - + diff --git a/tag/blog/index.html b/tag/blog/index.html index 1db9c09e4..be46d67a0 100644 --- a/tag/blog/index.html +++ b/tag/blog/index.html @@ -30,7 +30,7 @@ 标签: Blog | Oragekk's Blog - + @@ -69,6 +69,6 @@

    前言

    终于可以有自己的自留地了,之前一直在简书上写一些技术类的文章,这次可以有个自己的地盘,想怎么写就怎么写。😝 哈哈。不过这些前端的东西对我也是一种挑战,似懂非懂的看着模板,和一堆 js+css+html 的代码。。一顿头大。。对照着效果,一步步自己改。改好了之后也是蛮有成就感的嘛


    Oragekk...大约 3 分钟BlogBlog
    - + diff --git "a/tag/bug\345\275\225/index.html" "b/tag/bug\345\275\225/index.html" index b05e81778..e9c9ca062 100644 --- "a/tag/bug\345\275\225/index.html" +++ "b/tag/bug\345\275\225/index.html" @@ -30,7 +30,7 @@ 标签: Bug录 | Oragekk's Blog - + @@ -70,6 +70,6 @@

    解决方法


    Oragekk...小于 1 分钟iOSiOSBug录
    - + diff --git a/tag/dart/index.html b/tag/dart/index.html index ce75a72e3..7955cb14d 100644 --- a/tag/dart/index.html +++ b/tag/dart/index.html @@ -30,7 +30,7 @@ 标签: Dart | Oragekk's Blog - + @@ -38,6 +38,6 @@

    在应用中,所有的 Dart 代码都在 isolate 中运行。每一个 Dart 的 isolate 都有独立的运行线程,它们无法与其他 isolate 共享可变对象。在需要进行通信的场景里,isolate 会使用消息机制。很多 Dart 应用都只使用一个 isolate,也就是 main isolate。你可以创建额外的 isolate 以便在多个处理器核心上执行并行代码。


    Oragekk...大约 14 分钟FlutterDartDart
    - + diff --git a/tag/demo/index.html b/tag/demo/index.html index cbf05ac37..601ab847b 100644 --- a/tag/demo/index.html +++ b/tag/demo/index.html @@ -30,7 +30,7 @@ 标签: Demo | Oragekk's Blog - + @@ -44,6 +44,6 @@

    效果


    Oragekk...大约 1 分钟iOSiOSDemo
    - + diff --git a/tag/flutter/index.html b/tag/flutter/index.html index 2c5ad571a..42a6bf9f1 100644 --- a/tag/flutter/index.html +++ b/tag/flutter/index.html @@ -30,7 +30,7 @@ 标签: Flutter | Oragekk's Blog - + @@ -46,6 +46,6 @@

    积极可组合性

    demo是照着B站的视频敲的,现在可能用不上了,但是还是觉得当时写的demo对于想学习flutter的新手来说作用还是有的,因为视频课程很零散,所以我边看边写了一个app,里边基本介绍了大部分基础的用法,当然进阶的东西,这部分demo是没有的,最近也在忙,有空了再补一部分进阶的东西吧


    Oragekk...大约 1 分钟Flutter前端跨平台Flutter
    - + diff --git a/tag/github-action/index.html b/tag/github-action/index.html index 9ad0751c3..88ba60ccb 100644 --- a/tag/github-action/index.html +++ b/tag/github-action/index.html @@ -30,7 +30,7 @@ 标签: GitHub Action | Oragekk's Blog - + @@ -49,6 +49,6 @@
    Oragekk原创...大约 3 分钟python工具脚本GitHub Action
    - + diff --git a/tag/github-actions/index.html b/tag/github-actions/index.html index 42ae1b1db..067976922 100644 --- a/tag/github-actions/index.html +++ b/tag/github-actions/index.html @@ -30,7 +30,7 @@ 标签: GitHub Actions | Oragekk's Blog - + @@ -41,6 +41,6 @@

    GitHub Actions 是什么?

    很多操作在不同项目里面是类似的,完全可以共享。GitHub 注意到了这一点,想出了一个很妙的点子,允许开发者把每个操作写成独立的脚本文件,存放到代码仓库,使得其他开发者可以引用。


    Oragekk...大约 8 分钟GitHubGitHub Actions
    - + diff --git a/tag/github/index.html b/tag/github/index.html index 1d0a3494d..563045292 100644 --- a/tag/github/index.html +++ b/tag/github/index.html @@ -30,7 +30,7 @@ 标签: GitHub | Oragekk's Blog - + @@ -46,6 +46,6 @@


    Oragekk原创...大约 1 分钟开源软件GitHubGitHub
    - + diff --git a/tag/index.html b/tag/index.html index daefbbdb6..a6e5fcd74 100644 --- a/tag/index.html +++ b/tag/index.html @@ -30,13 +30,13 @@ 标签 | Oragekk's Blog - + - + diff --git a/tag/ios/index.html b/tag/ios/index.html index e0e787827..61117404f 100644 --- a/tag/ios/index.html +++ b/tag/ios/index.html @@ -30,7 +30,7 @@ 标签: iOS | Oragekk's Blog - + @@ -144,6 +144,6 @@

    要求


    Oragekk...大约 2 分钟iOSiOS
    - + diff --git a/tag/javascript/index.html b/tag/javascript/index.html index c70e353da..030905a59 100644 --- a/tag/javascript/index.html +++ b/tag/javascript/index.html @@ -30,7 +30,7 @@ 标签: JavaScript | Oragekk's Blog - + @@ -100,6 +100,6 @@

    废话不多说,上代码

    Catalog


    Oragekk...大约 8 分钟JavaScript前端开发JavaScript
    - + diff --git a/tag/jenkins/index.html b/tag/jenkins/index.html index 85be24ffa..1e43507fa 100644 --- a/tag/jenkins/index.html +++ b/tag/jenkins/index.html @@ -30,7 +30,7 @@ 标签: Jenkins | Oragekk's Blog - + @@ -44,6 +44,6 @@

    1.1. 勾选【触发远程构建】并填入 token

    勾选远程构建开关
    勾选远程构建开关

    Oragekk原创...大约 3 分钟工具教程Jenkins
    - + diff --git a/tag/linux/index.html b/tag/linux/index.html index f4de3f2b1..f08b7c3fe 100644 --- a/tag/linux/index.html +++ b/tag/linux/index.html @@ -30,7 +30,7 @@ 标签: Linux | Oragekk's Blog - + @@ -77,6 +77,6 @@

    Catagory


    Oragekk...大约 8 分钟LinuxOSUnixLinux
    - + diff --git a/tag/markdown/index.html b/tag/markdown/index.html index 36b802b81..8e68e79f3 100644 --- a/tag/markdown/index.html +++ b/tag/markdown/index.html @@ -30,7 +30,7 @@ 标签: Markdown | Oragekk's Blog - + @@ -39,6 +39,6 @@
    Oragekk...大约 3 分钟使用指南Markdown
    - + diff --git a/tag/node/index.html b/tag/node/index.html index 76facb8f4..566b3a908 100644 --- a/tag/node/index.html +++ b/tag/node/index.html @@ -30,7 +30,7 @@ 标签: Node | Oragekk's Blog - + @@ -44,6 +44,6 @@

    安装

    如果你已经安装某个版本的 Node 和 npm ,则可以用 npm install -g n 来安装 n,就像安装其他 NPM 包一样。


    Oragekk...大约 3 分钟LinuxNode
    - + diff --git "a/tag/objectiv-c\350\257\255\346\263\225/index.html" "b/tag/objectiv-c\350\257\255\346\263\225/index.html" index 5d917b28a..1467eee20 100644 --- "a/tag/objectiv-c\350\257\255\346\263\225/index.html" +++ "b/tag/objectiv-c\350\257\255\346\263\225/index.html" @@ -30,7 +30,7 @@ 标签: Objectiv-C语法 | Oragekk's Blog - + @@ -61,6 +61,6 @@

    提要


    Oragekk...大约 2 分钟iOSiOSObjectiv-C语法
    - + diff --git a/tag/os/index.html b/tag/os/index.html index e75413caa..ef64a9334 100644 --- a/tag/os/index.html +++ b/tag/os/index.html @@ -30,7 +30,7 @@ 标签: OS | Oragekk's Blog - + @@ -62,6 +62,6 @@

    Catagory


    Oragekk...大约 8 分钟LinuxOSUnixLinux
    - + diff --git a/tag/react-native/index.html b/tag/react-native/index.html index dcf18799a..a6719378b 100644 --- a/tag/react-native/index.html +++ b/tag/react-native/index.html @@ -30,7 +30,7 @@ 标签: React Native | Oragekk's Blog - + @@ -63,6 +63,6 @@

    前置知识

    React Native 看起来很像 React,只不过其基础组件是原生组件而非 web 组件。要理解 React Native 应用的基本结构,首先需要了解一些基本的 React 的概念,比如 JSX 语法、组件、state状态以及props属性。如果你已经了解了 React,那么还需要掌握一些 React Native 特有的知识,比如原生组件的使用。


    Oragekk...大约 4 分钟前端跨平台前端React Native
    - + diff --git a/tag/rust/index.html b/tag/rust/index.html index 7fdb40643..1e1de0066 100644 --- a/tag/rust/index.html +++ b/tag/rust/index.html @@ -30,7 +30,7 @@ 标签: rust | Oragekk's Blog - + @@ -39,6 +39,6 @@

    在紧锣密鼓的开发过程中,Rust 建立了一个强大且活跃的社区,形成一整套完善稳定的项目贡献机制(Rust 能够飞速发展,与这一点密不可分)。Rust 现在由 Rust 项目开发者社区 维护, Rust 基金会赞助支持。


    Oragekk...大约 9 分钟rustrust
    - + diff --git a/tag/ssh-key/index.html b/tag/ssh-key/index.html index 902ff07a0..77067f243 100644 --- a/tag/ssh-key/index.html +++ b/tag/ssh-key/index.html @@ -30,7 +30,7 @@ 标签: ssh_key | Oragekk's Blog - + @@ -41,6 +41,6 @@

    生成 SSH 密钥对


    Oragekk...大约 2 分钟Gitssh_key
    - + diff --git a/tag/swift/index.html b/tag/swift/index.html index 03b64ab6c..d17dec3ba 100644 --- a/tag/swift/index.html +++ b/tag/swift/index.html @@ -30,7 +30,7 @@ 标签: Swift | Oragekk's Blog - + @@ -50,6 +50,6 @@

    概述


    Oragekk...大约 4 分钟SwiftiOSSwift
    - + diff --git a/tag/terminal/index.html b/tag/terminal/index.html index 577e2c7d6..51e9598e9 100644 --- a/tag/terminal/index.html +++ b/tag/terminal/index.html @@ -30,7 +30,7 @@ 标签: terminal | Oragekk's Blog - + @@ -52,6 +52,6 @@

    背景介绍

    zsh 和 shell 有什么关系呢?


    Oragekk...大约 5 分钟LinuxterminalLinux
    - + diff --git a/tag/unix/index.html b/tag/unix/index.html index e07735af0..b3f0ce19d 100644 --- a/tag/unix/index.html +++ b/tag/unix/index.html @@ -30,7 +30,7 @@ 标签: Unix | Oragekk's Blog - + @@ -62,6 +62,6 @@

    Catagory


    Oragekk...大约 8 分钟LinuxOSUnixLinux
    - + diff --git a/tag/vercel/index.html b/tag/vercel/index.html index 0b4ffc90f..8ddc69106 100644 --- a/tag/vercel/index.html +++ b/tag/vercel/index.html @@ -30,7 +30,7 @@ 标签: Vercel | Oragekk's Blog - + @@ -39,6 +39,6 @@
    Oragekk原创...大约 5 分钟VercelVercel
    - + diff --git "a/tag/vue\345\223\215\345\272\224\345\274\217/index.html" "b/tag/vue\345\223\215\345\272\224\345\274\217/index.html" index 4761402d4..b1c065746 100644 --- "a/tag/vue\345\223\215\345\272\224\345\274\217/index.html" +++ "b/tag/vue\345\223\215\345\272\224\345\274\217/index.html" @@ -30,7 +30,7 @@ 标签: Vue响应式 | Oragekk's Blog - + @@ -47,6 +47,6 @@
    Oragekk...大约 11 分钟VueVue响应式
    - + diff --git "a/tag/\344\274\230\345\214\226/index.html" "b/tag/\344\274\230\345\214\226/index.html" index 9e6c6f26e..78f726a1a 100644 --- "a/tag/\344\274\230\345\214\226/index.html" +++ "b/tag/\344\274\230\345\214\226/index.html" @@ -30,7 +30,7 @@ 标签: 优化 | Oragekk's Blog - + @@ -49,6 +49,6 @@
    Oragekk...大约 11 分钟Vue优化
    - + diff --git "a/tag/\344\275\277\347\224\250\346\214\207\345\215\227/index.html" "b/tag/\344\275\277\347\224\250\346\214\207\345\215\227/index.html" index db1abda5a..34e0cc22b 100644 --- "a/tag/\344\275\277\347\224\250\346\214\207\345\215\227/index.html" +++ "b/tag/\344\275\277\347\224\250\346\214\207\345\215\227/index.html" @@ -30,7 +30,7 @@ 标签: 使用指南 | Oragekk's Blog - + @@ -38,6 +38,6 @@
    Ms.Hope...大约 1 分钟使用指南页面配置使用指南
    - + diff --git "a/tag/\345\211\215\347\253\257/index.html" "b/tag/\345\211\215\347\253\257/index.html" index 4cb090fba..5adaf1588 100644 --- "a/tag/\345\211\215\347\253\257/index.html" +++ "b/tag/\345\211\215\347\253\257/index.html" @@ -30,7 +30,7 @@ 标签: 前端 | Oragekk's Blog - + @@ -63,6 +63,6 @@

    前置知识

    React Native 看起来很像 React,只不过其基础组件是原生组件而非 web 组件。要理解 React Native 应用的基本结构,首先需要了解一些基本的 React 的概念,比如 JSX 语法、组件、state状态以及props属性。如果你已经了解了 React,那么还需要掌握一些 React Native 特有的知识,比如原生组件的使用。


    Oragekk...大约 4 分钟前端跨平台前端React Native
    - + diff --git "a/tag/\345\211\215\347\253\257\345\274\200\345\217\221/index.html" "b/tag/\345\211\215\347\253\257\345\274\200\345\217\221/index.html" index 3be6d3afb..8c53811a1 100644 --- "a/tag/\345\211\215\347\253\257\345\274\200\345\217\221/index.html" +++ "b/tag/\345\211\215\347\253\257\345\274\200\345\217\221/index.html" @@ -30,7 +30,7 @@ 标签: 前端开发 | Oragekk's Blog - + @@ -91,6 +91,6 @@

    废话不多说,上代码

    Catalog


    Oragekk...大约 8 分钟JavaScript前端开发JavaScript
    - + diff --git "a/tag/\345\267\245\345\205\267\347\275\221\347\253\231/index.html" "b/tag/\345\267\245\345\205\267\347\275\221\347\253\231/index.html" index 4feaa385d..8a216dd11 100644 --- "a/tag/\345\267\245\345\205\267\347\275\221\347\253\231/index.html" +++ "b/tag/\345\267\245\345\205\267\347\275\221\347\253\231/index.html" @@ -30,7 +30,7 @@ 标签: 工具网站 | Oragekk's Blog - + @@ -46,6 +46,6 @@

    工具类


    Oragekk...小于 1 分钟收藏工具网站
    - + diff --git "a/tag/\345\267\245\345\205\267\350\204\232\346\234\254/index.html" "b/tag/\345\267\245\345\205\267\350\204\232\346\234\254/index.html" index 091b1c765..9084411ba 100644 --- "a/tag/\345\267\245\345\205\267\350\204\232\346\234\254/index.html" +++ "b/tag/\345\267\245\345\205\267\350\204\232\346\234\254/index.html" @@ -30,7 +30,7 @@ 标签: 工具脚本 | Oragekk's Blog - + @@ -48,6 +48,6 @@
    Oragekk原创...大约 2 分钟python工具脚本
    - + diff --git "a/tag/\345\267\245\345\205\267\351\233\206/index.html" "b/tag/\345\267\245\345\205\267\351\233\206/index.html" index bd331ff99..6a2096fec 100644 --- "a/tag/\345\267\245\345\205\267\351\233\206/index.html" +++ "b/tag/\345\267\245\345\205\267\351\233\206/index.html" @@ -30,7 +30,7 @@ 标签: 工具集 | Oragekk's Blog - + @@ -74,6 +74,6 @@

    先切换 gem 源


    Oragekk...大约 1 分钟iOSiOS工具集
    - + diff --git "a/tag/\346\200\247\350\203\275\344\274\230\345\214\226/index.html" "b/tag/\346\200\247\350\203\275\344\274\230\345\214\226/index.html" index 183b96bee..7495e14fc 100644 --- "a/tag/\346\200\247\350\203\275\344\274\230\345\214\226/index.html" +++ "b/tag/\346\200\247\350\203\275\344\274\230\345\214\226/index.html" @@ -30,7 +30,7 @@ 标签: 性能优化 | Oragekk's Blog - + @@ -41,6 +41,6 @@

    有人问我为什么 tableView 滑动不流畅,甚至闪退,其实和 cell 中的圆角头像使用了 cornerRadius 有关


    Oragekk...大约 2 分钟iOSiOS性能优化
    - + diff --git "a/tag/\346\226\207\347\253\240\345\212\240\345\257\206/index.html" "b/tag/\346\226\207\347\253\240\345\212\240\345\257\206/index.html" index 2bb847a0c..46a220c15 100644 --- "a/tag/\346\226\207\347\253\240\345\212\240\345\257\206/index.html" +++ "b/tag/\346\226\207\347\253\240\345\212\240\345\257\206/index.html" @@ -30,13 +30,13 @@ 标签: 文章加密 | Oragekk's Blog - + - + diff --git "a/tag/\347\224\237\346\264\273/index.html" "b/tag/\347\224\237\346\264\273/index.html" index 4a47455bd..d2ac74a4c 100644 --- "a/tag/\347\224\237\346\264\273/index.html" +++ "b/tag/\347\224\237\346\264\273/index.html" @@ -30,7 +30,7 @@ 标签: 生活 | Oragekk's Blog - + @@ -49,6 +49,6 @@

    李清照

    才下眉头,却上心头。


    Oragekk...大约 2 分钟生活
    - + diff --git "a/tag/\347\246\201\347\224\250/index.html" "b/tag/\347\246\201\347\224\250/index.html" index 15f4e6495..8179f81b9 100644 --- "a/tag/\347\246\201\347\224\250/index.html" +++ "b/tag/\347\246\201\347\224\250/index.html" @@ -30,7 +30,7 @@ 标签: 禁用 | Oragekk's Blog - + @@ -38,6 +38,6 @@
    Oragekk...小于 1 分钟使用指南禁用
    - + diff --git "a/tag/\347\256\227\346\263\225/index.html" "b/tag/\347\256\227\346\263\225/index.html" index 8a68c1fd8..44683db23 100644 --- "a/tag/\347\256\227\346\263\225/index.html" +++ "b/tag/\347\256\227\346\263\225/index.html" @@ -30,7 +30,7 @@ 标签: 算法 | Oragekk's Blog - + @@ -41,6 +41,6 @@

    GACompressionPicHandle.h


    Oragekk...大约 2 分钟iOSiOS工具集算法
    - + diff --git "a/tag/\347\277\273\350\257\221/index.html" "b/tag/\347\277\273\350\257\221/index.html" index 156f3c65f..c57d4157e 100644 --- "a/tag/\347\277\273\350\257\221/index.html" +++ "b/tag/\347\277\273\350\257\221/index.html" @@ -30,7 +30,7 @@ 标签: 翻译 | Oragekk's Blog - + @@ -42,6 +42,6 @@

    Oragekk...大约 5 分钟JavaScriptJavaScript翻译
    - + diff --git "a/tag/\351\241\265\351\235\242\351\205\215\347\275\256/index.html" "b/tag/\351\241\265\351\235\242\351\205\215\347\275\256/index.html" index 4a08e6e6f..7ab5ec673 100644 --- "a/tag/\351\241\265\351\235\242\351\205\215\347\275\256/index.html" +++ "b/tag/\351\241\265\351\235\242\351\205\215\347\275\256/index.html" @@ -30,7 +30,7 @@ 标签: 页面配置 | Oragekk's Blog - + @@ -38,6 +38,6 @@
    Ms.Hope...大约 1 分钟使用指南页面配置使用指南
    - + diff --git a/timeline/index.html b/timeline/index.html index b55db4973..088cc297f 100644 --- a/timeline/index.html +++ b/timeline/index.html @@ -30,13 +30,13 @@ 时间轴 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/tutorial/CI_CD/Jenkins.html b/tutorial/CI_CD/Jenkins.html index fd5c550df..d4bcb9298 100644 --- a/tutorial/CI_CD/Jenkins.html +++ b/tutorial/CI_CD/Jenkins.html @@ -30,7 +30,7 @@ Jenkins 远程触发构建踩坑记 | Oragekk's Blog - + @@ -61,6 +61,6 @@ --header "Jenkins-Crumb: $CRUMB_VALUE"

    2. 通过 GitLab 的 webhook 触发远程构建

    使用 gitlab 的 webhook 配合 Jenkins 实现自动化部署。
    Jenkins 需要安装 GitLab Plugin 插件,然后配置 webhook 即可。

    2.1. 勾选插件选项

    勾选插件选项
    勾选插件选项

    2.2. 选择配置

    插件有很多配置项,这里我们常用的就是过滤分支,可以选择,有以下选项

    • Include
    • Exclude
    • 正则表达式
    • tag
    设置token
    设置token

    2.3. 将生成的 url 和 token 填入 GitLab 中

    可以选择触发的 events
    填入GitLab

    2.4. 查看运行结果

    查看运行结果
    查看运行结果
    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/tutorial/CI_CD/index.html b/tutorial/CI_CD/index.html index 2fbb553f3..cd7e3de2c 100644 --- a/tutorial/CI_CD/index.html +++ b/tutorial/CI_CD/index.html @@ -30,13 +30,13 @@ CI/CD | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/tutorial/CI_CD/vercel-deploy.html b/tutorial/CI_CD/vercel-deploy.html index 79e99b3ff..1e0ec4bb1 100644 --- a/tutorial/CI_CD/vercel-deploy.html +++ b/tutorial/CI_CD/vercel-deploy.html @@ -30,7 +30,7 @@ Vercel deploy忽略指定分支 | Oragekk's Blog - + @@ -64,6 +64,6 @@ fi

    一个示例 Ignored Build Step 命令,其中只允许部署从分支“main”和“staging”进行的提交。

    5. 使用文件夹和工作区

    在继续之前,请记住 Ignored Build Step 在您选择的“根目录”的同一文件夹中运行。因此,您可能需要稍微调整一下以适应您的需要。要构建仅考虑特定文件夹的新部署,您可以使用以下命令

    git diff HEAD^ HEAD --quiet ./packages/frontend/

    “忽略构建步骤”命令的示例。如果将更改提交给“./packages/frontend/”,该命令将产生一个非空响应,从而允许构建继续进行。
    通过使用此命令,Vercel 将仅在目录内进行更改时构建部署。如果该文件夹是您选择的“根目录”,则可以使用:packages/frontend/``./packages/frontend/

    git diff HEAD^ HEAD --quiet .

    “忽略的生成步骤”命令的示例。如果将更改提交到 “.”,则该命令将生成非空响应,从而允许继续生成。

    您还可以访问部署中的其他文件夹以检查更改。如果您在构建前端时选择了“根目录”,并且您的应用程序必须仅在进行更改时部署,您可以使用: packages/web ../../packages/docs

    git diff HEAD^ HEAD --quiet ../../packages/docs

    “忽略的生成步骤”命令的示例。如果将更改提交到“../../packages/docs“,该命令将产生一个非空响应,允许构建继续。

    6. 在本地调试命令

    要在本地调试忽略的构建步骤命令,首先使用可以复制 Vercel 上可用设置的文件夹非常重要。为此,您可以应用以下步骤:

    1. 使用 将存储库克隆到另一个文件夹。git clone --depth=10 (...)
    2. 在终端中运行命令或脚本。
    3. 您可以使用 检查最后一个命令返回的退出代码。echo $?

    7. 系统环境变量一览表

    名字描述
    VERCEL指示应用已在 Vercel 上部署和运行的指示器。 例:。1
    CI指示代码在持续集成环境中运行的指示器。 例:。 注意: 此变量仅在构建步骤期间公开。1
    VERCEL_ENV部署和运行应用的环境。该值可以是 、 或 。production``preview``development
    VERCEL_URL生成的部署 URL 的域名。例:。该值不包括协议方案。*.vercel.app``https://
    VERCEL_REGION运行应用的区域的 ID。 例:。 注意: 此变量仅在无服务器函数的运行时公开。cdg1
    VERCEL_GIT_PROVIDER从中触发部署的 Git 提供程序。 例:。github
    VERCEL_GIT_REPO_SLUG从中触发部署的源存储库。 例:。my-site
    VERCEL_GIT_REPO_OWNER拥有从中触发部署的存储库的帐户。 例:。acme
    VERCEL_GIT_REPO_ID从中触发部署的存储库的 ID。 例:。117716146
    VERCEL_GIT_COMMIT_REF触发部署的提交的 git 分支。 例:。improve-about-page
    VERCEL_GIT_COMMIT_SHA触发部署的提交的 git SHA。 例:。fa1eade47b73733d6312d5abfad33ce9e4068081
    VERCEL_GIT_COMMIT_MESSAGE附加到触发部署的提交的消息。 例:。Update about page
    VERCEL_GIT_COMMIT_AUTHOR_LOGIN附加到部署项目的提交作者的用户名。 例:。johndoe
    VERCEL_GIT_COMMIT_AUTHOR_NAME附加到部署项目的提交的作者的名称。 例:。John Doe
    VERCEL_GIT_PREVIOUS_SHA项目和分支的上次成功部署的 git SHA。 例:。 注意: 仅当提供了忽略的生成步骤时,才会公开此变量。fa1eade47b73733d6312d5abfad33ce9e4068080
    VERCEL_GIT_PULL_REQUEST_ID触发部署的拉取请求 ID。如果在发出拉取请求之前在分支上创建了部署,则此值将为空字符串。 例:。23
    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/tutorial/OSS/index.html b/tutorial/OSS/index.html index 9ff60f2c8..7d70f5cef 100644 --- a/tutorial/OSS/index.html +++ b/tutorial/OSS/index.html @@ -30,13 +30,13 @@ 开源项目 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/tutorial/OSS/meting2.html b/tutorial/OSS/meting2.html index bb74db363..d305c698b 100644 --- a/tutorial/OSS/meting2.html +++ b/tutorial/OSS/meting2.html @@ -30,7 +30,7 @@ vuepress-plugin-meting2 | Oragekk's Blog - + @@ -47,6 +47,6 @@ ];

    可作为组件引入

    也可作为全局播放器引入

    全局引入目前和看板娘有些重叠,还没有处理,先把开关关了

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/tutorial/github/github-action.html b/tutorial/github/github-action.html index cf5c5513d..9ad63d654 100644 --- a/tutorial/github/github-action.html +++ b/tutorial/github/github-action.html @@ -30,7 +30,7 @@ GitHub Actions 使用介绍 | Oragekk's Blog - + @@ -134,6 +134,6 @@ path: prev
  • 拉取main分支代码到路径main

  • 安装python环境并设置缓存

  • 安装python依赖库

  • 运行脚本读取配置在仓库-->Settings-->Secrets and variables-->Actions-->Repository secrets中的环境变量,并把上次提交的sitemap.xml和本次提交的sitemap.xml作为命令行参数提交给python脚本

    Repository secrets
    Repository secrets

    1. 可以使用 crontab guru 帮助生成 cron 语法并确认其运行时间。 为了帮助入门,还提供了 crontab guru 示例列表。计划工作流程的通知将发送给最后修改工作流程文件中的 cron 语法的用户。 有关详细信息,请参阅“工作流程运行通知”。 ↩︎

    2. 设置步骤的输出参数 ↩︎

    你认为这篇文章怎么样?
    • 0
    • 0
    • 0
    • 0
    • 0
    • 0
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v3.2.1
    - + diff --git a/tutorial/github/index.html b/tutorial/github/index.html index 3a2a864d4..dd5066158 100644 --- a/tutorial/github/index.html +++ b/tutorial/github/index.html @@ -30,13 +30,13 @@ GitHub | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/tutorial/github/ssh-key.html b/tutorial/github/ssh-key.html index 33598d95d..60f3dec74 100644 --- a/tutorial/github/ssh-key.html +++ b/tutorial/github/ssh-key.html @@ -30,13 +30,13 @@ Git SSH 密钥配置 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/tutorial/idx-dev.html b/tutorial/idx-dev.html index cad4bb3fa..a44270725 100644 --- a/tutorial/idx-dev.html +++ b/tutorial/idx-dev.html @@ -30,13 +30,13 @@ 谷歌发布多平台应用开发神器Project IDX!PaLM 2加持 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/tutorial/index.html b/tutorial/index.html index 8a6c14430..14bfe21de 100644 --- a/tutorial/index.html +++ b/tutorial/index.html @@ -30,13 +30,13 @@ 软件/工具教程 | Oragekk's Blog - +
    跳至主要內容
    - + diff --git a/visitorsbook.html b/visitorsbook.html index 3e9712d58..d814c1289 100644 --- a/visitorsbook.html +++ b/visitorsbook.html @@ -30,13 +30,13 @@ 留言板 ✨ | Oragekk's Blog - +
    跳至主要內容
    - +