[{"data":1,"prerenderedAt":13371},["ShallowReactive",2],{"sidebar-page":3,"all-tags-posts":4},null,[5,292,480,771,3097,8740,9245,9782,12661,12899,13326],{"id":6,"title":7,"author":8,"body":9,"cover":3,"date":282,"description":283,"extension":284,"meta":285,"navigation":286,"path":287,"seo":288,"stem":289,"tags":290,"__hash__":291},"content\u002Fabout.md","关于本站","AeYunDian",{"type":10,"value":11,"toc":269},"minimark",[12,17,72,76,89,93,168,172,184,188,197,201,204,207,210,219,230,239,243,257,261],[13,14,16],"h2",{"id":15},"一网站简介","一、网站简介",[18,19,20,34],"table",{},[21,22,23],"thead",{},[24,25,26,31],"tr",{},[27,28,30],"th",{"align":29},"left","项",[27,32,33],{"align":29},"内容",[35,36,37,49,59],"tbody",{},[24,38,39,46],{},[40,41,42],"td",{"align":29},[43,44,45],"strong",{},"站名",[40,47,48],{"align":29},"韵典综合平台（undz）",[24,50,51,56],{},[40,52,53],{"align":29},[43,54,55],{},"建站时间",[40,57,58],{"align":29},"2025-02-22",[24,60,61,66],{},[40,62,63],{"align":29},[43,64,65],{},"域名",[40,67,68],{"align":29},[69,70,71],"code",{},"undz.cn",[13,73,75],{"id":74},"二内容范围","二、内容范围",[77,78,79,83,86],"ul",{},[80,81,82],"li",{},"前端工程实践（Vue \u002F CSS \u002F 构建工具）",[80,84,85],{},"设计系统与视觉规范",[80,87,88],{},"开发随笔与读书笔记",[13,90,92],{"id":91},"三技术实现","三、技术实现",[18,94,95,105],{},[21,96,97],{},[24,98,99,102],{},[27,100,101],{"align":29},"层级",[27,103,104],{"align":29},"选型",[35,106,107,117,126,137,147],{},[24,108,109,114],{},[40,110,111],{"align":29},[43,112,113],{},"框架",[40,115,116],{"align":29},"Nuxt 4 (Vue 3) + Nuxt Content",[24,118,119,123],{},[40,120,121],{"align":29},[43,122,33],{},[40,124,125],{"align":29},"Markdown (MDC)",[24,127,128,132],{},[40,129,130],{"align":29},[43,131,65],{},[40,133,134,136],{"align":29},[69,135,71],{}," 由阿里云智能科技（杭州）有限公司注册，Cloudflare 提供 DNS 解析与 SSL 证书",[24,138,139,144],{},[40,140,141],{"align":29},[43,142,143],{},"证书",[40,145,146],{"align":29},"两个域名均持有中国互联网络信息中心（CNNIC）颁发的合法域名证书，注册人信息已通过实名认证",[24,148,149,154],{},[40,150,151],{"align":29},[43,152,153],{},"安全加密",[40,155,156,157,167],{"align":29},"全站 HTTPS 加密访问，SSL 证书由 ",[158,159,166],"a",{"href":160,"rel":161,"target":165},"https:\u002F\u002Fwww.cloudflare.com\u002F",[162,163,164],"nofollow","noopener","noreferrer","_blank","Cloudflare"," 提供",[13,169,171],{"id":170},"四关于-ai-学习","四、关于 AI 学习",[173,174,175,176],"p",{},"本站不反对机器人从网站爬取数据进行学习，甚至支持，",[43,177,178,179,183],{},"但您必须遵守",[158,180,182],{"href":181},"#%E7%89%88%E6%9D%83%E5%A3%B0%E6%98%8E","版权声明","。",[13,185,187],{"id":186},"五我的理念","五、我的理念",[189,190,191,194],"blockquote",{},[173,192,193],{},"代码改变世界",[173,195,196],{},"Code changes the world",[13,198,200],{"id":199},"六免责声明","六、免责声明",[173,202,203],{},"本站所载文章、数据仅供参考，使用前请自行核实。因使用本站内容造成的任何损失，本站不承担责任。",[13,205,206],{"id":182},"七、版权声明",[173,208,209],{},"© 2025-2026 韵典（AeYunDian）。",[173,211,212,213,218],{},"本站所有原创文章（除特别说明外）均采用 ",[158,214,217],{"href":215,"rel":216,"target":165},"https:\u002F\u002Fcreativecommons.org\u002Flicenses\u002Fby-sa\u002F4.0\u002Fdeed.zh",[162,163,164],"知识共享署名-相同方式共享 4.0 国际许可协议（CC BY-SA 4.0）"," 进行许可。您可以自由分享并演绎本站作品，但必须：",[77,220,221,224,227],{},[80,222,223],{},"在适当位置给予署名（如在文章开头显著位置注明作者 AeYunDian 并附上原文链接）；",[80,225,226],{},"可以用于商业目的；",[80,228,229],{},"演绎作品也必须采用相同的许可协议。",[173,231,232,233,238],{},"本站展示的示例代码（除特别说明外）均采用 ",[158,234,237],{"href":235,"rel":236,"target":165},"https:\u002F\u002Fopensource.org\u002Flicenses\u002FMIT",[162,163,164],"MIT 许可证"," 开源，您可以自由使用，但必须给予适当位置的署名。如果您在文章或项目中使用这些代码，希望您能在合适的位置注明作者 AeYunDian 并附上原文链接，可以用于商业目的。",[13,240,242],{"id":241},"八特此声明","八、特此声明",[173,244,245,248,249,252,253,256],{},[43,246,247],{},"UNDZ"," 是本站的技术项目名称，与加拿大内衣品牌 UNDZ（",[69,250,251],{},"undz.ca","）",[43,254,255],{},"无任何关联","。本站及关联社交媒体绝不出现任何与内衣、时尚相关的内容，也不会链接到该品牌。请勿混淆。",[13,258,260],{"id":259},"九联系方式","九、联系方式",[173,262,263,264,268],{},"如需联系，请前往 ",[158,265,267],{"href":266},"\u002Fcontact","联系我"," 页面。",{"title":270,"searchDepth":271,"depth":271,"links":272},"",2,[273,274,275,276,277,278,279,280,281],{"id":15,"depth":271,"text":16},{"id":74,"depth":271,"text":75},{"id":91,"depth":271,"text":92},{"id":170,"depth":271,"text":171},{"id":186,"depth":271,"text":187},{"id":199,"depth":271,"text":200},{"id":182,"depth":271,"text":206},{"id":241,"depth":271,"text":242},{"id":259,"depth":271,"text":260},"2026-09-13","关于韵典综合平台的信息、定位、技术实现与版权声明。","md",{},true,"\u002Fabout",{"title":7,"description":283},"about",[],"ps6kgQJLqF-0Kskn6eHMrc_Rt7hFvVkMaunCIZXfpJA",{"id":293,"title":267,"author":8,"body":294,"cover":3,"date":282,"description":474,"extension":284,"meta":475,"navigation":286,"path":266,"seo":476,"stem":477,"tags":478,"__hash__":479},"content\u002Fcontact.md",{"type":10,"value":295,"toc":467},[296,300,338,342,370,374,427,431,438,446,452,456],[13,297,299],{"id":298},"一电子邮箱","一、电子邮箱",[77,301,302,308,314,320,326,332],{},[80,303,304],{},[158,305,307],{"href":306},"mailto:aeyundian@gmail.com","aeyundian@gmail.com",[80,309,310],{},[158,311,313],{"href":312},"mailto:aeyundian@qq.com","aeyundian@qq.com",[80,315,316],{},[158,317,319],{"href":318},"mailto:aeyundian@outlook.com","aeyundian@outlook.com",[80,321,322],{},[158,323,325],{"href":324},"mailto:aeyundian@sina.com","aeyundian@sina.com",[80,327,328],{},[158,329,331],{"href":330},"mailto:aeyundian@sina.cn","aeyundian@sina.cn",[80,333,334],{},[158,335,337],{"href":336},"mailto:aeyundian@foxmail.com","aeyundian@foxmail.com",[13,339,341],{"id":340},"二即时通讯","二、即时通讯",[18,343,344,354],{},[21,345,346],{},[24,347,348,351],{},[27,349,350],{"align":29},"平台",[27,352,353],{"align":29},"账号",[35,355,356],{},[24,357,358,363],{},[40,359,360],{"align":29},[43,361,362],{},"QQ",[40,364,365],{"align":29},[158,366,369],{"href":367,"rel":368,"target":165},"https:\u002F\u002Fapi.undz.cn\u002Faddqq?uid=2768223712",[162,163,164],"2768223712",[13,371,373],{"id":372},"三其他平台","三、其他平台",[18,375,376,384],{},[21,377,378],{},[24,379,380,382],{},[27,381,350],{"align":29},[27,383,353],{"align":29},[35,385,386,399,413],{},[24,387,388,393],{},[40,389,390],{"align":29},[43,391,392],{},"GitHub",[40,394,395],{"align":29},[158,396,8],{"href":397,"rel":398,"target":165},"https:\u002F\u002Fgithub.com\u002FAeYunDian\u002F",[162,163,164],[24,400,401,406],{},[40,402,403],{"align":29},[43,404,405],{},"哔哩哔哩",[40,407,408],{"align":29},[158,409,412],{"href":410,"rel":411,"target":165},"https:\u002F\u002Fspace.bilibili.com\u002F3494370328185235",[162,163,164],"3494370328185235",[24,414,415,420],{},[40,416,417],{"align":29},[43,418,419],{},"YouTube",[40,421,422],{"align":29},[158,423,426],{"href":424,"rel":425,"target":165},"https:\u002F\u002Fwww.youtube.com\u002F@aeydundz",[162,163,164],"@aeydundz",[13,428,430],{"id":429},"四在线留言","四、在线留言",[173,432,433,434,437],{},"留言反馈已统一迁移至 ",[43,435,436],{},"反馈中心","。为便于跟踪处理进度、留存沟通记录，请前往反馈中心提交您的问题或建议。",[439,440,443],"app-button",{"href":441,"rel":442,"target":165},"https:\u002F\u002Fconsole.undz.cn\u002Fconsole-panel\u002Ffeedback-center",[163],[173,444,445],{},"前往反馈中心留言",[173,447,449,450],{"style":448},"font-size: 0.85em; color: #888; margin-top: 1em;","\n  反馈中心地址：",[69,451,441],{},[13,453,455],{"id":454},"五友情提示","五、友情提示",[77,457,458,461,464],{},[80,459,460],{},"请勿在留言中提交身份证号、银行卡等敏感信息。",[80,462,463],{},"广告、推广类留言将被直接忽略。",[80,465,466],{},"技术问题建议优先通过 GitHub Issue 反馈，便于追溯。",{"title":270,"searchDepth":271,"depth":271,"links":468},[469,470,471,472,473],{"id":298,"depth":271,"text":299},{"id":340,"depth":271,"text":341},{"id":372,"depth":271,"text":373},{"id":429,"depth":271,"text":430},{"id":454,"depth":271,"text":455},"联系韵典（AeYunDian）的方式、反馈渠道与办公信息。",{},{"title":267,"description":474},"contact",[],"dD1y8Tz7ngiw_-NdOudmTA-1x8PZUESfWxY26pUpejE",{"id":481,"title":482,"author":8,"body":483,"cover":3,"date":282,"description":764,"extension":284,"meta":765,"navigation":286,"path":766,"seo":767,"stem":768,"tags":769,"__hash__":770},"content\u002Fcookies.md","Cookie 政策",{"type":10,"value":484,"toc":737},[485,488,492,495,498,501,504,508,510,518,521,525,533,537,540,543,547,550,566,570,574,577,581,584,588,591,595,598,609,612,663,666,669,672,676,680,683,686,689,692,695,698,701,704,707,710,713,717,720,724,727,731,734],[173,486,487],{},"欢迎阅读 undz.cn 的 Cookie 政策。本政策将帮助您了解我们使用哪些 Cookie 和追踪技术、我们如何使用它们以及您享有的相关权利。",[13,489,491],{"id":490},"一介绍","一、介绍",[173,493,494],{},"本文档旨在告知用户本网站所使用的技术，这些技术有助于实现下述目的。这些技术允许所有者在用户与本网站互动时，存取和存储用户设备上的信息（例如，通过使用 Cookie）或使用用户设备上的资源（例如，通过执行脚本）。",[173,496,497],{},"为简便起见，除非另有说明，本文档中所有此类技术均统称为「追踪器」。例如，虽然 Cookie 可用于网页浏览器和移动浏览器，但在移动网站的语境下讨论 Cookie 并不准确，因为移动网站本身就是一种基于浏览器的追踪器。因此，本文档中仅在特指此类追踪器时才使用「Cookie」一词。",[173,499,500],{},"追踪器的某些用途可能需要用户同意。用户一旦同意，即可随时按照本文档中的说明自由撤回同意。",[173,502,503],{},"本网站使用第一方追踪器，同时也使用第三方广告和分析服务（如 Google AdSense、百度统计）。第一方 Cookie 和其他类似追踪器的有效期和过期时间可能因所有者设置的生命周期而异。其中一些追踪器会在用户浏览会话结束时过期。",[13,505,507],{"id":506},"二所有者和数据控制者","二、所有者和数据控制者",[173,509,8],{},[173,511,512,513,515,516,268],{},"联系邮箱：",[158,514,313],{"href":312},"，更多联系方式请前往 ",[158,517,267],{"href":266},[173,519,520],{},"在本政策中，「AeYunDian」即网站所有者和数据控制者，以下简称「所有者」。",[13,522,524],{"id":523},"三google-doubleclick-dart-cookie","三、Google DoubleClick DART Cookie",[173,526,527,528,532],{},"Google 是我们网站上的第三方供应商之一。它还使用名为 DART Cookie 的技术，根据访问者对我们网站及互联网上其他网站的访问情况向他们投放广告。访问者可以通过访问 Google 广告和内容网络隐私政策（网址：",[158,529,530],{"href":530,"rel":531,"target":165},"https:\u002F\u002Fpolicies.google.com",[162,163,164],"）来选择拒绝使用 DART Cookie。",[13,534,536],{"id":535},"四我们的广告合作伙伴","四、我们的广告合作伙伴",[173,538,539],{},"我们网站上的一些广告商可能会使用 Cookie 和网络信标。我们的广告合作伙伴包括：Google AdSense。",[173,541,542],{},"我们的每个广告合作伙伴都有其各自关于用户数据的隐私政策。",[13,544,546],{"id":545},"五第三方隐私政策","五、第三方隐私政策",[173,548,549],{},"本博客的隐私政策不适用于其他广告商或网站。因此，我们建议您咨询这些第三方广告服务器各自的隐私政策，以获取更详细的信息。",[77,551,552,559],{},[80,553,554],{},[158,555,558],{"href":556,"rel":557,"target":165},"https:\u002F\u002Fadsense.google.com\u002Fadsense\u002Fterms?rc=CN&ce=1&hl=zh-CN",[162,163,164],"Google AdSense 隐私政策",[80,560,561],{},[158,562,565],{"href":563,"rel":564,"target":165},"https:\u002F\u002Ftongji.baidu.com\u002Fweb\u002Fhelp\u002Farticle?id=330&castk=LTE%3D",[162,163,164],"百度统计隐私政策",[13,567,569],{"id":568},"六本网站如何使用追踪器","六、本网站如何使用追踪器",[571,572,573],"h3",{"id":573},"必要的追踪器",[173,575,576],{},"本网站使用所谓的「技术性」Cookie 和其他类似追踪器来执行对服务运行或交付绝对必要的活动，例如：维持您的登录会话状态（包括通过第三方 OAuth 登录后的状态保持）、保障网站安全（如 CSRF 防护）以及记住您的语言偏好等。",[571,578,580],{"id":579},"本地存储localstorage","本地存储（localStorage）",[173,582,583],{},"本站使用浏览器 localStorage 保存主题偏好、大字无障碍模式开关、访问计数等 UI 状态，这类数据不上传服务器，仅在本地浏览器中保留。",[13,585,587],{"id":586},"七如何管理偏好设置并提供或撤回同意","七、如何管理偏好设置并提供或撤回同意",[173,589,590],{},"当使用追踪器需要用户同意时，用户可以通过本网站上提供的相关隐私选择面板设置或更新其偏好来提供或撤回此类同意。",[571,592,594],{"id":593},"通过设备设置控制或删除-cookie-及类似技术","通过设备设置控制或删除 Cookie 及类似技术",[173,596,597],{},"用户可以使用自己的浏览器设置来：",[77,599,600,603,606],{},[80,601,602],{},"查看设备上已设置哪些 Cookie 或其他类似技术；",[80,604,605],{},"阻止 Cookie 或类似技术；",[80,607,608],{},"清除浏览器中的 Cookie 或类似技术。",[173,610,611],{},"但是，浏览器设置不允许按类别对同意进行精细控制。例如，用户可以在以下地址找到有关如何在最常用的浏览器中管理 Cookie 的信息：",[77,613,614,621,628,635,642,649,656],{},[80,615,616],{},[158,617,620],{"href":618,"rel":619,"target":165},"https:\u002F\u002Fsupport.google.com\u002Fchrome\u002Fanswer\u002F95647?hl=zh-CN&p=cpn_cookies",[162,163,164],"Google Chrome",[80,622,623],{},[158,624,627],{"href":625,"rel":626,"target":165},"https:\u002F\u002Fsupport.mozilla.org\u002Fzh-CN\u002Fkb\u002Fenable-and-disable-cookies-website-preferences",[162,163,164],"Mozilla Firefox",[80,629,630],{},[158,631,634],{"href":632,"rel":633,"target":165},"https:\u002F\u002Fsupport.apple.com\u002Fguide\u002Fsafari\u002Fmanage-cookies-and-website-data-sfri11471\u002F",[162,163,164],"Apple Safari",[80,636,637],{},[158,638,641],{"href":639,"rel":640,"target":165},"https:\u002F\u002Fwindows.microsoft.com\u002Fzh-cn\u002Fwindows-vista\u002Fblock-or-allow-cookies",[162,163,164],"Microsoft Internet Explorer",[80,643,644],{},[158,645,648],{"href":646,"rel":647,"target":165},"https:\u002F\u002Fsupport.microsoft.com\u002Fzh-cn\u002Fhelp\u002F4027947",[162,163,164],"Microsoft Edge",[80,650,651],{},[158,652,655],{"href":653,"rel":654,"target":165},"https:\u002F\u002Fsupport.brave.com\u002Fhc\u002Fzh-cn\u002Farticles\u002F360022806212-How-do-I-use-Shields-while-browsing",[162,163,164],"Brave",[80,657,658],{},[158,659,662],{"href":660,"rel":661,"target":165},"https:\u002F\u002Fhelp.opera.com\u002Fen\u002Flatest\u002Fweb-preferences\u002F#cookies",[162,163,164],"Opera",[173,664,665],{},"用户还可以通过相关设备设置（例如移动设备的广告设置或一般追踪设置）选择退出，从而管理移动网站上使用的某些类别的追踪器。",[571,667,668],{"id":668},"禁止使用追踪器的后果",[173,670,671],{},"用户可自行决定是否允许使用追踪器。但请注意，追踪器有助于本网站为用户提供更佳体验和高级功能（符合本文档所述用途）。因此，如果用户选择阻止使用追踪器，则所有者可能无法提供相关功能。",[13,673,675],{"id":674},"八定义和法律参考","八、定义和法律参考",[571,677,679],{"id":678},"个人数据或数据","个人数据（或数据）",[173,681,682],{},"任何直接、间接或与其他信息结合使用，能够识别或确定自然人身份的信息（包括个人身份号码）。",[571,684,685],{"id":685},"使用数据",[173,687,688],{},"本网站（或本网站中使用的第三方服务）自动收集的信息可能包括：使用本网站的用户的计算机的 IP 地址或域名、URI 地址（统一资源标识符）、请求时间、向服务器提交请求的方法、响应中收到的文件大小、指示服务器响应状态的数字代码（成功、错误等）、来源国家\u002F地区、用户使用的浏览器和操作系统的特征、每次访问的各种时间详情（例如，在网站中每个页面上花费的时间）以及有关在网站中遵循的路径的详细信息，特别是访问页面的顺序，以及有关设备操作系统和\u002F或用户 IT 环境的其他参数。",[571,690,691],{"id":691},"用户",[173,693,694],{},"使用本网站的个人，除非另有规定，否则即为数据主体。",[571,696,697],{"id":697},"数据主体",[173,699,700],{},"个人数据所指的自然人。",[571,702,703],{"id":703},"数据处理者",[173,705,706],{},"根据本隐私政策所述，代表控制者处理个人数据的自然人或法人、公共机构、代理机构或其他机构。",[571,708,709],{"id":709},"数据控制者",[173,711,712],{},"数据控制者是指单独或与他人共同决定个人数据处理的目的和方式（包括与本网站的运行和使用相关的安全措施）的自然人或法人、公共机构、机关或其他机构。除非另有说明，数据控制者即为本网站的所有者。",[571,714,716],{"id":715},"欧盟或-eu","欧盟（或 EU）",[173,718,719],{},"除非另有规定，本文件中所有提及欧盟之处均包括欧盟所有现有成员国和欧洲经济区。",[13,721,723],{"id":722},"九法律信息","九、法律信息",[173,725,726],{},"除非本文件中另有规定，否则本政策仅适用于本网站。",[13,728,730],{"id":729},"十重新设置授权","十、重新设置授权",[173,732,733],{},"如果您希望重新选择 Cookie 授权偏好，可以点击下方按钮。",[735,736],"reset-cookie-button",{},{"title":270,"searchDepth":271,"depth":271,"links":738},[739,740,741,742,743,744,749,753,762,763],{"id":490,"depth":271,"text":491},{"id":506,"depth":271,"text":507},{"id":523,"depth":271,"text":524},{"id":535,"depth":271,"text":536},{"id":545,"depth":271,"text":546},{"id":568,"depth":271,"text":569,"children":745},[746,748],{"id":573,"depth":747,"text":573},3,{"id":579,"depth":747,"text":580},{"id":586,"depth":271,"text":587,"children":750},[751,752],{"id":593,"depth":747,"text":594},{"id":668,"depth":747,"text":668},{"id":674,"depth":271,"text":675,"children":754},[755,756,757,758,759,760,761],{"id":678,"depth":747,"text":679},{"id":685,"depth":747,"text":685},{"id":691,"depth":747,"text":691},{"id":697,"depth":747,"text":697},{"id":703,"depth":747,"text":703},{"id":709,"depth":747,"text":709},{"id":715,"depth":747,"text":716},{"id":722,"depth":271,"text":723},{"id":729,"depth":271,"text":730},"了解 undz.cn 使用的 Cookie 和追踪技术，以及您享有的相关权利。",{},"\u002Fcookies",{"title":482,"description":764},"cookies",[],"JOuWXG7utbxmFtT2F7qK6LRRrS4d5eS6nY-vz0FHWgg",{"id":772,"title":773,"author":8,"body":774,"cover":3,"date":3088,"description":778,"extension":284,"meta":3089,"navigation":286,"path":3090,"seo":3091,"stem":3092,"tags":3093,"__hash__":3096},"content\u002Fgit-memo-2026-09-25.md","Git 备忘录",{"type":10,"value":775,"toc":3057},[776,779,783,1008,1012,1125,1128,1195,1199,1386,1389,1467,1475,1479,1482,1550,1553,1607,1610,1654,1657,1749,1752,1787,1797,1801,1903,1906,1910,2076,2088,2092,2189,2193,2337,2341,2345,2364,2367,2392,2396,2442,2446,2486,2490,2533,2536,2558,2562,2573,2603,2606,2610,2650,2659,2663,2671,2674,2768,2771,2777,2781,2965,2969,3022,3025,3028,3031,3054],[173,777,778],{},"日常高频命令速查。按\"场景\"而非\"命令字母\"组织，便于出问题时直接翻。",[13,780,782],{"id":781},"一配置","一、配置",[784,785,789],"pre",{"className":786,"code":787,"language":788,"meta":270,"style":270},"language-bash shiki shiki-themes monokai","# 用户信息（全局）\ngit config --global user.name \"Your Name\"\ngit config --global user.email \"you@example.com\"\n\n# 换行符（Windows 推荐）\ngit config --global core.autocrlf true\n\n# 中文文件名不乱码\ngit config --global core.quotepath false\n\n# 默认分支名\ngit config --global init.defaultBranch main\n\n# 常用别名\ngit config --global alias.st status\ngit config --global alias.co checkout\ngit config --global alias.br branch\ngit config --global alias.lg \"log --oneline --graph --decorate --all\"\n\n# 查看所有配置\ngit config --list --show-origin\n","bash",[69,790,791,800,820,834,840,846,861,866,872,887,892,898,913,918,924,939,954,969,984,989,995],{"__ignoreMap":270},[792,793,796],"span",{"class":794,"line":795},"line",1,[792,797,799],{"class":798},"snpHw","# 用户信息（全局）\n",[792,801,802,806,810,814,817],{"class":794,"line":271},[792,803,805],{"class":804},"sHkqI","git",[792,807,809],{"class":808},"s_Ekj"," config",[792,811,813],{"class":812},"s7s5_"," --global",[792,815,816],{"class":808}," user.name",[792,818,819],{"class":808}," \"Your Name\"\n",[792,821,822,824,826,828,831],{"class":794,"line":747},[792,823,805],{"class":804},[792,825,809],{"class":808},[792,827,813],{"class":812},[792,829,830],{"class":808}," user.email",[792,832,833],{"class":808}," \"you@example.com\"\n",[792,835,837],{"class":794,"line":836},4,[792,838,839],{"emptyLinePlaceholder":286},"\n",[792,841,843],{"class":794,"line":842},5,[792,844,845],{"class":798},"# 换行符（Windows 推荐）\n",[792,847,849,851,853,855,858],{"class":794,"line":848},6,[792,850,805],{"class":804},[792,852,809],{"class":808},[792,854,813],{"class":812},[792,856,857],{"class":808}," core.autocrlf",[792,859,860],{"class":812}," true\n",[792,862,864],{"class":794,"line":863},7,[792,865,839],{"emptyLinePlaceholder":286},[792,867,869],{"class":794,"line":868},8,[792,870,871],{"class":798},"# 中文文件名不乱码\n",[792,873,875,877,879,881,884],{"class":794,"line":874},9,[792,876,805],{"class":804},[792,878,809],{"class":808},[792,880,813],{"class":812},[792,882,883],{"class":808}," core.quotepath",[792,885,886],{"class":812}," false\n",[792,888,890],{"class":794,"line":889},10,[792,891,839],{"emptyLinePlaceholder":286},[792,893,895],{"class":794,"line":894},11,[792,896,897],{"class":798},"# 默认分支名\n",[792,899,901,903,905,907,910],{"class":794,"line":900},12,[792,902,805],{"class":804},[792,904,809],{"class":808},[792,906,813],{"class":812},[792,908,909],{"class":808}," init.defaultBranch",[792,911,912],{"class":808}," main\n",[792,914,916],{"class":794,"line":915},13,[792,917,839],{"emptyLinePlaceholder":286},[792,919,921],{"class":794,"line":920},14,[792,922,923],{"class":798},"# 常用别名\n",[792,925,927,929,931,933,936],{"class":794,"line":926},15,[792,928,805],{"class":804},[792,930,809],{"class":808},[792,932,813],{"class":812},[792,934,935],{"class":808}," alias.st",[792,937,938],{"class":808}," status\n",[792,940,942,944,946,948,951],{"class":794,"line":941},16,[792,943,805],{"class":804},[792,945,809],{"class":808},[792,947,813],{"class":812},[792,949,950],{"class":808}," alias.co",[792,952,953],{"class":808}," checkout\n",[792,955,957,959,961,963,966],{"class":794,"line":956},17,[792,958,805],{"class":804},[792,960,809],{"class":808},[792,962,813],{"class":812},[792,964,965],{"class":808}," alias.br",[792,967,968],{"class":808}," branch\n",[792,970,972,974,976,978,981],{"class":794,"line":971},18,[792,973,805],{"class":804},[792,975,809],{"class":808},[792,977,813],{"class":812},[792,979,980],{"class":808}," alias.lg",[792,982,983],{"class":808}," \"log --oneline --graph --decorate --all\"\n",[792,985,987],{"class":794,"line":986},19,[792,988,839],{"emptyLinePlaceholder":286},[792,990,992],{"class":794,"line":991},20,[792,993,994],{"class":798},"# 查看所有配置\n",[792,996,998,1000,1002,1005],{"class":794,"line":997},21,[792,999,805],{"class":804},[792,1001,809],{"class":808},[792,1003,1004],{"class":812}," --list",[792,1006,1007],{"class":812}," --show-origin\n",[13,1009,1011],{"id":1010},"二基础工作流","二、基础工作流",[784,1013,1015],{"className":786,"code":1014,"language":788,"meta":270,"style":270},"git status                    # 查看工作区状态\ngit add \u003Cfile>                # 暂存指定文件\ngit add .                     # 暂存所有改动（不含删除）\ngit add -A                    # 暂存所有改动（含删除）\ngit commit -m \"message\"       # 提交\ngit commit -am \"message\"      # 跳过 add，直接提交已跟踪文件\ngit push                      # 推送\ngit pull                      # 拉取并合并\n",[69,1016,1017,1027,1051,1063,1075,1091,1105,1115],{"__ignoreMap":270},[792,1018,1019,1021,1024],{"class":794,"line":795},[792,1020,805],{"class":804},[792,1022,1023],{"class":808}," status",[792,1025,1026],{"class":798},"                    # 查看工作区状态\n",[792,1028,1029,1031,1034,1038,1041,1045,1048],{"class":794,"line":271},[792,1030,805],{"class":804},[792,1032,1033],{"class":808}," add",[792,1035,1037],{"class":1036},"s8I7P"," \u003C",[792,1039,1040],{"class":808},"fil",[792,1042,1044],{"class":1043},"sCdxs","e",[792,1046,1047],{"class":1036},">",[792,1049,1050],{"class":798},"                # 暂存指定文件\n",[792,1052,1053,1055,1057,1060],{"class":794,"line":747},[792,1054,805],{"class":804},[792,1056,1033],{"class":808},[792,1058,1059],{"class":808}," .",[792,1061,1062],{"class":798},"                     # 暂存所有改动（不含删除）\n",[792,1064,1065,1067,1069,1072],{"class":794,"line":836},[792,1066,805],{"class":804},[792,1068,1033],{"class":808},[792,1070,1071],{"class":812}," -A",[792,1073,1074],{"class":798},"                    # 暂存所有改动（含删除）\n",[792,1076,1077,1079,1082,1085,1088],{"class":794,"line":842},[792,1078,805],{"class":804},[792,1080,1081],{"class":808}," commit",[792,1083,1084],{"class":812}," -m",[792,1086,1087],{"class":808}," \"message\"",[792,1089,1090],{"class":798},"       # 提交\n",[792,1092,1093,1095,1097,1100,1102],{"class":794,"line":848},[792,1094,805],{"class":804},[792,1096,1081],{"class":808},[792,1098,1099],{"class":812}," -am",[792,1101,1087],{"class":808},[792,1103,1104],{"class":798},"      # 跳过 add，直接提交已跟踪文件\n",[792,1106,1107,1109,1112],{"class":794,"line":863},[792,1108,805],{"class":804},[792,1110,1111],{"class":808}," push",[792,1113,1114],{"class":798},"                      # 推送\n",[792,1116,1117,1119,1122],{"class":794,"line":868},[792,1118,805],{"class":804},[792,1120,1121],{"class":808}," pull",[792,1123,1124],{"class":798},"                      # 拉取并合并\n",[571,1126,1127],{"id":1127},"查看差异",[784,1129,1131],{"className":786,"code":1130,"language":788,"meta":270,"style":270},"git diff                      # 工作区 vs 暂存区\ngit diff --staged             # 暂存区 vs 最新提交\ngit diff HEAD                 # 工作区 + 暂存区 vs 最新提交\ngit diff \u003Cbranch1>..\u003Cbranch2> # 两分支差异\n",[69,1132,1133,1143,1155,1167],{"__ignoreMap":270},[792,1134,1135,1137,1140],{"class":794,"line":795},[792,1136,805],{"class":804},[792,1138,1139],{"class":808}," diff",[792,1141,1142],{"class":798},"                      # 工作区 vs 暂存区\n",[792,1144,1145,1147,1149,1152],{"class":794,"line":271},[792,1146,805],{"class":804},[792,1148,1139],{"class":808},[792,1150,1151],{"class":812}," --staged",[792,1153,1154],{"class":798},"             # 暂存区 vs 最新提交\n",[792,1156,1157,1159,1161,1164],{"class":794,"line":747},[792,1158,805],{"class":804},[792,1160,1139],{"class":808},[792,1162,1163],{"class":808}," HEAD",[792,1165,1166],{"class":798},"                 # 工作区 + 暂存区 vs 最新提交\n",[792,1168,1169,1171,1173,1175,1178,1181,1184,1187,1189,1192],{"class":794,"line":836},[792,1170,805],{"class":804},[792,1172,1139],{"class":808},[792,1174,1037],{"class":1036},[792,1176,1177],{"class":808},"branch",[792,1179,1180],{"class":1036},"1>",[792,1182,1183],{"class":808},"..",[792,1185,1186],{"class":1036},"\u003C",[792,1188,1177],{"class":808},[792,1190,1191],{"class":1036},"2>",[792,1193,1194],{"class":798}," # 两分支差异\n",[13,1196,1198],{"id":1197},"三分支","三、分支",[784,1200,1202],{"className":786,"code":1201,"language":788,"meta":270,"style":270},"git branch                    # 查看本地分支\ngit branch -a                 # 查看所有分支（含远程）\ngit branch -vv                # 查看分支及跟踪关系\ngit branch \u003Cname>             # 创建分支\ngit switch \u003Cname>             # 切换分支（新版推荐）\ngit switch -c \u003Cname>          # 创建并切换\ngit checkout -b \u003Cname>        # 同上（旧版写法）\ngit branch -d \u003Cname>          # 删除已合并分支\ngit branch -D \u003Cname>          # 强制删除\ngit branch -m \u003Cold> \u003Cnew>     # 重命名分支\n",[69,1203,1204,1214,1226,1238,1256,1274,1294,1315,1335,1355],{"__ignoreMap":270},[792,1205,1206,1208,1211],{"class":794,"line":795},[792,1207,805],{"class":804},[792,1209,1210],{"class":808}," branch",[792,1212,1213],{"class":798},"                    # 查看本地分支\n",[792,1215,1216,1218,1220,1223],{"class":794,"line":271},[792,1217,805],{"class":804},[792,1219,1210],{"class":808},[792,1221,1222],{"class":812}," -a",[792,1224,1225],{"class":798},"                 # 查看所有分支（含远程）\n",[792,1227,1228,1230,1232,1235],{"class":794,"line":747},[792,1229,805],{"class":804},[792,1231,1210],{"class":808},[792,1233,1234],{"class":812}," -vv",[792,1236,1237],{"class":798},"                # 查看分支及跟踪关系\n",[792,1239,1240,1242,1244,1246,1249,1251,1253],{"class":794,"line":836},[792,1241,805],{"class":804},[792,1243,1210],{"class":808},[792,1245,1037],{"class":1036},[792,1247,1248],{"class":808},"nam",[792,1250,1044],{"class":1043},[792,1252,1047],{"class":1036},[792,1254,1255],{"class":798},"             # 创建分支\n",[792,1257,1258,1260,1263,1265,1267,1269,1271],{"class":794,"line":842},[792,1259,805],{"class":804},[792,1261,1262],{"class":808}," switch",[792,1264,1037],{"class":1036},[792,1266,1248],{"class":808},[792,1268,1044],{"class":1043},[792,1270,1047],{"class":1036},[792,1272,1273],{"class":798},"             # 切换分支（新版推荐）\n",[792,1275,1276,1278,1280,1283,1285,1287,1289,1291],{"class":794,"line":848},[792,1277,805],{"class":804},[792,1279,1262],{"class":808},[792,1281,1282],{"class":812}," -c",[792,1284,1037],{"class":1036},[792,1286,1248],{"class":808},[792,1288,1044],{"class":1043},[792,1290,1047],{"class":1036},[792,1292,1293],{"class":798},"          # 创建并切换\n",[792,1295,1296,1298,1301,1304,1306,1308,1310,1312],{"class":794,"line":863},[792,1297,805],{"class":804},[792,1299,1300],{"class":808}," checkout",[792,1302,1303],{"class":812}," -b",[792,1305,1037],{"class":1036},[792,1307,1248],{"class":808},[792,1309,1044],{"class":1043},[792,1311,1047],{"class":1036},[792,1313,1314],{"class":798},"        # 同上（旧版写法）\n",[792,1316,1317,1319,1321,1324,1326,1328,1330,1332],{"class":794,"line":868},[792,1318,805],{"class":804},[792,1320,1210],{"class":808},[792,1322,1323],{"class":812}," -d",[792,1325,1037],{"class":1036},[792,1327,1248],{"class":808},[792,1329,1044],{"class":1043},[792,1331,1047],{"class":1036},[792,1333,1334],{"class":798},"          # 删除已合并分支\n",[792,1336,1337,1339,1341,1344,1346,1348,1350,1352],{"class":794,"line":874},[792,1338,805],{"class":804},[792,1340,1210],{"class":808},[792,1342,1343],{"class":812}," -D",[792,1345,1037],{"class":1036},[792,1347,1248],{"class":808},[792,1349,1044],{"class":1043},[792,1351,1047],{"class":1036},[792,1353,1354],{"class":798},"          # 强制删除\n",[792,1356,1357,1359,1361,1363,1365,1368,1371,1373,1375,1378,1381,1383],{"class":794,"line":889},[792,1358,805],{"class":804},[792,1360,1210],{"class":808},[792,1362,1084],{"class":812},[792,1364,1037],{"class":1036},[792,1366,1367],{"class":808},"ol",[792,1369,1370],{"class":1043},"d",[792,1372,1047],{"class":1036},[792,1374,1037],{"class":1036},[792,1376,1377],{"class":808},"ne",[792,1379,1380],{"class":1043},"w",[792,1382,1047],{"class":1036},[792,1384,1385],{"class":798},"     # 重命名分支\n",[571,1387,1388],{"id":1388},"合并与变基",[784,1390,1392],{"className":786,"code":1391,"language":788,"meta":270,"style":270},"git merge \u003Cbranch>            # 合并到当前分支（保留历史）\ngit merge --no-ff \u003Cbranch>    # 强制生成合并提交\ngit rebase \u003Cbranch>           # 变基（线性历史）\ngit rebase -i HEAD~3          # 交互式变基，重写最近 3 条提交\n",[69,1393,1394,1414,1434,1452],{"__ignoreMap":270},[792,1395,1396,1398,1401,1403,1406,1409,1411],{"class":794,"line":795},[792,1397,805],{"class":804},[792,1399,1400],{"class":808}," merge",[792,1402,1037],{"class":1036},[792,1404,1405],{"class":808},"branc",[792,1407,1408],{"class":1043},"h",[792,1410,1047],{"class":1036},[792,1412,1413],{"class":798},"            # 合并到当前分支（保留历史）\n",[792,1415,1416,1418,1420,1423,1425,1427,1429,1431],{"class":794,"line":271},[792,1417,805],{"class":804},[792,1419,1400],{"class":808},[792,1421,1422],{"class":812}," --no-ff",[792,1424,1037],{"class":1036},[792,1426,1405],{"class":808},[792,1428,1408],{"class":1043},[792,1430,1047],{"class":1036},[792,1432,1433],{"class":798},"    # 强制生成合并提交\n",[792,1435,1436,1438,1441,1443,1445,1447,1449],{"class":794,"line":747},[792,1437,805],{"class":804},[792,1439,1440],{"class":808}," rebase",[792,1442,1037],{"class":1036},[792,1444,1405],{"class":808},[792,1446,1408],{"class":1043},[792,1448,1047],{"class":1036},[792,1450,1451],{"class":798},"           # 变基（线性历史）\n",[792,1453,1454,1456,1458,1461,1464],{"class":794,"line":836},[792,1455,805],{"class":804},[792,1457,1440],{"class":808},[792,1459,1460],{"class":812}," -i",[792,1462,1463],{"class":808}," HEAD~3",[792,1465,1466],{"class":798},"          # 交互式变基，重写最近 3 条提交\n",[189,1468,1469],{},[173,1470,1471,1474],{},[43,1472,1473],{},"原则","：已推送到共享远程的分支不要 rebase；只在本地分支上用。",[13,1476,1478],{"id":1477},"四撤销与回退","四、撤销与回退",[173,1480,1481],{},"这是最容易踩坑的地方，先分清三种\"撤销\"：",[18,1483,1484,1500],{},[21,1485,1486],{},[24,1487,1488,1491,1494,1497],{},[27,1489,1490],{},"命令",[27,1492,1493],{},"作用范围",[27,1495,1496],{},"是否修改历史",[27,1498,1499],{},"使用场景",[35,1501,1502,1518,1534],{},[24,1503,1504,1509,1512,1515],{},[40,1505,1506],{},[69,1507,1508],{},"git restore",[40,1510,1511],{},"工作区 \u002F 暂存区",[40,1513,1514],{},"否",[40,1516,1517],{},"丢弃未提交的修改",[24,1519,1520,1525,1528,1531],{},[40,1521,1522],{},[69,1523,1524],{},"git reset",[40,1526,1527],{},"暂存区 \u002F 提交历史",[40,1529,1530],{},"是",[40,1532,1533],{},"撤销提交（未推送）",[24,1535,1536,1541,1544,1547],{},[40,1537,1538],{},[69,1539,1540],{},"git revert",[40,1542,1543],{},"提交历史",[40,1545,1546],{},"否（新增反向提交）",[40,1548,1549],{},"撤销已推送的提交",[571,1551,1552],{"id":1552},"丢弃工作区修改",[784,1554,1556],{"className":786,"code":1555,"language":788,"meta":270,"style":270},"git restore \u003Cfile>            # 丢弃单个文件的未暂存修改\ngit restore .                 # 丢弃所有未暂存修改（危险）\ngit checkout -- \u003Cfile>        # 旧版写法\n",[69,1557,1558,1576,1587],{"__ignoreMap":270},[792,1559,1560,1562,1565,1567,1569,1571,1573],{"class":794,"line":795},[792,1561,805],{"class":804},[792,1563,1564],{"class":808}," restore",[792,1566,1037],{"class":1036},[792,1568,1040],{"class":808},[792,1570,1044],{"class":1043},[792,1572,1047],{"class":1036},[792,1574,1575],{"class":798},"            # 丢弃单个文件的未暂存修改\n",[792,1577,1578,1580,1582,1584],{"class":794,"line":271},[792,1579,805],{"class":804},[792,1581,1564],{"class":808},[792,1583,1059],{"class":808},[792,1585,1586],{"class":798},"                 # 丢弃所有未暂存修改（危险）\n",[792,1588,1589,1591,1593,1596,1598,1600,1602,1604],{"class":794,"line":747},[792,1590,805],{"class":804},[792,1592,1300],{"class":808},[792,1594,1595],{"class":812}," --",[792,1597,1037],{"class":1036},[792,1599,1040],{"class":808},[792,1601,1044],{"class":1043},[792,1603,1047],{"class":1036},[792,1605,1606],{"class":798},"        # 旧版写法\n",[571,1608,1609],{"id":1609},"取消暂存",[784,1611,1613],{"className":786,"code":1612,"language":788,"meta":270,"style":270},"git restore --staged \u003Cfile>   # 从暂存区移回工作区\ngit reset HEAD \u003Cfile>         # 旧版写法\n",[69,1614,1615,1634],{"__ignoreMap":270},[792,1616,1617,1619,1621,1623,1625,1627,1629,1631],{"class":794,"line":795},[792,1618,805],{"class":804},[792,1620,1564],{"class":808},[792,1622,1151],{"class":812},[792,1624,1037],{"class":1036},[792,1626,1040],{"class":808},[792,1628,1044],{"class":1043},[792,1630,1047],{"class":1036},[792,1632,1633],{"class":798},"   # 从暂存区移回工作区\n",[792,1635,1636,1638,1641,1643,1645,1647,1649,1651],{"class":794,"line":271},[792,1637,805],{"class":804},[792,1639,1640],{"class":808}," reset",[792,1642,1163],{"class":808},[792,1644,1037],{"class":1036},[792,1646,1040],{"class":808},[792,1648,1044],{"class":1043},[792,1650,1047],{"class":1036},[792,1652,1653],{"class":798},"         # 旧版写法\n",[571,1655,1656],{"id":1656},"撤销提交",[784,1658,1660],{"className":786,"code":1659,"language":788,"meta":270,"style":270},"# 保留改动在工作区\ngit reset --soft HEAD~1\n\n# 保留改动在暂存区\ngit reset --mixed HEAD~1      # 默认\n\n# 彻底丢弃改动（危险）\ngit reset --hard HEAD~1\n\n# 撤销已推送的提交（安全）\ngit revert \u003Ccommit-hash>\n",[69,1661,1662,1667,1679,1683,1688,1703,1707,1712,1723,1727,1732],{"__ignoreMap":270},[792,1663,1664],{"class":794,"line":795},[792,1665,1666],{"class":798},"# 保留改动在工作区\n",[792,1668,1669,1671,1673,1676],{"class":794,"line":271},[792,1670,805],{"class":804},[792,1672,1640],{"class":808},[792,1674,1675],{"class":812}," --soft",[792,1677,1678],{"class":808}," HEAD~1\n",[792,1680,1681],{"class":794,"line":747},[792,1682,839],{"emptyLinePlaceholder":286},[792,1684,1685],{"class":794,"line":836},[792,1686,1687],{"class":798},"# 保留改动在暂存区\n",[792,1689,1690,1692,1694,1697,1700],{"class":794,"line":842},[792,1691,805],{"class":804},[792,1693,1640],{"class":808},[792,1695,1696],{"class":812}," --mixed",[792,1698,1699],{"class":808}," HEAD~1",[792,1701,1702],{"class":798},"      # 默认\n",[792,1704,1705],{"class":794,"line":848},[792,1706,839],{"emptyLinePlaceholder":286},[792,1708,1709],{"class":794,"line":863},[792,1710,1711],{"class":798},"# 彻底丢弃改动（危险）\n",[792,1713,1714,1716,1718,1721],{"class":794,"line":868},[792,1715,805],{"class":804},[792,1717,1640],{"class":808},[792,1719,1720],{"class":812}," --hard",[792,1722,1678],{"class":808},[792,1724,1725],{"class":794,"line":874},[792,1726,839],{"emptyLinePlaceholder":286},[792,1728,1729],{"class":794,"line":889},[792,1730,1731],{"class":798},"# 撤销已推送的提交（安全）\n",[792,1733,1734,1736,1739,1741,1744,1746],{"class":794,"line":894},[792,1735,805],{"class":804},[792,1737,1738],{"class":808}," revert",[792,1740,1037],{"class":1036},[792,1742,1743],{"class":808},"commit-has",[792,1745,1408],{"class":1043},[792,1747,1748],{"class":1036},">\n",[571,1750,1751],{"id":1751},"找回丢失的提交",[784,1753,1755],{"className":786,"code":1754,"language":788,"meta":270,"style":270},"git reflog                    # 查看 HEAD 移动历史\ngit reset --hard \u003Chash>       # 回到某个历史位置\n",[69,1756,1757,1767],{"__ignoreMap":270},[792,1758,1759,1761,1764],{"class":794,"line":795},[792,1760,805],{"class":804},[792,1762,1763],{"class":808}," reflog",[792,1765,1766],{"class":798},"                    # 查看 HEAD 移动历史\n",[792,1768,1769,1771,1773,1775,1777,1780,1782,1784],{"class":794,"line":271},[792,1770,805],{"class":804},[792,1772,1640],{"class":808},[792,1774,1720],{"class":812},[792,1776,1037],{"class":1036},[792,1778,1779],{"class":808},"has",[792,1781,1408],{"class":1043},[792,1783,1047],{"class":1036},[792,1785,1786],{"class":798},"       # 回到某个历史位置\n",[173,1788,1789,1792,1793,1796],{},[69,1790,1791],{},"reset --hard"," 后如果后悔，",[69,1794,1795],{},"reflog"," 通常能救回来，除非已经 GC。",[13,1798,1800],{"id":1799},"五贮藏stash","五、贮藏（stash）",[784,1802,1804],{"className":786,"code":1803,"language":788,"meta":270,"style":270},"git stash                     # 贮藏当前改动\ngit stash -u                  # 含未跟踪文件\ngit stash list                # 查看贮藏列表\ngit stash pop                 # 弹出最近贮藏并删除\ngit stash apply stash@{0}     # 应用指定贮藏（保留）\ngit stash drop stash@{0}      # 删除指定贮藏\ngit stash clear               # 清空所有贮藏\n",[69,1805,1806,1816,1828,1840,1852,1873,1891],{"__ignoreMap":270},[792,1807,1808,1810,1813],{"class":794,"line":795},[792,1809,805],{"class":804},[792,1811,1812],{"class":808}," stash",[792,1814,1815],{"class":798},"                     # 贮藏当前改动\n",[792,1817,1818,1820,1822,1825],{"class":794,"line":271},[792,1819,805],{"class":804},[792,1821,1812],{"class":808},[792,1823,1824],{"class":812}," -u",[792,1826,1827],{"class":798},"                  # 含未跟踪文件\n",[792,1829,1830,1832,1834,1837],{"class":794,"line":747},[792,1831,805],{"class":804},[792,1833,1812],{"class":808},[792,1835,1836],{"class":808}," list",[792,1838,1839],{"class":798},"                # 查看贮藏列表\n",[792,1841,1842,1844,1846,1849],{"class":794,"line":836},[792,1843,805],{"class":804},[792,1845,1812],{"class":808},[792,1847,1848],{"class":808}," pop",[792,1850,1851],{"class":798},"                 # 弹出最近贮藏并删除\n",[792,1853,1854,1856,1858,1861,1864,1867,1870],{"class":794,"line":842},[792,1855,805],{"class":804},[792,1857,1812],{"class":808},[792,1859,1860],{"class":808}," apply",[792,1862,1863],{"class":808}," stash@{",[792,1865,1866],{"class":812},"0",[792,1868,1869],{"class":808},"}",[792,1871,1872],{"class":798},"     # 应用指定贮藏（保留）\n",[792,1874,1875,1877,1879,1882,1884,1886,1888],{"class":794,"line":848},[792,1876,805],{"class":804},[792,1878,1812],{"class":808},[792,1880,1881],{"class":808}," drop",[792,1883,1863],{"class":808},[792,1885,1866],{"class":812},[792,1887,1869],{"class":808},[792,1889,1890],{"class":798},"      # 删除指定贮藏\n",[792,1892,1893,1895,1897,1900],{"class":794,"line":863},[792,1894,805],{"class":804},[792,1896,1812],{"class":808},[792,1898,1899],{"class":808}," clear",[792,1901,1902],{"class":798},"               # 清空所有贮藏\n",[173,1904,1905],{},"常见场景：改了一半，突然要切分支修 bug。",[13,1907,1909],{"id":1908},"六远程","六、远程",[784,1911,1913],{"className":786,"code":1912,"language":788,"meta":270,"style":270},"git remote -v                 # 查看远程仓库\ngit remote add origin \u003Curl>   # 添加远程\ngit remote set-url origin \u003Curl> # 修改远程地址\ngit remote remove origin      # 删除远程\n\ngit fetch                     # 拉取远程信息，不合并\ngit pull                      # fetch + merge\ngit pull --rebase             # fetch + rebase\ngit push                      # 推送\ngit push -u origin \u003Cbranch>   # 首次推送并建立跟踪\ngit push --force-with-lease   # 安全强推（推荐）\ngit push --force              # 强推（危险）\n",[69,1914,1915,1928,1952,1974,1988,1992,2002,2011,2023,2031,2052,2064],{"__ignoreMap":270},[792,1916,1917,1919,1922,1925],{"class":794,"line":795},[792,1918,805],{"class":804},[792,1920,1921],{"class":808}," remote",[792,1923,1924],{"class":812}," -v",[792,1926,1927],{"class":798},"                 # 查看远程仓库\n",[792,1929,1930,1932,1934,1936,1939,1941,1944,1947,1949],{"class":794,"line":271},[792,1931,805],{"class":804},[792,1933,1921],{"class":808},[792,1935,1033],{"class":808},[792,1937,1938],{"class":808}," origin",[792,1940,1037],{"class":1036},[792,1942,1943],{"class":808},"ur",[792,1945,1946],{"class":1043},"l",[792,1948,1047],{"class":1036},[792,1950,1951],{"class":798},"   # 添加远程\n",[792,1953,1954,1956,1958,1961,1963,1965,1967,1969,1971],{"class":794,"line":747},[792,1955,805],{"class":804},[792,1957,1921],{"class":808},[792,1959,1960],{"class":808}," set-url",[792,1962,1938],{"class":808},[792,1964,1037],{"class":1036},[792,1966,1943],{"class":808},[792,1968,1946],{"class":1043},[792,1970,1047],{"class":1036},[792,1972,1973],{"class":798}," # 修改远程地址\n",[792,1975,1976,1978,1980,1983,1985],{"class":794,"line":836},[792,1977,805],{"class":804},[792,1979,1921],{"class":808},[792,1981,1982],{"class":808}," remove",[792,1984,1938],{"class":808},[792,1986,1987],{"class":798},"      # 删除远程\n",[792,1989,1990],{"class":794,"line":842},[792,1991,839],{"emptyLinePlaceholder":286},[792,1993,1994,1996,1999],{"class":794,"line":848},[792,1995,805],{"class":804},[792,1997,1998],{"class":808}," fetch",[792,2000,2001],{"class":798},"                     # 拉取远程信息，不合并\n",[792,2003,2004,2006,2008],{"class":794,"line":863},[792,2005,805],{"class":804},[792,2007,1121],{"class":808},[792,2009,2010],{"class":798},"                      # fetch + merge\n",[792,2012,2013,2015,2017,2020],{"class":794,"line":868},[792,2014,805],{"class":804},[792,2016,1121],{"class":808},[792,2018,2019],{"class":812}," --rebase",[792,2021,2022],{"class":798},"             # fetch + rebase\n",[792,2024,2025,2027,2029],{"class":794,"line":874},[792,2026,805],{"class":804},[792,2028,1111],{"class":808},[792,2030,1114],{"class":798},[792,2032,2033,2035,2037,2039,2041,2043,2045,2047,2049],{"class":794,"line":889},[792,2034,805],{"class":804},[792,2036,1111],{"class":808},[792,2038,1824],{"class":812},[792,2040,1938],{"class":808},[792,2042,1037],{"class":1036},[792,2044,1405],{"class":808},[792,2046,1408],{"class":1043},[792,2048,1047],{"class":1036},[792,2050,2051],{"class":798},"   # 首次推送并建立跟踪\n",[792,2053,2054,2056,2058,2061],{"class":794,"line":894},[792,2055,805],{"class":804},[792,2057,1111],{"class":808},[792,2059,2060],{"class":812}," --force-with-lease",[792,2062,2063],{"class":798},"   # 安全强推（推荐）\n",[792,2065,2066,2068,2070,2073],{"class":794,"line":900},[792,2067,805],{"class":804},[792,2069,1111],{"class":808},[792,2071,2072],{"class":812}," --force",[792,2074,2075],{"class":798},"              # 强推（危险）\n",[189,2077,2078],{},[173,2079,2080,2083,2084,2087],{},[43,2081,2082],{},"强推原则","：永远用 ",[69,2085,2086],{},"--force-with-lease","，它会检查远程是否有人推过新提交，避免误覆盖别人的工作。",[13,2089,2091],{"id":2090},"七标签","七、标签",[784,2093,2095],{"className":786,"code":2094,"language":788,"meta":270,"style":270},"git tag                       # 查看标签\ngit tag v1.0.0                # 轻量标签\ngit tag -a v1.0.0 -m \"msg\"    # 附注标签（推荐）\ngit push origin v1.0.0        # 推送单个标签\ngit push --tags               # 推送所有标签\ngit tag -d v1.0.0             # 删除本地标签\ngit push origin :refs\u002Ftags\u002Fv1.0.0  # 删除远程标签\n",[69,2096,2097,2107,2119,2137,2150,2162,2175],{"__ignoreMap":270},[792,2098,2099,2101,2104],{"class":794,"line":795},[792,2100,805],{"class":804},[792,2102,2103],{"class":808}," tag",[792,2105,2106],{"class":798},"                       # 查看标签\n",[792,2108,2109,2111,2113,2116],{"class":794,"line":271},[792,2110,805],{"class":804},[792,2112,2103],{"class":808},[792,2114,2115],{"class":808}," v1.0.0",[792,2117,2118],{"class":798},"                # 轻量标签\n",[792,2120,2121,2123,2125,2127,2129,2131,2134],{"class":794,"line":747},[792,2122,805],{"class":804},[792,2124,2103],{"class":808},[792,2126,1222],{"class":812},[792,2128,2115],{"class":808},[792,2130,1084],{"class":812},[792,2132,2133],{"class":808}," \"msg\"",[792,2135,2136],{"class":798},"    # 附注标签（推荐）\n",[792,2138,2139,2141,2143,2145,2147],{"class":794,"line":836},[792,2140,805],{"class":804},[792,2142,1111],{"class":808},[792,2144,1938],{"class":808},[792,2146,2115],{"class":808},[792,2148,2149],{"class":798},"        # 推送单个标签\n",[792,2151,2152,2154,2156,2159],{"class":794,"line":842},[792,2153,805],{"class":804},[792,2155,1111],{"class":808},[792,2157,2158],{"class":812}," --tags",[792,2160,2161],{"class":798},"               # 推送所有标签\n",[792,2163,2164,2166,2168,2170,2172],{"class":794,"line":848},[792,2165,805],{"class":804},[792,2167,2103],{"class":808},[792,2169,1323],{"class":812},[792,2171,2115],{"class":808},[792,2173,2174],{"class":798},"             # 删除本地标签\n",[792,2176,2177,2179,2181,2183,2186],{"class":794,"line":863},[792,2178,805],{"class":804},[792,2180,1111],{"class":808},[792,2182,1938],{"class":808},[792,2184,2185],{"class":808}," :refs\u002Ftags\u002Fv1.0.0",[792,2187,2188],{"class":798},"  # 删除远程标签\n",[13,2190,2192],{"id":2191},"八查看历史","八、查看历史",[784,2194,2196],{"className":786,"code":2195,"language":788,"meta":270,"style":270},"git log                       # 完整日志\ngit log --oneline             # 单行\ngit log --oneline --graph     # 图形化\ngit log -p \u003Cfile>             # 查看某文件历史\ngit log --author=\"name\"       # 按作者过滤\ngit log --since=\"2 weeks ago\" # 按时间过滤\ngit log -S \"keyword\"          # 按内容变化搜索（pickaxe）\ngit blame \u003Cfile>              # 逐行查看最后修改者\ngit show \u003Ccommit>             # 查看某次提交详情\n",[69,2197,2198,2208,2220,2234,2254,2269,2284,2299,2317],{"__ignoreMap":270},[792,2199,2200,2202,2205],{"class":794,"line":795},[792,2201,805],{"class":804},[792,2203,2204],{"class":808}," log",[792,2206,2207],{"class":798},"                       # 完整日志\n",[792,2209,2210,2212,2214,2217],{"class":794,"line":271},[792,2211,805],{"class":804},[792,2213,2204],{"class":808},[792,2215,2216],{"class":812}," --oneline",[792,2218,2219],{"class":798},"             # 单行\n",[792,2221,2222,2224,2226,2228,2231],{"class":794,"line":747},[792,2223,805],{"class":804},[792,2225,2204],{"class":808},[792,2227,2216],{"class":812},[792,2229,2230],{"class":812}," --graph",[792,2232,2233],{"class":798},"     # 图形化\n",[792,2235,2236,2238,2240,2243,2245,2247,2249,2251],{"class":794,"line":836},[792,2237,805],{"class":804},[792,2239,2204],{"class":808},[792,2241,2242],{"class":812}," -p",[792,2244,1037],{"class":1036},[792,2246,1040],{"class":808},[792,2248,1044],{"class":1043},[792,2250,1047],{"class":1036},[792,2252,2253],{"class":798},"             # 查看某文件历史\n",[792,2255,2256,2258,2260,2263,2266],{"class":794,"line":842},[792,2257,805],{"class":804},[792,2259,2204],{"class":808},[792,2261,2262],{"class":812}," --author=",[792,2264,2265],{"class":808},"\"name\"",[792,2267,2268],{"class":798},"       # 按作者过滤\n",[792,2270,2271,2273,2275,2278,2281],{"class":794,"line":848},[792,2272,805],{"class":804},[792,2274,2204],{"class":808},[792,2276,2277],{"class":812}," --since=",[792,2279,2280],{"class":808},"\"2 weeks ago\"",[792,2282,2283],{"class":798}," # 按时间过滤\n",[792,2285,2286,2288,2290,2293,2296],{"class":794,"line":863},[792,2287,805],{"class":804},[792,2289,2204],{"class":808},[792,2291,2292],{"class":812}," -S",[792,2294,2295],{"class":808}," \"keyword\"",[792,2297,2298],{"class":798},"          # 按内容变化搜索（pickaxe）\n",[792,2300,2301,2303,2306,2308,2310,2312,2314],{"class":794,"line":868},[792,2302,805],{"class":804},[792,2304,2305],{"class":808}," blame",[792,2307,1037],{"class":1036},[792,2309,1040],{"class":808},[792,2311,1044],{"class":1043},[792,2313,1047],{"class":1036},[792,2315,2316],{"class":798},"              # 逐行查看最后修改者\n",[792,2318,2319,2321,2324,2326,2329,2332,2334],{"class":794,"line":874},[792,2320,805],{"class":804},[792,2322,2323],{"class":808}," show",[792,2325,1037],{"class":1036},[792,2327,2328],{"class":808},"commi",[792,2330,2331],{"class":1043},"t",[792,2333,1047],{"class":1036},[792,2335,2336],{"class":798},"             # 查看某次提交详情\n",[13,2338,2340],{"id":2339},"九常见问题","九、常见问题",[571,2342,2344],{"id":2343},"_1-提交信息写错了未推送","1. 提交信息写错了（未推送）",[784,2346,2348],{"className":786,"code":2347,"language":788,"meta":270,"style":270},"git commit --amend -m \"new message\"\n",[69,2349,2350],{"__ignoreMap":270},[792,2351,2352,2354,2356,2359,2361],{"class":794,"line":795},[792,2353,805],{"class":804},[792,2355,1081],{"class":808},[792,2357,2358],{"class":812}," --amend",[792,2360,1084],{"class":812},[792,2362,2363],{"class":808}," \"new message\"\n",[173,2365,2366],{},"如果只是想补充文件：",[784,2368,2370],{"className":786,"code":2369,"language":788,"meta":270,"style":270},"git add forgotten.txt\ngit commit --amend --no-edit\n",[69,2371,2372,2381],{"__ignoreMap":270},[792,2373,2374,2376,2378],{"class":794,"line":795},[792,2375,805],{"class":804},[792,2377,1033],{"class":808},[792,2379,2380],{"class":808}," forgotten.txt\n",[792,2382,2383,2385,2387,2389],{"class":794,"line":271},[792,2384,805],{"class":804},[792,2386,1081],{"class":808},[792,2388,2358],{"class":812},[792,2390,2391],{"class":812}," --no-edit\n",[571,2393,2395],{"id":2394},"_2-提交到了错误的分支","2. 提交到了错误的分支",[784,2397,2399],{"className":786,"code":2398,"language":788,"meta":270,"style":270},"# 假设应该提交到 feature 分支，却提交到了 main\ngit branch feature                # 在当前位置创建分支\ngit reset --hard HEAD~1           # main 回退\ngit switch feature                # 切到 feature\n",[69,2400,2401,2406,2418,2431],{"__ignoreMap":270},[792,2402,2403],{"class":794,"line":795},[792,2404,2405],{"class":798},"# 假设应该提交到 feature 分支，却提交到了 main\n",[792,2407,2408,2410,2412,2415],{"class":794,"line":271},[792,2409,805],{"class":804},[792,2411,1210],{"class":808},[792,2413,2414],{"class":808}," feature",[792,2416,2417],{"class":798},"                # 在当前位置创建分支\n",[792,2419,2420,2422,2424,2426,2428],{"class":794,"line":747},[792,2421,805],{"class":804},[792,2423,1640],{"class":808},[792,2425,1720],{"class":812},[792,2427,1699],{"class":808},[792,2429,2430],{"class":798},"           # main 回退\n",[792,2432,2433,2435,2437,2439],{"class":794,"line":836},[792,2434,805],{"class":804},[792,2436,1262],{"class":808},[792,2438,2414],{"class":808},[792,2440,2441],{"class":798},"                # 切到 feature\n",[571,2443,2445],{"id":2444},"_3-本地分支落后想同步远程","3. 本地分支落后，想同步远程",[784,2447,2449],{"className":786,"code":2448,"language":788,"meta":270,"style":270},"git fetch origin\ngit rebase origin\u002Fmain\n# 或者\ngit pull --rebase origin main\n",[69,2450,2451,2460,2469,2474],{"__ignoreMap":270},[792,2452,2453,2455,2457],{"class":794,"line":795},[792,2454,805],{"class":804},[792,2456,1998],{"class":808},[792,2458,2459],{"class":808}," origin\n",[792,2461,2462,2464,2466],{"class":794,"line":271},[792,2463,805],{"class":804},[792,2465,1440],{"class":808},[792,2467,2468],{"class":808}," origin\u002Fmain\n",[792,2470,2471],{"class":794,"line":747},[792,2472,2473],{"class":798},"# 或者\n",[792,2475,2476,2478,2480,2482,2484],{"class":794,"line":836},[792,2477,805],{"class":804},[792,2479,1121],{"class":808},[792,2481,2019],{"class":812},[792,2483,1938],{"class":808},[792,2485,912],{"class":808},[571,2487,2489],{"id":2488},"_4-合并冲突","4. 合并冲突",[784,2491,2493],{"className":786,"code":2492,"language":788,"meta":270,"style":270},"git status                        # 查看冲突文件\n# 手动编辑冲突文件，删除 \u003C\u003C\u003C\u003C\u003C\u003C\u003C ======= >>>>>>> 标记\ngit add \u003Cresolved-file>\ngit commit                        # 或 git rebase --continue\n",[69,2494,2495,2504,2509,2524],{"__ignoreMap":270},[792,2496,2497,2499,2501],{"class":794,"line":795},[792,2498,805],{"class":804},[792,2500,1023],{"class":808},[792,2502,2503],{"class":798},"                        # 查看冲突文件\n",[792,2505,2506],{"class":794,"line":271},[792,2507,2508],{"class":798},"# 手动编辑冲突文件，删除 \u003C\u003C\u003C\u003C\u003C\u003C\u003C ======= >>>>>>> 标记\n",[792,2510,2511,2513,2515,2517,2520,2522],{"class":794,"line":747},[792,2512,805],{"class":804},[792,2514,1033],{"class":808},[792,2516,1037],{"class":1036},[792,2518,2519],{"class":808},"resolved-fil",[792,2521,1044],{"class":1043},[792,2523,1748],{"class":1036},[792,2525,2526,2528,2530],{"class":794,"line":836},[792,2527,805],{"class":804},[792,2529,1081],{"class":808},[792,2531,2532],{"class":798},"                        # 或 git rebase --continue\n",[173,2534,2535],{},"放弃合并：",[784,2537,2539],{"className":786,"code":2538,"language":788,"meta":270,"style":270},"git merge --abort\ngit rebase --abort\n",[69,2540,2541,2550],{"__ignoreMap":270},[792,2542,2543,2545,2547],{"class":794,"line":795},[792,2544,805],{"class":804},[792,2546,1400],{"class":808},[792,2548,2549],{"class":812}," --abort\n",[792,2551,2552,2554,2556],{"class":794,"line":271},[792,2553,805],{"class":804},[792,2555,1440],{"class":808},[792,2557,2549],{"class":812},[571,2559,2561],{"id":2560},"_5-不小心提交了敏感信息","5. 不小心提交了敏感信息",[173,2563,2564,2565,2568,2569,2572],{},"如果还没推送，",[69,2566,2567],{},"git reset --hard"," 即可。",[2570,2571],"br",{},"\n如果已推送，必须改写历史：",[784,2574,2576],{"className":786,"code":2575,"language":788,"meta":270,"style":270},"git filter-repo --path secrets.txt --invert-paths\ngit push --force-with-lease\n",[69,2577,2578,2594],{"__ignoreMap":270},[792,2579,2580,2582,2585,2588,2591],{"class":794,"line":795},[792,2581,805],{"class":804},[792,2583,2584],{"class":808}," filter-repo",[792,2586,2587],{"class":812}," --path",[792,2589,2590],{"class":808}," secrets.txt",[792,2592,2593],{"class":812}," --invert-paths\n",[792,2595,2596,2598,2600],{"class":794,"line":271},[792,2597,805],{"class":804},[792,2599,1111],{"class":808},[792,2601,2602],{"class":812}," --force-with-lease\n",[173,2604,2605],{},"同时立即更换泄露的密钥，因为 Git 服务器可能仍留有副本。",[571,2607,2609],{"id":2608},"_6-忽略文件不生效","6. 忽略文件不生效",[784,2611,2613],{"className":786,"code":2612,"language":788,"meta":270,"style":270},"git rm -r --cached .\ngit add .\ngit commit -m \"fix gitignore\"\n",[69,2614,2615,2631,2639],{"__ignoreMap":270},[792,2616,2617,2619,2622,2625,2628],{"class":794,"line":795},[792,2618,805],{"class":804},[792,2620,2621],{"class":808}," rm",[792,2623,2624],{"class":812}," -r",[792,2626,2627],{"class":812}," --cached",[792,2629,2630],{"class":808}," .\n",[792,2632,2633,2635,2637],{"class":794,"line":271},[792,2634,805],{"class":804},[792,2636,1033],{"class":808},[792,2638,2630],{"class":808},[792,2640,2641,2643,2645,2647],{"class":794,"line":747},[792,2642,805],{"class":804},[792,2644,1081],{"class":808},[792,2646,1084],{"class":812},[792,2648,2649],{"class":808}," \"fix gitignore\"\n",[173,2651,2652,2655,2656,183],{},[69,2653,2654],{},".gitignore"," 只对未跟踪文件生效，已跟踪的文件需要先 ",[69,2657,2658],{},"rm --cached",[13,2660,2662],{"id":2661},"十提交规范conventional-commits","十、提交规范（Conventional Commits）",[784,2664,2669],{"className":2665,"code":2667,"language":2668},[2666],"language-text","\u003Ctype>(\u003Cscope>): \u003Csubject>\n\n\u003Cbody>\n\n\u003Cfooter>\n","text",[69,2670,2667],{"__ignoreMap":270},[173,2672,2673],{},"常用 type：",[18,2675,2676,2686],{},[21,2677,2678],{},[24,2679,2680,2683],{},[27,2681,2682],{},"type",[27,2684,2685],{},"说明",[35,2687,2688,2698,2708,2718,2728,2738,2748,2758],{},[24,2689,2690,2695],{},[40,2691,2692],{},[69,2693,2694],{},"feat",[40,2696,2697],{},"新功能",[24,2699,2700,2705],{},[40,2701,2702],{},[69,2703,2704],{},"fix",[40,2706,2707],{},"修复 bug",[24,2709,2710,2715],{},[40,2711,2712],{},[69,2713,2714],{},"docs",[40,2716,2717],{},"文档变更",[24,2719,2720,2725],{},[40,2721,2722],{},[69,2723,2724],{},"style",[40,2726,2727],{},"格式调整（不影响代码逻辑）",[24,2729,2730,2735],{},[40,2731,2732],{},[69,2733,2734],{},"refactor",[40,2736,2737],{},"重构",[24,2739,2740,2745],{},[40,2741,2742],{},[69,2743,2744],{},"perf",[40,2746,2747],{},"性能优化",[24,2749,2750,2755],{},[40,2751,2752],{},[69,2753,2754],{},"test",[40,2756,2757],{},"测试相关",[24,2759,2760,2765],{},[40,2761,2762],{},[69,2763,2764],{},"chore",[40,2766,2767],{},"构建 \u002F 工具 \u002F 依赖变更",[173,2769,2770],{},"示例：",[784,2772,2775],{"className":2773,"code":2774,"language":2668},[2666],"feat(auth): 支持 OAuth 2.0 登录\n\n- 新增 GitHub \u002F Google 登录入口\n- 补充 token 刷新逻辑\n\nCloses #123\n",[69,2776,2774],{"__ignoreMap":270},[13,2778,2780],{"id":2779},"十一实用技巧","十一、实用技巧",[784,2782,2784],{"className":786,"code":2783,"language":788,"meta":270,"style":270},"# 快速查看某文件的最后一次修改\ngit log -1 --stat \u003Cfile>\n\n# 查找是哪次提交引入了某个字符串\ngit log -S \"search-string\" --source --all\n\n# 查看两个分支的共同祖先\ngit merge-base main feature\n\n# 比较工作区和某个提交\ngit diff \u003Ccommit>\n\n# 临时切换到某个提交查看，不切分支\ngit switch --detach \u003Ccommit>\n\n# 查看暂存区的具体内容\ngit diff --staged\n\n# 统计每个作者的提交数\ngit shortlog -sn\n\n# 找出未被合并的分支\ngit branch --no-merged\n",[69,2785,2786,2791,2811,2815,2820,2837,2841,2846,2859,2863,2868,2882,2886,2891,2908,2912,2917,2926,2930,2935,2945,2949,2955],{"__ignoreMap":270},[792,2787,2788],{"class":794,"line":795},[792,2789,2790],{"class":798},"# 快速查看某文件的最后一次修改\n",[792,2792,2793,2795,2797,2800,2803,2805,2807,2809],{"class":794,"line":271},[792,2794,805],{"class":804},[792,2796,2204],{"class":808},[792,2798,2799],{"class":812}," -1",[792,2801,2802],{"class":812}," --stat",[792,2804,1037],{"class":1036},[792,2806,1040],{"class":808},[792,2808,1044],{"class":1043},[792,2810,1748],{"class":1036},[792,2812,2813],{"class":794,"line":747},[792,2814,839],{"emptyLinePlaceholder":286},[792,2816,2817],{"class":794,"line":836},[792,2818,2819],{"class":798},"# 查找是哪次提交引入了某个字符串\n",[792,2821,2822,2824,2826,2828,2831,2834],{"class":794,"line":842},[792,2823,805],{"class":804},[792,2825,2204],{"class":808},[792,2827,2292],{"class":812},[792,2829,2830],{"class":808}," \"search-string\"",[792,2832,2833],{"class":812}," --source",[792,2835,2836],{"class":812}," --all\n",[792,2838,2839],{"class":794,"line":848},[792,2840,839],{"emptyLinePlaceholder":286},[792,2842,2843],{"class":794,"line":863},[792,2844,2845],{"class":798},"# 查看两个分支的共同祖先\n",[792,2847,2848,2850,2853,2856],{"class":794,"line":868},[792,2849,805],{"class":804},[792,2851,2852],{"class":808}," merge-base",[792,2854,2855],{"class":808}," main",[792,2857,2858],{"class":808}," feature\n",[792,2860,2861],{"class":794,"line":874},[792,2862,839],{"emptyLinePlaceholder":286},[792,2864,2865],{"class":794,"line":889},[792,2866,2867],{"class":798},"# 比较工作区和某个提交\n",[792,2869,2870,2872,2874,2876,2878,2880],{"class":794,"line":894},[792,2871,805],{"class":804},[792,2873,1139],{"class":808},[792,2875,1037],{"class":1036},[792,2877,2328],{"class":808},[792,2879,2331],{"class":1043},[792,2881,1748],{"class":1036},[792,2883,2884],{"class":794,"line":900},[792,2885,839],{"emptyLinePlaceholder":286},[792,2887,2888],{"class":794,"line":915},[792,2889,2890],{"class":798},"# 临时切换到某个提交查看，不切分支\n",[792,2892,2893,2895,2897,2900,2902,2904,2906],{"class":794,"line":920},[792,2894,805],{"class":804},[792,2896,1262],{"class":808},[792,2898,2899],{"class":812}," --detach",[792,2901,1037],{"class":1036},[792,2903,2328],{"class":808},[792,2905,2331],{"class":1043},[792,2907,1748],{"class":1036},[792,2909,2910],{"class":794,"line":926},[792,2911,839],{"emptyLinePlaceholder":286},[792,2913,2914],{"class":794,"line":941},[792,2915,2916],{"class":798},"# 查看暂存区的具体内容\n",[792,2918,2919,2921,2923],{"class":794,"line":956},[792,2920,805],{"class":804},[792,2922,1139],{"class":808},[792,2924,2925],{"class":812}," --staged\n",[792,2927,2928],{"class":794,"line":971},[792,2929,839],{"emptyLinePlaceholder":286},[792,2931,2932],{"class":794,"line":986},[792,2933,2934],{"class":798},"# 统计每个作者的提交数\n",[792,2936,2937,2939,2942],{"class":794,"line":991},[792,2938,805],{"class":804},[792,2940,2941],{"class":808}," shortlog",[792,2943,2944],{"class":812}," -sn\n",[792,2946,2947],{"class":794,"line":997},[792,2948,839],{"emptyLinePlaceholder":286},[792,2950,2952],{"class":794,"line":2951},22,[792,2953,2954],{"class":798},"# 找出未被合并的分支\n",[792,2956,2958,2960,2962],{"class":794,"line":2957},23,[792,2959,805],{"class":804},[792,2961,1210],{"class":808},[792,2963,2964],{"class":812}," --no-merged\n",[13,2966,2968],{"id":2967},"十二配置文件位置","十二、配置文件位置",[18,2970,2971,2981],{},[21,2972,2973],{},[24,2974,2975,2978],{},[27,2976,2977],{},"级别",[27,2979,2980],{},"路径",[35,2982,2983,2998,3012],{},[24,2984,2985,2988],{},[40,2986,2987],{},"系统",[40,2989,2990,2993,2994,2997],{},[69,2991,2992],{},"\u002Fetc\u002Fgitconfig","（Linux）\u002F ",[69,2995,2996],{},"C:\\Program Files\\Git\\etc\\gitconfig","（Windows）",[24,2999,3000,3003],{},[40,3001,3002],{},"全局",[40,3004,3005,3008,3009],{},[69,3006,3007],{},"~\u002F.gitconfig"," \u002F ",[69,3010,3011],{},"%USERPROFILE%\\.gitconfig",[24,3013,3014,3017],{},[40,3015,3016],{},"仓库",[40,3018,3019],{},[69,3020,3021],{},"\u003Crepo>\u002F.git\u002Fconfig",[173,3023,3024],{},"优先级：仓库 > 全局 > 系统。",[3026,3027],"hr",{},[13,3029,3030],{"id":3030},"参考",[77,3032,3033,3040,3047],{},[80,3034,3035,3036],{},"官方文档：",[158,3037,3038],{"href":3038,"rel":3039,"target":165},"https:\u002F\u002Fgit-scm.com\u002Fdocs",[162,163,164],[80,3041,3042,3043],{},"Pro Git（中文版）：",[158,3044,3045],{"href":3045,"rel":3046,"target":165},"https:\u002F\u002Fgit-scm.com\u002Fbook\u002Fzh\u002Fv2",[162,163,164],[80,3048,3049,3050],{},"Conventional Commits：",[158,3051,3052],{"href":3052,"rel":3053,"target":165},"https:\u002F\u002Fwww.conventionalcommits.org\u002Fzh-hans\u002F",[162,163,164],[2724,3055,3056],{},"html pre.shiki code .snpHw, html code.shiki .snpHw{--shiki-default:#88846F}html pre.shiki code .sHkqI, html code.shiki .sHkqI{--shiki-default:#A6E22E}html pre.shiki code .s_Ekj, html code.shiki .s_Ekj{--shiki-default:#E6DB74}html pre.shiki code .s7s5_, html code.shiki .s7s5_{--shiki-default:#AE81FF}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 pre.shiki code .s8I7P, html code.shiki .s8I7P{--shiki-default:#F92672}html pre.shiki code .sCdxs, html code.shiki .sCdxs{--shiki-default:#F8F8F2}",{"title":270,"searchDepth":271,"depth":271,"links":3058},[3059,3060,3063,3066,3072,3073,3074,3075,3076,3084,3085,3086,3087],{"id":781,"depth":271,"text":782},{"id":1010,"depth":271,"text":1011,"children":3061},[3062],{"id":1127,"depth":747,"text":1127},{"id":1197,"depth":271,"text":1198,"children":3064},[3065],{"id":1388,"depth":747,"text":1388},{"id":1477,"depth":271,"text":1478,"children":3067},[3068,3069,3070,3071],{"id":1552,"depth":747,"text":1552},{"id":1609,"depth":747,"text":1609},{"id":1656,"depth":747,"text":1656},{"id":1751,"depth":747,"text":1751},{"id":1799,"depth":271,"text":1800},{"id":1908,"depth":271,"text":1909},{"id":2090,"depth":271,"text":2091},{"id":2191,"depth":271,"text":2192},{"id":2339,"depth":271,"text":2340,"children":3077},[3078,3079,3080,3081,3082,3083],{"id":2343,"depth":747,"text":2344},{"id":2394,"depth":747,"text":2395},{"id":2444,"depth":747,"text":2445},{"id":2488,"depth":747,"text":2489},{"id":2560,"depth":747,"text":2561},{"id":2608,"depth":747,"text":2609},{"id":2661,"depth":271,"text":2662},{"id":2779,"depth":271,"text":2780},{"id":2967,"depth":271,"text":2968},{"id":3030,"depth":271,"text":3030},"2026-09-25",{},"\u002Fgit-memo-2026-09-25",{"title":773,"description":778},"git-memo-2026-09-25",[3094,3095],"Git","备忘录","0H9pi2QAc8Lw_Eh4bdHwdkFMYOEf4495Ze_IMkWMpDk",{"id":3098,"title":3099,"author":8,"body":3100,"cover":3,"date":3088,"description":3104,"extension":284,"meta":8732,"navigation":286,"path":8733,"seo":8734,"stem":8735,"tags":8736,"__hash__":8739},"content\u002Flinux-memo-2026-09-25.md","Linux 备忘录",{"type":10,"value":3101,"toc":8684},[3102,3105,3109,3113,3116,3173,3183,3206,3216,3220,3284,3288,3390,3396,3474,3479,3524,3528,3535,3541,3544,3601,3605,3699,3702,3760,3764,3769,3828,3876,3881,3885,3915,3919,3924,3966,3970,4050,4054,4246,4249,4401,4405,4786,4789,4856,4860,4967,4970,5016,5033,5036,5095,5099,5298,5301,5361,5365,5690,5693,5830,5834,5964,5967,6015,6019,6203,6207,6402,6405,6414,6420,6424,6587,6593,6668,6696,6700,6808,6813,6819,6825,6828,6946,6950,6954,7148,7152,7354,7358,7442,7446,7567,7571,7718,7722,7791,7794,7831,7834,7973,7977,8010,8013,8019,8021,8027,8030,8044,8048,8252,8255,8326,8329,8520,8524,8634,8636,8638,8681],[173,3103,3104],{},"国内环境下的高频命令。换源和镜像放在最前面。",[13,3106,3108],{"id":3107},"一换源","一、换源",[571,3110,3112],{"id":3111},"_11-aptdebian-ubuntu","1.1 apt（Debian \u002F Ubuntu）",[173,3114,3115],{},"先备份，再替换：",[784,3117,3119],{"className":786,"code":3118,"language":788,"meta":270,"style":270},"sudo cp \u002Fetc\u002Fapt\u002Fsources.list \u002Fetc\u002Fapt\u002Fsources.list.bak\nsudo sed -i 's|http:\u002F\u002Farchive.ubuntu.com|https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn|g' \u002Fetc\u002Fapt\u002Fsources.list\nsudo sed -i 's|http:\u002F\u002Fsecurity.ubuntu.com|https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn|g' \u002Fetc\u002Fapt\u002Fsources.list\nsudo apt update\n",[69,3120,3121,3135,3150,3163],{"__ignoreMap":270},[792,3122,3123,3126,3129,3132],{"class":794,"line":795},[792,3124,3125],{"class":804},"sudo",[792,3127,3128],{"class":808}," cp",[792,3130,3131],{"class":808}," \u002Fetc\u002Fapt\u002Fsources.list",[792,3133,3134],{"class":808}," \u002Fetc\u002Fapt\u002Fsources.list.bak\n",[792,3136,3137,3139,3142,3144,3147],{"class":794,"line":271},[792,3138,3125],{"class":804},[792,3140,3141],{"class":808}," sed",[792,3143,1460],{"class":812},[792,3145,3146],{"class":808}," 's|http:\u002F\u002Farchive.ubuntu.com|https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn|g'",[792,3148,3149],{"class":808}," \u002Fetc\u002Fapt\u002Fsources.list\n",[792,3151,3152,3154,3156,3158,3161],{"class":794,"line":747},[792,3153,3125],{"class":804},[792,3155,3141],{"class":808},[792,3157,1460],{"class":812},[792,3159,3160],{"class":808}," 's|http:\u002F\u002Fsecurity.ubuntu.com|https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn|g'",[792,3162,3149],{"class":808},[792,3164,3165,3167,3170],{"class":794,"line":836},[792,3166,3125],{"class":804},[792,3168,3169],{"class":808}," apt",[792,3171,3172],{"class":808}," update\n",[173,3174,3175,3178,3179,3182],{},[43,3176,3177],{},"Ubuntu 24.04+"," 使用新格式 ",[69,3180,3181],{},"\u002Fetc\u002Fapt\u002Fsources.list.d\u002Fubuntu.sources","：",[784,3184,3186],{"className":786,"code":3185,"language":788,"meta":270,"style":270},"sudo sed -i 's|http:\u002F\u002Farchive.ubuntu.com|https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn|g' \\\n  \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fubuntu.sources\n",[69,3187,3188,3201],{"__ignoreMap":270},[792,3189,3190,3192,3194,3196,3198],{"class":794,"line":795},[792,3191,3125],{"class":804},[792,3193,3141],{"class":808},[792,3195,1460],{"class":812},[792,3197,3146],{"class":808},[792,3199,3200],{"class":812}," \\\n",[792,3202,3203],{"class":794,"line":271},[792,3204,3205],{"class":808},"  \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fubuntu.sources\n",[173,3207,3208,3211,3212,3215],{},[43,3209,3210],{},"Debian 12+"," 使用 ",[69,3213,3214],{},"\u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdebian.sources","，同理。",[571,3217,3219],{"id":3218},"_12-常用-apt-镜像源","1.2 常用 apt 镜像源",[18,3221,3222,3232],{},[21,3223,3224],{},[24,3225,3226,3229],{},[27,3227,3228],{},"源",[27,3230,3231],{},"URL",[35,3233,3234,3244,3254,3264,3274],{},[24,3235,3236,3239],{},[40,3237,3238],{},"清华",[40,3240,3241],{},[69,3242,3243],{},"https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn",[24,3245,3246,3249],{},[40,3247,3248],{},"阿里云",[40,3250,3251],{},[69,3252,3253],{},"https:\u002F\u002Fmirrors.aliyun.com",[24,3255,3256,3259],{},[40,3257,3258],{},"中科大",[40,3260,3261],{},[69,3262,3263],{},"https:\u002F\u002Fmirrors.ustc.edu.cn",[24,3265,3266,3269],{},[40,3267,3268],{},"华为云",[40,3270,3271],{},[69,3272,3273],{},"https:\u002F\u002Fmirrors.huaweicloud.com",[24,3275,3276,3279],{},[40,3277,3278],{},"网易",[40,3280,3281],{},[69,3282,3283],{},"https:\u002F\u002Fmirrors.163.com",[571,3285,3287],{"id":3286},"_13-yum-dnfrhel-centos-fedora","1.3 yum \u002F dnf（RHEL \u002F CentOS \u002F Fedora）",[784,3289,3291],{"className":786,"code":3290,"language":788,"meta":270,"style":270},"# 备份\nsudo cp -r \u002Fetc\u002Fyum.repos.d \u002Fetc\u002Fyum.repos.d.bak\n\n# CentOS 7 换阿里云\nsudo sed -i 's|mirrorlist=|#mirrorlist=|g' \u002Fetc\u002Fyum.repos.d\u002FCentOS-*.repo\nsudo sed -i 's|#baseurl=http:\u002F\u002Fmirror.centos.org|baseurl=https:\u002F\u002Fmirrors.aliyun.com|g' \\\n  \u002Fetc\u002Fyum.repos.d\u002FCentOS-*.repo\n\nsudo yum clean all\nsudo yum makecache\n",[69,3292,3293,3298,3312,3316,3321,3342,3355,3364,3368,3381],{"__ignoreMap":270},[792,3294,3295],{"class":794,"line":795},[792,3296,3297],{"class":798},"# 备份\n",[792,3299,3300,3302,3304,3306,3309],{"class":794,"line":271},[792,3301,3125],{"class":804},[792,3303,3128],{"class":808},[792,3305,2624],{"class":812},[792,3307,3308],{"class":808}," \u002Fetc\u002Fyum.repos.d",[792,3310,3311],{"class":808}," \u002Fetc\u002Fyum.repos.d.bak\n",[792,3313,3314],{"class":794,"line":747},[792,3315,839],{"emptyLinePlaceholder":286},[792,3317,3318],{"class":794,"line":836},[792,3319,3320],{"class":798},"# CentOS 7 换阿里云\n",[792,3322,3323,3325,3327,3329,3332,3335,3339],{"class":794,"line":842},[792,3324,3125],{"class":804},[792,3326,3141],{"class":808},[792,3328,1460],{"class":812},[792,3330,3331],{"class":808}," 's|mirrorlist=|#mirrorlist=|g'",[792,3333,3334],{"class":808}," \u002Fetc\u002Fyum.repos.d\u002FCentOS-",[792,3336,3338],{"class":3337},"szGx7","*",[792,3340,3341],{"class":808},".repo\n",[792,3343,3344,3346,3348,3350,3353],{"class":794,"line":848},[792,3345,3125],{"class":804},[792,3347,3141],{"class":808},[792,3349,1460],{"class":812},[792,3351,3352],{"class":808}," 's|#baseurl=http:\u002F\u002Fmirror.centos.org|baseurl=https:\u002F\u002Fmirrors.aliyun.com|g'",[792,3354,3200],{"class":812},[792,3356,3357,3360,3362],{"class":794,"line":863},[792,3358,3359],{"class":808},"  \u002Fetc\u002Fyum.repos.d\u002FCentOS-",[792,3361,3338],{"class":3337},[792,3363,3341],{"class":808},[792,3365,3366],{"class":794,"line":868},[792,3367,839],{"emptyLinePlaceholder":286},[792,3369,3370,3372,3375,3378],{"class":794,"line":874},[792,3371,3125],{"class":804},[792,3373,3374],{"class":808}," yum",[792,3376,3377],{"class":808}," clean",[792,3379,3380],{"class":808}," all\n",[792,3382,3383,3385,3387],{"class":794,"line":889},[792,3384,3125],{"class":804},[792,3386,3374],{"class":808},[792,3388,3389],{"class":808}," makecache\n",[173,3391,3392,3395],{},[43,3393,3394],{},"CentOS 8 \u002F Stream"," 需要先换 vault（官方源已下线）：",[784,3397,3399],{"className":786,"code":3398,"language":788,"meta":270,"style":270},"sudo sed -i 's|mirror.centos.org|mirrors.aliyun.com|g' \u002Fetc\u002Fyum.repos.d\u002F*.repo\nsudo sed -i 's|^#baseurl|baseurl|g' \u002Fetc\u002Fyum.repos.d\u002F*.repo\nsudo sed -i 's|^mirrorlist|#mirrorlist|g' \u002Fetc\u002Fyum.repos.d\u002F*.repo\nsudo dnf clean all && sudo dnf makecache\n",[69,3400,3401,3419,3436,3453],{"__ignoreMap":270},[792,3402,3403,3405,3407,3409,3412,3415,3417],{"class":794,"line":795},[792,3404,3125],{"class":804},[792,3406,3141],{"class":808},[792,3408,1460],{"class":812},[792,3410,3411],{"class":808}," 's|mirror.centos.org|mirrors.aliyun.com|g'",[792,3413,3414],{"class":808}," \u002Fetc\u002Fyum.repos.d\u002F",[792,3416,3338],{"class":3337},[792,3418,3341],{"class":808},[792,3420,3421,3423,3425,3427,3430,3432,3434],{"class":794,"line":271},[792,3422,3125],{"class":804},[792,3424,3141],{"class":808},[792,3426,1460],{"class":812},[792,3428,3429],{"class":808}," 's|^#baseurl|baseurl|g'",[792,3431,3414],{"class":808},[792,3433,3338],{"class":3337},[792,3435,3341],{"class":808},[792,3437,3438,3440,3442,3444,3447,3449,3451],{"class":794,"line":747},[792,3439,3125],{"class":804},[792,3441,3141],{"class":808},[792,3443,1460],{"class":812},[792,3445,3446],{"class":808}," 's|^mirrorlist|#mirrorlist|g'",[792,3448,3414],{"class":808},[792,3450,3338],{"class":3337},[792,3452,3341],{"class":808},[792,3454,3455,3457,3460,3462,3465,3468,3470,3472],{"class":794,"line":836},[792,3456,3125],{"class":804},[792,3458,3459],{"class":808}," dnf",[792,3461,3377],{"class":808},[792,3463,3464],{"class":808}," all",[792,3466,3467],{"class":1043}," && ",[792,3469,3125],{"class":804},[792,3471,3459],{"class":808},[792,3473,3389],{"class":808},[173,3475,3476,3182],{},[43,3477,3478],{},"Fedora",[784,3480,3482],{"className":786,"code":3481,"language":788,"meta":270,"style":270},"sudo sed -i 's|^metalink=|#metalink=|g' \u002Fetc\u002Fyum.repos.d\u002Ffedora*.repo\nsudo sed -i 's|^#baseurl=http:\u002F\u002Fdownload.example\u002Fpub\u002Ffedora\u002Flinux|baseurl=https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn\u002Ffedora|g' \\\n  \u002Fetc\u002Fyum.repos.d\u002Ffedora*.repo\n",[69,3483,3484,3502,3515],{"__ignoreMap":270},[792,3485,3486,3488,3490,3492,3495,3498,3500],{"class":794,"line":795},[792,3487,3125],{"class":804},[792,3489,3141],{"class":808},[792,3491,1460],{"class":812},[792,3493,3494],{"class":808}," 's|^metalink=|#metalink=|g'",[792,3496,3497],{"class":808}," \u002Fetc\u002Fyum.repos.d\u002Ffedora",[792,3499,3338],{"class":3337},[792,3501,3341],{"class":808},[792,3503,3504,3506,3508,3510,3513],{"class":794,"line":271},[792,3505,3125],{"class":804},[792,3507,3141],{"class":808},[792,3509,1460],{"class":812},[792,3511,3512],{"class":808}," 's|^#baseurl=http:\u002F\u002Fdownload.example\u002Fpub\u002Ffedora\u002Flinux|baseurl=https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn\u002Ffedora|g'",[792,3514,3200],{"class":812},[792,3516,3517,3520,3522],{"class":794,"line":747},[792,3518,3519],{"class":808},"  \u002Fetc\u002Fyum.repos.d\u002Ffedora",[792,3521,3338],{"class":3337},[792,3523,3341],{"class":808},[571,3525,3527],{"id":3526},"_14-pacmanarch","1.4 pacman（Arch）",[173,3529,3530,3531,3534],{},"编辑 ",[69,3532,3533],{},"\u002Fetc\u002Fpacman.d\u002Fmirrorlist","，把国内源放前面：",[784,3536,3539],{"className":3537,"code":3538,"language":2668},[2666],"Server = https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn\u002Farchlinux\u002F$repo\u002Fos\u002F$arch\nServer = https:\u002F\u002Fmirrors.ustc.edu.cn\u002Farchlinux\u002F$repo\u002Fos\u002F$arch\n",[69,3540,3538],{"__ignoreMap":270},[173,3542,3543],{},"或者一键：",[784,3545,3547],{"className":786,"code":3546,"language":788,"meta":270,"style":270},"sudo pacman -S reflector\nsudo reflector --country China --latest 5 --sort rate --save \u002Fetc\u002Fpacman.d\u002Fmirrorlist\nsudo pacman -Syyu\n",[69,3548,3549,3561,3592],{"__ignoreMap":270},[792,3550,3551,3553,3556,3558],{"class":794,"line":795},[792,3552,3125],{"class":804},[792,3554,3555],{"class":808}," pacman",[792,3557,2292],{"class":812},[792,3559,3560],{"class":808}," reflector\n",[792,3562,3563,3565,3568,3571,3574,3577,3580,3583,3586,3589],{"class":794,"line":271},[792,3564,3125],{"class":804},[792,3566,3567],{"class":808}," reflector",[792,3569,3570],{"class":812}," --country",[792,3572,3573],{"class":808}," China",[792,3575,3576],{"class":812}," --latest",[792,3578,3579],{"class":812}," 5",[792,3581,3582],{"class":812}," --sort",[792,3584,3585],{"class":808}," rate",[792,3587,3588],{"class":812}," --save",[792,3590,3591],{"class":808}," \u002Fetc\u002Fpacman.d\u002Fmirrorlist\n",[792,3593,3594,3596,3598],{"class":794,"line":747},[792,3595,3125],{"class":804},[792,3597,3555],{"class":808},[792,3599,3600],{"class":812}," -Syyu\n",[571,3602,3604],{"id":3603},"_15-pip-换源","1.5 pip 换源",[784,3606,3608],{"className":786,"code":3607,"language":788,"meta":270,"style":270},"# 永久\npip config set global.index-url https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\npip config set global.trusted-host pypi.tuna.tsinghua.edu.cn\n\n# 或写入 ~\u002F.pip\u002Fpip.conf (Linux) \u002F %APPDATA%\\pip\\pip.ini (Windows)\n# [global]\n# index-url = https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\n# trusted-host = pypi.tuna.tsinghua.edu.cn\n\n# 一次性\npip install \u003Cpkg> -i https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\n",[69,3609,3610,3615,3631,3645,3649,3654,3659,3664,3669,3673,3678],{"__ignoreMap":270},[792,3611,3612],{"class":794,"line":795},[792,3613,3614],{"class":798},"# 永久\n",[792,3616,3617,3620,3622,3625,3628],{"class":794,"line":271},[792,3618,3619],{"class":804},"pip",[792,3621,809],{"class":808},[792,3623,3624],{"class":808}," set",[792,3626,3627],{"class":808}," global.index-url",[792,3629,3630],{"class":808}," https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\n",[792,3632,3633,3635,3637,3639,3642],{"class":794,"line":747},[792,3634,3619],{"class":804},[792,3636,809],{"class":808},[792,3638,3624],{"class":808},[792,3640,3641],{"class":808}," global.trusted-host",[792,3643,3644],{"class":808}," pypi.tuna.tsinghua.edu.cn\n",[792,3646,3647],{"class":794,"line":836},[792,3648,839],{"emptyLinePlaceholder":286},[792,3650,3651],{"class":794,"line":842},[792,3652,3653],{"class":798},"# 或写入 ~\u002F.pip\u002Fpip.conf (Linux) \u002F %APPDATA%\\pip\\pip.ini (Windows)\n",[792,3655,3656],{"class":794,"line":848},[792,3657,3658],{"class":798},"# [global]\n",[792,3660,3661],{"class":794,"line":863},[792,3662,3663],{"class":798},"# index-url = https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\n",[792,3665,3666],{"class":794,"line":868},[792,3667,3668],{"class":798},"# trusted-host = pypi.tuna.tsinghua.edu.cn\n",[792,3670,3671],{"class":794,"line":874},[792,3672,839],{"emptyLinePlaceholder":286},[792,3674,3675],{"class":794,"line":889},[792,3676,3677],{"class":798},"# 一次性\n",[792,3679,3680,3682,3685,3687,3690,3693,3695,3697],{"class":794,"line":894},[792,3681,3619],{"class":804},[792,3683,3684],{"class":808}," install",[792,3686,1037],{"class":1036},[792,3688,3689],{"class":808},"pk",[792,3691,3692],{"class":1043},"g",[792,3694,1047],{"class":1036},[792,3696,1460],{"class":812},[792,3698,3630],{"class":808},[173,3700,3701],{},"常用 pip 镜像：",[18,3703,3704,3712],{},[21,3705,3706],{},[24,3707,3708,3710],{},[27,3709,3228],{},[27,3711,3231],{},[35,3713,3714,3723,3732,3741,3751],{},[24,3715,3716,3718],{},[40,3717,3238],{},[40,3719,3720],{},[69,3721,3722],{},"https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple",[24,3724,3725,3727],{},[40,3726,3248],{},[40,3728,3729],{},[69,3730,3731],{},"https:\u002F\u002Fmirrors.aliyun.com\u002Fpypi\u002Fsimple\u002F",[24,3733,3734,3736],{},[40,3735,3258],{},[40,3737,3738],{},[69,3739,3740],{},"https:\u002F\u002Fpypi.mirrors.ustc.edu.cn\u002Fsimple\u002F",[24,3742,3743,3746],{},[40,3744,3745],{},"豆瓣",[40,3747,3748],{},[69,3749,3750],{},"https:\u002F\u002Fpypi.douban.com\u002Fsimple\u002F",[24,3752,3753,3755],{},[40,3754,3268],{},[40,3756,3757],{},[69,3758,3759],{},"https:\u002F\u002Fmirrors.huaweicloud.com\u002Frepository\u002Fpypi\u002Fsimple\u002F",[571,3761,3763],{"id":3762},"_16-docker-镜像加速","1.6 Docker 镜像加速",[173,3765,3530,3766,3182],{},[69,3767,3768],{},"\u002Fetc\u002Fdocker\u002Fdaemon.json",[784,3770,3774],{"className":3771,"code":3772,"language":3773,"meta":270,"style":270},"language-json shiki shiki-themes monokai","{\n  \"registry-mirrors\": [\n    \"https:\u002F\u002Fdocker.m.daocloud.io\",\n    \"https:\u002F\u002Fdockerproxy.com\",\n    \"https:\u002F\u002Fmirror.baidubce.com\",\n    \"https:\u002F\u002Fccr.ccs.tencentyun.com\"\n  ]\n}\n","json",[69,3775,3776,3781,3790,3799,3806,3813,3818,3823],{"__ignoreMap":270},[792,3777,3778],{"class":794,"line":795},[792,3779,3780],{"class":1043},"{\n",[792,3782,3783,3787],{"class":794,"line":271},[792,3784,3786],{"class":3785},"sOx1s","  \"registry-mirrors\"",[792,3788,3789],{"class":1043},": [\n",[792,3791,3792,3796],{"class":794,"line":747},[792,3793,3795],{"class":3794},"susgL","    \"https:\u002F\u002Fdocker.m.daocloud.io\"",[792,3797,3798],{"class":1043},",\n",[792,3800,3801,3804],{"class":794,"line":836},[792,3802,3803],{"class":3794},"    \"https:\u002F\u002Fdockerproxy.com\"",[792,3805,3798],{"class":1043},[792,3807,3808,3811],{"class":794,"line":842},[792,3809,3810],{"class":3794},"    \"https:\u002F\u002Fmirror.baidubce.com\"",[792,3812,3798],{"class":1043},[792,3814,3815],{"class":794,"line":848},[792,3816,3817],{"class":3794},"    \"https:\u002F\u002Fccr.ccs.tencentyun.com\"\n",[792,3819,3820],{"class":794,"line":863},[792,3821,3822],{"class":1043},"  ]\n",[792,3824,3825],{"class":794,"line":868},[792,3826,3827],{"class":1043},"}\n",[784,3829,3831],{"className":786,"code":3830,"language":788,"meta":270,"style":270},"sudo systemctl daemon-reload\nsudo systemctl restart docker\ndocker info | grep -A 5 \"Registry Mirrors\"\n",[69,3832,3833,3843,3855],{"__ignoreMap":270},[792,3834,3835,3837,3840],{"class":794,"line":795},[792,3836,3125],{"class":804},[792,3838,3839],{"class":808}," systemctl",[792,3841,3842],{"class":808}," daemon-reload\n",[792,3844,3845,3847,3849,3852],{"class":794,"line":271},[792,3846,3125],{"class":804},[792,3848,3839],{"class":808},[792,3850,3851],{"class":808}," restart",[792,3853,3854],{"class":808}," docker\n",[792,3856,3857,3860,3863,3866,3869,3871,3873],{"class":794,"line":747},[792,3858,3859],{"class":804},"docker",[792,3861,3862],{"class":808}," info",[792,3864,3865],{"class":1036}," |",[792,3867,3868],{"class":804}," grep",[792,3870,1071],{"class":812},[792,3872,3579],{"class":812},[792,3874,3875],{"class":808}," \"Registry Mirrors\"\n",[189,3877,3878],{},[173,3879,3880],{},"2024 年后很多公共镜像源已停服，以上仅供参考。企业环境建议自建 Harbor 或使用阿里云\u002F腾讯云容器镜像服务。",[571,3882,3884],{"id":3883},"_17-go-module-代理","1.7 Go module 代理",[784,3886,3888],{"className":786,"code":3887,"language":788,"meta":270,"style":270},"go env -w GOPROXY=https:\u002F\u002Fgoproxy.cn,direct\ngo env -w GOSUMDB=sum.golang.google.cn\n",[69,3889,3890,3904],{"__ignoreMap":270},[792,3891,3892,3895,3898,3901],{"class":794,"line":795},[792,3893,3894],{"class":804},"go",[792,3896,3897],{"class":808}," env",[792,3899,3900],{"class":812}," -w",[792,3902,3903],{"class":808}," GOPROXY=https:\u002F\u002Fgoproxy.cn,direct\n",[792,3905,3906,3908,3910,3912],{"class":794,"line":271},[792,3907,3894],{"class":804},[792,3909,3897],{"class":808},[792,3911,3900],{"class":812},[792,3913,3914],{"class":808}," GOSUMDB=sum.golang.google.cn\n",[571,3916,3918],{"id":3917},"_18-maven-换源","1.8 Maven 换源",[173,3920,3530,3921,3182],{},[69,3922,3923],{},"~\u002F.m2\u002Fsettings.xml",[784,3925,3929],{"className":3926,"code":3927,"language":3928,"meta":270,"style":270},"language-xml shiki shiki-themes monokai","\u003Cmirrors>\n  \u003Cmirror>\n    \u003Cid>aliyun\u003C\u002Fid>\n    \u003CmirrorOf>central\u003C\u002FmirrorOf>\n    \u003Curl>https:\u002F\u002Fmaven.aliyun.com\u002Frepository\u002Fpublic\u003C\u002Furl>\n  \u003C\u002Fmirror>\n\u003C\u002Fmirrors>\n","xml",[69,3930,3931,3936,3941,3946,3951,3956,3961],{"__ignoreMap":270},[792,3932,3933],{"class":794,"line":795},[792,3934,3935],{},"\u003Cmirrors>\n",[792,3937,3938],{"class":794,"line":271},[792,3939,3940],{},"  \u003Cmirror>\n",[792,3942,3943],{"class":794,"line":747},[792,3944,3945],{},"    \u003Cid>aliyun\u003C\u002Fid>\n",[792,3947,3948],{"class":794,"line":836},[792,3949,3950],{},"    \u003CmirrorOf>central\u003C\u002FmirrorOf>\n",[792,3952,3953],{"class":794,"line":842},[792,3954,3955],{},"    \u003Curl>https:\u002F\u002Fmaven.aliyun.com\u002Frepository\u002Fpublic\u003C\u002Furl>\n",[792,3957,3958],{"class":794,"line":848},[792,3959,3960],{},"  \u003C\u002Fmirror>\n",[792,3962,3963],{"class":794,"line":863},[792,3964,3965],{},"\u003C\u002Fmirrors>\n",[571,3967,3969],{"id":3968},"_19-换源后必做","1.9 换源后必做",[784,3971,3973],{"className":786,"code":3972,"language":788,"meta":270,"style":270},"# apt\nsudo apt update\n\n# yum \u002F dnf\nsudo yum clean all && sudo yum makecache\nsudo dnf clean all && sudo dnf makecache\n\n# pacman\nsudo pacman -Syyu\n",[69,3974,3975,3980,3988,3992,3997,4015,4033,4037,4042],{"__ignoreMap":270},[792,3976,3977],{"class":794,"line":795},[792,3978,3979],{"class":798},"# apt\n",[792,3981,3982,3984,3986],{"class":794,"line":271},[792,3983,3125],{"class":804},[792,3985,3169],{"class":808},[792,3987,3172],{"class":808},[792,3989,3990],{"class":794,"line":747},[792,3991,839],{"emptyLinePlaceholder":286},[792,3993,3994],{"class":794,"line":836},[792,3995,3996],{"class":798},"# yum \u002F dnf\n",[792,3998,3999,4001,4003,4005,4007,4009,4011,4013],{"class":794,"line":842},[792,4000,3125],{"class":804},[792,4002,3374],{"class":808},[792,4004,3377],{"class":808},[792,4006,3464],{"class":808},[792,4008,3467],{"class":1043},[792,4010,3125],{"class":804},[792,4012,3374],{"class":808},[792,4014,3389],{"class":808},[792,4016,4017,4019,4021,4023,4025,4027,4029,4031],{"class":794,"line":848},[792,4018,3125],{"class":804},[792,4020,3459],{"class":808},[792,4022,3377],{"class":808},[792,4024,3464],{"class":808},[792,4026,3467],{"class":1043},[792,4028,3125],{"class":804},[792,4030,3459],{"class":808},[792,4032,3389],{"class":808},[792,4034,4035],{"class":794,"line":863},[792,4036,839],{"emptyLinePlaceholder":286},[792,4038,4039],{"class":794,"line":868},[792,4040,4041],{"class":798},"# pacman\n",[792,4043,4044,4046,4048],{"class":794,"line":874},[792,4045,3125],{"class":804},[792,4047,3555],{"class":808},[792,4049,3600],{"class":812},[13,4051,4053],{"id":4052},"二文件与目录","二、文件与目录",[784,4055,4057],{"className":786,"code":4056,"language":788,"meta":270,"style":270},"pwd                               # 当前目录\nls -alh                           # 详细列表\ncd -                              # 上一个目录\nmkdir -p a\u002Fb\u002Fc                    # 递归创建\nrm -rf \u003Cdir>                      # 递归删除（危险）\ncp -r \u003Csrc> \u003Cdst>                 # 递归复制\nmv \u003Csrc> \u003Cdst>                    # 移动 \u002F 重命名\nln -s \u003Ctarget> \u003Clink>             # 软链接\ntouch \u003Cfile>\nstat \u003Cfile>\nfile \u003Cfile>\n",[69,4058,4059,4068,4079,4090,4103,4124,4153,4177,4207,4220,4233],{"__ignoreMap":270},[792,4060,4061,4065],{"class":794,"line":795},[792,4062,4064],{"class":4063},"sYf5A","pwd",[792,4066,4067],{"class":798},"                               # 当前目录\n",[792,4069,4070,4073,4076],{"class":794,"line":271},[792,4071,4072],{"class":804},"ls",[792,4074,4075],{"class":812}," -alh",[792,4077,4078],{"class":798},"                           # 详细列表\n",[792,4080,4081,4084,4087],{"class":794,"line":747},[792,4082,4083],{"class":4063},"cd",[792,4085,4086],{"class":808}," -",[792,4088,4089],{"class":798},"                              # 上一个目录\n",[792,4091,4092,4095,4097,4100],{"class":794,"line":836},[792,4093,4094],{"class":804},"mkdir",[792,4096,2242],{"class":812},[792,4098,4099],{"class":808}," a\u002Fb\u002Fc",[792,4101,4102],{"class":798},"                    # 递归创建\n",[792,4104,4105,4108,4111,4113,4116,4119,4121],{"class":794,"line":842},[792,4106,4107],{"class":804},"rm",[792,4109,4110],{"class":812}," -rf",[792,4112,1037],{"class":1036},[792,4114,4115],{"class":808},"di",[792,4117,4118],{"class":1043},"r",[792,4120,1047],{"class":1036},[792,4122,4123],{"class":798},"                      # 递归删除（危险）\n",[792,4125,4126,4129,4131,4133,4136,4139,4141,4143,4146,4148,4150],{"class":794,"line":848},[792,4127,4128],{"class":804},"cp",[792,4130,2624],{"class":812},[792,4132,1037],{"class":1036},[792,4134,4135],{"class":808},"sr",[792,4137,4138],{"class":1043},"c",[792,4140,1047],{"class":1036},[792,4142,1037],{"class":1036},[792,4144,4145],{"class":808},"ds",[792,4147,2331],{"class":1043},[792,4149,1047],{"class":1036},[792,4151,4152],{"class":798},"                 # 递归复制\n",[792,4154,4155,4158,4160,4162,4164,4166,4168,4170,4172,4174],{"class":794,"line":863},[792,4156,4157],{"class":804},"mv",[792,4159,1037],{"class":1036},[792,4161,4135],{"class":808},[792,4163,4138],{"class":1043},[792,4165,1047],{"class":1036},[792,4167,1037],{"class":1036},[792,4169,4145],{"class":808},[792,4171,2331],{"class":1043},[792,4173,1047],{"class":1036},[792,4175,4176],{"class":798},"                    # 移动 \u002F 重命名\n",[792,4178,4179,4182,4185,4187,4190,4192,4194,4196,4199,4202,4204],{"class":794,"line":868},[792,4180,4181],{"class":804},"ln",[792,4183,4184],{"class":812}," -s",[792,4186,1037],{"class":1036},[792,4188,4189],{"class":808},"targe",[792,4191,2331],{"class":1043},[792,4193,1047],{"class":1036},[792,4195,1037],{"class":1036},[792,4197,4198],{"class":808},"lin",[792,4200,4201],{"class":1043},"k",[792,4203,1047],{"class":1036},[792,4205,4206],{"class":798},"             # 软链接\n",[792,4208,4209,4212,4214,4216,4218],{"class":794,"line":874},[792,4210,4211],{"class":804},"touch",[792,4213,1037],{"class":1036},[792,4215,1040],{"class":808},[792,4217,1044],{"class":1043},[792,4219,1748],{"class":1036},[792,4221,4222,4225,4227,4229,4231],{"class":794,"line":889},[792,4223,4224],{"class":4063},"stat",[792,4226,1037],{"class":1036},[792,4228,1040],{"class":808},[792,4230,1044],{"class":1043},[792,4232,1748],{"class":1036},[792,4234,4235,4238,4240,4242,4244],{"class":794,"line":894},[792,4236,4237],{"class":804},"file",[792,4239,1037],{"class":1036},[792,4241,1040],{"class":808},[792,4243,1044],{"class":1043},[792,4245,1748],{"class":1036},[571,4247,4248],{"id":4248},"查找",[784,4250,4252],{"className":786,"code":4251,"language":788,"meta":270,"style":270},"find . -name \"*.log\"                          # 按名\nfind . -type f -size +100M                    # >100M\nfind . -mtime -7                              # 7 天内\nfind . -name \"*.tmp\" -delete                  # 找到删除\nfind . -type f -exec chmod 644 {} \\;          # 批量执行\n\nwhich \u003Ccmd>                       # 命令路径\nwhereis \u003Ccmd>\nlocate \u003Cfile>                     # 快速（需 updatedb）\n",[69,4253,4254,4270,4291,4306,4323,4351,4355,4372,4385],{"__ignoreMap":270},[792,4255,4256,4259,4261,4264,4267],{"class":794,"line":795},[792,4257,4258],{"class":804},"find",[792,4260,1059],{"class":808},[792,4262,4263],{"class":812}," -name",[792,4265,4266],{"class":808}," \"*.log\"",[792,4268,4269],{"class":798},"                          # 按名\n",[792,4271,4272,4274,4276,4279,4282,4285,4288],{"class":794,"line":271},[792,4273,4258],{"class":804},[792,4275,1059],{"class":808},[792,4277,4278],{"class":812}," -type",[792,4280,4281],{"class":808}," f",[792,4283,4284],{"class":812}," -size",[792,4286,4287],{"class":808}," +100M",[792,4289,4290],{"class":798},"                    # >100M\n",[792,4292,4293,4295,4297,4300,4303],{"class":794,"line":747},[792,4294,4258],{"class":804},[792,4296,1059],{"class":808},[792,4298,4299],{"class":812}," -mtime",[792,4301,4302],{"class":812}," -7",[792,4304,4305],{"class":798},"                              # 7 天内\n",[792,4307,4308,4310,4312,4314,4317,4320],{"class":794,"line":836},[792,4309,4258],{"class":804},[792,4311,1059],{"class":808},[792,4313,4263],{"class":812},[792,4315,4316],{"class":808}," \"*.tmp\"",[792,4318,4319],{"class":812}," -delete",[792,4321,4322],{"class":798},"                  # 找到删除\n",[792,4324,4325,4327,4329,4331,4333,4336,4339,4342,4345,4348],{"class":794,"line":842},[792,4326,4258],{"class":804},[792,4328,1059],{"class":808},[792,4330,4278],{"class":812},[792,4332,4281],{"class":808},[792,4334,4335],{"class":812}," -exec",[792,4337,4338],{"class":808}," chmod",[792,4340,4341],{"class":812}," 644",[792,4343,4344],{"class":808}," {}",[792,4346,4347],{"class":812}," \\;",[792,4349,4350],{"class":798},"          # 批量执行\n",[792,4352,4353],{"class":794,"line":848},[792,4354,839],{"emptyLinePlaceholder":286},[792,4356,4357,4360,4362,4365,4367,4369],{"class":794,"line":863},[792,4358,4359],{"class":4063},"which",[792,4361,1037],{"class":1036},[792,4363,4364],{"class":808},"cm",[792,4366,1370],{"class":1043},[792,4368,1047],{"class":1036},[792,4370,4371],{"class":798},"                       # 命令路径\n",[792,4373,4374,4377,4379,4381,4383],{"class":794,"line":868},[792,4375,4376],{"class":804},"whereis",[792,4378,1037],{"class":1036},[792,4380,4364],{"class":808},[792,4382,1370],{"class":1043},[792,4384,1748],{"class":1036},[792,4386,4387,4390,4392,4394,4396,4398],{"class":794,"line":874},[792,4388,4389],{"class":804},"locate",[792,4391,1037],{"class":1036},[792,4393,1040],{"class":808},[792,4395,1044],{"class":1043},[792,4397,1047],{"class":1036},[792,4399,4400],{"class":798},"                     # 快速（需 updatedb）\n",[13,4402,4404],{"id":4403},"三文本处理","三、文本处理",[784,4406,4408],{"className":786,"code":4407,"language":788,"meta":270,"style":270},"cat \u002F less \u002F head -n 20 \u002F tail -n 20\ntail -f \u003Cfile>                    # 实时跟踪日志\ntail -F \u003Cfile>                    # rotate 后仍能跟踪\n\ngrep \"p\" \u003Cfile>                   # 基本\ngrep -r -n -i \"p\" .               # 递归+行号+忽略大小写\ngrep -v \"p\" \u003Cfile>                # 反选\ngrep -E \"a|b\" \u003Cfile>              # 扩展正则\nrg \"p\"                            # ripgrep（快，推荐）\n\nsed 's\u002Fold\u002Fnew\u002Fg' \u003Cfile>          # 替换到 stdout\nsed -i 's\u002Fold\u002Fnew\u002Fg' \u003Cfile>       # 原地替换\nsed -i.bak 's\u002Fold\u002Fnew\u002Fg' \u003Cfile>   # 带备份\nsed -n '10,20p' \u003Cfile>            # 打印范围\n\nawk '{print $1}' \u003Cfile>           # 第一列\nawk -F: '{print $1}' \u002Fetc\u002Fpasswd\nawk '$3 > 100 {print $1}' \u003Cfile>\n\ncut -d: -f1 \u002Fetc\u002Fpasswd\nsort \u003Cfile>\nsort -u \u003Cfile>                    # 去重\nuniq -c                           # 统计相邻（先 sort）\nwc -l \u003Cfile>\ntr 'a-z' 'A-Z'\n",[69,4409,4410,4442,4461,4479,4483,4502,4519,4538,4559,4569,4573,4592,4611,4631,4651,4655,4674,4686,4701,4705,4718,4731,4748,4758,4775],{"__ignoreMap":270},[792,4411,4412,4415,4418,4421,4423,4426,4429,4432,4434,4437,4439],{"class":794,"line":795},[792,4413,4414],{"class":804},"cat",[792,4416,4417],{"class":808}," \u002F",[792,4419,4420],{"class":808}," less",[792,4422,4417],{"class":808},[792,4424,4425],{"class":808}," head",[792,4427,4428],{"class":812}," -n",[792,4430,4431],{"class":812}," 20",[792,4433,4417],{"class":808},[792,4435,4436],{"class":808}," tail",[792,4438,4428],{"class":812},[792,4440,4441],{"class":812}," 20\n",[792,4443,4444,4447,4450,4452,4454,4456,4458],{"class":794,"line":271},[792,4445,4446],{"class":804},"tail",[792,4448,4449],{"class":812}," -f",[792,4451,1037],{"class":1036},[792,4453,1040],{"class":808},[792,4455,1044],{"class":1043},[792,4457,1047],{"class":1036},[792,4459,4460],{"class":798},"                    # 实时跟踪日志\n",[792,4462,4463,4465,4468,4470,4472,4474,4476],{"class":794,"line":747},[792,4464,4446],{"class":804},[792,4466,4467],{"class":812}," -F",[792,4469,1037],{"class":1036},[792,4471,1040],{"class":808},[792,4473,1044],{"class":1043},[792,4475,1047],{"class":1036},[792,4477,4478],{"class":798},"                    # rotate 后仍能跟踪\n",[792,4480,4481],{"class":794,"line":836},[792,4482,839],{"emptyLinePlaceholder":286},[792,4484,4485,4488,4491,4493,4495,4497,4499],{"class":794,"line":842},[792,4486,4487],{"class":804},"grep",[792,4489,4490],{"class":808}," \"p\"",[792,4492,1037],{"class":1036},[792,4494,1040],{"class":808},[792,4496,1044],{"class":1043},[792,4498,1047],{"class":1036},[792,4500,4501],{"class":798},"                   # 基本\n",[792,4503,4504,4506,4508,4510,4512,4514,4516],{"class":794,"line":848},[792,4505,4487],{"class":804},[792,4507,2624],{"class":812},[792,4509,4428],{"class":812},[792,4511,1460],{"class":812},[792,4513,4490],{"class":808},[792,4515,1059],{"class":808},[792,4517,4518],{"class":798},"               # 递归+行号+忽略大小写\n",[792,4520,4521,4523,4525,4527,4529,4531,4533,4535],{"class":794,"line":863},[792,4522,4487],{"class":804},[792,4524,1924],{"class":812},[792,4526,4490],{"class":808},[792,4528,1037],{"class":1036},[792,4530,1040],{"class":808},[792,4532,1044],{"class":1043},[792,4534,1047],{"class":1036},[792,4536,4537],{"class":798},"                # 反选\n",[792,4539,4540,4542,4545,4548,4550,4552,4554,4556],{"class":794,"line":868},[792,4541,4487],{"class":804},[792,4543,4544],{"class":812}," -E",[792,4546,4547],{"class":808}," \"a|b\"",[792,4549,1037],{"class":1036},[792,4551,1040],{"class":808},[792,4553,1044],{"class":1043},[792,4555,1047],{"class":1036},[792,4557,4558],{"class":798},"              # 扩展正则\n",[792,4560,4561,4564,4566],{"class":794,"line":874},[792,4562,4563],{"class":804},"rg",[792,4565,4490],{"class":808},[792,4567,4568],{"class":798},"                            # ripgrep（快，推荐）\n",[792,4570,4571],{"class":794,"line":889},[792,4572,839],{"emptyLinePlaceholder":286},[792,4574,4575,4578,4581,4583,4585,4587,4589],{"class":794,"line":894},[792,4576,4577],{"class":804},"sed",[792,4579,4580],{"class":808}," 's\u002Fold\u002Fnew\u002Fg'",[792,4582,1037],{"class":1036},[792,4584,1040],{"class":808},[792,4586,1044],{"class":1043},[792,4588,1047],{"class":1036},[792,4590,4591],{"class":798},"          # 替换到 stdout\n",[792,4593,4594,4596,4598,4600,4602,4604,4606,4608],{"class":794,"line":900},[792,4595,4577],{"class":804},[792,4597,1460],{"class":812},[792,4599,4580],{"class":808},[792,4601,1037],{"class":1036},[792,4603,1040],{"class":808},[792,4605,1044],{"class":1043},[792,4607,1047],{"class":1036},[792,4609,4610],{"class":798},"       # 原地替换\n",[792,4612,4613,4615,4618,4620,4622,4624,4626,4628],{"class":794,"line":915},[792,4614,4577],{"class":804},[792,4616,4617],{"class":812}," -i.bak",[792,4619,4580],{"class":808},[792,4621,1037],{"class":1036},[792,4623,1040],{"class":808},[792,4625,1044],{"class":1043},[792,4627,1047],{"class":1036},[792,4629,4630],{"class":798},"   # 带备份\n",[792,4632,4633,4635,4637,4640,4642,4644,4646,4648],{"class":794,"line":920},[792,4634,4577],{"class":804},[792,4636,4428],{"class":812},[792,4638,4639],{"class":808}," '10,20p'",[792,4641,1037],{"class":1036},[792,4643,1040],{"class":808},[792,4645,1044],{"class":1043},[792,4647,1047],{"class":1036},[792,4649,4650],{"class":798},"            # 打印范围\n",[792,4652,4653],{"class":794,"line":926},[792,4654,839],{"emptyLinePlaceholder":286},[792,4656,4657,4660,4663,4665,4667,4669,4671],{"class":794,"line":941},[792,4658,4659],{"class":804},"awk",[792,4661,4662],{"class":808}," '{print $1}'",[792,4664,1037],{"class":1036},[792,4666,1040],{"class":808},[792,4668,1044],{"class":1043},[792,4670,1047],{"class":1036},[792,4672,4673],{"class":798},"           # 第一列\n",[792,4675,4676,4678,4681,4683],{"class":794,"line":956},[792,4677,4659],{"class":804},[792,4679,4680],{"class":812}," -F:",[792,4682,4662],{"class":808},[792,4684,4685],{"class":808}," \u002Fetc\u002Fpasswd\n",[792,4687,4688,4690,4693,4695,4697,4699],{"class":794,"line":971},[792,4689,4659],{"class":804},[792,4691,4692],{"class":808}," '$3 > 100 {print $1}'",[792,4694,1037],{"class":1036},[792,4696,1040],{"class":808},[792,4698,1044],{"class":1043},[792,4700,1748],{"class":1036},[792,4702,4703],{"class":794,"line":986},[792,4704,839],{"emptyLinePlaceholder":286},[792,4706,4707,4710,4713,4716],{"class":794,"line":991},[792,4708,4709],{"class":804},"cut",[792,4711,4712],{"class":812}," -d:",[792,4714,4715],{"class":812}," -f1",[792,4717,4685],{"class":808},[792,4719,4720,4723,4725,4727,4729],{"class":794,"line":997},[792,4721,4722],{"class":804},"sort",[792,4724,1037],{"class":1036},[792,4726,1040],{"class":808},[792,4728,1044],{"class":1043},[792,4730,1748],{"class":1036},[792,4732,4733,4735,4737,4739,4741,4743,4745],{"class":794,"line":2951},[792,4734,4722],{"class":804},[792,4736,1824],{"class":812},[792,4738,1037],{"class":1036},[792,4740,1040],{"class":808},[792,4742,1044],{"class":1043},[792,4744,1047],{"class":1036},[792,4746,4747],{"class":798},"                    # 去重\n",[792,4749,4750,4753,4755],{"class":794,"line":2957},[792,4751,4752],{"class":804},"uniq",[792,4754,1282],{"class":812},[792,4756,4757],{"class":798},"                           # 统计相邻（先 sort）\n",[792,4759,4761,4764,4767,4769,4771,4773],{"class":794,"line":4760},24,[792,4762,4763],{"class":804},"wc",[792,4765,4766],{"class":812}," -l",[792,4768,1037],{"class":1036},[792,4770,1040],{"class":808},[792,4772,1044],{"class":1043},[792,4774,1748],{"class":1036},[792,4776,4778,4780,4783],{"class":794,"line":4777},25,[792,4779,24],{"class":804},[792,4781,4782],{"class":808}," 'a-z'",[792,4784,4785],{"class":808}," 'A-Z'\n",[571,4787,4788],{"id":4788},"管道组合",[784,4790,4792],{"className":786,"code":4791,"language":788,"meta":270,"style":270},"awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10\ndu -sh *\u002F | sort -rh | head -10\n",[69,4793,4794,4829],{"__ignoreMap":270},[792,4795,4796,4798,4800,4803,4805,4808,4810,4813,4815,4817,4819,4822,4824,4826],{"class":794,"line":795},[792,4797,4659],{"class":804},[792,4799,4662],{"class":808},[792,4801,4802],{"class":808}," access.log",[792,4804,3865],{"class":1036},[792,4806,4807],{"class":804}," sort",[792,4809,3865],{"class":1036},[792,4811,4812],{"class":804}," uniq",[792,4814,1282],{"class":812},[792,4816,3865],{"class":1036},[792,4818,4807],{"class":804},[792,4820,4821],{"class":812}," -rn",[792,4823,3865],{"class":1036},[792,4825,4425],{"class":804},[792,4827,4828],{"class":812}," -10\n",[792,4830,4831,4834,4837,4840,4843,4845,4847,4850,4852,4854],{"class":794,"line":271},[792,4832,4833],{"class":804},"du",[792,4835,4836],{"class":812}," -sh",[792,4838,4839],{"class":3337}," *",[792,4841,4842],{"class":808},"\u002F",[792,4844,3865],{"class":1036},[792,4846,4807],{"class":804},[792,4848,4849],{"class":812}," -rh",[792,4851,3865],{"class":1036},[792,4853,4425],{"class":804},[792,4855,4828],{"class":812},[13,4857,4859],{"id":4858},"四权限","四、权限",[784,4861,4863],{"className":786,"code":4862,"language":788,"meta":270,"style":270},"chmod 755 \u003Cfile>\nchmod +x \u003Cfile>\nchmod -R 644 \u003Cdir>\nchown user:group \u003Cfile>\nchown -R user \u003Cdir>\nchgrp group \u003Cfile>\numask\n",[69,4864,4865,4881,4896,4913,4929,4946,4962],{"__ignoreMap":270},[792,4866,4867,4870,4873,4875,4877,4879],{"class":794,"line":795},[792,4868,4869],{"class":804},"chmod",[792,4871,4872],{"class":812}," 755",[792,4874,1037],{"class":1036},[792,4876,1040],{"class":808},[792,4878,1044],{"class":1043},[792,4880,1748],{"class":1036},[792,4882,4883,4885,4888,4890,4892,4894],{"class":794,"line":271},[792,4884,4869],{"class":804},[792,4886,4887],{"class":808}," +x",[792,4889,1037],{"class":1036},[792,4891,1040],{"class":808},[792,4893,1044],{"class":1043},[792,4895,1748],{"class":1036},[792,4897,4898,4900,4903,4905,4907,4909,4911],{"class":794,"line":747},[792,4899,4869],{"class":804},[792,4901,4902],{"class":812}," -R",[792,4904,4341],{"class":812},[792,4906,1037],{"class":1036},[792,4908,4115],{"class":808},[792,4910,4118],{"class":1043},[792,4912,1748],{"class":1036},[792,4914,4915,4918,4921,4923,4925,4927],{"class":794,"line":836},[792,4916,4917],{"class":804},"chown",[792,4919,4920],{"class":808}," user:group",[792,4922,1037],{"class":1036},[792,4924,1040],{"class":808},[792,4926,1044],{"class":1043},[792,4928,1748],{"class":1036},[792,4930,4931,4933,4935,4938,4940,4942,4944],{"class":794,"line":842},[792,4932,4917],{"class":804},[792,4934,4902],{"class":812},[792,4936,4937],{"class":808}," user",[792,4939,1037],{"class":1036},[792,4941,4115],{"class":808},[792,4943,4118],{"class":1043},[792,4945,1748],{"class":1036},[792,4947,4948,4951,4954,4956,4958,4960],{"class":794,"line":848},[792,4949,4950],{"class":804},"chgrp",[792,4952,4953],{"class":808}," group",[792,4955,1037],{"class":1036},[792,4957,1040],{"class":808},[792,4959,1044],{"class":1043},[792,4961,1748],{"class":1036},[792,4963,4964],{"class":794,"line":863},[792,4965,4966],{"class":4063},"umask\n",[173,4968,4969],{},"数字权限：",[18,4971,4972,4982],{},[21,4973,4974],{},[24,4975,4976,4979],{},[27,4977,4978],{},"数字",[27,4980,4981],{},"权限",[35,4983,4984,4992,5000,5008],{},[24,4985,4986,4989],{},[40,4987,4988],{},"4",[40,4990,4991],{},"r--",[24,4993,4994,4997],{},[40,4995,4996],{},"5",[40,4998,4999],{},"r-x",[24,5001,5002,5005],{},[40,5003,5004],{},"6",[40,5006,5007],{},"rw-",[24,5009,5010,5013],{},[40,5011,5012],{},"7",[40,5014,5015],{},"rwx",[173,5017,5018,5019,5022,5023,5026,5027,5022,5030,183],{},"例：",[69,5020,5021],{},"755"," = ",[69,5024,5025],{},"rwxr-xr-x","，",[69,5028,5029],{},"644",[69,5031,5032],{},"rw-r--r--",[173,5034,5035],{},"特殊权限：",[784,5037,5039],{"className":786,"code":5038,"language":788,"meta":270,"style":270},"chmod u+s \u003Cfile>                  # SUID\nchmod g+s \u003Cdir>                   # SGID\nchmod +t \u003Cdir>                    # Sticky（如 \u002Ftmp）\n",[69,5040,5041,5059,5077],{"__ignoreMap":270},[792,5042,5043,5045,5048,5050,5052,5054,5056],{"class":794,"line":795},[792,5044,4869],{"class":804},[792,5046,5047],{"class":808}," u+s",[792,5049,1037],{"class":1036},[792,5051,1040],{"class":808},[792,5053,1044],{"class":1043},[792,5055,1047],{"class":1036},[792,5057,5058],{"class":798},"                  # SUID\n",[792,5060,5061,5063,5066,5068,5070,5072,5074],{"class":794,"line":271},[792,5062,4869],{"class":804},[792,5064,5065],{"class":808}," g+s",[792,5067,1037],{"class":1036},[792,5069,4115],{"class":808},[792,5071,4118],{"class":1043},[792,5073,1047],{"class":1036},[792,5075,5076],{"class":798},"                   # SGID\n",[792,5078,5079,5081,5084,5086,5088,5090,5092],{"class":794,"line":747},[792,5080,4869],{"class":804},[792,5082,5083],{"class":808}," +t",[792,5085,1037],{"class":1036},[792,5087,4115],{"class":808},[792,5089,4118],{"class":1043},[792,5091,1047],{"class":1036},[792,5093,5094],{"class":798},"                    # Sticky（如 \u002Ftmp）\n",[13,5096,5098],{"id":5097},"五进程管理","五、进程管理",[784,5100,5102],{"className":786,"code":5101,"language":788,"meta":270,"style":270},"ps aux\nps aux | grep nginx\npgrep -f \"pattern\"\npidof \u003Cname>\n\ntop                               # P 按 CPU，M 按内存\nhtop                              # 更友好\n\nkill \u003Cpid>                        # SIGTERM\nkill -9 \u003Cpid>                     # 强制\npkill -f \"pattern\"\nkillall \u003Cname>\n\nnice -n 10 \u003Ccmd>\nrenice -n 5 -p \u003Cpid>\n\nCtrl+Z                            # 挂起\nbg \u002F fg \u002F jobs\n",[69,5103,5104,5112,5126,5136,5149,5153,5161,5169,5173,5190,5208,5217,5230,5234,5252,5271,5275,5283],{"__ignoreMap":270},[792,5105,5106,5109],{"class":794,"line":795},[792,5107,5108],{"class":804},"ps",[792,5110,5111],{"class":808}," aux\n",[792,5113,5114,5116,5119,5121,5123],{"class":794,"line":271},[792,5115,5108],{"class":804},[792,5117,5118],{"class":808}," aux",[792,5120,3865],{"class":1036},[792,5122,3868],{"class":804},[792,5124,5125],{"class":808}," nginx\n",[792,5127,5128,5131,5133],{"class":794,"line":747},[792,5129,5130],{"class":804},"pgrep",[792,5132,4449],{"class":812},[792,5134,5135],{"class":808}," \"pattern\"\n",[792,5137,5138,5141,5143,5145,5147],{"class":794,"line":836},[792,5139,5140],{"class":804},"pidof",[792,5142,1037],{"class":1036},[792,5144,1248],{"class":808},[792,5146,1044],{"class":1043},[792,5148,1748],{"class":1036},[792,5150,5151],{"class":794,"line":842},[792,5152,839],{"emptyLinePlaceholder":286},[792,5154,5155,5158],{"class":794,"line":848},[792,5156,5157],{"class":804},"top",[792,5159,5160],{"class":798},"                               # P 按 CPU，M 按内存\n",[792,5162,5163,5166],{"class":794,"line":863},[792,5164,5165],{"class":804},"htop",[792,5167,5168],{"class":798},"                              # 更友好\n",[792,5170,5171],{"class":794,"line":868},[792,5172,839],{"emptyLinePlaceholder":286},[792,5174,5175,5178,5180,5183,5185,5187],{"class":794,"line":874},[792,5176,5177],{"class":4063},"kill",[792,5179,1037],{"class":1036},[792,5181,5182],{"class":808},"pi",[792,5184,1370],{"class":1043},[792,5186,1047],{"class":1036},[792,5188,5189],{"class":798},"                        # SIGTERM\n",[792,5191,5192,5194,5197,5199,5201,5203,5205],{"class":794,"line":889},[792,5193,5177],{"class":4063},[792,5195,5196],{"class":812}," -9",[792,5198,1037],{"class":1036},[792,5200,5182],{"class":808},[792,5202,1370],{"class":1043},[792,5204,1047],{"class":1036},[792,5206,5207],{"class":798},"                     # 强制\n",[792,5209,5210,5213,5215],{"class":794,"line":894},[792,5211,5212],{"class":804},"pkill",[792,5214,4449],{"class":812},[792,5216,5135],{"class":808},[792,5218,5219,5222,5224,5226,5228],{"class":794,"line":900},[792,5220,5221],{"class":804},"killall",[792,5223,1037],{"class":1036},[792,5225,1248],{"class":808},[792,5227,1044],{"class":1043},[792,5229,1748],{"class":1036},[792,5231,5232],{"class":794,"line":915},[792,5233,839],{"emptyLinePlaceholder":286},[792,5235,5236,5239,5241,5244,5246,5248,5250],{"class":794,"line":920},[792,5237,5238],{"class":804},"nice",[792,5240,4428],{"class":812},[792,5242,5243],{"class":812}," 10",[792,5245,1037],{"class":1036},[792,5247,4364],{"class":808},[792,5249,1370],{"class":1043},[792,5251,1748],{"class":1036},[792,5253,5254,5257,5259,5261,5263,5265,5267,5269],{"class":794,"line":926},[792,5255,5256],{"class":804},"renice",[792,5258,4428],{"class":812},[792,5260,3579],{"class":812},[792,5262,2242],{"class":812},[792,5264,1037],{"class":1036},[792,5266,5182],{"class":808},[792,5268,1370],{"class":1043},[792,5270,1748],{"class":1036},[792,5272,5273],{"class":794,"line":941},[792,5274,839],{"emptyLinePlaceholder":286},[792,5276,5277,5280],{"class":794,"line":956},[792,5278,5279],{"class":804},"Ctrl+Z",[792,5281,5282],{"class":798},"                            # 挂起\n",[792,5284,5285,5288,5290,5293,5295],{"class":794,"line":971},[792,5286,5287],{"class":4063},"bg",[792,5289,4417],{"class":808},[792,5291,5292],{"class":808}," fg",[792,5294,4417],{"class":808},[792,5296,5297],{"class":808}," jobs\n",[173,5299,5300],{},"信号：",[18,5302,5303,5315],{},[21,5304,5305],{},[24,5306,5307,5310,5313],{},[27,5308,5309],{},"信号",[27,5311,5312],{},"编号",[27,5314,2685],{},[35,5316,5317,5328,5339,5350],{},[24,5318,5319,5322,5325],{},[40,5320,5321],{},"SIGHUP",[40,5323,5324],{},"1",[40,5326,5327],{},"挂起 \u002F 重载",[24,5329,5330,5333,5336],{},[40,5331,5332],{},"SIGINT",[40,5334,5335],{},"2",[40,5337,5338],{},"Ctrl+C",[24,5340,5341,5344,5347],{},[40,5342,5343],{},"SIGKILL",[40,5345,5346],{},"9",[40,5348,5349],{},"强杀，不可捕获",[24,5351,5352,5355,5358],{},[40,5353,5354],{},"SIGTERM",[40,5356,5357],{},"15",[40,5359,5360],{},"优雅退出（默认）",[13,5362,5364],{"id":5363},"六网络","六、网络",[784,5366,5368],{"className":786,"code":5367,"language":788,"meta":270,"style":270},"ip addr                           # 查看 IP\nip route\nss -tunlp                         # 监听端口（推荐）\nnetstat -tunlp                    # 老命令\nlsof -i :8080                     # 谁占端口\n\nping \u003Chost>\nping -c 4 \u003Chost>\ntraceroute \u003Chost>\nmtr \u003Chost>                        # 持续 traceroute\n\ncurl -I \u003Curl>                     # 只看头\ncurl -v \u003Curl>                     # 详细\ncurl -o file.zip \u003Curl>            # 下载\ncurl -X POST -d '{}' -H \"Content-Type: application\u002Fjson\" \u003Curl>\n\nwget \u003Curl>\nwget -c \u003Curl>                     # 断点续传\nwget -r -np \u003Curl>                 # 递归\n\ndig \u003Cdomain>\ndig +short \u003Cdomain>\nnslookup \u003Cdomain>\nhost \u003Cdomain>\n",[69,5369,5370,5381,5388,5399,5409,5422,5426,5440,5457,5470,5486,5490,5509,5526,5547,5576,5580,5593,5610,5630,5634,5649,5664,5677],{"__ignoreMap":270},[792,5371,5372,5375,5378],{"class":794,"line":795},[792,5373,5374],{"class":804},"ip",[792,5376,5377],{"class":808}," addr",[792,5379,5380],{"class":798},"                           # 查看 IP\n",[792,5382,5383,5385],{"class":794,"line":271},[792,5384,5374],{"class":804},[792,5386,5387],{"class":808}," route\n",[792,5389,5390,5393,5396],{"class":794,"line":747},[792,5391,5392],{"class":804},"ss",[792,5394,5395],{"class":812}," -tunlp",[792,5397,5398],{"class":798},"                         # 监听端口（推荐）\n",[792,5400,5401,5404,5406],{"class":794,"line":836},[792,5402,5403],{"class":804},"netstat",[792,5405,5395],{"class":812},[792,5407,5408],{"class":798},"                    # 老命令\n",[792,5410,5411,5414,5416,5419],{"class":794,"line":842},[792,5412,5413],{"class":804},"lsof",[792,5415,1460],{"class":812},[792,5417,5418],{"class":808}," :8080",[792,5420,5421],{"class":798},"                     # 谁占端口\n",[792,5423,5424],{"class":794,"line":848},[792,5425,839],{"emptyLinePlaceholder":286},[792,5427,5428,5431,5433,5436,5438],{"class":794,"line":863},[792,5429,5430],{"class":804},"ping",[792,5432,1037],{"class":1036},[792,5434,5435],{"class":808},"hos",[792,5437,2331],{"class":1043},[792,5439,1748],{"class":1036},[792,5441,5442,5444,5446,5449,5451,5453,5455],{"class":794,"line":868},[792,5443,5430],{"class":804},[792,5445,1282],{"class":812},[792,5447,5448],{"class":812}," 4",[792,5450,1037],{"class":1036},[792,5452,5435],{"class":808},[792,5454,2331],{"class":1043},[792,5456,1748],{"class":1036},[792,5458,5459,5462,5464,5466,5468],{"class":794,"line":874},[792,5460,5461],{"class":804},"traceroute",[792,5463,1037],{"class":1036},[792,5465,5435],{"class":808},[792,5467,2331],{"class":1043},[792,5469,1748],{"class":1036},[792,5471,5472,5475,5477,5479,5481,5483],{"class":794,"line":889},[792,5473,5474],{"class":804},"mtr",[792,5476,1037],{"class":1036},[792,5478,5435],{"class":808},[792,5480,2331],{"class":1043},[792,5482,1047],{"class":1036},[792,5484,5485],{"class":798},"                        # 持续 traceroute\n",[792,5487,5488],{"class":794,"line":894},[792,5489,839],{"emptyLinePlaceholder":286},[792,5491,5492,5495,5498,5500,5502,5504,5506],{"class":794,"line":900},[792,5493,5494],{"class":804},"curl",[792,5496,5497],{"class":812}," -I",[792,5499,1037],{"class":1036},[792,5501,1943],{"class":808},[792,5503,1946],{"class":1043},[792,5505,1047],{"class":1036},[792,5507,5508],{"class":798},"                     # 只看头\n",[792,5510,5511,5513,5515,5517,5519,5521,5523],{"class":794,"line":915},[792,5512,5494],{"class":804},[792,5514,1924],{"class":812},[792,5516,1037],{"class":1036},[792,5518,1943],{"class":808},[792,5520,1946],{"class":1043},[792,5522,1047],{"class":1036},[792,5524,5525],{"class":798},"                     # 详细\n",[792,5527,5528,5530,5533,5536,5538,5540,5542,5544],{"class":794,"line":920},[792,5529,5494],{"class":804},[792,5531,5532],{"class":812}," -o",[792,5534,5535],{"class":808}," file.zip",[792,5537,1037],{"class":1036},[792,5539,1943],{"class":808},[792,5541,1946],{"class":1043},[792,5543,1047],{"class":1036},[792,5545,5546],{"class":798},"            # 下载\n",[792,5548,5549,5551,5554,5557,5559,5562,5565,5568,5570,5572,5574],{"class":794,"line":926},[792,5550,5494],{"class":804},[792,5552,5553],{"class":812}," -X",[792,5555,5556],{"class":808}," POST",[792,5558,1323],{"class":812},[792,5560,5561],{"class":808}," '{}'",[792,5563,5564],{"class":812}," -H",[792,5566,5567],{"class":808}," \"Content-Type: application\u002Fjson\"",[792,5569,1037],{"class":1036},[792,5571,1943],{"class":808},[792,5573,1946],{"class":1043},[792,5575,1748],{"class":1036},[792,5577,5578],{"class":794,"line":941},[792,5579,839],{"emptyLinePlaceholder":286},[792,5581,5582,5585,5587,5589,5591],{"class":794,"line":956},[792,5583,5584],{"class":804},"wget",[792,5586,1037],{"class":1036},[792,5588,1943],{"class":808},[792,5590,1946],{"class":1043},[792,5592,1748],{"class":1036},[792,5594,5595,5597,5599,5601,5603,5605,5607],{"class":794,"line":971},[792,5596,5584],{"class":804},[792,5598,1282],{"class":812},[792,5600,1037],{"class":1036},[792,5602,1943],{"class":808},[792,5604,1946],{"class":1043},[792,5606,1047],{"class":1036},[792,5608,5609],{"class":798},"                     # 断点续传\n",[792,5611,5612,5614,5616,5619,5621,5623,5625,5627],{"class":794,"line":986},[792,5613,5584],{"class":804},[792,5615,2624],{"class":812},[792,5617,5618],{"class":812}," -np",[792,5620,1037],{"class":1036},[792,5622,1943],{"class":808},[792,5624,1946],{"class":1043},[792,5626,1047],{"class":1036},[792,5628,5629],{"class":798},"                 # 递归\n",[792,5631,5632],{"class":794,"line":991},[792,5633,839],{"emptyLinePlaceholder":286},[792,5635,5636,5639,5641,5644,5647],{"class":794,"line":997},[792,5637,5638],{"class":804},"dig",[792,5640,1037],{"class":1036},[792,5642,5643],{"class":808},"domai",[792,5645,5646],{"class":1043},"n",[792,5648,1748],{"class":1036},[792,5650,5651,5653,5656,5658,5660,5662],{"class":794,"line":2951},[792,5652,5638],{"class":804},[792,5654,5655],{"class":808}," +short",[792,5657,1037],{"class":1036},[792,5659,5643],{"class":808},[792,5661,5646],{"class":1043},[792,5663,1748],{"class":1036},[792,5665,5666,5669,5671,5673,5675],{"class":794,"line":2957},[792,5667,5668],{"class":804},"nslookup",[792,5670,1037],{"class":1036},[792,5672,5643],{"class":808},[792,5674,5646],{"class":1043},[792,5676,1748],{"class":1036},[792,5678,5679,5682,5684,5686,5688],{"class":794,"line":4760},[792,5680,5681],{"class":804},"host",[792,5683,1037],{"class":1036},[792,5685,5643],{"class":808},[792,5687,5646],{"class":1043},[792,5689,1748],{"class":1036},[571,5691,5692],{"id":5692},"防火墙",[784,5694,5696],{"className":786,"code":5695,"language":788,"meta":270,"style":270},"# ufw（Ubuntu）\nufw status\nufw allow 22\nufw allow 80\u002Ftcp\nufw delete allow 80\nufw enable\n\n# firewalld（CentOS）\nfirewall-cmd --list-all\nfirewall-cmd --add-port=8080\u002Ftcp --permanent\nfirewall-cmd --reload\n\n# iptables\niptables -L -n -v\niptables -A INPUT -p tcp --dport 8080 -j ACCEPT\n",[69,5697,5698,5703,5710,5720,5729,5741,5748,5752,5757,5765,5775,5782,5786,5791,5804],{"__ignoreMap":270},[792,5699,5700],{"class":794,"line":795},[792,5701,5702],{"class":798},"# ufw（Ubuntu）\n",[792,5704,5705,5708],{"class":794,"line":271},[792,5706,5707],{"class":804},"ufw",[792,5709,938],{"class":808},[792,5711,5712,5714,5717],{"class":794,"line":747},[792,5713,5707],{"class":804},[792,5715,5716],{"class":808}," allow",[792,5718,5719],{"class":812}," 22\n",[792,5721,5722,5724,5726],{"class":794,"line":836},[792,5723,5707],{"class":804},[792,5725,5716],{"class":808},[792,5727,5728],{"class":808}," 80\u002Ftcp\n",[792,5730,5731,5733,5736,5738],{"class":794,"line":842},[792,5732,5707],{"class":804},[792,5734,5735],{"class":808}," delete",[792,5737,5716],{"class":808},[792,5739,5740],{"class":812}," 80\n",[792,5742,5743,5745],{"class":794,"line":848},[792,5744,5707],{"class":804},[792,5746,5747],{"class":808}," enable\n",[792,5749,5750],{"class":794,"line":863},[792,5751,839],{"emptyLinePlaceholder":286},[792,5753,5754],{"class":794,"line":868},[792,5755,5756],{"class":798},"# firewalld（CentOS）\n",[792,5758,5759,5762],{"class":794,"line":874},[792,5760,5761],{"class":804},"firewall-cmd",[792,5763,5764],{"class":812}," --list-all\n",[792,5766,5767,5769,5772],{"class":794,"line":889},[792,5768,5761],{"class":804},[792,5770,5771],{"class":812}," --add-port=8080\u002Ftcp",[792,5773,5774],{"class":812}," --permanent\n",[792,5776,5777,5779],{"class":794,"line":894},[792,5778,5761],{"class":804},[792,5780,5781],{"class":812}," --reload\n",[792,5783,5784],{"class":794,"line":900},[792,5785,839],{"emptyLinePlaceholder":286},[792,5787,5788],{"class":794,"line":915},[792,5789,5790],{"class":798},"# iptables\n",[792,5792,5793,5796,5799,5801],{"class":794,"line":920},[792,5794,5795],{"class":804},"iptables",[792,5797,5798],{"class":812}," -L",[792,5800,4428],{"class":812},[792,5802,5803],{"class":812}," -v\n",[792,5805,5806,5808,5810,5813,5815,5818,5821,5824,5827],{"class":794,"line":926},[792,5807,5795],{"class":804},[792,5809,1071],{"class":812},[792,5811,5812],{"class":808}," INPUT",[792,5814,2242],{"class":812},[792,5816,5817],{"class":808}," tcp",[792,5819,5820],{"class":812}," --dport",[792,5822,5823],{"class":812}," 8080",[792,5825,5826],{"class":812}," -j",[792,5828,5829],{"class":808}," ACCEPT\n",[13,5831,5833],{"id":5832},"七磁盘与内存","七、磁盘与内存",[784,5835,5837],{"className":786,"code":5836,"language":788,"meta":270,"style":270},"df -h                             # 磁盘\ndf -i                             # inode\ndu -sh \u003Cdir>\ndu -sh * | sort -rh | head -10\n\nfree -h                           # 内存\nvmstat 1\niostat -x 1                       # 需 sysstat\n\nlsblk\nfdisk -l\nmount \u002Fdev\u002Fsdb1 \u002Fmnt\numount \u002Fmnt\n",[69,5838,5839,5850,5859,5873,5893,5897,5907,5915,5929,5933,5938,5946,5957],{"__ignoreMap":270},[792,5840,5841,5844,5847],{"class":794,"line":795},[792,5842,5843],{"class":804},"df",[792,5845,5846],{"class":812}," -h",[792,5848,5849],{"class":798},"                             # 磁盘\n",[792,5851,5852,5854,5856],{"class":794,"line":271},[792,5853,5843],{"class":804},[792,5855,1460],{"class":812},[792,5857,5858],{"class":798},"                             # inode\n",[792,5860,5861,5863,5865,5867,5869,5871],{"class":794,"line":747},[792,5862,4833],{"class":804},[792,5864,4836],{"class":812},[792,5866,1037],{"class":1036},[792,5868,4115],{"class":808},[792,5870,4118],{"class":1043},[792,5872,1748],{"class":1036},[792,5874,5875,5877,5879,5881,5883,5885,5887,5889,5891],{"class":794,"line":836},[792,5876,4833],{"class":804},[792,5878,4836],{"class":812},[792,5880,4839],{"class":3337},[792,5882,3865],{"class":1036},[792,5884,4807],{"class":804},[792,5886,4849],{"class":812},[792,5888,3865],{"class":1036},[792,5890,4425],{"class":804},[792,5892,4828],{"class":812},[792,5894,5895],{"class":794,"line":842},[792,5896,839],{"emptyLinePlaceholder":286},[792,5898,5899,5902,5904],{"class":794,"line":848},[792,5900,5901],{"class":804},"free",[792,5903,5846],{"class":812},[792,5905,5906],{"class":798},"                           # 内存\n",[792,5908,5909,5912],{"class":794,"line":863},[792,5910,5911],{"class":804},"vmstat",[792,5913,5914],{"class":812}," 1\n",[792,5916,5917,5920,5923,5926],{"class":794,"line":868},[792,5918,5919],{"class":804},"iostat",[792,5921,5922],{"class":812}," -x",[792,5924,5925],{"class":812}," 1",[792,5927,5928],{"class":798},"                       # 需 sysstat\n",[792,5930,5931],{"class":794,"line":874},[792,5932,839],{"emptyLinePlaceholder":286},[792,5934,5935],{"class":794,"line":889},[792,5936,5937],{"class":804},"lsblk\n",[792,5939,5940,5943],{"class":794,"line":894},[792,5941,5942],{"class":804},"fdisk",[792,5944,5945],{"class":812}," -l\n",[792,5947,5948,5951,5954],{"class":794,"line":900},[792,5949,5950],{"class":804},"mount",[792,5952,5953],{"class":808}," \u002Fdev\u002Fsdb1",[792,5955,5956],{"class":808}," \u002Fmnt\n",[792,5958,5959,5962],{"class":794,"line":915},[792,5960,5961],{"class":804},"umount",[792,5963,5956],{"class":808},[173,5965,5966],{},"找大文件：",[784,5968,5970],{"className":786,"code":5969,"language":788,"meta":270,"style":270},"find \u002F -type f -size +1G 2>\u002Fdev\u002Fnull\ndu -ah \u002F | sort -rh | head -20\n",[69,5971,5972,5993],{"__ignoreMap":270},[792,5973,5974,5976,5978,5980,5982,5984,5987,5990],{"class":794,"line":795},[792,5975,4258],{"class":804},[792,5977,4417],{"class":808},[792,5979,4278],{"class":812},[792,5981,4281],{"class":808},[792,5983,4284],{"class":812},[792,5985,5986],{"class":808}," +1G",[792,5988,5989],{"class":1036}," 2>",[792,5991,5992],{"class":808},"\u002Fdev\u002Fnull\n",[792,5994,5995,5997,6000,6002,6004,6006,6008,6010,6012],{"class":794,"line":271},[792,5996,4833],{"class":804},[792,5998,5999],{"class":812}," -ah",[792,6001,4417],{"class":808},[792,6003,3865],{"class":1036},[792,6005,4807],{"class":804},[792,6007,4849],{"class":812},[792,6009,3865],{"class":1036},[792,6011,4425],{"class":804},[792,6013,6014],{"class":812}," -20\n",[13,6016,6018],{"id":6017},"八压缩与归档","八、压缩与归档",[784,6020,6022],{"className":786,"code":6021,"language":788,"meta":270,"style":270},"tar -czvf a.tar.gz \u003Cdir>          # 打包\ntar -xzvf a.tar.gz                # 解包\ntar -tzvf a.tar.gz                # 查看内容\ntar -xzvf a.tar.gz -C \u002Ftmp\n\nzip -r a.zip \u003Cdir>\nunzip a.zip\nunzip -l a.zip\nunzip a.zip -d \u002Ftmp\n\ngzip \u003Cfile>\ngunzip \u003Cfile>.gz\n\nzstd \u003Cfile>                       # 快速压缩\nxz -9 \u003Cfile>                      # 高压缩\n",[69,6023,6024,6046,6058,6070,6084,6088,6106,6114,6122,6132,6136,6149,6165,6169,6185],{"__ignoreMap":270},[792,6025,6026,6029,6032,6035,6037,6039,6041,6043],{"class":794,"line":795},[792,6027,6028],{"class":804},"tar",[792,6030,6031],{"class":812}," -czvf",[792,6033,6034],{"class":808}," a.tar.gz",[792,6036,1037],{"class":1036},[792,6038,4115],{"class":808},[792,6040,4118],{"class":1043},[792,6042,1047],{"class":1036},[792,6044,6045],{"class":798},"          # 打包\n",[792,6047,6048,6050,6053,6055],{"class":794,"line":271},[792,6049,6028],{"class":804},[792,6051,6052],{"class":812}," -xzvf",[792,6054,6034],{"class":808},[792,6056,6057],{"class":798},"                # 解包\n",[792,6059,6060,6062,6065,6067],{"class":794,"line":747},[792,6061,6028],{"class":804},[792,6063,6064],{"class":812}," -tzvf",[792,6066,6034],{"class":808},[792,6068,6069],{"class":798},"                # 查看内容\n",[792,6071,6072,6074,6076,6078,6081],{"class":794,"line":836},[792,6073,6028],{"class":804},[792,6075,6052],{"class":812},[792,6077,6034],{"class":808},[792,6079,6080],{"class":812}," -C",[792,6082,6083],{"class":808}," \u002Ftmp\n",[792,6085,6086],{"class":794,"line":842},[792,6087,839],{"emptyLinePlaceholder":286},[792,6089,6090,6093,6095,6098,6100,6102,6104],{"class":794,"line":848},[792,6091,6092],{"class":804},"zip",[792,6094,2624],{"class":812},[792,6096,6097],{"class":808}," a.zip",[792,6099,1037],{"class":1036},[792,6101,4115],{"class":808},[792,6103,4118],{"class":1043},[792,6105,1748],{"class":1036},[792,6107,6108,6111],{"class":794,"line":863},[792,6109,6110],{"class":804},"unzip",[792,6112,6113],{"class":808}," a.zip\n",[792,6115,6116,6118,6120],{"class":794,"line":868},[792,6117,6110],{"class":804},[792,6119,4766],{"class":812},[792,6121,6113],{"class":808},[792,6123,6124,6126,6128,6130],{"class":794,"line":874},[792,6125,6110],{"class":804},[792,6127,6097],{"class":808},[792,6129,1323],{"class":812},[792,6131,6083],{"class":808},[792,6133,6134],{"class":794,"line":889},[792,6135,839],{"emptyLinePlaceholder":286},[792,6137,6138,6141,6143,6145,6147],{"class":794,"line":894},[792,6139,6140],{"class":804},"gzip",[792,6142,1037],{"class":1036},[792,6144,1040],{"class":808},[792,6146,1044],{"class":1043},[792,6148,1748],{"class":1036},[792,6150,6151,6154,6156,6158,6160,6162],{"class":794,"line":900},[792,6152,6153],{"class":804},"gunzip",[792,6155,1037],{"class":1036},[792,6157,1040],{"class":808},[792,6159,1044],{"class":1043},[792,6161,1047],{"class":1036},[792,6163,6164],{"class":808},".gz\n",[792,6166,6167],{"class":794,"line":915},[792,6168,839],{"emptyLinePlaceholder":286},[792,6170,6171,6174,6176,6178,6180,6182],{"class":794,"line":920},[792,6172,6173],{"class":804},"zstd",[792,6175,1037],{"class":1036},[792,6177,1040],{"class":808},[792,6179,1044],{"class":1043},[792,6181,1047],{"class":1036},[792,6183,6184],{"class":798},"                       # 快速压缩\n",[792,6186,6187,6190,6192,6194,6196,6198,6200],{"class":794,"line":926},[792,6188,6189],{"class":804},"xz",[792,6191,5196],{"class":812},[792,6193,1037],{"class":1036},[792,6195,1040],{"class":808},[792,6197,1044],{"class":1043},[792,6199,1047],{"class":1036},[792,6201,6202],{"class":798},"                      # 高压缩\n",[13,6204,6206],{"id":6205},"九用户与权限","九、用户与权限",[784,6208,6210],{"className":786,"code":6209,"language":788,"meta":270,"style":270},"whoami\nid\nwho\nw\nlast\n\nuseradd -m -s \u002Fbin\u002Fbash \u003Cuser>\npasswd \u003Cuser>\nusermod -aG sudo \u003Cuser>\nuserdel -r \u003Cuser>\n\ngroupadd \u003Cgroup>\ngroups \u003Cuser>\n\nsu - \u003Cuser>\nsudo \u003Ccmd>\nsudo -i                           # 进 root shell\nsudo -u \u003Cuser> \u003Ccmd>\n",[69,6211,6212,6217,6222,6227,6232,6237,6241,6262,6275,6294,6309,6313,6327,6340,6344,6359,6371,6380],{"__ignoreMap":270},[792,6213,6214],{"class":794,"line":795},[792,6215,6216],{"class":804},"whoami\n",[792,6218,6219],{"class":794,"line":271},[792,6220,6221],{"class":804},"id\n",[792,6223,6224],{"class":794,"line":747},[792,6225,6226],{"class":804},"who\n",[792,6228,6229],{"class":794,"line":836},[792,6230,6231],{"class":804},"w\n",[792,6233,6234],{"class":794,"line":842},[792,6235,6236],{"class":804},"last\n",[792,6238,6239],{"class":794,"line":848},[792,6240,839],{"emptyLinePlaceholder":286},[792,6242,6243,6246,6248,6250,6253,6255,6258,6260],{"class":794,"line":863},[792,6244,6245],{"class":804},"useradd",[792,6247,1084],{"class":812},[792,6249,4184],{"class":812},[792,6251,6252],{"class":808}," \u002Fbin\u002Fbash",[792,6254,1037],{"class":1036},[792,6256,6257],{"class":808},"use",[792,6259,4118],{"class":1043},[792,6261,1748],{"class":1036},[792,6263,6264,6267,6269,6271,6273],{"class":794,"line":868},[792,6265,6266],{"class":804},"passwd",[792,6268,1037],{"class":1036},[792,6270,6257],{"class":808},[792,6272,4118],{"class":1043},[792,6274,1748],{"class":1036},[792,6276,6277,6280,6283,6286,6288,6290,6292],{"class":794,"line":874},[792,6278,6279],{"class":804},"usermod",[792,6281,6282],{"class":812}," -aG",[792,6284,6285],{"class":808}," sudo",[792,6287,1037],{"class":1036},[792,6289,6257],{"class":808},[792,6291,4118],{"class":1043},[792,6293,1748],{"class":1036},[792,6295,6296,6299,6301,6303,6305,6307],{"class":794,"line":889},[792,6297,6298],{"class":804},"userdel",[792,6300,2624],{"class":812},[792,6302,1037],{"class":1036},[792,6304,6257],{"class":808},[792,6306,4118],{"class":1043},[792,6308,1748],{"class":1036},[792,6310,6311],{"class":794,"line":894},[792,6312,839],{"emptyLinePlaceholder":286},[792,6314,6315,6318,6320,6323,6325],{"class":794,"line":900},[792,6316,6317],{"class":804},"groupadd",[792,6319,1037],{"class":1036},[792,6321,6322],{"class":808},"grou",[792,6324,173],{"class":1043},[792,6326,1748],{"class":1036},[792,6328,6329,6332,6334,6336,6338],{"class":794,"line":915},[792,6330,6331],{"class":804},"groups",[792,6333,1037],{"class":1036},[792,6335,6257],{"class":808},[792,6337,4118],{"class":1043},[792,6339,1748],{"class":1036},[792,6341,6342],{"class":794,"line":920},[792,6343,839],{"emptyLinePlaceholder":286},[792,6345,6346,6349,6351,6353,6355,6357],{"class":794,"line":926},[792,6347,6348],{"class":804},"su",[792,6350,4086],{"class":808},[792,6352,1037],{"class":1036},[792,6354,6257],{"class":808},[792,6356,4118],{"class":1043},[792,6358,1748],{"class":1036},[792,6360,6361,6363,6365,6367,6369],{"class":794,"line":941},[792,6362,3125],{"class":804},[792,6364,1037],{"class":1036},[792,6366,4364],{"class":808},[792,6368,1370],{"class":1043},[792,6370,1748],{"class":1036},[792,6372,6373,6375,6377],{"class":794,"line":956},[792,6374,3125],{"class":804},[792,6376,1460],{"class":812},[792,6378,6379],{"class":798},"                           # 进 root shell\n",[792,6381,6382,6384,6386,6388,6390,6392,6394,6396,6398,6400],{"class":794,"line":971},[792,6383,3125],{"class":804},[792,6385,1824],{"class":812},[792,6387,1037],{"class":1036},[792,6389,6257],{"class":808},[792,6391,4118],{"class":1043},[792,6393,1047],{"class":1036},[792,6395,1037],{"class":1036},[792,6397,4364],{"class":808},[792,6399,1370],{"class":1043},[792,6401,1748],{"class":1036},[173,6403,6404],{},"sudoers：",[784,6406,6408],{"className":786,"code":6407,"language":788,"meta":270,"style":270},"visudo\n",[69,6409,6410],{"__ignoreMap":270},[792,6411,6412],{"class":794,"line":795},[792,6413,6407],{"class":804},[784,6415,6418],{"className":6416,"code":6417,"language":2668},[2666],"alice ALL=(ALL:ALL) ALL\n%sudo ALL=(ALL:ALL) ALL\nalice ALL=(ALL) NOPASSWD: ALL     # 免密\n",[69,6419,6417],{"__ignoreMap":270},[13,6421,6423],{"id":6422},"十systemd","十、systemd",[784,6425,6427],{"className":786,"code":6426,"language":788,"meta":270,"style":270},"systemctl start\u002Fstop\u002Frestart\u002Freload\u002Fstatus \u003Csvc>\nsystemctl enable\u002Fdisable \u003Csvc>\nsystemctl is-active \u003Csvc>\nsystemctl list-units --type=service --state=running\nsystemctl daemon-reload\n\njournalctl -u \u003Csvc>\njournalctl -u \u003Csvc> -f\njournalctl -u \u003Csvc> --since \"1 hour ago\"\njournalctl -xe                    # 最近错误\njournalctl -b                     # 本次启动\njournalctl --disk-usage\njournalctl --vacuum-size=500M     # 清理\n",[69,6428,6429,6446,6461,6476,6489,6495,6499,6514,6531,6551,6561,6570,6577],{"__ignoreMap":270},[792,6430,6431,6434,6437,6439,6442,6444],{"class":794,"line":795},[792,6432,6433],{"class":804},"systemctl",[792,6435,6436],{"class":808}," start\u002Fstop\u002Frestart\u002Freload\u002Fstatus",[792,6438,1037],{"class":1036},[792,6440,6441],{"class":808},"sv",[792,6443,4138],{"class":1043},[792,6445,1748],{"class":1036},[792,6447,6448,6450,6453,6455,6457,6459],{"class":794,"line":271},[792,6449,6433],{"class":804},[792,6451,6452],{"class":808}," enable\u002Fdisable",[792,6454,1037],{"class":1036},[792,6456,6441],{"class":808},[792,6458,4138],{"class":1043},[792,6460,1748],{"class":1036},[792,6462,6463,6465,6468,6470,6472,6474],{"class":794,"line":747},[792,6464,6433],{"class":804},[792,6466,6467],{"class":808}," is-active",[792,6469,1037],{"class":1036},[792,6471,6441],{"class":808},[792,6473,4138],{"class":1043},[792,6475,1748],{"class":1036},[792,6477,6478,6480,6483,6486],{"class":794,"line":836},[792,6479,6433],{"class":804},[792,6481,6482],{"class":808}," list-units",[792,6484,6485],{"class":812}," --type=service",[792,6487,6488],{"class":812}," --state=running\n",[792,6490,6491,6493],{"class":794,"line":842},[792,6492,6433],{"class":804},[792,6494,3842],{"class":808},[792,6496,6497],{"class":794,"line":848},[792,6498,839],{"emptyLinePlaceholder":286},[792,6500,6501,6504,6506,6508,6510,6512],{"class":794,"line":863},[792,6502,6503],{"class":804},"journalctl",[792,6505,1824],{"class":812},[792,6507,1037],{"class":1036},[792,6509,6441],{"class":808},[792,6511,4138],{"class":1043},[792,6513,1748],{"class":1036},[792,6515,6516,6518,6520,6522,6524,6526,6528],{"class":794,"line":868},[792,6517,6503],{"class":804},[792,6519,1824],{"class":812},[792,6521,1037],{"class":1036},[792,6523,6441],{"class":808},[792,6525,4138],{"class":1043},[792,6527,1047],{"class":1036},[792,6529,6530],{"class":812}," -f\n",[792,6532,6533,6535,6537,6539,6541,6543,6545,6548],{"class":794,"line":874},[792,6534,6503],{"class":804},[792,6536,1824],{"class":812},[792,6538,1037],{"class":1036},[792,6540,6441],{"class":808},[792,6542,4138],{"class":1043},[792,6544,1047],{"class":1036},[792,6546,6547],{"class":812}," --since",[792,6549,6550],{"class":808}," \"1 hour ago\"\n",[792,6552,6553,6555,6558],{"class":794,"line":889},[792,6554,6503],{"class":804},[792,6556,6557],{"class":812}," -xe",[792,6559,6560],{"class":798},"                    # 最近错误\n",[792,6562,6563,6565,6567],{"class":794,"line":894},[792,6564,6503],{"class":804},[792,6566,1303],{"class":812},[792,6568,6569],{"class":798},"                     # 本次启动\n",[792,6571,6572,6574],{"class":794,"line":900},[792,6573,6503],{"class":804},[792,6575,6576],{"class":812}," --disk-usage\n",[792,6578,6579,6581,6584],{"class":794,"line":915},[792,6580,6503],{"class":804},[792,6582,6583],{"class":812}," --vacuum-size=500M",[792,6585,6586],{"class":798},"     # 清理\n",[173,6588,6589,6590,3182],{},"unit 文件示例 ",[69,6591,6592],{},"\u002Fetc\u002Fsystemd\u002Fsystem\u002Fmyapp.service",[784,6594,6598],{"className":6595,"code":6596,"language":6597,"meta":270,"style":270},"language-ini shiki shiki-themes monokai","[Unit]\nDescription=My App\nAfter=network.target\n\n[Service]\nType=simple\nUser=appuser\nWorkingDirectory=\u002Fopt\u002Fmyapp\nExecStart=\u002Fusr\u002Fbin\u002Fnode \u002Fopt\u002Fmyapp\u002Findex.js\nRestart=on-failure\nRestartSec=5\n\n[Install]\nWantedBy=multi-user.target\n","ini",[69,6599,6600,6605,6610,6615,6619,6624,6629,6634,6639,6644,6649,6654,6658,6663],{"__ignoreMap":270},[792,6601,6602],{"class":794,"line":795},[792,6603,6604],{},"[Unit]\n",[792,6606,6607],{"class":794,"line":271},[792,6608,6609],{},"Description=My App\n",[792,6611,6612],{"class":794,"line":747},[792,6613,6614],{},"After=network.target\n",[792,6616,6617],{"class":794,"line":836},[792,6618,839],{"emptyLinePlaceholder":286},[792,6620,6621],{"class":794,"line":842},[792,6622,6623],{},"[Service]\n",[792,6625,6626],{"class":794,"line":848},[792,6627,6628],{},"Type=simple\n",[792,6630,6631],{"class":794,"line":863},[792,6632,6633],{},"User=appuser\n",[792,6635,6636],{"class":794,"line":868},[792,6637,6638],{},"WorkingDirectory=\u002Fopt\u002Fmyapp\n",[792,6640,6641],{"class":794,"line":874},[792,6642,6643],{},"ExecStart=\u002Fusr\u002Fbin\u002Fnode \u002Fopt\u002Fmyapp\u002Findex.js\n",[792,6645,6646],{"class":794,"line":889},[792,6647,6648],{},"Restart=on-failure\n",[792,6650,6651],{"class":794,"line":894},[792,6652,6653],{},"RestartSec=5\n",[792,6655,6656],{"class":794,"line":900},[792,6657,839],{"emptyLinePlaceholder":286},[792,6659,6660],{"class":794,"line":915},[792,6661,6662],{},"[Install]\n",[792,6664,6665],{"class":794,"line":920},[792,6666,6667],{},"WantedBy=multi-user.target\n",[784,6669,6671],{"className":786,"code":6670,"language":788,"meta":270,"style":270},"sudo systemctl daemon-reload\nsudo systemctl enable --now myapp\n",[69,6672,6673,6681],{"__ignoreMap":270},[792,6674,6675,6677,6679],{"class":794,"line":795},[792,6676,3125],{"class":804},[792,6678,3839],{"class":808},[792,6680,3842],{"class":808},[792,6682,6683,6685,6687,6690,6693],{"class":794,"line":271},[792,6684,3125],{"class":804},[792,6686,3839],{"class":808},[792,6688,6689],{"class":808}," enable",[792,6691,6692],{"class":812}," --now",[792,6694,6695],{"class":808}," myapp\n",[13,6697,6699],{"id":6698},"十一ssh","十一、SSH",[784,6701,6703],{"className":786,"code":6702,"language":788,"meta":270,"style":270},"ssh user@host\nssh -p 2222 user@host\nssh -i ~\u002F.ssh\u002Fid_rsa user@host\n\nssh-keygen -t ed25519 -C \"comment\"\nssh-copy-id user@host\n\nssh -L 8080:localhost:80 user@host   # 本地转发\nssh -R 8080:localhost:80 user@host   # 远程转发\nssh -D 1080 user@host                # SOCKS 代理\n",[69,6704,6705,6713,6724,6735,6739,6755,6762,6766,6781,6794],{"__ignoreMap":270},[792,6706,6707,6710],{"class":794,"line":795},[792,6708,6709],{"class":804},"ssh",[792,6711,6712],{"class":808}," user@host\n",[792,6714,6715,6717,6719,6722],{"class":794,"line":271},[792,6716,6709],{"class":804},[792,6718,2242],{"class":812},[792,6720,6721],{"class":812}," 2222",[792,6723,6712],{"class":808},[792,6725,6726,6728,6730,6733],{"class":794,"line":747},[792,6727,6709],{"class":804},[792,6729,1460],{"class":812},[792,6731,6732],{"class":808}," ~\u002F.ssh\u002Fid_rsa",[792,6734,6712],{"class":808},[792,6736,6737],{"class":794,"line":836},[792,6738,839],{"emptyLinePlaceholder":286},[792,6740,6741,6744,6747,6750,6752],{"class":794,"line":842},[792,6742,6743],{"class":804},"ssh-keygen",[792,6745,6746],{"class":812}," -t",[792,6748,6749],{"class":808}," ed25519",[792,6751,6080],{"class":812},[792,6753,6754],{"class":808}," \"comment\"\n",[792,6756,6757,6760],{"class":794,"line":848},[792,6758,6759],{"class":804},"ssh-copy-id",[792,6761,6712],{"class":808},[792,6763,6764],{"class":794,"line":863},[792,6765,839],{"emptyLinePlaceholder":286},[792,6767,6768,6770,6772,6775,6778],{"class":794,"line":868},[792,6769,6709],{"class":804},[792,6771,5798],{"class":812},[792,6773,6774],{"class":808}," 8080:localhost:80",[792,6776,6777],{"class":808}," user@host",[792,6779,6780],{"class":798},"   # 本地转发\n",[792,6782,6783,6785,6787,6789,6791],{"class":794,"line":874},[792,6784,6709],{"class":804},[792,6786,4902],{"class":812},[792,6788,6774],{"class":808},[792,6790,6777],{"class":808},[792,6792,6793],{"class":798},"   # 远程转发\n",[792,6795,6796,6798,6800,6803,6805],{"class":794,"line":889},[792,6797,6709],{"class":804},[792,6799,1343],{"class":812},[792,6801,6802],{"class":812}," 1080",[792,6804,6777],{"class":808},[792,6806,6807],{"class":798},"                # SOCKS 代理\n",[173,6809,6810,3182],{},[69,6811,6812],{},"~\u002F.ssh\u002Fconfig",[784,6814,6817],{"className":6815,"code":6816,"language":2668},[2666],"Host myserver\n    HostName 1.2.3.4\n    User alice\n    Port 2222\n    IdentityFile ~\u002F.ssh\u002Fid_ed25519\n",[69,6818,6816],{"__ignoreMap":270},[173,6820,6821,6822,2568],{},"之后 ",[69,6823,6824],{},"ssh myserver",[571,6826,6827],{"id":6827},"传输",[784,6829,6831],{"className":786,"code":6830,"language":788,"meta":270,"style":270},"scp \u003Cfile> user@host:\u002Fpath\u002F\nscp user@host:\u002Fpath\u002F\u003Cfile> .\nscp -r \u003Cdir> user@host:\u002Fpath\u002F\n\nrsync -avz --progress \u003Csrc> user@host:\u003Cdst>   # 增量同步\nrsync -avz --delete \u003Csrc> user@host:\u003Cdst>\n",[69,6832,6833,6849,6866,6882,6886,6919],{"__ignoreMap":270},[792,6834,6835,6838,6840,6842,6844,6846],{"class":794,"line":795},[792,6836,6837],{"class":804},"scp",[792,6839,1037],{"class":1036},[792,6841,1040],{"class":808},[792,6843,1044],{"class":1043},[792,6845,1047],{"class":1036},[792,6847,6848],{"class":808}," user@host:\u002Fpath\u002F\n",[792,6850,6851,6853,6856,6858,6860,6862,6864],{"class":794,"line":271},[792,6852,6837],{"class":804},[792,6854,6855],{"class":808}," user@host:\u002Fpath\u002F",[792,6857,1186],{"class":1036},[792,6859,1040],{"class":808},[792,6861,1044],{"class":1043},[792,6863,1047],{"class":1036},[792,6865,2630],{"class":808},[792,6867,6868,6870,6872,6874,6876,6878,6880],{"class":794,"line":747},[792,6869,6837],{"class":804},[792,6871,2624],{"class":812},[792,6873,1037],{"class":1036},[792,6875,4115],{"class":808},[792,6877,4118],{"class":1043},[792,6879,1047],{"class":1036},[792,6881,6848],{"class":808},[792,6883,6884],{"class":794,"line":836},[792,6885,839],{"emptyLinePlaceholder":286},[792,6887,6888,6891,6894,6897,6899,6901,6903,6905,6908,6910,6912,6914,6916],{"class":794,"line":842},[792,6889,6890],{"class":804},"rsync",[792,6892,6893],{"class":812}," -avz",[792,6895,6896],{"class":812}," --progress",[792,6898,1037],{"class":1036},[792,6900,4135],{"class":808},[792,6902,4138],{"class":1043},[792,6904,1047],{"class":1036},[792,6906,6907],{"class":808}," user@host:",[792,6909,1186],{"class":1036},[792,6911,4145],{"class":808},[792,6913,2331],{"class":1043},[792,6915,1047],{"class":1036},[792,6917,6918],{"class":798},"   # 增量同步\n",[792,6920,6921,6923,6925,6928,6930,6932,6934,6936,6938,6940,6942,6944],{"class":794,"line":848},[792,6922,6890],{"class":804},[792,6924,6893],{"class":812},[792,6926,6927],{"class":812}," --delete",[792,6929,1037],{"class":1036},[792,6931,4135],{"class":808},[792,6933,4138],{"class":1043},[792,6935,1047],{"class":1036},[792,6937,6907],{"class":808},[792,6939,1186],{"class":1036},[792,6941,4145],{"class":808},[792,6943,2331],{"class":1043},[792,6945,1748],{"class":1036},[13,6947,6949],{"id":6948},"十二软件包管理","十二、软件包管理",[571,6951,6953],{"id":6952},"aptdebian-ubuntu","apt（Debian \u002F Ubuntu）",[784,6955,6957],{"className":786,"code":6956,"language":788,"meta":270,"style":270},"sudo apt update                   # 更新索引\nsudo apt upgrade                  # 升级\nsudo apt full-upgrade             # 含依赖变化\nsudo apt install \u003Cpkg>\nsudo apt remove \u003Cpkg>             # 保留配置\nsudo apt purge \u003Cpkg>              # 含配置\nsudo apt autoremove               # 清理无用依赖\nsudo apt search \u003Ckw>\nsudo apt show \u003Cpkg>\napt list --installed\n\nsudo dpkg -i \u003Cpkg>.deb\ndpkg -l | grep \u003Cpkg>\n",[69,6958,6959,6971,6983,6995,7011,7030,7050,7062,7079,7095,7105,7109,7129],{"__ignoreMap":270},[792,6960,6961,6963,6965,6968],{"class":794,"line":795},[792,6962,3125],{"class":804},[792,6964,3169],{"class":808},[792,6966,6967],{"class":808}," update",[792,6969,6970],{"class":798},"                   # 更新索引\n",[792,6972,6973,6975,6977,6980],{"class":794,"line":271},[792,6974,3125],{"class":804},[792,6976,3169],{"class":808},[792,6978,6979],{"class":808}," upgrade",[792,6981,6982],{"class":798},"                  # 升级\n",[792,6984,6985,6987,6989,6992],{"class":794,"line":747},[792,6986,3125],{"class":804},[792,6988,3169],{"class":808},[792,6990,6991],{"class":808}," full-upgrade",[792,6993,6994],{"class":798},"             # 含依赖变化\n",[792,6996,6997,6999,7001,7003,7005,7007,7009],{"class":794,"line":836},[792,6998,3125],{"class":804},[792,7000,3169],{"class":808},[792,7002,3684],{"class":808},[792,7004,1037],{"class":1036},[792,7006,3689],{"class":808},[792,7008,3692],{"class":1043},[792,7010,1748],{"class":1036},[792,7012,7013,7015,7017,7019,7021,7023,7025,7027],{"class":794,"line":842},[792,7014,3125],{"class":804},[792,7016,3169],{"class":808},[792,7018,1982],{"class":808},[792,7020,1037],{"class":1036},[792,7022,3689],{"class":808},[792,7024,3692],{"class":1043},[792,7026,1047],{"class":1036},[792,7028,7029],{"class":798},"             # 保留配置\n",[792,7031,7032,7034,7036,7039,7041,7043,7045,7047],{"class":794,"line":848},[792,7033,3125],{"class":804},[792,7035,3169],{"class":808},[792,7037,7038],{"class":808}," purge",[792,7040,1037],{"class":1036},[792,7042,3689],{"class":808},[792,7044,3692],{"class":1043},[792,7046,1047],{"class":1036},[792,7048,7049],{"class":798},"              # 含配置\n",[792,7051,7052,7054,7056,7059],{"class":794,"line":863},[792,7053,3125],{"class":804},[792,7055,3169],{"class":808},[792,7057,7058],{"class":808}," autoremove",[792,7060,7061],{"class":798},"               # 清理无用依赖\n",[792,7063,7064,7066,7068,7071,7073,7075,7077],{"class":794,"line":868},[792,7065,3125],{"class":804},[792,7067,3169],{"class":808},[792,7069,7070],{"class":808}," search",[792,7072,1037],{"class":1036},[792,7074,4201],{"class":808},[792,7076,1380],{"class":1043},[792,7078,1748],{"class":1036},[792,7080,7081,7083,7085,7087,7089,7091,7093],{"class":794,"line":874},[792,7082,3125],{"class":804},[792,7084,3169],{"class":808},[792,7086,2323],{"class":808},[792,7088,1037],{"class":1036},[792,7090,3689],{"class":808},[792,7092,3692],{"class":1043},[792,7094,1748],{"class":1036},[792,7096,7097,7100,7102],{"class":794,"line":889},[792,7098,7099],{"class":804},"apt",[792,7101,1836],{"class":808},[792,7103,7104],{"class":812}," --installed\n",[792,7106,7107],{"class":794,"line":894},[792,7108,839],{"emptyLinePlaceholder":286},[792,7110,7111,7113,7116,7118,7120,7122,7124,7126],{"class":794,"line":900},[792,7112,3125],{"class":804},[792,7114,7115],{"class":808}," dpkg",[792,7117,1460],{"class":812},[792,7119,1037],{"class":1036},[792,7121,3689],{"class":808},[792,7123,3692],{"class":1043},[792,7125,1047],{"class":1036},[792,7127,7128],{"class":808},".deb\n",[792,7130,7131,7134,7136,7138,7140,7142,7144,7146],{"class":794,"line":915},[792,7132,7133],{"class":804},"dpkg",[792,7135,4766],{"class":812},[792,7137,3865],{"class":1036},[792,7139,3868],{"class":804},[792,7141,1037],{"class":1036},[792,7143,3689],{"class":808},[792,7145,3692],{"class":1043},[792,7147,1748],{"class":1036},[571,7149,7151],{"id":7150},"yum-dnfrhel-centos","yum \u002F dnf（RHEL \u002F CentOS）",[784,7153,7155],{"className":786,"code":7154,"language":788,"meta":270,"style":270},"sudo yum install \u003Cpkg>\nsudo yum remove \u003Cpkg>\nsudo yum update\nsudo yum search \u003Ckw>\nsudo yum info \u003Cpkg>\nyum list installed\nyum clean all && yum makecache\n\nsudo dnf install \u003Cpkg>            # 新一代\ndnf upgrade\ndnf clean all\n\nsudo rpm -ivh \u003Cpkg>.rpm\nrpm -qa | grep \u003Cpkg>\nsudo rpm -e \u003Cpkg>\n",[69,7156,7157,7173,7189,7197,7213,7229,7239,7253,7257,7276,7284,7292,7296,7317,7337],{"__ignoreMap":270},[792,7158,7159,7161,7163,7165,7167,7169,7171],{"class":794,"line":795},[792,7160,3125],{"class":804},[792,7162,3374],{"class":808},[792,7164,3684],{"class":808},[792,7166,1037],{"class":1036},[792,7168,3689],{"class":808},[792,7170,3692],{"class":1043},[792,7172,1748],{"class":1036},[792,7174,7175,7177,7179,7181,7183,7185,7187],{"class":794,"line":271},[792,7176,3125],{"class":804},[792,7178,3374],{"class":808},[792,7180,1982],{"class":808},[792,7182,1037],{"class":1036},[792,7184,3689],{"class":808},[792,7186,3692],{"class":1043},[792,7188,1748],{"class":1036},[792,7190,7191,7193,7195],{"class":794,"line":747},[792,7192,3125],{"class":804},[792,7194,3374],{"class":808},[792,7196,3172],{"class":808},[792,7198,7199,7201,7203,7205,7207,7209,7211],{"class":794,"line":836},[792,7200,3125],{"class":804},[792,7202,3374],{"class":808},[792,7204,7070],{"class":808},[792,7206,1037],{"class":1036},[792,7208,4201],{"class":808},[792,7210,1380],{"class":1043},[792,7212,1748],{"class":1036},[792,7214,7215,7217,7219,7221,7223,7225,7227],{"class":794,"line":842},[792,7216,3125],{"class":804},[792,7218,3374],{"class":808},[792,7220,3862],{"class":808},[792,7222,1037],{"class":1036},[792,7224,3689],{"class":808},[792,7226,3692],{"class":1043},[792,7228,1748],{"class":1036},[792,7230,7231,7234,7236],{"class":794,"line":848},[792,7232,7233],{"class":804},"yum",[792,7235,1836],{"class":808},[792,7237,7238],{"class":808}," installed\n",[792,7240,7241,7243,7245,7247,7249,7251],{"class":794,"line":863},[792,7242,7233],{"class":804},[792,7244,3377],{"class":808},[792,7246,3464],{"class":808},[792,7248,3467],{"class":1043},[792,7250,7233],{"class":804},[792,7252,3389],{"class":808},[792,7254,7255],{"class":794,"line":868},[792,7256,839],{"emptyLinePlaceholder":286},[792,7258,7259,7261,7263,7265,7267,7269,7271,7273],{"class":794,"line":874},[792,7260,3125],{"class":804},[792,7262,3459],{"class":808},[792,7264,3684],{"class":808},[792,7266,1037],{"class":1036},[792,7268,3689],{"class":808},[792,7270,3692],{"class":1043},[792,7272,1047],{"class":1036},[792,7274,7275],{"class":798},"            # 新一代\n",[792,7277,7278,7281],{"class":794,"line":889},[792,7279,7280],{"class":804},"dnf",[792,7282,7283],{"class":808}," upgrade\n",[792,7285,7286,7288,7290],{"class":794,"line":894},[792,7287,7280],{"class":804},[792,7289,3377],{"class":808},[792,7291,3380],{"class":808},[792,7293,7294],{"class":794,"line":900},[792,7295,839],{"emptyLinePlaceholder":286},[792,7297,7298,7300,7303,7306,7308,7310,7312,7314],{"class":794,"line":915},[792,7299,3125],{"class":804},[792,7301,7302],{"class":808}," rpm",[792,7304,7305],{"class":812}," -ivh",[792,7307,1037],{"class":1036},[792,7309,3689],{"class":808},[792,7311,3692],{"class":1043},[792,7313,1047],{"class":1036},[792,7315,7316],{"class":808},".rpm\n",[792,7318,7319,7322,7325,7327,7329,7331,7333,7335],{"class":794,"line":920},[792,7320,7321],{"class":804},"rpm",[792,7323,7324],{"class":812}," -qa",[792,7326,3865],{"class":1036},[792,7328,3868],{"class":804},[792,7330,1037],{"class":1036},[792,7332,3689],{"class":808},[792,7334,3692],{"class":1043},[792,7336,1748],{"class":1036},[792,7338,7339,7341,7343,7346,7348,7350,7352],{"class":794,"line":926},[792,7340,3125],{"class":804},[792,7342,7302],{"class":808},[792,7344,7345],{"class":812}," -e",[792,7347,1037],{"class":1036},[792,7349,3689],{"class":808},[792,7351,3692],{"class":1043},[792,7353,1748],{"class":1036},[571,7355,7357],{"id":7356},"pacmanarch","pacman（Arch）",[784,7359,7361],{"className":786,"code":7360,"language":788,"meta":270,"style":270},"sudo pacman -Syu                  # 同步并升级\nsudo pacman -S \u003Cpkg>\nsudo pacman -Rns \u003Cpkg>            # 卸载含依赖配置\npacman -Ss \u003Ckw>\npacman -Qs \u003Cpkg>\n",[69,7362,7363,7375,7391,7411,7427],{"__ignoreMap":270},[792,7364,7365,7367,7369,7372],{"class":794,"line":795},[792,7366,3125],{"class":804},[792,7368,3555],{"class":808},[792,7370,7371],{"class":812}," -Syu",[792,7373,7374],{"class":798},"                  # 同步并升级\n",[792,7376,7377,7379,7381,7383,7385,7387,7389],{"class":794,"line":271},[792,7378,3125],{"class":804},[792,7380,3555],{"class":808},[792,7382,2292],{"class":812},[792,7384,1037],{"class":1036},[792,7386,3689],{"class":808},[792,7388,3692],{"class":1043},[792,7390,1748],{"class":1036},[792,7392,7393,7395,7397,7400,7402,7404,7406,7408],{"class":794,"line":747},[792,7394,3125],{"class":804},[792,7396,3555],{"class":808},[792,7398,7399],{"class":812}," -Rns",[792,7401,1037],{"class":1036},[792,7403,3689],{"class":808},[792,7405,3692],{"class":1043},[792,7407,1047],{"class":1036},[792,7409,7410],{"class":798},"            # 卸载含依赖配置\n",[792,7412,7413,7416,7419,7421,7423,7425],{"class":794,"line":836},[792,7414,7415],{"class":804},"pacman",[792,7417,7418],{"class":812}," -Ss",[792,7420,1037],{"class":1036},[792,7422,4201],{"class":808},[792,7424,1380],{"class":1043},[792,7426,1748],{"class":1036},[792,7428,7429,7431,7434,7436,7438,7440],{"class":794,"line":842},[792,7430,7415],{"class":804},[792,7432,7433],{"class":812}," -Qs",[792,7435,1037],{"class":1036},[792,7437,3689],{"class":808},[792,7439,3692],{"class":1043},[792,7441,1748],{"class":1036},[13,7443,7445],{"id":7444},"十三日志","十三、日志",[784,7447,7449],{"className":786,"code":7448,"language":788,"meta":270,"style":270},"journalctl -xe\njournalctl --since today\njournalctl -p err                 # 只错误\n\ntail -f \u002Fvar\u002Flog\u002Fsyslog           # Debian\u002FUbuntu\ntail -f \u002Fvar\u002Flog\u002Fmessages         # RHEL\u002FCentOS\ntail -f \u002Fvar\u002Flog\u002Fauth.log         # 认证\ntail -f \u002Fvar\u002Flog\u002Fnginx\u002Faccess.log\ntail -f \u002Fvar\u002Flog\u002Fnginx\u002Ferror.log\n\ndmesg\ndmesg -T                          # 人类可读时间\ndmesg | tail -20\n",[69,7450,7451,7458,7467,7479,7483,7495,7507,7519,7528,7537,7541,7546,7557],{"__ignoreMap":270},[792,7452,7453,7455],{"class":794,"line":795},[792,7454,6503],{"class":804},[792,7456,7457],{"class":812}," -xe\n",[792,7459,7460,7462,7464],{"class":794,"line":271},[792,7461,6503],{"class":804},[792,7463,6547],{"class":812},[792,7465,7466],{"class":808}," today\n",[792,7468,7469,7471,7473,7476],{"class":794,"line":747},[792,7470,6503],{"class":804},[792,7472,2242],{"class":812},[792,7474,7475],{"class":808}," err",[792,7477,7478],{"class":798},"                 # 只错误\n",[792,7480,7481],{"class":794,"line":836},[792,7482,839],{"emptyLinePlaceholder":286},[792,7484,7485,7487,7489,7492],{"class":794,"line":842},[792,7486,4446],{"class":804},[792,7488,4449],{"class":812},[792,7490,7491],{"class":808}," \u002Fvar\u002Flog\u002Fsyslog",[792,7493,7494],{"class":798},"           # Debian\u002FUbuntu\n",[792,7496,7497,7499,7501,7504],{"class":794,"line":848},[792,7498,4446],{"class":804},[792,7500,4449],{"class":812},[792,7502,7503],{"class":808}," \u002Fvar\u002Flog\u002Fmessages",[792,7505,7506],{"class":798},"         # RHEL\u002FCentOS\n",[792,7508,7509,7511,7513,7516],{"class":794,"line":863},[792,7510,4446],{"class":804},[792,7512,4449],{"class":812},[792,7514,7515],{"class":808}," \u002Fvar\u002Flog\u002Fauth.log",[792,7517,7518],{"class":798},"         # 认证\n",[792,7520,7521,7523,7525],{"class":794,"line":868},[792,7522,4446],{"class":804},[792,7524,4449],{"class":812},[792,7526,7527],{"class":808}," \u002Fvar\u002Flog\u002Fnginx\u002Faccess.log\n",[792,7529,7530,7532,7534],{"class":794,"line":874},[792,7531,4446],{"class":804},[792,7533,4449],{"class":812},[792,7535,7536],{"class":808}," \u002Fvar\u002Flog\u002Fnginx\u002Ferror.log\n",[792,7538,7539],{"class":794,"line":889},[792,7540,839],{"emptyLinePlaceholder":286},[792,7542,7543],{"class":794,"line":894},[792,7544,7545],{"class":804},"dmesg\n",[792,7547,7548,7551,7554],{"class":794,"line":900},[792,7549,7550],{"class":804},"dmesg",[792,7552,7553],{"class":812}," -T",[792,7555,7556],{"class":798},"                          # 人类可读时间\n",[792,7558,7559,7561,7563,7565],{"class":794,"line":915},[792,7560,7550],{"class":804},[792,7562,3865],{"class":1036},[792,7564,4436],{"class":804},[792,7566,6014],{"class":812},[13,7568,7570],{"id":7569},"十四环境变量","十四、环境变量",[784,7572,7574],{"className":786,"code":7573,"language":788,"meta":270,"style":270},"env\necho $PATH\nexport FOO=bar\nunset FOO\n\n# 永久\n~\u002F.bashrc                         # bash 交互式\n~\u002F.bash_profile                   # bash 登录\n~\u002F.profile                        # 通用\n\u002Fetc\u002Fprofile                      # 全局\n\nsource ~\u002F.bashrc\n\nexport PATH=\"$HOME\u002F.local\u002Fbin:$PATH\"      # 前置\nexport PATH=\"$PATH:\u002Fopt\u002Ftools\u002Fbin\"        # 后置\n",[69,7575,7576,7581,7589,7603,7611,7615,7619,7630,7640,7650,7658,7662,7670,7674,7700],{"__ignoreMap":270},[792,7577,7578],{"class":794,"line":795},[792,7579,7580],{"class":804},"env\n",[792,7582,7583,7586],{"class":794,"line":271},[792,7584,7585],{"class":4063},"echo",[792,7587,7588],{"class":1043}," $PATH\n",[792,7590,7591,7594,7597,7600],{"class":794,"line":747},[792,7592,7593],{"class":1036},"export",[792,7595,7596],{"class":1043}," FOO",[792,7598,7599],{"class":1036},"=",[792,7601,7602],{"class":1043},"bar\n",[792,7604,7605,7608],{"class":794,"line":836},[792,7606,7607],{"class":4063},"unset",[792,7609,7610],{"class":808}," FOO\n",[792,7612,7613],{"class":794,"line":842},[792,7614,839],{"emptyLinePlaceholder":286},[792,7616,7617],{"class":794,"line":848},[792,7618,3614],{"class":798},[792,7620,7621,7624,7627],{"class":794,"line":863},[792,7622,7623],{"class":1036},"~",[792,7625,7626],{"class":1043},"\u002F.bashrc                         ",[792,7628,7629],{"class":798},"# bash 交互式\n",[792,7631,7632,7634,7637],{"class":794,"line":868},[792,7633,7623],{"class":1036},[792,7635,7636],{"class":1043},"\u002F.bash_profile                   ",[792,7638,7639],{"class":798},"# bash 登录\n",[792,7641,7642,7644,7647],{"class":794,"line":874},[792,7643,7623],{"class":1036},[792,7645,7646],{"class":1043},"\u002F.profile                        ",[792,7648,7649],{"class":798},"# 通用\n",[792,7651,7652,7655],{"class":794,"line":889},[792,7653,7654],{"class":804},"\u002Fetc\u002Fprofile",[792,7656,7657],{"class":798},"                      # 全局\n",[792,7659,7660],{"class":794,"line":894},[792,7661,839],{"emptyLinePlaceholder":286},[792,7663,7664,7667],{"class":794,"line":900},[792,7665,7666],{"class":4063},"source",[792,7668,7669],{"class":808}," ~\u002F.bashrc\n",[792,7671,7672],{"class":794,"line":915},[792,7673,839],{"emptyLinePlaceholder":286},[792,7675,7676,7678,7681,7683,7686,7689,7692,7695,7697],{"class":794,"line":920},[792,7677,7593],{"class":1036},[792,7679,7680],{"class":1043}," PATH",[792,7682,7599],{"class":1036},[792,7684,7685],{"class":808},"\"",[792,7687,7688],{"class":1043},"$HOME",[792,7690,7691],{"class":808},"\u002F.local\u002Fbin:",[792,7693,7694],{"class":1043},"$PATH",[792,7696,7685],{"class":808},[792,7698,7699],{"class":798},"      # 前置\n",[792,7701,7702,7704,7706,7708,7710,7712,7715],{"class":794,"line":926},[792,7703,7593],{"class":1036},[792,7705,7680],{"class":1043},[792,7707,7599],{"class":1036},[792,7709,7685],{"class":808},[792,7711,7694],{"class":1043},[792,7713,7714],{"class":808},":\u002Fopt\u002Ftools\u002Fbin\"",[792,7716,7717],{"class":798},"        # 后置\n",[13,7719,7721],{"id":7720},"十五性能排查","十五、性能排查",[784,7723,7725],{"className":786,"code":7724,"language":788,"meta":270,"style":270},"uptime                            # 负载\ntop                               # 实时\nfree -h                           # 内存\ndf -h \u002F df -i                     # 磁盘 \u002F inode\niostat -x 1                       # IO\nsar -u 1 5                        # CPU 历史\n",[69,7726,7727,7735,7742,7750,7766,7777],{"__ignoreMap":270},[792,7728,7729,7732],{"class":794,"line":795},[792,7730,7731],{"class":804},"uptime",[792,7733,7734],{"class":798},"                            # 负载\n",[792,7736,7737,7739],{"class":794,"line":271},[792,7738,5157],{"class":804},[792,7740,7741],{"class":798},"                               # 实时\n",[792,7743,7744,7746,7748],{"class":794,"line":747},[792,7745,5901],{"class":804},[792,7747,5846],{"class":812},[792,7749,5906],{"class":798},[792,7751,7752,7754,7756,7758,7761,7763],{"class":794,"line":836},[792,7753,5843],{"class":804},[792,7755,5846],{"class":812},[792,7757,4417],{"class":808},[792,7759,7760],{"class":808}," df",[792,7762,1460],{"class":812},[792,7764,7765],{"class":798},"                     # 磁盘 \u002F inode\n",[792,7767,7768,7770,7772,7774],{"class":794,"line":842},[792,7769,5919],{"class":804},[792,7771,5922],{"class":812},[792,7773,5925],{"class":812},[792,7775,7776],{"class":798},"                       # IO\n",[792,7778,7779,7782,7784,7786,7788],{"class":794,"line":848},[792,7780,7781],{"class":804},"sar",[792,7783,1824],{"class":812},[792,7785,5925],{"class":812},[792,7787,3579],{"class":812},[792,7789,7790],{"class":798},"                        # CPU 历史\n",[173,7792,7793],{},"通用排查顺序：",[1367,7795,7796,7804,7810,7819,7825],{},[80,7797,7798,7800,7801,7803],{},[69,7799,7731],{}," + ",[69,7802,5157],{},"：负载高不高、哪个进程占用。",[80,7805,7806,7809],{},[69,7807,7808],{},"free -h","：内存是否耗尽、是否 swap。",[80,7811,7812,7800,7815,7818],{},[69,7813,7814],{},"df -h",[69,7816,7817],{},"df -i","：空间 \u002F inode 是否满。",[80,7820,7821,7824],{},[69,7822,7823],{},"iostat -x 1","：IO 是否瓶颈。",[80,7826,7827,7830],{},[69,7828,7829],{},"ss -s","：连接数是否异常。",[571,7832,7833],{"id":7833},"定位细节",[784,7835,7837],{"className":786,"code":7836,"language":788,"meta":270,"style":270},"lsof -p \u003Cpid>                     # 进程打开的文件\nlsof -i :8080                     # 端口占用\nlsof \u002Fvar\u002Flog\u002Fsyslog\n\ntop -H -p \u003Cpid>                   # 线程\nps -T -p \u003Cpid>\n\ntcpdump -i eth0 -n\ntcpdump -i eth0 port 80\ntcpdump -i eth0 host 1.2.3.4\ntcpdump -i eth0 -w cap.pcap       # 存盘（Wireshark 打开）\n",[69,7838,7839,7856,7867,7874,7878,7897,7913,7917,7930,7943,7957],{"__ignoreMap":270},[792,7840,7841,7843,7845,7847,7849,7851,7853],{"class":794,"line":795},[792,7842,5413],{"class":804},[792,7844,2242],{"class":812},[792,7846,1037],{"class":1036},[792,7848,5182],{"class":808},[792,7850,1370],{"class":1043},[792,7852,1047],{"class":1036},[792,7854,7855],{"class":798},"                     # 进程打开的文件\n",[792,7857,7858,7860,7862,7864],{"class":794,"line":271},[792,7859,5413],{"class":804},[792,7861,1460],{"class":812},[792,7863,5418],{"class":808},[792,7865,7866],{"class":798},"                     # 端口占用\n",[792,7868,7869,7871],{"class":794,"line":747},[792,7870,5413],{"class":804},[792,7872,7873],{"class":808}," \u002Fvar\u002Flog\u002Fsyslog\n",[792,7875,7876],{"class":794,"line":836},[792,7877,839],{"emptyLinePlaceholder":286},[792,7879,7880,7882,7884,7886,7888,7890,7892,7894],{"class":794,"line":842},[792,7881,5157],{"class":804},[792,7883,5564],{"class":812},[792,7885,2242],{"class":812},[792,7887,1037],{"class":1036},[792,7889,5182],{"class":808},[792,7891,1370],{"class":1043},[792,7893,1047],{"class":1036},[792,7895,7896],{"class":798},"                   # 线程\n",[792,7898,7899,7901,7903,7905,7907,7909,7911],{"class":794,"line":848},[792,7900,5108],{"class":804},[792,7902,7553],{"class":812},[792,7904,2242],{"class":812},[792,7906,1037],{"class":1036},[792,7908,5182],{"class":808},[792,7910,1370],{"class":1043},[792,7912,1748],{"class":1036},[792,7914,7915],{"class":794,"line":863},[792,7916,839],{"emptyLinePlaceholder":286},[792,7918,7919,7922,7924,7927],{"class":794,"line":868},[792,7920,7921],{"class":804},"tcpdump",[792,7923,1460],{"class":812},[792,7925,7926],{"class":808}," eth0",[792,7928,7929],{"class":812}," -n\n",[792,7931,7932,7934,7936,7938,7941],{"class":794,"line":874},[792,7933,7921],{"class":804},[792,7935,1460],{"class":812},[792,7937,7926],{"class":808},[792,7939,7940],{"class":808}," port",[792,7942,5740],{"class":812},[792,7944,7945,7947,7949,7951,7954],{"class":794,"line":889},[792,7946,7921],{"class":804},[792,7948,1460],{"class":812},[792,7950,7926],{"class":808},[792,7952,7953],{"class":808}," host",[792,7955,7956],{"class":812}," 1.2.3.4\n",[792,7958,7959,7961,7963,7965,7967,7970],{"class":794,"line":894},[792,7960,7921],{"class":804},[792,7962,1460],{"class":812},[792,7964,7926],{"class":808},[792,7966,3900],{"class":812},[792,7968,7969],{"class":808}," cap.pcap",[792,7971,7972],{"class":798},"       # 存盘（Wireshark 打开）\n",[13,7974,7976],{"id":7975},"十六定时任务","十六、定时任务",[784,7978,7980],{"className":786,"code":7979,"language":788,"meta":270,"style":270},"crontab -e                        # 编辑\ncrontab -l                        # 列出\ncrontab -r                        # 删除\n",[69,7981,7982,7992,8001],{"__ignoreMap":270},[792,7983,7984,7987,7989],{"class":794,"line":795},[792,7985,7986],{"class":804},"crontab",[792,7988,7345],{"class":812},[792,7990,7991],{"class":798},"                        # 编辑\n",[792,7993,7994,7996,7998],{"class":794,"line":271},[792,7995,7986],{"class":804},[792,7997,4766],{"class":812},[792,7999,8000],{"class":798},"                        # 列出\n",[792,8002,8003,8005,8007],{"class":794,"line":747},[792,8004,7986],{"class":804},[792,8006,2624],{"class":812},[792,8008,8009],{"class":798},"                        # 删除\n",[173,8011,8012],{},"格式：",[784,8014,8017],{"className":8015,"code":8016,"language":2668},[2666],"* * * * * \u003Ccommand>\n│ │ │ │ │\n│ │ │ │ └─ 星期（0-7，0\u002F7 都是周日）\n│ │ │ └─── 月（1-12）\n│ │ └───── 日（1-31）\n│ └─────── 时（0-23）\n└───────── 分（0-59）\n",[69,8018,8016],{"__ignoreMap":270},[173,8020,5018],{},[784,8022,8025],{"className":8023,"code":8024,"language":2668},[2666],"0 3 * * * \u002Fopt\u002Fbackup.sh              # 每天 3:00\n*\u002F5 * * * * \u002Fusr\u002Fbin\u002Fcheck.sh         # 每 5 分钟\n0 9-18 * * 1-5 \u002Fopt\u002Fwork.sh           # 工作日 9-18 整点\n",[69,8026,8024],{"__ignoreMap":270},[173,8028,8029],{},"注意事项：",[77,8031,8032,8035,8041],{},[80,8033,8034],{},"PATH 与登录 shell 不同，用绝对路径。",[80,8036,8037,8038,183],{},"输出默认发邮件，重定向：",[69,8039,8040],{},">> \u002Fvar\u002Flog\u002Fjob.log 2>&1",[80,8042,8043],{},"秒级任务用 systemd timer。",[13,8045,8047],{"id":8046},"十七实用技巧","十七、实用技巧",[784,8049,8051],{"className":786,"code":8050,"language":788,"meta":270,"style":270},"history\nhistory | grep \u003Ckw>\nCtrl+R                            # 反向搜索历史\n!!                                # 上一条\n!$                                # 上一条最后参数\n!123                              # 历史编号 123\n\npushd \u002Fpath \u002F popd \u002F dirs -v\n\nnohup \u003Ccmd> > out.log 2>&1 &\ndisown\n\nopenssl rand -base64 16           # 随机密码\nuuidgen\nmd5sum \u003Cfile>\nsha256sum \u003Cfile>\nxxd \u003Cfile>\ntime \u003Ccmd>\n\npython3 -m http.server 8000       # 快速 HTTP 服务\n",[69,8052,8053,8058,8075,8083,8091,8102,8112,8116,8121,8125,8150,8155,8159,8176,8181,8194,8207,8220,8232,8236],{"__ignoreMap":270},[792,8054,8055],{"class":794,"line":795},[792,8056,8057],{"class":4063},"history\n",[792,8059,8060,8063,8065,8067,8069,8071,8073],{"class":794,"line":271},[792,8061,8062],{"class":4063},"history",[792,8064,3865],{"class":1036},[792,8066,3868],{"class":804},[792,8068,1037],{"class":1036},[792,8070,4201],{"class":808},[792,8072,1380],{"class":1043},[792,8074,1748],{"class":1036},[792,8076,8077,8080],{"class":794,"line":747},[792,8078,8079],{"class":804},"Ctrl+R",[792,8081,8082],{"class":798},"                            # 反向搜索历史\n",[792,8084,8085,8088],{"class":794,"line":836},[792,8086,8087],{"class":1036},"!!",[792,8089,8090],{"class":798},"                                # 上一条\n",[792,8092,8093,8096,8099],{"class":794,"line":842},[792,8094,8095],{"class":1036},"!",[792,8097,8098],{"class":804},"$",[792,8100,8101],{"class":798},"                                # 上一条最后参数\n",[792,8103,8104,8106,8109],{"class":794,"line":848},[792,8105,8095],{"class":1036},[792,8107,8108],{"class":804},"123",[792,8110,8111],{"class":798},"                              # 历史编号 123\n",[792,8113,8114],{"class":794,"line":863},[792,8115,839],{"emptyLinePlaceholder":286},[792,8117,8118],{"class":794,"line":868},[792,8119,8120],{"class":1043},"pushd \u002Fpath \u002F popd \u002F dirs -v\n",[792,8122,8123],{"class":794,"line":874},[792,8124,839],{"emptyLinePlaceholder":286},[792,8126,8127,8130,8132,8134,8136,8138,8141,8144,8147],{"class":794,"line":889},[792,8128,8129],{"class":804},"nohup",[792,8131,1037],{"class":1036},[792,8133,4364],{"class":808},[792,8135,1370],{"class":1043},[792,8137,1047],{"class":1036},[792,8139,8140],{"class":1036}," >",[792,8142,8143],{"class":808}," out.log",[792,8145,8146],{"class":1036}," 2>&1",[792,8148,8149],{"class":1043}," &\n",[792,8151,8152],{"class":794,"line":894},[792,8153,8154],{"class":4063},"disown\n",[792,8156,8157],{"class":794,"line":900},[792,8158,839],{"emptyLinePlaceholder":286},[792,8160,8161,8164,8167,8170,8173],{"class":794,"line":915},[792,8162,8163],{"class":804},"openssl",[792,8165,8166],{"class":808}," rand",[792,8168,8169],{"class":812}," -base64",[792,8171,8172],{"class":812}," 16",[792,8174,8175],{"class":798},"           # 随机密码\n",[792,8177,8178],{"class":794,"line":920},[792,8179,8180],{"class":804},"uuidgen\n",[792,8182,8183,8186,8188,8190,8192],{"class":794,"line":926},[792,8184,8185],{"class":804},"md5sum",[792,8187,1037],{"class":1036},[792,8189,1040],{"class":808},[792,8191,1044],{"class":1043},[792,8193,1748],{"class":1036},[792,8195,8196,8199,8201,8203,8205],{"class":794,"line":941},[792,8197,8198],{"class":804},"sha256sum",[792,8200,1037],{"class":1036},[792,8202,1040],{"class":808},[792,8204,1044],{"class":1043},[792,8206,1748],{"class":1036},[792,8208,8209,8212,8214,8216,8218],{"class":794,"line":956},[792,8210,8211],{"class":804},"xxd",[792,8213,1037],{"class":1036},[792,8215,1040],{"class":808},[792,8217,1044],{"class":1043},[792,8219,1748],{"class":1036},[792,8221,8222,8225,8227,8230],{"class":794,"line":971},[792,8223,8224],{"class":1036},"time",[792,8226,1037],{"class":1036},[792,8228,8229],{"class":1043},"cmd",[792,8231,1748],{"class":1036},[792,8233,8234],{"class":794,"line":986},[792,8235,839],{"emptyLinePlaceholder":286},[792,8237,8238,8241,8243,8246,8249],{"class":794,"line":991},[792,8239,8240],{"class":804},"python3",[792,8242,1084],{"class":812},[792,8244,8245],{"class":808}," http.server",[792,8247,8248],{"class":812}," 8000",[792,8250,8251],{"class":798},"       # 快速 HTTP 服务\n",[571,8253,8254],{"id":8254},"命令组合",[784,8256,8258],{"className":786,"code":8257,"language":788,"meta":270,"style":270},"cmd1 && cmd2                      # 成功才继续\ncmd1 || cmd2                      # 失败才继续\ncmd1 ; cmd2                       # 顺序\ncmd1 &                            # 后台\n(cmd1; cmd2)                      # 子 shell\n",[69,8259,8260,8273,8286,8298,8308],{"__ignoreMap":270},[792,8261,8262,8265,8267,8270],{"class":794,"line":795},[792,8263,8264],{"class":804},"cmd1",[792,8266,3467],{"class":1043},[792,8268,8269],{"class":804},"cmd2",[792,8271,8272],{"class":798},"                      # 成功才继续\n",[792,8274,8275,8277,8280,8283],{"class":794,"line":271},[792,8276,8264],{"class":804},[792,8278,8279],{"class":1036}," ||",[792,8281,8282],{"class":804}," cmd2",[792,8284,8285],{"class":798},"                      # 失败才继续\n",[792,8287,8288,8290,8293,8295],{"class":794,"line":747},[792,8289,8264],{"class":804},[792,8291,8292],{"class":1043}," ; ",[792,8294,8269],{"class":804},[792,8296,8297],{"class":798},"                       # 顺序\n",[792,8299,8300,8302,8305],{"class":794,"line":836},[792,8301,8264],{"class":804},[792,8303,8304],{"class":1043}," &                            ",[792,8306,8307],{"class":798},"# 后台\n",[792,8309,8310,8313,8315,8318,8320,8323],{"class":794,"line":842},[792,8311,8312],{"class":1043},"(",[792,8314,8264],{"class":804},[792,8316,8317],{"class":1043},"; ",[792,8319,8269],{"class":804},[792,8321,8322],{"class":1043},")                      ",[792,8324,8325],{"class":798},"# 子 shell\n",[571,8327,8328],{"id":8328},"变量",[784,8330,8332],{"className":786,"code":8331,"language":788,"meta":270,"style":270},"name=\"world\"\necho \"$name\"\necho \"${name}\"\necho \"$(date)\"\necho '$name'                      # 不替换\n\n: ${VAR:=default}                 # 默认值\n\nstr=\"hello.txt\"\n\n{% raw %}\necho ${str%.txt}                  # hello\necho ${str#hello.}                # txt\necho ${str\u002Ftxt\u002Fmd}                # hello.md\necho ${#str}                      # 9\n{% endraw %}\n\n",[69,8333,8334,8344,8357,8369,8382,8392,8396,8413,8417,8427,8431,8445,8460,8475,8494,8509],{"__ignoreMap":270},[792,8335,8336,8339,8341],{"class":794,"line":795},[792,8337,8338],{"class":1043},"name",[792,8340,7599],{"class":1036},[792,8342,8343],{"class":808},"\"world\"\n",[792,8345,8346,8348,8351,8354],{"class":794,"line":271},[792,8347,7585],{"class":4063},[792,8349,8350],{"class":808}," \"",[792,8352,8353],{"class":1043},"$name",[792,8355,8356],{"class":808},"\"\n",[792,8358,8359,8361,8364,8366],{"class":794,"line":747},[792,8360,7585],{"class":4063},[792,8362,8363],{"class":808}," \"${",[792,8365,8338],{"class":1043},[792,8367,8368],{"class":808},"}\"\n",[792,8370,8371,8373,8376,8379],{"class":794,"line":836},[792,8372,7585],{"class":4063},[792,8374,8375],{"class":808}," \"$(",[792,8377,8378],{"class":804},"date",[792,8380,8381],{"class":808},")\"\n",[792,8383,8384,8386,8389],{"class":794,"line":842},[792,8385,7585],{"class":4063},[792,8387,8388],{"class":808}," '$name'",[792,8390,8391],{"class":798},"                      # 不替换\n",[792,8393,8394],{"class":794,"line":848},[792,8395,839],{"emptyLinePlaceholder":286},[792,8397,8398,8401,8404,8407,8410],{"class":794,"line":863},[792,8399,8400],{"class":4063},":",[792,8402,8403],{"class":1043}," ${VAR",[792,8405,8406],{"class":1036},":=",[792,8408,8409],{"class":1043},"default}                 ",[792,8411,8412],{"class":798},"# 默认值\n",[792,8414,8415],{"class":794,"line":868},[792,8416,839],{"emptyLinePlaceholder":286},[792,8418,8419,8422,8424],{"class":794,"line":874},[792,8420,8421],{"class":1043},"str",[792,8423,7599],{"class":1036},[792,8425,8426],{"class":808},"\"hello.txt\"\n",[792,8428,8429],{"class":794,"line":889},[792,8430,839],{"emptyLinePlaceholder":286},[792,8432,8433,8436,8439,8442],{"class":794,"line":894},[792,8434,8435],{"class":1043},"{",[792,8437,8438],{"class":804},"%",[792,8440,8441],{"class":808}," raw",[792,8443,8444],{"class":808}," %}\n",[792,8446,8447,8449,8452,8454,8457],{"class":794,"line":900},[792,8448,7585],{"class":4063},[792,8450,8451],{"class":1043}," ${str",[792,8453,8438],{"class":1036},[792,8455,8456],{"class":1043},".txt}                  ",[792,8458,8459],{"class":798},"# hello\n",[792,8461,8462,8464,8466,8469,8472],{"class":794,"line":915},[792,8463,7585],{"class":4063},[792,8465,8451],{"class":1043},[792,8467,8468],{"class":1036},"#",[792,8470,8471],{"class":1043},"hello.}                ",[792,8473,8474],{"class":798},"# txt\n",[792,8476,8477,8479,8481,8483,8486,8488,8491],{"class":794,"line":920},[792,8478,7585],{"class":4063},[792,8480,8451],{"class":1043},[792,8482,4842],{"class":1036},[792,8484,8485],{"class":1043},"txt",[792,8487,4842],{"class":1036},[792,8489,8490],{"class":1043},"md}                ",[792,8492,8493],{"class":798},"# hello.md\n",[792,8495,8496,8498,8501,8503,8506],{"class":794,"line":926},[792,8497,7585],{"class":4063},[792,8499,8500],{"class":1043}," ${",[792,8502,8468],{"class":1036},[792,8504,8505],{"class":1043},"str}                      ",[792,8507,8508],{"class":798},"# 9\n",[792,8510,8511,8513,8515,8518],{"class":794,"line":941},[792,8512,8435],{"class":1043},[792,8514,8438],{"class":804},[792,8516,8517],{"class":808}," endraw",[792,8519,8444],{"class":808},[13,8521,8523],{"id":8522},"十八快捷键","十八、快捷键",[18,8525,8526,8536],{},[21,8527,8528],{},[24,8529,8530,8533],{},[27,8531,8532],{},"快捷键",[27,8534,8535],{},"作用",[35,8537,8538,8547,8557,8567,8580,8593,8603,8612,8621],{},[24,8539,8540,8544],{},[40,8541,8542],{},[69,8543,5338],{},[40,8545,8546],{},"中断",[24,8548,8549,8554],{},[40,8550,8551],{},[69,8552,8553],{},"Ctrl+D",[40,8555,8556],{},"退出 shell",[24,8558,8559,8564],{},[40,8560,8561],{},[69,8562,8563],{},"Ctrl+L",[40,8565,8566],{},"清屏",[24,8568,8569,8577],{},[40,8570,8571,3008,8574],{},[69,8572,8573],{},"Ctrl+A",[69,8575,8576],{},"Ctrl+E",[40,8578,8579],{},"行首 \u002F 行尾",[24,8581,8582,8590],{},[40,8583,8584,3008,8587],{},[69,8585,8586],{},"Ctrl+U",[69,8588,8589],{},"Ctrl+K",[40,8591,8592],{},"删光标前 \u002F 后",[24,8594,8595,8600],{},[40,8596,8597],{},[69,8598,8599],{},"Ctrl+W",[40,8601,8602],{},"删前一个单词",[24,8604,8605,8609],{},[40,8606,8607],{},[69,8608,8079],{},[40,8610,8611],{},"搜索历史",[24,8613,8614,8618],{},[40,8615,8616],{},[69,8617,5279],{},[40,8619,8620],{},"挂起",[24,8622,8623,8631],{},[40,8624,8625,3008,8628],{},[69,8626,8627],{},"Tab",[69,8629,8630],{},"Tab Tab",[40,8632,8633],{},"补全 \u002F 列候选",[3026,8635],{},[13,8637,3030],{"id":3030},[77,8639,8640,8647,8654,8661,8668,8674],{},[80,8641,8642,8643],{},"清华镜像站：",[158,8644,8645],{"href":8645,"rel":8646,"target":165},"https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn\u002F",[162,163,164],[80,8648,8649,8650],{},"中科大镜像站：",[158,8651,8652],{"href":8652,"rel":8653,"target":165},"https:\u002F\u002Fmirrors.ustc.edu.cn\u002F",[162,163,164],[80,8655,8656,8657],{},"阿里云镜像站：",[158,8658,8659],{"href":8659,"rel":8660,"target":165},"https:\u002F\u002Fdeveloper.aliyun.com\u002Fmirror\u002F",[162,163,164],[80,8662,8663,8664],{},"npmmirror：",[158,8665,8666],{"href":8666,"rel":8667,"target":165},"https:\u002F\u002Fnpmmirror.com\u002F",[162,163,164],[80,8669,8670,8671],{},"man 手册：",[69,8672,8673],{},"man \u003Ccommand>",[80,8675,8676,8677,8680],{},"tldr：",[69,8678,8679],{},"tldr \u003Ccommand>","（需安装）",[2724,8682,8683],{},"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 pre.shiki code .sHkqI, html code.shiki .sHkqI{--shiki-default:#A6E22E}html pre.shiki code .s_Ekj, html code.shiki .s_Ekj{--shiki-default:#E6DB74}html pre.shiki code .s7s5_, html code.shiki .s7s5_{--shiki-default:#AE81FF}html pre.shiki code .snpHw, html code.shiki .snpHw{--shiki-default:#88846F}html pre.shiki code .szGx7, html code.shiki .szGx7{--shiki-default:#FD971F}html pre.shiki code .sCdxs, html code.shiki .sCdxs{--shiki-default:#F8F8F2}html pre.shiki code .s8I7P, html code.shiki .s8I7P{--shiki-default:#F92672}html pre.shiki code .sOx1s, html code.shiki .sOx1s{--shiki-default:#66D9EF;--shiki-default-font-style:italic}html pre.shiki code .susgL, html code.shiki .susgL{--shiki-default:#CFCFC2}html pre.shiki code .sYf5A, html code.shiki .sYf5A{--shiki-default:#66D9EF}",{"title":270,"searchDepth":271,"depth":271,"links":8685},[8686,8697,8700,8703,8704,8705,8708,8709,8710,8711,8712,8715,8720,8721,8722,8725,8726,8730,8731],{"id":3107,"depth":271,"text":3108,"children":8687},[8688,8689,8690,8691,8692,8693,8694,8695,8696],{"id":3111,"depth":747,"text":3112},{"id":3218,"depth":747,"text":3219},{"id":3286,"depth":747,"text":3287},{"id":3526,"depth":747,"text":3527},{"id":3603,"depth":747,"text":3604},{"id":3762,"depth":747,"text":3763},{"id":3883,"depth":747,"text":3884},{"id":3917,"depth":747,"text":3918},{"id":3968,"depth":747,"text":3969},{"id":4052,"depth":271,"text":4053,"children":8698},[8699],{"id":4248,"depth":747,"text":4248},{"id":4403,"depth":271,"text":4404,"children":8701},[8702],{"id":4788,"depth":747,"text":4788},{"id":4858,"depth":271,"text":4859},{"id":5097,"depth":271,"text":5098},{"id":5363,"depth":271,"text":5364,"children":8706},[8707],{"id":5692,"depth":747,"text":5692},{"id":5832,"depth":271,"text":5833},{"id":6017,"depth":271,"text":6018},{"id":6205,"depth":271,"text":6206},{"id":6422,"depth":271,"text":6423},{"id":6698,"depth":271,"text":6699,"children":8713},[8714],{"id":6827,"depth":747,"text":6827},{"id":6948,"depth":271,"text":6949,"children":8716},[8717,8718,8719],{"id":6952,"depth":747,"text":6953},{"id":7150,"depth":747,"text":7151},{"id":7356,"depth":747,"text":7357},{"id":7444,"depth":271,"text":7445},{"id":7569,"depth":271,"text":7570},{"id":7720,"depth":271,"text":7721,"children":8723},[8724],{"id":7833,"depth":747,"text":7833},{"id":7975,"depth":271,"text":7976},{"id":8046,"depth":271,"text":8047,"children":8727},[8728,8729],{"id":8254,"depth":747,"text":8254},{"id":8328,"depth":747,"text":8328},{"id":8522,"depth":271,"text":8523},{"id":3030,"depth":271,"text":3030},{},"\u002Flinux-memo-2026-09-25",{"title":3099,"description":3104},"linux-memo-2026-09-25",[8737,8738,3095],"linux","运维","iSEC1Y6u5VxuDGnkptYIp294v_f2HDDTd_aIwN64dAg",{"id":8741,"title":8742,"author":8,"body":8743,"cover":3,"date":9234,"description":9235,"extension":284,"meta":9236,"navigation":286,"path":9237,"seo":9238,"stem":9239,"tags":9240,"__hash__":9244},"content\u002Fmarkdown-nunjucks-usage-2026-09-18.md","关于在 Markdown 中嵌入 Nunjucks 组件的说明",{"type":10,"value":8744,"toc":9225},[8745,8752,8756,8759,8762,8783,8786,8789,8793,8796,8798,8818,8820,8827,8830,8833,8837,8840,8842,8872,8874,8877,8882,8886,8889,8891,8910,8912,8915,8918,8924,8927,8929,8948,8950,8953,8958,8962,8973,8975,9015,9017,9130,9134,9145,9152,9154,9169,9171,9188,9195,9202,9215,9219,9222],[173,8746,8747,8748,8751],{},"本站的 ",[69,8749,8750],{},".md"," 文件由 Eleventy 的 Nunjucks 引擎在构建时编译。正文中的 Nunjucks 模板语法会被解析执行，组件以 macro 的形式调用。现将使用方法说明如下。",[13,8753,8755],{"id":8754},"一基本用法","一、基本用法",[173,8757,8758],{},"在 frontmatter 之后，正文中直接书写 Nunjucks 语法即可。使用组件前，需要先从组件文件导入对应的 macro：",[173,8760,8761],{},"{% raw %}",[784,8763,8767],{"className":8764,"code":8765,"language":8766,"meta":270,"style":270},"language-njk shiki shiki-themes monokai","{% from \"components\u002Fbutton.njk\" import button %}\n\n{{ button({ text: \"阅读全文\", href: \"\u002Fposts\u002Fhello\u002F\", type: \"primary\" }) }}\n","njk",[69,8768,8769,8774,8778],{"__ignoreMap":270},[792,8770,8771],{"class":794,"line":795},[792,8772,8773],{},"{% from \"components\u002Fbutton.njk\" import button %}\n",[792,8775,8776],{"class":794,"line":271},[792,8777,839],{"emptyLinePlaceholder":286},[792,8779,8780],{"class":794,"line":747},[792,8781,8782],{},"{{ button({ text: \"阅读全文\", href: \"\u002Fposts\u002Fhello\u002F\", type: \"primary\" }) }}\n",[173,8784,8785],{},"{% endraw %}",[173,8787,8788],{},"渲染结果是一个带样式的按钮链接。正文中的 Nunjucks 语法与 Markdown 可以混用，不会相互干扰。",[13,8790,8792],{"id":8791},"二条件渲染","二、条件渲染",[173,8794,8795],{},"Nunjucks 的 if 标签用于根据 frontmatter 或站点数据决定是否输出某段内容。",[173,8797,8761],{},[784,8799,8801],{"className":8764,"code":8800,"language":8766,"meta":270,"style":270},"{% if description %}\n\u003Cp>本文摘要：{{ description }}\u003C\u002Fp>\n{% endif %}\n",[69,8802,8803,8808,8813],{"__ignoreMap":270},[792,8804,8805],{"class":794,"line":795},[792,8806,8807],{},"{% if description %}\n",[792,8809,8810],{"class":794,"line":271},[792,8811,8812],{},"\u003Cp>本文摘要：{{ description }}\u003C\u002Fp>\n",[792,8814,8815],{"class":794,"line":747},[792,8816,8817],{},"{% endif %}\n",[173,8819,8785],{},[173,8821,8822,8823,8826],{},"实际效果：本页的 ",[69,8824,8825],{},"description"," 有值，所以下面的摘要会显示出来。",[173,8828,8829],{},"{% if description %}",[173,8831,8832],{},"本文摘要：{{ description }}",[13,8834,8836],{"id":8835},"三循环渲染","三、循环渲染",[173,8838,8839],{},"for 标签用于遍历数组，比如站点导航、文章标签。",[173,8841,8761],{},[784,8843,8845],{"className":8764,"code":8844,"language":8766,"meta":270,"style":270},"\u003Cul>\n{% for item in site.navigation %}\n  \u003Cli>\u003Ca href=\"{{ item.url }}\">{{ ui.nav[item.key] }}\u003C\u002Fa>\u003C\u002Fli>\n{% endfor %}\n\u003C\u002Ful>\n",[69,8846,8847,8852,8857,8862,8867],{"__ignoreMap":270},[792,8848,8849],{"class":794,"line":795},[792,8850,8851],{},"\u003Cul>\n",[792,8853,8854],{"class":794,"line":271},[792,8855,8856],{},"{% for item in site.navigation %}\n",[792,8858,8859],{"class":794,"line":747},[792,8860,8861],{},"  \u003Cli>\u003Ca href=\"{{ item.url }}\">{{ ui.nav[item.key] }}\u003C\u002Fa>\u003C\u002Fli>\n",[792,8863,8864],{"class":794,"line":836},[792,8865,8866],{},"{% endfor %}\n",[792,8868,8869],{"class":794,"line":842},[792,8870,8871],{},"\u003C\u002Ful>\n",[173,8873,8785],{},[173,8875,8876],{},"输出为：",[784,8878,8880],{"className":8879,"code":8844,"language":2668},[2666],[69,8881,8844],{"__ignoreMap":270},[13,8883,8885],{"id":8884},"四嵌入组件","四、嵌入组件",[173,8887,8888],{},"本站提供的组件均可在正文中直接调用。先导入，再调用：",[173,8890,8761],{},[784,8892,8894],{"className":8764,"code":8893,"language":8766,"meta":270,"style":270},"{% from \"components\u002Falert.njk\" import alert %}\n\n{{ alert({ type: \"info\", title: \"提示\", content: \"这是一条信息。\" }) }}\n",[69,8895,8896,8901,8905],{"__ignoreMap":270},[792,8897,8898],{"class":794,"line":795},[792,8899,8900],{},"{% from \"components\u002Falert.njk\" import alert %}\n",[792,8902,8903],{"class":794,"line":271},[792,8904,839],{"emptyLinePlaceholder":286},[792,8906,8907],{"class":794,"line":747},[792,8908,8909],{},"{{ alert({ type: \"info\", title: \"提示\", content: \"这是一条信息。\" }) }}\n",[173,8911,8785],{},[173,8913,8914],{},"实际渲染效果：",[173,8916,8917],{},"{% from \"components\u002Falert.njk\" import alert %}",[173,8919,8920],{},[8921,8922],"binding",{"value":8923},"alert({ type: \"info\", title: \"提示\", content: \"这是一条信息。\" })",[173,8925,8926],{},"标签组件同理：",[173,8928,8761],{},[784,8930,8932],{"className":8764,"code":8931,"language":8766,"meta":270,"style":270},"{% from \"components\u002Ftag.njk\" import tag %}\n\n{{ tag({ text: \"Eleventy\", href: \"\u002Ftags\u002Feleventy\u002F\", color: \"default\" }) }}\n",[69,8933,8934,8939,8943],{"__ignoreMap":270},[792,8935,8936],{"class":794,"line":795},[792,8937,8938],{},"{% from \"components\u002Ftag.njk\" import tag %}\n",[792,8940,8941],{"class":794,"line":271},[792,8942,839],{"emptyLinePlaceholder":286},[792,8944,8945],{"class":794,"line":747},[792,8946,8947],{},"{{ tag({ text: \"Eleventy\", href: \"\u002Ftags\u002Feleventy\u002F\", color: \"default\" }) }}\n",[173,8949,8785],{},[173,8951,8952],{},"{% from \"components\u002Ftag.njk\" import tag %}",[173,8954,8955],{},[8921,8956],{"value":8957},"tag({ text: \"Eleventy\", href: \"\u002Ftags\u002Feleventy\u002F\", color: \"default\" })",[13,8959,8961],{"id":8960},"五组件参数","五、组件参数",[173,8963,8964,8965,8968,8969,8972],{},"所有组件都以",[43,8966,8967],{},"字典","形式传参，可选的键取决于组件定义。以 ",[69,8970,8971],{},"button"," 为例：",[173,8974,8761],{},[784,8976,8978],{"className":8764,"code":8977,"language":8766,"meta":270,"style":270},"{{ button({\n  text: \"提交\",\n  type: \"primary\",\n  size: \"lg\",\n  block: true,\n  disabled: false\n}) }}\n",[69,8979,8980,8985,8990,8995,9000,9005,9010],{"__ignoreMap":270},[792,8981,8982],{"class":794,"line":795},[792,8983,8984],{},"{{ button({\n",[792,8986,8987],{"class":794,"line":271},[792,8988,8989],{},"  text: \"提交\",\n",[792,8991,8992],{"class":794,"line":747},[792,8993,8994],{},"  type: \"primary\",\n",[792,8996,8997],{"class":794,"line":836},[792,8998,8999],{},"  size: \"lg\",\n",[792,9001,9002],{"class":794,"line":842},[792,9003,9004],{},"  block: true,\n",[792,9006,9007],{"class":794,"line":848},[792,9008,9009],{},"  disabled: false\n",[792,9011,9012],{"class":794,"line":863},[792,9013,9014],{},"}) }}\n",[173,9016,8785],{},[18,9018,9019,9031],{},[21,9020,9021],{},[24,9022,9023,9026,9029],{},[27,9024,9025],{},"参数",[27,9027,9028],{},"类型",[27,9030,2685],{},[35,9032,9033,9045,9064,9086,9105,9118],{},[24,9034,9035,9039,9042],{},[40,9036,9037],{},[69,9038,2668],{},[40,9040,9041],{},"string",[40,9043,9044],{},"按钮文字",[24,9046,9047,9052,9054],{},[40,9048,9049],{},[69,9050,9051],{},"href",[40,9053,9041],{},[40,9055,9056,9057,9060,9061],{},"有值时渲染为 ",[69,9058,9059],{},"\u003Ca>","，否则为 ",[69,9062,9063],{},"\u003Cbutton>",[24,9065,9066,9070,9072],{},[40,9067,9068],{},[69,9069,2682],{},[40,9071,9041],{},[40,9073,9074,3008,9077,3008,9080,3008,9083],{},[69,9075,9076],{},"primary",[69,9078,9079],{},"secondary",[69,9081,9082],{},"success",[69,9084,9085],{},"danger",[24,9087,9088,9093,9095],{},[40,9089,9090],{},[69,9091,9092],{},"size",[40,9094,9041],{},[40,9096,9097,3008,9100,3008,9102],{},[69,9098,9099],{},"sm",[69,9101,284],{},[69,9103,9104],{},"lg",[24,9106,9107,9112,9115],{},[40,9108,9109],{},[69,9110,9111],{},"block",[40,9113,9114],{},"boolean",[40,9116,9117],{},"是否占满整行",[24,9119,9120,9125,9127],{},[40,9121,9122],{},[69,9123,9124],{},"disabled",[40,9126,9114],{},[40,9128,9129],{},"是否禁用",[13,9131,9133],{"id":9132},"六注意事项","六、注意事项",[173,9135,9136,9137,9140,9141,9144],{},"（一）",[43,9138,9139],{},"组件需要显式导入","。Nunjucks 的 macro 不像 Vue 组件那样自动注册，必须在文章里用 ",[69,9142,9143],{},"from ... import ..."," 后再调用。",[173,9146,9147,9148,9151],{},"（二）",[43,9149,9150],{},"字典里不能嵌套双花括号","。以下写法是错的——字典内部不能再写模板表达式，需要先 set 再引用：",[173,9153,8761],{},[784,9155,9157],{"className":8764,"code":9156,"language":8766,"meta":270,"style":270},"{% set href = \"\u002Ftags\u002F\" + (t | tagSlug) + \"\u002F\" %}\n{{ tag({ text: t, href: href }) }}\n",[69,9158,9159,9164],{"__ignoreMap":270},[792,9160,9161],{"class":794,"line":795},[792,9162,9163],{},"{% set href = \"\u002Ftags\u002F\" + (t | tagSlug) + \"\u002F\" %}\n",[792,9165,9166],{"class":794,"line":271},[792,9167,9168],{},"{{ tag({ text: t, href: href }) }}\n",[173,9170,8785],{},[173,9172,9173,9174,9177,9178,9181,9182,9184,9185,183],{},"（三）",[43,9175,9176],{},"Markdown 里的 shell 语法可能被误解析","。Nunjucks 会把花括号加井号当作注释开始标记，shell 脚本里取字符串长度的那种写法会触发 ",[69,9179,9180],{},"expected end of comment"," 错误。解决办法是用 ",[69,9183,8761],{}," 包裹那一行，或者改用等价的 shell 命令，例如 ",[69,9186,9187],{},"expr length \"$str\"",[173,9189,9190,9191,9194],{},"（四）",[43,9192,9193],{},"构建时编译","。正文中的 Nunjucks 在构建阶段执行，输出纯 HTML。若 macro 名或参数拼写错误，会在构建时报错，而不是静默忽略。",[173,9196,9197,9198,9201],{},"（五）",[43,9199,9200],{},"没有运行时状态","。本站是静态站点，正文里不存在 Vue 那样的响应式状态。需要交互（比如切换显示）时，要借助 jQuery 或原生 JS，且只在现代浏览器中执行，IE7 只保证静态内容的可读性。",[173,9203,9204,9205,9208,9209,9211,9212,183],{},"（六）",[43,9206,9207],{},"不要写 style 块","。文章内的样式用已有 CSS 类或内联 ",[69,9210,2724],{}," 属性，不推荐在 Markdown 里写 ",[69,9213,9214],{},"\u003Cstyle>",[13,9216,9218],{"id":9217},"七小结","七、小结",[173,9220,9221],{},"Markdown 与 Nunjucks 的融合让静态内容具备了组件化能力。文章可以引用全局数据、复用 UI 组件、按条件或循环渲染结构化内容，同时保持构建产物是纯静态 HTML，兼容到 IE7。这使得一批需要在多篇文章里重复出现的结构，可以被抽成组件统一维护。",[2724,9223,9224],{},"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);}",{"title":270,"searchDepth":271,"depth":271,"links":9226},[9227,9228,9229,9230,9231,9232,9233],{"id":8754,"depth":271,"text":8755},{"id":8791,"depth":271,"text":8792},{"id":8835,"depth":271,"text":8836},{"id":8884,"depth":271,"text":8885},{"id":8960,"depth":271,"text":8961},{"id":9132,"depth":271,"text":9133},{"id":9217,"depth":271,"text":9218},"2026-10-03","本站 Markdown 文件由 Nunjucks 编译，正文中可直接调用组件 macro、条件渲染与循环。",{},"\u002Fmarkdown-nunjucks-usage-2026-09-18",{"title":8742,"description":9235},"markdown-nunjucks-usage-2026-09-18",[9241,9242,9243],"Nunjucks","Markdown","Eleventy","MdUbcFEW1qf-NzpeyZmkI2XJI4m6X-6wIMK7c9vGCSs",{"id":9246,"title":9247,"author":8,"body":9248,"cover":3,"date":9773,"description":270,"extension":284,"meta":9774,"navigation":286,"path":9775,"seo":9776,"stem":9777,"tags":9778,"__hash__":9781},"content\u002Fmarkdown-vue-usage-2026-09-18.md","关于在 Markdown 中嵌入 Vue 组件的说明",{"type":10,"value":9249,"toc":9769},[9250,9255,9259,9272,9274,9280,9393,9396,9766],[189,9251,9252],{},[173,9253,9254],{},"这篇文章已经过时，此描述的内容与现有架构不相同",[9256,9257,9258],"script",{"setup":270},"\nimport { ref } from 'vue'\nimport GovPanel from '@\u002Findex\u002Fcomponents\u002Fcommon\u002FGovPanel.vue'\nimport GovButton from '@\u002Findex\u002Fcomponents\u002Fcommon\u002FGovButton.vue'\nimport { showAlert } from '@\u002Findex\u002Fcomponents\u002Fcommon\u002Fdialog'\n\nconst count = ref(0)\nconst showTip = ref(true)\n\nfunction increment() {\n    count.value += 1\n}\n\nfunction handleAlert() {\n    showAlert('来自文章内的事件')\n}\n",[173,9260,8747,9261,9263,9264,9267,9268,9271],{},[69,9262,8750],{}," 文件由 ",[69,9265,9266],{},"unplugin-vue-markdown"," 在构建时编译为 Vue 单文件组件。正文中的 Vue 组件标签会被当作模板的一部分解析，",[69,9269,9270],{},"\u003Cscript setup>"," 中的逻辑对正文完全可见。现将使用方法说明如下。",[13,9273,8755],{"id":8754},[173,9275,9276,9277,9279],{},"在 frontmatter 之后、正文之前书写 ",[69,9278,9270],{},"，导入所需组件与响应式 API 即可。",[784,9281,9285],{"className":9282,"code":9283,"language":9284,"meta":270,"style":270},"language-vue shiki shiki-themes monokai","\u003Cscript setup>\nimport { ref } from \"vue\";\nimport GovButton from \"@\u002Findex\u002Fcomponents\u002Fcommon\u002FGovButton.vue\";\n\nconst count = ref(0);\n\u003C\u002Fscript>\n\n正文中可以像这样使用：\n\u003CGovButton variant=\"primary\">按钮\u003C\u002FGovButton>\n","vue",[69,9286,9287,9298,9315,9329,9333,9353,9362,9366,9371],{"__ignoreMap":270},[792,9288,9289,9291,9293,9296],{"class":794,"line":795},[792,9290,1186],{"class":1043},[792,9292,9256],{"class":1036},[792,9294,9295],{"class":804}," setup",[792,9297,1748],{"class":1043},[792,9299,9300,9303,9306,9309,9312],{"class":794,"line":271},[792,9301,9302],{"class":1036},"import",[792,9304,9305],{"class":1043}," { ref } ",[792,9307,9308],{"class":1036},"from",[792,9310,9311],{"class":808}," \"vue\"",[792,9313,9314],{"class":1043},";\n",[792,9316,9317,9319,9322,9324,9327],{"class":794,"line":747},[792,9318,9302],{"class":1036},[792,9320,9321],{"class":1043}," GovButton ",[792,9323,9308],{"class":1036},[792,9325,9326],{"class":808}," \"@\u002Findex\u002Fcomponents\u002Fcommon\u002FGovButton.vue\"",[792,9328,9314],{"class":1043},[792,9330,9331],{"class":794,"line":836},[792,9332,839],{"emptyLinePlaceholder":286},[792,9334,9335,9338,9341,9343,9346,9348,9350],{"class":794,"line":842},[792,9336,9337],{"class":3785},"const",[792,9339,9340],{"class":1043}," count ",[792,9342,7599],{"class":1036},[792,9344,9345],{"class":804}," ref",[792,9347,8312],{"class":1043},[792,9349,1866],{"class":812},[792,9351,9352],{"class":1043},");\n",[792,9354,9355,9358,9360],{"class":794,"line":848},[792,9356,9357],{"class":1043},"\u003C\u002F",[792,9359,9256],{"class":1036},[792,9361,1748],{"class":1043},[792,9363,9364],{"class":794,"line":863},[792,9365,839],{"emptyLinePlaceholder":286},[792,9367,9368],{"class":794,"line":868},[792,9369,9370],{"class":1043},"正文中可以像这样使用：\n",[792,9372,9373,9375,9378,9381,9383,9386,9389,9391],{"class":794,"line":874},[792,9374,1186],{"class":1043},[792,9376,9377],{"class":1036},"GovButton",[792,9379,9380],{"class":804}," variant",[792,9382,7599],{"class":1043},[792,9384,9385],{"class":808},"\"primary\"",[792,9387,9388],{"class":1043},">按钮\u003C\u002F",[792,9390,9377],{"class":1036},[792,9392,1748],{"class":1043},[173,9394,9395],{},"组件标签与 Markdown 语法可以混用。以下为实际渲染效果：",[9397,9398,9400,9401,9400,9408,9417,9418,9420,9400,9422,9426,9437,9441,9452],"gov-panel",{"title":9399},"示例一：响应式计数器","\n  ",[173,9402,9403,9404],{},"当前计数：",[9405,9406,9407],"b",{},"{{ count }}",[9409,9410,9411,9412,9416],"govbutton",{"variant":9076},"\n    ",[9413,9414],"myicon",{"icon":9415},"plus"," 增加\n  "," ",[2570,9419],{},[2570,9421],{},[9409,9423,9425],{"variant":9424},"default","重置",[9427,9428,9432,9433,9436],"div",{"className":9429},[9430,9431],"md-alert","md-alert--tip","\n  文章内的 ",[69,9434,9435],{},"ref"," 是独立的响应式状态，作用域限于当前文章的组件实例，不会与其他文章或站点状态相互影响。\n",[13,9438,9440],{"id":9439},"二条件渲染与列表渲染","二、条件渲染与列表渲染",[173,9442,9443,9444,9447,9448,9451],{},"Vue 的 ",[69,9445,9446],{},"v-if","、",[69,9449,9450],{},"v-for"," 等指令在正文中同样有效。",[9397,9453,9400,9455,9400,9461,9400,9469,9476,9484,9491,9495,9498],{"title":9454},"示例二：条件渲染",[9409,9456,9411,9457,9460],{"variant":9076},[9413,9458],{"icon":9459},"eye"," 切换显示\n  ",[173,9462,9465,9466,9468],{"v-if":9463,"style":9464},"showTip","margin-top: 12px;","\n    这段文字由 ",[69,9467,9446],{}," 控制，当前可见。\n  ",[173,9470,9465,9472,9475],{"v-else":270,"style":9471},"margin-top: 12px; color: #999;",[69,9473,9474],{},"v-else"," 控制，当前显示的是它。\n  ",[173,9477,9478,9479,9481,9482,3182],{},"下面的列表由 ",[69,9480,9450],{}," 渲染，数据来自文章内的 ",[69,9483,9270],{},[77,9485,9400,9486],{},[80,9487,9490],{"v-for":9488,":key":9489},"i in 3","i","第 {{ i }} 项，共 3 项",[13,9492,9494],{"id":9493},"三嵌入组件","三、嵌入组件",[173,9496,9497],{},"本站提供的政务组件均可在正文中直接使用。",[9397,9499,9400,9502,9400,9511,9523],{"title":9500,"tone":9501},"示例三：组件组合","red",[173,9503,9504,9505,9507,9508,3182],{},"以下按钮均为 ",[69,9506,9377],{}," 组件的不同 ",[69,9509,9510],{},"variant",[9427,9512,9411,9514,9411,9517,9411,9520,9400],{"style":9513},"display: flex; gap: 12px; flex-wrap: wrap; margin-top: 12px;",[9409,9515,9516],{"variant":9076},"主要操作",[9409,9518,9519],{"variant":9085},"危险操作",[9409,9521,9522],{"variant":9424},"次要操作",[9397,9524,9400,9526,9544,9548,9555],{"title":9525},"示例四：图标使用",[173,9527,9411,9528,9531,9532,9535,9536,9539,9540,9543],{},[9413,9529],{"icon":9530},"download"," 下载\n    ",[9413,9533],{"icon":9534},"web"," 官网\n    ",[9413,9537],{"icon":9538},"code-tags"," 源码\n    ",[9413,9541],{"icon":9542},"file-document-outline"," 文档\n  ",[13,9545,9547],{"id":9546},"四事件绑定","四、事件绑定",[173,9549,9550,9551,9554],{},"组件上的 ",[69,9552,9553],{},"@click"," 等事件可以直接绑定到文章内的函数。",[9397,9556,9400,9558,9561,9564,9660,9664,9675,9700,9719,9724,9740,9752,9756,9759],{"title":9557},"示例五：事件处理",[9409,9559,9560],{"variant":9076},"\n    点击弹出提示\n  ",[173,9562,9563],{},"实际写法如下：",[784,9565,9567],{"className":9282,"code":9566,"language":9284,"meta":270,"style":270},"\u003Cscript setup>\nfunction handleAlert() {\n  alert(\"来自文章内的事件\");\n}\n\u003C\u002Fscript>\n\n\u003CGovButton variant=\"primary\" @click=\"handleAlert\">\n  点击弹出提示\n\u003C\u002FGovButton>\n",[69,9568,9569,9579,9590,9602,9606,9614,9618,9647,9652],{"__ignoreMap":270},[792,9570,9571,9573,9575,9577],{"class":794,"line":795},[792,9572,1186],{"class":1043},[792,9574,9256],{"class":1036},[792,9576,9295],{"class":804},[792,9578,1748],{"class":1043},[792,9580,9581,9584,9587],{"class":794,"line":271},[792,9582,9583],{"class":3785},"function",[792,9585,9586],{"class":804}," handleAlert",[792,9588,9589],{"class":1043},"() {\n",[792,9591,9592,9595,9597,9600],{"class":794,"line":747},[792,9593,9594],{"class":804},"  alert",[792,9596,8312],{"class":1043},[792,9598,9599],{"class":808},"\"来自文章内的事件\"",[792,9601,9352],{"class":1043},[792,9603,9604],{"class":794,"line":836},[792,9605,3827],{"class":1043},[792,9607,9608,9610,9612],{"class":794,"line":842},[792,9609,9357],{"class":1043},[792,9611,9256],{"class":1036},[792,9613,1748],{"class":1043},[792,9615,9616],{"class":794,"line":848},[792,9617,839],{"emptyLinePlaceholder":286},[792,9619,9620,9622,9624,9626,9628,9630,9633,9636,9638,9640,9643,9645],{"class":794,"line":863},[792,9621,1186],{"class":1043},[792,9623,9377],{"class":1036},[792,9625,9380],{"class":804},[792,9627,7599],{"class":1043},[792,9629,9385],{"class":808},[792,9631,9632],{"class":1043}," @",[792,9634,9635],{"class":804},"click",[792,9637,7599],{"class":1043},[792,9639,7685],{"class":1043},[792,9641,9642],{"class":1043},"handleAlert",[792,9644,7685],{"class":1043},[792,9646,1748],{"class":1043},[792,9648,9649],{"class":794,"line":868},[792,9650,9651],{"class":1043},"  点击弹出提示\n",[792,9653,9654,9656,9658],{"class":794,"line":874},[792,9655,9357],{"class":1043},[792,9657,9377],{"class":1036},[792,9659,1748],{"class":1043},[13,9661,9663],{"id":9662},"五注意事项","五、注意事项",[173,9665,9136,9666,9668,9669,9671,9672,9674],{},[43,9667,9139],{},"。方案 B 下文章是独立的 Vue 组件，组件不会自动注册。必须在 ",[69,9670,9270],{}," 中 ",[69,9673,9302],{},"，不能依赖全局注册。",[173,9676,9147,9677,9680,9681,9684,9685,9688,9689,9692,9693,9447,9696,9699],{},[43,9678,9679],{},"自定义组件请显式闭合","。markdown-it 在处理块级 HTML 时，自闭合的自定义组件标签（",[69,9682,9683],{},"\u003CMyIcon ... \u002F>","）容易丢失自闭合标志，导致 Vue 编译器报 ",[69,9686,9687],{},"Element is missing end tag","。建议所有自定义组件都写成 ",[69,9690,9691],{},"\u003CMyIcon ...>\u003C\u002FMyIcon>","，HTML void 元素（",[69,9694,9695],{},"\u003Cbr>",[69,9697,9698],{},"\u003Cimg>","）不受影响。",[173,9701,9173,9702,9705,9706,3008,9709,3008,9712,9715,9716,183],{},[43,9703,9704],{},"旧版容器语法不再生效","。本站早期的 ",[69,9707,9708],{},"::: tip",[69,9710,9711],{},"::: warning",[69,9713,9714],{},"::: tabs"," 等自定义容器已在迁移中移除，改用原生 HTML 类表达，例如 ",[69,9717,9718],{},"\u003Cdiv class=\"md-alert md-alert--tip\">…\u003C\u002Fdiv>",[173,9720,9190,9721,9723],{},[43,9722,9193],{},"。正文中的组件在构建阶段编译为 render function，而非运行时解析。若组件名拼写错误，会在构建时或开发时控制台提示，而不会静默忽略。",[173,9725,9197,9726,9729,9730,9732,9733,9736,9737,9739],{},[43,9727,9728],{},"样式作用域","。文章内联写的 ",[69,9731,2724],{}," 属性作用于当前元素，Markdown 渲染出的标签样式由 ",[69,9734,9735],{},"markdown.css"," 统一控制。若需要局部样式，建议在文章内使用内联 ",[69,9738,2724],{},"，或封装为独立组件。",[173,9741,9204,9742,9748,9749,9751],{},[43,9743,9744,9745,9747],{},"不要写 ",[69,9746,9214],{}," 块","。本站暂不支持在 Markdown 中书写 ",[69,9750,9214],{},"，会与 SFC 编译流程冲突。需要样式时优先使用已有 CSS 变量或内联样式。",[13,9753,9755],{"id":9754},"六小结","六、小结",[173,9757,9758],{},"Markdown 与 Vue 的融合让静态内容具备了组件化的能力。文章不再只是纯文本，而是可以拥有响应式状态、可复用组件与事件交互的完整页面单元。这使得一些原本需要额外页面承载的功能，可以直接在文章内表达。",[173,9760,9761,9762,183],{},"如需查看本站组件清单，可参阅",[158,9763,9765],{"href":9764},"\u002Fsite-design-compliance-2026-09-16","《关于本站对照国办发〔2017〕47号文开展设计规范调整的说明》",[2724,9767,9768],{},"html pre.shiki code .sCdxs, html code.shiki .sCdxs{--shiki-default:#F8F8F2}html pre.shiki code .s8I7P, html code.shiki .s8I7P{--shiki-default:#F92672}html pre.shiki code .sHkqI, html code.shiki .sHkqI{--shiki-default:#A6E22E}html pre.shiki code .s_Ekj, html code.shiki .s_Ekj{--shiki-default:#E6DB74}html pre.shiki code .sOx1s, html code.shiki .sOx1s{--shiki-default:#66D9EF;--shiki-default-font-style:italic}html pre.shiki code .s7s5_, html code.shiki .s7s5_{--shiki-default:#AE81FF}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);}",{"title":270,"searchDepth":271,"depth":271,"links":9770},[9771,9772],{"id":8754,"depth":271,"text":8755},{"id":9439,"depth":271,"text":9440},"2026-09-18",{},"\u002Fmarkdown-vue-usage-2026-09-18",{"title":9247,"description":270},"markdown-vue-usage-2026-09-18",[9779,9242,9780],"Vue","内容层","pLUYvePhQ2UO_ExUlCY-OCrjlRk013xQpue_6Xm0wzs",{"id":9783,"title":9784,"author":8,"body":9785,"cover":3,"date":3088,"description":9789,"extension":284,"meta":12654,"navigation":286,"path":12655,"seo":12656,"stem":12657,"tags":12658,"__hash__":12660},"content\u002Fnode-package-managers-memo-2026-09-25.md","Node包管理器备忘录",{"type":10,"value":9786,"toc":12592},[9787,9790,9792,9796,9899,9903,10026,10030,10091,10103,10107,10153,10157,10163,10193,10199,10203,10206,10234,10244,10248,10268,10271,10303,10307,10385,10389,10400,10404,10409,10434,10445,10450,10466,10470,10500,10504,10534,10538,10557,10564,10568,10607,10611,10628,10632,10691,10695,11005,11009,11061,11067,11070,11149,11153,11185,11198,11202,11275,11279,11282,11360,11363,11437,11441,11445,11450,11507,11511,11555,11559,11604,11607,11675,11679,11834,11838,11841,11880,11921,11924,11961,11966,11970,11973,11993,11996,12114,12117,12144,12203,12207,12232,12236,12244,12247,12269,12277,12283,12329,12337,12365,12369,12372,12397,12400,12404,12410,12422,12426,12445,12449,12483,12491,12497,12530,12534,12557,12559,12561,12589],[173,9788,9789],{},"日常高频命令 + 国内换源方案。命令对照无差异时只写 npm。",[13,9791,3108],{"id":3107},[571,9793,9795],{"id":9794},"_11-一键切换nrm","1.1 一键切换：nrm",[784,9797,9799],{"className":786,"code":9798,"language":788,"meta":270,"style":270},"npm install -g nrm\n\nnrm ls                            # 列出所有源\nnrm use taobao                    # 切到淘宝源\nnrm use npm                       # 切回官方\nnrm current                       # 查看当前\nnrm test                          # 测速\nnrm add company http:\u002F\u002Fnpm.company.com\u002F    # 加私有源\nnrm del company\n",[69,9800,9801,9814,9818,9829,9842,9854,9864,9874,9889],{"__ignoreMap":270},[792,9802,9803,9806,9808,9811],{"class":794,"line":795},[792,9804,9805],{"class":804},"npm",[792,9807,3684],{"class":808},[792,9809,9810],{"class":812}," -g",[792,9812,9813],{"class":808}," nrm\n",[792,9815,9816],{"class":794,"line":271},[792,9817,839],{"emptyLinePlaceholder":286},[792,9819,9820,9823,9826],{"class":794,"line":747},[792,9821,9822],{"class":804},"nrm",[792,9824,9825],{"class":808}," ls",[792,9827,9828],{"class":798},"                            # 列出所有源\n",[792,9830,9831,9833,9836,9839],{"class":794,"line":836},[792,9832,9822],{"class":804},[792,9834,9835],{"class":808}," use",[792,9837,9838],{"class":808}," taobao",[792,9840,9841],{"class":798},"                    # 切到淘宝源\n",[792,9843,9844,9846,9848,9851],{"class":794,"line":842},[792,9845,9822],{"class":804},[792,9847,9835],{"class":808},[792,9849,9850],{"class":808}," npm",[792,9852,9853],{"class":798},"                       # 切回官方\n",[792,9855,9856,9858,9861],{"class":794,"line":848},[792,9857,9822],{"class":804},[792,9859,9860],{"class":808}," current",[792,9862,9863],{"class":798},"                       # 查看当前\n",[792,9865,9866,9868,9871],{"class":794,"line":863},[792,9867,9822],{"class":804},[792,9869,9870],{"class":808}," test",[792,9872,9873],{"class":798},"                          # 测速\n",[792,9875,9876,9878,9880,9883,9886],{"class":794,"line":868},[792,9877,9822],{"class":804},[792,9879,1033],{"class":808},[792,9881,9882],{"class":808}," company",[792,9884,9885],{"class":808}," http:\u002F\u002Fnpm.company.com\u002F",[792,9887,9888],{"class":798},"    # 加私有源\n",[792,9890,9891,9893,9896],{"class":794,"line":874},[792,9892,9822],{"class":804},[792,9894,9895],{"class":808}," del",[792,9897,9898],{"class":808}," company\n",[571,9900,9902],{"id":9901},"_12-手动切换","1.2 手动切换",[784,9904,9906],{"className":786,"code":9905,"language":788,"meta":270,"style":270},"# npm\nnpm config set registry https:\u002F\u002Fregistry.npmmirror.com\nnpm config get registry\nnpm config delete registry        # 恢复默认\n\n# yarn v1\nyarn config set registry https:\u002F\u002Fregistry.npmmirror.com\nyarn config get registry\nyarn config delete registry\n\n# pnpm\npnpm config set registry https:\u002F\u002Fregistry.npmmirror.com\npnpm config get registry\n",[69,9907,9908,9913,9927,9939,9952,9956,9961,9974,9984,9994,9998,10003,10016],{"__ignoreMap":270},[792,9909,9910],{"class":794,"line":795},[792,9911,9912],{"class":798},"# npm\n",[792,9914,9915,9917,9919,9921,9924],{"class":794,"line":271},[792,9916,9805],{"class":804},[792,9918,809],{"class":808},[792,9920,3624],{"class":808},[792,9922,9923],{"class":808}," registry",[792,9925,9926],{"class":808}," https:\u002F\u002Fregistry.npmmirror.com\n",[792,9928,9929,9931,9933,9936],{"class":794,"line":747},[792,9930,9805],{"class":804},[792,9932,809],{"class":808},[792,9934,9935],{"class":808}," get",[792,9937,9938],{"class":808}," registry\n",[792,9940,9941,9943,9945,9947,9949],{"class":794,"line":836},[792,9942,9805],{"class":804},[792,9944,809],{"class":808},[792,9946,5735],{"class":808},[792,9948,9923],{"class":808},[792,9950,9951],{"class":798},"        # 恢复默认\n",[792,9953,9954],{"class":794,"line":842},[792,9955,839],{"emptyLinePlaceholder":286},[792,9957,9958],{"class":794,"line":848},[792,9959,9960],{"class":798},"# yarn v1\n",[792,9962,9963,9966,9968,9970,9972],{"class":794,"line":863},[792,9964,9965],{"class":804},"yarn",[792,9967,809],{"class":808},[792,9969,3624],{"class":808},[792,9971,9923],{"class":808},[792,9973,9926],{"class":808},[792,9975,9976,9978,9980,9982],{"class":794,"line":868},[792,9977,9965],{"class":804},[792,9979,809],{"class":808},[792,9981,9935],{"class":808},[792,9983,9938],{"class":808},[792,9985,9986,9988,9990,9992],{"class":794,"line":874},[792,9987,9965],{"class":804},[792,9989,809],{"class":808},[792,9991,5735],{"class":808},[792,9993,9938],{"class":808},[792,9995,9996],{"class":794,"line":889},[792,9997,839],{"emptyLinePlaceholder":286},[792,9999,10000],{"class":794,"line":894},[792,10001,10002],{"class":798},"# pnpm\n",[792,10004,10005,10008,10010,10012,10014],{"class":794,"line":900},[792,10006,10007],{"class":804},"pnpm",[792,10009,809],{"class":808},[792,10011,3624],{"class":808},[792,10013,9923],{"class":808},[792,10015,9926],{"class":808},[792,10017,10018,10020,10022,10024],{"class":794,"line":915},[792,10019,10007],{"class":804},[792,10021,809],{"class":808},[792,10023,9935],{"class":808},[792,10025,9938],{"class":808},[571,10027,10029],{"id":10028},"_13-常用镜像源","1.3 常用镜像源",[18,10031,10032,10040],{},[21,10033,10034],{},[24,10035,10036,10038],{},[27,10037,3228],{},[27,10039,3231],{},[35,10041,10042,10052,10062,10072,10081],{},[24,10043,10044,10047],{},[40,10045,10046],{},"官方",[40,10048,10049],{},[69,10050,10051],{},"https:\u002F\u002Fregistry.npmjs.org",[24,10053,10054,10057],{},[40,10055,10056],{},"淘宝 \u002F npmmirror（推荐）",[40,10058,10059],{},[69,10060,10061],{},"https:\u002F\u002Fregistry.npmmirror.com",[24,10063,10064,10067],{},[40,10065,10066],{},"腾讯云",[40,10068,10069],{},[69,10070,10071],{},"https:\u002F\u002Fmirrors.cloud.tencent.com\u002Fnpm\u002F",[24,10073,10074,10076],{},[40,10075,3268],{},[40,10077,10078],{},[69,10079,10080],{},"https:\u002F\u002Fmirrors.huaweicloud.com\u002Frepository\u002Fnpm\u002F",[24,10082,10083,10086],{},[40,10084,10085],{},"cnpmjs",[40,10087,10088],{},[69,10089,10090],{},"https:\u002F\u002Fregistry.cnpmjs.org",[189,10092,10093],{},[173,10094,10095,10096,10099,10100,183],{},"淘宝源域名 ",[69,10097,10098],{},"registry.npm.taobao.org"," 已废弃，新域名为 ",[69,10101,10102],{},"registry.npmmirror.com",[571,10104,10106],{"id":10105},"_14-一次性使用不改配置","1.4 一次性使用（不改配置）",[784,10108,10110],{"className":786,"code":10109,"language":788,"meta":270,"style":270},"npm install --registry=https:\u002F\u002Fregistry.npmmirror.com\nyarn add \u003Cpkg> --registry=https:\u002F\u002Fregistry.npmmirror.com\npnpm add \u003Cpkg> --registry=https:\u002F\u002Fregistry.npmmirror.com\n",[69,10111,10112,10121,10137],{"__ignoreMap":270},[792,10113,10114,10116,10118],{"class":794,"line":795},[792,10115,9805],{"class":804},[792,10117,3684],{"class":808},[792,10119,10120],{"class":812}," --registry=https:\u002F\u002Fregistry.npmmirror.com\n",[792,10122,10123,10125,10127,10129,10131,10133,10135],{"class":794,"line":271},[792,10124,9965],{"class":804},[792,10126,1033],{"class":808},[792,10128,1037],{"class":1036},[792,10130,3689],{"class":808},[792,10132,3692],{"class":1043},[792,10134,1047],{"class":1036},[792,10136,10120],{"class":812},[792,10138,10139,10141,10143,10145,10147,10149,10151],{"class":794,"line":747},[792,10140,10007],{"class":804},[792,10142,1033],{"class":808},[792,10144,1037],{"class":1036},[792,10146,3689],{"class":808},[792,10148,3692],{"class":1043},[792,10150,1047],{"class":1036},[792,10152,10120],{"class":812},[571,10154,10156],{"id":10155},"_15-项目级-npmrc","1.5 项目级 .npmrc",[173,10158,10159,10162],{},[43,10160,10161],{},"只在当前项目生效","，适合团队统一配置。放项目根目录：",[784,10164,10166],{"className":6595,"code":10165,"language":6597,"meta":270,"style":270},"# .npmrc\nregistry=https:\u002F\u002Fregistry.npmmirror.com\nstrict-ssl=true\nsave-exact=true\nengine-strict=true\n",[69,10167,10168,10173,10178,10183,10188],{"__ignoreMap":270},[792,10169,10170],{"class":794,"line":795},[792,10171,10172],{},"# .npmrc\n",[792,10174,10175],{"class":794,"line":271},[792,10176,10177],{},"registry=https:\u002F\u002Fregistry.npmmirror.com\n",[792,10179,10180],{"class":794,"line":747},[792,10181,10182],{},"strict-ssl=true\n",[792,10184,10185],{"class":794,"line":836},[792,10186,10187],{},"save-exact=true\n",[792,10189,10190],{"class":794,"line":842},[792,10191,10192],{},"engine-strict=true\n",[173,10194,10195,10198],{},[43,10196,10197],{},"提交到 Git","，让所有成员和 CI 用同一套源。",[571,10200,10202],{"id":10201},"_16-私有源-公共源混用scoped-registry","1.6 私有源 + 公共源混用（scoped registry）",[173,10204,10205],{},"公司包放私有源，公共包走镜像：",[784,10207,10209],{"className":6595,"code":10208,"language":6597,"meta":270,"style":270},"# .npmrc\nregistry=https:\u002F\u002Fregistry.npmmirror.com\n@company:registry=https:\u002F\u002Fnpm.company.com\u002F\n\u002F\u002Fnpm.company.com\u002F:_authToken=${NPM_TOKEN}\n\u002F\u002Fregistry.npmmirror.com\u002F:always-auth=false\n",[69,10210,10211,10215,10219,10224,10229],{"__ignoreMap":270},[792,10212,10213],{"class":794,"line":795},[792,10214,10172],{},[792,10216,10217],{"class":794,"line":271},[792,10218,10177],{},[792,10220,10221],{"class":794,"line":747},[792,10222,10223],{},"@company:registry=https:\u002F\u002Fnpm.company.com\u002F\n",[792,10225,10226],{"class":794,"line":836},[792,10227,10228],{},"\u002F\u002Fnpm.company.com\u002F:_authToken=${NPM_TOKEN}\n",[792,10230,10231],{"class":794,"line":842},[792,10232,10233],{},"\u002F\u002Fregistry.npmmirror.com\u002F:always-auth=false\n",[173,10235,10236,10239,10240,10243],{},[69,10237,10238],{},"@company"," 开头的包（如 ",[69,10241,10242],{},"@company\u002Fui","）走私有源，其余走淘宝源。",[571,10245,10247],{"id":10246},"_17-认证-token-配置","1.7 认证 Token 配置",[784,10249,10251],{"className":6595,"code":10250,"language":6597,"meta":270,"style":270},"# ~\u002F.npmrc\n\u002F\u002Fregistry.npmjs.org\u002F:_authToken=npm_xxxxxxxxxxxx\n\u002F\u002Fnpm.pkg.github.com\u002F:_authToken=ghp_xxxxxxxxxxxx\n",[69,10252,10253,10258,10263],{"__ignoreMap":270},[792,10254,10255],{"class":794,"line":795},[792,10256,10257],{},"# ~\u002F.npmrc\n",[792,10259,10260],{"class":794,"line":271},[792,10261,10262],{},"\u002F\u002Fregistry.npmjs.org\u002F:_authToken=npm_xxxxxxxxxxxx\n",[792,10264,10265],{"class":794,"line":747},[792,10266,10267],{},"\u002F\u002Fnpm.pkg.github.com\u002F:_authToken=ghp_xxxxxxxxxxxx\n",[173,10269,10270],{},"或用环境变量（推荐 CI 使用）：",[784,10272,10274],{"className":786,"code":10273,"language":788,"meta":270,"style":270},"export NPM_TOKEN=xxxxx\n# .npmrc 里写\n\u002F\u002Fregistry.npmjs.org\u002F:_authToken=${NPM_TOKEN}\n",[69,10275,10276,10288,10293],{"__ignoreMap":270},[792,10277,10278,10280,10283,10285],{"class":794,"line":795},[792,10279,7593],{"class":1036},[792,10281,10282],{"class":1043}," NPM_TOKEN",[792,10284,7599],{"class":1036},[792,10286,10287],{"class":1043},"xxxxx\n",[792,10289,10290],{"class":794,"line":271},[792,10291,10292],{"class":798},"# .npmrc 里写\n",[792,10294,10295,10298,10300],{"class":794,"line":747},[792,10296,10297],{"class":804},"\u002F\u002Fregistry.npmjs.org\u002F:_authToken",[792,10299,7599],{"class":808},[792,10301,10302],{"class":1043},"${NPM_TOKEN}\n",[571,10304,10306],{"id":10305},"_18-换源失败的排查","1.8 换源失败的排查",[784,10308,10310],{"className":786,"code":10309,"language":788,"meta":270,"style":270},"# 1. 确认当前源\nnpm config get registry\n\n# 2. 直接 curl 试\ncurl -I https:\u002F\u002Fregistry.npmmirror.com\u002Fvue\n\n# 3. 清除 npm 缓存\nnpm cache clean --force\n\n# 4. 检查是否有多个 .npmrc 冲突\nnpm config list --show-origin\n",[69,10311,10312,10317,10327,10331,10336,10345,10349,10354,10366,10370,10375],{"__ignoreMap":270},[792,10313,10314],{"class":794,"line":795},[792,10315,10316],{"class":798},"# 1. 确认当前源\n",[792,10318,10319,10321,10323,10325],{"class":794,"line":271},[792,10320,9805],{"class":804},[792,10322,809],{"class":808},[792,10324,9935],{"class":808},[792,10326,9938],{"class":808},[792,10328,10329],{"class":794,"line":747},[792,10330,839],{"emptyLinePlaceholder":286},[792,10332,10333],{"class":794,"line":836},[792,10334,10335],{"class":798},"# 2. 直接 curl 试\n",[792,10337,10338,10340,10342],{"class":794,"line":842},[792,10339,5494],{"class":804},[792,10341,5497],{"class":812},[792,10343,10344],{"class":808}," https:\u002F\u002Fregistry.npmmirror.com\u002Fvue\n",[792,10346,10347],{"class":794,"line":848},[792,10348,839],{"emptyLinePlaceholder":286},[792,10350,10351],{"class":794,"line":863},[792,10352,10353],{"class":798},"# 3. 清除 npm 缓存\n",[792,10355,10356,10358,10361,10363],{"class":794,"line":868},[792,10357,9805],{"class":804},[792,10359,10360],{"class":808}," cache",[792,10362,3377],{"class":808},[792,10364,10365],{"class":812}," --force\n",[792,10367,10368],{"class":794,"line":874},[792,10369,839],{"emptyLinePlaceholder":286},[792,10371,10372],{"class":794,"line":889},[792,10373,10374],{"class":798},"# 4. 检查是否有多个 .npmrc 冲突\n",[792,10376,10377,10379,10381,10383],{"class":794,"line":894},[792,10378,9805],{"class":804},[792,10380,809],{"class":808},[792,10382,1836],{"class":808},[792,10384,1007],{"class":812},[13,10386,10388],{"id":10387},"二其他-binary-镜像换源只改-npm-包不改-binary","二、其他 binary 镜像（换源只改 npm 包，不改 binary）",[173,10390,10391,10392,10395,10396,10399],{},"很多包在 ",[69,10393,10394],{},"postinstall"," 阶段会下载",[43,10397,10398],{},"非 npm 的二进制","，换 registry 没用。这些要单独配：",[571,10401,10403],{"id":10402},"_21-node-版本管理器镜像","2.1 Node 版本管理器镜像",[173,10405,10406,3182],{},[43,10407,10408],{},"nvm",[784,10410,10412],{"className":786,"code":10411,"language":788,"meta":270,"style":270},"export NVM_NODEJS_ORG_MIRROR=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode\nnvm install 20\n",[69,10413,10414,10426],{"__ignoreMap":270},[792,10415,10416,10418,10421,10423],{"class":794,"line":795},[792,10417,7593],{"class":1036},[792,10419,10420],{"class":1043}," NVM_NODEJS_ORG_MIRROR",[792,10422,7599],{"class":1036},[792,10424,10425],{"class":1043},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode\n",[792,10427,10428,10430,10432],{"class":794,"line":271},[792,10429,10408],{"class":804},[792,10431,3684],{"class":808},[792,10433,4441],{"class":812},[173,10435,10436,10437,10440,10441,10444],{},"写入 ",[69,10438,10439],{},"~\u002F.bashrc"," 或 ",[69,10442,10443],{},"~\u002F.zshrc"," 永久生效。",[173,10446,10447,3182],{},[43,10448,10449],{},"fnm",[784,10451,10453],{"className":786,"code":10452,"language":788,"meta":270,"style":270},"export FNM_NODE_DIST_MIRROR=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode\n",[69,10454,10455],{"__ignoreMap":270},[792,10456,10457,10459,10462,10464],{"class":794,"line":795},[792,10458,7593],{"class":1036},[792,10460,10461],{"class":1043}," FNM_NODE_DIST_MIRROR",[792,10463,7599],{"class":1036},[792,10465,10425],{"class":1043},[571,10467,10469],{"id":10468},"_22-electron","2.2 Electron",[784,10471,10473],{"className":786,"code":10472,"language":788,"meta":270,"style":270},"# 项目 .npmrc\nelectron_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron\u002F\nelectron_builder_binaries_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron-builder-binaries\u002F\n",[69,10474,10475,10480,10490],{"__ignoreMap":270},[792,10476,10477],{"class":794,"line":795},[792,10478,10479],{"class":798},"# 项目 .npmrc\n",[792,10481,10482,10485,10487],{"class":794,"line":271},[792,10483,10484],{"class":1043},"electron_mirror",[792,10486,7599],{"class":1036},[792,10488,10489],{"class":808},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron\u002F\n",[792,10491,10492,10495,10497],{"class":794,"line":747},[792,10493,10494],{"class":1043},"electron_builder_binaries_mirror",[792,10496,7599],{"class":1036},[792,10498,10499],{"class":808},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron-builder-binaries\u002F\n",[571,10501,10503],{"id":10502},"_23-puppeteer-playwright","2.3 Puppeteer \u002F Playwright",[784,10505,10507],{"className":786,"code":10506,"language":788,"meta":270,"style":270},"# .npmrc 或环境变量\npuppeteer_download_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\nPLAYWRIGHT_DOWNLOAD_HOST=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fplaywright\n",[69,10508,10509,10514,10524],{"__ignoreMap":270},[792,10510,10511],{"class":794,"line":795},[792,10512,10513],{"class":798},"# .npmrc 或环境变量\n",[792,10515,10516,10519,10521],{"class":794,"line":271},[792,10517,10518],{"class":1043},"puppeteer_download_host",[792,10520,7599],{"class":1036},[792,10522,10523],{"class":808},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\n",[792,10525,10526,10529,10531],{"class":794,"line":747},[792,10527,10528],{"class":1043},"PLAYWRIGHT_DOWNLOAD_HOST",[792,10530,7599],{"class":1036},[792,10532,10533],{"class":808},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fplaywright\n",[571,10535,10537],{"id":10536},"_24-node-sass-sass-embedded","2.4 node-sass \u002F sass-embedded",[784,10539,10541],{"className":786,"code":10540,"language":788,"meta":270,"style":270},"# .npmrc\nsass_binary_site=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-sass\n",[69,10542,10543,10547],{"__ignoreMap":270},[792,10544,10545],{"class":794,"line":795},[792,10546,10172],{"class":798},[792,10548,10549,10552,10554],{"class":794,"line":271},[792,10550,10551],{"class":1043},"sass_binary_site",[792,10553,7599],{"class":1036},[792,10555,10556],{"class":808},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-sass\n",[173,10558,10559,10560,10563],{},"现在多用 ",[69,10561,10562],{},"sass","（dart-sass 纯 JS 实现），无需 binary。",[571,10565,10567],{"id":10566},"_25-sharp-canvas","2.5 sharp \u002F canvas",[784,10569,10571],{"className":786,"code":10570,"language":788,"meta":270,"style":270},"# .npmrc\nsharp_binary_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp\nsharp_libvips_binary_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp-libvips\ncanvas_binary_host_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-canvas-prebuilt\u002F\n",[69,10572,10573,10577,10587,10597],{"__ignoreMap":270},[792,10574,10575],{"class":794,"line":795},[792,10576,10172],{"class":798},[792,10578,10579,10582,10584],{"class":794,"line":271},[792,10580,10581],{"class":1043},"sharp_binary_host",[792,10583,7599],{"class":1036},[792,10585,10586],{"class":808},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp\n",[792,10588,10589,10592,10594],{"class":794,"line":747},[792,10590,10591],{"class":1043},"sharp_libvips_binary_host",[792,10593,7599],{"class":1036},[792,10595,10596],{"class":808},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp-libvips\n",[792,10598,10599,10602,10604],{"class":794,"line":836},[792,10600,10601],{"class":1043},"canvas_binary_host_mirror",[792,10603,7599],{"class":1036},[792,10605,10606],{"class":808},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-canvas-prebuilt\u002F\n",[571,10608,10610],{"id":10609},"_26-cypress","2.6 Cypress",[784,10612,10614],{"className":786,"code":10613,"language":788,"meta":270,"style":270},"export CYPRESS_DOWNLOAD_MIRROR=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fcypress\n",[69,10615,10616],{"__ignoreMap":270},[792,10617,10618,10620,10623,10625],{"class":794,"line":795},[792,10619,7593],{"class":1036},[792,10621,10622],{"class":1043}," CYPRESS_DOWNLOAD_MIRROR",[792,10624,7599],{"class":1036},[792,10626,10627],{"class":1043},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fcypress\n",[571,10629,10631],{"id":10630},"_27-全家桶模板","2.7 全家桶模板",[784,10633,10635],{"className":6595,"code":10634,"language":6597,"meta":270,"style":270},"# ~\u002F.npmrc 一份全搞定\nregistry=https:\u002F\u002Fregistry.npmmirror.com\nelectron_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron\u002F\nelectron_builder_binaries_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron-builder-binaries\u002F\npuppeteer_download_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\nPLAYWRIGHT_DOWNLOAD_HOST=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fplaywright\nsass_binary_site=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-sass\nsharp_binary_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp\nsharp_libvips_binary_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp-libvips\ncanvas_binary_host_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-canvas-prebuilt\u002F\nCYPRESS_DOWNLOAD_MIRROR=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fcypress\n",[69,10636,10637,10642,10646,10651,10656,10661,10666,10671,10676,10681,10686],{"__ignoreMap":270},[792,10638,10639],{"class":794,"line":795},[792,10640,10641],{},"# ~\u002F.npmrc 一份全搞定\n",[792,10643,10644],{"class":794,"line":271},[792,10645,10177],{},[792,10647,10648],{"class":794,"line":747},[792,10649,10650],{},"electron_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron\u002F\n",[792,10652,10653],{"class":794,"line":836},[792,10654,10655],{},"electron_builder_binaries_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron-builder-binaries\u002F\n",[792,10657,10658],{"class":794,"line":842},[792,10659,10660],{},"puppeteer_download_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\n",[792,10662,10663],{"class":794,"line":848},[792,10664,10665],{},"PLAYWRIGHT_DOWNLOAD_HOST=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fplaywright\n",[792,10667,10668],{"class":794,"line":863},[792,10669,10670],{},"sass_binary_site=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-sass\n",[792,10672,10673],{"class":794,"line":868},[792,10674,10675],{},"sharp_binary_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp\n",[792,10677,10678],{"class":794,"line":874},[792,10679,10680],{},"sharp_libvips_binary_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp-libvips\n",[792,10682,10683],{"class":794,"line":889},[792,10684,10685],{},"canvas_binary_host_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-canvas-prebuilt\u002F\n",[792,10687,10688],{"class":794,"line":894},[792,10689,10690],{},"CYPRESS_DOWNLOAD_MIRROR=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fcypress\n",[13,10692,10694],{"id":10693},"三命令对照速查","三、命令对照速查",[18,10696,10697,10711],{},[21,10698,10699],{},[24,10700,10701,10704,10706,10709],{},[27,10702,10703],{},"操作",[27,10705,9805],{},[27,10707,10708],{},"yarn (v1)",[27,10710,10007],{},[35,10712,10713,10732,10752,10772,10792,10807,10827,10847,10867,10887,10907,10925,10945,10965,10985],{},[24,10714,10715,10718,10723,10727],{},[40,10716,10717],{},"安装全部",[40,10719,10720],{},[69,10721,10722],{},"npm install",[40,10724,10725],{},[69,10726,9965],{},[40,10728,10729],{},[69,10730,10731],{},"pnpm install",[24,10733,10734,10737,10742,10747],{},[40,10735,10736],{},"安装生产依赖",[40,10738,10739],{},[69,10740,10741],{},"npm i \u003Cpkg>",[40,10743,10744],{},[69,10745,10746],{},"yarn add \u003Cpkg>",[40,10748,10749],{},[69,10750,10751],{},"pnpm add \u003Cpkg>",[24,10753,10754,10757,10762,10767],{},[40,10755,10756],{},"安装开发依赖",[40,10758,10759],{},[69,10760,10761],{},"npm i -D \u003Cpkg>",[40,10763,10764],{},[69,10765,10766],{},"yarn add -D \u003Cpkg>",[40,10768,10769],{},[69,10770,10771],{},"pnpm add -D \u003Cpkg>",[24,10773,10774,10777,10782,10787],{},[40,10775,10776],{},"安装全局",[40,10778,10779],{},[69,10780,10781],{},"npm i -g \u003Cpkg>",[40,10783,10784],{},[69,10785,10786],{},"yarn global add \u003Cpkg>",[40,10788,10789],{},[69,10790,10791],{},"pnpm add -g \u003Cpkg>",[24,10793,10794,10797,10802,10805],{},[40,10795,10796],{},"安装指定版本",[40,10798,10799],{},[69,10800,10801],{},"npm i \u003Cpkg>@1.2.3",[40,10803,10804],{},"同",[40,10806,10804],{},[24,10808,10809,10812,10817,10822],{},[40,10810,10811],{},"卸载",[40,10813,10814],{},[69,10815,10816],{},"npm uninstall \u003Cpkg>",[40,10818,10819],{},[69,10820,10821],{},"yarn remove \u003Cpkg>",[40,10823,10824],{},[69,10825,10826],{},"pnpm remove \u003Cpkg>",[24,10828,10829,10832,10837,10842],{},[40,10830,10831],{},"卸载全局",[40,10833,10834],{},[69,10835,10836],{},"npm uninstall -g \u003Cpkg>",[40,10838,10839],{},[69,10840,10841],{},"yarn global remove \u003Cpkg>",[40,10843,10844],{},[69,10845,10846],{},"pnpm remove -g \u003Cpkg>",[24,10848,10849,10852,10857,10862],{},[40,10850,10851],{},"更新全部",[40,10853,10854],{},[69,10855,10856],{},"npm update",[40,10858,10859],{},[69,10860,10861],{},"yarn upgrade",[40,10863,10864],{},[69,10865,10866],{},"pnpm update",[24,10868,10869,10872,10877,10882],{},[40,10870,10871],{},"运行脚本",[40,10873,10874],{},[69,10875,10876],{},"npm run \u003Cs>",[40,10878,10879],{},[69,10880,10881],{},"yarn \u003Cs>",[40,10883,10884],{},[69,10885,10886],{},"pnpm \u003Cs>",[24,10888,10889,10892,10897,10902],{},[40,10890,10891],{},"执行本地二进制",[40,10893,10894],{},[69,10895,10896],{},"npx \u003Cbin>",[40,10898,10899],{},[69,10900,10901],{},"yarn \u003Cbin>",[40,10903,10904],{},[69,10905,10906],{},"pnpm exec \u003Cbin>",[24,10908,10909,10912,10917,10920],{},[40,10910,10911],{},"执行远程包",[40,10913,10914],{},[69,10915,10916],{},"npx \u003Cpkg>",[40,10918,10919],{},"—",[40,10921,10922],{},[69,10923,10924],{},"pnpm dlx \u003Cpkg>",[24,10926,10927,10930,10935,10940],{},[40,10928,10929],{},"查看顶层依赖",[40,10931,10932],{},[69,10933,10934],{},"npm ls --depth=0",[40,10936,10937],{},[69,10938,10939],{},"yarn list --depth=0",[40,10941,10942],{},[69,10943,10944],{},"pnpm list --depth=0",[24,10946,10947,10950,10955,10960],{},[40,10948,10949],{},"查过时依赖",[40,10951,10952],{},[69,10953,10954],{},"npm outdated",[40,10956,10957],{},[69,10958,10959],{},"yarn outdated",[40,10961,10962],{},[69,10963,10964],{},"pnpm outdated",[24,10966,10967,10970,10975,10980],{},[40,10968,10969],{},"清缓存",[40,10971,10972],{},[69,10973,10974],{},"npm cache clean --force",[40,10976,10977],{},[69,10978,10979],{},"yarn cache clean",[40,10981,10982],{},[69,10983,10984],{},"pnpm store prune",[24,10986,10987,10990,10995,11000],{},[40,10988,10989],{},"查看为什么装了某包",[40,10991,10992],{},[69,10993,10994],{},"npm why \u003Cpkg>",[40,10996,10997],{},[69,10998,10999],{},"yarn why \u003Cpkg>",[40,11001,11002],{},[69,11003,11004],{},"pnpm why \u003Cpkg>",[13,11006,11008],{"id":11007},"四锁文件","四、锁文件",[18,11010,11011,11024],{},[21,11012,11013],{},[24,11014,11015,11018,11021],{},[27,11016,11017],{},"包管理器",[27,11019,11020],{},"锁文件",[27,11022,11023],{},"提交 Git",[35,11025,11026,11038,11050],{},[24,11027,11028,11030,11035],{},[40,11029,9805],{},[40,11031,11032],{},[69,11033,11034],{},"package-lock.json",[40,11036,11037],{},"✅",[24,11039,11040,11043,11048],{},[40,11041,11042],{},"yarn v1",[40,11044,11045],{},[69,11046,11047],{},"yarn.lock",[40,11049,11037],{},[24,11051,11052,11054,11059],{},[40,11053,10007],{},[40,11055,11056],{},[69,11057,11058],{},"pnpm-lock.yaml",[40,11060,11037],{},[173,11062,11063,11066],{},[43,11064,11065],{},"同一仓库只保留一种锁文件","。混用会导致依赖树不一致。",[571,11068,11069],{"id":11069},"清理重装",[784,11071,11073],{"className":786,"code":11072,"language":788,"meta":270,"style":270},"# npm\nrm -rf node_modules package-lock.json && npm install\n\n# yarn\nrm -rf node_modules yarn.lock && yarn install\n\n# pnpm\nrm -rf node_modules pnpm-lock.yaml && pnpm install\n",[69,11074,11075,11079,11098,11102,11107,11124,11128,11132],{"__ignoreMap":270},[792,11076,11077],{"class":794,"line":795},[792,11078,9912],{"class":798},[792,11080,11081,11083,11085,11088,11091,11093,11095],{"class":794,"line":271},[792,11082,4107],{"class":804},[792,11084,4110],{"class":812},[792,11086,11087],{"class":808}," node_modules",[792,11089,11090],{"class":808}," package-lock.json",[792,11092,3467],{"class":1043},[792,11094,9805],{"class":804},[792,11096,11097],{"class":808}," install\n",[792,11099,11100],{"class":794,"line":747},[792,11101,839],{"emptyLinePlaceholder":286},[792,11103,11104],{"class":794,"line":836},[792,11105,11106],{"class":798},"# yarn\n",[792,11108,11109,11111,11113,11115,11118,11120,11122],{"class":794,"line":842},[792,11110,4107],{"class":804},[792,11112,4110],{"class":812},[792,11114,11087],{"class":808},[792,11116,11117],{"class":808}," yarn.lock",[792,11119,3467],{"class":1043},[792,11121,9965],{"class":804},[792,11123,11097],{"class":808},[792,11125,11126],{"class":794,"line":848},[792,11127,839],{"emptyLinePlaceholder":286},[792,11129,11130],{"class":794,"line":863},[792,11131,10002],{"class":798},[792,11133,11134,11136,11138,11140,11143,11145,11147],{"class":794,"line":868},[792,11135,4107],{"class":804},[792,11137,4110],{"class":812},[792,11139,11087],{"class":808},[792,11141,11142],{"class":808}," pnpm-lock.yaml",[792,11144,3467],{"class":1043},[792,11146,10007],{"class":804},[792,11148,11097],{"class":808},[571,11150,11152],{"id":11151},"ci-严格安装","CI 严格安装",[784,11154,11156],{"className":786,"code":11155,"language":788,"meta":270,"style":270},"npm ci                            # 严格按 lock 装，不更新\npnpm install --frozen-lockfile\nyarn install --frozen-lockfile\n",[69,11157,11158,11168,11177],{"__ignoreMap":270},[792,11159,11160,11162,11165],{"class":794,"line":795},[792,11161,9805],{"class":804},[792,11163,11164],{"class":808}," ci",[792,11166,11167],{"class":798},"                            # 严格按 lock 装，不更新\n",[792,11169,11170,11172,11174],{"class":794,"line":271},[792,11171,10007],{"class":804},[792,11173,3684],{"class":808},[792,11175,11176],{"class":812}," --frozen-lockfile\n",[792,11178,11179,11181,11183],{"class":794,"line":747},[792,11180,9965],{"class":804},[792,11182,3684],{"class":808},[792,11184,11176],{"class":812},[173,11186,11187,11190,11191,11193,11194,11197],{},[69,11188,11189],{},"npm ci"," 要求 ",[69,11192,11034],{}," 与 ",[69,11195,11196],{},"package.json"," 完全一致，否则直接报错退出。",[13,11199,11201],{"id":11200},"五依赖版本语义","五、依赖版本语义",[18,11203,11204,11214],{},[21,11205,11206],{},[24,11207,11208,11211],{},[27,11209,11210],{},"写法",[27,11212,11213],{},"允许升级范围",[35,11215,11216,11226,11238,11250,11263],{},[24,11217,11218,11223],{},[40,11219,11220],{},[69,11221,11222],{},"1.2.3",[40,11224,11225],{},"精确，不升级",[24,11227,11228,11233],{},[40,11229,11230],{},[69,11231,11232],{},"~1.2.3",[40,11234,11235],{},[69,11236,11237],{},">=1.2.3 \u003C1.3.0",[24,11239,11240,11245],{},[40,11241,11242],{},[69,11243,11244],{},"^1.2.3",[40,11246,11247],{},[69,11248,11249],{},">=1.2.3 \u003C2.0.0",[24,11251,11252,11257],{},[40,11253,11254],{},[69,11255,11256],{},"^0.2.3",[40,11258,11259,11262],{},[69,11260,11261],{},">=0.2.3 \u003C0.3.0","（0.x 例外，锁次版本）",[24,11264,11265,11272],{},[40,11266,11267,3008,11269],{},[69,11268,3338],{},[69,11270,11271],{},"latest",[40,11273,11274],{},"不限（不推荐）",[13,11276,11278],{"id":11277},"六脚本scripts","六、脚本（scripts）",[571,11280,11281],{"id":11281},"钩子",[18,11283,11284,11293],{},[21,11285,11286],{},[24,11287,11288,11290],{},[27,11289,11281],{},[27,11291,11292],{},"触发时机",[35,11294,11295,11305,11314,11324,11338,11350],{},[24,11296,11297,11302],{},[40,11298,11299],{},[69,11300,11301],{},"preinstall",[40,11303,11304],{},"install 之前",[24,11306,11307,11311],{},[40,11308,11309],{},[69,11310,10394],{},[40,11312,11313],{},"install 之后",[24,11315,11316,11321],{},[40,11317,11318],{},[69,11319,11320],{},"prepare",[40,11322,11323],{},"install 和 publish 之前都触发（husky 常用）",[24,11325,11326,11331],{},[40,11327,11328],{},[69,11329,11330],{},"prepublishOnly",[40,11332,11333,11334,11337],{},"仅 ",[69,11335,11336],{},"npm publish"," 之前",[24,11339,11340,11345],{},[40,11341,11342],{},[69,11343,11344],{},"pre\u003Cscript>",[40,11346,11347,11337],{},[69,11348,11349],{},"npm run \u003Cscript>",[24,11351,11352,11357],{},[40,11353,11354],{},[69,11355,11356],{},"post\u003Cscript>",[40,11358,11359],{},"执行之后",[571,11361,11362],{"id":11362},"传参与环境变量",[784,11364,11366],{"className":786,"code":11365,"language":788,"meta":270,"style":270},"npm run build -- --mode production\nyarn build --mode production\npnpm build --mode production\n\n# 跨平台环境变量\nnpm i -D cross-env\n\"build\": \"cross-env NODE_ENV=production vite build\"\n",[69,11367,11368,11386,11396,11406,11410,11415,11427],{"__ignoreMap":270},[792,11369,11370,11372,11375,11378,11380,11383],{"class":794,"line":795},[792,11371,9805],{"class":804},[792,11373,11374],{"class":808}," run",[792,11376,11377],{"class":808}," build",[792,11379,1595],{"class":812},[792,11381,11382],{"class":812}," --mode",[792,11384,11385],{"class":808}," production\n",[792,11387,11388,11390,11392,11394],{"class":794,"line":271},[792,11389,9965],{"class":804},[792,11391,11377],{"class":808},[792,11393,11382],{"class":812},[792,11395,11385],{"class":808},[792,11397,11398,11400,11402,11404],{"class":794,"line":747},[792,11399,10007],{"class":804},[792,11401,11377],{"class":808},[792,11403,11382],{"class":812},[792,11405,11385],{"class":808},[792,11407,11408],{"class":794,"line":836},[792,11409,839],{"emptyLinePlaceholder":286},[792,11411,11412],{"class":794,"line":842},[792,11413,11414],{"class":798},"# 跨平台环境变量\n",[792,11416,11417,11419,11422,11424],{"class":794,"line":848},[792,11418,9805],{"class":804},[792,11420,11421],{"class":808}," i",[792,11423,1343],{"class":812},[792,11425,11426],{"class":808}," cross-env\n",[792,11428,11429,11432,11434],{"class":794,"line":863},[792,11430,11431],{"class":804},"\"build\"",[792,11433,8400],{"class":4063},[792,11435,11436],{"class":808}," \"cross-env NODE_ENV=production vite build\"\n",[13,11438,11440],{"id":11439},"七依赖管理","七、依赖管理",[571,11442,11444],{"id":11443},"overrides-resolutions强制覆盖版本","overrides \u002F resolutions（强制覆盖版本）",[173,11446,11447,3182],{},[43,11448,11449],{},"npm (>= 8.3)",[784,11451,11453],{"className":3771,"code":11452,"language":3773,"meta":270,"style":270},"{\n  \"overrides\": {\n    \"lodash\": \"4.17.21\",\n    \"some-pkg\": { \"lodash\": \"4.17.21\" }\n  }\n}\n",[69,11454,11455,11459,11467,11480,11498,11503],{"__ignoreMap":270},[792,11456,11457],{"class":794,"line":795},[792,11458,3780],{"class":1043},[792,11460,11461,11464],{"class":794,"line":271},[792,11462,11463],{"class":3785},"  \"overrides\"",[792,11465,11466],{"class":1043},": {\n",[792,11468,11469,11472,11475,11478],{"class":794,"line":747},[792,11470,11471],{"class":3785},"    \"lodash\"",[792,11473,11474],{"class":1043},": ",[792,11476,11477],{"class":3794},"\"4.17.21\"",[792,11479,3798],{"class":1043},[792,11481,11482,11485,11488,11491,11493,11495],{"class":794,"line":836},[792,11483,11484],{"class":3785},"    \"some-pkg\"",[792,11486,11487],{"class":1043},": { ",[792,11489,11490],{"class":3785},"\"lodash\"",[792,11492,11474],{"class":1043},[792,11494,11477],{"class":3794},[792,11496,11497],{"class":1043}," }\n",[792,11499,11500],{"class":794,"line":842},[792,11501,11502],{"class":1043},"  }\n",[792,11504,11505],{"class":794,"line":848},[792,11506,3827],{"class":1043},[173,11508,11509,3182],{},[43,11510,11042],{},[784,11512,11514],{"className":3771,"code":11513,"language":3773,"meta":270,"style":270},"{\n  \"resolutions\": {\n    \"lodash\": \"4.17.21\",\n    \"**\u002Flodash\": \"4.17.21\"\n  }\n}\n",[69,11515,11516,11520,11527,11537,11547,11551],{"__ignoreMap":270},[792,11517,11518],{"class":794,"line":795},[792,11519,3780],{"class":1043},[792,11521,11522,11525],{"class":794,"line":271},[792,11523,11524],{"class":3785},"  \"resolutions\"",[792,11526,11466],{"class":1043},[792,11528,11529,11531,11533,11535],{"class":794,"line":747},[792,11530,11471],{"class":3785},[792,11532,11474],{"class":1043},[792,11534,11477],{"class":3794},[792,11536,3798],{"class":1043},[792,11538,11539,11542,11544],{"class":794,"line":836},[792,11540,11541],{"class":3785},"    \"**\u002Flodash\"",[792,11543,11474],{"class":1043},[792,11545,11546],{"class":3794},"\"4.17.21\"\n",[792,11548,11549],{"class":794,"line":842},[792,11550,11502],{"class":1043},[792,11552,11553],{"class":794,"line":848},[792,11554,3827],{"class":1043},[173,11556,11557,3182],{},[43,11558,10007],{},[784,11560,11562],{"className":3771,"code":11561,"language":3773,"meta":270,"style":270},"{\n  \"pnpm\": {\n    \"overrides\": {\n      \"lodash\": \"4.17.21\"\n    }\n  }\n}\n",[69,11563,11564,11568,11575,11582,11591,11596,11600],{"__ignoreMap":270},[792,11565,11566],{"class":794,"line":795},[792,11567,3780],{"class":1043},[792,11569,11570,11573],{"class":794,"line":271},[792,11571,11572],{"class":3785},"  \"pnpm\"",[792,11574,11466],{"class":1043},[792,11576,11577,11580],{"class":794,"line":747},[792,11578,11579],{"class":3785},"    \"overrides\"",[792,11581,11466],{"class":1043},[792,11583,11584,11587,11589],{"class":794,"line":836},[792,11585,11586],{"class":3785},"      \"lodash\"",[792,11588,11474],{"class":1043},[792,11590,11546],{"class":3794},[792,11592,11593],{"class":794,"line":842},[792,11594,11595],{"class":1043},"    }\n",[792,11597,11598],{"class":794,"line":848},[792,11599,11502],{"class":1043},[792,11601,11602],{"class":794,"line":863},[792,11603,3827],{"class":1043},[571,11605,11606],{"id":11606},"依赖分析",[784,11608,11610],{"className":786,"code":11609,"language":788,"meta":270,"style":270},"npm ls \u003Cpkg>                      # 谁依赖了它\nnpm why \u003Cpkg>                     # 同上（npm 8+）\npnpm why \u003Cpkg>\nyarn why \u003Cpkg>\n",[69,11611,11612,11629,11647,11661],{"__ignoreMap":270},[792,11613,11614,11616,11618,11620,11622,11624,11626],{"class":794,"line":795},[792,11615,9805],{"class":804},[792,11617,9825],{"class":808},[792,11619,1037],{"class":1036},[792,11621,3689],{"class":808},[792,11623,3692],{"class":1043},[792,11625,1047],{"class":1036},[792,11627,11628],{"class":798},"                      # 谁依赖了它\n",[792,11630,11631,11633,11636,11638,11640,11642,11644],{"class":794,"line":271},[792,11632,9805],{"class":804},[792,11634,11635],{"class":808}," why",[792,11637,1037],{"class":1036},[792,11639,3689],{"class":808},[792,11641,3692],{"class":1043},[792,11643,1047],{"class":1036},[792,11645,11646],{"class":798},"                     # 同上（npm 8+）\n",[792,11648,11649,11651,11653,11655,11657,11659],{"class":794,"line":747},[792,11650,10007],{"class":804},[792,11652,11635],{"class":808},[792,11654,1037],{"class":1036},[792,11656,3689],{"class":808},[792,11658,3692],{"class":1043},[792,11660,1748],{"class":1036},[792,11662,11663,11665,11667,11669,11671,11673],{"class":794,"line":836},[792,11664,9965],{"class":804},[792,11666,11635],{"class":808},[792,11668,1037],{"class":1036},[792,11670,3689],{"class":808},[792,11672,3692],{"class":1043},[792,11674,1748],{"class":1036},[13,11676,11678],{"id":11677},"八npm-专属","八、npm 专属",[784,11680,11682],{"className":786,"code":11681,"language":788,"meta":270,"style":270},"npm view \u003Cpkg>                    # 包信息\nnpm view \u003Cpkg> versions           # 所有版本\nnpm view \u003Cpkg> dist-tags          # 标签\nnpm info \u003Cpkg> repository.url     # 仓库地址\n\nnpm login\nnpm publish                       # 发布\nnpm publish --access public       # scoped 包首次发布\nnpm publish --tag beta            # 打标签\nnpm unpublish \u003Cpkg>@1.0.0         # 撤销（24h 内）\n",[69,11683,11684,11702,11722,11742,11762,11766,11773,11783,11798,11813],{"__ignoreMap":270},[792,11685,11686,11688,11691,11693,11695,11697,11699],{"class":794,"line":795},[792,11687,9805],{"class":804},[792,11689,11690],{"class":808}," view",[792,11692,1037],{"class":1036},[792,11694,3689],{"class":808},[792,11696,3692],{"class":1043},[792,11698,1047],{"class":1036},[792,11700,11701],{"class":798},"                    # 包信息\n",[792,11703,11704,11706,11708,11710,11712,11714,11716,11719],{"class":794,"line":271},[792,11705,9805],{"class":804},[792,11707,11690],{"class":808},[792,11709,1037],{"class":1036},[792,11711,3689],{"class":808},[792,11713,3692],{"class":1043},[792,11715,1047],{"class":1036},[792,11717,11718],{"class":808}," versions",[792,11720,11721],{"class":798},"           # 所有版本\n",[792,11723,11724,11726,11728,11730,11732,11734,11736,11739],{"class":794,"line":747},[792,11725,9805],{"class":804},[792,11727,11690],{"class":808},[792,11729,1037],{"class":1036},[792,11731,3689],{"class":808},[792,11733,3692],{"class":1043},[792,11735,1047],{"class":1036},[792,11737,11738],{"class":808}," dist-tags",[792,11740,11741],{"class":798},"          # 标签\n",[792,11743,11744,11746,11748,11750,11752,11754,11756,11759],{"class":794,"line":836},[792,11745,9805],{"class":804},[792,11747,3862],{"class":808},[792,11749,1037],{"class":1036},[792,11751,3689],{"class":808},[792,11753,3692],{"class":1043},[792,11755,1047],{"class":1036},[792,11757,11758],{"class":808}," repository.url",[792,11760,11761],{"class":798},"     # 仓库地址\n",[792,11763,11764],{"class":794,"line":842},[792,11765,839],{"emptyLinePlaceholder":286},[792,11767,11768,11770],{"class":794,"line":848},[792,11769,9805],{"class":804},[792,11771,11772],{"class":808}," login\n",[792,11774,11775,11777,11780],{"class":794,"line":863},[792,11776,9805],{"class":804},[792,11778,11779],{"class":808}," publish",[792,11781,11782],{"class":798},"                       # 发布\n",[792,11784,11785,11787,11789,11792,11795],{"class":794,"line":868},[792,11786,9805],{"class":804},[792,11788,11779],{"class":808},[792,11790,11791],{"class":812}," --access",[792,11793,11794],{"class":808}," public",[792,11796,11797],{"class":798},"       # scoped 包首次发布\n",[792,11799,11800,11802,11804,11807,11810],{"class":794,"line":874},[792,11801,9805],{"class":804},[792,11803,11779],{"class":808},[792,11805,11806],{"class":812}," --tag",[792,11808,11809],{"class":808}," beta",[792,11811,11812],{"class":798},"            # 打标签\n",[792,11814,11815,11817,11820,11822,11824,11826,11828,11831],{"class":794,"line":889},[792,11816,9805],{"class":804},[792,11818,11819],{"class":808}," unpublish",[792,11821,1037],{"class":1036},[792,11823,3689],{"class":808},[792,11825,3692],{"class":1043},[792,11827,1047],{"class":1036},[792,11829,11830],{"class":808},"@1.0.0",[792,11832,11833],{"class":798},"         # 撤销（24h 内）\n",[13,11835,11837],{"id":11836},"九yarn-v1-专属","九、yarn v1 专属",[571,11839,11840],{"id":11840},"workspaces",[784,11842,11844],{"className":3771,"code":11843,"language":3773,"meta":270,"style":270},"{\n  \"private\": true,\n  \"workspaces\": [\"packages\u002F*\"]\n}\n",[69,11845,11846,11850,11862,11876],{"__ignoreMap":270},[792,11847,11848],{"class":794,"line":795},[792,11849,3780],{"class":1043},[792,11851,11852,11855,11857,11860],{"class":794,"line":271},[792,11853,11854],{"class":3785},"  \"private\"",[792,11856,11474],{"class":1043},[792,11858,11859],{"class":812},"true",[792,11861,3798],{"class":1043},[792,11863,11864,11867,11870,11873],{"class":794,"line":747},[792,11865,11866],{"class":3785},"  \"workspaces\"",[792,11868,11869],{"class":1043},": [",[792,11871,11872],{"class":3794},"\"packages\u002F*\"",[792,11874,11875],{"class":1043},"]\n",[792,11877,11878],{"class":794,"line":836},[792,11879,3827],{"class":1043},[784,11881,11883],{"className":786,"code":11882,"language":788,"meta":270,"style":270},"yarn workspace \u003Cpkg> add \u003Cdep>\nyarn workspaces info\n",[69,11884,11885,11911],{"__ignoreMap":270},[792,11886,11887,11889,11892,11894,11896,11898,11900,11902,11904,11907,11909],{"class":794,"line":795},[792,11888,9965],{"class":804},[792,11890,11891],{"class":808}," workspace",[792,11893,1037],{"class":1036},[792,11895,3689],{"class":808},[792,11897,3692],{"class":1043},[792,11899,1047],{"class":1036},[792,11901,1033],{"class":808},[792,11903,1037],{"class":1036},[792,11905,11906],{"class":808},"de",[792,11908,173],{"class":1043},[792,11910,1748],{"class":1036},[792,11912,11913,11915,11918],{"class":794,"line":271},[792,11914,9965],{"class":804},[792,11916,11917],{"class":808}," workspaces",[792,11919,11920],{"class":808}," info\n",[571,11922,11923],{"id":11923},"常用",[784,11925,11927],{"className":786,"code":11926,"language":788,"meta":270,"style":270},"yarn licenses list                # 许可证\nyarn audit                        # 安全审计\nyarn autoclean --init\n",[69,11928,11929,11941,11951],{"__ignoreMap":270},[792,11930,11931,11933,11936,11938],{"class":794,"line":795},[792,11932,9965],{"class":804},[792,11934,11935],{"class":808}," licenses",[792,11937,1836],{"class":808},[792,11939,11940],{"class":798},"                # 许可证\n",[792,11942,11943,11945,11948],{"class":794,"line":271},[792,11944,9965],{"class":804},[792,11946,11947],{"class":808}," audit",[792,11949,11950],{"class":798},"                        # 安全审计\n",[792,11952,11953,11955,11958],{"class":794,"line":747},[792,11954,9965],{"class":804},[792,11956,11957],{"class":808}," autoclean",[792,11959,11960],{"class":812}," --init\n",[189,11962,11963],{},[173,11964,11965],{},"yarn v1 已停止新功能开发，长期建议迁移到 pnpm 或 yarn berry (v2+)。",[13,11967,11969],{"id":11968},"十pnpm-专属","十、pnpm 专属",[571,11971,11972],{"id":11972},"核心优势",[77,11974,11975,11981,11987],{},[80,11976,11977,11980],{},[43,11978,11979],{},"硬链接 + 内容寻址存储","：磁盘只存一份包实体，多项目共享。",[80,11982,11983,11986],{},[43,11984,11985],{},"非扁平化 node_modules","：只有直接依赖可见，杜绝幽灵依赖。",[80,11988,11989,11992],{},[43,11990,11991],{},"严格 peerDependencies","：不隐式提升未声明依赖。",[571,11994,11923],{"id":11995},"常用-1",[784,11997,11999],{"className":786,"code":11998,"language":788,"meta":270,"style":270},"pnpm store path                   # store 位置\npnpm store prune                  # 清缓存\npnpm dedupe                       # 去重\npnpm patch \u003Cpkg>                  # 打补丁\npnpm patch-commit \u003Cpath>\n\npnpm add -O \u003Cpkg>                 # optionalDependencies\npnpm add -P \u003Cpkg>                 # peerDependencies\n",[69,12000,12001,12014,12026,12036,12054,12070,12074,12094],{"__ignoreMap":270},[792,12002,12003,12005,12008,12011],{"class":794,"line":795},[792,12004,10007],{"class":804},[792,12006,12007],{"class":808}," store",[792,12009,12010],{"class":808}," path",[792,12012,12013],{"class":798},"                   # store 位置\n",[792,12015,12016,12018,12020,12023],{"class":794,"line":271},[792,12017,10007],{"class":804},[792,12019,12007],{"class":808},[792,12021,12022],{"class":808}," prune",[792,12024,12025],{"class":798},"                  # 清缓存\n",[792,12027,12028,12030,12033],{"class":794,"line":747},[792,12029,10007],{"class":804},[792,12031,12032],{"class":808}," dedupe",[792,12034,12035],{"class":798},"                       # 去重\n",[792,12037,12038,12040,12043,12045,12047,12049,12051],{"class":794,"line":836},[792,12039,10007],{"class":804},[792,12041,12042],{"class":808}," patch",[792,12044,1037],{"class":1036},[792,12046,3689],{"class":808},[792,12048,3692],{"class":1043},[792,12050,1047],{"class":1036},[792,12052,12053],{"class":798},"                  # 打补丁\n",[792,12055,12056,12058,12061,12063,12066,12068],{"class":794,"line":842},[792,12057,10007],{"class":804},[792,12059,12060],{"class":808}," patch-commit",[792,12062,1037],{"class":1036},[792,12064,12065],{"class":808},"pat",[792,12067,1408],{"class":1043},[792,12069,1748],{"class":1036},[792,12071,12072],{"class":794,"line":848},[792,12073,839],{"emptyLinePlaceholder":286},[792,12075,12076,12078,12080,12083,12085,12087,12089,12091],{"class":794,"line":863},[792,12077,10007],{"class":804},[792,12079,1033],{"class":808},[792,12081,12082],{"class":812}," -O",[792,12084,1037],{"class":1036},[792,12086,3689],{"class":808},[792,12088,3692],{"class":1043},[792,12090,1047],{"class":1036},[792,12092,12093],{"class":798},"                 # optionalDependencies\n",[792,12095,12096,12098,12100,12103,12105,12107,12109,12111],{"class":794,"line":868},[792,12097,10007],{"class":804},[792,12099,1033],{"class":808},[792,12101,12102],{"class":812}," -P",[792,12104,1037],{"class":1036},[792,12106,3689],{"class":808},[792,12108,3692],{"class":1043},[792,12110,1047],{"class":1036},[792,12112,12113],{"class":798},"                 # peerDependencies\n",[571,12115,12116],{"id":12116},"工作区",[784,12118,12122],{"className":12119,"code":12120,"language":12121,"meta":270,"style":270},"language-yaml shiki shiki-themes monokai","# pnpm-workspace.yaml\npackages:\n  - \"packages\u002F*\"\n  - \"apps\u002F*\"\n","yaml",[69,12123,12124,12129,12134,12139],{"__ignoreMap":270},[792,12125,12126],{"class":794,"line":795},[792,12127,12128],{},"# pnpm-workspace.yaml\n",[792,12130,12131],{"class":794,"line":271},[792,12132,12133],{},"packages:\n",[792,12135,12136],{"class":794,"line":747},[792,12137,12138],{},"  - \"packages\u002F*\"\n",[792,12140,12141],{"class":794,"line":836},[792,12142,12143],{},"  - \"apps\u002F*\"\n",[784,12145,12147],{"className":786,"code":12146,"language":788,"meta":270,"style":270},"pnpm -r build                     # 递归所有包\npnpm --filter web build           # 只跑 web\npnpm --filter \"web...\" build      # web 及其依赖\npnpm --filter \"...web\" build      # web 及其被依赖者\n",[69,12148,12149,12160,12175,12189],{"__ignoreMap":270},[792,12150,12151,12153,12155,12157],{"class":794,"line":795},[792,12152,10007],{"class":804},[792,12154,2624],{"class":812},[792,12156,11377],{"class":808},[792,12158,12159],{"class":798},"                     # 递归所有包\n",[792,12161,12162,12164,12167,12170,12172],{"class":794,"line":271},[792,12163,10007],{"class":804},[792,12165,12166],{"class":812}," --filter",[792,12168,12169],{"class":808}," web",[792,12171,11377],{"class":808},[792,12173,12174],{"class":798},"           # 只跑 web\n",[792,12176,12177,12179,12181,12184,12186],{"class":794,"line":747},[792,12178,10007],{"class":804},[792,12180,12166],{"class":812},[792,12182,12183],{"class":808}," \"web...\"",[792,12185,11377],{"class":808},[792,12187,12188],{"class":798},"      # web 及其依赖\n",[792,12190,12191,12193,12195,12198,12200],{"class":794,"line":836},[792,12192,10007],{"class":804},[792,12194,12166],{"class":812},[792,12196,12197],{"class":808}," \"...web\"",[792,12199,11377],{"class":808},[792,12201,12202],{"class":798},"      # web 及其被依赖者\n",[571,12204,12206],{"id":12205},"npmrc-常用",".npmrc 常用",[784,12208,12210],{"className":6595,"code":12209,"language":6597,"meta":270,"style":270},"shamefully-hoist=true             # 兼容老包（临时用）\nstrict-peer-dependencies=false\nauto-install-peers=true\nnode-linker=hoisted               # 扁平常见兼容方案\n",[69,12211,12212,12217,12222,12227],{"__ignoreMap":270},[792,12213,12214],{"class":794,"line":795},[792,12215,12216],{},"shamefully-hoist=true             # 兼容老包（临时用）\n",[792,12218,12219],{"class":794,"line":271},[792,12220,12221],{},"strict-peer-dependencies=false\n",[792,12223,12224],{"class":794,"line":747},[792,12225,12226],{},"auto-install-peers=true\n",[792,12228,12229],{"class":794,"line":836},[792,12230,12231],{},"node-linker=hoisted               # 扁平常见兼容方案\n",[13,12233,12235],{"id":12234},"十一常见问题","十一、常见问题",[571,12237,12239,12240,12243],{"id":12238},"_1-err_ossl_evp_unsupportednode-17","1. ",[69,12241,12242],{},"ERR_OSSL_EVP_UNSUPPORTED","（Node 17+）",[173,12245,12246],{},"老项目 + 新 Node，OpenSSL 3 引起。",[784,12248,12250],{"className":786,"code":12249,"language":788,"meta":270,"style":270},"export NODE_OPTIONS=--openssl-legacy-provider\n# 或降级 Node 16\n",[69,12251,12252,12264],{"__ignoreMap":270},[792,12253,12254,12256,12259,12261],{"class":794,"line":795},[792,12255,7593],{"class":1036},[792,12257,12258],{"class":1043}," NODE_OPTIONS",[792,12260,7599],{"class":1036},[792,12262,12263],{"class":1043},"--openssl-legacy-provider\n",[792,12265,12266],{"class":794,"line":271},[792,12267,12268],{"class":798},"# 或降级 Node 16\n",[571,12270,12272,12273,12276],{"id":12271},"_2-eacces-权限错误","2. ",[69,12274,12275],{},"EACCES"," 权限错误",[173,12278,12279,12282],{},[43,12280,12281],{},"别用 sudo","，改 npm 全局目录：",[784,12284,12286],{"className":786,"code":12285,"language":788,"meta":270,"style":270},"mkdir -p ~\u002F.npm-global\nnpm config set prefix '~\u002F.npm-global'\necho 'export PATH=~\u002F.npm-global\u002Fbin:$PATH' >> ~\u002F.bashrc\nsource ~\u002F.bashrc\n",[69,12287,12288,12297,12311,12323],{"__ignoreMap":270},[792,12289,12290,12292,12294],{"class":794,"line":795},[792,12291,4094],{"class":804},[792,12293,2242],{"class":812},[792,12295,12296],{"class":808}," ~\u002F.npm-global\n",[792,12298,12299,12301,12303,12305,12308],{"class":794,"line":271},[792,12300,9805],{"class":804},[792,12302,809],{"class":808},[792,12304,3624],{"class":808},[792,12306,12307],{"class":808}," prefix",[792,12309,12310],{"class":808}," '~\u002F.npm-global'\n",[792,12312,12313,12315,12318,12321],{"class":794,"line":747},[792,12314,7585],{"class":4063},[792,12316,12317],{"class":808}," 'export PATH=~\u002F.npm-global\u002Fbin:$PATH'",[792,12319,12320],{"class":1036}," >>",[792,12322,7669],{"class":808},[792,12324,12325,12327],{"class":794,"line":836},[792,12326,7666],{"class":4063},[792,12328,7669],{"class":808},[571,12330,12332,12333,12336],{"id":12331},"_3-peer-dep-冲突npm-7","3. ",[69,12334,12335],{},"peer dep"," 冲突（npm 7+）",[784,12338,12340],{"className":786,"code":12339,"language":788,"meta":270,"style":270},"npm install --legacy-peer-deps    # 按 npm 6 行为忽略 peer 冲突\nnpm install --force               # 强制（危险）\n",[69,12341,12342,12354],{"__ignoreMap":270},[792,12343,12344,12346,12348,12351],{"class":794,"line":795},[792,12345,9805],{"class":804},[792,12347,3684],{"class":808},[792,12349,12350],{"class":812}," --legacy-peer-deps",[792,12352,12353],{"class":798},"    # 按 npm 6 行为忽略 peer 冲突\n",[792,12355,12356,12358,12360,12362],{"class":794,"line":271},[792,12357,9805],{"class":804},[792,12359,3684],{"class":808},[792,12361,2072],{"class":812},[792,12363,12364],{"class":798},"               # 强制（危险）\n",[571,12366,12368],{"id":12367},"_4-安装慢","4. 安装慢",[173,12370,12371],{},"先换源（见第一节）。如果还慢，看是不是在下载 binary：",[784,12373,12375],{"className":786,"code":12374,"language":788,"meta":270,"style":270},"npm install --verbose 2>&1 | grep -i \"http\"\n",[69,12376,12377],{"__ignoreMap":270},[792,12378,12379,12381,12383,12386,12388,12390,12392,12394],{"class":794,"line":795},[792,12380,9805],{"class":804},[792,12382,3684],{"class":808},[792,12384,12385],{"class":812}," --verbose",[792,12387,8146],{"class":1036},[792,12389,3865],{"class":1036},[792,12391,3868],{"class":804},[792,12393,1460],{"class":812},[792,12395,12396],{"class":808}," \"http\"\n",[173,12398,12399],{},"看到下载 electron \u002F puppeteer 之类的，就要配对应的 binary 镜像。",[571,12401,12403],{"id":12402},"_5-幽灵依赖","5. 幽灵依赖",[173,12405,12406,12407,12409],{},"代码用了没在 ",[69,12408,11196],{}," 里声明的包（因为被提升到顶层才碰巧能用）。",[173,12411,12412,12415,12416,3182,12419,12421],{},[43,12413,12414],{},"根治","：用 pnpm。",[43,12417,12418],{},"缓解",[69,12420,10934],{}," 核对，把用到的都显式声明。",[571,12423,12425],{"id":12424},"_6-ci-报-lock-不一致","6. CI 报 lock 不一致",[173,12427,12428,12429,3008,12431,12434,12435,12437,12438,12440,12441,12444],{},"用 ",[69,12430,11189],{},[69,12432,12433],{},"pnpm install --frozen-lockfile"," 时，",[69,12436,11196],{}," 与 lock 必须同步。本地改完 ",[69,12439,11196],{}," 一定要重跑一次 ",[69,12442,12443],{},"install"," 让 lock 更新，再提交。",[571,12446,12448],{"id":12447},"_7-强制项目使用某个包管理器","7. 强制项目使用某个包管理器",[784,12450,12452],{"className":3771,"code":12451,"language":3773,"meta":270,"style":270},"{\n  \"scripts\": {\n    \"preinstall\": \"npx only-allow pnpm\"\n  }\n}\n",[69,12453,12454,12458,12465,12475,12479],{"__ignoreMap":270},[792,12455,12456],{"class":794,"line":795},[792,12457,3780],{"class":1043},[792,12459,12460,12463],{"class":794,"line":271},[792,12461,12462],{"class":3785},"  \"scripts\"",[792,12464,11466],{"class":1043},[792,12466,12467,12470,12472],{"class":794,"line":747},[792,12468,12469],{"class":3785},"    \"preinstall\"",[792,12471,11474],{"class":1043},[792,12473,12474],{"class":3794},"\"npx only-allow pnpm\"\n",[792,12476,12477],{"class":794,"line":836},[792,12478,11502],{"class":1043},[792,12480,12481],{"class":794,"line":842},[792,12482,3827],{"class":1043},[571,12484,12486,12487,12490],{"id":12485},"_8-npm-audit-fix-force-引入-breaking-change","8. ",[69,12488,12489],{},"npm audit fix --force"," 引入 breaking change",[173,12492,12493,12496],{},[69,12494,12495],{},"--force"," 会跨越主版本升级。先看不 force 能修多少：",[784,12498,12500],{"className":786,"code":12499,"language":788,"meta":270,"style":270},"npm audit\nnpm audit fix\nnpm audit --production            # 只看生产依赖\n",[69,12501,12502,12509,12518],{"__ignoreMap":270},[792,12503,12504,12506],{"class":794,"line":795},[792,12505,9805],{"class":804},[792,12507,12508],{"class":808}," audit\n",[792,12510,12511,12513,12515],{"class":794,"line":271},[792,12512,9805],{"class":804},[792,12514,11947],{"class":808},[792,12516,12517],{"class":808}," fix\n",[792,12519,12520,12522,12524,12527],{"class":794,"line":747},[792,12521,9805],{"class":804},[792,12523,11947],{"class":808},[792,12525,12526],{"class":812}," --production",[792,12528,12529],{"class":798},"            # 只看生产依赖\n",[13,12531,12533],{"id":12532},"十二安全审计","十二、安全审计",[784,12535,12537],{"className":786,"code":12536,"language":788,"meta":270,"style":270},"npm audit\nyarn audit\npnpm audit\n",[69,12538,12539,12545,12551],{"__ignoreMap":270},[792,12540,12541,12543],{"class":794,"line":795},[792,12542,9805],{"class":804},[792,12544,12508],{"class":808},[792,12546,12547,12549],{"class":794,"line":271},[792,12548,9965],{"class":804},[792,12550,12508],{"class":808},[792,12552,12553,12555],{"class":794,"line":747},[792,12554,10007],{"class":804},[792,12556,12508],{"class":808},[3026,12558],{},[13,12560,3030],{"id":3030},[77,12562,12563,12570,12577,12584],{},[80,12564,12565,12566],{},"npm 文档：",[158,12567,12568],{"href":12568,"rel":12569,"target":165},"https:\u002F\u002Fdocs.npmjs.com\u002F",[162,163,164],[80,12571,12572,12573],{},"yarn v1：",[158,12574,12575],{"href":12575,"rel":12576,"target":165},"https:\u002F\u002Fclassic.yarnpkg.com\u002F",[162,163,164],[80,12578,12579,12580],{},"pnpm：",[158,12581,12582],{"href":12582,"rel":12583,"target":165},"https:\u002F\u002Fpnpm.io\u002Fzh\u002F",[162,163,164],[80,12585,8663,12586],{},[158,12587,8666],{"href":8666,"rel":12588,"target":165},[162,163,164],[2724,12590,12591],{},"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 pre.shiki code .sHkqI, html code.shiki .sHkqI{--shiki-default:#A6E22E}html pre.shiki code .s_Ekj, html code.shiki .s_Ekj{--shiki-default:#E6DB74}html pre.shiki code .s7s5_, html code.shiki .s7s5_{--shiki-default:#AE81FF}html pre.shiki code .snpHw, html code.shiki .snpHw{--shiki-default:#88846F}html pre.shiki code .s8I7P, html code.shiki .s8I7P{--shiki-default:#F92672}html pre.shiki code .sCdxs, html code.shiki .sCdxs{--shiki-default:#F8F8F2}html pre.shiki code .sYf5A, html code.shiki .sYf5A{--shiki-default:#66D9EF}html pre.shiki code .sOx1s, html code.shiki .sOx1s{--shiki-default:#66D9EF;--shiki-default-font-style:italic}html pre.shiki code .susgL, html code.shiki .susgL{--shiki-default:#CFCFC2}",{"title":270,"searchDepth":271,"depth":271,"links":12593},[12594,12604,12613,12614,12618,12619,12623,12627,12628,12632,12638,12652,12653],{"id":3107,"depth":271,"text":3108,"children":12595},[12596,12597,12598,12599,12600,12601,12602,12603],{"id":9794,"depth":747,"text":9795},{"id":9901,"depth":747,"text":9902},{"id":10028,"depth":747,"text":10029},{"id":10105,"depth":747,"text":10106},{"id":10155,"depth":747,"text":10156},{"id":10201,"depth":747,"text":10202},{"id":10246,"depth":747,"text":10247},{"id":10305,"depth":747,"text":10306},{"id":10387,"depth":271,"text":10388,"children":12605},[12606,12607,12608,12609,12610,12611,12612],{"id":10402,"depth":747,"text":10403},{"id":10468,"depth":747,"text":10469},{"id":10502,"depth":747,"text":10503},{"id":10536,"depth":747,"text":10537},{"id":10566,"depth":747,"text":10567},{"id":10609,"depth":747,"text":10610},{"id":10630,"depth":747,"text":10631},{"id":10693,"depth":271,"text":10694},{"id":11007,"depth":271,"text":11008,"children":12615},[12616,12617],{"id":11069,"depth":747,"text":11069},{"id":11151,"depth":747,"text":11152},{"id":11200,"depth":271,"text":11201},{"id":11277,"depth":271,"text":11278,"children":12620},[12621,12622],{"id":11281,"depth":747,"text":11281},{"id":11362,"depth":747,"text":11362},{"id":11439,"depth":271,"text":11440,"children":12624},[12625,12626],{"id":11443,"depth":747,"text":11444},{"id":11606,"depth":747,"text":11606},{"id":11677,"depth":271,"text":11678},{"id":11836,"depth":271,"text":11837,"children":12629},[12630,12631],{"id":11840,"depth":747,"text":11840},{"id":11923,"depth":747,"text":11923},{"id":11968,"depth":271,"text":11969,"children":12633},[12634,12635,12636,12637],{"id":11972,"depth":747,"text":11972},{"id":11995,"depth":747,"text":11923},{"id":12116,"depth":747,"text":12116},{"id":12205,"depth":747,"text":12206},{"id":12234,"depth":271,"text":12235,"children":12639},[12640,12642,12644,12646,12647,12648,12649,12650],{"id":12238,"depth":747,"text":12641},"1. ERR_OSSL_EVP_UNSUPPORTED（Node 17+）",{"id":12271,"depth":747,"text":12643},"2. EACCES 权限错误",{"id":12331,"depth":747,"text":12645},"3. peer dep 冲突（npm 7+）",{"id":12367,"depth":747,"text":12368},{"id":12402,"depth":747,"text":12403},{"id":12424,"depth":747,"text":12425},{"id":12447,"depth":747,"text":12448},{"id":12485,"depth":747,"text":12651},"8. npm audit fix --force 引入 breaking change",{"id":12532,"depth":271,"text":12533},{"id":3030,"depth":271,"text":3030},{},"\u002Fnode-package-managers-memo-2026-09-25",{"title":9784,"description":9789},"node-package-managers-memo-2026-09-25",[9805,9965,10007,12659,3095],"包管理","JkdpCYfPGT7iWzYMx8X-4vzuHBW9MP1FBF9nLBNfuew",{"id":12662,"title":12663,"author":8,"body":12664,"cover":3,"date":12889,"description":12668,"extension":284,"meta":12890,"navigation":286,"path":9764,"seo":12892,"stem":12893,"tags":12894,"__hash__":12898},"content\u002Fsite-design-compliance-2026-09-16.md","关于本站对照国办发〔2017〕47号文开展设计规范调整的说明",{"type":10,"value":12665,"toc":12882},[12666,12669,12673,12676,12679,12682,12685,12689,12695,12726,12732,12741,12747,12757,12761,12767,12773,12779,12785,12791,12795,12798,12801,12804,12808,12811,12814,12816,12821,12851,12856],[173,12667,12668],{},"为进一步规范本站页面展现形式，提升信息服务质量，根据《政府网站发展指引》（国办发〔2017〕47号）及其附件《网页设计规范》有关要求，结合《政府网站与政务新媒体检查指标》（国办秘函〔2019〕19号）有关考核标准，本站于2026年9月对整体设计进行系统性调整。现将调整依据及主要内容说明如下。",[13,12670,12672],{"id":12671},"一调整依据","一、调整依据",[173,12674,12675],{},"（一）《政府网站发展指引》（国办发〔2017〕47号）。该文件由国务院办公厅印发，是全国政府网站建设的基本规范，其中附件《网页设计规范》对网站的展现布局、地址链接、网页标签等提出了明确要求。",[173,12677,12678],{},"（二）《政府网站与政务新媒体检查指标》（国办秘函〔2019〕19号）。该文件明确了政府网站考核的单项否决指标和扣分指标，其中涉及页面加载时长、栏目更新情况、内容发布规范等具体要求。",[173,12680,12681],{},"（三）《政府网站集约化试点工作方案》（国办函〔2018〕71号）。该方案要求实现\"统一标准体系、统一技术平台、统一安全防护、统一运维监管\"，对站点技术架构和设计模式具有指导意义。",[173,12683,12684],{},"（四）山西省地方标准《政府网站集约化平台 网页设计规范》（DB14\u002FT 2544—2022）等行业性、地方性标准，作为本站在具体设计实施中的参考依据。",[13,12686,12688],{"id":12687},"二调整主要内容","二、调整主要内容",[173,12690,9136,12691,12694],{},[43,12692,12693],{},"规范色调使用","。规范要求\"确定1种主色调，总色调不宜超过3种\"。本站原设计围绕蓝色系展开了多个派生色，色值数量偏多。经调整，确立以深蓝（#015293）为主色调、白色为辅助色、红色（#e4393c）为强调色的三色体系，其余派生色统一收归为主色调的透明度变体，不再作为独立色值维护。",[173,12696,9147,12697,12700,12701,12704,12705,12707,12708,9447,12710,12707,12713,12715,12716,12719,12720,9447,12723,12725],{},[43,12698,12699],{},"统一字体字号","。规范要求\"同一类别的栏目和信息使用同一模板，统一字体、字号、行间距和布局\"。经排查，原设计在 ",[69,12702,12703],{},"GovPanel"," 标题、",[69,12706,9735],{}," 的 ",[69,12709,13],{},[69,12711,12712],{},"DocLayout",[69,12714,13],{}," 等位置存在字号不一致问题。本次调整将上述位置的字号统一为 ",[69,12717,12718],{},"--gov-fs-lg","，并清理了 ",[69,12721,12722],{},"SiteFooter",[69,12724,12712],{}," 中重复定义的样式规则。",[173,12727,9173,12728,12731],{},[43,12729,12730],{},"优化加载性能","。规范要求\"页面加载时长不宜超过3秒\"，检查指标将\"网站打不开次数累计占比超过5%\"列为单项否决。本站原内容层采用构建时全量内联方式，随内容数量增长将影响首屏体积。本次调整改为按需异步加载，配合空闲时预加载后续路由组件的方式，兼顾首屏速度与导航体验。",[173,12733,9190,12734,12737,12738,12740],{},[43,12735,12736],{},"完善内容展示","。规范要求\"网站内容要清晰显示发布时间，时间格式为YYYY—MM—DD HH:MM\"。本站原列表项仅显示日期，本次调整在内容层增加 ",[69,12739,8224],{}," 字段，列表与详情页均按规范格式显示完整时间。",[173,12742,9197,12743,12746],{},[43,12744,12745],{},"健全栏目管理","。规范要求\"栏目设置应科学合理，避免出现空白栏目\"。本次调整新增\"资源\"栏目，统一收录开发工具、组件库等资源信息，并对文章列表、资源列表、搜索页的展示规则进行一致性梳理，明确各栏目数据来源，避免出现重复或空白栏目。",[173,12748,9204,12749,12752,12753,12756],{},[43,12750,12751],{},"扩展检索范围","。在原站内搜索仅覆盖文章的基础上，新增资源检索，统一为 ",[69,12754,12755],{},"\u002Fsearch"," 页面，支持全部、文章、资源三类筛选，并可分享、可回退、可刷新，符合规范中\"提供信息检索功能\"的相关要求。",[13,12758,12760],{"id":12759},"三调整后效果","三、调整后效果",[173,12762,9136,12763,12766],{},[43,12764,12765],{},"色调统一","。全站主色调、辅助色、强调色使用规范，页面整体观感协调一致。",[173,12768,9147,12769,12772],{},[43,12770,12771],{},"字号规范","。同级标题字号一致，正文、辅助信息、数字等各级字号层级分明，符合用户阅读习惯。",[173,12774,9173,12775,12778],{},[43,12776,12777],{},"加载优化","。首屏体积得到控制，配合路由预加载，主流网络环境下页面加载时长稳定控制在规范要求以内。",[173,12780,9190,12781,12784],{},[43,12782,12783],{},"内容完整","。发布时间、信息来源、分类标签等要素展示完整，符合规范对内容展示的要求。",[173,12786,9197,12787,12790],{},[43,12788,12789],{},"结构清晰","。头部标识区、中部内容区、底部功能区划分明确，底部功能区列明网站名称、备案编号、联系方式等信息。",[13,12792,12794],{"id":12793},"四后续工作","四、后续工作",[173,12796,12797],{},"（一）持续跟踪国家关于政府网站建设的相关文件更新情况，及时对照调整本站设计。",[173,12799,12800],{},"（二）定期对站点进行自查，重点检查栏目更新、内容发布、页面性能等考核指标涉及的内容。",[173,12802,12803],{},"（三）结合用户反馈，进一步优化站内检索、无障碍访问、移动端适配等体验。",[13,12805,12807],{"id":12806},"五说明","五、说明",[173,12809,12810],{},"本站为个人技术项目，非政府网站，本站视觉设计参照政府网站规范进行，旨在为用户提供规范、清晰、易读的信息服务。所有内容仅代表个人观点，与任何机构无关。",[173,12812,12813],{},"特此说明。",[3026,12815],{},[173,12817,12818],{},[43,12819,12820],{},"附：主要参考文件",[77,12822,9400,12823,9400,12830,9400,12837,9400,12844],{},[80,12824,12825],{},[158,12826,12829],{"href":12827,"target":165,"rel":12828},"https:\u002F\u002Fwww.gov.cn\u002Fzhengce\u002Fcontent\u002F2017-06\u002F08\u002Fcontent_5200760.htm",[163],"国务院办公厅关于印发政府网站发展指引的通知（国办发〔2017〕47号）",[80,12831,12832],{},[158,12833,12836],{"href":12834,"target":165,"rel":12835},"https:\u002F\u002Fwww.gov.cn\u002Fzhengce\u002Fcontent\u002F2019-04\u002F18\u002Fcontent_5384134.htm",[163],"国务院办公厅秘书局关于印发政府网站与政务新媒体检查指标、监管工作年度考核指标的通知（国办秘函〔2019〕19号）",[80,12838,12839],{},[158,12840,12843],{"href":12841,"target":165,"rel":12842},"https:\u002F\u002Fwww.gov.cn\u002Fgongbao\u002Fcontent\u002F2018\u002Fcontent_5343741.htm",[163],"国务院办公厅关于印发《政府网站集约化试点工作方案》的通知（国办函〔2018〕71号）",[80,12845,12846],{},[158,12847,12850],{"href":12848,"target":165,"rel":12849},"https:\u002F\u002Fba.sacinfo.org.cn\u002FstdDetail\u002Ff0d57c3b3c953827ce262a46b434d20685261c7714f6a0060ce1c7467868eae2",[163],"《政府网站集约化平台 网页设计规范》（DB14\u002FT 2544—2022）",[173,12852,12853],{},[43,12854,12855],{},"简要说明",[77,12857,12858,12864,12870,12876],{},[80,12859,12860,12863],{},[43,12861,12862],{},"国办发〔2017〕47号","：国务院办公厅2017年5月15日成文，6月8日发布，附件含《网页设计规范》。",[80,12865,12866,12869],{},[43,12867,12868],{},"国办秘函〔2019〕19号","：国务院办公厅秘书局2019年4月1日成文，4月18日发布，含单项否决指标和扣分、加分指标。",[80,12871,12872,12875],{},[43,12873,12874],{},"国办函〔2018〕71号","：国务院办公厅2018年10月27日成文，11月9日发布，要求“统一标准体系、统一技术平台”等。",[80,12877,12878,12881],{},[43,12879,12880],{},"DB14\u002FT 2544—2022","：山西省地方标准，2022年9月30日发布，12月30日实施，技术归口为山西省电子政务信息标准化技术委员会。",{"title":270,"searchDepth":271,"depth":271,"links":12883},[12884,12885,12886,12887,12888],{"id":12671,"depth":271,"text":12672},{"id":12687,"depth":271,"text":12688},{"id":12759,"depth":271,"text":12760},{"id":12793,"depth":271,"text":12794},{"id":12806,"depth":271,"text":12807},"2026-09-16",{"summary":12891},"依据《政府网站发展指引》（国办发〔2017〕47号）及其附件《网页设计规范》，本站于2026年9月对站点色调、字体、内容加载、栏目结构等进行系统性调整，现将有关情况说明如下。",{"title":12663,"description":12668},"site-design-compliance-2026-09-16",[12895,12896,12897],"政务规范","设计规范","公告","I50wAQqluw6aWoAAxOoH_vbyt8zi5pxzlknAQfy5hiQ",{"id":12900,"title":12901,"author":8,"body":12902,"cover":3,"date":9234,"description":12906,"extension":284,"meta":13318,"navigation":286,"path":13319,"seo":13320,"stem":13321,"tags":13322,"__hash__":13325},"content\u002Fsite-migration-compliance-2026-10-03.md","关于本站开展技术架构迁移的说明",{"type":10,"value":12903,"toc":13311},[12904,12907,12911,12917,12931,12937,12943,12946,12950,12956,12970,12988,12990,13014,13016,13019,13021,13030,13032,13035,13045,13078,13085,13091,13105,13108,13114,13146,13149,13155,13179,13186,13190,13196,13202,13208,13214,13220,13222,13225,13228,13234,13237,13239,13242,13244,13246,13250,13280,13284,13308],[173,12905,12906],{},"为进一步降低站点运行成本、提升内容可维护性、扩大浏览器兼容范围，本站于2026年9月至10月对底层技术架构进行系统性迁移。本次迁移不涉及内容层与视觉层的整体改版，但涉及渲染方式、组件体系、样式组织、URL 规范、构建流程等基础机制的全面调整。现将迁移背景、主要内容及后续安排说明如下。",[13,12908,12910],{"id":12909},"一迁移背景","一、迁移背景",[173,12912,9136,12913,12916],{},[43,12914,12915],{},"原架构的局限","。本站原采用 Vue 3 单页应用方案，构建产物依赖客户端 JavaScript 渲染。该方案在交互密集的应用中具有优势，但对以内容发布为主要目的的站点而言存在以下局限：",[77,12918,12919,12922,12925,12928],{},[80,12920,12921],{},"首屏渲染依赖脚本执行，禁用脚本的浏览器无法获取内容；",[80,12923,12924],{},"对早期浏览器（如 Internet Explorer 系列）兼容成本极高；",[80,12926,12927],{},"内容以组件形式组织，写作需要掌握 Vue 模板语法，创作门槛较高；",[80,12929,12930],{},"每次内容更新均需重新打包全量资源，发布流程偏重。",[173,12932,9147,12933,12936],{},[43,12934,12935],{},"本站定位的变化","。随着本站内容以\"备忘录\"\"规范说明\"\"公告\"等长文为主，交互需求趋弱，静态内容发布需求趋强。原架构与站点定位之间的适配度下降。",[173,12938,9173,12939,12942],{},[43,12940,12941],{},"兼容性要求","。本站明确将浏览器兼容范围扩展至 Internet Explorer 7 及以上的所有浏览器，原架构基于现代 JavaScript 特性，无法覆盖该范围。",[173,12944,12945],{},"基于以上三点，本站决定对技术架构进行调整。",[13,12947,12949],{"id":12948},"二迁移主要内容","二、迁移主要内容",[173,12951,9136,12952,12955],{},[43,12953,12954],{},"构建体系迁移","。由 Vue 3 + Vite 方案调整为 Eleventy 3 + Nunjucks 方案。Eleventy 为静态站点生成器，在构建阶段完成全部页面渲染，输出纯 HTML、CSS 与少量辅助脚本。迁移后：",[77,12957,12958,12961,12964,12967],{},[80,12959,12960],{},"所有页面均为预渲染的静态 HTML；",[80,12962,12963],{},"站点可部署于任意静态托管服务；",[80,12965,12966],{},"构建产物不含应用级 JavaScript 框架代码；",[80,12968,12969],{},"内容更新仅重新生成对应页面。",[173,12971,9147,12972,12975,12976,12979,12980,12983,12984,12987],{},[43,12973,12974],{},"组件体系迁移","。由 Vue 单文件组件调整为 Nunjucks macro。原 ",[69,12977,12978],{},".vue"," 文件中以 ",[69,12981,12982],{},"props"," 传参、以 ",[69,12985,12986],{},"slot"," 分发内容的方式，统一改为 Nunjucks 的宏调用，参数以字典形式传入。以按钮组件为例，原写法为：",[173,12989,8761],{},[784,12991,12993],{"className":9282,"code":12992,"language":9284,"meta":270,"style":270},"\u003CGovButton variant=\"primary\">提交\u003C\u002FGovButton>\n",[69,12994,12995],{"__ignoreMap":270},[792,12996,12997,12999,13001,13003,13005,13007,13010,13012],{"class":794,"line":795},[792,12998,1186],{"class":1043},[792,13000,9377],{"class":1036},[792,13002,9380],{"class":804},[792,13004,7599],{"class":1043},[792,13006,9385],{"class":808},[792,13008,13009],{"class":1043},">提交\u003C\u002F",[792,13011,9377],{"class":1036},[792,13013,1748],{"class":1043},[173,13015,8785],{},[173,13017,13018],{},"迁移后写法为：",[173,13020,8761],{},[784,13022,13024],{"className":8764,"code":13023,"language":8766,"meta":270,"style":270},"{{ button({ text: \"提交\", type: \"primary\" }) }}\n",[69,13025,13026],{"__ignoreMap":270},[792,13027,13028],{"class":794,"line":795},[792,13029,13023],{},[173,13031,8785],{},[173,13033,13034],{},"两种方式在职责上等价：均实现\"一处定义、多处引用\"。差异在于前者运行于客户端，后者运行于构建时。",[173,13036,9173,13037,13040,13041,13044],{},[43,13038,13039],{},"样式体系重组","。原样式以 Vue 单文件组件内的 ",[69,13042,13043],{},"\u003Cstyle scoped>"," 形式就近维护，存在重复定义、难以全局复用的问题。本次调整将样式按用途分为三类：",[77,13046,13047,13053,13066],{},[80,13048,13049,13052],{},[43,13050,13051],{},"基础样式","：重置、变量、布局，全站始终加载；",[80,13054,13055,13058,13059,9447,13062,13065],{},[43,13056,13057],{},"组件样式","：按组件粒度拆分独立文件，如 ",[69,13060,13061],{},"button.css",[69,13063,13064],{},"tag.css","；",[80,13067,13068,13071,13072,9447,13075,183],{},[43,13069,13070],{},"页面样式","：按页面粒度独立维护，如 ",[69,13073,13074],{},"post.css",[69,13076,13077],{},"archive.css",[173,13079,13080,13081,13084],{},"每个页面在 frontmatter 中声明所需样式文件，构建时按需拼装 ",[69,13082,13083],{},"\u003Clink>"," 标签，避免全站加载无关样式。",[173,13086,9190,13087,13090],{},[43,13088,13089],{},"URL 规范调整","。原标签页 URL 使用原始中文字符，存在编码歧义、跨平台兼容性差的问题。本次调整引入拼音转换规则，将中文标签统一转换为带声调数字的拼音形式，例如：",[77,13092,13093,13099],{},[80,13094,13095,13096],{},"原 URL：",[69,13097,13098],{},"\u002Ftags\u002F文章\u002F",[80,13100,13101,13102],{},"新 URL：",[69,13103,13104],{},"\u002Ftags\u002Fwen2-zhang1\u002F",[173,13106,13107],{},"针对拼音重名（如\"文章\"与\"纹章\"拼音相同）的情况，采用构建时预计算映射表的方式，按标签字典序为冲突项添加数字后缀，确保每条 URL 唯一。",[173,13109,9197,13110,13113],{},[43,13111,13112],{},"浏览器兼容扩展","。本次迁移明确将兼容范围扩展至 Internet Explorer 7 及以上版本。主要策略包括：",[77,13115,13116,13119,13122,13129,13143],{},[80,13117,13118],{},"输出产物不含 ES6+ 语法，脚本以 ES5 形式书写；",[80,13120,13121],{},"使用 jQuery 1.12.4 作为 DOM 操作与 AJAX 的兼容层；",[80,13123,13124,13125,13128],{},"补充 ",[69,13126,13127],{},"ie7.css"," 专用补丁样式，通过条件注释仅向 IE7 及以下加载；",[80,13130,13131,13132,7800,13135,13138,13139,13142],{},"布局以 ",[69,13133,13134],{},"float",[69,13136,13137],{},"inline-block"," 为基准，",[69,13140,13141],{},"flex"," 仅作现代浏览器增强；",[80,13144,13145],{},"不使用 CSS 变量作为唯一值来源，均带 fallback。",[173,13147,13148],{},"需要说明的是，IE7 用户仅能获得静态内容阅读能力，动态功能（如评论、检索、发布后台）不在此兼容范围内。",[173,13150,9204,13151,13154],{},[43,13152,13153],{},"工程化完善","。新增构建前清理步骤，每次构建均先删除旧产物目录，避免历史文件残留。同时补充：",[77,13156,13157,13164,13170,13176],{},[80,13158,13159,13160,13163],{},"站点地图（",[69,13161,13162],{},"sitemap.xml","）；",[80,13165,13166,13167,13163],{},"内容订阅（",[69,13168,13169],{},"feed.xml",[80,13171,13172,13173,13163],{},"搜索引擎规则（",[69,13174,13175],{},"robots.txt",[80,13177,13178],{},"自定义 404 页面。",[173,13180,13181,13182,13185],{},"（七）",[43,13183,13184],{},"内容创作方式调整","。文章由 Vue 组件形式调整为标准 Markdown 文件，正文中可直接引用 Nunjucks 宏、读取站点全局数据，无需编写脚本逻辑。组件调用与 Markdown 语法可混用，写作门槛降低。",[13,13187,13189],{"id":13188},"三迁移后效果","三、迁移后效果",[173,13191,9136,13192,13195],{},[43,13193,13194],{},"内容为先","。页面以纯 HTML 交付，禁用脚本的浏览器、早期浏览器、文本浏览器均可正常阅读。",[173,13197,9147,13198,13201],{},[43,13199,13200],{},"构建轻量","。站点不再包含应用级 JavaScript 框架，构建产物体积显著下降，构建时间缩短。",[173,13203,9173,13204,13207],{},[43,13205,13206],{},"样式可控","。样式按页面按需加载，避免了全站样式的冗余加载，也便于后续按组件粒度调整。",[173,13209,9190,13210,13213],{},[43,13211,13212],{},"URL 稳定","。标签、归档、文章等各类页面 URL 规范统一，便于分享、收藏与搜索引擎收录。",[173,13215,9197,13216,13219],{},[43,13217,13218],{},"维护便利","。新增文章仅需添加 Markdown 文件，无需改动路由、组件或构建脚本。",[13,13221,12794],{"id":12793},[173,13223,13224],{},"（一）逐步将原站其他栏目内容迁移至新架构，保持 URL 结构一致性。",[173,13226,13227],{},"（二）针对现代浏览器补充增强功能，例如评论、检索、阅读进度指示等，以渐进增强方式提供，不影响基础阅读。",[173,13229,13230,13231,13233],{},"（三）持续监测 IE7 等早期浏览器下的可读性，发现问题及时在 ",[69,13232,13127],{}," 中补充补丁。",[173,13235,13236],{},"（四）完善发布流程，探索基于 Cloudflare Workers 与 GitHub API 的在线发布方案，降低内容维护的技术门槛。",[13,13238,12807],{"id":12806},[173,13240,13241],{},"本站为个人技术项目，本次迁移属技术架构调整，不涉及任何机构或组织的立场表达。视觉设计仍参照政府网站规范进行，旨在为用户提供规范、清晰、易读的信息服务。所有内容仅代表个人观点，与任何机构无关。",[173,13243,12813],{},[3026,13245],{},[173,13247,13248],{},[43,13249,12820],{},[77,13251,9400,13252,9400,13259,9400,13266,9400,13273],{},[80,13253,13254],{},[158,13255,13258],{"href":13256,"target":165,"rel":13257},"https:\u002F\u002Fwww.11ty.dev\u002Fdocs\u002F",[163],"Eleventy 官方文档",[80,13260,13261],{},[158,13262,13265],{"href":13263,"target":165,"rel":13264},"https:\u002F\u002Fmozilla.github.io\u002Fnunjucks\u002F",[163],"Nunjucks 模板引擎文档",[80,13267,13268],{},[158,13269,13272],{"href":13270,"target":165,"rel":13271},"https:\u002F\u002Fapi.jquery.com\u002F",[163],"jQuery 1.12.4 API 文档",[80,13274,13275],{},[158,13276,13279],{"href":13277,"target":165,"rel":13278},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fzh-CN\u002Fdocs\u002FWeb\u002FHTML\u002FConditional_comments",[163],"MDN：条件注释（Conditional comments）",[173,13281,13282],{},[43,13283,12855],{},[77,13285,13286,13291,13296,13302],{},[80,13287,13288,13290],{},[43,13289,9243],{},"：静态站点生成器，构建时渲染全部页面，输出纯 HTML。",[80,13292,13293,13295],{},[43,13294,9241],{},"：Mozilla 开发的 JavaScript 模板引擎，本站用于组件化与数据渲染。",[80,13297,13298,13301],{},[43,13299,13300],{},"jQuery 1.12.4","：jQuery 1.x 系列末版，兼容 IE6 及以上浏览器。",[80,13303,13304,13307],{},[43,13305,13306],{},"条件注释","：Internet Explorer 专属的 HTML 注释语法，用于向特定版本 IE 加载专用资源。",[2724,13309,13310],{},"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 pre.shiki code .sCdxs, html code.shiki .sCdxs{--shiki-default:#F8F8F2}html pre.shiki code .s8I7P, html code.shiki .s8I7P{--shiki-default:#F92672}html pre.shiki code .sHkqI, html code.shiki .sHkqI{--shiki-default:#A6E22E}html pre.shiki code .s_Ekj, html code.shiki .s_Ekj{--shiki-default:#E6DB74}",{"title":270,"searchDepth":271,"depth":271,"links":13312},[13313,13314,13315,13316,13317],{"id":12909,"depth":271,"text":12910},{"id":12948,"depth":271,"text":12949},{"id":13188,"depth":271,"text":13189},{"id":12793,"depth":271,"text":12794},{"id":12806,"depth":271,"text":12807},{},"\u002Fsite-migration-compliance-2026-10-03",{"title":12901,"description":12906},"site-migration-compliance-2026-10-03",[13323,13324,12897],"技术架构","迁移","I5WZy1gbyyF-BrpyA0tPrpwRa21nFwadDoAgqXlaHCo",{"id":13327,"title":13328,"author":13329,"body":13331,"cover":13363,"date":13364,"description":13365,"extension":284,"meta":13366,"navigation":286,"path":13367,"seo":13368,"stem":2754,"tags":13369,"__hash__":13370},"content\u002Ftest.md","这是一篇测试文章",[8,13330],"aaa",{"type":10,"value":13332,"toc":13360},[13333,13339,13344,13347,13355],[173,13334,13335,13336,183],{},"这是文章的正文内容，",[43,13337,13338],{},"支持完整的 Markdown 语法",[13340,13341,13343],"h1",{"id":13342},"_111","111",[13,13345,13346],{"id":13346},"二级标题测试",[77,13348,13349,13352],{},[80,13350,13351],{},"列表项 1",[80,13353,13354],{},"列表项 2",[189,13356,13357],{},[173,13358,13359],{},"这是一段引用。",{"title":270,"searchDepth":271,"depth":271,"links":13361},[13362],{"id":13346,"depth":271,"text":13346},"https:\u002F\u002Fcn.bing.com\u002Fth?id=OHR.BubblesAbraham_ZH-CN7203734882_UHD.jpg&pid=hp&w=1920","2026-11-14 22:25","这是文章的正文内容，支持完整的 Markdown 语法。",{},"\u002Ftest",{"title":13328,"description":13365},[5324,5335],"ClhEGBAZ4rpnB2R8jEjH4d5WkqNl1HEfKoXBUr79Ins",1794733995719]