[{"data":1,"prerenderedAt":4257},["ShallowReactive",2],{"navigation":3,"posts-undefined-博客-0-999":20},[4,8,12,16],{"title":5,"path":6,"stem":7},"首页","\u002F","00.index",{"title":9,"path":10,"stem":11},"文章","\u002Fposts","01.posts",{"title":13,"path":14,"stem":15},"动态","\u002Fmoments","02.moments",{"title":17,"path":18,"stem":19},"关于","\u002Fabout","09.about",[21,432,494,730,2812,2841,2879,3008,3423,3444,3634,3684,4148],{"id":22,"title":23,"body":24,"class":413,"cover":413,"coverSize":413,"date":414,"description":406,"draft":415,"extension":416,"hideComments":415,"location":413,"meta":417,"navigation":418,"path":419,"readingTime":420,"seo":425,"sitemap":426,"stem":427,"tags":428,"time":413,"weather":413,"__hash__":431},"posts\u002Fposts\u002F2024\u002F20240807.switch-blog-from-ghost-to-nuxt-content.md","博客从 Ghost 迁移至 Nuxt Content",{"type":25,"value":26,"toc":405},"minimark",[27,31,35,38,41,44,47,50,117,119,122,125,128,131,363,366,393],[28,29,30],"h3",{"id":30},"凌晨",[32,33,34],"p",{},"最近花了很多精力在迁移博客系统，从 Ghost 迁移至基于 Nuxt Content 自研的博客系统。",[32,36,37],{},"目前样式和功能基本搞好了，刚才也完成了 2012 年以来所有的文章的重新录入工作。",[32,39,40],{},"暂时先缓口气。明天看看能不能把评论数据迁移过来。然后就可以考虑把域名切过来了。",[42,43],"hr",{},[28,45,46],{"id":46},"下午",[32,48,49],{},"目前存在的一些暂时无法解决的问题：",[51,52,53,77,95],"ol",{},[54,55,56,57,64,65,70,71,76],"li",{},"Feed 订阅目前 Nuxt 官方插件 ",[58,59,63],"a",{"href":60,"rel":61},"https:\u002F\u002Fnuxt.com\u002Fmodules\u002Ffeed",[62],"nofollow","@nuxtjs\u002Ffeed"," 暂未支持 Nuxt 3，可参见这个 issue：",[58,66,69],{"href":67,"rel":68},"https:\u002F\u002Fgithub.com\u002Fnuxt-community\u002Ffeed-module\u002Fissues\u002F106",[62],"Nuxt 3 Support","，有几个大佬做过尝试，经历了非常漫长的过程，但最终都没完成。我大致看了下历史，目前主要卡点还是 content 目前没有提供在服务端生成 html 的方法，没办法生成 feed 的全文内容。所以目前自己接 ",[58,72,75],{"href":73,"rel":74},"https:\u002F\u002Fgithub.com\u002Fjpmonette\u002Ffeed",[62],"feed"," 库去实现也只能显示摘要，无法生成全文，这个问题暂时没有找到更好的解决方案。",[54,78,79,80,84,85,90,91,94],{},"CloudFlare Pages 部署的时候，worker bundle 体积太大，导致部署失败，主要原因是 ",[81,82,83],"code",{},"Shiki"," 体积太大，参考 issue：",[58,86,89],{"href":87,"rel":88},"https:\u002F\u002Fgithub.com\u002Fnuxt\u002Fcontent\u002Fissues\u002F2422",[62],"This module add more than 2.5MB to the output","。目前解法是用 ",[81,92,93],{},"pnpm generate"," 部署纯静态模式。",[54,96,97,98,101,102,105,106,109,110,101,113,116],{},"纯静态模式部署有个问题，是当我的文章 tag 带了特殊符号的时候，比如 ",[81,99,100],{},"C#","、",[81,103,104],{},"CI\u002FCD"," 这样的 tag，在路由上通过 ",[81,107,108],{},"encodeURIComponent"," 处理后，prerender 出来的文件名会变成 ",[81,111,112],{},"C%23",[81,114,115],{},"CI%2FCI","，这样的文件名在 CloudFlare Pages 上会导致 404。目前通过自己限制标签不带特殊符号来解决。",[42,118],{},[28,120,121],{"id":121},"晚上",[32,123,124],{},"评论数据已经迁移过来了；准备把历史的 PV 数据也迁移过来，不过之前没有页面 PV 的计数器，只能从 Google Analytics 上导出数据，不过只有去年 4 月份迁移了 GA4 的数据，之前的数据都没了。以前也没怎么在意这些数据，不过现在回顾的时候发现没有了这些数据还是挺可惜的。",[32,126,127],{},"拉了从 23 年 4 月至今的 GA4 的数据，分析了下，还挺有意思：",[32,129,130],{},"浏览量排名前十的文章：",[132,133,134],"scrollable-table",{},[135,136,137,159],"table",{},[138,139,140],"thead",{},[141,142,143,147,150,153,156],"tr",{},[144,145,146],"th",{},"页面",[144,148,149],{},"PV",[144,151,152],{},"UV",[144,154,155],{},"平均浏览次数",[144,157,158],{},"平均互动时长",[160,161,162,183,203,223,243,263,283,303,323,343],"tbody",{},[141,163,164,171,174,177,180],{},[165,166,167],"td",{},[58,168,170],{"href":169},"..\u002F2021\u002Ffastboot-failed-remote-operation-not-permitted","fastboot FAILED (remote: Operation not permitted) 的问题",[165,172,173],{},"1140",[165,175,176],{},"857",[165,178,179],{},"1.330221704",[165,181,182],{},"20.03967328",[141,184,185,191,194,197,200],{},[165,186,187],{},[58,188,190],{"href":189},"..\u002F2016\u002Fbad-request-invalid-hostname","“Bad Request - Invalid Hostname”的解决办法",[165,192,193],{},"787",[165,195,196],{},"729",[165,198,199],{},"1.079561043",[165,201,202],{},"17.31550069",[141,204,205,211,214,217,220],{},[165,206,207],{},[58,208,210],{"href":209},"..\u002F2021\u002Fsynology-letsencrypt-multiple-domain-cert-configuration","群晖 Let's Encrypt 配置多个泛域名 SSL 证书自动更新",[165,212,213],{},"667",[165,215,216],{},"485",[165,218,219],{},"1.375257732",[165,221,222],{},"30.11958763",[141,224,225,231,234,237,240],{},[165,226,227],{},[58,228,230],{"href":229},"..\u002F2020\u002Fk8s-cert-manager-tls","k8s 上利用 cert-manager 自动签发 TLS 证书",[165,232,233],{},"429",[165,235,236],{},"376",[165,238,239],{},"1.140957447",[165,241,242],{},"21.03191489",[141,244,245,251,254,257,260],{},[165,246,247],{},[58,248,250],{"href":249},"..\u002F2019\u002Fsolve-pycharm-adding-pipenv-error","解决 PyCharm 设置 pipenv 报错的问题",[165,252,253],{},"367",[165,255,256],{},"327",[165,258,259],{},"1.122324159",[165,261,262],{},"23.82568807",[141,264,265,271,274,277,280],{},[165,266,267],{},[58,268,270],{"href":269},"..\u002F2015\u002Fchange-domain-in-weixin","微信公众号中更换域名",[165,272,273],{},"324",[165,275,276],{},"303",[165,278,279],{},"1.069306931",[165,281,282],{},"12.46534653",[141,284,285,291,294,297,300],{},[165,286,287],{},[58,288,290],{"href":289},"..\u002F2020\u002Fandroid-webview-picture-cache","安卓 WebView 图片离线缓存方案",[165,292,293],{},"300",[165,295,296],{},"247",[165,298,299],{},"1.214574899",[165,301,302],{},"22.47773279",[141,304,305,311,314,317,320],{},[165,306,307],{},[58,308,310],{"href":309},"..\u002F2016\u002Faliyun-cdn-not-support-sni","解决阿里云 CDN 回源 https 返回 503 错误的问题",[165,312,313],{},"271",[165,315,316],{},"253",[165,318,319],{},"1.071146245",[165,321,322],{},"16.31620553",[141,324,325,331,334,337,340],{},[165,326,327],{},[58,328,330],{"href":329},"..\u002F2020\u002Fbatch-edit-acl-for-oss","批量修改阿里云 OSS 的 ACL 权限",[165,332,333],{},"240",[165,335,336],{},"173",[165,338,339],{},"1.387283237",[165,341,342],{},"13.13872832",[141,344,345,351,354,357,360],{},[165,346,347],{},[58,348,350],{"href":349},"..\u002F2019\u002Fcentos-wire-ieee8021x-config","CentOS 有线网卡配置 IEEE 802.1X 上网",[165,352,353],{},"224",[165,355,356],{},"152",[165,358,359],{},"1.473684211",[165,361,362],{},"41.42763158",[32,364,365],{},"其中排名第一的这篇文章还包含了多种语言的标题数据，应该是通过网页翻译之后的结果，看来还帮助到了一些国际友人：",[367,368,369,372,375,378,381,384,387,390],"ul",{},[54,370,371],{},"Problema fastboot FAILED (remoto: operación no permitida)",[54,373,374],{},"fastboot FAILED (remote: Operation not permitted) problem",[54,376,377],{},"fastboot FAILED (remote: Operation not permitted) 的問題",[54,379,380],{},"fastboot FAILED (remoto: operación no permitida) problema",[54,382,383],{},"fastboot FAILED (удаленный: операция не разрешена) проблема",[54,385,386],{},"fastboot FAILED(원격: 작업이 허용되지 않음) 문제",[54,388,389],{},"problem fastboot FAILED (zdalny: operacja niedozwolona).",[54,391,392],{},"problème de fastboot FAILED (à distance: opération non autorisée)",[32,394,395,396,400,401,404],{},"另外一个数据是，平均互动时长最长的一篇文章是：",[58,397,399],{"href":398},"..\u002F2023\u002Fshanghai-luohu","上海居转户落户完整经历","，达到了 ",[81,402,403],{},"105.8"," 秒，平均每个人看了约 2 分钟。",{"title":406,"searchDepth":407,"depth":407,"links":408},"",2,[409,411,412],{"id":30,"depth":410,"text":30},3,{"id":46,"depth":410,"text":46},{"id":121,"depth":410,"text":121},null,"2024-08-07",false,"md",{},true,"\u002Fposts\u002F2024\u002Fswitch-blog-from-ghost-to-nuxt-content",{"text":421,"minutes":422,"time":423,"words":424},"5 min read",4.205,252300,841,{"title":23,"description":406},{"loc":419},"posts\u002F2024\u002F20240807.switch-blog-from-ghost-to-nuxt-content",[429,430],"博客","日记","pyShL5aFSXeSGkOLECuC5_aLr9we3luUysibO7tAV1w",{"id":433,"title":434,"body":435,"class":413,"cover":413,"coverSize":413,"date":479,"description":439,"draft":415,"extension":416,"hideComments":415,"location":413,"meta":480,"navigation":418,"path":481,"readingTime":482,"seo":487,"sitemap":488,"stem":489,"tags":490,"time":413,"weather":413,"__hash__":493},"posts\u002Fposts\u002F2023\u002F20230518.use-cloudflare-speed-up-overseas-traffic.md","使用 Cloudflare 加速博客海外访问速度",{"type":25,"value":436,"toc":477},[437,440,443,446,449,452,457,460,474],[32,438,439],{},"这几天对 hadb.me 博客又做了一次迁移和优化。",[32,441,442],{},"原先 hadb.me 是直接部署在阿里云的 k8s 上的，但为了统一博客的数据备份，决定迁移到 HomeLab ，数据存到 NAS 上，容器部署到 NUC 的 docker 中。这样数据可以跟着整个 NAS 的备份策略一起。所以这次架构调整的主要目的是为了方便博客数据的统一备份。",[32,444,445],{},"但是由于 HomeLab 无法直接暴露 443 端口，所以域名不能直接解析到家里的 IP。",[32,447,448],{},"一开始尝试了下直接接入 Cloudflare，发现境外访问速度很快，但境内直接访问的话，速度堪忧。于是研究了一下，最终根据访问者的位置使用不同的解析方式实现境内外的同时加速的目标。",[32,450,451],{},"最终的架构是这样：",[453,454],"post-image",{"description":455,"filename":456},"hadb.me 博客网络架构","01.png",[32,458,459],{},"在境内，直接解析到阿里云的 SLB 上，阿里云上我是有一套 k8s 集群，里面起了个 nginx 容器，反向代理到 HomeLab 的非标端口上，HomeLab 的域名解析通过阿里云解析的 API 动态更新。",[32,461,462,463,466,467,469,470,473],{},"在境外，通过 CNAME 解析到 Cloudflare 上绑定一个其他域名 ",[81,464,465],{},"xxx.com","，这个域名通过 Cloudflare 的 API 会动态更新解析到 HomeLab 的外网 IP 上。在这个域名的 Origin Rules 里面设置主机名为 ",[81,468,465],{}," 和 ",[81,471,472],{},"hadb.me"," 的时候都重写端口到 HomeLab 的非标端口上。",[32,475,476],{},"至此，完成架构迁移。既满足了备份需求，海外访问速度上也有提升。",{"title":406,"searchDepth":407,"depth":407,"links":478},[],"2023-05-18",{},"\u002Fposts\u002F2023\u002Fuse-cloudflare-speed-up-overseas-traffic",{"text":483,"minutes":484,"time":485,"words":486},"2 min read",1.95,117000,390,{"title":434,"description":439},{"loc":481},"posts\u002F2023\u002F20230518.use-cloudflare-speed-up-overseas-traffic",[491,429,492],"技术","DevOps","ACtCrCQ6aSo6KIRwPlOKjc7i5Yh2L3RAT_a91uJ9FWo",{"id":495,"title":496,"body":497,"class":413,"cover":716,"coverSize":413,"date":717,"description":501,"draft":415,"extension":416,"hideComments":415,"location":413,"meta":718,"navigation":418,"path":719,"readingTime":720,"seo":724,"sitemap":725,"stem":726,"tags":727,"time":413,"weather":413,"__hash__":729},"posts\u002Fposts\u002F2023\u002F20230408.upgrade-ghost-5-0-to-5-42.md","Ghost 5.0 升级到 5.42",{"type":25,"value":498,"toc":714},[499,502,664,672,675,704,707,710],[32,500,501],{},"距离上次升级 Ghost 已经过去快 1 年了，上次是 Ghost 5.0 刚发布的时候升级的，这次直接把容器镜像版本改为最新的 5.42 时，报了个错：",[503,504,508],"pre",{"className":505,"code":506,"language":507,"meta":406,"style":406},"language-log shiki shiki-themes material-theme-lighter github-light github-dark","ERROR connect ECONNREFUSED 127.0.0.1:3306\nconnect ECONNREFUSED 127.0.0.1:3306\n\n\"Unknown database error\"\n\nError ID:\n500\n\nError Code:\nECONNREFUSED\n\nError: connect ECONNREFUSED 127.0.0.1:3306\nat \u002Fvar\u002Flib\u002Fghost\u002Fversions\u002F5.42.0\u002Fnode_modules\u002Fknex-migrator\u002Flib\u002Fdatabase.js:57:19\nat TCPConnectWrap.afterConnect [as oncomplete] (node:net:1278:16)\n","log",[81,509,510,548,571,576,582,587,596,602,607,615,621,626,652,658],{"__ignoreMap":406},[511,512,515,519,523,527,530,533,535,537,539,542,545],"span",{"class":513,"line":514},"line",1,[511,516,518],{"class":517},"s_sjI","ERROR",[511,520,522],{"class":521},"su5hD"," connect ECONNREFUSED ",[511,524,526],{"class":525},"s39Yj","127",[511,528,529],{"class":521},".",[511,531,532],{"class":525},"0",[511,534,529],{"class":521},[511,536,532],{"class":525},[511,538,529],{"class":521},[511,540,541],{"class":525},"1",[511,543,544],{"class":521},":",[511,546,547],{"class":525},"3306\n",[511,549,550,553,555,557,559,561,563,565,567,569],{"class":513,"line":407},[511,551,552],{"class":521},"connect ECONNREFUSED ",[511,554,526],{"class":525},[511,556,529],{"class":521},[511,558,532],{"class":525},[511,560,529],{"class":521},[511,562,532],{"class":525},[511,564,529],{"class":521},[511,566,541],{"class":525},[511,568,544],{"class":521},[511,570,547],{"class":525},[511,572,573],{"class":513,"line":410},[511,574,575],{"emptyLinePlaceholder":418},"\n",[511,577,579],{"class":513,"line":578},4,[511,580,581],{"class":517},"\"Unknown database error\"\n",[511,583,585],{"class":513,"line":584},5,[511,586,575],{"emptyLinePlaceholder":418},[511,588,590,593],{"class":513,"line":589},6,[511,591,592],{"class":517},"Error",[511,594,595],{"class":521}," ID:\n",[511,597,599],{"class":513,"line":598},7,[511,600,601],{"class":525},"500\n",[511,603,605],{"class":513,"line":604},8,[511,606,575],{"emptyLinePlaceholder":418},[511,608,610,612],{"class":513,"line":609},9,[511,611,592],{"class":517},[511,613,614],{"class":521}," Code:\n",[511,616,618],{"class":513,"line":617},10,[511,619,620],{"class":521},"ECONNREFUSED\n",[511,622,624],{"class":513,"line":623},11,[511,625,575],{"emptyLinePlaceholder":418},[511,627,629,631,634,636,638,640,642,644,646,648,650],{"class":513,"line":628},12,[511,630,592],{"class":517},[511,632,633],{"class":521},": connect ECONNREFUSED ",[511,635,526],{"class":525},[511,637,529],{"class":521},[511,639,532],{"class":525},[511,641,529],{"class":521},[511,643,532],{"class":525},[511,645,529],{"class":521},[511,647,541],{"class":525},[511,649,544],{"class":521},[511,651,547],{"class":525},[511,653,655],{"class":513,"line":654},13,[511,656,657],{"class":517},"at \u002Fvar\u002Flib\u002Fghost\u002Fversions\u002F5.42.0\u002Fnode_modules\u002Fknex-migrator\u002Flib\u002Fdatabase.js:57:19\n",[511,659,661],{"class":513,"line":660},14,[511,662,663],{"class":517},"at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1278:16)\n",[32,665,666,667],{},"重试了几次都不行，在 Ghost 的文档中找了半天也没发现从 5.0 升级到 5.42 中间有什么 breaking changes。最后从 Ghost 的 Docker 镜像维护仓库找到了相关的 Issue：",[58,668,671],{"href":669,"rel":670},"https:\u002F\u002Fgithub.com\u002Fdocker-library\u002Fghost\u002Fpull\u002F323",[62],"#323",[32,673,674],{},"大致原因主要是这样，Ghost 5.0 之后其实是有个 breaking change，就是原先数据库是支持 SQLite3 和 MySQL 5 的，在 5.0 之后，数据库只支持 MySQL 8 了，但是 SQLite3 在开发环境还是支持的。对应的 Docker 镜像，在 5.9 之前，都还是可以继续用之前的 SQLite3 的，但是在 5.9 这个版本中，Docker 镜像将默认数据库改为了 MySQL 8，这就导致从低版本升到高于 5.9 版本的镜像之后，数据库会直接找不到。在这个 PR 中，其实给出了一个临时的解决方案，就是在环境变量中加两个变量，就可以继续使用 SQLite3，这两个变量是：",[503,676,680],{"className":677,"code":678,"language":679,"meta":406,"style":406},"language-yaml shiki shiki-themes material-theme-lighter github-light github-dark","database__client: sqlite3\ndatabase__connection__filename: \u002Fvar\u002Flib\u002Fghost\u002Fcontent\u002Fdata\u002Fghost.db\n","yaml",[81,681,682,694],{"__ignoreMap":406},[511,683,684,688,691],{"class":513,"line":514},[511,685,687],{"class":686},"sQzsp","database__client",[511,689,544],{"class":690},"sP7_E",[511,692,693],{"class":517}," sqlite3\n",[511,695,696,699,701],{"class":513,"line":407},[511,697,698],{"class":686},"database__connection__filename",[511,700,544],{"class":690},[511,702,703],{"class":517}," \u002Fvar\u002Flib\u002Fghost\u002Fcontent\u002Fdata\u002Fghost.db\n",[32,705,706],{},"添加完之后，容器可以正常升级了。",[32,708,709],{},"但，既然官方已经将数据库支持重点改为了 MySQL 8，不怕麻烦的话，也可以升级下数据库。原本准备写个 MySQL 8 的升级教程的，想想不折腾了，我的博客用轻量的 SQLite3 就够了。",[711,712,713],"style",{},"html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":406,"searchDepth":407,"depth":407,"links":715},[],"jpg","2023-04-08",{},"\u002Fposts\u002F2023\u002Fupgrade-ghost-5-0-to-5-42",{"text":483,"minutes":721,"time":722,"words":723},1.995,119700,399,{"title":496,"description":501},{"loc":719},"posts\u002F2023\u002F20230408.upgrade-ghost-5-0-to-5-42",[491,429,728],"Ghost","jTG5prR9EJe76ga8Usd6FU3xLZllrEAUvtzpDIDc-io",{"id":731,"title":732,"body":733,"class":413,"cover":716,"coverSize":413,"date":2799,"description":406,"draft":415,"extension":416,"hideComments":415,"location":413,"meta":2800,"navigation":418,"path":2801,"readingTime":2802,"seo":2807,"sitemap":2808,"stem":2809,"tags":2810,"time":413,"weather":413,"__hash__":2811},"posts\u002Fposts\u002F2022\u002F20220524.use-gitlab-to-deploy-ghost-theme-automatically.md","使用 GitLab CI 自动部署 Ghost 主题",{"type":25,"value":734,"toc":2797},[735,741,744,753,1525,1535,1544,1546,1556,1559,1562,1585,1592,2538,2543,2649,2656,2777,2791,2794],[736,737,738],"blockquote",{},[32,739,740],{},"居家隔离的第 N 天",[32,742,743],{},"今天收到了 Ghost 5.0 发布的邮件，第一时间更新了下，发现主题里有些功能已经不兼容了，于是准备对主题做下更新。在看 Ghost Integrations 的时候发现有个 GitHub 的插件特别好用，支持通过 GitHub Actions 自动部署你的主题。但是我自己的项目用的都是 GitLab，找了一圈，没有官方的插件。于是尝试自己通过 GitLab CI 来实现。",[32,745,746,747,752],{},"大致看了下基于 GitHub Actions 自动部署的实现方式，通过官方提供的一个 ",[58,748,751],{"href":749,"rel":750},"https:\u002F\u002Fgithub.com\u002FTryGhost\u002Faction-deploy-theme\u002Fblob\u002Fmain\u002Findex.js",[62],"TryGhost\u002Faction-deploy-theme"," 的步骤，代码很简单，总共 40 行，我们来看下它做了什么：",[503,754,758],{"className":755,"code":756,"language":757,"meta":406,"style":406},"language-javascript shiki shiki-themes material-theme-lighter github-light github-dark","const path = require('node:path')\nconst core = require('@actions\u002Fcore')\nconst exec = require('@actions\u002Fexec')\nconst GhostAdminApi = require('@tryghost\u002Fadmin-api');\n\n(async function main() {\n  try {\n    const url = core.getInput('api-url')\n    const api = new GhostAdminApi({\n      url,\n      key: core.getInput('api-key'),\n      version: 'canary'\n    })\n\n    const basePath = process.env.GITHUB_WORKSPACE\n    const pkgPath = path.join(process.env.GITHUB_WORKSPACE, 'package.json')\n\n    let zipPath = core.getInput('file')\n\n    \u002F\u002F Zip file was not provided - zip everything up!\n    if (!zipPath) {\n      const themeName = core.getInput('theme-name') || require(pkgPath).name\n      const themeZip = `${themeName}.zip`\n      const exclude = core.getInput('exclude') || ''\n      zipPath = themeZip\n\n      \u002F\u002F Create a zip\n      await exec.exec(`zip -r ${themeZip} ${core.getInput('working-directory') || '.'} -x *.git* *.zip yarn* npm* node_modules* *routes.yaml *redirects.yaml *redirects.json ${exclude}`, [], { cwd: basePath })\n    }\n\n    zipPath = path.join(basePath, zipPath)\n\n    \u002F\u002F Deploy it to the configured site\n    await api.themes.upload({ file: zipPath })\n    console.log(`${zipPath} successfully uploaded.`)\n  }\n  catch (err) {\n    console.error(err)\n    process.exit(1)\n  }\n}())\n","javascript",[81,759,760,793,815,837,863,867,886,894,923,942,950,976,992,999,1003,1026,1069,1074,1102,1107,1114,1134,1179,1204,1236,1247,1252,1258,1350,1356,1361,1386,1391,1397,1431,1457,1463,1478,1494,1512,1517],{"__ignoreMap":406},[511,761,762,766,770,774,778,781,785,788,790],{"class":513,"line":514},[511,763,765],{"class":764},"sbsja","const",[511,767,769],{"class":768},"s_hVV"," path",[511,771,773],{"class":772},"smGrS"," =",[511,775,777],{"class":776},"sGLFI"," require",[511,779,780],{"class":521},"(",[511,782,784],{"class":783},"sjJ54","'",[511,786,787],{"class":517},"node:path",[511,789,784],{"class":783},[511,791,792],{"class":521},")\n",[511,794,795,797,800,802,804,806,808,811,813],{"class":513,"line":407},[511,796,765],{"class":764},[511,798,799],{"class":768}," core",[511,801,773],{"class":772},[511,803,777],{"class":776},[511,805,780],{"class":521},[511,807,784],{"class":783},[511,809,810],{"class":517},"@actions\u002Fcore",[511,812,784],{"class":783},[511,814,792],{"class":521},[511,816,817,819,822,824,826,828,830,833,835],{"class":513,"line":410},[511,818,765],{"class":764},[511,820,821],{"class":768}," exec",[511,823,773],{"class":772},[511,825,777],{"class":776},[511,827,780],{"class":521},[511,829,784],{"class":783},[511,831,832],{"class":517},"@actions\u002Fexec",[511,834,784],{"class":783},[511,836,792],{"class":521},[511,838,839,841,844,846,848,850,852,855,857,860],{"class":513,"line":578},[511,840,765],{"class":764},[511,842,843],{"class":768}," GhostAdminApi",[511,845,773],{"class":772},[511,847,777],{"class":776},[511,849,780],{"class":521},[511,851,784],{"class":783},[511,853,854],{"class":517},"@tryghost\u002Fadmin-api",[511,856,784],{"class":783},[511,858,859],{"class":521},")",[511,861,862],{"class":690},";\n",[511,864,865],{"class":513,"line":584},[511,866,575],{"emptyLinePlaceholder":418},[511,868,869,871,874,877,880,883],{"class":513,"line":589},[511,870,780],{"class":521},[511,872,873],{"class":764},"async",[511,875,876],{"class":764}," function",[511,878,879],{"class":776}," main",[511,881,882],{"class":690},"()",[511,884,885],{"class":690}," {\n",[511,887,888,892],{"class":513,"line":598},[511,889,891],{"class":890},"sVHd0","  try",[511,893,885],{"class":690},[511,895,896,899,902,904,906,908,911,914,916,919,921],{"class":513,"line":604},[511,897,898],{"class":764},"    const",[511,900,901],{"class":768}," url",[511,903,773],{"class":772},[511,905,799],{"class":521},[511,907,529],{"class":690},[511,909,910],{"class":776},"getInput",[511,912,780],{"class":913},"skxfh",[511,915,784],{"class":783},[511,917,918],{"class":517},"api-url",[511,920,784],{"class":783},[511,922,792],{"class":913},[511,924,925,927,930,932,935,937,939],{"class":513,"line":609},[511,926,898],{"class":764},[511,928,929],{"class":768}," api",[511,931,773],{"class":772},[511,933,934],{"class":772}," new",[511,936,843],{"class":776},[511,938,780],{"class":913},[511,940,941],{"class":690},"{\n",[511,943,944,947],{"class":513,"line":617},[511,945,946],{"class":521},"      url",[511,948,949],{"class":690},",\n",[511,951,952,955,957,959,961,963,965,967,970,972,974],{"class":513,"line":623},[511,953,954],{"class":913},"      key",[511,956,544],{"class":690},[511,958,799],{"class":521},[511,960,529],{"class":690},[511,962,910],{"class":776},[511,964,780],{"class":913},[511,966,784],{"class":783},[511,968,969],{"class":517},"api-key",[511,971,784],{"class":783},[511,973,859],{"class":913},[511,975,949],{"class":690},[511,977,978,981,983,986,989],{"class":513,"line":628},[511,979,980],{"class":913},"      version",[511,982,544],{"class":690},[511,984,985],{"class":783}," '",[511,987,988],{"class":517},"canary",[511,990,991],{"class":783},"'\n",[511,993,994,997],{"class":513,"line":654},[511,995,996],{"class":690},"    }",[511,998,792],{"class":913},[511,1000,1001],{"class":513,"line":660},[511,1002,575],{"emptyLinePlaceholder":418},[511,1004,1006,1008,1011,1013,1016,1018,1021,1023],{"class":513,"line":1005},15,[511,1007,898],{"class":764},[511,1009,1010],{"class":768}," basePath",[511,1012,773],{"class":772},[511,1014,1015],{"class":521}," process",[511,1017,529],{"class":690},[511,1019,1020],{"class":521},"env",[511,1022,529],{"class":690},[511,1024,1025],{"class":768},"GITHUB_WORKSPACE\n",[511,1027,1029,1031,1034,1036,1038,1040,1043,1045,1048,1050,1052,1054,1057,1060,1062,1065,1067],{"class":513,"line":1028},16,[511,1030,898],{"class":764},[511,1032,1033],{"class":768}," pkgPath",[511,1035,773],{"class":772},[511,1037,769],{"class":521},[511,1039,529],{"class":690},[511,1041,1042],{"class":776},"join",[511,1044,780],{"class":913},[511,1046,1047],{"class":521},"process",[511,1049,529],{"class":690},[511,1051,1020],{"class":521},[511,1053,529],{"class":690},[511,1055,1056],{"class":768},"GITHUB_WORKSPACE",[511,1058,1059],{"class":690},",",[511,1061,985],{"class":783},[511,1063,1064],{"class":517},"package.json",[511,1066,784],{"class":783},[511,1068,792],{"class":913},[511,1070,1072],{"class":513,"line":1071},17,[511,1073,575],{"emptyLinePlaceholder":418},[511,1075,1077,1080,1083,1085,1087,1089,1091,1093,1095,1098,1100],{"class":513,"line":1076},18,[511,1078,1079],{"class":764},"    let",[511,1081,1082],{"class":521}," zipPath",[511,1084,773],{"class":772},[511,1086,799],{"class":521},[511,1088,529],{"class":690},[511,1090,910],{"class":776},[511,1092,780],{"class":913},[511,1094,784],{"class":783},[511,1096,1097],{"class":517},"file",[511,1099,784],{"class":783},[511,1101,792],{"class":913},[511,1103,1105],{"class":513,"line":1104},19,[511,1106,575],{"emptyLinePlaceholder":418},[511,1108,1110],{"class":513,"line":1109},20,[511,1111,1113],{"class":1112},"sutJx","    \u002F\u002F Zip file was not provided - zip everything up!\n",[511,1115,1117,1120,1123,1126,1129,1132],{"class":513,"line":1116},21,[511,1118,1119],{"class":890},"    if",[511,1121,1122],{"class":913}," (",[511,1124,1125],{"class":772},"!",[511,1127,1128],{"class":521},"zipPath",[511,1130,1131],{"class":913},") ",[511,1133,941],{"class":690},[511,1135,1137,1140,1143,1145,1147,1149,1151,1153,1155,1158,1160,1162,1165,1167,1169,1172,1174,1176],{"class":513,"line":1136},22,[511,1138,1139],{"class":764},"      const",[511,1141,1142],{"class":768}," themeName",[511,1144,773],{"class":772},[511,1146,799],{"class":521},[511,1148,529],{"class":690},[511,1150,910],{"class":776},[511,1152,780],{"class":913},[511,1154,784],{"class":783},[511,1156,1157],{"class":517},"theme-name",[511,1159,784],{"class":783},[511,1161,1131],{"class":913},[511,1163,1164],{"class":772},"||",[511,1166,777],{"class":776},[511,1168,780],{"class":913},[511,1170,1171],{"class":521},"pkgPath",[511,1173,859],{"class":913},[511,1175,529],{"class":690},[511,1177,1178],{"class":521},"name\n",[511,1180,1182,1184,1187,1189,1192,1195,1198,1201],{"class":513,"line":1181},23,[511,1183,1139],{"class":764},[511,1185,1186],{"class":768}," themeZip",[511,1188,773],{"class":772},[511,1190,1191],{"class":783}," `${",[511,1193,1194],{"class":521},"themeName",[511,1196,1197],{"class":783},"}",[511,1199,1200],{"class":517},".zip",[511,1202,1203],{"class":783},"`\n",[511,1205,1207,1209,1212,1214,1216,1218,1220,1222,1224,1227,1229,1231,1233],{"class":513,"line":1206},24,[511,1208,1139],{"class":764},[511,1210,1211],{"class":768}," exclude",[511,1213,773],{"class":772},[511,1215,799],{"class":521},[511,1217,529],{"class":690},[511,1219,910],{"class":776},[511,1221,780],{"class":913},[511,1223,784],{"class":783},[511,1225,1226],{"class":517},"exclude",[511,1228,784],{"class":783},[511,1230,1131],{"class":913},[511,1232,1164],{"class":772},[511,1234,1235],{"class":783}," ''\n",[511,1237,1239,1242,1244],{"class":513,"line":1238},25,[511,1240,1241],{"class":521},"      zipPath",[511,1243,773],{"class":772},[511,1245,1246],{"class":521}," themeZip\n",[511,1248,1250],{"class":513,"line":1249},26,[511,1251,575],{"emptyLinePlaceholder":418},[511,1253,1255],{"class":513,"line":1254},27,[511,1256,1257],{"class":1112},"      \u002F\u002F Create a zip\n",[511,1259,1261,1264,1266,1268,1271,1273,1276,1279,1282,1285,1287,1290,1293,1295,1297,1300,1302,1305,1307,1309,1311,1313,1315,1318,1321,1323,1325,1328,1330,1333,1335,1338,1341,1343,1345,1348],{"class":513,"line":1260},28,[511,1262,1263],{"class":890},"      await",[511,1265,821],{"class":521},[511,1267,529],{"class":690},[511,1269,1270],{"class":776},"exec",[511,1272,780],{"class":913},[511,1274,1275],{"class":783},"`",[511,1277,1278],{"class":517},"zip -r ",[511,1280,1281],{"class":783},"${",[511,1283,1284],{"class":521},"themeZip",[511,1286,1197],{"class":783},[511,1288,1289],{"class":783}," ${",[511,1291,1292],{"class":521},"core",[511,1294,529],{"class":783},[511,1296,910],{"class":776},[511,1298,780],{"class":1299},"sfo-9",[511,1301,784],{"class":783},[511,1303,1304],{"class":517},"working-directory",[511,1306,784],{"class":783},[511,1308,1131],{"class":1299},[511,1310,1164],{"class":772},[511,1312,985],{"class":783},[511,1314,529],{"class":517},[511,1316,1317],{"class":783},"'}",[511,1319,1320],{"class":517}," -x *.git* *.zip yarn* npm* node_modules* *routes.yaml *redirects.yaml *redirects.json ",[511,1322,1281],{"class":783},[511,1324,1226],{"class":521},[511,1326,1327],{"class":783},"}`",[511,1329,1059],{"class":690},[511,1331,1332],{"class":913}," []",[511,1334,1059],{"class":690},[511,1336,1337],{"class":690}," {",[511,1339,1340],{"class":913}," cwd",[511,1342,544],{"class":690},[511,1344,1010],{"class":521},[511,1346,1347],{"class":690}," }",[511,1349,792],{"class":913},[511,1351,1353],{"class":513,"line":1352},29,[511,1354,1355],{"class":690},"    }\n",[511,1357,1359],{"class":513,"line":1358},30,[511,1360,575],{"emptyLinePlaceholder":418},[511,1362,1364,1367,1369,1371,1373,1375,1377,1380,1382,1384],{"class":513,"line":1363},31,[511,1365,1366],{"class":521},"    zipPath",[511,1368,773],{"class":772},[511,1370,769],{"class":521},[511,1372,529],{"class":690},[511,1374,1042],{"class":776},[511,1376,780],{"class":913},[511,1378,1379],{"class":521},"basePath",[511,1381,1059],{"class":690},[511,1383,1082],{"class":521},[511,1385,792],{"class":913},[511,1387,1389],{"class":513,"line":1388},32,[511,1390,575],{"emptyLinePlaceholder":418},[511,1392,1394],{"class":513,"line":1393},33,[511,1395,1396],{"class":1112},"    \u002F\u002F Deploy it to the configured site\n",[511,1398,1400,1403,1405,1407,1410,1412,1415,1417,1420,1423,1425,1427,1429],{"class":513,"line":1399},34,[511,1401,1402],{"class":890},"    await",[511,1404,929],{"class":521},[511,1406,529],{"class":690},[511,1408,1409],{"class":521},"themes",[511,1411,529],{"class":690},[511,1413,1414],{"class":776},"upload",[511,1416,780],{"class":913},[511,1418,1419],{"class":690},"{",[511,1421,1422],{"class":913}," file",[511,1424,544],{"class":690},[511,1426,1082],{"class":521},[511,1428,1347],{"class":690},[511,1430,792],{"class":913},[511,1432,1434,1437,1439,1441,1443,1446,1448,1450,1453,1455],{"class":513,"line":1433},35,[511,1435,1436],{"class":521},"    console",[511,1438,529],{"class":690},[511,1440,507],{"class":776},[511,1442,780],{"class":913},[511,1444,1445],{"class":783},"`${",[511,1447,1128],{"class":521},[511,1449,1197],{"class":783},[511,1451,1452],{"class":517}," successfully uploaded.",[511,1454,1275],{"class":783},[511,1456,792],{"class":913},[511,1458,1460],{"class":513,"line":1459},36,[511,1461,1462],{"class":690},"  }\n",[511,1464,1466,1469,1471,1474,1476],{"class":513,"line":1465},37,[511,1467,1468],{"class":890},"  catch",[511,1470,1122],{"class":913},[511,1472,1473],{"class":521},"err",[511,1475,1131],{"class":913},[511,1477,941],{"class":690},[511,1479,1481,1483,1485,1488,1490,1492],{"class":513,"line":1480},38,[511,1482,1436],{"class":521},[511,1484,529],{"class":690},[511,1486,1487],{"class":776},"error",[511,1489,780],{"class":913},[511,1491,1473],{"class":521},[511,1493,792],{"class":913},[511,1495,1497,1500,1502,1505,1507,1510],{"class":513,"line":1496},39,[511,1498,1499],{"class":521},"    process",[511,1501,529],{"class":690},[511,1503,1504],{"class":776},"exit",[511,1506,780],{"class":913},[511,1508,541],{"class":1509},"srdBf",[511,1511,792],{"class":913},[511,1513,1515],{"class":513,"line":1514},40,[511,1516,1462],{"class":690},[511,1518,1520,1522],{"class":513,"line":1519},41,[511,1521,1197],{"class":690},[511,1523,1524],{"class":521},"())\n",[32,1526,1527,1528,469,1531,1534],{},"把主题打包成 zip 包，然后提供 Ghost 上创建的 ",[81,1529,1530],{},"Admin API Key",[81,1532,1533],{},"API URL","，通过 API 去上传，那么我们应该也可以自己去实现。",[32,1536,1537,1538,469,1541,1543],{},"首先，我们也需要去 Ghost 后台创建一个自定义的 Integration，比如取名叫 GitLab CI，目的是为了获得 ",[81,1539,1540],{},"Admin API key",[81,1542,1533],{},"，后面在 GitLab CI 中需要用到。",[453,1545],{"filename":456},[32,1547,1548,1549,469,1552,1555],{},"下一步，去 GitLab CI 中，把这两个内容配置成变量，取名 ",[81,1550,1551],{},"GHOST_ADMIN_API_KEY",[81,1553,1554],{},"GHOST_API_URL"," 以便在 CI 脚本中使用。",[453,1557],{"filename":1558},"02.png",[32,1560,1561],{},"在项目中添加 Ghost Admin API 库：",[503,1563,1567],{"className":1564,"code":1565,"language":1566,"meta":406,"style":406},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","yarn add @tryghost\u002Fadmin-api --dev\n","bash",[81,1568,1569],{"__ignoreMap":406},[511,1570,1571,1575,1578,1581],{"class":513,"line":514},[511,1572,1574],{"class":1573},"sbgvK","yarn",[511,1576,1577],{"class":517}," add",[511,1579,1580],{"class":517}," @tryghost\u002Fadmin-api",[511,1582,1584],{"class":1583},"stzsN"," --dev\n",[32,1586,1587,1588,1591],{},"在 ",[81,1589,1590],{},"gulpfile.js"," 中插入部署的任务：",[503,1593,1595],{"className":755,"code":1594,"language":757,"meta":406,"style":406},"const GhostAdminApi = require('@tryghost\u002Fadmin-api')\nconst { series, src, dest } = require('gulp')\nconst less = require('gulp-less')\nconst zip = require('gulp-zip')\nconst pump = require('pump')\n\nconst handleError = (done) => {\n  return function (err) {\n    if (err) {\n      console.error(err)\n    }\n    return done(err)\n  }\n}\n\nfunction css(done) {\n  pump(\n    [\n      src('.\u002Fassets\u002Fcss\u002F*.less', { sourcemaps: true }),\n      less({}),\n      dest('assets\u002Fcss', { sourcemaps: '.\u002F' }),\n    ],\n    handleError(done)\n  )\n}\n\nfunction zipper(done) {\n  const targetDir = 'dist\u002F'\n  const themeName = require('.\u002Fpackage.json').name\n  const filename = `${themeName}.zip`\n\n  pump(\n    [\n      src(['**', '!node_modules', '!node_modules\u002F**', '!dist', '!dist\u002F**']),\n      zip(filename),\n      dest(targetDir),\n    ],\n    handleError(done)\n  )\n}\n\nasync function deploy(done) {\n  try {\n    const zipFile = `dist\u002F${require('.\u002Fpackage.json').name}.zip`\n    const api = new GhostAdminApi({\n      url: process.env.GHOST_API_URL,\n      key: process.env.GHOST_ADMIN_API_KEY,\n      version: `v${require('.\u002Fpackage.json').version}`,\n    })\n\n    await api.themes.upload({ file: zipFile })\n    console.log(`${zipFile} successfully uploaded.`)\n    done()\n  }\n  catch (err) {\n    console.error(err)\n    done(err)\n  }\n}\n\nconst build = series(css)\n\nexports.build = build\nexports.zip = series(build, zipper)\nexports.deploy = deploy\nexports.default = build\n",[81,1596,1597,1617,1653,1675,1697,1719,1723,1746,1761,1773,1788,1792,1806,1810,1815,1819,1835,1843,1848,1881,1895,1930,1937,1948,1953,1957,1961,1976,1993,2018,2037,2041,2047,2051,2106,2120,2133,2139,2149,2153,2157,2161,2179,2186,2227,2244,2263,2282,2317,2324,2329,2358,2382,2391,2396,2409,2424,2435,2440,2445,2450,2465,2470,2487,2509,2524],{"__ignoreMap":406},[511,1598,1599,1601,1603,1605,1607,1609,1611,1613,1615],{"class":513,"line":514},[511,1600,765],{"class":764},[511,1602,843],{"class":768},[511,1604,773],{"class":772},[511,1606,777],{"class":776},[511,1608,780],{"class":521},[511,1610,784],{"class":783},[511,1612,854],{"class":517},[511,1614,784],{"class":783},[511,1616,792],{"class":521},[511,1618,1619,1621,1623,1626,1628,1631,1633,1636,1638,1640,1642,1644,1646,1649,1651],{"class":513,"line":407},[511,1620,765],{"class":764},[511,1622,1337],{"class":690},[511,1624,1625],{"class":768}," series",[511,1627,1059],{"class":690},[511,1629,1630],{"class":768}," src",[511,1632,1059],{"class":690},[511,1634,1635],{"class":768}," dest",[511,1637,1347],{"class":690},[511,1639,773],{"class":772},[511,1641,777],{"class":776},[511,1643,780],{"class":521},[511,1645,784],{"class":783},[511,1647,1648],{"class":517},"gulp",[511,1650,784],{"class":783},[511,1652,792],{"class":521},[511,1654,1655,1657,1660,1662,1664,1666,1668,1671,1673],{"class":513,"line":410},[511,1656,765],{"class":764},[511,1658,1659],{"class":768}," less",[511,1661,773],{"class":772},[511,1663,777],{"class":776},[511,1665,780],{"class":521},[511,1667,784],{"class":783},[511,1669,1670],{"class":517},"gulp-less",[511,1672,784],{"class":783},[511,1674,792],{"class":521},[511,1676,1677,1679,1682,1684,1686,1688,1690,1693,1695],{"class":513,"line":578},[511,1678,765],{"class":764},[511,1680,1681],{"class":768}," zip",[511,1683,773],{"class":772},[511,1685,777],{"class":776},[511,1687,780],{"class":521},[511,1689,784],{"class":783},[511,1691,1692],{"class":517},"gulp-zip",[511,1694,784],{"class":783},[511,1696,792],{"class":521},[511,1698,1699,1701,1704,1706,1708,1710,1712,1715,1717],{"class":513,"line":584},[511,1700,765],{"class":764},[511,1702,1703],{"class":768}," pump",[511,1705,773],{"class":772},[511,1707,777],{"class":776},[511,1709,780],{"class":521},[511,1711,784],{"class":783},[511,1713,1714],{"class":517},"pump",[511,1716,784],{"class":783},[511,1718,792],{"class":521},[511,1720,1721],{"class":513,"line":589},[511,1722,575],{"emptyLinePlaceholder":418},[511,1724,1725,1727,1731,1733,1735,1739,1741,1744],{"class":513,"line":598},[511,1726,765],{"class":764},[511,1728,1730],{"class":1729},"sfCm-"," handleError",[511,1732,773],{"class":772},[511,1734,1122],{"class":690},[511,1736,1738],{"class":1737},"s99_P","done",[511,1740,859],{"class":690},[511,1742,1743],{"class":764}," =>",[511,1745,885],{"class":690},[511,1747,1748,1751,1753,1755,1757,1759],{"class":513,"line":604},[511,1749,1750],{"class":890},"  return",[511,1752,876],{"class":764},[511,1754,1122],{"class":690},[511,1756,1473],{"class":1737},[511,1758,859],{"class":690},[511,1760,885],{"class":690},[511,1762,1763,1765,1767,1769,1771],{"class":513,"line":609},[511,1764,1119],{"class":890},[511,1766,1122],{"class":913},[511,1768,1473],{"class":521},[511,1770,1131],{"class":913},[511,1772,941],{"class":690},[511,1774,1775,1778,1780,1782,1784,1786],{"class":513,"line":617},[511,1776,1777],{"class":521},"      console",[511,1779,529],{"class":690},[511,1781,1487],{"class":776},[511,1783,780],{"class":913},[511,1785,1473],{"class":521},[511,1787,792],{"class":913},[511,1789,1790],{"class":513,"line":623},[511,1791,1355],{"class":690},[511,1793,1794,1797,1800,1802,1804],{"class":513,"line":628},[511,1795,1796],{"class":890},"    return",[511,1798,1799],{"class":776}," done",[511,1801,780],{"class":913},[511,1803,1473],{"class":521},[511,1805,792],{"class":913},[511,1807,1808],{"class":513,"line":654},[511,1809,1462],{"class":690},[511,1811,1812],{"class":513,"line":660},[511,1813,1814],{"class":690},"}\n",[511,1816,1817],{"class":513,"line":1005},[511,1818,575],{"emptyLinePlaceholder":418},[511,1820,1821,1824,1827,1829,1831,1833],{"class":513,"line":1028},[511,1822,1823],{"class":764},"function",[511,1825,1826],{"class":776}," css",[511,1828,780],{"class":690},[511,1830,1738],{"class":1737},[511,1832,859],{"class":690},[511,1834,885],{"class":690},[511,1836,1837,1840],{"class":513,"line":1071},[511,1838,1839],{"class":776},"  pump",[511,1841,1842],{"class":913},"(\n",[511,1844,1845],{"class":513,"line":1076},[511,1846,1847],{"class":913},"    [\n",[511,1849,1850,1853,1855,1857,1860,1862,1864,1866,1869,1871,1875,1877,1879],{"class":513,"line":1104},[511,1851,1852],{"class":776},"      src",[511,1854,780],{"class":913},[511,1856,784],{"class":783},[511,1858,1859],{"class":517},".\u002Fassets\u002Fcss\u002F*.less",[511,1861,784],{"class":783},[511,1863,1059],{"class":690},[511,1865,1337],{"class":690},[511,1867,1868],{"class":913}," sourcemaps",[511,1870,544],{"class":690},[511,1872,1874],{"class":1873},"syTEX"," true",[511,1876,1347],{"class":690},[511,1878,859],{"class":913},[511,1880,949],{"class":690},[511,1882,1883,1886,1888,1891,1893],{"class":513,"line":1109},[511,1884,1885],{"class":776},"      less",[511,1887,780],{"class":913},[511,1889,1890],{"class":690},"{}",[511,1892,859],{"class":913},[511,1894,949],{"class":690},[511,1896,1897,1900,1902,1904,1907,1909,1911,1913,1915,1917,1919,1922,1924,1926,1928],{"class":513,"line":1116},[511,1898,1899],{"class":776},"      dest",[511,1901,780],{"class":913},[511,1903,784],{"class":783},[511,1905,1906],{"class":517},"assets\u002Fcss",[511,1908,784],{"class":783},[511,1910,1059],{"class":690},[511,1912,1337],{"class":690},[511,1914,1868],{"class":913},[511,1916,544],{"class":690},[511,1918,985],{"class":783},[511,1920,1921],{"class":517},".\u002F",[511,1923,784],{"class":783},[511,1925,1347],{"class":690},[511,1927,859],{"class":913},[511,1929,949],{"class":690},[511,1931,1932,1935],{"class":513,"line":1136},[511,1933,1934],{"class":913},"    ]",[511,1936,949],{"class":690},[511,1938,1939,1942,1944,1946],{"class":513,"line":1181},[511,1940,1941],{"class":776},"    handleError",[511,1943,780],{"class":913},[511,1945,1738],{"class":521},[511,1947,792],{"class":913},[511,1949,1950],{"class":513,"line":1206},[511,1951,1952],{"class":913},"  )\n",[511,1954,1955],{"class":513,"line":1238},[511,1956,1814],{"class":690},[511,1958,1959],{"class":513,"line":1249},[511,1960,575],{"emptyLinePlaceholder":418},[511,1962,1963,1965,1968,1970,1972,1974],{"class":513,"line":1254},[511,1964,1823],{"class":764},[511,1966,1967],{"class":776}," zipper",[511,1969,780],{"class":690},[511,1971,1738],{"class":1737},[511,1973,859],{"class":690},[511,1975,885],{"class":690},[511,1977,1978,1981,1984,1986,1988,1991],{"class":513,"line":1260},[511,1979,1980],{"class":764},"  const",[511,1982,1983],{"class":768}," targetDir",[511,1985,773],{"class":772},[511,1987,985],{"class":783},[511,1989,1990],{"class":517},"dist\u002F",[511,1992,991],{"class":783},[511,1994,1995,1997,1999,2001,2003,2005,2007,2010,2012,2014,2016],{"class":513,"line":1352},[511,1996,1980],{"class":764},[511,1998,1142],{"class":768},[511,2000,773],{"class":772},[511,2002,777],{"class":776},[511,2004,780],{"class":913},[511,2006,784],{"class":783},[511,2008,2009],{"class":517},".\u002Fpackage.json",[511,2011,784],{"class":783},[511,2013,859],{"class":913},[511,2015,529],{"class":690},[511,2017,1178],{"class":521},[511,2019,2020,2022,2025,2027,2029,2031,2033,2035],{"class":513,"line":1358},[511,2021,1980],{"class":764},[511,2023,2024],{"class":768}," filename",[511,2026,773],{"class":772},[511,2028,1191],{"class":783},[511,2030,1194],{"class":521},[511,2032,1197],{"class":783},[511,2034,1200],{"class":517},[511,2036,1203],{"class":783},[511,2038,2039],{"class":513,"line":1363},[511,2040,575],{"emptyLinePlaceholder":418},[511,2042,2043,2045],{"class":513,"line":1388},[511,2044,1839],{"class":776},[511,2046,1842],{"class":913},[511,2048,2049],{"class":513,"line":1393},[511,2050,1847],{"class":913},[511,2052,2053,2055,2058,2060,2063,2065,2067,2069,2072,2074,2076,2078,2081,2083,2085,2087,2090,2092,2094,2096,2099,2101,2104],{"class":513,"line":1399},[511,2054,1852],{"class":776},[511,2056,2057],{"class":913},"([",[511,2059,784],{"class":783},[511,2061,2062],{"class":517},"**",[511,2064,784],{"class":783},[511,2066,1059],{"class":690},[511,2068,985],{"class":783},[511,2070,2071],{"class":517},"!node_modules",[511,2073,784],{"class":783},[511,2075,1059],{"class":690},[511,2077,985],{"class":783},[511,2079,2080],{"class":517},"!node_modules\u002F**",[511,2082,784],{"class":783},[511,2084,1059],{"class":690},[511,2086,985],{"class":783},[511,2088,2089],{"class":517},"!dist",[511,2091,784],{"class":783},[511,2093,1059],{"class":690},[511,2095,985],{"class":783},[511,2097,2098],{"class":517},"!dist\u002F**",[511,2100,784],{"class":783},[511,2102,2103],{"class":913},"])",[511,2105,949],{"class":690},[511,2107,2108,2111,2113,2116,2118],{"class":513,"line":1433},[511,2109,2110],{"class":776},"      zip",[511,2112,780],{"class":913},[511,2114,2115],{"class":521},"filename",[511,2117,859],{"class":913},[511,2119,949],{"class":690},[511,2121,2122,2124,2126,2129,2131],{"class":513,"line":1459},[511,2123,1899],{"class":776},[511,2125,780],{"class":913},[511,2127,2128],{"class":521},"targetDir",[511,2130,859],{"class":913},[511,2132,949],{"class":690},[511,2134,2135,2137],{"class":513,"line":1465},[511,2136,1934],{"class":913},[511,2138,949],{"class":690},[511,2140,2141,2143,2145,2147],{"class":513,"line":1480},[511,2142,1941],{"class":776},[511,2144,780],{"class":913},[511,2146,1738],{"class":521},[511,2148,792],{"class":913},[511,2150,2151],{"class":513,"line":1496},[511,2152,1952],{"class":913},[511,2154,2155],{"class":513,"line":1514},[511,2156,1814],{"class":690},[511,2158,2159],{"class":513,"line":1519},[511,2160,575],{"emptyLinePlaceholder":418},[511,2162,2164,2166,2168,2171,2173,2175,2177],{"class":513,"line":2163},42,[511,2165,873],{"class":764},[511,2167,876],{"class":764},[511,2169,2170],{"class":776}," deploy",[511,2172,780],{"class":690},[511,2174,1738],{"class":1737},[511,2176,859],{"class":690},[511,2178,885],{"class":690},[511,2180,2182,2184],{"class":513,"line":2181},43,[511,2183,891],{"class":890},[511,2185,885],{"class":690},[511,2187,2189,2191,2194,2196,2199,2201,2203,2206,2208,2210,2212,2214,2216,2218,2221,2223,2225],{"class":513,"line":2188},44,[511,2190,898],{"class":764},[511,2192,2193],{"class":768}," zipFile",[511,2195,773],{"class":772},[511,2197,2198],{"class":783}," `",[511,2200,1990],{"class":517},[511,2202,1281],{"class":783},[511,2204,2205],{"class":776},"require",[511,2207,780],{"class":1299},[511,2209,784],{"class":783},[511,2211,2009],{"class":517},[511,2213,784],{"class":783},[511,2215,859],{"class":1299},[511,2217,529],{"class":783},[511,2219,2220],{"class":521},"name",[511,2222,1197],{"class":783},[511,2224,1200],{"class":517},[511,2226,1203],{"class":783},[511,2228,2230,2232,2234,2236,2238,2240,2242],{"class":513,"line":2229},45,[511,2231,898],{"class":764},[511,2233,929],{"class":768},[511,2235,773],{"class":772},[511,2237,934],{"class":772},[511,2239,843],{"class":776},[511,2241,780],{"class":913},[511,2243,941],{"class":690},[511,2245,2247,2249,2251,2253,2255,2257,2259,2261],{"class":513,"line":2246},46,[511,2248,946],{"class":913},[511,2250,544],{"class":690},[511,2252,1015],{"class":521},[511,2254,529],{"class":690},[511,2256,1020],{"class":521},[511,2258,529],{"class":690},[511,2260,1554],{"class":768},[511,2262,949],{"class":690},[511,2264,2266,2268,2270,2272,2274,2276,2278,2280],{"class":513,"line":2265},47,[511,2267,954],{"class":913},[511,2269,544],{"class":690},[511,2271,1015],{"class":521},[511,2273,529],{"class":690},[511,2275,1020],{"class":521},[511,2277,529],{"class":690},[511,2279,1551],{"class":768},[511,2281,949],{"class":690},[511,2283,2285,2287,2289,2291,2294,2296,2298,2300,2302,2304,2306,2308,2310,2313,2315],{"class":513,"line":2284},48,[511,2286,980],{"class":913},[511,2288,544],{"class":690},[511,2290,2198],{"class":783},[511,2292,2293],{"class":517},"v",[511,2295,1281],{"class":783},[511,2297,2205],{"class":776},[511,2299,780],{"class":1299},[511,2301,784],{"class":783},[511,2303,2009],{"class":517},[511,2305,784],{"class":783},[511,2307,859],{"class":1299},[511,2309,529],{"class":783},[511,2311,2312],{"class":521},"version",[511,2314,1327],{"class":783},[511,2316,949],{"class":690},[511,2318,2320,2322],{"class":513,"line":2319},49,[511,2321,996],{"class":690},[511,2323,792],{"class":913},[511,2325,2327],{"class":513,"line":2326},50,[511,2328,575],{"emptyLinePlaceholder":418},[511,2330,2332,2334,2336,2338,2340,2342,2344,2346,2348,2350,2352,2354,2356],{"class":513,"line":2331},51,[511,2333,1402],{"class":890},[511,2335,929],{"class":521},[511,2337,529],{"class":690},[511,2339,1409],{"class":521},[511,2341,529],{"class":690},[511,2343,1414],{"class":776},[511,2345,780],{"class":913},[511,2347,1419],{"class":690},[511,2349,1422],{"class":913},[511,2351,544],{"class":690},[511,2353,2193],{"class":521},[511,2355,1347],{"class":690},[511,2357,792],{"class":913},[511,2359,2361,2363,2365,2367,2369,2371,2374,2376,2378,2380],{"class":513,"line":2360},52,[511,2362,1436],{"class":521},[511,2364,529],{"class":690},[511,2366,507],{"class":776},[511,2368,780],{"class":913},[511,2370,1445],{"class":783},[511,2372,2373],{"class":521},"zipFile",[511,2375,1197],{"class":783},[511,2377,1452],{"class":517},[511,2379,1275],{"class":783},[511,2381,792],{"class":913},[511,2383,2385,2388],{"class":513,"line":2384},53,[511,2386,2387],{"class":776},"    done",[511,2389,2390],{"class":913},"()\n",[511,2392,2394],{"class":513,"line":2393},54,[511,2395,1462],{"class":690},[511,2397,2399,2401,2403,2405,2407],{"class":513,"line":2398},55,[511,2400,1468],{"class":890},[511,2402,1122],{"class":913},[511,2404,1473],{"class":521},[511,2406,1131],{"class":913},[511,2408,941],{"class":690},[511,2410,2412,2414,2416,2418,2420,2422],{"class":513,"line":2411},56,[511,2413,1436],{"class":521},[511,2415,529],{"class":690},[511,2417,1487],{"class":776},[511,2419,780],{"class":913},[511,2421,1473],{"class":521},[511,2423,792],{"class":913},[511,2425,2427,2429,2431,2433],{"class":513,"line":2426},57,[511,2428,2387],{"class":776},[511,2430,780],{"class":913},[511,2432,1473],{"class":521},[511,2434,792],{"class":913},[511,2436,2438],{"class":513,"line":2437},58,[511,2439,1462],{"class":690},[511,2441,2443],{"class":513,"line":2442},59,[511,2444,1814],{"class":690},[511,2446,2448],{"class":513,"line":2447},60,[511,2449,575],{"emptyLinePlaceholder":418},[511,2451,2453,2455,2458,2460,2462],{"class":513,"line":2452},61,[511,2454,765],{"class":764},[511,2456,2457],{"class":768}," build",[511,2459,773],{"class":772},[511,2461,1625],{"class":776},[511,2463,2464],{"class":521},"(css)\n",[511,2466,2468],{"class":513,"line":2467},62,[511,2469,575],{"emptyLinePlaceholder":418},[511,2471,2473,2476,2478,2481,2484],{"class":513,"line":2472},63,[511,2474,2475],{"class":525},"exports",[511,2477,529],{"class":690},[511,2479,2480],{"class":521},"build ",[511,2482,2483],{"class":772},"=",[511,2485,2486],{"class":521}," build\n",[511,2488,2490,2492,2494,2497,2499,2501,2504,2506],{"class":513,"line":2489},64,[511,2491,2475],{"class":525},[511,2493,529],{"class":690},[511,2495,2496],{"class":521},"zip ",[511,2498,2483],{"class":772},[511,2500,1625],{"class":776},[511,2502,2503],{"class":521},"(build",[511,2505,1059],{"class":690},[511,2507,2508],{"class":521}," zipper)\n",[511,2510,2512,2514,2516,2519,2521],{"class":513,"line":2511},65,[511,2513,2475],{"class":525},[511,2515,529],{"class":690},[511,2517,2518],{"class":521},"deploy ",[511,2520,2483],{"class":772},[511,2522,2523],{"class":521}," deploy\n",[511,2525,2527,2529,2531,2534,2536],{"class":513,"line":2526},66,[511,2528,2475],{"class":525},[511,2530,529],{"class":690},[511,2532,2533],{"class":521},"default ",[511,2535,2483],{"class":772},[511,2537,2486],{"class":521},[32,2539,1587,2540,2542],{},[81,2541,1064],{}," 中插入脚本：",[503,2544,2548],{"className":2545,"code":2546,"language":2547,"meta":406,"style":406},"language-json shiki shiki-themes material-theme-lighter github-light github-dark","{\n  \u002F* ... *\u002F\n  \"scripts\": {\n    \"build\": \"gulp build\",\n    \"zip\": \"gulp zip\",\n    \"deploy\": \"gulp deploy\"\n  }\n  \u002F* ... *\u002F\n}\n","json",[81,2549,2550,2554,2559,2575,2598,2618,2637,2641,2645],{"__ignoreMap":406},[511,2551,2552],{"class":513,"line":514},[511,2553,941],{"class":690},[511,2555,2556],{"class":513,"line":407},[511,2557,2558],{"class":1112},"  \u002F* ... *\u002F\n",[511,2560,2561,2564,2568,2571,2573],{"class":513,"line":410},[511,2562,2563],{"class":525},"  \"",[511,2565,2567],{"class":2566},"sseR_","scripts",[511,2569,2570],{"class":525},"\"",[511,2572,544],{"class":690},[511,2574,885],{"class":690},[511,2576,2577,2580,2584,2586,2588,2591,2594,2596],{"class":513,"line":578},[511,2578,2579],{"class":525},"    \"",[511,2581,2583],{"class":2582},"sZMiF","build",[511,2585,2570],{"class":525},[511,2587,544],{"class":690},[511,2589,2590],{"class":783}," \"",[511,2592,2593],{"class":517},"gulp build",[511,2595,2570],{"class":783},[511,2597,949],{"class":690},[511,2599,2600,2602,2605,2607,2609,2611,2614,2616],{"class":513,"line":584},[511,2601,2579],{"class":525},[511,2603,2604],{"class":2582},"zip",[511,2606,2570],{"class":525},[511,2608,544],{"class":690},[511,2610,2590],{"class":783},[511,2612,2613],{"class":517},"gulp zip",[511,2615,2570],{"class":783},[511,2617,949],{"class":690},[511,2619,2620,2622,2625,2627,2629,2631,2634],{"class":513,"line":589},[511,2621,2579],{"class":525},[511,2623,2624],{"class":2582},"deploy",[511,2626,2570],{"class":525},[511,2628,544],{"class":690},[511,2630,2590],{"class":783},[511,2632,2633],{"class":517},"gulp deploy",[511,2635,2636],{"class":783},"\"\n",[511,2638,2639],{"class":513,"line":598},[511,2640,1462],{"class":690},[511,2642,2643],{"class":513,"line":604},[511,2644,2558],{"class":1112},[511,2646,2647],{"class":513,"line":609},[511,2648,1814],{"class":690},[32,2650,2651,2652,2655],{},"添加 ",[81,2653,2654],{},".gitlab-ci.yml"," 文件：",[503,2657,2659],{"className":677,"code":2658,"language":679,"meta":406,"style":406},"image: node:14-slim # 注意：不要用 alpine 的镜像，上传至 https 站点会有问题\n\nstages:\n  - deploy\n\ndeploy:\n  stage: deploy\n  script:\n    - yarn install\n    - yarn zip\n    - yarn deploy\n  only:\n    - tags\n  cache:\n    paths:\n      - node_modules\u002F\n",[81,2660,2661,2674,2678,2686,2693,2697,2703,2712,2719,2727,2734,2741,2748,2755,2762,2769],{"__ignoreMap":406},[511,2662,2663,2666,2668,2671],{"class":513,"line":514},[511,2664,2665],{"class":686},"image",[511,2667,544],{"class":690},[511,2669,2670],{"class":517}," node:14-slim",[511,2672,2673],{"class":1112}," # 注意：不要用 alpine 的镜像，上传至 https 站点会有问题\n",[511,2675,2676],{"class":513,"line":407},[511,2677,575],{"emptyLinePlaceholder":418},[511,2679,2680,2683],{"class":513,"line":410},[511,2681,2682],{"class":686},"stages",[511,2684,2685],{"class":690},":\n",[511,2687,2688,2691],{"class":513,"line":578},[511,2689,2690],{"class":690},"  -",[511,2692,2523],{"class":517},[511,2694,2695],{"class":513,"line":584},[511,2696,575],{"emptyLinePlaceholder":418},[511,2698,2699,2701],{"class":513,"line":589},[511,2700,2624],{"class":686},[511,2702,2685],{"class":690},[511,2704,2705,2708,2710],{"class":513,"line":598},[511,2706,2707],{"class":686},"  stage",[511,2709,544],{"class":690},[511,2711,2523],{"class":517},[511,2713,2714,2717],{"class":513,"line":604},[511,2715,2716],{"class":686},"  script",[511,2718,2685],{"class":690},[511,2720,2721,2724],{"class":513,"line":609},[511,2722,2723],{"class":690},"    -",[511,2725,2726],{"class":517}," yarn install\n",[511,2728,2729,2731],{"class":513,"line":617},[511,2730,2723],{"class":690},[511,2732,2733],{"class":517}," yarn zip\n",[511,2735,2736,2738],{"class":513,"line":623},[511,2737,2723],{"class":690},[511,2739,2740],{"class":517}," yarn deploy\n",[511,2742,2743,2746],{"class":513,"line":628},[511,2744,2745],{"class":686},"  only",[511,2747,2685],{"class":690},[511,2749,2750,2752],{"class":513,"line":654},[511,2751,2723],{"class":690},[511,2753,2754],{"class":517}," tags\n",[511,2756,2757,2760],{"class":513,"line":660},[511,2758,2759],{"class":686},"  cache",[511,2761,2685],{"class":690},[511,2763,2764,2767],{"class":513,"line":1005},[511,2765,2766],{"class":686},"    paths",[511,2768,2685],{"class":690},[511,2770,2771,2774],{"class":513,"line":1028},[511,2772,2773],{"class":690},"      -",[511,2775,2776],{"class":517}," node_modules\u002F\n",[32,2778,2779,2780,2782,2783,2786,2787,2790],{},"注意，为了避免每次提交代码都部署，",[81,2781,2624],{}," 任务限制了只有打了 ",[81,2784,2785],{},"tag"," 的 ",[81,2788,2789],{},"commit"," 才会触发。",[32,2792,2793],{},"好了，更新代码，打个 tag 就会自动打包上传至 Ghost 后台了！",[711,2795,2796],{},"html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sfo-9, html code.shiki .sfo-9{--shiki-light:#90A4AE;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sfCm-, html code.shiki .sfCm-{--shiki-light:#90A4AE;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sseR_, html code.shiki .sseR_{--shiki-light:#9C3EDA;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":406,"searchDepth":407,"depth":407,"links":2798},[],"2022-05-24",{},"\u002Fposts\u002F2022\u002Fuse-gitlab-to-deploy-ghost-theme-automatically",{"text":2803,"minutes":2804,"time":2805,"words":2806},"4 min read",3.575,214500,715,{"title":732,"description":406},{"loc":2801},"posts\u002F2022\u002F20220524.use-gitlab-to-deploy-ghost-theme-automatically",[491,728,492,429],"2cB9yXMzvXfyQ8XEXx9VDbtCvf4CKC-2FRBZ833gE-Q",{"id":2813,"title":2814,"body":2815,"class":413,"cover":2828,"coverSize":413,"date":2829,"description":2819,"draft":415,"extension":416,"hideComments":415,"location":413,"meta":2830,"navigation":418,"path":2831,"readingTime":2832,"seo":2836,"sitemap":2837,"stem":2838,"tags":2839,"time":413,"weather":413,"__hash__":2840},"posts\u002Fposts\u002F2019\u002F20190306.new-blog-theme.md","折腾了一下博客的新主题",{"type":25,"value":2816,"toc":2826},[2817,2820,2823],[32,2818,2819],{},"心仪这个主题很久了，第一次在 themeforest 上购买主题，感觉还是挺爽的，比自己从零开始做一个要省事多了。😎",[32,2821,2822],{},"自定义了一些样式，有空还需要汉化一下。",[32,2824,2825],{},"睡觉🌛",{"title":406,"searchDepth":407,"depth":407,"links":2827},[],"png","2019-03-06",{},"\u002Fposts\u002F2019\u002Fnew-blog-theme",{"text":2833,"minutes":2834,"time":2835,"words":2467},"1 min read",0.31,18600,{"title":2814,"description":2819},{"loc":2831},"posts\u002F2019\u002F20190306.new-blog-theme",[430,429,728],"naHPr0OArpbPnxgtqkXp10Fc9qBJ_AR5bEeCiNCxbmQ",{"id":2842,"title":2843,"body":2844,"class":413,"cover":2828,"coverSize":413,"date":2865,"description":2848,"draft":415,"extension":416,"hideComments":415,"location":413,"meta":2866,"navigation":418,"path":2867,"readingTime":2868,"seo":2872,"sitemap":2873,"stem":2874,"tags":2875,"time":413,"weather":2877,"__hash__":2878},"posts\u002Fposts\u002F2019\u002F20190109.ghost-docker-mail-config.md","Ghost Docker 部署方式配置邮箱",{"type":25,"value":2845,"toc":2863},[2846,2849,2852,2860],[32,2847,2848],{},"很久没登录博客了，今天登录时，发现忘记密码了，之前都是自动登录的，估计是自动登录过期了，没办法自动登录了，试了几次，账号被锁定了。",[32,2850,2851],{},"尝试找回密码，发现好像没有配置 SMTP 邮箱。于是找了下配置项，用 Docker 部署的话，在编排模板的 environment 中添加如下配置：",[503,2853,2858],{"className":2854,"code":2856,"language":2857},[2855],"language-text","- 'mail__transport=SMTP'\n- 'mail__from=Ghost \u003Cxx@xxx.com>'\n- 'mail__options__host=smtp.qiye.aliyun.com'\n- 'mail__options__secureConnection=true'\n- 'mail__options__port=465'\n- 'mail__options__auth__user=xx@xxx.com'\n- 'mail__options__auth__pass=YOUR_PASSWORD'\n","text",[81,2859,2856],{"__ignoreMap":406},[32,2861,2862],{},"重新部署一下即可。",{"title":406,"searchDepth":407,"depth":407,"links":2864},[],"2019-01-09",{},"\u002Fposts\u002F2019\u002Fghost-docker-mail-config",{"text":2833,"minutes":2869,"time":2870,"words":2871},0.62,37200,124,{"title":2843,"description":2848},{"loc":2867},"posts\u002F2019\u002F20190109.ghost-docker-mail-config",[491,429,728,2876],"Docker","天气阴","yJjcNS7QIvqk0sWEB0_f7Ds-et57mbeIjVP1lrbEJOE",{"id":2880,"title":2881,"body":2882,"class":413,"cover":2828,"coverSize":413,"date":2995,"description":2886,"draft":415,"extension":416,"hideComments":415,"location":413,"meta":2996,"navigation":418,"path":2997,"readingTime":2998,"seo":3003,"sitemap":3004,"stem":3005,"tags":3006,"time":413,"weather":413,"__hash__":3007},"posts\u002Fposts\u002F2017\u002F20171102.transfer-blog-to-aliyun-docker.md","Ghost 博客迁移至阿里云 Docker",{"type":25,"value":2883,"toc":2993},[2884,2887,2890,2893,2896,2919,2922,2930,2933,2936,2939,2942,2945,2990],[32,2885,2886],{},"刚刚，将 Ghost 博客迁移到了阿里云 Docker 上。",[32,2888,2889],{},"由于近期网络问题，导致家里的 NAS 已经无法提供 443 端口的服务了，之前的临时解决方案是将 hadb.me 的域名解析到 DigitalOcean 的一台机器上，然后用 nginx 转发到 NAS 的 20443 端口，通过海外的服务器做了中转，访问速度可想而知。并且近期海外网络极不稳定，最终决定还是老老实实备案，迁移到阿里云上来。",[32,2891,2892],{},"近年来，Docker 容器化越来越火，我最近的几个项目也都是通过 Docker 来部署的，非常方便。",[32,2894,2895],{},"域名备案经历了几波周折，提交备案后，阿里云初检未通过，有如下问题：",[51,2897,2898,2907,2910,2913,2916],{},[54,2899,2900,2901,2906],{},"根据要求已经取得备案号的网站最下方必须显示您的备案号，并能链接到工信部网站",[58,2902,2905],{"href":2903,"rel":2904},"http:\u002F\u002Fwww.miitbeian.gov.cn\u002F",[62],"www.miitbeian.gov.cn","，目前您网站“monkeyrun.net”最下方备案号无法链接工信部网站，请您修改",[54,2908,2909],{},"根据要求网站名称必须与主办单位名称有一定的关联性。您备案的网站名称“HADB 的博客”与主办单位名称“上海猿奋网络科技有限公司”没有关联性，请修改",[54,2911,2912],{},"根据要求域名持有者必须与主办单位名称一致，经查询您的域名“hadb.me”持有者与您备案信息中“邓斌 ”单位名称\u002F法人姓名不一致，请您先办理域名过户",[54,2914,2915],{},"根据管局要求域名有效期需要大于 6 个月，您的域名“hadb.me”有效期不足 6 个月，请您修改",[54,2917,2918],{},"“邓斌”证件号码在多个单位\u002F个人备案中重复出现多次，根据要求，一个证件号码只能出现在一个单位\u002F个人备案下，请您更换其它证件",[32,2920,2921],{},"问题 1、2 改起来都还好，很快改完了。",[32,2923,2924,2925,2929],{},"问题 3 操作的过程中遇到了一个很蛋疼的问题。域名原先在 Godaddy 上购买的，在过户前，手贱把域名里的持有者信息修改了下，从英文名改成了中文品拼音，然后就尴尬了，Godaddy 禁止域名转出了，锁定期貌似 60 天，后来给 Godaddy 打中文客服，一个妹子客服跟我说可以给",[58,2926,2928],{"href":2927},"mailto:review60@goaddy.com","review60@goaddy.com","发邮件申请解锁，发了邮件一天没回复。又打电话过去，这次是个男客服接的，他跟我说，这个锁定期是没办法解锁的，巴拉巴拉，口径竟然不一样。后来 Godaddy 的 review60 团队回复我邮件了，说已经解锁了 60 天的锁定期。如果有遇到同样问题的朋友，可以尝试给 review60 团队发邮件就可以解锁了。但是在万网进行域名过户的时候，一直提示“该域名产品暂时不允许转入，无法进行转入操作”，查了下，万网目前不支持.me 域名的新注册和转入。后来就尝试了下直接提交，没有做过户操作，也通过了初审。阿里云这里要求的过户其实是非必要的，只需要把持有者信息修改就可以了。",[32,2931,2932],{},"问题 4 续费了下就可以了。",[32,2934,2935],{},"问题 5，也费了些功夫。几年前上大学时，一个外包项目中用的我自己的身份证作为网站负责人备案的。之前一直没有要求说一个证件号码只能出现在一个备案下，不过既然现在提示了这个问题，那就去处理下。由于这个外包项目已经停止了，并且甲方的网站也已经不做了。所以处理起来很简单，直接登录原备案账号，把备案号注销掉就可以了。",[32,2937,2938],{},"几经周折，备案号终于下来了，接下来开始处理部署的问题。",[32,2940,2941],{},"在阿里云上部署与在自己的机器上部署 Docker 有些区别。",[32,2943,2944],{},"具体流程如下：",[51,2946,2947,2950,2957,2967,2984,2987],{},[54,2948,2949],{},"购买阿里云文件存储 NAS 服务，用来存放 Docker 数据卷",[54,2951,2952,2953,2956],{},"在 ECS 上挂在 NAS，将以前的博客数据复制到 NAS 中的",[81,2954,2955],{},"\u002Fghost-hadb-data","目录下",[54,2958,2959,2960,2963,2964,2966],{},"容器服务中创建 NAS 类型的数据卷",[81,2961,2962],{},"ghost-hadb-data","，指向",[81,2965,2955],{},"目录",[54,2968,2969,2970,2972,2973,2976,2977,2980,2981],{},"创建应用，简单路由配置，将",[81,2971,472],{},"指向容器端口",[81,2974,2975],{},"2368","，选择刚刚创建的数据卷，容器路径为",[81,2978,2979],{},"\u002Fvar\u002Flib\u002Fghost\u002Fcontent","，在环境变量中配置 url 为",[81,2982,2983],{},"https:\u002F\u002Fhadb.me\u002F",[54,2985,2986],{},"配置负载均衡，添加 https 协议 443 端口监听，导入证书",[54,2988,2989],{},"将域名解析切换到负载均衡 ip 地址",[32,2991,2992],{},"Done！以后可以愉快的写博客啦！",{"title":406,"searchDepth":407,"depth":407,"links":2994},[],"2017-11-02",{},"\u002Fposts\u002F2017\u002Ftransfer-blog-to-aliyun-docker",{"text":2999,"minutes":3000,"time":3001,"words":3002},"6 min read",5.875,352500,1175,{"title":2881,"description":2886},{"loc":2997},"posts\u002F2017\u002F20171102.transfer-blog-to-aliyun-docker",[491,429,728,2876],"Q9OzmZ88ueumMvvOGN6bGncIsjTRbiAg-qgAHmieR4k",{"id":3009,"title":3010,"body":3011,"class":413,"cover":716,"coverSize":413,"date":3411,"description":3015,"draft":415,"extension":416,"hideComments":415,"location":413,"meta":3412,"navigation":418,"path":3413,"readingTime":3414,"seo":3418,"sitemap":3419,"stem":3420,"tags":3421,"time":413,"weather":413,"__hash__":3422},"posts\u002Fposts\u002F2017\u002F20171010.using-ghost.md","开始使用 Ghost 啦！",{"type":25,"value":3012,"toc":3405},[3013,3016,3025,3032,3035,3038,3041,3099,3103,3279,3292,3295,3323,3327,3399,3402],[32,3014,3015],{},"关注 Ghost 很久很久了，14 年就尝试过 0.5.3 版，由于一直没有出正式版，所以一直处于关注和等待中。",[32,3017,3018,3019,3024],{},"终于在差不多一年前 Ghost 在 GitHub 上发布了",[58,3020,3023],{"href":3021,"rel":3022},"https:\u002F\u002Fgithub.com\u002FTryGhost\u002FGhost\u002Freleases\u002Ftag\u002F1.0.0-alpha.1",[62],"1.0.0-alpha.1","，本以为很快就能出正式版了，开始了焦急的等待。一开始基本上每天都会去 GitHub 上检查下他们的动态。后来变成了大约每周会去看一次，等了一个又一个版本，甚至等了大半年，终于在第 21 个 alpha 版后，推出了 beta 版，随后不久发布了 1.0.0 正式版。尝试去安装，结果发现挺多坑的，试了很久都没成功，正式版的 Docker 镜像也一直没出。再后面，Ghost 团队的更新也非常勤奋，基本每周都会发布新版本，那段期间我正好也比较忙，一直在默默关注，没有再去尝试安装，任务列表里的“博客迁移到 Ghost 上”也被一再推迟。",[32,3026,3027,3028,3031],{},"直到今天，突然想再去试下。看到 Docker 镜像也同步了最新的版本，于是直接上 Docker。几分钟就装完了，如丝般顺滑，很爽！（20171012 更新：通过默认命令安装，有些地址会显示成 localhost 开头的地址，通过",[81,3029,3030],{},"--env url=https:\u002F\u002Fhadb.me\u002F","可以修改这个地址，但是由于 Nginx 设置有问题，导致设置成 https 的地址后就陷入重定向循环，这个问题后来困扰了很久，解决方案下面会讲。）",[32,3033,3034],{},"作为一个技术博主，我觉得还是有必要把安装步骤写一下，方便后人。",[32,3036,3037],{},"我的博客是搭建在自己家里的 NAS 服务器上，具体细节以后再讲。",[28,3039,3040],{"id":3040},"宿主机安装证书",[503,3042,3044],{"className":1564,"code":3043,"language":1566,"meta":406,"style":406},"service nginx stop && \\\ncertbot certonly --standalone --preferred-challenges tls-sni -d hadb.me && \\\nservice nginx start\n",[81,3045,3046,3063,3090],{"__ignoreMap":406},[511,3047,3048,3051,3054,3057,3060],{"class":513,"line":514},[511,3049,3050],{"class":1573},"service",[511,3052,3053],{"class":517}," nginx",[511,3055,3056],{"class":517}," stop",[511,3058,3059],{"class":690}," &&",[511,3061,3062],{"class":768}," \\\n",[511,3064,3065,3068,3071,3074,3077,3080,3083,3086,3088],{"class":513,"line":407},[511,3066,3067],{"class":1573},"certbot",[511,3069,3070],{"class":517}," certonly",[511,3072,3073],{"class":1583}," --standalone",[511,3075,3076],{"class":1583}," --preferred-challenges",[511,3078,3079],{"class":517}," tls-sni",[511,3081,3082],{"class":1583}," -d",[511,3084,3085],{"class":517}," hadb.me",[511,3087,3059],{"class":690},[511,3089,3062],{"class":768},[511,3091,3092,3094,3096],{"class":513,"line":410},[511,3093,3050],{"class":1573},[511,3095,3053],{"class":517},[511,3097,3098],{"class":517}," start\n",[28,3100,3102],{"id":3101},"宿主机-nginx-设置","宿主机 Nginx 设置",[503,3104,3108],{"className":3105,"code":3106,"language":3107,"meta":406,"style":406},"language-nginx shiki shiki-themes material-theme-lighter github-light github-dark","server {\n    listen 443 ssl;\n    server_name hadb.me;\n    client_max_body_size 1024m;\n    ssl on;\n    ssl_certificate \u002Fetc\u002Fletsencrypt\u002Flive\u002Fhadb.me\u002Ffullchain.pem;\n    ssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002Fhadb.me\u002Fprivkey.pem;\n    location \u002F {\n        proxy_redirect off;\n        proxy_read_timeout 300;\n        proxy_set_header host $host;\n        proxy_set_header x-real-ip $remote_addr;\n        proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;\n        proxy_set_header x-forwarded-proto https;\n        proxy_pass http:\u002F\u002Flocalhost:12368;\n    }\n}\n","nginx",[81,3109,3110,3117,3130,3139,3149,3159,3169,3179,3189,3199,3208,3224,3238,3252,3261,3271,3275],{"__ignoreMap":406},[511,3111,3112,3115],{"class":513,"line":514},[511,3113,3114],{"class":764},"server",[511,3116,885],{"class":521},[511,3118,3119,3122,3125,3128],{"class":513,"line":407},[511,3120,3121],{"class":772},"    listen ",[511,3123,3124],{"class":1509},"443",[511,3126,3127],{"class":521}," ssl",[511,3129,862],{"class":690},[511,3131,3132,3135,3137],{"class":513,"line":410},[511,3133,3134],{"class":772},"    server_name ",[511,3136,472],{"class":521},[511,3138,862],{"class":690},[511,3140,3141,3144,3147],{"class":513,"line":578},[511,3142,3143],{"class":772},"    client_max_body_size ",[511,3145,3146],{"class":1509},"1024m",[511,3148,862],{"class":690},[511,3150,3151,3154,3157],{"class":513,"line":584},[511,3152,3153],{"class":772},"    ssl ",[511,3155,3156],{"class":525},"on",[511,3158,862],{"class":690},[511,3160,3161,3164,3167],{"class":513,"line":589},[511,3162,3163],{"class":772},"    ssl_certificate ",[511,3165,3166],{"class":521},"\u002Fetc\u002Fletsencrypt\u002Flive\u002Fhadb.me\u002Ffullchain.pem",[511,3168,862],{"class":690},[511,3170,3171,3174,3177],{"class":513,"line":598},[511,3172,3173],{"class":772},"    ssl_certificate_key ",[511,3175,3176],{"class":521},"\u002Fetc\u002Fletsencrypt\u002Flive\u002Fhadb.me\u002Fprivkey.pem",[511,3178,862],{"class":690},[511,3180,3181,3184,3187],{"class":513,"line":604},[511,3182,3183],{"class":764},"    location",[511,3185,3186],{"class":1573}," \u002F ",[511,3188,941],{"class":521},[511,3190,3191,3194,3197],{"class":513,"line":609},[511,3192,3193],{"class":772},"        proxy_redirect ",[511,3195,3196],{"class":525},"off",[511,3198,862],{"class":690},[511,3200,3201,3204,3206],{"class":513,"line":617},[511,3202,3203],{"class":772},"        proxy_read_timeout ",[511,3205,293],{"class":1509},[511,3207,862],{"class":690},[511,3209,3210,3213,3216,3219,3222],{"class":513,"line":623},[511,3211,3212],{"class":772},"        proxy_set_header ",[511,3214,3215],{"class":521},"host ",[511,3217,3218],{"class":690},"$",[511,3220,3221],{"class":521},"host",[511,3223,862],{"class":690},[511,3225,3226,3228,3231,3233,3236],{"class":513,"line":628},[511,3227,3212],{"class":772},[511,3229,3230],{"class":521},"x-real-ip ",[511,3232,3218],{"class":690},[511,3234,3235],{"class":521},"remote_addr",[511,3237,862],{"class":690},[511,3239,3240,3242,3245,3247,3250],{"class":513,"line":654},[511,3241,3212],{"class":772},[511,3243,3244],{"class":521},"x-forwarded-for ",[511,3246,3218],{"class":690},[511,3248,3249],{"class":521},"proxy_add_x_forwarded_for",[511,3251,862],{"class":690},[511,3253,3254,3256,3259],{"class":513,"line":660},[511,3255,3212],{"class":772},[511,3257,3258],{"class":521},"x-forwarded-proto https",[511,3260,862],{"class":690},[511,3262,3263,3266,3269],{"class":513,"line":1005},[511,3264,3265],{"class":772},"        proxy_pass ",[511,3267,3268],{"class":521},"http:\u002F\u002Flocalhost:12368",[511,3270,862],{"class":690},[511,3272,3273],{"class":513,"line":1028},[511,3274,1355],{"class":521},[511,3276,3277],{"class":513,"line":1071},[511,3278,1814],{"class":521},[32,3280,3281,3282,3285,3286,3291],{},"其中 ",[81,3283,3284],{},"proxy_set_header x-forwarded-proto https;","很重要，如果不加的话，当启动 docker 设置 url 为 https 开头的地址时，就会陷入重定向循环，这个问题困扰了我很久，最终在",[58,3287,3290],{"href":3288,"rel":3289},"https:\u002F\u002Fgithub.com\u002FTryGhost\u002FGhost\u002Fissues\u002F2796",[62],"这个 issue","里找到了答案。",[28,3293,3294],{"id":3294},"创建数据镜像",[503,3296,3298],{"className":1564,"code":3297,"language":1566,"meta":406,"style":406},"docker create -v \u002Fsrv\u002Fghost\u002Fhadb.me:\u002Fvar\u002Flib\u002Fghost\u002Fcontent --name ghost-hadb-me-data ubuntu:16.04\n",[81,3299,3300],{"__ignoreMap":406},[511,3301,3302,3305,3308,3311,3314,3317,3320],{"class":513,"line":514},[511,3303,3304],{"class":1573},"docker",[511,3306,3307],{"class":517}," create",[511,3309,3310],{"class":1583}," -v",[511,3312,3313],{"class":517}," \u002Fsrv\u002Fghost\u002Fhadb.me:\u002Fvar\u002Flib\u002Fghost\u002Fcontent",[511,3315,3316],{"class":1583}," --name",[511,3318,3319],{"class":517}," ghost-hadb-me-data",[511,3321,3322],{"class":517}," ubuntu:16.04\n",[28,3324,3326],{"id":3325},"启动-docker","启动 docker",[503,3328,3330],{"className":1564,"code":3329,"language":1566,"meta":406,"style":406},"sudo docker run --detach \\\n    --name ghost-hadb-me \\\n    --env url=https:\u002F\u002Fhadb.me\u002F \\\n    --publish 12368:2368 \\\n    --volumes-from ghost-hadb-me-data \\\n    --tty \\\n    ghost:latest\n",[81,3331,3332,3348,3358,3368,3378,3387,3394],{"__ignoreMap":406},[511,3333,3334,3337,3340,3343,3346],{"class":513,"line":514},[511,3335,3336],{"class":1573},"sudo",[511,3338,3339],{"class":517}," docker",[511,3341,3342],{"class":517}," run",[511,3344,3345],{"class":1583}," --detach",[511,3347,3062],{"class":768},[511,3349,3350,3353,3356],{"class":513,"line":407},[511,3351,3352],{"class":1583},"    --name",[511,3354,3355],{"class":517}," ghost-hadb-me",[511,3357,3062],{"class":768},[511,3359,3360,3363,3366],{"class":513,"line":410},[511,3361,3362],{"class":1583},"    --env",[511,3364,3365],{"class":517}," url=https:\u002F\u002Fhadb.me\u002F",[511,3367,3062],{"class":768},[511,3369,3370,3373,3376],{"class":513,"line":578},[511,3371,3372],{"class":1583},"    --publish",[511,3374,3375],{"class":517}," 12368:2368",[511,3377,3062],{"class":768},[511,3379,3380,3383,3385],{"class":513,"line":584},[511,3381,3382],{"class":1583},"    --volumes-from",[511,3384,3319],{"class":517},[511,3386,3062],{"class":768},[511,3388,3389,3392],{"class":513,"line":589},[511,3390,3391],{"class":1583},"    --tty",[511,3393,3062],{"class":768},[511,3395,3396],{"class":513,"line":598},[511,3397,3398],{"class":517},"    ghost:latest\n",[32,3400,3401],{},"几行命令，Done！就可以开始愉快的写博客啦！哈哈哈哈哈！😃",[711,3403,3404],{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":406,"searchDepth":407,"depth":407,"links":3406},[3407,3408,3409,3410],{"id":3040,"depth":410,"text":3040},{"id":3101,"depth":410,"text":3102},{"id":3294,"depth":410,"text":3294},{"id":3325,"depth":410,"text":3326},"2017-10-10",{},"\u002Fposts\u002F2017\u002Fusing-ghost",{"text":2803,"minutes":3415,"time":3416,"words":3417},3.1,186000,620,{"title":3010,"description":3015},{"loc":3413},"posts\u002F2017\u002F20171010.using-ghost",[430,429,728],"aQh0LmH4L7dkjrMd97oz4c-PPl_DvBo7RQ3snUK00OM",{"id":3424,"title":3425,"body":3426,"class":413,"cover":413,"coverSize":413,"date":3433,"description":3430,"draft":415,"extension":416,"hideComments":415,"location":413,"meta":3434,"navigation":418,"path":3435,"readingTime":3436,"seo":3439,"sitemap":3440,"stem":3441,"tags":3442,"time":413,"weather":413,"__hash__":3443},"posts\u002Fposts\u002F2016\u002F20160719.hexo-with-travis-ci.md","使用 Travis CI 自动部署 Hexo",{"type":25,"value":3427,"toc":3431},[3428],[32,3429,3430],{},"先占个坑，有空写教程。",{"title":406,"searchDepth":407,"depth":407,"links":3432},[],"2016-07-19",{},"\u002Fposts\u002F2016\u002Fhexo-with-travis-ci",{"text":2833,"minutes":3437,"time":3438,"words":609},0.045,2700,{"title":3425,"description":3430},{"loc":3435},"posts\u002F2016\u002F20160719.hexo-with-travis-ci",[491,429],"G9idRED7gYRHZtG067jMPWNpFNP49qC-5XxGnVQhGwg",{"id":3445,"title":3446,"body":3447,"class":413,"cover":413,"coverSize":413,"date":3621,"description":3451,"draft":415,"extension":416,"hideComments":415,"location":413,"meta":3622,"navigation":418,"path":3623,"readingTime":3624,"seo":3629,"sitemap":3630,"stem":3631,"tags":3632,"time":413,"weather":413,"__hash__":3633},"posts\u002Fposts\u002F2015\u002F20150130.use-custom-domain-for-hexo-on-github.md","在 GitHub 上为 Hexo 配置自定义域名",{"type":25,"value":3448,"toc":3619},[3449,3452,3470,3479,3482,3519,3609,3616],[32,3450,3451],{},"昨天尝试了下 Hexo，感觉很酷。主要有以下几个特点：",[51,3453,3454,3457,3460,3467],{},[54,3455,3456],{},"无需数据库，所有文章都可以基于 git 来存储",[54,3458,3459],{},"纯静态，在编写好文章之后，生成静态文件，对服务器基本没要求",[54,3461,3462,3463,3466],{},"部署简单，",[81,3464,3465],{},"hexo generate --deploy","，轻松完成生成、部署功能",[54,3468,3469],{},"主题丰富，界面简洁，相比臃肿的 WordPress，爽多了",[32,3471,3472,3473,3478],{},"安装很简单，按照",[58,3474,3477],{"href":3475,"rel":3476},"http:\u002F\u002Fhexo.io\u002Fdocs\u002F",[62],"这里","的教程，进行就可以了。前提是确保 npm 和 git 功能都能用就行。我主要分享一下在配置自定义域名所遇到的问题。",[32,3480,3481],{},"我是将其部署到 GitHub 上的，没有采用 hadb.github.io 作为 repo 名，因为我是想将网站叫做 HADB.ME，所以我就创建了一个 HADB.ME 的 repo。这和使用 hadb.github.io 有点区别。",[32,3483,3484,3485,3487,3488,3490,3491,3494,3495,3498,3499,3501,3502,3506,3507,3510,3511,3514,3515,3518],{},"使用 hadb.github.io 的话，master 分支是作为页面显示的分支的，而使用 HADB.ME 的话，是使用 ph-pages 分支作为显示的分支的。这时，只需在 ph-pages 分支的根目录放一个 CNAME 文件，内容就是",[81,3486,472],{},"，然后将域名 cname 到 hadb.github.io，github 会自动判断出 HADB.ME 这个项目中有一个 CNAME，里面就是配的",[81,3489,472],{},"，于是",[58,3492,472],{"href":2983,"rel":3493},[62],"就成功地变成了 HADB.ME 项目页面的域名了。这时，我们在_config.yml 中，就可以将 url 配为",[81,3496,3497],{},"http:\u002F\u002Fhadb.me\u002F","，root 为",[81,3500,6],{},"。当然，这样会有一个问题，就是直接访问 ",[58,3503,3504],{"href":3504,"rel":3505},"http:\u002F\u002Fhadb.github.io\u002FHADB.ME\u002F",[62]," 的时候，无法显示样式。这个可以这样解决，当访问路径是 ",[58,3508,3504],{"href":3504,"rel":3509},[62]," 时，通过 js 直接跳转到 ",[58,3512,2983],{"href":2983,"rel":3513},[62]," 上就可以了，在主题的 head.ejs 文件中，",[81,3516,3517],{},"\u003C\u002Fhead>","前加入如下代码：",[503,3520,3524],{"className":3521,"code":3522,"language":3523,"meta":406,"style":406},"language-html shiki shiki-themes material-theme-lighter github-light github-dark","\u003Cscript>\n  \u002F\u002F Redirect to hadb.me\n  if (window.location.hostname === 'hadb.github.io') {\n    window.location.href = 'http:\u002F\u002Fhadb.me\u002F'\n  }\n\u003C\u002Fscript>\n","html",[81,3525,3526,3537,3542,3574,3596,3600],{"__ignoreMap":406},[511,3527,3528,3531,3534],{"class":513,"line":514},[511,3529,3530],{"class":690},"\u003C",[511,3532,3533],{"class":686},"script",[511,3535,3536],{"class":690},">\n",[511,3538,3539],{"class":513,"line":407},[511,3540,3541],{"class":1112},"  \u002F\u002F Redirect to hadb.me\n",[511,3543,3544,3547,3550,3552,3555,3557,3560,3563,3565,3568,3570,3572],{"class":513,"line":410},[511,3545,3546],{"class":890},"  if",[511,3548,3549],{"class":521}," (window",[511,3551,529],{"class":690},[511,3553,3554],{"class":521},"location",[511,3556,529],{"class":690},[511,3558,3559],{"class":521},"hostname ",[511,3561,3562],{"class":772},"===",[511,3564,985],{"class":783},[511,3566,3567],{"class":517},"hadb.github.io",[511,3569,784],{"class":783},[511,3571,1131],{"class":521},[511,3573,941],{"class":690},[511,3575,3576,3579,3581,3583,3585,3588,3590,3592,3594],{"class":513,"line":578},[511,3577,3578],{"class":521},"    window",[511,3580,529],{"class":690},[511,3582,3554],{"class":521},[511,3584,529],{"class":690},[511,3586,3587],{"class":521},"href",[511,3589,773],{"class":772},[511,3591,985],{"class":783},[511,3593,3497],{"class":517},[511,3595,991],{"class":783},[511,3597,3598],{"class":513,"line":584},[511,3599,1462],{"class":690},[511,3601,3602,3605,3607],{"class":513,"line":589},[511,3603,3604],{"class":690},"\u003C\u002F",[511,3606,3533],{"class":686},[511,3608,3536],{"class":690},[32,3610,3611,3612,3615],{},"还有一个问题是，每当我在 ph-pages 中创建一个 CNAME，每次 hexo deploy 之后，ph-pages 中的 commit 历史会重建，CNAME 文件就丢失了，为此我很苦恼。后来发现，只需要将 CNAME 文件放到",[81,3613,3614],{},"source","文件夹下，就可以了，每次 deploy 会自动放到根目录。",[711,3617,3618],{},"html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":406,"searchDepth":407,"depth":407,"links":3620},[],"2015-01-30",{},"\u002Fposts\u002F2015\u002Fuse-custom-domain-for-hexo-on-github",{"text":3625,"minutes":3626,"time":3627,"words":3628},"3 min read",2.45,147000,490,{"title":3446,"description":3451},{"loc":3623},"posts\u002F2015\u002F20150130.use-custom-domain-for-hexo-on-github",[491,429],"PZTpx1YHK4BkGPdXvLtboiqmxK-mvftqlLbF4_jsFT4",{"id":3635,"title":3636,"body":3637,"class":413,"cover":413,"coverSize":413,"date":3673,"description":406,"draft":415,"extension":416,"hideComments":415,"location":413,"meta":3674,"navigation":418,"path":3675,"readingTime":3676,"seo":3679,"sitemap":3680,"stem":3681,"tags":3682,"time":413,"weather":413,"__hash__":3683},"posts\u002Fposts\u002F2015\u002F20150128.hadb-me-back.md","HADB.ME 归来！",{"type":25,"value":3638,"toc":3671},[3639,3652,3659,3662,3665,3668],[503,3640,3642],{"className":1564,"code":3641,"language":1566,"meta":406,"style":406},"Hello, World!\n",[81,3643,3644],{"__ignoreMap":406},[511,3645,3646,3649],{"class":513,"line":514},[511,3647,3648],{"class":1573},"Hello,",[511,3650,3651],{"class":517}," World!\n",[32,3653,3654,3655,3658],{},"重新注册了",[58,3656,472],{"href":2983,"rel":3657},[62],"域名，决定用 Hexo 重建个人博客，部署在 GitHub 上。",[32,3660,3661],{},"感觉 Hexo 很酷！不过安装以及部署中也遇到了不少问题，过段时间写个教程。",[32,3663,3664],{},"今天先到这里，下班！",[32,3666,3667],{},"Cool! YDS!",[711,3669,3670],{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":406,"searchDepth":407,"depth":407,"links":3672},[],"2015-01-28",{},"\u002Fposts\u002F2015\u002Fhadb-me-back",{"text":2833,"minutes":3677,"time":3678,"words":2511},0.325,19500,{"title":3636,"description":406},{"loc":3675},"posts\u002F2015\u002F20150128.hadb-me-back",[430,429],"rLj-k8JXDQ583M1Bosfn1pvSssQy2PeAH8s6CJltJ0w",{"id":3685,"title":3686,"body":3687,"class":413,"cover":413,"coverSize":413,"date":4136,"description":406,"draft":415,"extension":416,"hideComments":415,"location":413,"meta":4137,"navigation":418,"path":4138,"readingTime":4139,"seo":4143,"sitemap":4144,"stem":4145,"tags":4146,"time":413,"weather":413,"__hash__":4147},"posts\u002Fposts\u002F2013\u002F20130510.post-views-for-wordpress-themes.md","为 WordPress 主题添加阅读统计的功能",{"type":25,"value":3688,"toc":4134},[3689,3692,3695,3698,3701,4121,4124,4131],[453,3690],{"filename":3691},"cover.png",[32,3693,3694],{},"今天为星际 2 战术资源站和本博客的主题添加了一个阅读统计的功能，效果如下图：",[453,3696],{"filename":456,"description":3697},"阅读统计效果",[32,3699,3700],{},"我是采用子主题的方式，在子主题中添加 functions.php 文件，在里面加入下面两个函数：",[503,3702,3706],{"className":3703,"code":3704,"language":3705,"meta":406,"style":406},"language-php shiki shiki-themes material-theme-lighter github-light github-dark","\u003C?php\n\u002F* 访问计数 *\u002F\nfunction record_visitors()\n{\n    if (is_singular())\n    {\n        global $post;\n        $post_ID = $post->ID;\n        if($post_ID)\n        {\n            $post_views = (int)get_post_meta($post_ID, 'views', true);\n            if(!update_post_meta($post_ID, 'views', ($post_views+1)))\n            {\n                add_post_meta($post_ID, 'views', 1, true);\n            }\n        }\n    }\n}\nadd_action('wp_head', 'record_visitors');\n\n\u002F* 取得文章的阅读次数 *\u002F\nfunction post_views($echo = 1)\n{\n    global $post;\n    $post_ID = $post->ID;\n    $views = (int)get_post_meta($post_ID, 'views', true);\n    if ($echo) return '阅读:'. number_format($views). '次';\n    else return $views;\n}\n?>\n","php",[81,3707,3708,3716,3721,3730,3734,3745,3750,3763,3785,3798,3803,3843,3883,3888,3916,3921,3926,3930,3934,3959,3963,3968,3986,3990,4001,4020,4055,4099,4112,4116],{"__ignoreMap":406},[511,3709,3710,3713],{"class":513,"line":514},[511,3711,3712],{"class":772},"\u003C?",[511,3714,3715],{"class":768},"php\n",[511,3717,3718],{"class":513,"line":407},[511,3719,3720],{"class":1112},"\u002F* 访问计数 *\u002F\n",[511,3722,3723,3725,3728],{"class":513,"line":410},[511,3724,1823],{"class":764},[511,3726,3727],{"class":776}," record_visitors",[511,3729,2390],{"class":690},[511,3731,3732],{"class":513,"line":578},[511,3733,941],{"class":690},[511,3735,3736,3738,3740,3743],{"class":513,"line":584},[511,3737,1119],{"class":890},[511,3739,1122],{"class":690},[511,3741,3742],{"class":776},"is_singular",[511,3744,1524],{"class":690},[511,3746,3747],{"class":513,"line":589},[511,3748,3749],{"class":690},"    {\n",[511,3751,3752,3755,3758,3761],{"class":513,"line":598},[511,3753,3754],{"class":764},"        global",[511,3756,3757],{"class":690}," $",[511,3759,3760],{"class":521},"post",[511,3762,862],{"class":690},[511,3764,3765,3768,3771,3773,3775,3777,3780,3783],{"class":513,"line":604},[511,3766,3767],{"class":690},"        $",[511,3769,3770],{"class":521},"post_ID ",[511,3772,2483],{"class":772},[511,3774,3757],{"class":690},[511,3776,3760],{"class":521},[511,3778,3779],{"class":772},"->",[511,3781,3782],{"class":521},"ID",[511,3784,862],{"class":690},[511,3786,3787,3790,3793,3796],{"class":513,"line":609},[511,3788,3789],{"class":890},"        if",[511,3791,3792],{"class":690},"($",[511,3794,3795],{"class":521},"post_ID",[511,3797,792],{"class":690},[511,3799,3800],{"class":513,"line":617},[511,3801,3802],{"class":690},"        {\n",[511,3804,3805,3808,3811,3813,3815,3818,3820,3823,3825,3827,3829,3831,3834,3836,3838,3840],{"class":513,"line":623},[511,3806,3807],{"class":690},"            $",[511,3809,3810],{"class":521},"post_views ",[511,3812,2483],{"class":772},[511,3814,1122],{"class":690},[511,3816,3817],{"class":764},"int",[511,3819,859],{"class":690},[511,3821,3822],{"class":776},"get_post_meta",[511,3824,3792],{"class":690},[511,3826,3795],{"class":521},[511,3828,1059],{"class":690},[511,3830,985],{"class":783},[511,3832,3833],{"class":517},"views",[511,3835,784],{"class":783},[511,3837,1059],{"class":690},[511,3839,1874],{"class":525},[511,3841,3842],{"class":690},");\n",[511,3844,3845,3848,3850,3852,3855,3857,3859,3861,3863,3865,3867,3869,3872,3875,3878,3880],{"class":513,"line":628},[511,3846,3847],{"class":890},"            if",[511,3849,780],{"class":690},[511,3851,1125],{"class":772},[511,3853,3854],{"class":776},"update_post_meta",[511,3856,3792],{"class":690},[511,3858,3795],{"class":521},[511,3860,1059],{"class":690},[511,3862,985],{"class":783},[511,3864,3833],{"class":517},[511,3866,784],{"class":783},[511,3868,1059],{"class":690},[511,3870,3871],{"class":690}," ($",[511,3873,3874],{"class":521},"post_views",[511,3876,3877],{"class":772},"+",[511,3879,541],{"class":1509},[511,3881,3882],{"class":690},")))\n",[511,3884,3885],{"class":513,"line":654},[511,3886,3887],{"class":690},"            {\n",[511,3889,3890,3893,3895,3897,3899,3901,3903,3905,3907,3910,3912,3914],{"class":513,"line":660},[511,3891,3892],{"class":776},"                add_post_meta",[511,3894,3792],{"class":690},[511,3896,3795],{"class":521},[511,3898,1059],{"class":690},[511,3900,985],{"class":783},[511,3902,3833],{"class":517},[511,3904,784],{"class":783},[511,3906,1059],{"class":690},[511,3908,3909],{"class":1509}," 1",[511,3911,1059],{"class":690},[511,3913,1874],{"class":525},[511,3915,3842],{"class":690},[511,3917,3918],{"class":513,"line":1005},[511,3919,3920],{"class":690},"            }\n",[511,3922,3923],{"class":513,"line":1028},[511,3924,3925],{"class":690},"        }\n",[511,3927,3928],{"class":513,"line":1071},[511,3929,1355],{"class":690},[511,3931,3932],{"class":513,"line":1076},[511,3933,1814],{"class":690},[511,3935,3936,3939,3941,3943,3946,3948,3950,3952,3955,3957],{"class":513,"line":1104},[511,3937,3938],{"class":776},"add_action",[511,3940,780],{"class":690},[511,3942,784],{"class":783},[511,3944,3945],{"class":517},"wp_head",[511,3947,784],{"class":783},[511,3949,1059],{"class":690},[511,3951,985],{"class":783},[511,3953,3954],{"class":517},"record_visitors",[511,3956,784],{"class":783},[511,3958,3842],{"class":690},[511,3960,3961],{"class":513,"line":1109},[511,3962,575],{"emptyLinePlaceholder":418},[511,3964,3965],{"class":513,"line":1116},[511,3966,3967],{"class":1112},"\u002F* 取得文章的阅读次数 *\u002F\n",[511,3969,3970,3972,3975,3977,3980,3982,3984],{"class":513,"line":1136},[511,3971,1823],{"class":764},[511,3973,3974],{"class":776}," post_views",[511,3976,3792],{"class":690},[511,3978,3979],{"class":521},"echo ",[511,3981,2483],{"class":772},[511,3983,3909],{"class":1509},[511,3985,792],{"class":690},[511,3987,3988],{"class":513,"line":1181},[511,3989,941],{"class":690},[511,3991,3992,3995,3997,3999],{"class":513,"line":1206},[511,3993,3994],{"class":764},"    global",[511,3996,3757],{"class":690},[511,3998,3760],{"class":521},[511,4000,862],{"class":690},[511,4002,4003,4006,4008,4010,4012,4014,4016,4018],{"class":513,"line":1238},[511,4004,4005],{"class":690},"    $",[511,4007,3770],{"class":521},[511,4009,2483],{"class":772},[511,4011,3757],{"class":690},[511,4013,3760],{"class":521},[511,4015,3779],{"class":772},[511,4017,3782],{"class":521},[511,4019,862],{"class":690},[511,4021,4022,4024,4027,4029,4031,4033,4035,4037,4039,4041,4043,4045,4047,4049,4051,4053],{"class":513,"line":1249},[511,4023,4005],{"class":690},[511,4025,4026],{"class":521},"views ",[511,4028,2483],{"class":772},[511,4030,1122],{"class":690},[511,4032,3817],{"class":764},[511,4034,859],{"class":690},[511,4036,3822],{"class":776},[511,4038,3792],{"class":690},[511,4040,3795],{"class":521},[511,4042,1059],{"class":690},[511,4044,985],{"class":783},[511,4046,3833],{"class":517},[511,4048,784],{"class":783},[511,4050,1059],{"class":690},[511,4052,1874],{"class":525},[511,4054,3842],{"class":690},[511,4056,4057,4059,4061,4064,4066,4069,4071,4074,4076,4078,4082,4084,4086,4088,4090,4092,4095,4097],{"class":513,"line":1254},[511,4058,1119],{"class":890},[511,4060,3871],{"class":690},[511,4062,4063],{"class":521},"echo",[511,4065,859],{"class":690},[511,4067,4068],{"class":890}," return",[511,4070,985],{"class":783},[511,4072,4073],{"class":517},"阅读:",[511,4075,784],{"class":783},[511,4077,529],{"class":772},[511,4079,4081],{"class":4080},"sptTA"," number_format",[511,4083,3792],{"class":690},[511,4085,3833],{"class":521},[511,4087,859],{"class":690},[511,4089,529],{"class":772},[511,4091,985],{"class":783},[511,4093,4094],{"class":517},"次",[511,4096,784],{"class":783},[511,4098,862],{"class":690},[511,4100,4101,4104,4106,4108,4110],{"class":513,"line":1260},[511,4102,4103],{"class":890},"    else",[511,4105,4068],{"class":890},[511,4107,3757],{"class":690},[511,4109,3833],{"class":521},[511,4111,862],{"class":690},[511,4113,4114],{"class":513,"line":1352},[511,4115,1814],{"class":690},[511,4117,4118],{"class":513,"line":1358},[511,4119,4120],{"class":772},"?>\n",[32,4122,4123],{},"这段代码是网上找的，不过我进行了一些小修改，原先它返回是用的 echo，会导致显示效果的问题，而是用 return 就没有问题，之前检查了半天才发现这个问题。",[32,4125,4126,4127,4130],{},"然后在需要输出阅读次数的地方调用",[81,4128,4129],{},"post_views()","就可以了。不同的主题调用的地方和方法有些不一样，这个需要大家自己调试才行。",[711,4132,4133],{},"html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sptTA, html code.shiki .sptTA{--shiki-light:#6182B8;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":406,"searchDepth":407,"depth":407,"links":4135},[],"2013-05-10",{},"\u002Fposts\u002F2013\u002Fpost-views-for-wordpress-themes",{"text":483,"minutes":4140,"time":4141,"words":4142},1.275,76500,255,{"title":3686,"description":406},{"loc":4138},"posts\u002F2013\u002F20130510.post-views-for-wordpress-themes",[429],"xlX_YBeA3dqYPO4cqo3s4h4RrSMIdvEa-GPE0MzV_U0",{"id":4149,"title":4150,"body":4151,"class":413,"cover":413,"coverSize":413,"date":4245,"description":4155,"draft":415,"extension":416,"hideComments":415,"location":413,"meta":4246,"navigation":418,"path":4247,"readingTime":4248,"seo":4252,"sitemap":4253,"stem":4254,"tags":4255,"time":413,"weather":413,"__hash__":4256},"posts\u002Fposts\u002F2012\u002F20120623.website-change-and-seo.md","进一步完善了网站结构并做了一些 SEO 优化",{"type":25,"value":4152,"toc":4243},[4153,4156,4225,4228,4231,4234,4237,4240],[32,4154,4155],{},"早上起来也没闲着，打开百度、谷歌，搜搜“好易思特”，看看收录情况如何，感觉还是不大给力，并没有达到我的要求。仔细反思反思，感觉还是没有做 SEO 优化的问题，之前看到过一些文章，并没有在意。我一直是拿“陌陌”的主页来学习借鉴的，发现，在百度搜索“陌陌”的时候，它的网站链接下面有一段说明文字，是“陌陌（momo）是一款基于地理位置的移动社交工具，你可以通过陌陌……”之类之类的，我打开它的首页，并没有发现这段文字，很纳闷，于是看它网页的源码，发现了这两个标签：",[503,4157,4159],{"className":3521,"code":4158,"language":3523,"meta":406,"style":406},"\u003Cmeta name=\"keywords\" content=\"XXX\" \u002F>\n\u003Cmeta name=\"description\" content=\"XXX\" \u002F>\n",[81,4160,4161,4196],{"__ignoreMap":406},[511,4162,4163,4165,4168,4172,4174,4176,4179,4181,4184,4186,4188,4191,4193],{"class":513,"line":514},[511,4164,3530],{"class":690},[511,4166,4167],{"class":686},"meta",[511,4169,4171],{"class":4170},"s9AJx"," name",[511,4173,2483],{"class":690},[511,4175,2570],{"class":783},[511,4177,4178],{"class":517},"keywords",[511,4180,2570],{"class":783},[511,4182,4183],{"class":4170}," content",[511,4185,2483],{"class":690},[511,4187,2570],{"class":783},[511,4189,4190],{"class":517},"XXX",[511,4192,2570],{"class":783},[511,4194,4195],{"class":690}," \u002F>\n",[511,4197,4198,4200,4202,4204,4206,4208,4211,4213,4215,4217,4219,4221,4223],{"class":513,"line":407},[511,4199,3530],{"class":690},[511,4201,4167],{"class":686},[511,4203,4171],{"class":4170},[511,4205,2483],{"class":690},[511,4207,2570],{"class":783},[511,4209,4210],{"class":517},"description",[511,4212,2570],{"class":783},[511,4214,4183],{"class":4170},[511,4216,2483],{"class":690},[511,4218,2570],{"class":783},[511,4220,4190],{"class":517},[511,4222,2570],{"class":783},[511,4224,4195],{"class":690},[32,4226,4227],{},"于是，一切都懂了！赶紧给自己也加了下，以便以后百度收录的时候可以显示出来。",[32,4229,4230],{},"另外，还给网站加了下 favicon，之前用插件加过一次，但是发现兼容性不行，在 IE 里是不能显示的，于是直接自己做了两个 ico 文件，放在目录下了。呵呵，感觉还是蛮好看的。",[32,4232,4233],{},"另外，尝试着添加了个 Google Analytics 功能，待会儿看看效果怎么样。",[32,4235,4236],{},"对了，所有文章的链接地址也都改变了，改成以文章名为地址，据说这样对搜索引擎更友好。",[32,4238,4239],{},"OK，去吃午饭！",[711,4241,4242],{},"html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .s9AJx, html code.shiki .s9AJx{--shiki-light:#9C3EDA;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":406,"searchDepth":407,"depth":407,"links":4244},[],"2012-06-23",{},"\u002Fposts\u002F2012\u002Fwebsite-change-and-seo",{"text":483,"minutes":4249,"time":4250,"words":4251},1.845,110700,369,{"title":4150,"description":4155},{"loc":4247},"posts\u002F2012\u002F20120623.website-change-and-seo",[491,429],"-3iQgogC9nc6FFVwy3EhphC6L715sICdOvOqWnqIAMo",1777579134033]