-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
14 lines (14 loc) · 29.2 KB
/
Copy pathindex.html
File metadata and controls
14 lines (14 loc) · 29.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE HTML><html lang="zh-CN"><head><meta charset="utf-8"><script>!function(){var t=document.documentElement;setTimeout((function(){t.style.visibility="",t.style.opacity=""}),1e4)}()</script><link rel="preconnect" href="https://yanxai.com"><link rel="preload" as="image" href="/medias/featureimages/16.webp" fetchpriority="high"><link rel="preload" as="image" href="/medias/cat-logo.svg" fetchpriority="high"><meta name="keywords" content="blog"><meta name="description" content="记录可信 AI 应用工程、项目复盘与长期成长"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="renderer" content="webkit|ie-stand|ie-comp"><meta name="mobile-web-app-capable" content="yes"><meta name="format-detection" content="telephone=no"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><meta name="referrer" content="no-referrer-when-downgrade"><title>RyanCoreAI</title><link rel="alternate" type="application/atom+xml" title="RyanCoreAI" href="/atom.xml"><link rel="alternate" type="application/rss+xml" title="RyanCoreAI" href="/rss.xml"><meta property="og:type" content="website"><meta property="og:title" content="RyanCoreAI"><meta property="og:description" content="记录可信 AI 应用工程、项目复盘与长期成长"><meta property="og:url" content="https://yanxai.com/index.html"><link rel="canonical" href="https://yanxai.com/index.html"><meta property="og:image" content="https://yanxai.com/medias/cat-logo.svg"><meta property="og:site_name" content="RyanCoreAI"><meta property="og:locale" content="zh-CN"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="RyanCoreAI"><meta name="twitter:description" content="记录可信 AI 应用工程、项目复盘与长期成长"><meta name="twitter:image" content="https://yanxai.com/medias/cat-logo.svg"><link rel="icon" type="image/svg+xml" href="/medias/cat-logo.svg"><style>.carousel-control{width:45px;height:45px;line-height:55px;border-radius:45px;background:0 0;cursor:pointer;z-index:100}#prev-cover{position:absolute;top:48%;left:8px}#next-cover{position:absolute;top:48%;right:8px}#prev-cover i{margin-right:3px}#next-cover i{margin-left:3px}.carousel-control:hover{background-color:rgba(0,0,0,.4)}.carousel-control i{color:#fff;font-size:2.4rem}</style><link rel="stylesheet" type="text/css" href="/libs/awesome/css/all.min.css" media="print" onload='this.media="all"'><link rel="stylesheet" type="text/css" href="/libs/materialize/materialize.min.css"><link rel="stylesheet" type="text/css" href="/libs/aos/aos.css" media="print" onload='this.media="all"'><link rel="stylesheet" type="text/css" href="/libs/animate/animate.min.css" media="print" onload='this.media="all"'><link rel="stylesheet" type="text/css" href="/libs/lightGallery/css/lightgallery.min.css" media="print" onload='this.media="all"'><link rel="stylesheet" type="text/css" href="/css/matery.css"><link rel="stylesheet" type="text/css" href="/css/my.css"><link rel="stylesheet" type="text/css" href="/css/dark.css" media="none" onload='"all"!=this.media&&(this.media="all")'><link rel="stylesheet" href="/libs/tocbot/tocbot.css"><link rel="stylesheet" href="/css/post.css"><style>.github-emoji{position:relative;display:inline-block;width:1.2em;min-height:1.2em;overflow:hidden;vertical-align:top;color:transparent}.github-emoji>span{position:relative;z-index:10}.github-emoji .fancybox,.github-emoji img{margin:0!important;padding:0!important;border:none!important;outline:0!important;text-decoration:none!important;user-select:none!important;cursor:auto!important}.github-emoji img{height:1.2em!important;width:1.2em!important;position:absolute!important;left:50%!important;top:50%!important;transform:translate(-50%,-50%)!important;user-select:none!important;cursor:auto!important}.github-emoji-fallback{color:inherit}.github-emoji-fallback img{opacity:0!important}</style></head><body><header class="navbar-fixed"><nav id="headNav" class="bg-color nav-transparent"><div id="navContainer" class="nav-wrapper container"><div class="brand-logo"><a href="/" class="waves-effect waves-light"><img src="/medias/cat-logo.svg" class="logo-img" alt="LOGO"> <span class="logo-span">RyanCoreAI</span></a></div><a href="#" data-target="mobile-nav" class="sidenav-trigger button-collapse"><i class="fas fa-bars"></i></a><ul class="right nav-menu"><li class="hide-on-med-and-down nav-item"><a href="/" class="waves-effect waves-light"><i class="fas fa-home" style="zoom:.6"></i> <span>首页</span></a></li><li class="hide-on-med-and-down nav-item"><a href="/categories" class="waves-effect waves-light"><i class="fas fa-bookmark" style="zoom:.6"></i> <span>分类</span></a></li><li class="hide-on-med-and-down nav-item"><a href="/about" class="waves-effect waves-light"><i class="fas fa-user-circle" style="zoom:.6"></i> <span>关于</span></a></li><li class="hide-on-med-and-down nav-item"><a href="/projects" class="waves-effect waves-light"><i class="fas fa-project-diagram" style="zoom:.6"></i> <span>项目</span></a></li><li class="hide-on-med-and-down nav-item"><a href="/tags" class="waves-effect waves-light"><i class="fas fa-tags" style="zoom:.6"></i> <span>标签</span></a></li><li class="hide-on-med-and-down nav-item"><a href="/archives" class="waves-effect waves-light"><i class="fas fa-archive" style="zoom:.6"></i> <span>归档</span></a></li><li class="hide-on-med-and-down nav-item"><a href="/contact" class="waves-effect waves-light"><i class="fas fa-comments" style="zoom:.6"></i> <span>反馈</span></a></li><li class="hide-on-med-and-down nav-item"><a href="/friends" class="waves-effect waves-light"><i class="fas fa-address-book" style="zoom:.6"></i> <span>友情链接</span></a></li><li><a href="#searchModal" class="modal-trigger waves-effect waves-light"><i id="searchIcon" class="fas fa-search" title="搜索" style="zoom:.85"></i></a></li><li><a href="javascript:;" class="waves-effect waves-light" onclick="switchNightMode()" title="深色/浅色模式"><i id="sum-moon-icon" class="fas fa-sun" style="zoom:.85"></i></a></li></ul><div id="mobile-nav" class="side-nav sidenav"><div class="mobile-head bg-color"><img src="/medias/cat-logo.svg" class="logo-img circle responsive-img"><div class="logo-name">RyanCoreAI</div><div class="logo-desc">记录可信 AI 应用工程、项目复盘与长期成长</div></div><ul class="menu-list mobile-menu-list"><li class="m-nav-item"><a href="/" class="waves-effect waves-light"><i class="fa-fw fas fa-home"></i> 首页</a></li><li class="m-nav-item"><a href="/categories" class="waves-effect waves-light"><i class="fa-fw fas fa-bookmark"></i> 分类</a></li><li class="m-nav-item"><a href="/about" class="waves-effect waves-light"><i class="fa-fw fas fa-user-circle"></i> 关于</a></li><li class="m-nav-item"><a href="/projects" class="waves-effect waves-light"><i class="fa-fw fas fa-project-diagram"></i> 项目</a></li><li class="m-nav-item"><a href="/tags" class="waves-effect waves-light"><i class="fa-fw fas fa-tags"></i> 标签</a></li><li class="m-nav-item"><a href="/archives" class="waves-effect waves-light"><i class="fa-fw fas fa-archive"></i> 归档</a></li><li class="m-nav-item"><a href="/contact" class="waves-effect waves-light"><i class="fa-fw fas fa-comments"></i> 反馈</a></li><li class="m-nav-item"><a href="/friends" class="waves-effect waves-light"><i class="fa-fw fas fa-address-book"></i> 友情链接</a></li><li><div class="divider"></div></li><li><a href="https://github.com/RyanCoreAI" class="waves-effect waves-light" target="_blank"><i class="fab fa-github-square fa-fw"></i>Github</a></li></ul></div></div><style>.nav-transparent .github-corner{display:none!important}.github-corner{position:absolute;z-index:10;top:0;right:0;border:0;transform:scale(1.1)}.github-corner svg{color:#8b5cf6;fill:#fff;height:64px;width:64px}.github-corner:hover .octo-arm{animation:a .56s ease-in-out}.github-corner .octo-arm{animation:none}@keyframes a{0%,to{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}</style><a href="https://github.com/RyanCoreAI" class="github-corner tooltipped hide-on-med-and-down" target="_blank" data-tooltip="Github" data-position="left" data-delay="50"><svg viewBox="0 0 250 250" aria-hidden="true"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin:130px 106px" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg></a></nav></header><div class="index-cover" style="position:relative;margin-top:-64px;overflow:hidden"><div class="white-text bg-cover about-cover" id="index-bg-cover" style="height:100vh"><div class="container"><div class="row"><div class="col s10 offset-s1 m8 offset-m2 l8 offset-l2"><div class="brand"><div class="title center-align" data-aos="fade-down">RyanCoreAI</div><div class="description center-align" data-aos="fade-up" data-aos-delay="150">记录可信 AI 应用工程、项目复盘与长期成长</div></div></div></div><script>!function(){var e="/medias/featureimages/16.webp",r=new Image;r.onload=function(){var r=document.querySelector(".bg-cover");r&&(r.style.backgroundImage="url("+e+")");var o=document.querySelector(".bg-cover.about-cover");o&&(o.style.backgroundImage="url("+e+")")},r.onerror=function(){var r=document.querySelector(".bg-cover");r&&(r.style.backgroundImage="url("+e+")")},setTimeout((function(){if(!r.complete){var o=document.querySelector(".bg-cover");o&&(o.style.backgroundImage="url("+e+")")}}),3e3),r.src=e}()</script><div class="cover-btns" data-aos="fade-up" data-aos-delay="300"><a href="#indexCard" class="waves-effect waves-light btn"><i class="fa fa-angle-double-down"></i>开始阅读 </a><a href="/projects" class="waves-effect waves-light btn"><i class="fas fa-project-diagram"></i>项目 </a><a href="https://github.com/RyanCoreAI" class="waves-effect waves-light btn" target="_blank"><i class="fab fa-github-alt"></i>Github</a></div><div class="cover-social-link"><a href="https://github.com/RyanCoreAI" class="tooltipped" target="_blank" data-tooltip="访问我的GitHub" data-position="top" data-delay="50" data-umami-event="github_click" data-umami-event-source="social_link"><i class="fab fa-github"></i> </a><a href="#" class="tooltipped" data-tooltip="邮件联系我" data-position="top" data-delay="50" data-umami-event="email_click" data-umami-event-source="social_link" onclick='var u="ryan",d="yanxai.com";this.href="mailto:"+u+"@"+d'><i class="fas fa-envelope-open"></i> </a><a href="/atom.xml" class="tooltipped" target="_blank" data-tooltip="RSS 订阅" data-position="top" data-delay="50"><i class="fas fa-rss"></i></a></div></div></div></div><script>!function(){var e=document.getElementById("index-bg-cover");if(e){var t="cover-theme",s="theme-purple"===sessionStorage.getItem(t)?"theme-pink":"theme-purple";sessionStorage.setItem(t,s),e.classList.add(s)}}()</script><main class="content"><div class="index-tagline-card" data-aos="fade-up"><div class="container"><div class="card"><div class="card-content center-align"><p class="tagline-text"><i class="fas fa-pen-nib"></i> 记录 AI 应用工程、可信交付、评测、安全、成本与长期复盘</p></div></div></div></div><div id="indexCard" class="index-card"><div class="container"><div class="card"><div class="card-content"><div id="recommend-sections" class="recommend"><div class="title"><i class="fas fa-star"></i> 精选推送</div><div class="row"><div class="col s12"><div class="post-card" style="background-image:url(/medias/featureimages/8.webp)"><div class="post-body"><div class="post-categories"><a href="/categories/AI%E6%97%B6%E4%BB%A3%E6%80%9D%E8%80%83/" class="category">AI时代思考</a></div><a href="/p/ai-coding-trustworthy-delivery/"><h3 class="post-title">小白用 Codex 和 Claude Code 也能做产品,程序员的出路在哪里?</h3></a><p class="post-description">AI 时代不缺代码生成,缺的是可信交付。真正重要的是能不能解释、验证、审查、回滚并长期维护 AI 生成的软件。</p><a href="/p/ai-coding-trustworthy-delivery/" class="read-more btn waves-effect waves-light" style="background:linear-gradient(to right,#ff5e3a 0,#ff2a68 100%)" target="_blank" data-umami-event="article_to_project_click" data-umami-event-source="home_recommend"><i class="icon far fa-eye fa-fw"></i>阅读更多</a></div></div></div></div></div></div></div></div></div><section id="articles" class="container home-category-section" data-aos="fade-up"><div class="card"><div class="card-content"><div class="home-taxonomy-preview" data-default-main="AI应用工程" data-default-child="RAG专题"><div class="taxonomy-head"><div><div class="eyebrow">Content Map</div><h3>内容分类</h3><p>按长期方向组织文章。先选择主分类,指向主分类可展开子分类,点击子分类后只显示对应文章。</p></div><div class="taxonomy-tabs" aria-label="主分类"><div class="taxonomy-tab-wrap" data-main="项目"><button type="button" class="taxonomy-main-tab" data-main="项目">项目</button><div class="taxonomy-dropdown"><button type="button" data-main="项目" data-child="">全部</button> <button type="button" data-main="项目" data-child="PatchBrake">PatchBrake</button> <button type="button" data-main="项目" data-child="个人博客">个人博客</button> <button type="button" data-main="项目" data-child="Token Studio ROI">Token Studio ROI</button></div></div><div class="taxonomy-tab-wrap" data-main="AI时代思考"><button type="button" class="taxonomy-main-tab" data-main="AI时代思考">AI时代思考</button></div><div class="taxonomy-tab-wrap" data-main="AI应用工程"><button type="button" class="taxonomy-main-tab active" data-main="AI应用工程">AI应用工程</button><div class="taxonomy-dropdown"><button type="button" data-main="AI应用工程" data-child="">全部</button> <button type="button" class="active" data-main="AI应用工程" data-child="RAG专题">RAG专题</button> <button type="button" data-main="AI应用工程" data-child="Agent专题">Agent专题</button> <button type="button" data-main="AI应用工程" data-child="MCP专题">MCP专题</button> <button type="button" data-main="AI应用工程" data-child="SpringAI专题">SpringAI专题</button></div></div><div class="taxonomy-tab-wrap" data-main="论文精选"><button type="button" class="taxonomy-main-tab" data-main="论文精选">论文精选</button></div><div class="taxonomy-tab-wrap" data-main="AI热点情报"><button type="button" class="taxonomy-main-tab" data-main="AI热点情报">AI热点情报</button></div><div class="taxonomy-tab-wrap" data-main="学习路线"><button type="button" class="taxonomy-main-tab" data-main="学习路线">学习路线</button></div><div class="taxonomy-tab-wrap" data-main="prompt与工作流"><button type="button" class="taxonomy-main-tab" data-main="prompt与工作流">prompt与工作流</button></div><div class="taxonomy-tab-wrap" data-main="面试经历"><button type="button" class="taxonomy-main-tab" data-main="面试经历">面试经历</button></div><div class="taxonomy-tab-wrap" data-main="个人复盘"><button type="button" class="taxonomy-main-tab" data-main="个人复盘">个人复盘</button></div></div></div><div class="taxonomy-body"><aside class="taxonomy-context"><div class="context-title">当前选择</div><div class="context-main"></div><div class="context-sub"></div><p></p></aside><div class="taxonomy-list" aria-live="polite"></div></div></div><script>window.YANXAI_HOME_TAXONOMY=[{name:"项目",posts:[{title:"我做了 Token Studio:AI 编程花掉的 Token,到底换来了什么?",url:"/p/token-studio-roi/",date:"2026-06-21",summary:"一条命令 npx token-studio 就能下载并启动本地体验。Token Studio 不只统计 AI 编程用了多少 token,而是追问这些 token 到底换来了什么,并把消耗连接到项目、产出证据、模型策略和行",category:"项目",meta:"项目 / Token Studio ROI"},{title:"我让 AI 改代码,它悄悄删了测试、放大了 CI 权限,所以我做了 PatchBrake",url:"/p/patchbrake/",date:"2026-06-15",summary:"AI 改完代码后,最危险的地方往往不是项目能不能跑,而是这一次 diff 里有没有测试被删、权限被放大、secret 被写进代码。PatchBrake 就是我为这个场景做的提交前本地质检工具。",category:"项目",meta:"项目 / PatchBrake"},{title:"Hexo + Matery 主题从零搭建个人博客完整教程(GitHub Pages 部署 + 美化优化全流程)",url:"/2026/05/10/hexo-matery-blog-jian-zhan-jiao-cheng/",date:"2026-05-10",summary:"为什么选 Hexo + Matery?Hexo 是一个基于 Node.js 的静态博客框架,一条命令就能把 Markdown 文章生成完整的 HTML 站点。Matery 是 Hexo 生态中最受欢迎的 Material",category:"项目",meta:"项目 / 个人博客"}],children:[{name:"PatchBrake",posts:[{title:"我让 AI 改代码,它悄悄删了测试、放大了 CI 权限,所以我做了 PatchBrake",url:"/p/patchbrake/",date:"2026-06-15",summary:"AI 改完代码后,最危险的地方往往不是项目能不能跑,而是这一次 diff 里有没有测试被删、权限被放大、secret 被写进代码。PatchBrake 就是我为这个场景做的提交前本地质检工具。",category:"PatchBrake",meta:"项目 / PatchBrake"}]},{name:"个人博客",posts:[{title:"Hexo + Matery 主题从零搭建个人博客完整教程(GitHub Pages 部署 + 美化优化全流程)",url:"/2026/05/10/hexo-matery-blog-jian-zhan-jiao-cheng/",date:"2026-05-10",summary:"为什么选 Hexo + Matery?Hexo 是一个基于 Node.js 的静态博客框架,一条命令就能把 Markdown 文章生成完整的 HTML 站点。Matery 是 Hexo 生态中最受欢迎的 Material",category:"个人博客",meta:"项目 / 个人博客"}]},{name:"Token Studio ROI",posts:[{title:"我做了 Token Studio:AI 编程花掉的 Token,到底换来了什么?",url:"/p/token-studio-roi/",date:"2026-06-21",summary:"一条命令 npx token-studio 就能下载并启动本地体验。Token Studio 不只统计 AI 编程用了多少 token,而是追问这些 token 到底换来了什么,并把消耗连接到项目、产出证据、模型策略和行",category:"Token Studio ROI",meta:"项目 / Token Studio ROI"}]}]},{name:"AI时代思考",posts:[{title:"小白用 Codex 和 Claude Code 也能做产品,程序员的出路在哪里?",url:"/p/ai-coding-trustworthy-delivery/",date:"2026-06-27",summary:"AI 时代不缺代码生成,缺的是可信交付。真正重要的是能不能解释、验证、审查、回滚并长期维护 AI 生成的软件。",category:"AI时代思考",meta:"AI时代思考"}],children:[]},{name:"AI应用工程",posts:[{title:"一文讲透 RAG 核心术语:Embedding、Chunk、Vector DB、BM25、Reranker 到底是什么",url:"/p/rag-core-terms/",date:"2026-06-28",summary:"把 RAG 里的核心术语翻译成人话,并说明每个组件在“证据链”里负责什么。",category:"AI应用工程",meta:"AI应用工程 / RAG专题"},{title:"RAG 不是外挂知识库,而是一套证据链系统",url:"/p/rag-evidence-chain/",date:"2026-06-27",summary:"RAG 不是让模型知道更多,而是让模型的回答有证据、有边界、可追溯、可评测。",category:"AI应用工程",meta:"AI应用工程 / RAG专题"}],children:[{name:"RAG专题",posts:[{title:"一文讲透 RAG 核心术语:Embedding、Chunk、Vector DB、BM25、Reranker 到底是什么",url:"/p/rag-core-terms/",date:"2026-06-28",summary:"把 RAG 里的核心术语翻译成人话,并说明每个组件在“证据链”里负责什么。",category:"RAG专题",meta:"AI应用工程 / RAG专题"},{title:"RAG 不是外挂知识库,而是一套证据链系统",url:"/p/rag-evidence-chain/",date:"2026-06-27",summary:"RAG 不是让模型知道更多,而是让模型的回答有证据、有边界、可追溯、可评测。",category:"RAG专题",meta:"AI应用工程 / RAG专题"}]},{name:"Agent专题",posts:[]},{name:"MCP专题",posts:[]},{name:"SpringAI专题",posts:[]}]},{name:"论文精选",posts:[],children:[]},{name:"AI热点情报",posts:[],children:[]},{name:"学习路线",posts:[],children:[]},{name:"prompt与工作流",posts:[],children:[]},{name:"面试经历",posts:[],children:[]},{name:"个人复盘",posts:[],children:[]}]</script></div></div></section></main><footer class="page-footer bg-color"><div class="container row center-align" style="margin-bottom:15px!important"><div class="col s12 m8 l8 copy-right">Copyright © <span id="year">2025-2026</span> <a href="/about" target="_blank">Ryan</a> | Powered by <a href="https://hexo.io/" target="_blank">Hexo</a> | Theme <a href="https://github.com/blinkfox/hexo-theme-matery" target="_blank">Matery</a><br> <i class="fas fa-chart-area"></i> 站点总字数: <span class="white-color">51.2k</span> <span id="busuanzi_container_site_pv" style="display:none"> | <i class="far fa-eye"></i> 总访问量: <span id="busuanzi_value_site_pv" class="white-color"></span> </span><span id="busuanzi_container_site_uv" style="display:none"> | <i class="fas fa-users"></i> 总访问人数: <span id="busuanzi_value_site_uv" class="white-color"></span></span><br><span id="sitetime">Loading ...</span><script>var calcSiteTime=function(){var e=new Date,t=e.getFullYear(),n=e.getMonth()+1,i=e.getDate(),a=e.getHours(),r=e.getMinutes(),s=e.getSeconds(),o=Date.UTC("2025","5","7","0","0","0"),g=Date.UTC(t,n,i,a,r,s)-o,d=Math.floor(g/31536e6),m=Math.floor(g/864e5-365*d);if("2025"===String(t)){document.getElementById("year").innerHTML=t;var l="This site has been running for "+m+" days";l="本站已运行 "+m+" 天",document.getElementById("sitetime").innerHTML=l}else{document.getElementById("year").innerHTML="2025 - "+t;var c="This site has been running for "+d+" years and "+m+" days";c="本站已运行 "+d+" 年 "+m+" 天",document.getElementById("sitetime").innerHTML=c}};calcSiteTime()</script><br></div><div class="col s12 m4 l4 social-link social-statis"><a href="https://github.com/RyanCoreAI" class="tooltipped" target="_blank" data-tooltip="访问我的GitHub" data-position="top" data-delay="50" data-umami-event="github_click" data-umami-event-source="social_link"><i class="fab fa-github"></i> </a><a href="#" class="tooltipped" data-tooltip="邮件联系我" data-position="top" data-delay="50" data-umami-event="email_click" data-umami-event-source="social_link" onclick='var u="ryan",d="yanxai.com";this.href="mailto:"+u+"@"+d'><i class="fas fa-envelope-open"></i> </a><a href="/atom.xml" class="tooltipped" target="_blank" data-tooltip="RSS 订阅" data-position="top" data-delay="50"><i class="fas fa-rss"></i></a></div></div></footer><div class="progress-bar"></div><div id="searchModal" class="modal"><div class="modal-content"><div class="search-header"><span class="title"><i class="fas fa-search"></i> 搜索</span> <input type="search" id="searchInput" name="s" placeholder="请输入搜索的关键字" class="search-input"></div><div id="searchResult"></div></div></div><script>!function e(){if("undefined"!=typeof $){!function(e,t,n){"use strict";$.ajax({url:e,dataType:"xml",success:function(e){var r=$("entry",e).map((function(){return{title:$("title",this).text(),content:$("content",this).text(),url:$("url",this).text()}})).get(),i=document.getElementById(t),s=document.getElementById(n);i.addEventListener("input",(function(){var e='<ul class="search-result-list">',t=this.value.trim().toLowerCase().split(/[\s\-]+/);s.innerHTML="",this.value.trim().length<=0||(r.forEach((function(n){var r=!0,i=n.title.trim().toLowerCase(),s=n.content.trim().replace(/<[^>]+>/g,"").toLowerCase(),a=n.url;a=0===a.indexOf("/")?n.url:"/"+a;var l=-1,c=-1,u=-1;if(""!==i&&""!==s&&t.forEach((function(e,t){l=i.indexOf(e),c=s.indexOf(e),l<0&&c<0?r=!1:(c<0&&(c=0),0===t&&(u=c))})),r){e+="<li><a href='"+a+"' class='search-result-title'>"+i+"</a>";var o=n.content.trim().replace(/<[^>]+>/g,"");if(u>=0){var f=u-20,h=u+80;f<0&&(f=0),0===f&&(h=100),h>o.length&&(h=o.length);var m=o.substr(f,h);t.forEach((function(e){var t=new RegExp(e,"gi");m=m.replace(t,'<em class="search-keyword">'+e+"</em>")})),e+='<p class="search-result">'+m+"...</p>"}e+="</li>"}})),e+="</ul>",s.innerHTML=e)}))}})}("/search.xml","searchInput","searchResult")}else setTimeout(e,100)}()</script><div class="stars-con"><div id="stars"></div><div id="stars2"></div><div id="stars3"></div></div><script>function switchNightMode(){$('<div class="Cuteen_DarkSky"><div class="Cuteen_DarkPlanet"></div></div>').appendTo($("body")),setTimeout((function(){$("body").hasClass("DarkMode")?($("body").removeClass("DarkMode"),localStorage.setItem("isDark","0"),$("#sum-moon-icon").removeClass("fa-sun").addClass("fa-moon")):($("body").addClass("DarkMode"),localStorage.setItem("isDark","1"),$("#sum-moon-icon").addClass("fa-sun").removeClass("fa-moon")),setTimeout((function(){$(".Cuteen_DarkSky").fadeOut(1e3,(function(){$(this).remove()}))}),2e3)}))}</script><div id="backTop" class="top-scroll"><a class="btn-floating btn-large waves-effect waves-light" href="#!"><i class="fas fa-arrow-up"></i></a></div><script defer src="/libs/jquery/jquery-3.6.0.min.js"></script><script defer src="/libs/materialize/materialize.min.js"></script><script defer src="/libs/masonry/masonry.pkgd.min.js"></script><script defer src="/libs/aos/aos.js"></script><script defer src="/libs/scrollprogress/scrollProgress.min.js"></script><script defer src="/libs/lightGallery/js/lightgallery-all.min.js"></script><script defer src="/js/matery.js"></script><script async src="/libs/others/busuanzi.pure.mini.js"></script><script>setTimeout((function(){var e=document.getElementById("busuanzi_value_site_pv"),t=document.getElementById("busuanzi_value_site_uv");e&&!e.textContent&&(document.getElementById("busuanzi_container_site_pv").style.display="none"),t&&!t.textContent&&(document.getElementById("busuanzi_container_site_uv").style.display="none")}),8e3)</script><script src="/libs/instantpage/instantpage.js" defer></script><script>window.addEventListener("click",(function(i){var t=i.target;if(t&&t.closest){var n=t.closest("a[href]");if(n&&window.umami&&"function"==typeof window.umami.track&&!n.hasAttribute("data-umami-event")){var e=n.getAttribute("href")||"",a=window.location.pathname;-1!==e.indexOf("github.com/")?window.umami.track(0===a.indexOf("/p/")?"article_to_github_click":"github_click"):-1!==e.indexOf("npmjs.com")||-1!==e.indexOf("registry.npmjs.org")?window.umami.track("npm_click"):0===e.indexOf("mailto:")?window.umami.track("email_click"):0===e.indexOf("/projects")&&0===a.indexOf("/p/")&&window.umami.track("article_to_project_click")}var c=t.closest(".code_copy");if(c&&window.umami&&"function"==typeof window.umami.track){var o=c.closest(".code-area")||c.parentElement,m=o&&o.textContent||"";-1===m.indexOf("npx patchbrake")&&-1===m.indexOf("npx token-studio")&&-1===m.indexOf("npm install")||window.umami.track("copy_install_command")}}}))</script>
<style>
[bg-lazy] {
background-image: none !important;
background-color: #eee !important;
}
</style>
<script>
window.imageLazyLoadSetting = {
isSPA: false,
preloadRatio: 1,
processImages: null,
};
</script><script>window.addEventListener("load",function(){var t=/\.(gif|jpg|jpeg|tiff|png)$/i,r=/^data:image\/[a-z\d\-\.\+]+;base64,/;Array.prototype.slice.call(document.querySelectorAll("img[data-original]")).forEach(function(a){var e=a.parentNode;"A"===e.tagName&&(t.test(e.href)||r.test(e.href))&&(e.href=a.dataset.original)})});</script><script>(r=>{r.imageLazyLoadSetting.processImages=t;var a=r.imageLazyLoadSetting.isSPA,o=r.imageLazyLoadSetting.preloadRatio||1,d=i();function i(){var t=Array.prototype.slice.call(document.querySelectorAll("img[data-original]")),e=Array.prototype.slice.call(document.querySelectorAll("[bg-lazy]"));return t.concat(e)}function t(t){(a||t)&&(d=i());for(var e,n=0;n<d.length;n++)0<=(e=(e=d[n]).getBoundingClientRect()).bottom&&0<=e.left&&e.top<=(r.innerHeight*o||document.documentElement.clientHeight*o)&&(()=>{var t,e,a,o,i=d[n];e=function(){d=d.filter(function(t){return i!==t}),r.imageLazyLoadSetting.onImageLoaded&&r.imageLazyLoadSetting.onImageLoaded(i)},(t=i).dataset.loaded||(t.hasAttribute("bg-lazy")?(t.removeAttribute("bg-lazy"),e&&e()):(a=new Image,o=t.getAttribute("data-original"),a.onload=function(){t.src=o,t.removeAttribute("data-original"),t.setAttribute("data-loaded",!0),e&&e()},a.onerror=function(){t.removeAttribute("data-original"),t.setAttribute("data-loaded",!1),t.src=o},t.src!==o&&(a.src=o)))})()}function e(){clearTimeout(t.tId),t.tId=setTimeout(t,500)}t(),document.addEventListener("scroll",e),r.addEventListener("resize",e),r.addEventListener("orientationchange",e)})(this);</script></body></html>