[{"data":1,"prerenderedAt":13371},["ShallowReactive",2],{"sidebar-page":3,"archive-posts":4},null,[5,66,594,1048,3354,8993,11872,12402,12632,12894,13082],{"id":6,"title":7,"author":8,"body":11,"cover":53,"date":54,"description":55,"extension":56,"meta":57,"navigation":58,"path":59,"seo":60,"stem":61,"tags":62,"__hash__":65},"content\u002Ftest.md","这是一篇测试文章",[9,10],"AeYunDian","aaa",{"type":12,"value":13,"toc":48},"minimark",[14,23,28,32,42],[15,16,17,18,22],"p",{},"这是文章的正文内容，",[19,20,21],"strong",{},"支持完整的 Markdown 语法","。",[24,25,27],"h1",{"id":26},"_111","111",[29,30,31],"h2",{"id":31},"二级标题测试",[33,34,35,39],"ul",{},[36,37,38],"li",{},"列表项 1",[36,40,41],{},"列表项 2",[43,44,45],"blockquote",{},[15,46,47],{},"这是一段引用。",{"title":49,"searchDepth":50,"depth":50,"links":51},"",2,[52],{"id":31,"depth":50,"text":31},"https:\u002F\u002Fcn.bing.com\u002Fth?id=OHR.BubblesAbraham_ZH-CN7203734882_UHD.jpg&pid=hp&w=1920","2026-11-14 22:25","这是文章的正文内容，支持完整的 Markdown 语法。","md",{},true,"\u002Ftest",{"title":7,"description":55},"test",[63,64],"1","2","ClhEGBAZ4rpnB2R8jEjH4d5WkqNl1HEfKoXBUr79Ins",{"id":67,"title":68,"author":9,"body":69,"cover":3,"date":583,"description":584,"extension":56,"meta":585,"navigation":58,"path":586,"seo":587,"stem":588,"tags":589,"__hash__":593},"content\u002Fmarkdown-nunjucks-usage-2026-09-18.md","关于在 Markdown 中嵌入 Nunjucks 组件的说明",{"type":12,"value":70,"toc":574},[71,79,83,86,89,116,119,122,126,129,131,151,153,160,163,166,170,173,175,207,209,212,219,223,226,228,247,249,252,255,261,264,266,285,287,290,295,299,310,312,354,356,478,482,493,500,502,517,519,536,543,550,564,568,571],[15,72,73,74,78],{},"本站的 ",[75,76,77],"code",{},".md"," 文件由 Eleventy 的 Nunjucks 引擎在构建时编译。正文中的 Nunjucks 模板语法会被解析执行，组件以 macro 的形式调用。现将使用方法说明如下。",[29,80,82],{"id":81},"一基本用法","一、基本用法",[15,84,85],{},"在 frontmatter 之后，正文中直接书写 Nunjucks 语法即可。使用组件前，需要先从组件文件导入对应的 macro：",[15,87,88],{},"{% raw %}",[90,91,95],"pre",{"className":92,"code":93,"language":94,"meta":49,"style":49},"language-njk shiki shiki-themes monokai","{% from \"components\u002Fbutton.njk\" import button %}\n\n{{ button({ text: \"阅读全文\", href: \"\u002Fposts\u002Fhello\u002F\", type: \"primary\" }) }}\n","njk",[75,96,97,105,110],{"__ignoreMap":49},[98,99,102],"span",{"class":100,"line":101},"line",1,[98,103,104],{},"{% from \"components\u002Fbutton.njk\" import button %}\n",[98,106,107],{"class":100,"line":50},[98,108,109],{"emptyLinePlaceholder":58},"\n",[98,111,113],{"class":100,"line":112},3,[98,114,115],{},"{{ button({ text: \"阅读全文\", href: \"\u002Fposts\u002Fhello\u002F\", type: \"primary\" }) }}\n",[15,117,118],{},"{% endraw %}",[15,120,121],{},"渲染结果是一个带样式的按钮链接。正文中的 Nunjucks 语法与 Markdown 可以混用，不会相互干扰。",[29,123,125],{"id":124},"二条件渲染","二、条件渲染",[15,127,128],{},"Nunjucks 的 if 标签用于根据 frontmatter 或站点数据决定是否输出某段内容。",[15,130,88],{},[90,132,134],{"className":92,"code":133,"language":94,"meta":49,"style":49},"{% if description %}\n\u003Cp>本文摘要：{{ description }}\u003C\u002Fp>\n{% endif %}\n",[75,135,136,141,146],{"__ignoreMap":49},[98,137,138],{"class":100,"line":101},[98,139,140],{},"{% if description %}\n",[98,142,143],{"class":100,"line":50},[98,144,145],{},"\u003Cp>本文摘要：{{ description }}\u003C\u002Fp>\n",[98,147,148],{"class":100,"line":112},[98,149,150],{},"{% endif %}\n",[15,152,118],{},[15,154,155,156,159],{},"实际效果：本页的 ",[75,157,158],{},"description"," 有值，所以下面的摘要会显示出来。",[15,161,162],{},"{% if description %}",[15,164,165],{},"本文摘要：{{ description }}",[29,167,169],{"id":168},"三循环渲染","三、循环渲染",[15,171,172],{},"for 标签用于遍历数组，比如站点导航、文章标签。",[15,174,88],{},[90,176,178],{"className":92,"code":177,"language":94,"meta":49,"style":49},"\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",[75,179,180,185,190,195,201],{"__ignoreMap":49},[98,181,182],{"class":100,"line":101},[98,183,184],{},"\u003Cul>\n",[98,186,187],{"class":100,"line":50},[98,188,189],{},"{% for item in site.navigation %}\n",[98,191,192],{"class":100,"line":112},[98,193,194],{},"  \u003Cli>\u003Ca href=\"{{ item.url }}\">{{ ui.nav[item.key] }}\u003C\u002Fa>\u003C\u002Fli>\n",[98,196,198],{"class":100,"line":197},4,[98,199,200],{},"{% endfor %}\n",[98,202,204],{"class":100,"line":203},5,[98,205,206],{},"\u003C\u002Ful>\n",[15,208,118],{},[15,210,211],{},"输出为：",[90,213,217],{"className":214,"code":177,"language":216},[215],"language-text","text",[75,218,177],{"__ignoreMap":49},[29,220,222],{"id":221},"四嵌入组件","四、嵌入组件",[15,224,225],{},"本站提供的组件均可在正文中直接调用。先导入，再调用：",[15,227,88],{},[90,229,231],{"className":92,"code":230,"language":94,"meta":49,"style":49},"{% from \"components\u002Falert.njk\" import alert %}\n\n{{ alert({ type: \"info\", title: \"提示\", content: \"这是一条信息。\" }) }}\n",[75,232,233,238,242],{"__ignoreMap":49},[98,234,235],{"class":100,"line":101},[98,236,237],{},"{% from \"components\u002Falert.njk\" import alert %}\n",[98,239,240],{"class":100,"line":50},[98,241,109],{"emptyLinePlaceholder":58},[98,243,244],{"class":100,"line":112},[98,245,246],{},"{{ alert({ type: \"info\", title: \"提示\", content: \"这是一条信息。\" }) }}\n",[15,248,118],{},[15,250,251],{},"实际渲染效果：",[15,253,254],{},"{% from \"components\u002Falert.njk\" import alert %}",[15,256,257],{},[258,259],"binding",{"value":260},"alert({ type: \"info\", title: \"提示\", content: \"这是一条信息。\" })",[15,262,263],{},"标签组件同理：",[15,265,88],{},[90,267,269],{"className":92,"code":268,"language":94,"meta":49,"style":49},"{% from \"components\u002Ftag.njk\" import tag %}\n\n{{ tag({ text: \"Eleventy\", href: \"\u002Ftags\u002Feleventy\u002F\", color: \"default\" }) }}\n",[75,270,271,276,280],{"__ignoreMap":49},[98,272,273],{"class":100,"line":101},[98,274,275],{},"{% from \"components\u002Ftag.njk\" import tag %}\n",[98,277,278],{"class":100,"line":50},[98,279,109],{"emptyLinePlaceholder":58},[98,281,282],{"class":100,"line":112},[98,283,284],{},"{{ tag({ text: \"Eleventy\", href: \"\u002Ftags\u002Feleventy\u002F\", color: \"default\" }) }}\n",[15,286,118],{},[15,288,289],{},"{% from \"components\u002Ftag.njk\" import tag %}",[15,291,292],{},[258,293],{"value":294},"tag({ text: \"Eleventy\", href: \"\u002Ftags\u002Feleventy\u002F\", color: \"default\" })",[29,296,298],{"id":297},"五组件参数","五、组件参数",[15,300,301,302,305,306,309],{},"所有组件都以",[19,303,304],{},"字典","形式传参，可选的键取决于组件定义。以 ",[75,307,308],{},"button"," 为例：",[15,311,88],{},[90,313,315],{"className":92,"code":314,"language":94,"meta":49,"style":49},"{{ button({\n  text: \"提交\",\n  type: \"primary\",\n  size: \"lg\",\n  block: true,\n  disabled: false\n}) }}\n",[75,316,317,322,327,332,337,342,348],{"__ignoreMap":49},[98,318,319],{"class":100,"line":101},[98,320,321],{},"{{ button({\n",[98,323,324],{"class":100,"line":50},[98,325,326],{},"  text: \"提交\",\n",[98,328,329],{"class":100,"line":112},[98,330,331],{},"  type: \"primary\",\n",[98,333,334],{"class":100,"line":197},[98,335,336],{},"  size: \"lg\",\n",[98,338,339],{"class":100,"line":203},[98,340,341],{},"  block: true,\n",[98,343,345],{"class":100,"line":344},6,[98,346,347],{},"  disabled: false\n",[98,349,351],{"class":100,"line":350},7,[98,352,353],{},"}) }}\n",[15,355,118],{},[357,358,359,375],"table",{},[360,361,362],"thead",{},[363,364,365,369,372],"tr",{},[366,367,368],"th",{},"参数",[366,370,371],{},"类型",[366,373,374],{},"说明",[376,377,378,391,410,434,453,466],"tbody",{},[363,379,380,385,388],{},[381,382,383],"td",{},[75,384,216],{},[381,386,387],{},"string",[381,389,390],{},"按钮文字",[363,392,393,398,400],{},[381,394,395],{},[75,396,397],{},"href",[381,399,387],{},[381,401,402,403,406,407],{},"有值时渲染为 ",[75,404,405],{},"\u003Ca>","，否则为 ",[75,408,409],{},"\u003Cbutton>",[363,411,412,417,419],{},[381,413,414],{},[75,415,416],{},"type",[381,418,387],{},[381,420,421,424,425,424,428,424,431],{},[75,422,423],{},"primary"," \u002F ",[75,426,427],{},"secondary",[75,429,430],{},"success",[75,432,433],{},"danger",[363,435,436,441,443],{},[381,437,438],{},[75,439,440],{},"size",[381,442,387],{},[381,444,445,424,448,424,450],{},[75,446,447],{},"sm",[75,449,56],{},[75,451,452],{},"lg",[363,454,455,460,463],{},[381,456,457],{},[75,458,459],{},"block",[381,461,462],{},"boolean",[381,464,465],{},"是否占满整行",[363,467,468,473,475],{},[381,469,470],{},[75,471,472],{},"disabled",[381,474,462],{},[381,476,477],{},"是否禁用",[29,479,481],{"id":480},"六注意事项","六、注意事项",[15,483,484,485,488,489,492],{},"（一）",[19,486,487],{},"组件需要显式导入","。Nunjucks 的 macro 不像 Vue 组件那样自动注册，必须在文章里用 ",[75,490,491],{},"from ... import ..."," 后再调用。",[15,494,495,496,499],{},"（二）",[19,497,498],{},"字典里不能嵌套双花括号","。以下写法是错的——字典内部不能再写模板表达式，需要先 set 再引用：",[15,501,88],{},[90,503,505],{"className":92,"code":504,"language":94,"meta":49,"style":49},"{% set href = \"\u002Ftags\u002F\" + (t | tagSlug) + \"\u002F\" %}\n{{ tag({ text: t, href: href }) }}\n",[75,506,507,512],{"__ignoreMap":49},[98,508,509],{"class":100,"line":101},[98,510,511],{},"{% set href = \"\u002Ftags\u002F\" + (t | tagSlug) + \"\u002F\" %}\n",[98,513,514],{"class":100,"line":50},[98,515,516],{},"{{ tag({ text: t, href: href }) }}\n",[15,518,118],{},[15,520,521,522,525,526,529,530,532,533,22],{},"（三）",[19,523,524],{},"Markdown 里的 shell 语法可能被误解析","。Nunjucks 会把花括号加井号当作注释开始标记，shell 脚本里取字符串长度的那种写法会触发 ",[75,527,528],{},"expected end of comment"," 错误。解决办法是用 ",[75,531,88],{}," 包裹那一行，或者改用等价的 shell 命令，例如 ",[75,534,535],{},"expr length \"$str\"",[15,537,538,539,542],{},"（四）",[19,540,541],{},"构建时编译","。正文中的 Nunjucks 在构建阶段执行，输出纯 HTML。若 macro 名或参数拼写错误，会在构建时报错，而不是静默忽略。",[15,544,545,546,549],{},"（五）",[19,547,548],{},"没有运行时状态","。本站是静态站点，正文里不存在 Vue 那样的响应式状态。需要交互（比如切换显示）时，要借助 jQuery 或原生 JS，且只在现代浏览器中执行，IE7 只保证静态内容的可读性。",[15,551,552,553,556,557,560,561,22],{},"（六）",[19,554,555],{},"不要写 style 块","。文章内的样式用已有 CSS 类或内联 ",[75,558,559],{},"style"," 属性，不推荐在 Markdown 里写 ",[75,562,563],{},"\u003Cstyle>",[29,565,567],{"id":566},"七小结","七、小结",[15,569,570],{},"Markdown 与 Nunjucks 的融合让静态内容具备了组件化能力。文章可以引用全局数据、复用 UI 组件、按条件或循环渲染结构化内容，同时保持构建产物是纯静态 HTML，兼容到 IE7。这使得一批需要在多篇文章里重复出现的结构，可以被抽成组件统一维护。",[559,572,573],{},"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":49,"searchDepth":50,"depth":50,"links":575},[576,577,578,579,580,581,582],{"id":81,"depth":50,"text":82},{"id":124,"depth":50,"text":125},{"id":168,"depth":50,"text":169},{"id":221,"depth":50,"text":222},{"id":297,"depth":50,"text":298},{"id":480,"depth":50,"text":481},{"id":566,"depth":50,"text":567},"2026-10-03","本站 Markdown 文件由 Nunjucks 编译，正文中可直接调用组件 macro、条件渲染与循环。",{},"\u002Fmarkdown-nunjucks-usage-2026-09-18",{"title":68,"description":584},"markdown-nunjucks-usage-2026-09-18",[590,591,592],"Nunjucks","Markdown","Eleventy","MdUbcFEW1qf-NzpeyZmkI2XJI4m6X-6wIMK7c9vGCSs",{"id":595,"title":596,"author":9,"body":597,"cover":3,"date":583,"description":601,"extension":56,"meta":1039,"navigation":58,"path":1040,"seo":1041,"stem":1042,"tags":1043,"__hash__":1047},"content\u002Fsite-migration-compliance-2026-10-03.md","关于本站开展技术架构迁移的说明",{"type":12,"value":598,"toc":1032},[599,602,606,612,626,632,638,641,645,651,665,683,685,721,723,726,728,737,739,742,752,786,793,799,813,816,822,855,858,864,888,895,899,905,911,917,923,929,933,936,939,945,948,952,955,958,961,966,1000,1005,1029],[15,600,601],{},"为进一步降低站点运行成本、提升内容可维护性、扩大浏览器兼容范围，本站于2026年9月至10月对底层技术架构进行系统性迁移。本次迁移不涉及内容层与视觉层的整体改版，但涉及渲染方式、组件体系、样式组织、URL 规范、构建流程等基础机制的全面调整。现将迁移背景、主要内容及后续安排说明如下。",[29,603,605],{"id":604},"一迁移背景","一、迁移背景",[15,607,484,608,611],{},[19,609,610],{},"原架构的局限","。本站原采用 Vue 3 单页应用方案，构建产物依赖客户端 JavaScript 渲染。该方案在交互密集的应用中具有优势，但对以内容发布为主要目的的站点而言存在以下局限：",[33,613,614,617,620,623],{},[36,615,616],{},"首屏渲染依赖脚本执行，禁用脚本的浏览器无法获取内容；",[36,618,619],{},"对早期浏览器（如 Internet Explorer 系列）兼容成本极高；",[36,621,622],{},"内容以组件形式组织，写作需要掌握 Vue 模板语法，创作门槛较高；",[36,624,625],{},"每次内容更新均需重新打包全量资源，发布流程偏重。",[15,627,495,628,631],{},[19,629,630],{},"本站定位的变化","。随着本站内容以\"备忘录\"\"规范说明\"\"公告\"等长文为主，交互需求趋弱，静态内容发布需求趋强。原架构与站点定位之间的适配度下降。",[15,633,521,634,637],{},[19,635,636],{},"兼容性要求","。本站明确将浏览器兼容范围扩展至 Internet Explorer 7 及以上的所有浏览器，原架构基于现代 JavaScript 特性，无法覆盖该范围。",[15,639,640],{},"基于以上三点，本站决定对技术架构进行调整。",[29,642,644],{"id":643},"二迁移主要内容","二、迁移主要内容",[15,646,484,647,650],{},[19,648,649],{},"构建体系迁移","。由 Vue 3 + Vite 方案调整为 Eleventy 3 + Nunjucks 方案。Eleventy 为静态站点生成器，在构建阶段完成全部页面渲染，输出纯 HTML、CSS 与少量辅助脚本。迁移后：",[33,652,653,656,659,662],{},[36,654,655],{},"所有页面均为预渲染的静态 HTML；",[36,657,658],{},"站点可部署于任意静态托管服务；",[36,660,661],{},"构建产物不含应用级 JavaScript 框架代码；",[36,663,664],{},"内容更新仅重新生成对应页面。",[15,666,495,667,670,671,674,675,678,679,682],{},[19,668,669],{},"组件体系迁移","。由 Vue 单文件组件调整为 Nunjucks macro。原 ",[75,672,673],{},".vue"," 文件中以 ",[75,676,677],{},"props"," 传参、以 ",[75,680,681],{},"slot"," 分发内容的方式，统一改为 Nunjucks 的宏调用，参数以字典形式传入。以按钮组件为例，原写法为：",[15,684,88],{},[90,686,690],{"className":687,"code":688,"language":689,"meta":49,"style":49},"language-vue shiki shiki-themes monokai","\u003CGovButton variant=\"primary\">提交\u003C\u002FGovButton>\n","vue",[75,691,692],{"__ignoreMap":49},[98,693,694,698,702,706,709,713,716,718],{"class":100,"line":101},[98,695,697],{"class":696},"sCdxs","\u003C",[98,699,701],{"class":700},"s8I7P","GovButton",[98,703,705],{"class":704},"sHkqI"," variant",[98,707,708],{"class":696},"=",[98,710,712],{"class":711},"s_Ekj","\"primary\"",[98,714,715],{"class":696},">提交\u003C\u002F",[98,717,701],{"class":700},[98,719,720],{"class":696},">\n",[15,722,118],{},[15,724,725],{},"迁移后写法为：",[15,727,88],{},[90,729,731],{"className":92,"code":730,"language":94,"meta":49,"style":49},"{{ button({ text: \"提交\", type: \"primary\" }) }}\n",[75,732,733],{"__ignoreMap":49},[98,734,735],{"class":100,"line":101},[98,736,730],{},[15,738,118],{},[15,740,741],{},"两种方式在职责上等价：均实现\"一处定义、多处引用\"。差异在于前者运行于客户端，后者运行于构建时。",[15,743,521,744,747,748,751],{},[19,745,746],{},"样式体系重组","。原样式以 Vue 单文件组件内的 ",[75,749,750],{},"\u003Cstyle scoped>"," 形式就近维护，存在重复定义、难以全局复用的问题。本次调整将样式按用途分为三类：",[33,753,754,760,774],{},[36,755,756,759],{},[19,757,758],{},"基础样式","：重置、变量、布局，全站始终加载；",[36,761,762,765,766,769,770,773],{},[19,763,764],{},"组件样式","：按组件粒度拆分独立文件，如 ",[75,767,768],{},"button.css","、",[75,771,772],{},"tag.css","；",[36,775,776,779,780,769,783,22],{},[19,777,778],{},"页面样式","：按页面粒度独立维护，如 ",[75,781,782],{},"post.css",[75,784,785],{},"archive.css",[15,787,788,789,792],{},"每个页面在 frontmatter 中声明所需样式文件，构建时按需拼装 ",[75,790,791],{},"\u003Clink>"," 标签，避免全站加载无关样式。",[15,794,538,795,798],{},[19,796,797],{},"URL 规范调整","。原标签页 URL 使用原始中文字符，存在编码歧义、跨平台兼容性差的问题。本次调整引入拼音转换规则，将中文标签统一转换为带声调数字的拼音形式，例如：",[33,800,801,807],{},[36,802,803,804],{},"原 URL：",[75,805,806],{},"\u002Ftags\u002F文章\u002F",[36,808,809,810],{},"新 URL：",[75,811,812],{},"\u002Ftags\u002Fwen2-zhang1\u002F",[15,814,815],{},"针对拼音重名（如\"文章\"与\"纹章\"拼音相同）的情况，采用构建时预计算映射表的方式，按标签字典序为冲突项添加数字后缀，确保每条 URL 唯一。",[15,817,545,818,821],{},[19,819,820],{},"浏览器兼容扩展","。本次迁移明确将兼容范围扩展至 Internet Explorer 7 及以上版本。主要策略包括：",[33,823,824,827,830,837,852],{},[36,825,826],{},"输出产物不含 ES6+ 语法，脚本以 ES5 形式书写；",[36,828,829],{},"使用 jQuery 1.12.4 作为 DOM 操作与 AJAX 的兼容层；",[36,831,832,833,836],{},"补充 ",[75,834,835],{},"ie7.css"," 专用补丁样式，通过条件注释仅向 IE7 及以下加载；",[36,838,839,840,843,844,847,848,851],{},"布局以 ",[75,841,842],{},"float"," + ",[75,845,846],{},"inline-block"," 为基准，",[75,849,850],{},"flex"," 仅作现代浏览器增强；",[36,853,854],{},"不使用 CSS 变量作为唯一值来源，均带 fallback。",[15,856,857],{},"需要说明的是，IE7 用户仅能获得静态内容阅读能力，动态功能（如评论、检索、发布后台）不在此兼容范围内。",[15,859,552,860,863],{},[19,861,862],{},"工程化完善","。新增构建前清理步骤，每次构建均先删除旧产物目录，避免历史文件残留。同时补充：",[33,865,866,873,879,885],{},[36,867,868,869,872],{},"站点地图（",[75,870,871],{},"sitemap.xml","）；",[36,874,875,876,872],{},"内容订阅（",[75,877,878],{},"feed.xml",[36,880,881,882,872],{},"搜索引擎规则（",[75,883,884],{},"robots.txt",[36,886,887],{},"自定义 404 页面。",[15,889,890,891,894],{},"（七）",[19,892,893],{},"内容创作方式调整","。文章由 Vue 组件形式调整为标准 Markdown 文件，正文中可直接引用 Nunjucks 宏、读取站点全局数据，无需编写脚本逻辑。组件调用与 Markdown 语法可混用，写作门槛降低。",[29,896,898],{"id":897},"三迁移后效果","三、迁移后效果",[15,900,484,901,904],{},[19,902,903],{},"内容为先","。页面以纯 HTML 交付，禁用脚本的浏览器、早期浏览器、文本浏览器均可正常阅读。",[15,906,495,907,910],{},[19,908,909],{},"构建轻量","。站点不再包含应用级 JavaScript 框架，构建产物体积显著下降，构建时间缩短。",[15,912,521,913,916],{},[19,914,915],{},"样式可控","。样式按页面按需加载，避免了全站样式的冗余加载，也便于后续按组件粒度调整。",[15,918,538,919,922],{},[19,920,921],{},"URL 稳定","。标签、归档、文章等各类页面 URL 规范统一，便于分享、收藏与搜索引擎收录。",[15,924,545,925,928],{},[19,926,927],{},"维护便利","。新增文章仅需添加 Markdown 文件，无需改动路由、组件或构建脚本。",[29,930,932],{"id":931},"四后续工作","四、后续工作",[15,934,935],{},"（一）逐步将原站其他栏目内容迁移至新架构，保持 URL 结构一致性。",[15,937,938],{},"（二）针对现代浏览器补充增强功能，例如评论、检索、阅读进度指示等，以渐进增强方式提供，不影响基础阅读。",[15,940,941,942,944],{},"（三）持续监测 IE7 等早期浏览器下的可读性，发现问题及时在 ",[75,943,835],{}," 中补充补丁。",[15,946,947],{},"（四）完善发布流程，探索基于 Cloudflare Workers 与 GitHub API 的在线发布方案，降低内容维护的技术门槛。",[29,949,951],{"id":950},"五说明","五、说明",[15,953,954],{},"本站为个人技术项目，本次迁移属技术架构调整，不涉及任何机构或组织的立场表达。视觉设计仍参照政府网站规范进行，旨在为用户提供规范、清晰、易读的信息服务。所有内容仅代表个人观点，与任何机构无关。",[15,956,957],{},"特此说明。",[959,960],"hr",{},[15,962,963],{},[19,964,965],{},"附：主要参考文件",[33,967,968,969,968,979,968,986,968,993],{},"\n  ",[36,970,971],{},[972,973,978],"a",{"href":974,"target":975,"rel":976},"https:\u002F\u002Fwww.11ty.dev\u002Fdocs\u002F","_blank",[977],"noopener","Eleventy 官方文档",[36,980,981],{},[972,982,985],{"href":983,"target":975,"rel":984},"https:\u002F\u002Fmozilla.github.io\u002Fnunjucks\u002F",[977],"Nunjucks 模板引擎文档",[36,987,988],{},[972,989,992],{"href":990,"target":975,"rel":991},"https:\u002F\u002Fapi.jquery.com\u002F",[977],"jQuery 1.12.4 API 文档",[36,994,995],{},[972,996,999],{"href":997,"target":975,"rel":998},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fzh-CN\u002Fdocs\u002FWeb\u002FHTML\u002FConditional_comments",[977],"MDN：条件注释（Conditional comments）",[15,1001,1002],{},[19,1003,1004],{},"简要说明",[33,1006,1007,1012,1017,1023],{},[36,1008,1009,1011],{},[19,1010,592],{},"：静态站点生成器，构建时渲染全部页面，输出纯 HTML。",[36,1013,1014,1016],{},[19,1015,590],{},"：Mozilla 开发的 JavaScript 模板引擎，本站用于组件化与数据渲染。",[36,1018,1019,1022],{},[19,1020,1021],{},"jQuery 1.12.4","：jQuery 1.x 系列末版，兼容 IE6 及以上浏览器。",[36,1024,1025,1028],{},[19,1026,1027],{},"条件注释","：Internet Explorer 专属的 HTML 注释语法，用于向特定版本 IE 加载专用资源。",[559,1030,1031],{},"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":49,"searchDepth":50,"depth":50,"links":1033},[1034,1035,1036,1037,1038],{"id":604,"depth":50,"text":605},{"id":643,"depth":50,"text":644},{"id":897,"depth":50,"text":898},{"id":931,"depth":50,"text":932},{"id":950,"depth":50,"text":951},{},"\u002Fsite-migration-compliance-2026-10-03",{"title":596,"description":601},"site-migration-compliance-2026-10-03",[1044,1045,1046],"技术架构","迁移","公告","I5WZy1gbyyF-BrpyA0tPrpwRa21nFwadDoAgqXlaHCo",{"id":1049,"title":1050,"author":9,"body":1051,"cover":3,"date":3345,"description":1055,"extension":56,"meta":3346,"navigation":58,"path":3347,"seo":3348,"stem":3349,"tags":3350,"__hash__":3353},"content\u002Fgit-memo-2026-09-25.md","Git 备忘录",{"type":12,"value":1052,"toc":3314},[1053,1056,1060,1274,1278,1389,1393,1459,1463,1650,1653,1731,1739,1743,1746,1814,1817,1871,1874,1918,1921,2012,2015,2050,2060,2064,2166,2169,2173,2339,2351,2355,2452,2456,2600,2604,2608,2627,2630,2655,2659,2705,2709,2749,2753,2796,2799,2821,2825,2836,2866,2869,2873,2913,2922,2926,2932,2935,3025,3028,3034,3038,3222,3226,3278,3281,3283,3286,3311],[15,1054,1055],{},"日常高频命令速查。按\"场景\"而非\"命令字母\"组织，便于出问题时直接翻。",[29,1057,1059],{"id":1058},"一配置","一、配置",[90,1061,1065],{"className":1062,"code":1063,"language":1064,"meta":49,"style":49},"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",[75,1066,1067,1073,1091,1105,1109,1114,1128,1132,1138,1153,1158,1164,1179,1184,1190,1205,1220,1235,1250,1255,1261],{"__ignoreMap":49},[98,1068,1069],{"class":100,"line":101},[98,1070,1072],{"class":1071},"snpHw","# 用户信息（全局）\n",[98,1074,1075,1078,1081,1085,1088],{"class":100,"line":50},[98,1076,1077],{"class":704},"git",[98,1079,1080],{"class":711}," config",[98,1082,1084],{"class":1083},"s7s5_"," --global",[98,1086,1087],{"class":711}," user.name",[98,1089,1090],{"class":711}," \"Your Name\"\n",[98,1092,1093,1095,1097,1099,1102],{"class":100,"line":112},[98,1094,1077],{"class":704},[98,1096,1080],{"class":711},[98,1098,1084],{"class":1083},[98,1100,1101],{"class":711}," user.email",[98,1103,1104],{"class":711}," \"you@example.com\"\n",[98,1106,1107],{"class":100,"line":197},[98,1108,109],{"emptyLinePlaceholder":58},[98,1110,1111],{"class":100,"line":203},[98,1112,1113],{"class":1071},"# 换行符（Windows 推荐）\n",[98,1115,1116,1118,1120,1122,1125],{"class":100,"line":344},[98,1117,1077],{"class":704},[98,1119,1080],{"class":711},[98,1121,1084],{"class":1083},[98,1123,1124],{"class":711}," core.autocrlf",[98,1126,1127],{"class":1083}," true\n",[98,1129,1130],{"class":100,"line":350},[98,1131,109],{"emptyLinePlaceholder":58},[98,1133,1135],{"class":100,"line":1134},8,[98,1136,1137],{"class":1071},"# 中文文件名不乱码\n",[98,1139,1141,1143,1145,1147,1150],{"class":100,"line":1140},9,[98,1142,1077],{"class":704},[98,1144,1080],{"class":711},[98,1146,1084],{"class":1083},[98,1148,1149],{"class":711}," core.quotepath",[98,1151,1152],{"class":1083}," false\n",[98,1154,1156],{"class":100,"line":1155},10,[98,1157,109],{"emptyLinePlaceholder":58},[98,1159,1161],{"class":100,"line":1160},11,[98,1162,1163],{"class":1071},"# 默认分支名\n",[98,1165,1167,1169,1171,1173,1176],{"class":100,"line":1166},12,[98,1168,1077],{"class":704},[98,1170,1080],{"class":711},[98,1172,1084],{"class":1083},[98,1174,1175],{"class":711}," init.defaultBranch",[98,1177,1178],{"class":711}," main\n",[98,1180,1182],{"class":100,"line":1181},13,[98,1183,109],{"emptyLinePlaceholder":58},[98,1185,1187],{"class":100,"line":1186},14,[98,1188,1189],{"class":1071},"# 常用别名\n",[98,1191,1193,1195,1197,1199,1202],{"class":100,"line":1192},15,[98,1194,1077],{"class":704},[98,1196,1080],{"class":711},[98,1198,1084],{"class":1083},[98,1200,1201],{"class":711}," alias.st",[98,1203,1204],{"class":711}," status\n",[98,1206,1208,1210,1212,1214,1217],{"class":100,"line":1207},16,[98,1209,1077],{"class":704},[98,1211,1080],{"class":711},[98,1213,1084],{"class":1083},[98,1215,1216],{"class":711}," alias.co",[98,1218,1219],{"class":711}," checkout\n",[98,1221,1223,1225,1227,1229,1232],{"class":100,"line":1222},17,[98,1224,1077],{"class":704},[98,1226,1080],{"class":711},[98,1228,1084],{"class":1083},[98,1230,1231],{"class":711}," alias.br",[98,1233,1234],{"class":711}," branch\n",[98,1236,1238,1240,1242,1244,1247],{"class":100,"line":1237},18,[98,1239,1077],{"class":704},[98,1241,1080],{"class":711},[98,1243,1084],{"class":1083},[98,1245,1246],{"class":711}," alias.lg",[98,1248,1249],{"class":711}," \"log --oneline --graph --decorate --all\"\n",[98,1251,1253],{"class":100,"line":1252},19,[98,1254,109],{"emptyLinePlaceholder":58},[98,1256,1258],{"class":100,"line":1257},20,[98,1259,1260],{"class":1071},"# 查看所有配置\n",[98,1262,1264,1266,1268,1271],{"class":100,"line":1263},21,[98,1265,1077],{"class":704},[98,1267,1080],{"class":711},[98,1269,1270],{"class":1083}," --list",[98,1272,1273],{"class":1083}," --show-origin\n",[29,1275,1277],{"id":1276},"二基础工作流","二、基础工作流",[90,1279,1281],{"className":1062,"code":1280,"language":1064,"meta":49,"style":49},"git status                    # 查看工作区状态\ngit add \u003Cfile>                # 暂存指定文件\ngit add .                     # 暂存所有改动（不含删除）\ngit add -A                    # 暂存所有改动（含删除）\ngit commit -m \"message\"       # 提交\ngit commit -am \"message\"      # 跳过 add，直接提交已跟踪文件\ngit push                      # 推送\ngit pull                      # 拉取并合并\n",[75,1282,1283,1293,1315,1327,1339,1355,1369,1379],{"__ignoreMap":49},[98,1284,1285,1287,1290],{"class":100,"line":101},[98,1286,1077],{"class":704},[98,1288,1289],{"class":711}," status",[98,1291,1292],{"class":1071},"                    # 查看工作区状态\n",[98,1294,1295,1297,1300,1303,1306,1309,1312],{"class":100,"line":50},[98,1296,1077],{"class":704},[98,1298,1299],{"class":711}," add",[98,1301,1302],{"class":700}," \u003C",[98,1304,1305],{"class":711},"fil",[98,1307,1308],{"class":696},"e",[98,1310,1311],{"class":700},">",[98,1313,1314],{"class":1071},"                # 暂存指定文件\n",[98,1316,1317,1319,1321,1324],{"class":100,"line":112},[98,1318,1077],{"class":704},[98,1320,1299],{"class":711},[98,1322,1323],{"class":711}," .",[98,1325,1326],{"class":1071},"                     # 暂存所有改动（不含删除）\n",[98,1328,1329,1331,1333,1336],{"class":100,"line":197},[98,1330,1077],{"class":704},[98,1332,1299],{"class":711},[98,1334,1335],{"class":1083}," -A",[98,1337,1338],{"class":1071},"                    # 暂存所有改动（含删除）\n",[98,1340,1341,1343,1346,1349,1352],{"class":100,"line":203},[98,1342,1077],{"class":704},[98,1344,1345],{"class":711}," commit",[98,1347,1348],{"class":1083}," -m",[98,1350,1351],{"class":711}," \"message\"",[98,1353,1354],{"class":1071},"       # 提交\n",[98,1356,1357,1359,1361,1364,1366],{"class":100,"line":344},[98,1358,1077],{"class":704},[98,1360,1345],{"class":711},[98,1362,1363],{"class":1083}," -am",[98,1365,1351],{"class":711},[98,1367,1368],{"class":1071},"      # 跳过 add，直接提交已跟踪文件\n",[98,1370,1371,1373,1376],{"class":100,"line":350},[98,1372,1077],{"class":704},[98,1374,1375],{"class":711}," push",[98,1377,1378],{"class":1071},"                      # 推送\n",[98,1380,1381,1383,1386],{"class":100,"line":1134},[98,1382,1077],{"class":704},[98,1384,1385],{"class":711}," pull",[98,1387,1388],{"class":1071},"                      # 拉取并合并\n",[1390,1391,1392],"h3",{"id":1392},"查看差异",[90,1394,1396],{"className":1062,"code":1395,"language":1064,"meta":49,"style":49},"git diff                      # 工作区 vs 暂存区\ngit diff --staged             # 暂存区 vs 最新提交\ngit diff HEAD                 # 工作区 + 暂存区 vs 最新提交\ngit diff \u003Cbranch1>..\u003Cbranch2> # 两分支差异\n",[75,1397,1398,1408,1420,1432],{"__ignoreMap":49},[98,1399,1400,1402,1405],{"class":100,"line":101},[98,1401,1077],{"class":704},[98,1403,1404],{"class":711}," diff",[98,1406,1407],{"class":1071},"                      # 工作区 vs 暂存区\n",[98,1409,1410,1412,1414,1417],{"class":100,"line":50},[98,1411,1077],{"class":704},[98,1413,1404],{"class":711},[98,1415,1416],{"class":1083}," --staged",[98,1418,1419],{"class":1071},"             # 暂存区 vs 最新提交\n",[98,1421,1422,1424,1426,1429],{"class":100,"line":112},[98,1423,1077],{"class":704},[98,1425,1404],{"class":711},[98,1427,1428],{"class":711}," HEAD",[98,1430,1431],{"class":1071},"                 # 工作区 + 暂存区 vs 最新提交\n",[98,1433,1434,1436,1438,1440,1443,1446,1449,1451,1453,1456],{"class":100,"line":197},[98,1435,1077],{"class":704},[98,1437,1404],{"class":711},[98,1439,1302],{"class":700},[98,1441,1442],{"class":711},"branch",[98,1444,1445],{"class":700},"1>",[98,1447,1448],{"class":711},"..",[98,1450,697],{"class":700},[98,1452,1442],{"class":711},[98,1454,1455],{"class":700},"2>",[98,1457,1458],{"class":1071}," # 两分支差异\n",[29,1460,1462],{"id":1461},"三分支","三、分支",[90,1464,1466],{"className":1062,"code":1465,"language":1064,"meta":49,"style":49},"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",[75,1467,1468,1478,1490,1502,1520,1538,1558,1579,1599,1619],{"__ignoreMap":49},[98,1469,1470,1472,1475],{"class":100,"line":101},[98,1471,1077],{"class":704},[98,1473,1474],{"class":711}," branch",[98,1476,1477],{"class":1071},"                    # 查看本地分支\n",[98,1479,1480,1482,1484,1487],{"class":100,"line":50},[98,1481,1077],{"class":704},[98,1483,1474],{"class":711},[98,1485,1486],{"class":1083}," -a",[98,1488,1489],{"class":1071},"                 # 查看所有分支（含远程）\n",[98,1491,1492,1494,1496,1499],{"class":100,"line":112},[98,1493,1077],{"class":704},[98,1495,1474],{"class":711},[98,1497,1498],{"class":1083}," -vv",[98,1500,1501],{"class":1071},"                # 查看分支及跟踪关系\n",[98,1503,1504,1506,1508,1510,1513,1515,1517],{"class":100,"line":197},[98,1505,1077],{"class":704},[98,1507,1474],{"class":711},[98,1509,1302],{"class":700},[98,1511,1512],{"class":711},"nam",[98,1514,1308],{"class":696},[98,1516,1311],{"class":700},[98,1518,1519],{"class":1071},"             # 创建分支\n",[98,1521,1522,1524,1527,1529,1531,1533,1535],{"class":100,"line":203},[98,1523,1077],{"class":704},[98,1525,1526],{"class":711}," switch",[98,1528,1302],{"class":700},[98,1530,1512],{"class":711},[98,1532,1308],{"class":696},[98,1534,1311],{"class":700},[98,1536,1537],{"class":1071},"             # 切换分支（新版推荐）\n",[98,1539,1540,1542,1544,1547,1549,1551,1553,1555],{"class":100,"line":344},[98,1541,1077],{"class":704},[98,1543,1526],{"class":711},[98,1545,1546],{"class":1083}," -c",[98,1548,1302],{"class":700},[98,1550,1512],{"class":711},[98,1552,1308],{"class":696},[98,1554,1311],{"class":700},[98,1556,1557],{"class":1071},"          # 创建并切换\n",[98,1559,1560,1562,1565,1568,1570,1572,1574,1576],{"class":100,"line":350},[98,1561,1077],{"class":704},[98,1563,1564],{"class":711}," checkout",[98,1566,1567],{"class":1083}," -b",[98,1569,1302],{"class":700},[98,1571,1512],{"class":711},[98,1573,1308],{"class":696},[98,1575,1311],{"class":700},[98,1577,1578],{"class":1071},"        # 同上（旧版写法）\n",[98,1580,1581,1583,1585,1588,1590,1592,1594,1596],{"class":100,"line":1134},[98,1582,1077],{"class":704},[98,1584,1474],{"class":711},[98,1586,1587],{"class":1083}," -d",[98,1589,1302],{"class":700},[98,1591,1512],{"class":711},[98,1593,1308],{"class":696},[98,1595,1311],{"class":700},[98,1597,1598],{"class":1071},"          # 删除已合并分支\n",[98,1600,1601,1603,1605,1608,1610,1612,1614,1616],{"class":100,"line":1140},[98,1602,1077],{"class":704},[98,1604,1474],{"class":711},[98,1606,1607],{"class":1083}," -D",[98,1609,1302],{"class":700},[98,1611,1512],{"class":711},[98,1613,1308],{"class":696},[98,1615,1311],{"class":700},[98,1617,1618],{"class":1071},"          # 强制删除\n",[98,1620,1621,1623,1625,1627,1629,1632,1635,1637,1639,1642,1645,1647],{"class":100,"line":1155},[98,1622,1077],{"class":704},[98,1624,1474],{"class":711},[98,1626,1348],{"class":1083},[98,1628,1302],{"class":700},[98,1630,1631],{"class":711},"ol",[98,1633,1634],{"class":696},"d",[98,1636,1311],{"class":700},[98,1638,1302],{"class":700},[98,1640,1641],{"class":711},"ne",[98,1643,1644],{"class":696},"w",[98,1646,1311],{"class":700},[98,1648,1649],{"class":1071},"     # 重命名分支\n",[1390,1651,1652],{"id":1652},"合并与变基",[90,1654,1656],{"className":1062,"code":1655,"language":1064,"meta":49,"style":49},"git merge \u003Cbranch>            # 合并到当前分支（保留历史）\ngit merge --no-ff \u003Cbranch>    # 强制生成合并提交\ngit rebase \u003Cbranch>           # 变基（线性历史）\ngit rebase -i HEAD~3          # 交互式变基，重写最近 3 条提交\n",[75,1657,1658,1678,1698,1716],{"__ignoreMap":49},[98,1659,1660,1662,1665,1667,1670,1673,1675],{"class":100,"line":101},[98,1661,1077],{"class":704},[98,1663,1664],{"class":711}," merge",[98,1666,1302],{"class":700},[98,1668,1669],{"class":711},"branc",[98,1671,1672],{"class":696},"h",[98,1674,1311],{"class":700},[98,1676,1677],{"class":1071},"            # 合并到当前分支（保留历史）\n",[98,1679,1680,1682,1684,1687,1689,1691,1693,1695],{"class":100,"line":50},[98,1681,1077],{"class":704},[98,1683,1664],{"class":711},[98,1685,1686],{"class":1083}," --no-ff",[98,1688,1302],{"class":700},[98,1690,1669],{"class":711},[98,1692,1672],{"class":696},[98,1694,1311],{"class":700},[98,1696,1697],{"class":1071},"    # 强制生成合并提交\n",[98,1699,1700,1702,1705,1707,1709,1711,1713],{"class":100,"line":112},[98,1701,1077],{"class":704},[98,1703,1704],{"class":711}," rebase",[98,1706,1302],{"class":700},[98,1708,1669],{"class":711},[98,1710,1672],{"class":696},[98,1712,1311],{"class":700},[98,1714,1715],{"class":1071},"           # 变基（线性历史）\n",[98,1717,1718,1720,1722,1725,1728],{"class":100,"line":197},[98,1719,1077],{"class":704},[98,1721,1704],{"class":711},[98,1723,1724],{"class":1083}," -i",[98,1726,1727],{"class":711}," HEAD~3",[98,1729,1730],{"class":1071},"          # 交互式变基，重写最近 3 条提交\n",[43,1732,1733],{},[15,1734,1735,1738],{},[19,1736,1737],{},"原则","：已推送到共享远程的分支不要 rebase；只在本地分支上用。",[29,1740,1742],{"id":1741},"四撤销与回退","四、撤销与回退",[15,1744,1745],{},"这是最容易踩坑的地方，先分清三种\"撤销\"：",[357,1747,1748,1764],{},[360,1749,1750],{},[363,1751,1752,1755,1758,1761],{},[366,1753,1754],{},"命令",[366,1756,1757],{},"作用范围",[366,1759,1760],{},"是否修改历史",[366,1762,1763],{},"使用场景",[376,1765,1766,1782,1798],{},[363,1767,1768,1773,1776,1779],{},[381,1769,1770],{},[75,1771,1772],{},"git restore",[381,1774,1775],{},"工作区 \u002F 暂存区",[381,1777,1778],{},"否",[381,1780,1781],{},"丢弃未提交的修改",[363,1783,1784,1789,1792,1795],{},[381,1785,1786],{},[75,1787,1788],{},"git reset",[381,1790,1791],{},"暂存区 \u002F 提交历史",[381,1793,1794],{},"是",[381,1796,1797],{},"撤销提交（未推送）",[363,1799,1800,1805,1808,1811],{},[381,1801,1802],{},[75,1803,1804],{},"git revert",[381,1806,1807],{},"提交历史",[381,1809,1810],{},"否（新增反向提交）",[381,1812,1813],{},"撤销已推送的提交",[1390,1815,1816],{"id":1816},"丢弃工作区修改",[90,1818,1820],{"className":1062,"code":1819,"language":1064,"meta":49,"style":49},"git restore \u003Cfile>            # 丢弃单个文件的未暂存修改\ngit restore .                 # 丢弃所有未暂存修改（危险）\ngit checkout -- \u003Cfile>        # 旧版写法\n",[75,1821,1822,1840,1851],{"__ignoreMap":49},[98,1823,1824,1826,1829,1831,1833,1835,1837],{"class":100,"line":101},[98,1825,1077],{"class":704},[98,1827,1828],{"class":711}," restore",[98,1830,1302],{"class":700},[98,1832,1305],{"class":711},[98,1834,1308],{"class":696},[98,1836,1311],{"class":700},[98,1838,1839],{"class":1071},"            # 丢弃单个文件的未暂存修改\n",[98,1841,1842,1844,1846,1848],{"class":100,"line":50},[98,1843,1077],{"class":704},[98,1845,1828],{"class":711},[98,1847,1323],{"class":711},[98,1849,1850],{"class":1071},"                 # 丢弃所有未暂存修改（危险）\n",[98,1852,1853,1855,1857,1860,1862,1864,1866,1868],{"class":100,"line":112},[98,1854,1077],{"class":704},[98,1856,1564],{"class":711},[98,1858,1859],{"class":1083}," --",[98,1861,1302],{"class":700},[98,1863,1305],{"class":711},[98,1865,1308],{"class":696},[98,1867,1311],{"class":700},[98,1869,1870],{"class":1071},"        # 旧版写法\n",[1390,1872,1873],{"id":1873},"取消暂存",[90,1875,1877],{"className":1062,"code":1876,"language":1064,"meta":49,"style":49},"git restore --staged \u003Cfile>   # 从暂存区移回工作区\ngit reset HEAD \u003Cfile>         # 旧版写法\n",[75,1878,1879,1898],{"__ignoreMap":49},[98,1880,1881,1883,1885,1887,1889,1891,1893,1895],{"class":100,"line":101},[98,1882,1077],{"class":704},[98,1884,1828],{"class":711},[98,1886,1416],{"class":1083},[98,1888,1302],{"class":700},[98,1890,1305],{"class":711},[98,1892,1308],{"class":696},[98,1894,1311],{"class":700},[98,1896,1897],{"class":1071},"   # 从暂存区移回工作区\n",[98,1899,1900,1902,1905,1907,1909,1911,1913,1915],{"class":100,"line":50},[98,1901,1077],{"class":704},[98,1903,1904],{"class":711}," reset",[98,1906,1428],{"class":711},[98,1908,1302],{"class":700},[98,1910,1305],{"class":711},[98,1912,1308],{"class":696},[98,1914,1311],{"class":700},[98,1916,1917],{"class":1071},"         # 旧版写法\n",[1390,1919,1920],{"id":1920},"撤销提交",[90,1922,1924],{"className":1062,"code":1923,"language":1064,"meta":49,"style":49},"# 保留改动在工作区\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",[75,1925,1926,1931,1943,1947,1952,1967,1971,1976,1987,1991,1996],{"__ignoreMap":49},[98,1927,1928],{"class":100,"line":101},[98,1929,1930],{"class":1071},"# 保留改动在工作区\n",[98,1932,1933,1935,1937,1940],{"class":100,"line":50},[98,1934,1077],{"class":704},[98,1936,1904],{"class":711},[98,1938,1939],{"class":1083}," --soft",[98,1941,1942],{"class":711}," HEAD~1\n",[98,1944,1945],{"class":100,"line":112},[98,1946,109],{"emptyLinePlaceholder":58},[98,1948,1949],{"class":100,"line":197},[98,1950,1951],{"class":1071},"# 保留改动在暂存区\n",[98,1953,1954,1956,1958,1961,1964],{"class":100,"line":203},[98,1955,1077],{"class":704},[98,1957,1904],{"class":711},[98,1959,1960],{"class":1083}," --mixed",[98,1962,1963],{"class":711}," HEAD~1",[98,1965,1966],{"class":1071},"      # 默认\n",[98,1968,1969],{"class":100,"line":344},[98,1970,109],{"emptyLinePlaceholder":58},[98,1972,1973],{"class":100,"line":350},[98,1974,1975],{"class":1071},"# 彻底丢弃改动（危险）\n",[98,1977,1978,1980,1982,1985],{"class":100,"line":1134},[98,1979,1077],{"class":704},[98,1981,1904],{"class":711},[98,1983,1984],{"class":1083}," --hard",[98,1986,1942],{"class":711},[98,1988,1989],{"class":100,"line":1140},[98,1990,109],{"emptyLinePlaceholder":58},[98,1992,1993],{"class":100,"line":1155},[98,1994,1995],{"class":1071},"# 撤销已推送的提交（安全）\n",[98,1997,1998,2000,2003,2005,2008,2010],{"class":100,"line":1160},[98,1999,1077],{"class":704},[98,2001,2002],{"class":711}," revert",[98,2004,1302],{"class":700},[98,2006,2007],{"class":711},"commit-has",[98,2009,1672],{"class":696},[98,2011,720],{"class":700},[1390,2013,2014],{"id":2014},"找回丢失的提交",[90,2016,2018],{"className":1062,"code":2017,"language":1064,"meta":49,"style":49},"git reflog                    # 查看 HEAD 移动历史\ngit reset --hard \u003Chash>       # 回到某个历史位置\n",[75,2019,2020,2030],{"__ignoreMap":49},[98,2021,2022,2024,2027],{"class":100,"line":101},[98,2023,1077],{"class":704},[98,2025,2026],{"class":711}," reflog",[98,2028,2029],{"class":1071},"                    # 查看 HEAD 移动历史\n",[98,2031,2032,2034,2036,2038,2040,2043,2045,2047],{"class":100,"line":50},[98,2033,1077],{"class":704},[98,2035,1904],{"class":711},[98,2037,1984],{"class":1083},[98,2039,1302],{"class":700},[98,2041,2042],{"class":711},"has",[98,2044,1672],{"class":696},[98,2046,1311],{"class":700},[98,2048,2049],{"class":1071},"       # 回到某个历史位置\n",[15,2051,2052,2055,2056,2059],{},[75,2053,2054],{},"reset --hard"," 后如果后悔，",[75,2057,2058],{},"reflog"," 通常能救回来，除非已经 GC。",[29,2061,2063],{"id":2062},"五贮藏stash","五、贮藏（stash）",[90,2065,2067],{"className":1062,"code":2066,"language":1064,"meta":49,"style":49},"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",[75,2068,2069,2079,2091,2103,2115,2136,2154],{"__ignoreMap":49},[98,2070,2071,2073,2076],{"class":100,"line":101},[98,2072,1077],{"class":704},[98,2074,2075],{"class":711}," stash",[98,2077,2078],{"class":1071},"                     # 贮藏当前改动\n",[98,2080,2081,2083,2085,2088],{"class":100,"line":50},[98,2082,1077],{"class":704},[98,2084,2075],{"class":711},[98,2086,2087],{"class":1083}," -u",[98,2089,2090],{"class":1071},"                  # 含未跟踪文件\n",[98,2092,2093,2095,2097,2100],{"class":100,"line":112},[98,2094,1077],{"class":704},[98,2096,2075],{"class":711},[98,2098,2099],{"class":711}," list",[98,2101,2102],{"class":1071},"                # 查看贮藏列表\n",[98,2104,2105,2107,2109,2112],{"class":100,"line":197},[98,2106,1077],{"class":704},[98,2108,2075],{"class":711},[98,2110,2111],{"class":711}," pop",[98,2113,2114],{"class":1071},"                 # 弹出最近贮藏并删除\n",[98,2116,2117,2119,2121,2124,2127,2130,2133],{"class":100,"line":203},[98,2118,1077],{"class":704},[98,2120,2075],{"class":711},[98,2122,2123],{"class":711}," apply",[98,2125,2126],{"class":711}," stash@{",[98,2128,2129],{"class":1083},"0",[98,2131,2132],{"class":711},"}",[98,2134,2135],{"class":1071},"     # 应用指定贮藏（保留）\n",[98,2137,2138,2140,2142,2145,2147,2149,2151],{"class":100,"line":344},[98,2139,1077],{"class":704},[98,2141,2075],{"class":711},[98,2143,2144],{"class":711}," drop",[98,2146,2126],{"class":711},[98,2148,2129],{"class":1083},[98,2150,2132],{"class":711},[98,2152,2153],{"class":1071},"      # 删除指定贮藏\n",[98,2155,2156,2158,2160,2163],{"class":100,"line":350},[98,2157,1077],{"class":704},[98,2159,2075],{"class":711},[98,2161,2162],{"class":711}," clear",[98,2164,2165],{"class":1071},"               # 清空所有贮藏\n",[15,2167,2168],{},"常见场景：改了一半，突然要切分支修 bug。",[29,2170,2172],{"id":2171},"六远程","六、远程",[90,2174,2176],{"className":1062,"code":2175,"language":1064,"meta":49,"style":49},"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",[75,2177,2178,2191,2215,2237,2251,2255,2265,2274,2286,2294,2315,2327],{"__ignoreMap":49},[98,2179,2180,2182,2185,2188],{"class":100,"line":101},[98,2181,1077],{"class":704},[98,2183,2184],{"class":711}," remote",[98,2186,2187],{"class":1083}," -v",[98,2189,2190],{"class":1071},"                 # 查看远程仓库\n",[98,2192,2193,2195,2197,2199,2202,2204,2207,2210,2212],{"class":100,"line":50},[98,2194,1077],{"class":704},[98,2196,2184],{"class":711},[98,2198,1299],{"class":711},[98,2200,2201],{"class":711}," origin",[98,2203,1302],{"class":700},[98,2205,2206],{"class":711},"ur",[98,2208,2209],{"class":696},"l",[98,2211,1311],{"class":700},[98,2213,2214],{"class":1071},"   # 添加远程\n",[98,2216,2217,2219,2221,2224,2226,2228,2230,2232,2234],{"class":100,"line":112},[98,2218,1077],{"class":704},[98,2220,2184],{"class":711},[98,2222,2223],{"class":711}," set-url",[98,2225,2201],{"class":711},[98,2227,1302],{"class":700},[98,2229,2206],{"class":711},[98,2231,2209],{"class":696},[98,2233,1311],{"class":700},[98,2235,2236],{"class":1071}," # 修改远程地址\n",[98,2238,2239,2241,2243,2246,2248],{"class":100,"line":197},[98,2240,1077],{"class":704},[98,2242,2184],{"class":711},[98,2244,2245],{"class":711}," remove",[98,2247,2201],{"class":711},[98,2249,2250],{"class":1071},"      # 删除远程\n",[98,2252,2253],{"class":100,"line":203},[98,2254,109],{"emptyLinePlaceholder":58},[98,2256,2257,2259,2262],{"class":100,"line":344},[98,2258,1077],{"class":704},[98,2260,2261],{"class":711}," fetch",[98,2263,2264],{"class":1071},"                     # 拉取远程信息，不合并\n",[98,2266,2267,2269,2271],{"class":100,"line":350},[98,2268,1077],{"class":704},[98,2270,1385],{"class":711},[98,2272,2273],{"class":1071},"                      # fetch + merge\n",[98,2275,2276,2278,2280,2283],{"class":100,"line":1134},[98,2277,1077],{"class":704},[98,2279,1385],{"class":711},[98,2281,2282],{"class":1083}," --rebase",[98,2284,2285],{"class":1071},"             # fetch + rebase\n",[98,2287,2288,2290,2292],{"class":100,"line":1140},[98,2289,1077],{"class":704},[98,2291,1375],{"class":711},[98,2293,1378],{"class":1071},[98,2295,2296,2298,2300,2302,2304,2306,2308,2310,2312],{"class":100,"line":1155},[98,2297,1077],{"class":704},[98,2299,1375],{"class":711},[98,2301,2087],{"class":1083},[98,2303,2201],{"class":711},[98,2305,1302],{"class":700},[98,2307,1669],{"class":711},[98,2309,1672],{"class":696},[98,2311,1311],{"class":700},[98,2313,2314],{"class":1071},"   # 首次推送并建立跟踪\n",[98,2316,2317,2319,2321,2324],{"class":100,"line":1160},[98,2318,1077],{"class":704},[98,2320,1375],{"class":711},[98,2322,2323],{"class":1083}," --force-with-lease",[98,2325,2326],{"class":1071},"   # 安全强推（推荐）\n",[98,2328,2329,2331,2333,2336],{"class":100,"line":1166},[98,2330,1077],{"class":704},[98,2332,1375],{"class":711},[98,2334,2335],{"class":1083}," --force",[98,2337,2338],{"class":1071},"              # 强推（危险）\n",[43,2340,2341],{},[15,2342,2343,2346,2347,2350],{},[19,2344,2345],{},"强推原则","：永远用 ",[75,2348,2349],{},"--force-with-lease","，它会检查远程是否有人推过新提交，避免误覆盖别人的工作。",[29,2352,2354],{"id":2353},"七标签","七、标签",[90,2356,2358],{"className":1062,"code":2357,"language":1064,"meta":49,"style":49},"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",[75,2359,2360,2370,2382,2400,2413,2425,2438],{"__ignoreMap":49},[98,2361,2362,2364,2367],{"class":100,"line":101},[98,2363,1077],{"class":704},[98,2365,2366],{"class":711}," tag",[98,2368,2369],{"class":1071},"                       # 查看标签\n",[98,2371,2372,2374,2376,2379],{"class":100,"line":50},[98,2373,1077],{"class":704},[98,2375,2366],{"class":711},[98,2377,2378],{"class":711}," v1.0.0",[98,2380,2381],{"class":1071},"                # 轻量标签\n",[98,2383,2384,2386,2388,2390,2392,2394,2397],{"class":100,"line":112},[98,2385,1077],{"class":704},[98,2387,2366],{"class":711},[98,2389,1486],{"class":1083},[98,2391,2378],{"class":711},[98,2393,1348],{"class":1083},[98,2395,2396],{"class":711}," \"msg\"",[98,2398,2399],{"class":1071},"    # 附注标签（推荐）\n",[98,2401,2402,2404,2406,2408,2410],{"class":100,"line":197},[98,2403,1077],{"class":704},[98,2405,1375],{"class":711},[98,2407,2201],{"class":711},[98,2409,2378],{"class":711},[98,2411,2412],{"class":1071},"        # 推送单个标签\n",[98,2414,2415,2417,2419,2422],{"class":100,"line":203},[98,2416,1077],{"class":704},[98,2418,1375],{"class":711},[98,2420,2421],{"class":1083}," --tags",[98,2423,2424],{"class":1071},"               # 推送所有标签\n",[98,2426,2427,2429,2431,2433,2435],{"class":100,"line":344},[98,2428,1077],{"class":704},[98,2430,2366],{"class":711},[98,2432,1587],{"class":1083},[98,2434,2378],{"class":711},[98,2436,2437],{"class":1071},"             # 删除本地标签\n",[98,2439,2440,2442,2444,2446,2449],{"class":100,"line":350},[98,2441,1077],{"class":704},[98,2443,1375],{"class":711},[98,2445,2201],{"class":711},[98,2447,2448],{"class":711}," :refs\u002Ftags\u002Fv1.0.0",[98,2450,2451],{"class":1071},"  # 删除远程标签\n",[29,2453,2455],{"id":2454},"八查看历史","八、查看历史",[90,2457,2459],{"className":1062,"code":2458,"language":1064,"meta":49,"style":49},"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",[75,2460,2461,2471,2483,2497,2517,2532,2547,2562,2580],{"__ignoreMap":49},[98,2462,2463,2465,2468],{"class":100,"line":101},[98,2464,1077],{"class":704},[98,2466,2467],{"class":711}," log",[98,2469,2470],{"class":1071},"                       # 完整日志\n",[98,2472,2473,2475,2477,2480],{"class":100,"line":50},[98,2474,1077],{"class":704},[98,2476,2467],{"class":711},[98,2478,2479],{"class":1083}," --oneline",[98,2481,2482],{"class":1071},"             # 单行\n",[98,2484,2485,2487,2489,2491,2494],{"class":100,"line":112},[98,2486,1077],{"class":704},[98,2488,2467],{"class":711},[98,2490,2479],{"class":1083},[98,2492,2493],{"class":1083}," --graph",[98,2495,2496],{"class":1071},"     # 图形化\n",[98,2498,2499,2501,2503,2506,2508,2510,2512,2514],{"class":100,"line":197},[98,2500,1077],{"class":704},[98,2502,2467],{"class":711},[98,2504,2505],{"class":1083}," -p",[98,2507,1302],{"class":700},[98,2509,1305],{"class":711},[98,2511,1308],{"class":696},[98,2513,1311],{"class":700},[98,2515,2516],{"class":1071},"             # 查看某文件历史\n",[98,2518,2519,2521,2523,2526,2529],{"class":100,"line":203},[98,2520,1077],{"class":704},[98,2522,2467],{"class":711},[98,2524,2525],{"class":1083}," --author=",[98,2527,2528],{"class":711},"\"name\"",[98,2530,2531],{"class":1071},"       # 按作者过滤\n",[98,2533,2534,2536,2538,2541,2544],{"class":100,"line":344},[98,2535,1077],{"class":704},[98,2537,2467],{"class":711},[98,2539,2540],{"class":1083}," --since=",[98,2542,2543],{"class":711},"\"2 weeks ago\"",[98,2545,2546],{"class":1071}," # 按时间过滤\n",[98,2548,2549,2551,2553,2556,2559],{"class":100,"line":350},[98,2550,1077],{"class":704},[98,2552,2467],{"class":711},[98,2554,2555],{"class":1083}," -S",[98,2557,2558],{"class":711}," \"keyword\"",[98,2560,2561],{"class":1071},"          # 按内容变化搜索（pickaxe）\n",[98,2563,2564,2566,2569,2571,2573,2575,2577],{"class":100,"line":1134},[98,2565,1077],{"class":704},[98,2567,2568],{"class":711}," blame",[98,2570,1302],{"class":700},[98,2572,1305],{"class":711},[98,2574,1308],{"class":696},[98,2576,1311],{"class":700},[98,2578,2579],{"class":1071},"              # 逐行查看最后修改者\n",[98,2581,2582,2584,2587,2589,2592,2595,2597],{"class":100,"line":1140},[98,2583,1077],{"class":704},[98,2585,2586],{"class":711}," show",[98,2588,1302],{"class":700},[98,2590,2591],{"class":711},"commi",[98,2593,2594],{"class":696},"t",[98,2596,1311],{"class":700},[98,2598,2599],{"class":1071},"             # 查看某次提交详情\n",[29,2601,2603],{"id":2602},"九常见问题","九、常见问题",[1390,2605,2607],{"id":2606},"_1-提交信息写错了未推送","1. 提交信息写错了（未推送）",[90,2609,2611],{"className":1062,"code":2610,"language":1064,"meta":49,"style":49},"git commit --amend -m \"new message\"\n",[75,2612,2613],{"__ignoreMap":49},[98,2614,2615,2617,2619,2622,2624],{"class":100,"line":101},[98,2616,1077],{"class":704},[98,2618,1345],{"class":711},[98,2620,2621],{"class":1083}," --amend",[98,2623,1348],{"class":1083},[98,2625,2626],{"class":711}," \"new message\"\n",[15,2628,2629],{},"如果只是想补充文件：",[90,2631,2633],{"className":1062,"code":2632,"language":1064,"meta":49,"style":49},"git add forgotten.txt\ngit commit --amend --no-edit\n",[75,2634,2635,2644],{"__ignoreMap":49},[98,2636,2637,2639,2641],{"class":100,"line":101},[98,2638,1077],{"class":704},[98,2640,1299],{"class":711},[98,2642,2643],{"class":711}," forgotten.txt\n",[98,2645,2646,2648,2650,2652],{"class":100,"line":50},[98,2647,1077],{"class":704},[98,2649,1345],{"class":711},[98,2651,2621],{"class":1083},[98,2653,2654],{"class":1083}," --no-edit\n",[1390,2656,2658],{"id":2657},"_2-提交到了错误的分支","2. 提交到了错误的分支",[90,2660,2662],{"className":1062,"code":2661,"language":1064,"meta":49,"style":49},"# 假设应该提交到 feature 分支，却提交到了 main\ngit branch feature                # 在当前位置创建分支\ngit reset --hard HEAD~1           # main 回退\ngit switch feature                # 切到 feature\n",[75,2663,2664,2669,2681,2694],{"__ignoreMap":49},[98,2665,2666],{"class":100,"line":101},[98,2667,2668],{"class":1071},"# 假设应该提交到 feature 分支，却提交到了 main\n",[98,2670,2671,2673,2675,2678],{"class":100,"line":50},[98,2672,1077],{"class":704},[98,2674,1474],{"class":711},[98,2676,2677],{"class":711}," feature",[98,2679,2680],{"class":1071},"                # 在当前位置创建分支\n",[98,2682,2683,2685,2687,2689,2691],{"class":100,"line":112},[98,2684,1077],{"class":704},[98,2686,1904],{"class":711},[98,2688,1984],{"class":1083},[98,2690,1963],{"class":711},[98,2692,2693],{"class":1071},"           # main 回退\n",[98,2695,2696,2698,2700,2702],{"class":100,"line":197},[98,2697,1077],{"class":704},[98,2699,1526],{"class":711},[98,2701,2677],{"class":711},[98,2703,2704],{"class":1071},"                # 切到 feature\n",[1390,2706,2708],{"id":2707},"_3-本地分支落后想同步远程","3. 本地分支落后，想同步远程",[90,2710,2712],{"className":1062,"code":2711,"language":1064,"meta":49,"style":49},"git fetch origin\ngit rebase origin\u002Fmain\n# 或者\ngit pull --rebase origin main\n",[75,2713,2714,2723,2732,2737],{"__ignoreMap":49},[98,2715,2716,2718,2720],{"class":100,"line":101},[98,2717,1077],{"class":704},[98,2719,2261],{"class":711},[98,2721,2722],{"class":711}," origin\n",[98,2724,2725,2727,2729],{"class":100,"line":50},[98,2726,1077],{"class":704},[98,2728,1704],{"class":711},[98,2730,2731],{"class":711}," origin\u002Fmain\n",[98,2733,2734],{"class":100,"line":112},[98,2735,2736],{"class":1071},"# 或者\n",[98,2738,2739,2741,2743,2745,2747],{"class":100,"line":197},[98,2740,1077],{"class":704},[98,2742,1385],{"class":711},[98,2744,2282],{"class":1083},[98,2746,2201],{"class":711},[98,2748,1178],{"class":711},[1390,2750,2752],{"id":2751},"_4-合并冲突","4. 合并冲突",[90,2754,2756],{"className":1062,"code":2755,"language":1064,"meta":49,"style":49},"git status                        # 查看冲突文件\n# 手动编辑冲突文件，删除 \u003C\u003C\u003C\u003C\u003C\u003C\u003C ======= >>>>>>> 标记\ngit add \u003Cresolved-file>\ngit commit                        # 或 git rebase --continue\n",[75,2757,2758,2767,2772,2787],{"__ignoreMap":49},[98,2759,2760,2762,2764],{"class":100,"line":101},[98,2761,1077],{"class":704},[98,2763,1289],{"class":711},[98,2765,2766],{"class":1071},"                        # 查看冲突文件\n",[98,2768,2769],{"class":100,"line":50},[98,2770,2771],{"class":1071},"# 手动编辑冲突文件，删除 \u003C\u003C\u003C\u003C\u003C\u003C\u003C ======= >>>>>>> 标记\n",[98,2773,2774,2776,2778,2780,2783,2785],{"class":100,"line":112},[98,2775,1077],{"class":704},[98,2777,1299],{"class":711},[98,2779,1302],{"class":700},[98,2781,2782],{"class":711},"resolved-fil",[98,2784,1308],{"class":696},[98,2786,720],{"class":700},[98,2788,2789,2791,2793],{"class":100,"line":197},[98,2790,1077],{"class":704},[98,2792,1345],{"class":711},[98,2794,2795],{"class":1071},"                        # 或 git rebase --continue\n",[15,2797,2798],{},"放弃合并：",[90,2800,2802],{"className":1062,"code":2801,"language":1064,"meta":49,"style":49},"git merge --abort\ngit rebase --abort\n",[75,2803,2804,2813],{"__ignoreMap":49},[98,2805,2806,2808,2810],{"class":100,"line":101},[98,2807,1077],{"class":704},[98,2809,1664],{"class":711},[98,2811,2812],{"class":1083}," --abort\n",[98,2814,2815,2817,2819],{"class":100,"line":50},[98,2816,1077],{"class":704},[98,2818,1704],{"class":711},[98,2820,2812],{"class":1083},[1390,2822,2824],{"id":2823},"_5-不小心提交了敏感信息","5. 不小心提交了敏感信息",[15,2826,2827,2828,2831,2832,2835],{},"如果还没推送，",[75,2829,2830],{},"git reset --hard"," 即可。",[2833,2834],"br",{},"\n如果已推送，必须改写历史：",[90,2837,2839],{"className":1062,"code":2838,"language":1064,"meta":49,"style":49},"git filter-repo --path secrets.txt --invert-paths\ngit push --force-with-lease\n",[75,2840,2841,2857],{"__ignoreMap":49},[98,2842,2843,2845,2848,2851,2854],{"class":100,"line":101},[98,2844,1077],{"class":704},[98,2846,2847],{"class":711}," filter-repo",[98,2849,2850],{"class":1083}," --path",[98,2852,2853],{"class":711}," secrets.txt",[98,2855,2856],{"class":1083}," --invert-paths\n",[98,2858,2859,2861,2863],{"class":100,"line":50},[98,2860,1077],{"class":704},[98,2862,1375],{"class":711},[98,2864,2865],{"class":1083}," --force-with-lease\n",[15,2867,2868],{},"同时立即更换泄露的密钥，因为 Git 服务器可能仍留有副本。",[1390,2870,2872],{"id":2871},"_6-忽略文件不生效","6. 忽略文件不生效",[90,2874,2876],{"className":1062,"code":2875,"language":1064,"meta":49,"style":49},"git rm -r --cached .\ngit add .\ngit commit -m \"fix gitignore\"\n",[75,2877,2878,2894,2902],{"__ignoreMap":49},[98,2879,2880,2882,2885,2888,2891],{"class":100,"line":101},[98,2881,1077],{"class":704},[98,2883,2884],{"class":711}," rm",[98,2886,2887],{"class":1083}," -r",[98,2889,2890],{"class":1083}," --cached",[98,2892,2893],{"class":711}," .\n",[98,2895,2896,2898,2900],{"class":100,"line":50},[98,2897,1077],{"class":704},[98,2899,1299],{"class":711},[98,2901,2893],{"class":711},[98,2903,2904,2906,2908,2910],{"class":100,"line":112},[98,2905,1077],{"class":704},[98,2907,1345],{"class":711},[98,2909,1348],{"class":1083},[98,2911,2912],{"class":711}," \"fix gitignore\"\n",[15,2914,2915,2918,2919,22],{},[75,2916,2917],{},".gitignore"," 只对未跟踪文件生效，已跟踪的文件需要先 ",[75,2920,2921],{},"rm --cached",[29,2923,2925],{"id":2924},"十提交规范conventional-commits","十、提交规范（Conventional Commits）",[90,2927,2930],{"className":2928,"code":2929,"language":216},[215],"\u003Ctype>(\u003Cscope>): \u003Csubject>\n\n\u003Cbody>\n\n\u003Cfooter>\n",[75,2931,2929],{"__ignoreMap":49},[15,2933,2934],{},"常用 type：",[357,2936,2937,2945],{},[360,2938,2939],{},[363,2940,2941,2943],{},[366,2942,416],{},[366,2944,374],{},[376,2946,2947,2957,2967,2977,2986,2996,3006,3015],{},[363,2948,2949,2954],{},[381,2950,2951],{},[75,2952,2953],{},"feat",[381,2955,2956],{},"新功能",[363,2958,2959,2964],{},[381,2960,2961],{},[75,2962,2963],{},"fix",[381,2965,2966],{},"修复 bug",[363,2968,2969,2974],{},[381,2970,2971],{},[75,2972,2973],{},"docs",[381,2975,2976],{},"文档变更",[363,2978,2979,2983],{},[381,2980,2981],{},[75,2982,559],{},[381,2984,2985],{},"格式调整（不影响代码逻辑）",[363,2987,2988,2993],{},[381,2989,2990],{},[75,2991,2992],{},"refactor",[381,2994,2995],{},"重构",[363,2997,2998,3003],{},[381,2999,3000],{},[75,3001,3002],{},"perf",[381,3004,3005],{},"性能优化",[363,3007,3008,3012],{},[381,3009,3010],{},[75,3011,61],{},[381,3013,3014],{},"测试相关",[363,3016,3017,3022],{},[381,3018,3019],{},[75,3020,3021],{},"chore",[381,3023,3024],{},"构建 \u002F 工具 \u002F 依赖变更",[15,3026,3027],{},"示例：",[90,3029,3032],{"className":3030,"code":3031,"language":216},[215],"feat(auth): 支持 OAuth 2.0 登录\n\n- 新增 GitHub \u002F Google 登录入口\n- 补充 token 刷新逻辑\n\nCloses #123\n",[75,3033,3031],{"__ignoreMap":49},[29,3035,3037],{"id":3036},"十一实用技巧","十一、实用技巧",[90,3039,3041],{"className":1062,"code":3040,"language":1064,"meta":49,"style":49},"# 快速查看某文件的最后一次修改\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",[75,3042,3043,3048,3068,3072,3077,3094,3098,3103,3116,3120,3125,3139,3143,3148,3165,3169,3174,3183,3187,3192,3202,3206,3212],{"__ignoreMap":49},[98,3044,3045],{"class":100,"line":101},[98,3046,3047],{"class":1071},"# 快速查看某文件的最后一次修改\n",[98,3049,3050,3052,3054,3057,3060,3062,3064,3066],{"class":100,"line":50},[98,3051,1077],{"class":704},[98,3053,2467],{"class":711},[98,3055,3056],{"class":1083}," -1",[98,3058,3059],{"class":1083}," --stat",[98,3061,1302],{"class":700},[98,3063,1305],{"class":711},[98,3065,1308],{"class":696},[98,3067,720],{"class":700},[98,3069,3070],{"class":100,"line":112},[98,3071,109],{"emptyLinePlaceholder":58},[98,3073,3074],{"class":100,"line":197},[98,3075,3076],{"class":1071},"# 查找是哪次提交引入了某个字符串\n",[98,3078,3079,3081,3083,3085,3088,3091],{"class":100,"line":203},[98,3080,1077],{"class":704},[98,3082,2467],{"class":711},[98,3084,2555],{"class":1083},[98,3086,3087],{"class":711}," \"search-string\"",[98,3089,3090],{"class":1083}," --source",[98,3092,3093],{"class":1083}," --all\n",[98,3095,3096],{"class":100,"line":344},[98,3097,109],{"emptyLinePlaceholder":58},[98,3099,3100],{"class":100,"line":350},[98,3101,3102],{"class":1071},"# 查看两个分支的共同祖先\n",[98,3104,3105,3107,3110,3113],{"class":100,"line":1134},[98,3106,1077],{"class":704},[98,3108,3109],{"class":711}," merge-base",[98,3111,3112],{"class":711}," main",[98,3114,3115],{"class":711}," feature\n",[98,3117,3118],{"class":100,"line":1140},[98,3119,109],{"emptyLinePlaceholder":58},[98,3121,3122],{"class":100,"line":1155},[98,3123,3124],{"class":1071},"# 比较工作区和某个提交\n",[98,3126,3127,3129,3131,3133,3135,3137],{"class":100,"line":1160},[98,3128,1077],{"class":704},[98,3130,1404],{"class":711},[98,3132,1302],{"class":700},[98,3134,2591],{"class":711},[98,3136,2594],{"class":696},[98,3138,720],{"class":700},[98,3140,3141],{"class":100,"line":1166},[98,3142,109],{"emptyLinePlaceholder":58},[98,3144,3145],{"class":100,"line":1181},[98,3146,3147],{"class":1071},"# 临时切换到某个提交查看，不切分支\n",[98,3149,3150,3152,3154,3157,3159,3161,3163],{"class":100,"line":1186},[98,3151,1077],{"class":704},[98,3153,1526],{"class":711},[98,3155,3156],{"class":1083}," --detach",[98,3158,1302],{"class":700},[98,3160,2591],{"class":711},[98,3162,2594],{"class":696},[98,3164,720],{"class":700},[98,3166,3167],{"class":100,"line":1192},[98,3168,109],{"emptyLinePlaceholder":58},[98,3170,3171],{"class":100,"line":1207},[98,3172,3173],{"class":1071},"# 查看暂存区的具体内容\n",[98,3175,3176,3178,3180],{"class":100,"line":1222},[98,3177,1077],{"class":704},[98,3179,1404],{"class":711},[98,3181,3182],{"class":1083}," --staged\n",[98,3184,3185],{"class":100,"line":1237},[98,3186,109],{"emptyLinePlaceholder":58},[98,3188,3189],{"class":100,"line":1252},[98,3190,3191],{"class":1071},"# 统计每个作者的提交数\n",[98,3193,3194,3196,3199],{"class":100,"line":1257},[98,3195,1077],{"class":704},[98,3197,3198],{"class":711}," shortlog",[98,3200,3201],{"class":1083}," -sn\n",[98,3203,3204],{"class":100,"line":1263},[98,3205,109],{"emptyLinePlaceholder":58},[98,3207,3209],{"class":100,"line":3208},22,[98,3210,3211],{"class":1071},"# 找出未被合并的分支\n",[98,3213,3215,3217,3219],{"class":100,"line":3214},23,[98,3216,1077],{"class":704},[98,3218,1474],{"class":711},[98,3220,3221],{"class":1083}," --no-merged\n",[29,3223,3225],{"id":3224},"十二配置文件位置","十二、配置文件位置",[357,3227,3228,3238],{},[360,3229,3230],{},[363,3231,3232,3235],{},[366,3233,3234],{},"级别",[366,3236,3237],{},"路径",[376,3239,3240,3255,3268],{},[363,3241,3242,3245],{},[381,3243,3244],{},"系统",[381,3246,3247,3250,3251,3254],{},[75,3248,3249],{},"\u002Fetc\u002Fgitconfig","（Linux）\u002F ",[75,3252,3253],{},"C:\\Program Files\\Git\\etc\\gitconfig","（Windows）",[363,3256,3257,3260],{},[381,3258,3259],{},"全局",[381,3261,3262,424,3265],{},[75,3263,3264],{},"~\u002F.gitconfig",[75,3266,3267],{},"%USERPROFILE%\\.gitconfig",[363,3269,3270,3273],{},[381,3271,3272],{},"仓库",[381,3274,3275],{},[75,3276,3277],{},"\u003Crepo>\u002F.git\u002Fconfig",[15,3279,3280],{},"优先级：仓库 > 全局 > 系统。",[959,3282],{},[29,3284,3285],{"id":3285},"参考",[33,3287,3288,3297,3304],{},[36,3289,3290,3291],{},"官方文档：",[972,3292,3293],{"href":3293,"rel":3294,"target":975},"https:\u002F\u002Fgit-scm.com\u002Fdocs",[3295,977,3296],"nofollow","noreferrer",[36,3298,3299,3300],{},"Pro Git（中文版）：",[972,3301,3302],{"href":3302,"rel":3303,"target":975},"https:\u002F\u002Fgit-scm.com\u002Fbook\u002Fzh\u002Fv2",[3295,977,3296],[36,3305,3306,3307],{},"Conventional Commits：",[972,3308,3309],{"href":3309,"rel":3310,"target":975},"https:\u002F\u002Fwww.conventionalcommits.org\u002Fzh-hans\u002F",[3295,977,3296],[559,3312,3313],{},"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":49,"searchDepth":50,"depth":50,"links":3315},[3316,3317,3320,3323,3329,3330,3331,3332,3333,3341,3342,3343,3344],{"id":1058,"depth":50,"text":1059},{"id":1276,"depth":50,"text":1277,"children":3318},[3319],{"id":1392,"depth":112,"text":1392},{"id":1461,"depth":50,"text":1462,"children":3321},[3322],{"id":1652,"depth":112,"text":1652},{"id":1741,"depth":50,"text":1742,"children":3324},[3325,3326,3327,3328],{"id":1816,"depth":112,"text":1816},{"id":1873,"depth":112,"text":1873},{"id":1920,"depth":112,"text":1920},{"id":2014,"depth":112,"text":2014},{"id":2062,"depth":50,"text":2063},{"id":2171,"depth":50,"text":2172},{"id":2353,"depth":50,"text":2354},{"id":2454,"depth":50,"text":2455},{"id":2602,"depth":50,"text":2603,"children":3334},[3335,3336,3337,3338,3339,3340],{"id":2606,"depth":112,"text":2607},{"id":2657,"depth":112,"text":2658},{"id":2707,"depth":112,"text":2708},{"id":2751,"depth":112,"text":2752},{"id":2823,"depth":112,"text":2824},{"id":2871,"depth":112,"text":2872},{"id":2924,"depth":50,"text":2925},{"id":3036,"depth":50,"text":3037},{"id":3224,"depth":50,"text":3225},{"id":3285,"depth":50,"text":3285},"2026-09-25",{},"\u002Fgit-memo-2026-09-25",{"title":1050,"description":1055},"git-memo-2026-09-25",[3351,3352],"Git","备忘录","0H9pi2QAc8Lw_Eh4bdHwdkFMYOEf4495Ze_IMkWMpDk",{"id":3355,"title":3356,"author":9,"body":3357,"cover":3,"date":3345,"description":3361,"extension":56,"meta":8985,"navigation":58,"path":8986,"seo":8987,"stem":8988,"tags":8989,"__hash__":8992},"content\u002Flinux-memo-2026-09-25.md","Linux 备忘录",{"type":12,"value":3358,"toc":8937},[3359,3362,3366,3370,3373,3430,3440,3463,3473,3477,3541,3545,3647,3653,3731,3736,3781,3785,3792,3798,3801,3858,3862,3956,3959,4017,4021,4026,4085,4133,4138,4142,4172,4176,4181,4223,4227,4307,4311,4503,4506,4658,4662,5043,5046,5113,5117,5224,5227,5273,5290,5293,5352,5356,5555,5558,5616,5620,5945,5948,6085,6089,6219,6222,6270,6274,6458,6462,6657,6660,6669,6675,6679,6842,6848,6923,6951,6955,7063,7068,7074,7080,7083,7201,7205,7209,7403,7407,7609,7613,7697,7701,7822,7826,7972,7976,8045,8048,8084,8087,8226,8230,8263,8266,8272,8274,8280,8283,8297,8301,8505,8508,8579,8582,8773,8777,8887,8889,8891,8934],[15,3360,3361],{},"国内环境下的高频命令。换源和镜像放在最前面。",[29,3363,3365],{"id":3364},"一换源","一、换源",[1390,3367,3369],{"id":3368},"_11-aptdebian-ubuntu","1.1 apt（Debian \u002F Ubuntu）",[15,3371,3372],{},"先备份，再替换：",[90,3374,3376],{"className":1062,"code":3375,"language":1064,"meta":49,"style":49},"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",[75,3377,3378,3392,3407,3420],{"__ignoreMap":49},[98,3379,3380,3383,3386,3389],{"class":100,"line":101},[98,3381,3382],{"class":704},"sudo",[98,3384,3385],{"class":711}," cp",[98,3387,3388],{"class":711}," \u002Fetc\u002Fapt\u002Fsources.list",[98,3390,3391],{"class":711}," \u002Fetc\u002Fapt\u002Fsources.list.bak\n",[98,3393,3394,3396,3399,3401,3404],{"class":100,"line":50},[98,3395,3382],{"class":704},[98,3397,3398],{"class":711}," sed",[98,3400,1724],{"class":1083},[98,3402,3403],{"class":711}," 's|http:\u002F\u002Farchive.ubuntu.com|https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn|g'",[98,3405,3406],{"class":711}," \u002Fetc\u002Fapt\u002Fsources.list\n",[98,3408,3409,3411,3413,3415,3418],{"class":100,"line":112},[98,3410,3382],{"class":704},[98,3412,3398],{"class":711},[98,3414,1724],{"class":1083},[98,3416,3417],{"class":711}," 's|http:\u002F\u002Fsecurity.ubuntu.com|https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn|g'",[98,3419,3406],{"class":711},[98,3421,3422,3424,3427],{"class":100,"line":197},[98,3423,3382],{"class":704},[98,3425,3426],{"class":711}," apt",[98,3428,3429],{"class":711}," update\n",[15,3431,3432,3435,3436,3439],{},[19,3433,3434],{},"Ubuntu 24.04+"," 使用新格式 ",[75,3437,3438],{},"\u002Fetc\u002Fapt\u002Fsources.list.d\u002Fubuntu.sources","：",[90,3441,3443],{"className":1062,"code":3442,"language":1064,"meta":49,"style":49},"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",[75,3444,3445,3458],{"__ignoreMap":49},[98,3446,3447,3449,3451,3453,3455],{"class":100,"line":101},[98,3448,3382],{"class":704},[98,3450,3398],{"class":711},[98,3452,1724],{"class":1083},[98,3454,3403],{"class":711},[98,3456,3457],{"class":1083}," \\\n",[98,3459,3460],{"class":100,"line":50},[98,3461,3462],{"class":711},"  \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fubuntu.sources\n",[15,3464,3465,3468,3469,3472],{},[19,3466,3467],{},"Debian 12+"," 使用 ",[75,3470,3471],{},"\u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdebian.sources","，同理。",[1390,3474,3476],{"id":3475},"_12-常用-apt-镜像源","1.2 常用 apt 镜像源",[357,3478,3479,3489],{},[360,3480,3481],{},[363,3482,3483,3486],{},[366,3484,3485],{},"源",[366,3487,3488],{},"URL",[376,3490,3491,3501,3511,3521,3531],{},[363,3492,3493,3496],{},[381,3494,3495],{},"清华",[381,3497,3498],{},[75,3499,3500],{},"https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn",[363,3502,3503,3506],{},[381,3504,3505],{},"阿里云",[381,3507,3508],{},[75,3509,3510],{},"https:\u002F\u002Fmirrors.aliyun.com",[363,3512,3513,3516],{},[381,3514,3515],{},"中科大",[381,3517,3518],{},[75,3519,3520],{},"https:\u002F\u002Fmirrors.ustc.edu.cn",[363,3522,3523,3526],{},[381,3524,3525],{},"华为云",[381,3527,3528],{},[75,3529,3530],{},"https:\u002F\u002Fmirrors.huaweicloud.com",[363,3532,3533,3536],{},[381,3534,3535],{},"网易",[381,3537,3538],{},[75,3539,3540],{},"https:\u002F\u002Fmirrors.163.com",[1390,3542,3544],{"id":3543},"_13-yum-dnfrhel-centos-fedora","1.3 yum \u002F dnf（RHEL \u002F CentOS \u002F Fedora）",[90,3546,3548],{"className":1062,"code":3547,"language":1064,"meta":49,"style":49},"# 备份\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",[75,3549,3550,3555,3569,3573,3578,3599,3612,3621,3625,3638],{"__ignoreMap":49},[98,3551,3552],{"class":100,"line":101},[98,3553,3554],{"class":1071},"# 备份\n",[98,3556,3557,3559,3561,3563,3566],{"class":100,"line":50},[98,3558,3382],{"class":704},[98,3560,3385],{"class":711},[98,3562,2887],{"class":1083},[98,3564,3565],{"class":711}," \u002Fetc\u002Fyum.repos.d",[98,3567,3568],{"class":711}," \u002Fetc\u002Fyum.repos.d.bak\n",[98,3570,3571],{"class":100,"line":112},[98,3572,109],{"emptyLinePlaceholder":58},[98,3574,3575],{"class":100,"line":197},[98,3576,3577],{"class":1071},"# CentOS 7 换阿里云\n",[98,3579,3580,3582,3584,3586,3589,3592,3596],{"class":100,"line":203},[98,3581,3382],{"class":704},[98,3583,3398],{"class":711},[98,3585,1724],{"class":1083},[98,3587,3588],{"class":711}," 's|mirrorlist=|#mirrorlist=|g'",[98,3590,3591],{"class":711}," \u002Fetc\u002Fyum.repos.d\u002FCentOS-",[98,3593,3595],{"class":3594},"szGx7","*",[98,3597,3598],{"class":711},".repo\n",[98,3600,3601,3603,3605,3607,3610],{"class":100,"line":344},[98,3602,3382],{"class":704},[98,3604,3398],{"class":711},[98,3606,1724],{"class":1083},[98,3608,3609],{"class":711}," 's|#baseurl=http:\u002F\u002Fmirror.centos.org|baseurl=https:\u002F\u002Fmirrors.aliyun.com|g'",[98,3611,3457],{"class":1083},[98,3613,3614,3617,3619],{"class":100,"line":350},[98,3615,3616],{"class":711},"  \u002Fetc\u002Fyum.repos.d\u002FCentOS-",[98,3618,3595],{"class":3594},[98,3620,3598],{"class":711},[98,3622,3623],{"class":100,"line":1134},[98,3624,109],{"emptyLinePlaceholder":58},[98,3626,3627,3629,3632,3635],{"class":100,"line":1140},[98,3628,3382],{"class":704},[98,3630,3631],{"class":711}," yum",[98,3633,3634],{"class":711}," clean",[98,3636,3637],{"class":711}," all\n",[98,3639,3640,3642,3644],{"class":100,"line":1155},[98,3641,3382],{"class":704},[98,3643,3631],{"class":711},[98,3645,3646],{"class":711}," makecache\n",[15,3648,3649,3652],{},[19,3650,3651],{},"CentOS 8 \u002F Stream"," 需要先换 vault（官方源已下线）：",[90,3654,3656],{"className":1062,"code":3655,"language":1064,"meta":49,"style":49},"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",[75,3657,3658,3676,3693,3710],{"__ignoreMap":49},[98,3659,3660,3662,3664,3666,3669,3672,3674],{"class":100,"line":101},[98,3661,3382],{"class":704},[98,3663,3398],{"class":711},[98,3665,1724],{"class":1083},[98,3667,3668],{"class":711}," 's|mirror.centos.org|mirrors.aliyun.com|g'",[98,3670,3671],{"class":711}," \u002Fetc\u002Fyum.repos.d\u002F",[98,3673,3595],{"class":3594},[98,3675,3598],{"class":711},[98,3677,3678,3680,3682,3684,3687,3689,3691],{"class":100,"line":50},[98,3679,3382],{"class":704},[98,3681,3398],{"class":711},[98,3683,1724],{"class":1083},[98,3685,3686],{"class":711}," 's|^#baseurl|baseurl|g'",[98,3688,3671],{"class":711},[98,3690,3595],{"class":3594},[98,3692,3598],{"class":711},[98,3694,3695,3697,3699,3701,3704,3706,3708],{"class":100,"line":112},[98,3696,3382],{"class":704},[98,3698,3398],{"class":711},[98,3700,1724],{"class":1083},[98,3702,3703],{"class":711}," 's|^mirrorlist|#mirrorlist|g'",[98,3705,3671],{"class":711},[98,3707,3595],{"class":3594},[98,3709,3598],{"class":711},[98,3711,3712,3714,3717,3719,3722,3725,3727,3729],{"class":100,"line":197},[98,3713,3382],{"class":704},[98,3715,3716],{"class":711}," dnf",[98,3718,3634],{"class":711},[98,3720,3721],{"class":711}," all",[98,3723,3724],{"class":696}," && ",[98,3726,3382],{"class":704},[98,3728,3716],{"class":711},[98,3730,3646],{"class":711},[15,3732,3733,3439],{},[19,3734,3735],{},"Fedora",[90,3737,3739],{"className":1062,"code":3738,"language":1064,"meta":49,"style":49},"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",[75,3740,3741,3759,3772],{"__ignoreMap":49},[98,3742,3743,3745,3747,3749,3752,3755,3757],{"class":100,"line":101},[98,3744,3382],{"class":704},[98,3746,3398],{"class":711},[98,3748,1724],{"class":1083},[98,3750,3751],{"class":711}," 's|^metalink=|#metalink=|g'",[98,3753,3754],{"class":711}," \u002Fetc\u002Fyum.repos.d\u002Ffedora",[98,3756,3595],{"class":3594},[98,3758,3598],{"class":711},[98,3760,3761,3763,3765,3767,3770],{"class":100,"line":50},[98,3762,3382],{"class":704},[98,3764,3398],{"class":711},[98,3766,1724],{"class":1083},[98,3768,3769],{"class":711}," 's|^#baseurl=http:\u002F\u002Fdownload.example\u002Fpub\u002Ffedora\u002Flinux|baseurl=https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn\u002Ffedora|g'",[98,3771,3457],{"class":1083},[98,3773,3774,3777,3779],{"class":100,"line":112},[98,3775,3776],{"class":711},"  \u002Fetc\u002Fyum.repos.d\u002Ffedora",[98,3778,3595],{"class":3594},[98,3780,3598],{"class":711},[1390,3782,3784],{"id":3783},"_14-pacmanarch","1.4 pacman（Arch）",[15,3786,3787,3788,3791],{},"编辑 ",[75,3789,3790],{},"\u002Fetc\u002Fpacman.d\u002Fmirrorlist","，把国内源放前面：",[90,3793,3796],{"className":3794,"code":3795,"language":216},[215],"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",[75,3797,3795],{"__ignoreMap":49},[15,3799,3800],{},"或者一键：",[90,3802,3804],{"className":1062,"code":3803,"language":1064,"meta":49,"style":49},"sudo pacman -S reflector\nsudo reflector --country China --latest 5 --sort rate --save \u002Fetc\u002Fpacman.d\u002Fmirrorlist\nsudo pacman -Syyu\n",[75,3805,3806,3818,3849],{"__ignoreMap":49},[98,3807,3808,3810,3813,3815],{"class":100,"line":101},[98,3809,3382],{"class":704},[98,3811,3812],{"class":711}," pacman",[98,3814,2555],{"class":1083},[98,3816,3817],{"class":711}," reflector\n",[98,3819,3820,3822,3825,3828,3831,3834,3837,3840,3843,3846],{"class":100,"line":50},[98,3821,3382],{"class":704},[98,3823,3824],{"class":711}," reflector",[98,3826,3827],{"class":1083}," --country",[98,3829,3830],{"class":711}," China",[98,3832,3833],{"class":1083}," --latest",[98,3835,3836],{"class":1083}," 5",[98,3838,3839],{"class":1083}," --sort",[98,3841,3842],{"class":711}," rate",[98,3844,3845],{"class":1083}," --save",[98,3847,3848],{"class":711}," \u002Fetc\u002Fpacman.d\u002Fmirrorlist\n",[98,3850,3851,3853,3855],{"class":100,"line":112},[98,3852,3382],{"class":704},[98,3854,3812],{"class":711},[98,3856,3857],{"class":1083}," -Syyu\n",[1390,3859,3861],{"id":3860},"_15-pip-换源","1.5 pip 换源",[90,3863,3865],{"className":1062,"code":3864,"language":1064,"meta":49,"style":49},"# 永久\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",[75,3866,3867,3872,3888,3902,3906,3911,3916,3921,3926,3930,3935],{"__ignoreMap":49},[98,3868,3869],{"class":100,"line":101},[98,3870,3871],{"class":1071},"# 永久\n",[98,3873,3874,3877,3879,3882,3885],{"class":100,"line":50},[98,3875,3876],{"class":704},"pip",[98,3878,1080],{"class":711},[98,3880,3881],{"class":711}," set",[98,3883,3884],{"class":711}," global.index-url",[98,3886,3887],{"class":711}," https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\n",[98,3889,3890,3892,3894,3896,3899],{"class":100,"line":112},[98,3891,3876],{"class":704},[98,3893,1080],{"class":711},[98,3895,3881],{"class":711},[98,3897,3898],{"class":711}," global.trusted-host",[98,3900,3901],{"class":711}," pypi.tuna.tsinghua.edu.cn\n",[98,3903,3904],{"class":100,"line":197},[98,3905,109],{"emptyLinePlaceholder":58},[98,3907,3908],{"class":100,"line":203},[98,3909,3910],{"class":1071},"# 或写入 ~\u002F.pip\u002Fpip.conf (Linux) \u002F %APPDATA%\\pip\\pip.ini (Windows)\n",[98,3912,3913],{"class":100,"line":344},[98,3914,3915],{"class":1071},"# [global]\n",[98,3917,3918],{"class":100,"line":350},[98,3919,3920],{"class":1071},"# index-url = https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\n",[98,3922,3923],{"class":100,"line":1134},[98,3924,3925],{"class":1071},"# trusted-host = pypi.tuna.tsinghua.edu.cn\n",[98,3927,3928],{"class":100,"line":1140},[98,3929,109],{"emptyLinePlaceholder":58},[98,3931,3932],{"class":100,"line":1155},[98,3933,3934],{"class":1071},"# 一次性\n",[98,3936,3937,3939,3942,3944,3947,3950,3952,3954],{"class":100,"line":1160},[98,3938,3876],{"class":704},[98,3940,3941],{"class":711}," install",[98,3943,1302],{"class":700},[98,3945,3946],{"class":711},"pk",[98,3948,3949],{"class":696},"g",[98,3951,1311],{"class":700},[98,3953,1724],{"class":1083},[98,3955,3887],{"class":711},[15,3957,3958],{},"常用 pip 镜像：",[357,3960,3961,3969],{},[360,3962,3963],{},[363,3964,3965,3967],{},[366,3966,3485],{},[366,3968,3488],{},[376,3970,3971,3980,3989,3998,4008],{},[363,3972,3973,3975],{},[381,3974,3495],{},[381,3976,3977],{},[75,3978,3979],{},"https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple",[363,3981,3982,3984],{},[381,3983,3505],{},[381,3985,3986],{},[75,3987,3988],{},"https:\u002F\u002Fmirrors.aliyun.com\u002Fpypi\u002Fsimple\u002F",[363,3990,3991,3993],{},[381,3992,3515],{},[381,3994,3995],{},[75,3996,3997],{},"https:\u002F\u002Fpypi.mirrors.ustc.edu.cn\u002Fsimple\u002F",[363,3999,4000,4003],{},[381,4001,4002],{},"豆瓣",[381,4004,4005],{},[75,4006,4007],{},"https:\u002F\u002Fpypi.douban.com\u002Fsimple\u002F",[363,4009,4010,4012],{},[381,4011,3525],{},[381,4013,4014],{},[75,4015,4016],{},"https:\u002F\u002Fmirrors.huaweicloud.com\u002Frepository\u002Fpypi\u002Fsimple\u002F",[1390,4018,4020],{"id":4019},"_16-docker-镜像加速","1.6 Docker 镜像加速",[15,4022,3787,4023,3439],{},[75,4024,4025],{},"\u002Fetc\u002Fdocker\u002Fdaemon.json",[90,4027,4031],{"className":4028,"code":4029,"language":4030,"meta":49,"style":49},"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",[75,4032,4033,4038,4047,4056,4063,4070,4075,4080],{"__ignoreMap":49},[98,4034,4035],{"class":100,"line":101},[98,4036,4037],{"class":696},"{\n",[98,4039,4040,4044],{"class":100,"line":50},[98,4041,4043],{"class":4042},"sOx1s","  \"registry-mirrors\"",[98,4045,4046],{"class":696},": [\n",[98,4048,4049,4053],{"class":100,"line":112},[98,4050,4052],{"class":4051},"susgL","    \"https:\u002F\u002Fdocker.m.daocloud.io\"",[98,4054,4055],{"class":696},",\n",[98,4057,4058,4061],{"class":100,"line":197},[98,4059,4060],{"class":4051},"    \"https:\u002F\u002Fdockerproxy.com\"",[98,4062,4055],{"class":696},[98,4064,4065,4068],{"class":100,"line":203},[98,4066,4067],{"class":4051},"    \"https:\u002F\u002Fmirror.baidubce.com\"",[98,4069,4055],{"class":696},[98,4071,4072],{"class":100,"line":344},[98,4073,4074],{"class":4051},"    \"https:\u002F\u002Fccr.ccs.tencentyun.com\"\n",[98,4076,4077],{"class":100,"line":350},[98,4078,4079],{"class":696},"  ]\n",[98,4081,4082],{"class":100,"line":1134},[98,4083,4084],{"class":696},"}\n",[90,4086,4088],{"className":1062,"code":4087,"language":1064,"meta":49,"style":49},"sudo systemctl daemon-reload\nsudo systemctl restart docker\ndocker info | grep -A 5 \"Registry Mirrors\"\n",[75,4089,4090,4100,4112],{"__ignoreMap":49},[98,4091,4092,4094,4097],{"class":100,"line":101},[98,4093,3382],{"class":704},[98,4095,4096],{"class":711}," systemctl",[98,4098,4099],{"class":711}," daemon-reload\n",[98,4101,4102,4104,4106,4109],{"class":100,"line":50},[98,4103,3382],{"class":704},[98,4105,4096],{"class":711},[98,4107,4108],{"class":711}," restart",[98,4110,4111],{"class":711}," docker\n",[98,4113,4114,4117,4120,4123,4126,4128,4130],{"class":100,"line":112},[98,4115,4116],{"class":704},"docker",[98,4118,4119],{"class":711}," info",[98,4121,4122],{"class":700}," |",[98,4124,4125],{"class":704}," grep",[98,4127,1335],{"class":1083},[98,4129,3836],{"class":1083},[98,4131,4132],{"class":711}," \"Registry Mirrors\"\n",[43,4134,4135],{},[15,4136,4137],{},"2024 年后很多公共镜像源已停服，以上仅供参考。企业环境建议自建 Harbor 或使用阿里云\u002F腾讯云容器镜像服务。",[1390,4139,4141],{"id":4140},"_17-go-module-代理","1.7 Go module 代理",[90,4143,4145],{"className":1062,"code":4144,"language":1064,"meta":49,"style":49},"go env -w GOPROXY=https:\u002F\u002Fgoproxy.cn,direct\ngo env -w GOSUMDB=sum.golang.google.cn\n",[75,4146,4147,4161],{"__ignoreMap":49},[98,4148,4149,4152,4155,4158],{"class":100,"line":101},[98,4150,4151],{"class":704},"go",[98,4153,4154],{"class":711}," env",[98,4156,4157],{"class":1083}," -w",[98,4159,4160],{"class":711}," GOPROXY=https:\u002F\u002Fgoproxy.cn,direct\n",[98,4162,4163,4165,4167,4169],{"class":100,"line":50},[98,4164,4151],{"class":704},[98,4166,4154],{"class":711},[98,4168,4157],{"class":1083},[98,4170,4171],{"class":711}," GOSUMDB=sum.golang.google.cn\n",[1390,4173,4175],{"id":4174},"_18-maven-换源","1.8 Maven 换源",[15,4177,3787,4178,3439],{},[75,4179,4180],{},"~\u002F.m2\u002Fsettings.xml",[90,4182,4186],{"className":4183,"code":4184,"language":4185,"meta":49,"style":49},"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",[75,4187,4188,4193,4198,4203,4208,4213,4218],{"__ignoreMap":49},[98,4189,4190],{"class":100,"line":101},[98,4191,4192],{},"\u003Cmirrors>\n",[98,4194,4195],{"class":100,"line":50},[98,4196,4197],{},"  \u003Cmirror>\n",[98,4199,4200],{"class":100,"line":112},[98,4201,4202],{},"    \u003Cid>aliyun\u003C\u002Fid>\n",[98,4204,4205],{"class":100,"line":197},[98,4206,4207],{},"    \u003CmirrorOf>central\u003C\u002FmirrorOf>\n",[98,4209,4210],{"class":100,"line":203},[98,4211,4212],{},"    \u003Curl>https:\u002F\u002Fmaven.aliyun.com\u002Frepository\u002Fpublic\u003C\u002Furl>\n",[98,4214,4215],{"class":100,"line":344},[98,4216,4217],{},"  \u003C\u002Fmirror>\n",[98,4219,4220],{"class":100,"line":350},[98,4221,4222],{},"\u003C\u002Fmirrors>\n",[1390,4224,4226],{"id":4225},"_19-换源后必做","1.9 换源后必做",[90,4228,4230],{"className":1062,"code":4229,"language":1064,"meta":49,"style":49},"# 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",[75,4231,4232,4237,4245,4249,4254,4272,4290,4294,4299],{"__ignoreMap":49},[98,4233,4234],{"class":100,"line":101},[98,4235,4236],{"class":1071},"# apt\n",[98,4238,4239,4241,4243],{"class":100,"line":50},[98,4240,3382],{"class":704},[98,4242,3426],{"class":711},[98,4244,3429],{"class":711},[98,4246,4247],{"class":100,"line":112},[98,4248,109],{"emptyLinePlaceholder":58},[98,4250,4251],{"class":100,"line":197},[98,4252,4253],{"class":1071},"# yum \u002F dnf\n",[98,4255,4256,4258,4260,4262,4264,4266,4268,4270],{"class":100,"line":203},[98,4257,3382],{"class":704},[98,4259,3631],{"class":711},[98,4261,3634],{"class":711},[98,4263,3721],{"class":711},[98,4265,3724],{"class":696},[98,4267,3382],{"class":704},[98,4269,3631],{"class":711},[98,4271,3646],{"class":711},[98,4273,4274,4276,4278,4280,4282,4284,4286,4288],{"class":100,"line":344},[98,4275,3382],{"class":704},[98,4277,3716],{"class":711},[98,4279,3634],{"class":711},[98,4281,3721],{"class":711},[98,4283,3724],{"class":696},[98,4285,3382],{"class":704},[98,4287,3716],{"class":711},[98,4289,3646],{"class":711},[98,4291,4292],{"class":100,"line":350},[98,4293,109],{"emptyLinePlaceholder":58},[98,4295,4296],{"class":100,"line":1134},[98,4297,4298],{"class":1071},"# pacman\n",[98,4300,4301,4303,4305],{"class":100,"line":1140},[98,4302,3382],{"class":704},[98,4304,3812],{"class":711},[98,4306,3857],{"class":1083},[29,4308,4310],{"id":4309},"二文件与目录","二、文件与目录",[90,4312,4314],{"className":1062,"code":4313,"language":1064,"meta":49,"style":49},"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",[75,4315,4316,4325,4336,4347,4360,4381,4410,4434,4464,4477,4490],{"__ignoreMap":49},[98,4317,4318,4322],{"class":100,"line":101},[98,4319,4321],{"class":4320},"sYf5A","pwd",[98,4323,4324],{"class":1071},"                               # 当前目录\n",[98,4326,4327,4330,4333],{"class":100,"line":50},[98,4328,4329],{"class":704},"ls",[98,4331,4332],{"class":1083}," -alh",[98,4334,4335],{"class":1071},"                           # 详细列表\n",[98,4337,4338,4341,4344],{"class":100,"line":112},[98,4339,4340],{"class":4320},"cd",[98,4342,4343],{"class":711}," -",[98,4345,4346],{"class":1071},"                              # 上一个目录\n",[98,4348,4349,4352,4354,4357],{"class":100,"line":197},[98,4350,4351],{"class":704},"mkdir",[98,4353,2505],{"class":1083},[98,4355,4356],{"class":711}," a\u002Fb\u002Fc",[98,4358,4359],{"class":1071},"                    # 递归创建\n",[98,4361,4362,4365,4368,4370,4373,4376,4378],{"class":100,"line":203},[98,4363,4364],{"class":704},"rm",[98,4366,4367],{"class":1083}," -rf",[98,4369,1302],{"class":700},[98,4371,4372],{"class":711},"di",[98,4374,4375],{"class":696},"r",[98,4377,1311],{"class":700},[98,4379,4380],{"class":1071},"                      # 递归删除（危险）\n",[98,4382,4383,4386,4388,4390,4393,4396,4398,4400,4403,4405,4407],{"class":100,"line":344},[98,4384,4385],{"class":704},"cp",[98,4387,2887],{"class":1083},[98,4389,1302],{"class":700},[98,4391,4392],{"class":711},"sr",[98,4394,4395],{"class":696},"c",[98,4397,1311],{"class":700},[98,4399,1302],{"class":700},[98,4401,4402],{"class":711},"ds",[98,4404,2594],{"class":696},[98,4406,1311],{"class":700},[98,4408,4409],{"class":1071},"                 # 递归复制\n",[98,4411,4412,4415,4417,4419,4421,4423,4425,4427,4429,4431],{"class":100,"line":350},[98,4413,4414],{"class":704},"mv",[98,4416,1302],{"class":700},[98,4418,4392],{"class":711},[98,4420,4395],{"class":696},[98,4422,1311],{"class":700},[98,4424,1302],{"class":700},[98,4426,4402],{"class":711},[98,4428,2594],{"class":696},[98,4430,1311],{"class":700},[98,4432,4433],{"class":1071},"                    # 移动 \u002F 重命名\n",[98,4435,4436,4439,4442,4444,4447,4449,4451,4453,4456,4459,4461],{"class":100,"line":1134},[98,4437,4438],{"class":704},"ln",[98,4440,4441],{"class":1083}," -s",[98,4443,1302],{"class":700},[98,4445,4446],{"class":711},"targe",[98,4448,2594],{"class":696},[98,4450,1311],{"class":700},[98,4452,1302],{"class":700},[98,4454,4455],{"class":711},"lin",[98,4457,4458],{"class":696},"k",[98,4460,1311],{"class":700},[98,4462,4463],{"class":1071},"             # 软链接\n",[98,4465,4466,4469,4471,4473,4475],{"class":100,"line":1140},[98,4467,4468],{"class":704},"touch",[98,4470,1302],{"class":700},[98,4472,1305],{"class":711},[98,4474,1308],{"class":696},[98,4476,720],{"class":700},[98,4478,4479,4482,4484,4486,4488],{"class":100,"line":1155},[98,4480,4481],{"class":4320},"stat",[98,4483,1302],{"class":700},[98,4485,1305],{"class":711},[98,4487,1308],{"class":696},[98,4489,720],{"class":700},[98,4491,4492,4495,4497,4499,4501],{"class":100,"line":1160},[98,4493,4494],{"class":704},"file",[98,4496,1302],{"class":700},[98,4498,1305],{"class":711},[98,4500,1308],{"class":696},[98,4502,720],{"class":700},[1390,4504,4505],{"id":4505},"查找",[90,4507,4509],{"className":1062,"code":4508,"language":1064,"meta":49,"style":49},"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",[75,4510,4511,4527,4548,4563,4580,4608,4612,4629,4642],{"__ignoreMap":49},[98,4512,4513,4516,4518,4521,4524],{"class":100,"line":101},[98,4514,4515],{"class":704},"find",[98,4517,1323],{"class":711},[98,4519,4520],{"class":1083}," -name",[98,4522,4523],{"class":711}," \"*.log\"",[98,4525,4526],{"class":1071},"                          # 按名\n",[98,4528,4529,4531,4533,4536,4539,4542,4545],{"class":100,"line":50},[98,4530,4515],{"class":704},[98,4532,1323],{"class":711},[98,4534,4535],{"class":1083}," -type",[98,4537,4538],{"class":711}," f",[98,4540,4541],{"class":1083}," -size",[98,4543,4544],{"class":711}," +100M",[98,4546,4547],{"class":1071},"                    # >100M\n",[98,4549,4550,4552,4554,4557,4560],{"class":100,"line":112},[98,4551,4515],{"class":704},[98,4553,1323],{"class":711},[98,4555,4556],{"class":1083}," -mtime",[98,4558,4559],{"class":1083}," -7",[98,4561,4562],{"class":1071},"                              # 7 天内\n",[98,4564,4565,4567,4569,4571,4574,4577],{"class":100,"line":197},[98,4566,4515],{"class":704},[98,4568,1323],{"class":711},[98,4570,4520],{"class":1083},[98,4572,4573],{"class":711}," \"*.tmp\"",[98,4575,4576],{"class":1083}," -delete",[98,4578,4579],{"class":1071},"                  # 找到删除\n",[98,4581,4582,4584,4586,4588,4590,4593,4596,4599,4602,4605],{"class":100,"line":203},[98,4583,4515],{"class":704},[98,4585,1323],{"class":711},[98,4587,4535],{"class":1083},[98,4589,4538],{"class":711},[98,4591,4592],{"class":1083}," -exec",[98,4594,4595],{"class":711}," chmod",[98,4597,4598],{"class":1083}," 644",[98,4600,4601],{"class":711}," {}",[98,4603,4604],{"class":1083}," \\;",[98,4606,4607],{"class":1071},"          # 批量执行\n",[98,4609,4610],{"class":100,"line":344},[98,4611,109],{"emptyLinePlaceholder":58},[98,4613,4614,4617,4619,4622,4624,4626],{"class":100,"line":350},[98,4615,4616],{"class":4320},"which",[98,4618,1302],{"class":700},[98,4620,4621],{"class":711},"cm",[98,4623,1634],{"class":696},[98,4625,1311],{"class":700},[98,4627,4628],{"class":1071},"                       # 命令路径\n",[98,4630,4631,4634,4636,4638,4640],{"class":100,"line":1134},[98,4632,4633],{"class":704},"whereis",[98,4635,1302],{"class":700},[98,4637,4621],{"class":711},[98,4639,1634],{"class":696},[98,4641,720],{"class":700},[98,4643,4644,4647,4649,4651,4653,4655],{"class":100,"line":1140},[98,4645,4646],{"class":704},"locate",[98,4648,1302],{"class":700},[98,4650,1305],{"class":711},[98,4652,1308],{"class":696},[98,4654,1311],{"class":700},[98,4656,4657],{"class":1071},"                     # 快速（需 updatedb）\n",[29,4659,4661],{"id":4660},"三文本处理","三、文本处理",[90,4663,4665],{"className":1062,"code":4664,"language":1064,"meta":49,"style":49},"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",[75,4666,4667,4699,4718,4736,4740,4759,4776,4795,4816,4826,4830,4849,4868,4888,4908,4912,4931,4943,4958,4962,4975,4988,5005,5015,5032],{"__ignoreMap":49},[98,4668,4669,4672,4675,4678,4680,4683,4686,4689,4691,4694,4696],{"class":100,"line":101},[98,4670,4671],{"class":704},"cat",[98,4673,4674],{"class":711}," \u002F",[98,4676,4677],{"class":711}," less",[98,4679,4674],{"class":711},[98,4681,4682],{"class":711}," head",[98,4684,4685],{"class":1083}," -n",[98,4687,4688],{"class":1083}," 20",[98,4690,4674],{"class":711},[98,4692,4693],{"class":711}," tail",[98,4695,4685],{"class":1083},[98,4697,4698],{"class":1083}," 20\n",[98,4700,4701,4704,4707,4709,4711,4713,4715],{"class":100,"line":50},[98,4702,4703],{"class":704},"tail",[98,4705,4706],{"class":1083}," -f",[98,4708,1302],{"class":700},[98,4710,1305],{"class":711},[98,4712,1308],{"class":696},[98,4714,1311],{"class":700},[98,4716,4717],{"class":1071},"                    # 实时跟踪日志\n",[98,4719,4720,4722,4725,4727,4729,4731,4733],{"class":100,"line":112},[98,4721,4703],{"class":704},[98,4723,4724],{"class":1083}," -F",[98,4726,1302],{"class":700},[98,4728,1305],{"class":711},[98,4730,1308],{"class":696},[98,4732,1311],{"class":700},[98,4734,4735],{"class":1071},"                    # rotate 后仍能跟踪\n",[98,4737,4738],{"class":100,"line":197},[98,4739,109],{"emptyLinePlaceholder":58},[98,4741,4742,4745,4748,4750,4752,4754,4756],{"class":100,"line":203},[98,4743,4744],{"class":704},"grep",[98,4746,4747],{"class":711}," \"p\"",[98,4749,1302],{"class":700},[98,4751,1305],{"class":711},[98,4753,1308],{"class":696},[98,4755,1311],{"class":700},[98,4757,4758],{"class":1071},"                   # 基本\n",[98,4760,4761,4763,4765,4767,4769,4771,4773],{"class":100,"line":344},[98,4762,4744],{"class":704},[98,4764,2887],{"class":1083},[98,4766,4685],{"class":1083},[98,4768,1724],{"class":1083},[98,4770,4747],{"class":711},[98,4772,1323],{"class":711},[98,4774,4775],{"class":1071},"               # 递归+行号+忽略大小写\n",[98,4777,4778,4780,4782,4784,4786,4788,4790,4792],{"class":100,"line":350},[98,4779,4744],{"class":704},[98,4781,2187],{"class":1083},[98,4783,4747],{"class":711},[98,4785,1302],{"class":700},[98,4787,1305],{"class":711},[98,4789,1308],{"class":696},[98,4791,1311],{"class":700},[98,4793,4794],{"class":1071},"                # 反选\n",[98,4796,4797,4799,4802,4805,4807,4809,4811,4813],{"class":100,"line":1134},[98,4798,4744],{"class":704},[98,4800,4801],{"class":1083}," -E",[98,4803,4804],{"class":711}," \"a|b\"",[98,4806,1302],{"class":700},[98,4808,1305],{"class":711},[98,4810,1308],{"class":696},[98,4812,1311],{"class":700},[98,4814,4815],{"class":1071},"              # 扩展正则\n",[98,4817,4818,4821,4823],{"class":100,"line":1140},[98,4819,4820],{"class":704},"rg",[98,4822,4747],{"class":711},[98,4824,4825],{"class":1071},"                            # ripgrep（快，推荐）\n",[98,4827,4828],{"class":100,"line":1155},[98,4829,109],{"emptyLinePlaceholder":58},[98,4831,4832,4835,4838,4840,4842,4844,4846],{"class":100,"line":1160},[98,4833,4834],{"class":704},"sed",[98,4836,4837],{"class":711}," 's\u002Fold\u002Fnew\u002Fg'",[98,4839,1302],{"class":700},[98,4841,1305],{"class":711},[98,4843,1308],{"class":696},[98,4845,1311],{"class":700},[98,4847,4848],{"class":1071},"          # 替换到 stdout\n",[98,4850,4851,4853,4855,4857,4859,4861,4863,4865],{"class":100,"line":1166},[98,4852,4834],{"class":704},[98,4854,1724],{"class":1083},[98,4856,4837],{"class":711},[98,4858,1302],{"class":700},[98,4860,1305],{"class":711},[98,4862,1308],{"class":696},[98,4864,1311],{"class":700},[98,4866,4867],{"class":1071},"       # 原地替换\n",[98,4869,4870,4872,4875,4877,4879,4881,4883,4885],{"class":100,"line":1181},[98,4871,4834],{"class":704},[98,4873,4874],{"class":1083}," -i.bak",[98,4876,4837],{"class":711},[98,4878,1302],{"class":700},[98,4880,1305],{"class":711},[98,4882,1308],{"class":696},[98,4884,1311],{"class":700},[98,4886,4887],{"class":1071},"   # 带备份\n",[98,4889,4890,4892,4894,4897,4899,4901,4903,4905],{"class":100,"line":1186},[98,4891,4834],{"class":704},[98,4893,4685],{"class":1083},[98,4895,4896],{"class":711}," '10,20p'",[98,4898,1302],{"class":700},[98,4900,1305],{"class":711},[98,4902,1308],{"class":696},[98,4904,1311],{"class":700},[98,4906,4907],{"class":1071},"            # 打印范围\n",[98,4909,4910],{"class":100,"line":1192},[98,4911,109],{"emptyLinePlaceholder":58},[98,4913,4914,4917,4920,4922,4924,4926,4928],{"class":100,"line":1207},[98,4915,4916],{"class":704},"awk",[98,4918,4919],{"class":711}," '{print $1}'",[98,4921,1302],{"class":700},[98,4923,1305],{"class":711},[98,4925,1308],{"class":696},[98,4927,1311],{"class":700},[98,4929,4930],{"class":1071},"           # 第一列\n",[98,4932,4933,4935,4938,4940],{"class":100,"line":1222},[98,4934,4916],{"class":704},[98,4936,4937],{"class":1083}," -F:",[98,4939,4919],{"class":711},[98,4941,4942],{"class":711}," \u002Fetc\u002Fpasswd\n",[98,4944,4945,4947,4950,4952,4954,4956],{"class":100,"line":1237},[98,4946,4916],{"class":704},[98,4948,4949],{"class":711}," '$3 > 100 {print $1}'",[98,4951,1302],{"class":700},[98,4953,1305],{"class":711},[98,4955,1308],{"class":696},[98,4957,720],{"class":700},[98,4959,4960],{"class":100,"line":1252},[98,4961,109],{"emptyLinePlaceholder":58},[98,4963,4964,4967,4970,4973],{"class":100,"line":1257},[98,4965,4966],{"class":704},"cut",[98,4968,4969],{"class":1083}," -d:",[98,4971,4972],{"class":1083}," -f1",[98,4974,4942],{"class":711},[98,4976,4977,4980,4982,4984,4986],{"class":100,"line":1263},[98,4978,4979],{"class":704},"sort",[98,4981,1302],{"class":700},[98,4983,1305],{"class":711},[98,4985,1308],{"class":696},[98,4987,720],{"class":700},[98,4989,4990,4992,4994,4996,4998,5000,5002],{"class":100,"line":3208},[98,4991,4979],{"class":704},[98,4993,2087],{"class":1083},[98,4995,1302],{"class":700},[98,4997,1305],{"class":711},[98,4999,1308],{"class":696},[98,5001,1311],{"class":700},[98,5003,5004],{"class":1071},"                    # 去重\n",[98,5006,5007,5010,5012],{"class":100,"line":3214},[98,5008,5009],{"class":704},"uniq",[98,5011,1546],{"class":1083},[98,5013,5014],{"class":1071},"                           # 统计相邻（先 sort）\n",[98,5016,5018,5021,5024,5026,5028,5030],{"class":100,"line":5017},24,[98,5019,5020],{"class":704},"wc",[98,5022,5023],{"class":1083}," -l",[98,5025,1302],{"class":700},[98,5027,1305],{"class":711},[98,5029,1308],{"class":696},[98,5031,720],{"class":700},[98,5033,5035,5037,5040],{"class":100,"line":5034},25,[98,5036,363],{"class":704},[98,5038,5039],{"class":711}," 'a-z'",[98,5041,5042],{"class":711}," 'A-Z'\n",[1390,5044,5045],{"id":5045},"管道组合",[90,5047,5049],{"className":1062,"code":5048,"language":1064,"meta":49,"style":49},"awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10\ndu -sh *\u002F | sort -rh | head -10\n",[75,5050,5051,5086],{"__ignoreMap":49},[98,5052,5053,5055,5057,5060,5062,5065,5067,5070,5072,5074,5076,5079,5081,5083],{"class":100,"line":101},[98,5054,4916],{"class":704},[98,5056,4919],{"class":711},[98,5058,5059],{"class":711}," access.log",[98,5061,4122],{"class":700},[98,5063,5064],{"class":704}," sort",[98,5066,4122],{"class":700},[98,5068,5069],{"class":704}," uniq",[98,5071,1546],{"class":1083},[98,5073,4122],{"class":700},[98,5075,5064],{"class":704},[98,5077,5078],{"class":1083}," -rn",[98,5080,4122],{"class":700},[98,5082,4682],{"class":704},[98,5084,5085],{"class":1083}," -10\n",[98,5087,5088,5091,5094,5097,5100,5102,5104,5107,5109,5111],{"class":100,"line":50},[98,5089,5090],{"class":704},"du",[98,5092,5093],{"class":1083}," -sh",[98,5095,5096],{"class":3594}," *",[98,5098,5099],{"class":711},"\u002F",[98,5101,4122],{"class":700},[98,5103,5064],{"class":704},[98,5105,5106],{"class":1083}," -rh",[98,5108,4122],{"class":700},[98,5110,4682],{"class":704},[98,5112,5085],{"class":1083},[29,5114,5116],{"id":5115},"四权限","四、权限",[90,5118,5120],{"className":1062,"code":5119,"language":1064,"meta":49,"style":49},"chmod 755 \u003Cfile>\nchmod +x \u003Cfile>\nchmod -R 644 \u003Cdir>\nchown user:group \u003Cfile>\nchown -R user \u003Cdir>\nchgrp group \u003Cfile>\numask\n",[75,5121,5122,5138,5153,5170,5186,5203,5219],{"__ignoreMap":49},[98,5123,5124,5127,5130,5132,5134,5136],{"class":100,"line":101},[98,5125,5126],{"class":704},"chmod",[98,5128,5129],{"class":1083}," 755",[98,5131,1302],{"class":700},[98,5133,1305],{"class":711},[98,5135,1308],{"class":696},[98,5137,720],{"class":700},[98,5139,5140,5142,5145,5147,5149,5151],{"class":100,"line":50},[98,5141,5126],{"class":704},[98,5143,5144],{"class":711}," +x",[98,5146,1302],{"class":700},[98,5148,1305],{"class":711},[98,5150,1308],{"class":696},[98,5152,720],{"class":700},[98,5154,5155,5157,5160,5162,5164,5166,5168],{"class":100,"line":112},[98,5156,5126],{"class":704},[98,5158,5159],{"class":1083}," -R",[98,5161,4598],{"class":1083},[98,5163,1302],{"class":700},[98,5165,4372],{"class":711},[98,5167,4375],{"class":696},[98,5169,720],{"class":700},[98,5171,5172,5175,5178,5180,5182,5184],{"class":100,"line":197},[98,5173,5174],{"class":704},"chown",[98,5176,5177],{"class":711}," user:group",[98,5179,1302],{"class":700},[98,5181,1305],{"class":711},[98,5183,1308],{"class":696},[98,5185,720],{"class":700},[98,5187,5188,5190,5192,5195,5197,5199,5201],{"class":100,"line":203},[98,5189,5174],{"class":704},[98,5191,5159],{"class":1083},[98,5193,5194],{"class":711}," user",[98,5196,1302],{"class":700},[98,5198,4372],{"class":711},[98,5200,4375],{"class":696},[98,5202,720],{"class":700},[98,5204,5205,5208,5211,5213,5215,5217],{"class":100,"line":344},[98,5206,5207],{"class":704},"chgrp",[98,5209,5210],{"class":711}," group",[98,5212,1302],{"class":700},[98,5214,1305],{"class":711},[98,5216,1308],{"class":696},[98,5218,720],{"class":700},[98,5220,5221],{"class":100,"line":350},[98,5222,5223],{"class":4320},"umask\n",[15,5225,5226],{},"数字权限：",[357,5228,5229,5239],{},[360,5230,5231],{},[363,5232,5233,5236],{},[366,5234,5235],{},"数字",[366,5237,5238],{},"权限",[376,5240,5241,5249,5257,5265],{},[363,5242,5243,5246],{},[381,5244,5245],{},"4",[381,5247,5248],{},"r--",[363,5250,5251,5254],{},[381,5252,5253],{},"5",[381,5255,5256],{},"r-x",[363,5258,5259,5262],{},[381,5260,5261],{},"6",[381,5263,5264],{},"rw-",[363,5266,5267,5270],{},[381,5268,5269],{},"7",[381,5271,5272],{},"rwx",[15,5274,5275,5276,5279,5280,5283,5284,5279,5287,22],{},"例：",[75,5277,5278],{},"755"," = ",[75,5281,5282],{},"rwxr-xr-x","，",[75,5285,5286],{},"644",[75,5288,5289],{},"rw-r--r--",[15,5291,5292],{},"特殊权限：",[90,5294,5296],{"className":1062,"code":5295,"language":1064,"meta":49,"style":49},"chmod u+s \u003Cfile>                  # SUID\nchmod g+s \u003Cdir>                   # SGID\nchmod +t \u003Cdir>                    # Sticky（如 \u002Ftmp）\n",[75,5297,5298,5316,5334],{"__ignoreMap":49},[98,5299,5300,5302,5305,5307,5309,5311,5313],{"class":100,"line":101},[98,5301,5126],{"class":704},[98,5303,5304],{"class":711}," u+s",[98,5306,1302],{"class":700},[98,5308,1305],{"class":711},[98,5310,1308],{"class":696},[98,5312,1311],{"class":700},[98,5314,5315],{"class":1071},"                  # SUID\n",[98,5317,5318,5320,5323,5325,5327,5329,5331],{"class":100,"line":50},[98,5319,5126],{"class":704},[98,5321,5322],{"class":711}," g+s",[98,5324,1302],{"class":700},[98,5326,4372],{"class":711},[98,5328,4375],{"class":696},[98,5330,1311],{"class":700},[98,5332,5333],{"class":1071},"                   # SGID\n",[98,5335,5336,5338,5341,5343,5345,5347,5349],{"class":100,"line":112},[98,5337,5126],{"class":704},[98,5339,5340],{"class":711}," +t",[98,5342,1302],{"class":700},[98,5344,4372],{"class":711},[98,5346,4375],{"class":696},[98,5348,1311],{"class":700},[98,5350,5351],{"class":1071},"                    # Sticky（如 \u002Ftmp）\n",[29,5353,5355],{"id":5354},"五进程管理","五、进程管理",[90,5357,5359],{"className":1062,"code":5358,"language":1064,"meta":49,"style":49},"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",[75,5360,5361,5369,5383,5393,5406,5410,5418,5426,5430,5447,5465,5474,5487,5491,5509,5528,5532,5540],{"__ignoreMap":49},[98,5362,5363,5366],{"class":100,"line":101},[98,5364,5365],{"class":704},"ps",[98,5367,5368],{"class":711}," aux\n",[98,5370,5371,5373,5376,5378,5380],{"class":100,"line":50},[98,5372,5365],{"class":704},[98,5374,5375],{"class":711}," aux",[98,5377,4122],{"class":700},[98,5379,4125],{"class":704},[98,5381,5382],{"class":711}," nginx\n",[98,5384,5385,5388,5390],{"class":100,"line":112},[98,5386,5387],{"class":704},"pgrep",[98,5389,4706],{"class":1083},[98,5391,5392],{"class":711}," \"pattern\"\n",[98,5394,5395,5398,5400,5402,5404],{"class":100,"line":197},[98,5396,5397],{"class":704},"pidof",[98,5399,1302],{"class":700},[98,5401,1512],{"class":711},[98,5403,1308],{"class":696},[98,5405,720],{"class":700},[98,5407,5408],{"class":100,"line":203},[98,5409,109],{"emptyLinePlaceholder":58},[98,5411,5412,5415],{"class":100,"line":344},[98,5413,5414],{"class":704},"top",[98,5416,5417],{"class":1071},"                               # P 按 CPU，M 按内存\n",[98,5419,5420,5423],{"class":100,"line":350},[98,5421,5422],{"class":704},"htop",[98,5424,5425],{"class":1071},"                              # 更友好\n",[98,5427,5428],{"class":100,"line":1134},[98,5429,109],{"emptyLinePlaceholder":58},[98,5431,5432,5435,5437,5440,5442,5444],{"class":100,"line":1140},[98,5433,5434],{"class":4320},"kill",[98,5436,1302],{"class":700},[98,5438,5439],{"class":711},"pi",[98,5441,1634],{"class":696},[98,5443,1311],{"class":700},[98,5445,5446],{"class":1071},"                        # SIGTERM\n",[98,5448,5449,5451,5454,5456,5458,5460,5462],{"class":100,"line":1155},[98,5450,5434],{"class":4320},[98,5452,5453],{"class":1083}," -9",[98,5455,1302],{"class":700},[98,5457,5439],{"class":711},[98,5459,1634],{"class":696},[98,5461,1311],{"class":700},[98,5463,5464],{"class":1071},"                     # 强制\n",[98,5466,5467,5470,5472],{"class":100,"line":1160},[98,5468,5469],{"class":704},"pkill",[98,5471,4706],{"class":1083},[98,5473,5392],{"class":711},[98,5475,5476,5479,5481,5483,5485],{"class":100,"line":1166},[98,5477,5478],{"class":704},"killall",[98,5480,1302],{"class":700},[98,5482,1512],{"class":711},[98,5484,1308],{"class":696},[98,5486,720],{"class":700},[98,5488,5489],{"class":100,"line":1181},[98,5490,109],{"emptyLinePlaceholder":58},[98,5492,5493,5496,5498,5501,5503,5505,5507],{"class":100,"line":1186},[98,5494,5495],{"class":704},"nice",[98,5497,4685],{"class":1083},[98,5499,5500],{"class":1083}," 10",[98,5502,1302],{"class":700},[98,5504,4621],{"class":711},[98,5506,1634],{"class":696},[98,5508,720],{"class":700},[98,5510,5511,5514,5516,5518,5520,5522,5524,5526],{"class":100,"line":1192},[98,5512,5513],{"class":704},"renice",[98,5515,4685],{"class":1083},[98,5517,3836],{"class":1083},[98,5519,2505],{"class":1083},[98,5521,1302],{"class":700},[98,5523,5439],{"class":711},[98,5525,1634],{"class":696},[98,5527,720],{"class":700},[98,5529,5530],{"class":100,"line":1207},[98,5531,109],{"emptyLinePlaceholder":58},[98,5533,5534,5537],{"class":100,"line":1222},[98,5535,5536],{"class":704},"Ctrl+Z",[98,5538,5539],{"class":1071},"                            # 挂起\n",[98,5541,5542,5545,5547,5550,5552],{"class":100,"line":1237},[98,5543,5544],{"class":4320},"bg",[98,5546,4674],{"class":711},[98,5548,5549],{"class":711}," fg",[98,5551,4674],{"class":711},[98,5553,5554],{"class":711}," jobs\n",[15,5556,5557],{},"信号：",[357,5559,5560,5572],{},[360,5561,5562],{},[363,5563,5564,5567,5570],{},[366,5565,5566],{},"信号",[366,5568,5569],{},"编号",[366,5571,374],{},[376,5573,5574,5584,5594,5605],{},[363,5575,5576,5579,5581],{},[381,5577,5578],{},"SIGHUP",[381,5580,63],{},[381,5582,5583],{},"挂起 \u002F 重载",[363,5585,5586,5589,5591],{},[381,5587,5588],{},"SIGINT",[381,5590,64],{},[381,5592,5593],{},"Ctrl+C",[363,5595,5596,5599,5602],{},[381,5597,5598],{},"SIGKILL",[381,5600,5601],{},"9",[381,5603,5604],{},"强杀，不可捕获",[363,5606,5607,5610,5613],{},[381,5608,5609],{},"SIGTERM",[381,5611,5612],{},"15",[381,5614,5615],{},"优雅退出（默认）",[29,5617,5619],{"id":5618},"六网络","六、网络",[90,5621,5623],{"className":1062,"code":5622,"language":1064,"meta":49,"style":49},"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",[75,5624,5625,5636,5643,5654,5664,5677,5681,5695,5712,5725,5741,5745,5764,5781,5802,5831,5835,5848,5865,5885,5889,5904,5919,5932],{"__ignoreMap":49},[98,5626,5627,5630,5633],{"class":100,"line":101},[98,5628,5629],{"class":704},"ip",[98,5631,5632],{"class":711}," addr",[98,5634,5635],{"class":1071},"                           # 查看 IP\n",[98,5637,5638,5640],{"class":100,"line":50},[98,5639,5629],{"class":704},[98,5641,5642],{"class":711}," route\n",[98,5644,5645,5648,5651],{"class":100,"line":112},[98,5646,5647],{"class":704},"ss",[98,5649,5650],{"class":1083}," -tunlp",[98,5652,5653],{"class":1071},"                         # 监听端口（推荐）\n",[98,5655,5656,5659,5661],{"class":100,"line":197},[98,5657,5658],{"class":704},"netstat",[98,5660,5650],{"class":1083},[98,5662,5663],{"class":1071},"                    # 老命令\n",[98,5665,5666,5669,5671,5674],{"class":100,"line":203},[98,5667,5668],{"class":704},"lsof",[98,5670,1724],{"class":1083},[98,5672,5673],{"class":711}," :8080",[98,5675,5676],{"class":1071},"                     # 谁占端口\n",[98,5678,5679],{"class":100,"line":344},[98,5680,109],{"emptyLinePlaceholder":58},[98,5682,5683,5686,5688,5691,5693],{"class":100,"line":350},[98,5684,5685],{"class":704},"ping",[98,5687,1302],{"class":700},[98,5689,5690],{"class":711},"hos",[98,5692,2594],{"class":696},[98,5694,720],{"class":700},[98,5696,5697,5699,5701,5704,5706,5708,5710],{"class":100,"line":1134},[98,5698,5685],{"class":704},[98,5700,1546],{"class":1083},[98,5702,5703],{"class":1083}," 4",[98,5705,1302],{"class":700},[98,5707,5690],{"class":711},[98,5709,2594],{"class":696},[98,5711,720],{"class":700},[98,5713,5714,5717,5719,5721,5723],{"class":100,"line":1140},[98,5715,5716],{"class":704},"traceroute",[98,5718,1302],{"class":700},[98,5720,5690],{"class":711},[98,5722,2594],{"class":696},[98,5724,720],{"class":700},[98,5726,5727,5730,5732,5734,5736,5738],{"class":100,"line":1155},[98,5728,5729],{"class":704},"mtr",[98,5731,1302],{"class":700},[98,5733,5690],{"class":711},[98,5735,2594],{"class":696},[98,5737,1311],{"class":700},[98,5739,5740],{"class":1071},"                        # 持续 traceroute\n",[98,5742,5743],{"class":100,"line":1160},[98,5744,109],{"emptyLinePlaceholder":58},[98,5746,5747,5750,5753,5755,5757,5759,5761],{"class":100,"line":1166},[98,5748,5749],{"class":704},"curl",[98,5751,5752],{"class":1083}," -I",[98,5754,1302],{"class":700},[98,5756,2206],{"class":711},[98,5758,2209],{"class":696},[98,5760,1311],{"class":700},[98,5762,5763],{"class":1071},"                     # 只看头\n",[98,5765,5766,5768,5770,5772,5774,5776,5778],{"class":100,"line":1181},[98,5767,5749],{"class":704},[98,5769,2187],{"class":1083},[98,5771,1302],{"class":700},[98,5773,2206],{"class":711},[98,5775,2209],{"class":696},[98,5777,1311],{"class":700},[98,5779,5780],{"class":1071},"                     # 详细\n",[98,5782,5783,5785,5788,5791,5793,5795,5797,5799],{"class":100,"line":1186},[98,5784,5749],{"class":704},[98,5786,5787],{"class":1083}," -o",[98,5789,5790],{"class":711}," file.zip",[98,5792,1302],{"class":700},[98,5794,2206],{"class":711},[98,5796,2209],{"class":696},[98,5798,1311],{"class":700},[98,5800,5801],{"class":1071},"            # 下载\n",[98,5803,5804,5806,5809,5812,5814,5817,5820,5823,5825,5827,5829],{"class":100,"line":1192},[98,5805,5749],{"class":704},[98,5807,5808],{"class":1083}," -X",[98,5810,5811],{"class":711}," POST",[98,5813,1587],{"class":1083},[98,5815,5816],{"class":711}," '{}'",[98,5818,5819],{"class":1083}," -H",[98,5821,5822],{"class":711}," \"Content-Type: application\u002Fjson\"",[98,5824,1302],{"class":700},[98,5826,2206],{"class":711},[98,5828,2209],{"class":696},[98,5830,720],{"class":700},[98,5832,5833],{"class":100,"line":1207},[98,5834,109],{"emptyLinePlaceholder":58},[98,5836,5837,5840,5842,5844,5846],{"class":100,"line":1222},[98,5838,5839],{"class":704},"wget",[98,5841,1302],{"class":700},[98,5843,2206],{"class":711},[98,5845,2209],{"class":696},[98,5847,720],{"class":700},[98,5849,5850,5852,5854,5856,5858,5860,5862],{"class":100,"line":1237},[98,5851,5839],{"class":704},[98,5853,1546],{"class":1083},[98,5855,1302],{"class":700},[98,5857,2206],{"class":711},[98,5859,2209],{"class":696},[98,5861,1311],{"class":700},[98,5863,5864],{"class":1071},"                     # 断点续传\n",[98,5866,5867,5869,5871,5874,5876,5878,5880,5882],{"class":100,"line":1252},[98,5868,5839],{"class":704},[98,5870,2887],{"class":1083},[98,5872,5873],{"class":1083}," -np",[98,5875,1302],{"class":700},[98,5877,2206],{"class":711},[98,5879,2209],{"class":696},[98,5881,1311],{"class":700},[98,5883,5884],{"class":1071},"                 # 递归\n",[98,5886,5887],{"class":100,"line":1257},[98,5888,109],{"emptyLinePlaceholder":58},[98,5890,5891,5894,5896,5899,5902],{"class":100,"line":1263},[98,5892,5893],{"class":704},"dig",[98,5895,1302],{"class":700},[98,5897,5898],{"class":711},"domai",[98,5900,5901],{"class":696},"n",[98,5903,720],{"class":700},[98,5905,5906,5908,5911,5913,5915,5917],{"class":100,"line":3208},[98,5907,5893],{"class":704},[98,5909,5910],{"class":711}," +short",[98,5912,1302],{"class":700},[98,5914,5898],{"class":711},[98,5916,5901],{"class":696},[98,5918,720],{"class":700},[98,5920,5921,5924,5926,5928,5930],{"class":100,"line":3214},[98,5922,5923],{"class":704},"nslookup",[98,5925,1302],{"class":700},[98,5927,5898],{"class":711},[98,5929,5901],{"class":696},[98,5931,720],{"class":700},[98,5933,5934,5937,5939,5941,5943],{"class":100,"line":5017},[98,5935,5936],{"class":704},"host",[98,5938,1302],{"class":700},[98,5940,5898],{"class":711},[98,5942,5901],{"class":696},[98,5944,720],{"class":700},[1390,5946,5947],{"id":5947},"防火墙",[90,5949,5951],{"className":1062,"code":5950,"language":1064,"meta":49,"style":49},"# 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",[75,5952,5953,5958,5965,5975,5984,5996,6003,6007,6012,6020,6030,6037,6041,6046,6059],{"__ignoreMap":49},[98,5954,5955],{"class":100,"line":101},[98,5956,5957],{"class":1071},"# ufw（Ubuntu）\n",[98,5959,5960,5963],{"class":100,"line":50},[98,5961,5962],{"class":704},"ufw",[98,5964,1204],{"class":711},[98,5966,5967,5969,5972],{"class":100,"line":112},[98,5968,5962],{"class":704},[98,5970,5971],{"class":711}," allow",[98,5973,5974],{"class":1083}," 22\n",[98,5976,5977,5979,5981],{"class":100,"line":197},[98,5978,5962],{"class":704},[98,5980,5971],{"class":711},[98,5982,5983],{"class":711}," 80\u002Ftcp\n",[98,5985,5986,5988,5991,5993],{"class":100,"line":203},[98,5987,5962],{"class":704},[98,5989,5990],{"class":711}," delete",[98,5992,5971],{"class":711},[98,5994,5995],{"class":1083}," 80\n",[98,5997,5998,6000],{"class":100,"line":344},[98,5999,5962],{"class":704},[98,6001,6002],{"class":711}," enable\n",[98,6004,6005],{"class":100,"line":350},[98,6006,109],{"emptyLinePlaceholder":58},[98,6008,6009],{"class":100,"line":1134},[98,6010,6011],{"class":1071},"# firewalld（CentOS）\n",[98,6013,6014,6017],{"class":100,"line":1140},[98,6015,6016],{"class":704},"firewall-cmd",[98,6018,6019],{"class":1083}," --list-all\n",[98,6021,6022,6024,6027],{"class":100,"line":1155},[98,6023,6016],{"class":704},[98,6025,6026],{"class":1083}," --add-port=8080\u002Ftcp",[98,6028,6029],{"class":1083}," --permanent\n",[98,6031,6032,6034],{"class":100,"line":1160},[98,6033,6016],{"class":704},[98,6035,6036],{"class":1083}," --reload\n",[98,6038,6039],{"class":100,"line":1166},[98,6040,109],{"emptyLinePlaceholder":58},[98,6042,6043],{"class":100,"line":1181},[98,6044,6045],{"class":1071},"# iptables\n",[98,6047,6048,6051,6054,6056],{"class":100,"line":1186},[98,6049,6050],{"class":704},"iptables",[98,6052,6053],{"class":1083}," -L",[98,6055,4685],{"class":1083},[98,6057,6058],{"class":1083}," -v\n",[98,6060,6061,6063,6065,6068,6070,6073,6076,6079,6082],{"class":100,"line":1192},[98,6062,6050],{"class":704},[98,6064,1335],{"class":1083},[98,6066,6067],{"class":711}," INPUT",[98,6069,2505],{"class":1083},[98,6071,6072],{"class":711}," tcp",[98,6074,6075],{"class":1083}," --dport",[98,6077,6078],{"class":1083}," 8080",[98,6080,6081],{"class":1083}," -j",[98,6083,6084],{"class":711}," ACCEPT\n",[29,6086,6088],{"id":6087},"七磁盘与内存","七、磁盘与内存",[90,6090,6092],{"className":1062,"code":6091,"language":1064,"meta":49,"style":49},"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",[75,6093,6094,6105,6114,6128,6148,6152,6162,6170,6184,6188,6193,6201,6212],{"__ignoreMap":49},[98,6095,6096,6099,6102],{"class":100,"line":101},[98,6097,6098],{"class":704},"df",[98,6100,6101],{"class":1083}," -h",[98,6103,6104],{"class":1071},"                             # 磁盘\n",[98,6106,6107,6109,6111],{"class":100,"line":50},[98,6108,6098],{"class":704},[98,6110,1724],{"class":1083},[98,6112,6113],{"class":1071},"                             # inode\n",[98,6115,6116,6118,6120,6122,6124,6126],{"class":100,"line":112},[98,6117,5090],{"class":704},[98,6119,5093],{"class":1083},[98,6121,1302],{"class":700},[98,6123,4372],{"class":711},[98,6125,4375],{"class":696},[98,6127,720],{"class":700},[98,6129,6130,6132,6134,6136,6138,6140,6142,6144,6146],{"class":100,"line":197},[98,6131,5090],{"class":704},[98,6133,5093],{"class":1083},[98,6135,5096],{"class":3594},[98,6137,4122],{"class":700},[98,6139,5064],{"class":704},[98,6141,5106],{"class":1083},[98,6143,4122],{"class":700},[98,6145,4682],{"class":704},[98,6147,5085],{"class":1083},[98,6149,6150],{"class":100,"line":203},[98,6151,109],{"emptyLinePlaceholder":58},[98,6153,6154,6157,6159],{"class":100,"line":344},[98,6155,6156],{"class":704},"free",[98,6158,6101],{"class":1083},[98,6160,6161],{"class":1071},"                           # 内存\n",[98,6163,6164,6167],{"class":100,"line":350},[98,6165,6166],{"class":704},"vmstat",[98,6168,6169],{"class":1083}," 1\n",[98,6171,6172,6175,6178,6181],{"class":100,"line":1134},[98,6173,6174],{"class":704},"iostat",[98,6176,6177],{"class":1083}," -x",[98,6179,6180],{"class":1083}," 1",[98,6182,6183],{"class":1071},"                       # 需 sysstat\n",[98,6185,6186],{"class":100,"line":1140},[98,6187,109],{"emptyLinePlaceholder":58},[98,6189,6190],{"class":100,"line":1155},[98,6191,6192],{"class":704},"lsblk\n",[98,6194,6195,6198],{"class":100,"line":1160},[98,6196,6197],{"class":704},"fdisk",[98,6199,6200],{"class":1083}," -l\n",[98,6202,6203,6206,6209],{"class":100,"line":1166},[98,6204,6205],{"class":704},"mount",[98,6207,6208],{"class":711}," \u002Fdev\u002Fsdb1",[98,6210,6211],{"class":711}," \u002Fmnt\n",[98,6213,6214,6217],{"class":100,"line":1181},[98,6215,6216],{"class":704},"umount",[98,6218,6211],{"class":711},[15,6220,6221],{},"找大文件：",[90,6223,6225],{"className":1062,"code":6224,"language":1064,"meta":49,"style":49},"find \u002F -type f -size +1G 2>\u002Fdev\u002Fnull\ndu -ah \u002F | sort -rh | head -20\n",[75,6226,6227,6248],{"__ignoreMap":49},[98,6228,6229,6231,6233,6235,6237,6239,6242,6245],{"class":100,"line":101},[98,6230,4515],{"class":704},[98,6232,4674],{"class":711},[98,6234,4535],{"class":1083},[98,6236,4538],{"class":711},[98,6238,4541],{"class":1083},[98,6240,6241],{"class":711}," +1G",[98,6243,6244],{"class":700}," 2>",[98,6246,6247],{"class":711},"\u002Fdev\u002Fnull\n",[98,6249,6250,6252,6255,6257,6259,6261,6263,6265,6267],{"class":100,"line":50},[98,6251,5090],{"class":704},[98,6253,6254],{"class":1083}," -ah",[98,6256,4674],{"class":711},[98,6258,4122],{"class":700},[98,6260,5064],{"class":704},[98,6262,5106],{"class":1083},[98,6264,4122],{"class":700},[98,6266,4682],{"class":704},[98,6268,6269],{"class":1083}," -20\n",[29,6271,6273],{"id":6272},"八压缩与归档","八、压缩与归档",[90,6275,6277],{"className":1062,"code":6276,"language":1064,"meta":49,"style":49},"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",[75,6278,6279,6301,6313,6325,6339,6343,6361,6369,6377,6387,6391,6404,6420,6424,6440],{"__ignoreMap":49},[98,6280,6281,6284,6287,6290,6292,6294,6296,6298],{"class":100,"line":101},[98,6282,6283],{"class":704},"tar",[98,6285,6286],{"class":1083}," -czvf",[98,6288,6289],{"class":711}," a.tar.gz",[98,6291,1302],{"class":700},[98,6293,4372],{"class":711},[98,6295,4375],{"class":696},[98,6297,1311],{"class":700},[98,6299,6300],{"class":1071},"          # 打包\n",[98,6302,6303,6305,6308,6310],{"class":100,"line":50},[98,6304,6283],{"class":704},[98,6306,6307],{"class":1083}," -xzvf",[98,6309,6289],{"class":711},[98,6311,6312],{"class":1071},"                # 解包\n",[98,6314,6315,6317,6320,6322],{"class":100,"line":112},[98,6316,6283],{"class":704},[98,6318,6319],{"class":1083}," -tzvf",[98,6321,6289],{"class":711},[98,6323,6324],{"class":1071},"                # 查看内容\n",[98,6326,6327,6329,6331,6333,6336],{"class":100,"line":197},[98,6328,6283],{"class":704},[98,6330,6307],{"class":1083},[98,6332,6289],{"class":711},[98,6334,6335],{"class":1083}," -C",[98,6337,6338],{"class":711}," \u002Ftmp\n",[98,6340,6341],{"class":100,"line":203},[98,6342,109],{"emptyLinePlaceholder":58},[98,6344,6345,6348,6350,6353,6355,6357,6359],{"class":100,"line":344},[98,6346,6347],{"class":704},"zip",[98,6349,2887],{"class":1083},[98,6351,6352],{"class":711}," a.zip",[98,6354,1302],{"class":700},[98,6356,4372],{"class":711},[98,6358,4375],{"class":696},[98,6360,720],{"class":700},[98,6362,6363,6366],{"class":100,"line":350},[98,6364,6365],{"class":704},"unzip",[98,6367,6368],{"class":711}," a.zip\n",[98,6370,6371,6373,6375],{"class":100,"line":1134},[98,6372,6365],{"class":704},[98,6374,5023],{"class":1083},[98,6376,6368],{"class":711},[98,6378,6379,6381,6383,6385],{"class":100,"line":1140},[98,6380,6365],{"class":704},[98,6382,6352],{"class":711},[98,6384,1587],{"class":1083},[98,6386,6338],{"class":711},[98,6388,6389],{"class":100,"line":1155},[98,6390,109],{"emptyLinePlaceholder":58},[98,6392,6393,6396,6398,6400,6402],{"class":100,"line":1160},[98,6394,6395],{"class":704},"gzip",[98,6397,1302],{"class":700},[98,6399,1305],{"class":711},[98,6401,1308],{"class":696},[98,6403,720],{"class":700},[98,6405,6406,6409,6411,6413,6415,6417],{"class":100,"line":1166},[98,6407,6408],{"class":704},"gunzip",[98,6410,1302],{"class":700},[98,6412,1305],{"class":711},[98,6414,1308],{"class":696},[98,6416,1311],{"class":700},[98,6418,6419],{"class":711},".gz\n",[98,6421,6422],{"class":100,"line":1181},[98,6423,109],{"emptyLinePlaceholder":58},[98,6425,6426,6429,6431,6433,6435,6437],{"class":100,"line":1186},[98,6427,6428],{"class":704},"zstd",[98,6430,1302],{"class":700},[98,6432,1305],{"class":711},[98,6434,1308],{"class":696},[98,6436,1311],{"class":700},[98,6438,6439],{"class":1071},"                       # 快速压缩\n",[98,6441,6442,6445,6447,6449,6451,6453,6455],{"class":100,"line":1192},[98,6443,6444],{"class":704},"xz",[98,6446,5453],{"class":1083},[98,6448,1302],{"class":700},[98,6450,1305],{"class":711},[98,6452,1308],{"class":696},[98,6454,1311],{"class":700},[98,6456,6457],{"class":1071},"                      # 高压缩\n",[29,6459,6461],{"id":6460},"九用户与权限","九、用户与权限",[90,6463,6465],{"className":1062,"code":6464,"language":1064,"meta":49,"style":49},"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",[75,6466,6467,6472,6477,6482,6487,6492,6496,6517,6530,6549,6564,6568,6582,6595,6599,6614,6626,6635],{"__ignoreMap":49},[98,6468,6469],{"class":100,"line":101},[98,6470,6471],{"class":704},"whoami\n",[98,6473,6474],{"class":100,"line":50},[98,6475,6476],{"class":704},"id\n",[98,6478,6479],{"class":100,"line":112},[98,6480,6481],{"class":704},"who\n",[98,6483,6484],{"class":100,"line":197},[98,6485,6486],{"class":704},"w\n",[98,6488,6489],{"class":100,"line":203},[98,6490,6491],{"class":704},"last\n",[98,6493,6494],{"class":100,"line":344},[98,6495,109],{"emptyLinePlaceholder":58},[98,6497,6498,6501,6503,6505,6508,6510,6513,6515],{"class":100,"line":350},[98,6499,6500],{"class":704},"useradd",[98,6502,1348],{"class":1083},[98,6504,4441],{"class":1083},[98,6506,6507],{"class":711}," \u002Fbin\u002Fbash",[98,6509,1302],{"class":700},[98,6511,6512],{"class":711},"use",[98,6514,4375],{"class":696},[98,6516,720],{"class":700},[98,6518,6519,6522,6524,6526,6528],{"class":100,"line":1134},[98,6520,6521],{"class":704},"passwd",[98,6523,1302],{"class":700},[98,6525,6512],{"class":711},[98,6527,4375],{"class":696},[98,6529,720],{"class":700},[98,6531,6532,6535,6538,6541,6543,6545,6547],{"class":100,"line":1140},[98,6533,6534],{"class":704},"usermod",[98,6536,6537],{"class":1083}," -aG",[98,6539,6540],{"class":711}," sudo",[98,6542,1302],{"class":700},[98,6544,6512],{"class":711},[98,6546,4375],{"class":696},[98,6548,720],{"class":700},[98,6550,6551,6554,6556,6558,6560,6562],{"class":100,"line":1155},[98,6552,6553],{"class":704},"userdel",[98,6555,2887],{"class":1083},[98,6557,1302],{"class":700},[98,6559,6512],{"class":711},[98,6561,4375],{"class":696},[98,6563,720],{"class":700},[98,6565,6566],{"class":100,"line":1160},[98,6567,109],{"emptyLinePlaceholder":58},[98,6569,6570,6573,6575,6578,6580],{"class":100,"line":1166},[98,6571,6572],{"class":704},"groupadd",[98,6574,1302],{"class":700},[98,6576,6577],{"class":711},"grou",[98,6579,15],{"class":696},[98,6581,720],{"class":700},[98,6583,6584,6587,6589,6591,6593],{"class":100,"line":1181},[98,6585,6586],{"class":704},"groups",[98,6588,1302],{"class":700},[98,6590,6512],{"class":711},[98,6592,4375],{"class":696},[98,6594,720],{"class":700},[98,6596,6597],{"class":100,"line":1186},[98,6598,109],{"emptyLinePlaceholder":58},[98,6600,6601,6604,6606,6608,6610,6612],{"class":100,"line":1192},[98,6602,6603],{"class":704},"su",[98,6605,4343],{"class":711},[98,6607,1302],{"class":700},[98,6609,6512],{"class":711},[98,6611,4375],{"class":696},[98,6613,720],{"class":700},[98,6615,6616,6618,6620,6622,6624],{"class":100,"line":1207},[98,6617,3382],{"class":704},[98,6619,1302],{"class":700},[98,6621,4621],{"class":711},[98,6623,1634],{"class":696},[98,6625,720],{"class":700},[98,6627,6628,6630,6632],{"class":100,"line":1222},[98,6629,3382],{"class":704},[98,6631,1724],{"class":1083},[98,6633,6634],{"class":1071},"                           # 进 root shell\n",[98,6636,6637,6639,6641,6643,6645,6647,6649,6651,6653,6655],{"class":100,"line":1237},[98,6638,3382],{"class":704},[98,6640,2087],{"class":1083},[98,6642,1302],{"class":700},[98,6644,6512],{"class":711},[98,6646,4375],{"class":696},[98,6648,1311],{"class":700},[98,6650,1302],{"class":700},[98,6652,4621],{"class":711},[98,6654,1634],{"class":696},[98,6656,720],{"class":700},[15,6658,6659],{},"sudoers：",[90,6661,6663],{"className":1062,"code":6662,"language":1064,"meta":49,"style":49},"visudo\n",[75,6664,6665],{"__ignoreMap":49},[98,6666,6667],{"class":100,"line":101},[98,6668,6662],{"class":704},[90,6670,6673],{"className":6671,"code":6672,"language":216},[215],"alice ALL=(ALL:ALL) ALL\n%sudo ALL=(ALL:ALL) ALL\nalice ALL=(ALL) NOPASSWD: ALL     # 免密\n",[75,6674,6672],{"__ignoreMap":49},[29,6676,6678],{"id":6677},"十systemd","十、systemd",[90,6680,6682],{"className":1062,"code":6681,"language":1064,"meta":49,"style":49},"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",[75,6683,6684,6701,6716,6731,6744,6750,6754,6769,6786,6806,6816,6825,6832],{"__ignoreMap":49},[98,6685,6686,6689,6692,6694,6697,6699],{"class":100,"line":101},[98,6687,6688],{"class":704},"systemctl",[98,6690,6691],{"class":711}," start\u002Fstop\u002Frestart\u002Freload\u002Fstatus",[98,6693,1302],{"class":700},[98,6695,6696],{"class":711},"sv",[98,6698,4395],{"class":696},[98,6700,720],{"class":700},[98,6702,6703,6705,6708,6710,6712,6714],{"class":100,"line":50},[98,6704,6688],{"class":704},[98,6706,6707],{"class":711}," enable\u002Fdisable",[98,6709,1302],{"class":700},[98,6711,6696],{"class":711},[98,6713,4395],{"class":696},[98,6715,720],{"class":700},[98,6717,6718,6720,6723,6725,6727,6729],{"class":100,"line":112},[98,6719,6688],{"class":704},[98,6721,6722],{"class":711}," is-active",[98,6724,1302],{"class":700},[98,6726,6696],{"class":711},[98,6728,4395],{"class":696},[98,6730,720],{"class":700},[98,6732,6733,6735,6738,6741],{"class":100,"line":197},[98,6734,6688],{"class":704},[98,6736,6737],{"class":711}," list-units",[98,6739,6740],{"class":1083}," --type=service",[98,6742,6743],{"class":1083}," --state=running\n",[98,6745,6746,6748],{"class":100,"line":203},[98,6747,6688],{"class":704},[98,6749,4099],{"class":711},[98,6751,6752],{"class":100,"line":344},[98,6753,109],{"emptyLinePlaceholder":58},[98,6755,6756,6759,6761,6763,6765,6767],{"class":100,"line":350},[98,6757,6758],{"class":704},"journalctl",[98,6760,2087],{"class":1083},[98,6762,1302],{"class":700},[98,6764,6696],{"class":711},[98,6766,4395],{"class":696},[98,6768,720],{"class":700},[98,6770,6771,6773,6775,6777,6779,6781,6783],{"class":100,"line":1134},[98,6772,6758],{"class":704},[98,6774,2087],{"class":1083},[98,6776,1302],{"class":700},[98,6778,6696],{"class":711},[98,6780,4395],{"class":696},[98,6782,1311],{"class":700},[98,6784,6785],{"class":1083}," -f\n",[98,6787,6788,6790,6792,6794,6796,6798,6800,6803],{"class":100,"line":1140},[98,6789,6758],{"class":704},[98,6791,2087],{"class":1083},[98,6793,1302],{"class":700},[98,6795,6696],{"class":711},[98,6797,4395],{"class":696},[98,6799,1311],{"class":700},[98,6801,6802],{"class":1083}," --since",[98,6804,6805],{"class":711}," \"1 hour ago\"\n",[98,6807,6808,6810,6813],{"class":100,"line":1155},[98,6809,6758],{"class":704},[98,6811,6812],{"class":1083}," -xe",[98,6814,6815],{"class":1071},"                    # 最近错误\n",[98,6817,6818,6820,6822],{"class":100,"line":1160},[98,6819,6758],{"class":704},[98,6821,1567],{"class":1083},[98,6823,6824],{"class":1071},"                     # 本次启动\n",[98,6826,6827,6829],{"class":100,"line":1166},[98,6828,6758],{"class":704},[98,6830,6831],{"class":1083}," --disk-usage\n",[98,6833,6834,6836,6839],{"class":100,"line":1181},[98,6835,6758],{"class":704},[98,6837,6838],{"class":1083}," --vacuum-size=500M",[98,6840,6841],{"class":1071},"     # 清理\n",[15,6843,6844,6845,3439],{},"unit 文件示例 ",[75,6846,6847],{},"\u002Fetc\u002Fsystemd\u002Fsystem\u002Fmyapp.service",[90,6849,6853],{"className":6850,"code":6851,"language":6852,"meta":49,"style":49},"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",[75,6854,6855,6860,6865,6870,6874,6879,6884,6889,6894,6899,6904,6909,6913,6918],{"__ignoreMap":49},[98,6856,6857],{"class":100,"line":101},[98,6858,6859],{},"[Unit]\n",[98,6861,6862],{"class":100,"line":50},[98,6863,6864],{},"Description=My App\n",[98,6866,6867],{"class":100,"line":112},[98,6868,6869],{},"After=network.target\n",[98,6871,6872],{"class":100,"line":197},[98,6873,109],{"emptyLinePlaceholder":58},[98,6875,6876],{"class":100,"line":203},[98,6877,6878],{},"[Service]\n",[98,6880,6881],{"class":100,"line":344},[98,6882,6883],{},"Type=simple\n",[98,6885,6886],{"class":100,"line":350},[98,6887,6888],{},"User=appuser\n",[98,6890,6891],{"class":100,"line":1134},[98,6892,6893],{},"WorkingDirectory=\u002Fopt\u002Fmyapp\n",[98,6895,6896],{"class":100,"line":1140},[98,6897,6898],{},"ExecStart=\u002Fusr\u002Fbin\u002Fnode \u002Fopt\u002Fmyapp\u002Findex.js\n",[98,6900,6901],{"class":100,"line":1155},[98,6902,6903],{},"Restart=on-failure\n",[98,6905,6906],{"class":100,"line":1160},[98,6907,6908],{},"RestartSec=5\n",[98,6910,6911],{"class":100,"line":1166},[98,6912,109],{"emptyLinePlaceholder":58},[98,6914,6915],{"class":100,"line":1181},[98,6916,6917],{},"[Install]\n",[98,6919,6920],{"class":100,"line":1186},[98,6921,6922],{},"WantedBy=multi-user.target\n",[90,6924,6926],{"className":1062,"code":6925,"language":1064,"meta":49,"style":49},"sudo systemctl daemon-reload\nsudo systemctl enable --now myapp\n",[75,6927,6928,6936],{"__ignoreMap":49},[98,6929,6930,6932,6934],{"class":100,"line":101},[98,6931,3382],{"class":704},[98,6933,4096],{"class":711},[98,6935,4099],{"class":711},[98,6937,6938,6940,6942,6945,6948],{"class":100,"line":50},[98,6939,3382],{"class":704},[98,6941,4096],{"class":711},[98,6943,6944],{"class":711}," enable",[98,6946,6947],{"class":1083}," --now",[98,6949,6950],{"class":711}," myapp\n",[29,6952,6954],{"id":6953},"十一ssh","十一、SSH",[90,6956,6958],{"className":1062,"code":6957,"language":1064,"meta":49,"style":49},"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",[75,6959,6960,6968,6979,6990,6994,7010,7017,7021,7036,7049],{"__ignoreMap":49},[98,6961,6962,6965],{"class":100,"line":101},[98,6963,6964],{"class":704},"ssh",[98,6966,6967],{"class":711}," user@host\n",[98,6969,6970,6972,6974,6977],{"class":100,"line":50},[98,6971,6964],{"class":704},[98,6973,2505],{"class":1083},[98,6975,6976],{"class":1083}," 2222",[98,6978,6967],{"class":711},[98,6980,6981,6983,6985,6988],{"class":100,"line":112},[98,6982,6964],{"class":704},[98,6984,1724],{"class":1083},[98,6986,6987],{"class":711}," ~\u002F.ssh\u002Fid_rsa",[98,6989,6967],{"class":711},[98,6991,6992],{"class":100,"line":197},[98,6993,109],{"emptyLinePlaceholder":58},[98,6995,6996,6999,7002,7005,7007],{"class":100,"line":203},[98,6997,6998],{"class":704},"ssh-keygen",[98,7000,7001],{"class":1083}," -t",[98,7003,7004],{"class":711}," ed25519",[98,7006,6335],{"class":1083},[98,7008,7009],{"class":711}," \"comment\"\n",[98,7011,7012,7015],{"class":100,"line":344},[98,7013,7014],{"class":704},"ssh-copy-id",[98,7016,6967],{"class":711},[98,7018,7019],{"class":100,"line":350},[98,7020,109],{"emptyLinePlaceholder":58},[98,7022,7023,7025,7027,7030,7033],{"class":100,"line":1134},[98,7024,6964],{"class":704},[98,7026,6053],{"class":1083},[98,7028,7029],{"class":711}," 8080:localhost:80",[98,7031,7032],{"class":711}," user@host",[98,7034,7035],{"class":1071},"   # 本地转发\n",[98,7037,7038,7040,7042,7044,7046],{"class":100,"line":1140},[98,7039,6964],{"class":704},[98,7041,5159],{"class":1083},[98,7043,7029],{"class":711},[98,7045,7032],{"class":711},[98,7047,7048],{"class":1071},"   # 远程转发\n",[98,7050,7051,7053,7055,7058,7060],{"class":100,"line":1155},[98,7052,6964],{"class":704},[98,7054,1607],{"class":1083},[98,7056,7057],{"class":1083}," 1080",[98,7059,7032],{"class":711},[98,7061,7062],{"class":1071},"                # SOCKS 代理\n",[15,7064,7065,3439],{},[75,7066,7067],{},"~\u002F.ssh\u002Fconfig",[90,7069,7072],{"className":7070,"code":7071,"language":216},[215],"Host myserver\n    HostName 1.2.3.4\n    User alice\n    Port 2222\n    IdentityFile ~\u002F.ssh\u002Fid_ed25519\n",[75,7073,7071],{"__ignoreMap":49},[15,7075,7076,7077,2831],{},"之后 ",[75,7078,7079],{},"ssh myserver",[1390,7081,7082],{"id":7082},"传输",[90,7084,7086],{"className":1062,"code":7085,"language":1064,"meta":49,"style":49},"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",[75,7087,7088,7104,7121,7137,7141,7174],{"__ignoreMap":49},[98,7089,7090,7093,7095,7097,7099,7101],{"class":100,"line":101},[98,7091,7092],{"class":704},"scp",[98,7094,1302],{"class":700},[98,7096,1305],{"class":711},[98,7098,1308],{"class":696},[98,7100,1311],{"class":700},[98,7102,7103],{"class":711}," user@host:\u002Fpath\u002F\n",[98,7105,7106,7108,7111,7113,7115,7117,7119],{"class":100,"line":50},[98,7107,7092],{"class":704},[98,7109,7110],{"class":711}," user@host:\u002Fpath\u002F",[98,7112,697],{"class":700},[98,7114,1305],{"class":711},[98,7116,1308],{"class":696},[98,7118,1311],{"class":700},[98,7120,2893],{"class":711},[98,7122,7123,7125,7127,7129,7131,7133,7135],{"class":100,"line":112},[98,7124,7092],{"class":704},[98,7126,2887],{"class":1083},[98,7128,1302],{"class":700},[98,7130,4372],{"class":711},[98,7132,4375],{"class":696},[98,7134,1311],{"class":700},[98,7136,7103],{"class":711},[98,7138,7139],{"class":100,"line":197},[98,7140,109],{"emptyLinePlaceholder":58},[98,7142,7143,7146,7149,7152,7154,7156,7158,7160,7163,7165,7167,7169,7171],{"class":100,"line":203},[98,7144,7145],{"class":704},"rsync",[98,7147,7148],{"class":1083}," -avz",[98,7150,7151],{"class":1083}," --progress",[98,7153,1302],{"class":700},[98,7155,4392],{"class":711},[98,7157,4395],{"class":696},[98,7159,1311],{"class":700},[98,7161,7162],{"class":711}," user@host:",[98,7164,697],{"class":700},[98,7166,4402],{"class":711},[98,7168,2594],{"class":696},[98,7170,1311],{"class":700},[98,7172,7173],{"class":1071},"   # 增量同步\n",[98,7175,7176,7178,7180,7183,7185,7187,7189,7191,7193,7195,7197,7199],{"class":100,"line":344},[98,7177,7145],{"class":704},[98,7179,7148],{"class":1083},[98,7181,7182],{"class":1083}," --delete",[98,7184,1302],{"class":700},[98,7186,4392],{"class":711},[98,7188,4395],{"class":696},[98,7190,1311],{"class":700},[98,7192,7162],{"class":711},[98,7194,697],{"class":700},[98,7196,4402],{"class":711},[98,7198,2594],{"class":696},[98,7200,720],{"class":700},[29,7202,7204],{"id":7203},"十二软件包管理","十二、软件包管理",[1390,7206,7208],{"id":7207},"aptdebian-ubuntu","apt（Debian \u002F Ubuntu）",[90,7210,7212],{"className":1062,"code":7211,"language":1064,"meta":49,"style":49},"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",[75,7213,7214,7226,7238,7250,7266,7285,7305,7317,7334,7350,7360,7364,7384],{"__ignoreMap":49},[98,7215,7216,7218,7220,7223],{"class":100,"line":101},[98,7217,3382],{"class":704},[98,7219,3426],{"class":711},[98,7221,7222],{"class":711}," update",[98,7224,7225],{"class":1071},"                   # 更新索引\n",[98,7227,7228,7230,7232,7235],{"class":100,"line":50},[98,7229,3382],{"class":704},[98,7231,3426],{"class":711},[98,7233,7234],{"class":711}," upgrade",[98,7236,7237],{"class":1071},"                  # 升级\n",[98,7239,7240,7242,7244,7247],{"class":100,"line":112},[98,7241,3382],{"class":704},[98,7243,3426],{"class":711},[98,7245,7246],{"class":711}," full-upgrade",[98,7248,7249],{"class":1071},"             # 含依赖变化\n",[98,7251,7252,7254,7256,7258,7260,7262,7264],{"class":100,"line":197},[98,7253,3382],{"class":704},[98,7255,3426],{"class":711},[98,7257,3941],{"class":711},[98,7259,1302],{"class":700},[98,7261,3946],{"class":711},[98,7263,3949],{"class":696},[98,7265,720],{"class":700},[98,7267,7268,7270,7272,7274,7276,7278,7280,7282],{"class":100,"line":203},[98,7269,3382],{"class":704},[98,7271,3426],{"class":711},[98,7273,2245],{"class":711},[98,7275,1302],{"class":700},[98,7277,3946],{"class":711},[98,7279,3949],{"class":696},[98,7281,1311],{"class":700},[98,7283,7284],{"class":1071},"             # 保留配置\n",[98,7286,7287,7289,7291,7294,7296,7298,7300,7302],{"class":100,"line":344},[98,7288,3382],{"class":704},[98,7290,3426],{"class":711},[98,7292,7293],{"class":711}," purge",[98,7295,1302],{"class":700},[98,7297,3946],{"class":711},[98,7299,3949],{"class":696},[98,7301,1311],{"class":700},[98,7303,7304],{"class":1071},"              # 含配置\n",[98,7306,7307,7309,7311,7314],{"class":100,"line":350},[98,7308,3382],{"class":704},[98,7310,3426],{"class":711},[98,7312,7313],{"class":711}," autoremove",[98,7315,7316],{"class":1071},"               # 清理无用依赖\n",[98,7318,7319,7321,7323,7326,7328,7330,7332],{"class":100,"line":1134},[98,7320,3382],{"class":704},[98,7322,3426],{"class":711},[98,7324,7325],{"class":711}," search",[98,7327,1302],{"class":700},[98,7329,4458],{"class":711},[98,7331,1644],{"class":696},[98,7333,720],{"class":700},[98,7335,7336,7338,7340,7342,7344,7346,7348],{"class":100,"line":1140},[98,7337,3382],{"class":704},[98,7339,3426],{"class":711},[98,7341,2586],{"class":711},[98,7343,1302],{"class":700},[98,7345,3946],{"class":711},[98,7347,3949],{"class":696},[98,7349,720],{"class":700},[98,7351,7352,7355,7357],{"class":100,"line":1155},[98,7353,7354],{"class":704},"apt",[98,7356,2099],{"class":711},[98,7358,7359],{"class":1083}," --installed\n",[98,7361,7362],{"class":100,"line":1160},[98,7363,109],{"emptyLinePlaceholder":58},[98,7365,7366,7368,7371,7373,7375,7377,7379,7381],{"class":100,"line":1166},[98,7367,3382],{"class":704},[98,7369,7370],{"class":711}," dpkg",[98,7372,1724],{"class":1083},[98,7374,1302],{"class":700},[98,7376,3946],{"class":711},[98,7378,3949],{"class":696},[98,7380,1311],{"class":700},[98,7382,7383],{"class":711},".deb\n",[98,7385,7386,7389,7391,7393,7395,7397,7399,7401],{"class":100,"line":1181},[98,7387,7388],{"class":704},"dpkg",[98,7390,5023],{"class":1083},[98,7392,4122],{"class":700},[98,7394,4125],{"class":704},[98,7396,1302],{"class":700},[98,7398,3946],{"class":711},[98,7400,3949],{"class":696},[98,7402,720],{"class":700},[1390,7404,7406],{"id":7405},"yum-dnfrhel-centos","yum \u002F dnf（RHEL \u002F CentOS）",[90,7408,7410],{"className":1062,"code":7409,"language":1064,"meta":49,"style":49},"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",[75,7411,7412,7428,7444,7452,7468,7484,7494,7508,7512,7531,7539,7547,7551,7572,7592],{"__ignoreMap":49},[98,7413,7414,7416,7418,7420,7422,7424,7426],{"class":100,"line":101},[98,7415,3382],{"class":704},[98,7417,3631],{"class":711},[98,7419,3941],{"class":711},[98,7421,1302],{"class":700},[98,7423,3946],{"class":711},[98,7425,3949],{"class":696},[98,7427,720],{"class":700},[98,7429,7430,7432,7434,7436,7438,7440,7442],{"class":100,"line":50},[98,7431,3382],{"class":704},[98,7433,3631],{"class":711},[98,7435,2245],{"class":711},[98,7437,1302],{"class":700},[98,7439,3946],{"class":711},[98,7441,3949],{"class":696},[98,7443,720],{"class":700},[98,7445,7446,7448,7450],{"class":100,"line":112},[98,7447,3382],{"class":704},[98,7449,3631],{"class":711},[98,7451,3429],{"class":711},[98,7453,7454,7456,7458,7460,7462,7464,7466],{"class":100,"line":197},[98,7455,3382],{"class":704},[98,7457,3631],{"class":711},[98,7459,7325],{"class":711},[98,7461,1302],{"class":700},[98,7463,4458],{"class":711},[98,7465,1644],{"class":696},[98,7467,720],{"class":700},[98,7469,7470,7472,7474,7476,7478,7480,7482],{"class":100,"line":203},[98,7471,3382],{"class":704},[98,7473,3631],{"class":711},[98,7475,4119],{"class":711},[98,7477,1302],{"class":700},[98,7479,3946],{"class":711},[98,7481,3949],{"class":696},[98,7483,720],{"class":700},[98,7485,7486,7489,7491],{"class":100,"line":344},[98,7487,7488],{"class":704},"yum",[98,7490,2099],{"class":711},[98,7492,7493],{"class":711}," installed\n",[98,7495,7496,7498,7500,7502,7504,7506],{"class":100,"line":350},[98,7497,7488],{"class":704},[98,7499,3634],{"class":711},[98,7501,3721],{"class":711},[98,7503,3724],{"class":696},[98,7505,7488],{"class":704},[98,7507,3646],{"class":711},[98,7509,7510],{"class":100,"line":1134},[98,7511,109],{"emptyLinePlaceholder":58},[98,7513,7514,7516,7518,7520,7522,7524,7526,7528],{"class":100,"line":1140},[98,7515,3382],{"class":704},[98,7517,3716],{"class":711},[98,7519,3941],{"class":711},[98,7521,1302],{"class":700},[98,7523,3946],{"class":711},[98,7525,3949],{"class":696},[98,7527,1311],{"class":700},[98,7529,7530],{"class":1071},"            # 新一代\n",[98,7532,7533,7536],{"class":100,"line":1155},[98,7534,7535],{"class":704},"dnf",[98,7537,7538],{"class":711}," upgrade\n",[98,7540,7541,7543,7545],{"class":100,"line":1160},[98,7542,7535],{"class":704},[98,7544,3634],{"class":711},[98,7546,3637],{"class":711},[98,7548,7549],{"class":100,"line":1166},[98,7550,109],{"emptyLinePlaceholder":58},[98,7552,7553,7555,7558,7561,7563,7565,7567,7569],{"class":100,"line":1181},[98,7554,3382],{"class":704},[98,7556,7557],{"class":711}," rpm",[98,7559,7560],{"class":1083}," -ivh",[98,7562,1302],{"class":700},[98,7564,3946],{"class":711},[98,7566,3949],{"class":696},[98,7568,1311],{"class":700},[98,7570,7571],{"class":711},".rpm\n",[98,7573,7574,7577,7580,7582,7584,7586,7588,7590],{"class":100,"line":1186},[98,7575,7576],{"class":704},"rpm",[98,7578,7579],{"class":1083}," -qa",[98,7581,4122],{"class":700},[98,7583,4125],{"class":704},[98,7585,1302],{"class":700},[98,7587,3946],{"class":711},[98,7589,3949],{"class":696},[98,7591,720],{"class":700},[98,7593,7594,7596,7598,7601,7603,7605,7607],{"class":100,"line":1192},[98,7595,3382],{"class":704},[98,7597,7557],{"class":711},[98,7599,7600],{"class":1083}," -e",[98,7602,1302],{"class":700},[98,7604,3946],{"class":711},[98,7606,3949],{"class":696},[98,7608,720],{"class":700},[1390,7610,7612],{"id":7611},"pacmanarch","pacman（Arch）",[90,7614,7616],{"className":1062,"code":7615,"language":1064,"meta":49,"style":49},"sudo pacman -Syu                  # 同步并升级\nsudo pacman -S \u003Cpkg>\nsudo pacman -Rns \u003Cpkg>            # 卸载含依赖配置\npacman -Ss \u003Ckw>\npacman -Qs \u003Cpkg>\n",[75,7617,7618,7630,7646,7666,7682],{"__ignoreMap":49},[98,7619,7620,7622,7624,7627],{"class":100,"line":101},[98,7621,3382],{"class":704},[98,7623,3812],{"class":711},[98,7625,7626],{"class":1083}," -Syu",[98,7628,7629],{"class":1071},"                  # 同步并升级\n",[98,7631,7632,7634,7636,7638,7640,7642,7644],{"class":100,"line":50},[98,7633,3382],{"class":704},[98,7635,3812],{"class":711},[98,7637,2555],{"class":1083},[98,7639,1302],{"class":700},[98,7641,3946],{"class":711},[98,7643,3949],{"class":696},[98,7645,720],{"class":700},[98,7647,7648,7650,7652,7655,7657,7659,7661,7663],{"class":100,"line":112},[98,7649,3382],{"class":704},[98,7651,3812],{"class":711},[98,7653,7654],{"class":1083}," -Rns",[98,7656,1302],{"class":700},[98,7658,3946],{"class":711},[98,7660,3949],{"class":696},[98,7662,1311],{"class":700},[98,7664,7665],{"class":1071},"            # 卸载含依赖配置\n",[98,7667,7668,7671,7674,7676,7678,7680],{"class":100,"line":197},[98,7669,7670],{"class":704},"pacman",[98,7672,7673],{"class":1083}," -Ss",[98,7675,1302],{"class":700},[98,7677,4458],{"class":711},[98,7679,1644],{"class":696},[98,7681,720],{"class":700},[98,7683,7684,7686,7689,7691,7693,7695],{"class":100,"line":203},[98,7685,7670],{"class":704},[98,7687,7688],{"class":1083}," -Qs",[98,7690,1302],{"class":700},[98,7692,3946],{"class":711},[98,7694,3949],{"class":696},[98,7696,720],{"class":700},[29,7698,7700],{"id":7699},"十三日志","十三、日志",[90,7702,7704],{"className":1062,"code":7703,"language":1064,"meta":49,"style":49},"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",[75,7705,7706,7713,7722,7734,7738,7750,7762,7774,7783,7792,7796,7801,7812],{"__ignoreMap":49},[98,7707,7708,7710],{"class":100,"line":101},[98,7709,6758],{"class":704},[98,7711,7712],{"class":1083}," -xe\n",[98,7714,7715,7717,7719],{"class":100,"line":50},[98,7716,6758],{"class":704},[98,7718,6802],{"class":1083},[98,7720,7721],{"class":711}," today\n",[98,7723,7724,7726,7728,7731],{"class":100,"line":112},[98,7725,6758],{"class":704},[98,7727,2505],{"class":1083},[98,7729,7730],{"class":711}," err",[98,7732,7733],{"class":1071},"                 # 只错误\n",[98,7735,7736],{"class":100,"line":197},[98,7737,109],{"emptyLinePlaceholder":58},[98,7739,7740,7742,7744,7747],{"class":100,"line":203},[98,7741,4703],{"class":704},[98,7743,4706],{"class":1083},[98,7745,7746],{"class":711}," \u002Fvar\u002Flog\u002Fsyslog",[98,7748,7749],{"class":1071},"           # Debian\u002FUbuntu\n",[98,7751,7752,7754,7756,7759],{"class":100,"line":344},[98,7753,4703],{"class":704},[98,7755,4706],{"class":1083},[98,7757,7758],{"class":711}," \u002Fvar\u002Flog\u002Fmessages",[98,7760,7761],{"class":1071},"         # RHEL\u002FCentOS\n",[98,7763,7764,7766,7768,7771],{"class":100,"line":350},[98,7765,4703],{"class":704},[98,7767,4706],{"class":1083},[98,7769,7770],{"class":711}," \u002Fvar\u002Flog\u002Fauth.log",[98,7772,7773],{"class":1071},"         # 认证\n",[98,7775,7776,7778,7780],{"class":100,"line":1134},[98,7777,4703],{"class":704},[98,7779,4706],{"class":1083},[98,7781,7782],{"class":711}," \u002Fvar\u002Flog\u002Fnginx\u002Faccess.log\n",[98,7784,7785,7787,7789],{"class":100,"line":1140},[98,7786,4703],{"class":704},[98,7788,4706],{"class":1083},[98,7790,7791],{"class":711}," \u002Fvar\u002Flog\u002Fnginx\u002Ferror.log\n",[98,7793,7794],{"class":100,"line":1155},[98,7795,109],{"emptyLinePlaceholder":58},[98,7797,7798],{"class":100,"line":1160},[98,7799,7800],{"class":704},"dmesg\n",[98,7802,7803,7806,7809],{"class":100,"line":1166},[98,7804,7805],{"class":704},"dmesg",[98,7807,7808],{"class":1083}," -T",[98,7810,7811],{"class":1071},"                          # 人类可读时间\n",[98,7813,7814,7816,7818,7820],{"class":100,"line":1181},[98,7815,7805],{"class":704},[98,7817,4122],{"class":700},[98,7819,4693],{"class":704},[98,7821,6269],{"class":1083},[29,7823,7825],{"id":7824},"十四环境变量","十四、环境变量",[90,7827,7829],{"className":1062,"code":7828,"language":1064,"meta":49,"style":49},"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",[75,7830,7831,7836,7844,7857,7865,7869,7873,7884,7894,7904,7912,7916,7924,7928,7954],{"__ignoreMap":49},[98,7832,7833],{"class":100,"line":101},[98,7834,7835],{"class":704},"env\n",[98,7837,7838,7841],{"class":100,"line":50},[98,7839,7840],{"class":4320},"echo",[98,7842,7843],{"class":696}," $PATH\n",[98,7845,7846,7849,7852,7854],{"class":100,"line":112},[98,7847,7848],{"class":700},"export",[98,7850,7851],{"class":696}," FOO",[98,7853,708],{"class":700},[98,7855,7856],{"class":696},"bar\n",[98,7858,7859,7862],{"class":100,"line":197},[98,7860,7861],{"class":4320},"unset",[98,7863,7864],{"class":711}," FOO\n",[98,7866,7867],{"class":100,"line":203},[98,7868,109],{"emptyLinePlaceholder":58},[98,7870,7871],{"class":100,"line":344},[98,7872,3871],{"class":1071},[98,7874,7875,7878,7881],{"class":100,"line":350},[98,7876,7877],{"class":700},"~",[98,7879,7880],{"class":696},"\u002F.bashrc                         ",[98,7882,7883],{"class":1071},"# bash 交互式\n",[98,7885,7886,7888,7891],{"class":100,"line":1134},[98,7887,7877],{"class":700},[98,7889,7890],{"class":696},"\u002F.bash_profile                   ",[98,7892,7893],{"class":1071},"# bash 登录\n",[98,7895,7896,7898,7901],{"class":100,"line":1140},[98,7897,7877],{"class":700},[98,7899,7900],{"class":696},"\u002F.profile                        ",[98,7902,7903],{"class":1071},"# 通用\n",[98,7905,7906,7909],{"class":100,"line":1155},[98,7907,7908],{"class":704},"\u002Fetc\u002Fprofile",[98,7910,7911],{"class":1071},"                      # 全局\n",[98,7913,7914],{"class":100,"line":1160},[98,7915,109],{"emptyLinePlaceholder":58},[98,7917,7918,7921],{"class":100,"line":1166},[98,7919,7920],{"class":4320},"source",[98,7922,7923],{"class":711}," ~\u002F.bashrc\n",[98,7925,7926],{"class":100,"line":1181},[98,7927,109],{"emptyLinePlaceholder":58},[98,7929,7930,7932,7935,7937,7940,7943,7946,7949,7951],{"class":100,"line":1186},[98,7931,7848],{"class":700},[98,7933,7934],{"class":696}," PATH",[98,7936,708],{"class":700},[98,7938,7939],{"class":711},"\"",[98,7941,7942],{"class":696},"$HOME",[98,7944,7945],{"class":711},"\u002F.local\u002Fbin:",[98,7947,7948],{"class":696},"$PATH",[98,7950,7939],{"class":711},[98,7952,7953],{"class":1071},"      # 前置\n",[98,7955,7956,7958,7960,7962,7964,7966,7969],{"class":100,"line":1192},[98,7957,7848],{"class":700},[98,7959,7934],{"class":696},[98,7961,708],{"class":700},[98,7963,7939],{"class":711},[98,7965,7948],{"class":696},[98,7967,7968],{"class":711},":\u002Fopt\u002Ftools\u002Fbin\"",[98,7970,7971],{"class":1071},"        # 后置\n",[29,7973,7975],{"id":7974},"十五性能排查","十五、性能排查",[90,7977,7979],{"className":1062,"code":7978,"language":1064,"meta":49,"style":49},"uptime                            # 负载\ntop                               # 实时\nfree -h                           # 内存\ndf -h \u002F df -i                     # 磁盘 \u002F inode\niostat -x 1                       # IO\nsar -u 1 5                        # CPU 历史\n",[75,7980,7981,7989,7996,8004,8020,8031],{"__ignoreMap":49},[98,7982,7983,7986],{"class":100,"line":101},[98,7984,7985],{"class":704},"uptime",[98,7987,7988],{"class":1071},"                            # 负载\n",[98,7990,7991,7993],{"class":100,"line":50},[98,7992,5414],{"class":704},[98,7994,7995],{"class":1071},"                               # 实时\n",[98,7997,7998,8000,8002],{"class":100,"line":112},[98,7999,6156],{"class":704},[98,8001,6101],{"class":1083},[98,8003,6161],{"class":1071},[98,8005,8006,8008,8010,8012,8015,8017],{"class":100,"line":197},[98,8007,6098],{"class":704},[98,8009,6101],{"class":1083},[98,8011,4674],{"class":711},[98,8013,8014],{"class":711}," df",[98,8016,1724],{"class":1083},[98,8018,8019],{"class":1071},"                     # 磁盘 \u002F inode\n",[98,8021,8022,8024,8026,8028],{"class":100,"line":203},[98,8023,6174],{"class":704},[98,8025,6177],{"class":1083},[98,8027,6180],{"class":1083},[98,8029,8030],{"class":1071},"                       # IO\n",[98,8032,8033,8036,8038,8040,8042],{"class":100,"line":344},[98,8034,8035],{"class":704},"sar",[98,8037,2087],{"class":1083},[98,8039,6180],{"class":1083},[98,8041,3836],{"class":1083},[98,8043,8044],{"class":1071},"                        # CPU 历史\n",[15,8046,8047],{},"通用排查顺序：",[1631,8049,8050,8057,8063,8072,8078],{},[36,8051,8052,843,8054,8056],{},[75,8053,7985],{},[75,8055,5414],{},"：负载高不高、哪个进程占用。",[36,8058,8059,8062],{},[75,8060,8061],{},"free -h","：内存是否耗尽、是否 swap。",[36,8064,8065,843,8068,8071],{},[75,8066,8067],{},"df -h",[75,8069,8070],{},"df -i","：空间 \u002F inode 是否满。",[36,8073,8074,8077],{},[75,8075,8076],{},"iostat -x 1","：IO 是否瓶颈。",[36,8079,8080,8083],{},[75,8081,8082],{},"ss -s","：连接数是否异常。",[1390,8085,8086],{"id":8086},"定位细节",[90,8088,8090],{"className":1062,"code":8089,"language":1064,"meta":49,"style":49},"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",[75,8091,8092,8109,8120,8127,8131,8150,8166,8170,8183,8196,8210],{"__ignoreMap":49},[98,8093,8094,8096,8098,8100,8102,8104,8106],{"class":100,"line":101},[98,8095,5668],{"class":704},[98,8097,2505],{"class":1083},[98,8099,1302],{"class":700},[98,8101,5439],{"class":711},[98,8103,1634],{"class":696},[98,8105,1311],{"class":700},[98,8107,8108],{"class":1071},"                     # 进程打开的文件\n",[98,8110,8111,8113,8115,8117],{"class":100,"line":50},[98,8112,5668],{"class":704},[98,8114,1724],{"class":1083},[98,8116,5673],{"class":711},[98,8118,8119],{"class":1071},"                     # 端口占用\n",[98,8121,8122,8124],{"class":100,"line":112},[98,8123,5668],{"class":704},[98,8125,8126],{"class":711}," \u002Fvar\u002Flog\u002Fsyslog\n",[98,8128,8129],{"class":100,"line":197},[98,8130,109],{"emptyLinePlaceholder":58},[98,8132,8133,8135,8137,8139,8141,8143,8145,8147],{"class":100,"line":203},[98,8134,5414],{"class":704},[98,8136,5819],{"class":1083},[98,8138,2505],{"class":1083},[98,8140,1302],{"class":700},[98,8142,5439],{"class":711},[98,8144,1634],{"class":696},[98,8146,1311],{"class":700},[98,8148,8149],{"class":1071},"                   # 线程\n",[98,8151,8152,8154,8156,8158,8160,8162,8164],{"class":100,"line":344},[98,8153,5365],{"class":704},[98,8155,7808],{"class":1083},[98,8157,2505],{"class":1083},[98,8159,1302],{"class":700},[98,8161,5439],{"class":711},[98,8163,1634],{"class":696},[98,8165,720],{"class":700},[98,8167,8168],{"class":100,"line":350},[98,8169,109],{"emptyLinePlaceholder":58},[98,8171,8172,8175,8177,8180],{"class":100,"line":1134},[98,8173,8174],{"class":704},"tcpdump",[98,8176,1724],{"class":1083},[98,8178,8179],{"class":711}," eth0",[98,8181,8182],{"class":1083}," -n\n",[98,8184,8185,8187,8189,8191,8194],{"class":100,"line":1140},[98,8186,8174],{"class":704},[98,8188,1724],{"class":1083},[98,8190,8179],{"class":711},[98,8192,8193],{"class":711}," port",[98,8195,5995],{"class":1083},[98,8197,8198,8200,8202,8204,8207],{"class":100,"line":1155},[98,8199,8174],{"class":704},[98,8201,1724],{"class":1083},[98,8203,8179],{"class":711},[98,8205,8206],{"class":711}," host",[98,8208,8209],{"class":1083}," 1.2.3.4\n",[98,8211,8212,8214,8216,8218,8220,8223],{"class":100,"line":1160},[98,8213,8174],{"class":704},[98,8215,1724],{"class":1083},[98,8217,8179],{"class":711},[98,8219,4157],{"class":1083},[98,8221,8222],{"class":711}," cap.pcap",[98,8224,8225],{"class":1071},"       # 存盘（Wireshark 打开）\n",[29,8227,8229],{"id":8228},"十六定时任务","十六、定时任务",[90,8231,8233],{"className":1062,"code":8232,"language":1064,"meta":49,"style":49},"crontab -e                        # 编辑\ncrontab -l                        # 列出\ncrontab -r                        # 删除\n",[75,8234,8235,8245,8254],{"__ignoreMap":49},[98,8236,8237,8240,8242],{"class":100,"line":101},[98,8238,8239],{"class":704},"crontab",[98,8241,7600],{"class":1083},[98,8243,8244],{"class":1071},"                        # 编辑\n",[98,8246,8247,8249,8251],{"class":100,"line":50},[98,8248,8239],{"class":704},[98,8250,5023],{"class":1083},[98,8252,8253],{"class":1071},"                        # 列出\n",[98,8255,8256,8258,8260],{"class":100,"line":112},[98,8257,8239],{"class":704},[98,8259,2887],{"class":1083},[98,8261,8262],{"class":1071},"                        # 删除\n",[15,8264,8265],{},"格式：",[90,8267,8270],{"className":8268,"code":8269,"language":216},[215],"* * * * * \u003Ccommand>\n│ │ │ │ │\n│ │ │ │ └─ 星期（0-7，0\u002F7 都是周日）\n│ │ │ └─── 月（1-12）\n│ │ └───── 日（1-31）\n│ └─────── 时（0-23）\n└───────── 分（0-59）\n",[75,8271,8269],{"__ignoreMap":49},[15,8273,5275],{},[90,8275,8278],{"className":8276,"code":8277,"language":216},[215],"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",[75,8279,8277],{"__ignoreMap":49},[15,8281,8282],{},"注意事项：",[33,8284,8285,8288,8294],{},[36,8286,8287],{},"PATH 与登录 shell 不同，用绝对路径。",[36,8289,8290,8291,22],{},"输出默认发邮件，重定向：",[75,8292,8293],{},">> \u002Fvar\u002Flog\u002Fjob.log 2>&1",[36,8295,8296],{},"秒级任务用 systemd timer。",[29,8298,8300],{"id":8299},"十七实用技巧","十七、实用技巧",[90,8302,8304],{"className":1062,"code":8303,"language":1064,"meta":49,"style":49},"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",[75,8305,8306,8311,8328,8336,8344,8355,8365,8369,8374,8378,8403,8408,8412,8429,8434,8447,8460,8473,8485,8489],{"__ignoreMap":49},[98,8307,8308],{"class":100,"line":101},[98,8309,8310],{"class":4320},"history\n",[98,8312,8313,8316,8318,8320,8322,8324,8326],{"class":100,"line":50},[98,8314,8315],{"class":4320},"history",[98,8317,4122],{"class":700},[98,8319,4125],{"class":704},[98,8321,1302],{"class":700},[98,8323,4458],{"class":711},[98,8325,1644],{"class":696},[98,8327,720],{"class":700},[98,8329,8330,8333],{"class":100,"line":112},[98,8331,8332],{"class":704},"Ctrl+R",[98,8334,8335],{"class":1071},"                            # 反向搜索历史\n",[98,8337,8338,8341],{"class":100,"line":197},[98,8339,8340],{"class":700},"!!",[98,8342,8343],{"class":1071},"                                # 上一条\n",[98,8345,8346,8349,8352],{"class":100,"line":203},[98,8347,8348],{"class":700},"!",[98,8350,8351],{"class":704},"$",[98,8353,8354],{"class":1071},"                                # 上一条最后参数\n",[98,8356,8357,8359,8362],{"class":100,"line":344},[98,8358,8348],{"class":700},[98,8360,8361],{"class":704},"123",[98,8363,8364],{"class":1071},"                              # 历史编号 123\n",[98,8366,8367],{"class":100,"line":350},[98,8368,109],{"emptyLinePlaceholder":58},[98,8370,8371],{"class":100,"line":1134},[98,8372,8373],{"class":696},"pushd \u002Fpath \u002F popd \u002F dirs -v\n",[98,8375,8376],{"class":100,"line":1140},[98,8377,109],{"emptyLinePlaceholder":58},[98,8379,8380,8383,8385,8387,8389,8391,8394,8397,8400],{"class":100,"line":1155},[98,8381,8382],{"class":704},"nohup",[98,8384,1302],{"class":700},[98,8386,4621],{"class":711},[98,8388,1634],{"class":696},[98,8390,1311],{"class":700},[98,8392,8393],{"class":700}," >",[98,8395,8396],{"class":711}," out.log",[98,8398,8399],{"class":700}," 2>&1",[98,8401,8402],{"class":696}," &\n",[98,8404,8405],{"class":100,"line":1160},[98,8406,8407],{"class":4320},"disown\n",[98,8409,8410],{"class":100,"line":1166},[98,8411,109],{"emptyLinePlaceholder":58},[98,8413,8414,8417,8420,8423,8426],{"class":100,"line":1181},[98,8415,8416],{"class":704},"openssl",[98,8418,8419],{"class":711}," rand",[98,8421,8422],{"class":1083}," -base64",[98,8424,8425],{"class":1083}," 16",[98,8427,8428],{"class":1071},"           # 随机密码\n",[98,8430,8431],{"class":100,"line":1186},[98,8432,8433],{"class":704},"uuidgen\n",[98,8435,8436,8439,8441,8443,8445],{"class":100,"line":1192},[98,8437,8438],{"class":704},"md5sum",[98,8440,1302],{"class":700},[98,8442,1305],{"class":711},[98,8444,1308],{"class":696},[98,8446,720],{"class":700},[98,8448,8449,8452,8454,8456,8458],{"class":100,"line":1207},[98,8450,8451],{"class":704},"sha256sum",[98,8453,1302],{"class":700},[98,8455,1305],{"class":711},[98,8457,1308],{"class":696},[98,8459,720],{"class":700},[98,8461,8462,8465,8467,8469,8471],{"class":100,"line":1222},[98,8463,8464],{"class":704},"xxd",[98,8466,1302],{"class":700},[98,8468,1305],{"class":711},[98,8470,1308],{"class":696},[98,8472,720],{"class":700},[98,8474,8475,8478,8480,8483],{"class":100,"line":1237},[98,8476,8477],{"class":700},"time",[98,8479,1302],{"class":700},[98,8481,8482],{"class":696},"cmd",[98,8484,720],{"class":700},[98,8486,8487],{"class":100,"line":1252},[98,8488,109],{"emptyLinePlaceholder":58},[98,8490,8491,8494,8496,8499,8502],{"class":100,"line":1257},[98,8492,8493],{"class":704},"python3",[98,8495,1348],{"class":1083},[98,8497,8498],{"class":711}," http.server",[98,8500,8501],{"class":1083}," 8000",[98,8503,8504],{"class":1071},"       # 快速 HTTP 服务\n",[1390,8506,8507],{"id":8507},"命令组合",[90,8509,8511],{"className":1062,"code":8510,"language":1064,"meta":49,"style":49},"cmd1 && cmd2                      # 成功才继续\ncmd1 || cmd2                      # 失败才继续\ncmd1 ; cmd2                       # 顺序\ncmd1 &                            # 后台\n(cmd1; cmd2)                      # 子 shell\n",[75,8512,8513,8526,8539,8551,8561],{"__ignoreMap":49},[98,8514,8515,8518,8520,8523],{"class":100,"line":101},[98,8516,8517],{"class":704},"cmd1",[98,8519,3724],{"class":696},[98,8521,8522],{"class":704},"cmd2",[98,8524,8525],{"class":1071},"                      # 成功才继续\n",[98,8527,8528,8530,8533,8536],{"class":100,"line":50},[98,8529,8517],{"class":704},[98,8531,8532],{"class":700}," ||",[98,8534,8535],{"class":704}," cmd2",[98,8537,8538],{"class":1071},"                      # 失败才继续\n",[98,8540,8541,8543,8546,8548],{"class":100,"line":112},[98,8542,8517],{"class":704},[98,8544,8545],{"class":696}," ; ",[98,8547,8522],{"class":704},[98,8549,8550],{"class":1071},"                       # 顺序\n",[98,8552,8553,8555,8558],{"class":100,"line":197},[98,8554,8517],{"class":704},[98,8556,8557],{"class":696}," &                            ",[98,8559,8560],{"class":1071},"# 后台\n",[98,8562,8563,8566,8568,8571,8573,8576],{"class":100,"line":203},[98,8564,8565],{"class":696},"(",[98,8567,8517],{"class":704},[98,8569,8570],{"class":696},"; ",[98,8572,8522],{"class":704},[98,8574,8575],{"class":696},")                      ",[98,8577,8578],{"class":1071},"# 子 shell\n",[1390,8580,8581],{"id":8581},"变量",[90,8583,8585],{"className":1062,"code":8584,"language":1064,"meta":49,"style":49},"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",[75,8586,8587,8597,8610,8622,8635,8645,8649,8666,8670,8680,8684,8698,8713,8728,8747,8762],{"__ignoreMap":49},[98,8588,8589,8592,8594],{"class":100,"line":101},[98,8590,8591],{"class":696},"name",[98,8593,708],{"class":700},[98,8595,8596],{"class":711},"\"world\"\n",[98,8598,8599,8601,8604,8607],{"class":100,"line":50},[98,8600,7840],{"class":4320},[98,8602,8603],{"class":711}," \"",[98,8605,8606],{"class":696},"$name",[98,8608,8609],{"class":711},"\"\n",[98,8611,8612,8614,8617,8619],{"class":100,"line":112},[98,8613,7840],{"class":4320},[98,8615,8616],{"class":711}," \"${",[98,8618,8591],{"class":696},[98,8620,8621],{"class":711},"}\"\n",[98,8623,8624,8626,8629,8632],{"class":100,"line":197},[98,8625,7840],{"class":4320},[98,8627,8628],{"class":711}," \"$(",[98,8630,8631],{"class":704},"date",[98,8633,8634],{"class":711},")\"\n",[98,8636,8637,8639,8642],{"class":100,"line":203},[98,8638,7840],{"class":4320},[98,8640,8641],{"class":711}," '$name'",[98,8643,8644],{"class":1071},"                      # 不替换\n",[98,8646,8647],{"class":100,"line":344},[98,8648,109],{"emptyLinePlaceholder":58},[98,8650,8651,8654,8657,8660,8663],{"class":100,"line":350},[98,8652,8653],{"class":4320},":",[98,8655,8656],{"class":696}," ${VAR",[98,8658,8659],{"class":700},":=",[98,8661,8662],{"class":696},"default}                 ",[98,8664,8665],{"class":1071},"# 默认值\n",[98,8667,8668],{"class":100,"line":1134},[98,8669,109],{"emptyLinePlaceholder":58},[98,8671,8672,8675,8677],{"class":100,"line":1140},[98,8673,8674],{"class":696},"str",[98,8676,708],{"class":700},[98,8678,8679],{"class":711},"\"hello.txt\"\n",[98,8681,8682],{"class":100,"line":1155},[98,8683,109],{"emptyLinePlaceholder":58},[98,8685,8686,8689,8692,8695],{"class":100,"line":1160},[98,8687,8688],{"class":696},"{",[98,8690,8691],{"class":704},"%",[98,8693,8694],{"class":711}," raw",[98,8696,8697],{"class":711}," %}\n",[98,8699,8700,8702,8705,8707,8710],{"class":100,"line":1166},[98,8701,7840],{"class":4320},[98,8703,8704],{"class":696}," ${str",[98,8706,8691],{"class":700},[98,8708,8709],{"class":696},".txt}                  ",[98,8711,8712],{"class":1071},"# hello\n",[98,8714,8715,8717,8719,8722,8725],{"class":100,"line":1181},[98,8716,7840],{"class":4320},[98,8718,8704],{"class":696},[98,8720,8721],{"class":700},"#",[98,8723,8724],{"class":696},"hello.}                ",[98,8726,8727],{"class":1071},"# txt\n",[98,8729,8730,8732,8734,8736,8739,8741,8744],{"class":100,"line":1186},[98,8731,7840],{"class":4320},[98,8733,8704],{"class":696},[98,8735,5099],{"class":700},[98,8737,8738],{"class":696},"txt",[98,8740,5099],{"class":700},[98,8742,8743],{"class":696},"md}                ",[98,8745,8746],{"class":1071},"# hello.md\n",[98,8748,8749,8751,8754,8756,8759],{"class":100,"line":1192},[98,8750,7840],{"class":4320},[98,8752,8753],{"class":696}," ${",[98,8755,8721],{"class":700},[98,8757,8758],{"class":696},"str}                      ",[98,8760,8761],{"class":1071},"# 9\n",[98,8763,8764,8766,8768,8771],{"class":100,"line":1207},[98,8765,8688],{"class":696},[98,8767,8691],{"class":704},[98,8769,8770],{"class":711}," endraw",[98,8772,8697],{"class":711},[29,8774,8776],{"id":8775},"十八快捷键","十八、快捷键",[357,8778,8779,8789],{},[360,8780,8781],{},[363,8782,8783,8786],{},[366,8784,8785],{},"快捷键",[366,8787,8788],{},"作用",[376,8790,8791,8800,8810,8820,8833,8846,8856,8865,8874],{},[363,8792,8793,8797],{},[381,8794,8795],{},[75,8796,5593],{},[381,8798,8799],{},"中断",[363,8801,8802,8807],{},[381,8803,8804],{},[75,8805,8806],{},"Ctrl+D",[381,8808,8809],{},"退出 shell",[363,8811,8812,8817],{},[381,8813,8814],{},[75,8815,8816],{},"Ctrl+L",[381,8818,8819],{},"清屏",[363,8821,8822,8830],{},[381,8823,8824,424,8827],{},[75,8825,8826],{},"Ctrl+A",[75,8828,8829],{},"Ctrl+E",[381,8831,8832],{},"行首 \u002F 行尾",[363,8834,8835,8843],{},[381,8836,8837,424,8840],{},[75,8838,8839],{},"Ctrl+U",[75,8841,8842],{},"Ctrl+K",[381,8844,8845],{},"删光标前 \u002F 后",[363,8847,8848,8853],{},[381,8849,8850],{},[75,8851,8852],{},"Ctrl+W",[381,8854,8855],{},"删前一个单词",[363,8857,8858,8862],{},[381,8859,8860],{},[75,8861,8332],{},[381,8863,8864],{},"搜索历史",[363,8866,8867,8871],{},[381,8868,8869],{},[75,8870,5536],{},[381,8872,8873],{},"挂起",[363,8875,8876,8884],{},[381,8877,8878,424,8881],{},[75,8879,8880],{},"Tab",[75,8882,8883],{},"Tab Tab",[381,8885,8886],{},"补全 \u002F 列候选",[959,8888],{},[29,8890,3285],{"id":3285},[33,8892,8893,8900,8907,8914,8921,8927],{},[36,8894,8895,8896],{},"清华镜像站：",[972,8897,8898],{"href":8898,"rel":8899,"target":975},"https:\u002F\u002Fmirrors.tuna.tsinghua.edu.cn\u002F",[3295,977,3296],[36,8901,8902,8903],{},"中科大镜像站：",[972,8904,8905],{"href":8905,"rel":8906,"target":975},"https:\u002F\u002Fmirrors.ustc.edu.cn\u002F",[3295,977,3296],[36,8908,8909,8910],{},"阿里云镜像站：",[972,8911,8912],{"href":8912,"rel":8913,"target":975},"https:\u002F\u002Fdeveloper.aliyun.com\u002Fmirror\u002F",[3295,977,3296],[36,8915,8916,8917],{},"npmmirror：",[972,8918,8919],{"href":8919,"rel":8920,"target":975},"https:\u002F\u002Fnpmmirror.com\u002F",[3295,977,3296],[36,8922,8923,8924],{},"man 手册：",[75,8925,8926],{},"man \u003Ccommand>",[36,8928,8929,8930,8933],{},"tldr：",[75,8931,8932],{},"tldr \u003Ccommand>","（需安装）",[559,8935,8936],{},"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":49,"searchDepth":50,"depth":50,"links":8938},[8939,8950,8953,8956,8957,8958,8961,8962,8963,8964,8965,8968,8973,8974,8975,8978,8979,8983,8984],{"id":3364,"depth":50,"text":3365,"children":8940},[8941,8942,8943,8944,8945,8946,8947,8948,8949],{"id":3368,"depth":112,"text":3369},{"id":3475,"depth":112,"text":3476},{"id":3543,"depth":112,"text":3544},{"id":3783,"depth":112,"text":3784},{"id":3860,"depth":112,"text":3861},{"id":4019,"depth":112,"text":4020},{"id":4140,"depth":112,"text":4141},{"id":4174,"depth":112,"text":4175},{"id":4225,"depth":112,"text":4226},{"id":4309,"depth":50,"text":4310,"children":8951},[8952],{"id":4505,"depth":112,"text":4505},{"id":4660,"depth":50,"text":4661,"children":8954},[8955],{"id":5045,"depth":112,"text":5045},{"id":5115,"depth":50,"text":5116},{"id":5354,"depth":50,"text":5355},{"id":5618,"depth":50,"text":5619,"children":8959},[8960],{"id":5947,"depth":112,"text":5947},{"id":6087,"depth":50,"text":6088},{"id":6272,"depth":50,"text":6273},{"id":6460,"depth":50,"text":6461},{"id":6677,"depth":50,"text":6678},{"id":6953,"depth":50,"text":6954,"children":8966},[8967],{"id":7082,"depth":112,"text":7082},{"id":7203,"depth":50,"text":7204,"children":8969},[8970,8971,8972],{"id":7207,"depth":112,"text":7208},{"id":7405,"depth":112,"text":7406},{"id":7611,"depth":112,"text":7612},{"id":7699,"depth":50,"text":7700},{"id":7824,"depth":50,"text":7825},{"id":7974,"depth":50,"text":7975,"children":8976},[8977],{"id":8086,"depth":112,"text":8086},{"id":8228,"depth":50,"text":8229},{"id":8299,"depth":50,"text":8300,"children":8980},[8981,8982],{"id":8507,"depth":112,"text":8507},{"id":8581,"depth":112,"text":8581},{"id":8775,"depth":50,"text":8776},{"id":3285,"depth":50,"text":3285},{},"\u002Flinux-memo-2026-09-25",{"title":3356,"description":3361},"linux-memo-2026-09-25",[8990,8991,3352],"linux","运维","iSEC1Y6u5VxuDGnkptYIp294v_f2HDDTd_aIwN64dAg",{"id":8994,"title":8995,"author":9,"body":8996,"cover":3,"date":3345,"description":9000,"extension":56,"meta":11865,"navigation":58,"path":11866,"seo":11867,"stem":11868,"tags":11869,"__hash__":11871},"content\u002Fnode-package-managers-memo-2026-09-25.md","Node包管理器备忘录",{"type":12,"value":8997,"toc":11803},[8998,9001,9003,9007,9110,9114,9237,9241,9302,9314,9318,9364,9368,9374,9404,9410,9414,9417,9445,9455,9459,9479,9482,9514,9518,9596,9600,9611,9615,9620,9645,9656,9661,9677,9681,9711,9715,9745,9749,9768,9775,9779,9818,9822,9839,9843,9902,9906,10216,10220,10272,10278,10281,10360,10364,10396,10409,10413,10486,10490,10493,10571,10574,10648,10652,10656,10661,10718,10722,10766,10770,10815,10818,10886,10890,11045,11049,11052,11091,11132,11135,11172,11177,11181,11184,11204,11207,11325,11328,11355,11414,11418,11443,11447,11455,11458,11480,11488,11494,11540,11548,11576,11580,11583,11608,11611,11615,11621,11633,11637,11656,11660,11694,11702,11708,11741,11745,11768,11770,11772,11800],[15,8999,9000],{},"日常高频命令 + 国内换源方案。命令对照无差异时只写 npm。",[29,9002,3365],{"id":3364},[1390,9004,9006],{"id":9005},"_11-一键切换nrm","1.1 一键切换：nrm",[90,9008,9010],{"className":1062,"code":9009,"language":1064,"meta":49,"style":49},"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",[75,9011,9012,9025,9029,9040,9053,9065,9075,9085,9100],{"__ignoreMap":49},[98,9013,9014,9017,9019,9022],{"class":100,"line":101},[98,9015,9016],{"class":704},"npm",[98,9018,3941],{"class":711},[98,9020,9021],{"class":1083}," -g",[98,9023,9024],{"class":711}," nrm\n",[98,9026,9027],{"class":100,"line":50},[98,9028,109],{"emptyLinePlaceholder":58},[98,9030,9031,9034,9037],{"class":100,"line":112},[98,9032,9033],{"class":704},"nrm",[98,9035,9036],{"class":711}," ls",[98,9038,9039],{"class":1071},"                            # 列出所有源\n",[98,9041,9042,9044,9047,9050],{"class":100,"line":197},[98,9043,9033],{"class":704},[98,9045,9046],{"class":711}," use",[98,9048,9049],{"class":711}," taobao",[98,9051,9052],{"class":1071},"                    # 切到淘宝源\n",[98,9054,9055,9057,9059,9062],{"class":100,"line":203},[98,9056,9033],{"class":704},[98,9058,9046],{"class":711},[98,9060,9061],{"class":711}," npm",[98,9063,9064],{"class":1071},"                       # 切回官方\n",[98,9066,9067,9069,9072],{"class":100,"line":344},[98,9068,9033],{"class":704},[98,9070,9071],{"class":711}," current",[98,9073,9074],{"class":1071},"                       # 查看当前\n",[98,9076,9077,9079,9082],{"class":100,"line":350},[98,9078,9033],{"class":704},[98,9080,9081],{"class":711}," test",[98,9083,9084],{"class":1071},"                          # 测速\n",[98,9086,9087,9089,9091,9094,9097],{"class":100,"line":1134},[98,9088,9033],{"class":704},[98,9090,1299],{"class":711},[98,9092,9093],{"class":711}," company",[98,9095,9096],{"class":711}," http:\u002F\u002Fnpm.company.com\u002F",[98,9098,9099],{"class":1071},"    # 加私有源\n",[98,9101,9102,9104,9107],{"class":100,"line":1140},[98,9103,9033],{"class":704},[98,9105,9106],{"class":711}," del",[98,9108,9109],{"class":711}," company\n",[1390,9111,9113],{"id":9112},"_12-手动切换","1.2 手动切换",[90,9115,9117],{"className":1062,"code":9116,"language":1064,"meta":49,"style":49},"# 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",[75,9118,9119,9124,9138,9150,9163,9167,9172,9185,9195,9205,9209,9214,9227],{"__ignoreMap":49},[98,9120,9121],{"class":100,"line":101},[98,9122,9123],{"class":1071},"# npm\n",[98,9125,9126,9128,9130,9132,9135],{"class":100,"line":50},[98,9127,9016],{"class":704},[98,9129,1080],{"class":711},[98,9131,3881],{"class":711},[98,9133,9134],{"class":711}," registry",[98,9136,9137],{"class":711}," https:\u002F\u002Fregistry.npmmirror.com\n",[98,9139,9140,9142,9144,9147],{"class":100,"line":112},[98,9141,9016],{"class":704},[98,9143,1080],{"class":711},[98,9145,9146],{"class":711}," get",[98,9148,9149],{"class":711}," registry\n",[98,9151,9152,9154,9156,9158,9160],{"class":100,"line":197},[98,9153,9016],{"class":704},[98,9155,1080],{"class":711},[98,9157,5990],{"class":711},[98,9159,9134],{"class":711},[98,9161,9162],{"class":1071},"        # 恢复默认\n",[98,9164,9165],{"class":100,"line":203},[98,9166,109],{"emptyLinePlaceholder":58},[98,9168,9169],{"class":100,"line":344},[98,9170,9171],{"class":1071},"# yarn v1\n",[98,9173,9174,9177,9179,9181,9183],{"class":100,"line":350},[98,9175,9176],{"class":704},"yarn",[98,9178,1080],{"class":711},[98,9180,3881],{"class":711},[98,9182,9134],{"class":711},[98,9184,9137],{"class":711},[98,9186,9187,9189,9191,9193],{"class":100,"line":1134},[98,9188,9176],{"class":704},[98,9190,1080],{"class":711},[98,9192,9146],{"class":711},[98,9194,9149],{"class":711},[98,9196,9197,9199,9201,9203],{"class":100,"line":1140},[98,9198,9176],{"class":704},[98,9200,1080],{"class":711},[98,9202,5990],{"class":711},[98,9204,9149],{"class":711},[98,9206,9207],{"class":100,"line":1155},[98,9208,109],{"emptyLinePlaceholder":58},[98,9210,9211],{"class":100,"line":1160},[98,9212,9213],{"class":1071},"# pnpm\n",[98,9215,9216,9219,9221,9223,9225],{"class":100,"line":1166},[98,9217,9218],{"class":704},"pnpm",[98,9220,1080],{"class":711},[98,9222,3881],{"class":711},[98,9224,9134],{"class":711},[98,9226,9137],{"class":711},[98,9228,9229,9231,9233,9235],{"class":100,"line":1181},[98,9230,9218],{"class":704},[98,9232,1080],{"class":711},[98,9234,9146],{"class":711},[98,9236,9149],{"class":711},[1390,9238,9240],{"id":9239},"_13-常用镜像源","1.3 常用镜像源",[357,9242,9243,9251],{},[360,9244,9245],{},[363,9246,9247,9249],{},[366,9248,3485],{},[366,9250,3488],{},[376,9252,9253,9263,9273,9283,9292],{},[363,9254,9255,9258],{},[381,9256,9257],{},"官方",[381,9259,9260],{},[75,9261,9262],{},"https:\u002F\u002Fregistry.npmjs.org",[363,9264,9265,9268],{},[381,9266,9267],{},"淘宝 \u002F npmmirror（推荐）",[381,9269,9270],{},[75,9271,9272],{},"https:\u002F\u002Fregistry.npmmirror.com",[363,9274,9275,9278],{},[381,9276,9277],{},"腾讯云",[381,9279,9280],{},[75,9281,9282],{},"https:\u002F\u002Fmirrors.cloud.tencent.com\u002Fnpm\u002F",[363,9284,9285,9287],{},[381,9286,3525],{},[381,9288,9289],{},[75,9290,9291],{},"https:\u002F\u002Fmirrors.huaweicloud.com\u002Frepository\u002Fnpm\u002F",[363,9293,9294,9297],{},[381,9295,9296],{},"cnpmjs",[381,9298,9299],{},[75,9300,9301],{},"https:\u002F\u002Fregistry.cnpmjs.org",[43,9303,9304],{},[15,9305,9306,9307,9310,9311,22],{},"淘宝源域名 ",[75,9308,9309],{},"registry.npm.taobao.org"," 已废弃，新域名为 ",[75,9312,9313],{},"registry.npmmirror.com",[1390,9315,9317],{"id":9316},"_14-一次性使用不改配置","1.4 一次性使用（不改配置）",[90,9319,9321],{"className":1062,"code":9320,"language":1064,"meta":49,"style":49},"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",[75,9322,9323,9332,9348],{"__ignoreMap":49},[98,9324,9325,9327,9329],{"class":100,"line":101},[98,9326,9016],{"class":704},[98,9328,3941],{"class":711},[98,9330,9331],{"class":1083}," --registry=https:\u002F\u002Fregistry.npmmirror.com\n",[98,9333,9334,9336,9338,9340,9342,9344,9346],{"class":100,"line":50},[98,9335,9176],{"class":704},[98,9337,1299],{"class":711},[98,9339,1302],{"class":700},[98,9341,3946],{"class":711},[98,9343,3949],{"class":696},[98,9345,1311],{"class":700},[98,9347,9331],{"class":1083},[98,9349,9350,9352,9354,9356,9358,9360,9362],{"class":100,"line":112},[98,9351,9218],{"class":704},[98,9353,1299],{"class":711},[98,9355,1302],{"class":700},[98,9357,3946],{"class":711},[98,9359,3949],{"class":696},[98,9361,1311],{"class":700},[98,9363,9331],{"class":1083},[1390,9365,9367],{"id":9366},"_15-项目级-npmrc","1.5 项目级 .npmrc",[15,9369,9370,9373],{},[19,9371,9372],{},"只在当前项目生效","，适合团队统一配置。放项目根目录：",[90,9375,9377],{"className":6850,"code":9376,"language":6852,"meta":49,"style":49},"# .npmrc\nregistry=https:\u002F\u002Fregistry.npmmirror.com\nstrict-ssl=true\nsave-exact=true\nengine-strict=true\n",[75,9378,9379,9384,9389,9394,9399],{"__ignoreMap":49},[98,9380,9381],{"class":100,"line":101},[98,9382,9383],{},"# .npmrc\n",[98,9385,9386],{"class":100,"line":50},[98,9387,9388],{},"registry=https:\u002F\u002Fregistry.npmmirror.com\n",[98,9390,9391],{"class":100,"line":112},[98,9392,9393],{},"strict-ssl=true\n",[98,9395,9396],{"class":100,"line":197},[98,9397,9398],{},"save-exact=true\n",[98,9400,9401],{"class":100,"line":203},[98,9402,9403],{},"engine-strict=true\n",[15,9405,9406,9409],{},[19,9407,9408],{},"提交到 Git","，让所有成员和 CI 用同一套源。",[1390,9411,9413],{"id":9412},"_16-私有源-公共源混用scoped-registry","1.6 私有源 + 公共源混用（scoped registry）",[15,9415,9416],{},"公司包放私有源，公共包走镜像：",[90,9418,9420],{"className":6850,"code":9419,"language":6852,"meta":49,"style":49},"# .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",[75,9421,9422,9426,9430,9435,9440],{"__ignoreMap":49},[98,9423,9424],{"class":100,"line":101},[98,9425,9383],{},[98,9427,9428],{"class":100,"line":50},[98,9429,9388],{},[98,9431,9432],{"class":100,"line":112},[98,9433,9434],{},"@company:registry=https:\u002F\u002Fnpm.company.com\u002F\n",[98,9436,9437],{"class":100,"line":197},[98,9438,9439],{},"\u002F\u002Fnpm.company.com\u002F:_authToken=${NPM_TOKEN}\n",[98,9441,9442],{"class":100,"line":203},[98,9443,9444],{},"\u002F\u002Fregistry.npmmirror.com\u002F:always-auth=false\n",[15,9446,9447,9450,9451,9454],{},[75,9448,9449],{},"@company"," 开头的包（如 ",[75,9452,9453],{},"@company\u002Fui","）走私有源，其余走淘宝源。",[1390,9456,9458],{"id":9457},"_17-认证-token-配置","1.7 认证 Token 配置",[90,9460,9462],{"className":6850,"code":9461,"language":6852,"meta":49,"style":49},"# ~\u002F.npmrc\n\u002F\u002Fregistry.npmjs.org\u002F:_authToken=npm_xxxxxxxxxxxx\n\u002F\u002Fnpm.pkg.github.com\u002F:_authToken=ghp_xxxxxxxxxxxx\n",[75,9463,9464,9469,9474],{"__ignoreMap":49},[98,9465,9466],{"class":100,"line":101},[98,9467,9468],{},"# ~\u002F.npmrc\n",[98,9470,9471],{"class":100,"line":50},[98,9472,9473],{},"\u002F\u002Fregistry.npmjs.org\u002F:_authToken=npm_xxxxxxxxxxxx\n",[98,9475,9476],{"class":100,"line":112},[98,9477,9478],{},"\u002F\u002Fnpm.pkg.github.com\u002F:_authToken=ghp_xxxxxxxxxxxx\n",[15,9480,9481],{},"或用环境变量（推荐 CI 使用）：",[90,9483,9485],{"className":1062,"code":9484,"language":1064,"meta":49,"style":49},"export NPM_TOKEN=xxxxx\n# .npmrc 里写\n\u002F\u002Fregistry.npmjs.org\u002F:_authToken=${NPM_TOKEN}\n",[75,9486,9487,9499,9504],{"__ignoreMap":49},[98,9488,9489,9491,9494,9496],{"class":100,"line":101},[98,9490,7848],{"class":700},[98,9492,9493],{"class":696}," NPM_TOKEN",[98,9495,708],{"class":700},[98,9497,9498],{"class":696},"xxxxx\n",[98,9500,9501],{"class":100,"line":50},[98,9502,9503],{"class":1071},"# .npmrc 里写\n",[98,9505,9506,9509,9511],{"class":100,"line":112},[98,9507,9508],{"class":704},"\u002F\u002Fregistry.npmjs.org\u002F:_authToken",[98,9510,708],{"class":711},[98,9512,9513],{"class":696},"${NPM_TOKEN}\n",[1390,9515,9517],{"id":9516},"_18-换源失败的排查","1.8 换源失败的排查",[90,9519,9521],{"className":1062,"code":9520,"language":1064,"meta":49,"style":49},"# 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",[75,9522,9523,9528,9538,9542,9547,9556,9560,9565,9577,9581,9586],{"__ignoreMap":49},[98,9524,9525],{"class":100,"line":101},[98,9526,9527],{"class":1071},"# 1. 确认当前源\n",[98,9529,9530,9532,9534,9536],{"class":100,"line":50},[98,9531,9016],{"class":704},[98,9533,1080],{"class":711},[98,9535,9146],{"class":711},[98,9537,9149],{"class":711},[98,9539,9540],{"class":100,"line":112},[98,9541,109],{"emptyLinePlaceholder":58},[98,9543,9544],{"class":100,"line":197},[98,9545,9546],{"class":1071},"# 2. 直接 curl 试\n",[98,9548,9549,9551,9553],{"class":100,"line":203},[98,9550,5749],{"class":704},[98,9552,5752],{"class":1083},[98,9554,9555],{"class":711}," https:\u002F\u002Fregistry.npmmirror.com\u002Fvue\n",[98,9557,9558],{"class":100,"line":344},[98,9559,109],{"emptyLinePlaceholder":58},[98,9561,9562],{"class":100,"line":350},[98,9563,9564],{"class":1071},"# 3. 清除 npm 缓存\n",[98,9566,9567,9569,9572,9574],{"class":100,"line":1134},[98,9568,9016],{"class":704},[98,9570,9571],{"class":711}," cache",[98,9573,3634],{"class":711},[98,9575,9576],{"class":1083}," --force\n",[98,9578,9579],{"class":100,"line":1140},[98,9580,109],{"emptyLinePlaceholder":58},[98,9582,9583],{"class":100,"line":1155},[98,9584,9585],{"class":1071},"# 4. 检查是否有多个 .npmrc 冲突\n",[98,9587,9588,9590,9592,9594],{"class":100,"line":1160},[98,9589,9016],{"class":704},[98,9591,1080],{"class":711},[98,9593,2099],{"class":711},[98,9595,1273],{"class":1083},[29,9597,9599],{"id":9598},"二其他-binary-镜像换源只改-npm-包不改-binary","二、其他 binary 镜像（换源只改 npm 包，不改 binary）",[15,9601,9602,9603,9606,9607,9610],{},"很多包在 ",[75,9604,9605],{},"postinstall"," 阶段会下载",[19,9608,9609],{},"非 npm 的二进制","，换 registry 没用。这些要单独配：",[1390,9612,9614],{"id":9613},"_21-node-版本管理器镜像","2.1 Node 版本管理器镜像",[15,9616,9617,3439],{},[19,9618,9619],{},"nvm",[90,9621,9623],{"className":1062,"code":9622,"language":1064,"meta":49,"style":49},"export NVM_NODEJS_ORG_MIRROR=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode\nnvm install 20\n",[75,9624,9625,9637],{"__ignoreMap":49},[98,9626,9627,9629,9632,9634],{"class":100,"line":101},[98,9628,7848],{"class":700},[98,9630,9631],{"class":696}," NVM_NODEJS_ORG_MIRROR",[98,9633,708],{"class":700},[98,9635,9636],{"class":696},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode\n",[98,9638,9639,9641,9643],{"class":100,"line":50},[98,9640,9619],{"class":704},[98,9642,3941],{"class":711},[98,9644,4698],{"class":1083},[15,9646,9647,9648,9651,9652,9655],{},"写入 ",[75,9649,9650],{},"~\u002F.bashrc"," 或 ",[75,9653,9654],{},"~\u002F.zshrc"," 永久生效。",[15,9657,9658,3439],{},[19,9659,9660],{},"fnm",[90,9662,9664],{"className":1062,"code":9663,"language":1064,"meta":49,"style":49},"export FNM_NODE_DIST_MIRROR=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode\n",[75,9665,9666],{"__ignoreMap":49},[98,9667,9668,9670,9673,9675],{"class":100,"line":101},[98,9669,7848],{"class":700},[98,9671,9672],{"class":696}," FNM_NODE_DIST_MIRROR",[98,9674,708],{"class":700},[98,9676,9636],{"class":696},[1390,9678,9680],{"id":9679},"_22-electron","2.2 Electron",[90,9682,9684],{"className":1062,"code":9683,"language":1064,"meta":49,"style":49},"# 项目 .npmrc\nelectron_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron\u002F\nelectron_builder_binaries_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron-builder-binaries\u002F\n",[75,9685,9686,9691,9701],{"__ignoreMap":49},[98,9687,9688],{"class":100,"line":101},[98,9689,9690],{"class":1071},"# 项目 .npmrc\n",[98,9692,9693,9696,9698],{"class":100,"line":50},[98,9694,9695],{"class":696},"electron_mirror",[98,9697,708],{"class":700},[98,9699,9700],{"class":711},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron\u002F\n",[98,9702,9703,9706,9708],{"class":100,"line":112},[98,9704,9705],{"class":696},"electron_builder_binaries_mirror",[98,9707,708],{"class":700},[98,9709,9710],{"class":711},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron-builder-binaries\u002F\n",[1390,9712,9714],{"id":9713},"_23-puppeteer-playwright","2.3 Puppeteer \u002F Playwright",[90,9716,9718],{"className":1062,"code":9717,"language":1064,"meta":49,"style":49},"# .npmrc 或环境变量\npuppeteer_download_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\nPLAYWRIGHT_DOWNLOAD_HOST=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fplaywright\n",[75,9719,9720,9725,9735],{"__ignoreMap":49},[98,9721,9722],{"class":100,"line":101},[98,9723,9724],{"class":1071},"# .npmrc 或环境变量\n",[98,9726,9727,9730,9732],{"class":100,"line":50},[98,9728,9729],{"class":696},"puppeteer_download_host",[98,9731,708],{"class":700},[98,9733,9734],{"class":711},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\n",[98,9736,9737,9740,9742],{"class":100,"line":112},[98,9738,9739],{"class":696},"PLAYWRIGHT_DOWNLOAD_HOST",[98,9741,708],{"class":700},[98,9743,9744],{"class":711},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fplaywright\n",[1390,9746,9748],{"id":9747},"_24-node-sass-sass-embedded","2.4 node-sass \u002F sass-embedded",[90,9750,9752],{"className":1062,"code":9751,"language":1064,"meta":49,"style":49},"# .npmrc\nsass_binary_site=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-sass\n",[75,9753,9754,9758],{"__ignoreMap":49},[98,9755,9756],{"class":100,"line":101},[98,9757,9383],{"class":1071},[98,9759,9760,9763,9765],{"class":100,"line":50},[98,9761,9762],{"class":696},"sass_binary_site",[98,9764,708],{"class":700},[98,9766,9767],{"class":711},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-sass\n",[15,9769,9770,9771,9774],{},"现在多用 ",[75,9772,9773],{},"sass","（dart-sass 纯 JS 实现），无需 binary。",[1390,9776,9778],{"id":9777},"_25-sharp-canvas","2.5 sharp \u002F canvas",[90,9780,9782],{"className":1062,"code":9781,"language":1064,"meta":49,"style":49},"# .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",[75,9783,9784,9788,9798,9808],{"__ignoreMap":49},[98,9785,9786],{"class":100,"line":101},[98,9787,9383],{"class":1071},[98,9789,9790,9793,9795],{"class":100,"line":50},[98,9791,9792],{"class":696},"sharp_binary_host",[98,9794,708],{"class":700},[98,9796,9797],{"class":711},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp\n",[98,9799,9800,9803,9805],{"class":100,"line":112},[98,9801,9802],{"class":696},"sharp_libvips_binary_host",[98,9804,708],{"class":700},[98,9806,9807],{"class":711},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp-libvips\n",[98,9809,9810,9813,9815],{"class":100,"line":197},[98,9811,9812],{"class":696},"canvas_binary_host_mirror",[98,9814,708],{"class":700},[98,9816,9817],{"class":711},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-canvas-prebuilt\u002F\n",[1390,9819,9821],{"id":9820},"_26-cypress","2.6 Cypress",[90,9823,9825],{"className":1062,"code":9824,"language":1064,"meta":49,"style":49},"export CYPRESS_DOWNLOAD_MIRROR=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fcypress\n",[75,9826,9827],{"__ignoreMap":49},[98,9828,9829,9831,9834,9836],{"class":100,"line":101},[98,9830,7848],{"class":700},[98,9832,9833],{"class":696}," CYPRESS_DOWNLOAD_MIRROR",[98,9835,708],{"class":700},[98,9837,9838],{"class":696},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fcypress\n",[1390,9840,9842],{"id":9841},"_27-全家桶模板","2.7 全家桶模板",[90,9844,9846],{"className":6850,"code":9845,"language":6852,"meta":49,"style":49},"# ~\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",[75,9847,9848,9853,9857,9862,9867,9872,9877,9882,9887,9892,9897],{"__ignoreMap":49},[98,9849,9850],{"class":100,"line":101},[98,9851,9852],{},"# ~\u002F.npmrc 一份全搞定\n",[98,9854,9855],{"class":100,"line":50},[98,9856,9388],{},[98,9858,9859],{"class":100,"line":112},[98,9860,9861],{},"electron_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron\u002F\n",[98,9863,9864],{"class":100,"line":197},[98,9865,9866],{},"electron_builder_binaries_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron-builder-binaries\u002F\n",[98,9868,9869],{"class":100,"line":203},[98,9870,9871],{},"puppeteer_download_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\n",[98,9873,9874],{"class":100,"line":344},[98,9875,9876],{},"PLAYWRIGHT_DOWNLOAD_HOST=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fplaywright\n",[98,9878,9879],{"class":100,"line":350},[98,9880,9881],{},"sass_binary_site=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-sass\n",[98,9883,9884],{"class":100,"line":1134},[98,9885,9886],{},"sharp_binary_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp\n",[98,9888,9889],{"class":100,"line":1140},[98,9890,9891],{},"sharp_libvips_binary_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp-libvips\n",[98,9893,9894],{"class":100,"line":1155},[98,9895,9896],{},"canvas_binary_host_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-canvas-prebuilt\u002F\n",[98,9898,9899],{"class":100,"line":1160},[98,9900,9901],{},"CYPRESS_DOWNLOAD_MIRROR=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fcypress\n",[29,9903,9905],{"id":9904},"三命令对照速查","三、命令对照速查",[357,9907,9908,9922],{},[360,9909,9910],{},[363,9911,9912,9915,9917,9920],{},[366,9913,9914],{},"操作",[366,9916,9016],{},[366,9918,9919],{},"yarn (v1)",[366,9921,9218],{},[376,9923,9924,9943,9963,9983,10003,10018,10038,10058,10078,10098,10118,10136,10156,10176,10196],{},[363,9925,9926,9929,9934,9938],{},[381,9927,9928],{},"安装全部",[381,9930,9931],{},[75,9932,9933],{},"npm install",[381,9935,9936],{},[75,9937,9176],{},[381,9939,9940],{},[75,9941,9942],{},"pnpm install",[363,9944,9945,9948,9953,9958],{},[381,9946,9947],{},"安装生产依赖",[381,9949,9950],{},[75,9951,9952],{},"npm i \u003Cpkg>",[381,9954,9955],{},[75,9956,9957],{},"yarn add \u003Cpkg>",[381,9959,9960],{},[75,9961,9962],{},"pnpm add \u003Cpkg>",[363,9964,9965,9968,9973,9978],{},[381,9966,9967],{},"安装开发依赖",[381,9969,9970],{},[75,9971,9972],{},"npm i -D \u003Cpkg>",[381,9974,9975],{},[75,9976,9977],{},"yarn add -D \u003Cpkg>",[381,9979,9980],{},[75,9981,9982],{},"pnpm add -D \u003Cpkg>",[363,9984,9985,9988,9993,9998],{},[381,9986,9987],{},"安装全局",[381,9989,9990],{},[75,9991,9992],{},"npm i -g \u003Cpkg>",[381,9994,9995],{},[75,9996,9997],{},"yarn global add \u003Cpkg>",[381,9999,10000],{},[75,10001,10002],{},"pnpm add -g \u003Cpkg>",[363,10004,10005,10008,10013,10016],{},[381,10006,10007],{},"安装指定版本",[381,10009,10010],{},[75,10011,10012],{},"npm i \u003Cpkg>@1.2.3",[381,10014,10015],{},"同",[381,10017,10015],{},[363,10019,10020,10023,10028,10033],{},[381,10021,10022],{},"卸载",[381,10024,10025],{},[75,10026,10027],{},"npm uninstall \u003Cpkg>",[381,10029,10030],{},[75,10031,10032],{},"yarn remove \u003Cpkg>",[381,10034,10035],{},[75,10036,10037],{},"pnpm remove \u003Cpkg>",[363,10039,10040,10043,10048,10053],{},[381,10041,10042],{},"卸载全局",[381,10044,10045],{},[75,10046,10047],{},"npm uninstall -g \u003Cpkg>",[381,10049,10050],{},[75,10051,10052],{},"yarn global remove \u003Cpkg>",[381,10054,10055],{},[75,10056,10057],{},"pnpm remove -g \u003Cpkg>",[363,10059,10060,10063,10068,10073],{},[381,10061,10062],{},"更新全部",[381,10064,10065],{},[75,10066,10067],{},"npm update",[381,10069,10070],{},[75,10071,10072],{},"yarn upgrade",[381,10074,10075],{},[75,10076,10077],{},"pnpm update",[363,10079,10080,10083,10088,10093],{},[381,10081,10082],{},"运行脚本",[381,10084,10085],{},[75,10086,10087],{},"npm run \u003Cs>",[381,10089,10090],{},[75,10091,10092],{},"yarn \u003Cs>",[381,10094,10095],{},[75,10096,10097],{},"pnpm \u003Cs>",[363,10099,10100,10103,10108,10113],{},[381,10101,10102],{},"执行本地二进制",[381,10104,10105],{},[75,10106,10107],{},"npx \u003Cbin>",[381,10109,10110],{},[75,10111,10112],{},"yarn \u003Cbin>",[381,10114,10115],{},[75,10116,10117],{},"pnpm exec \u003Cbin>",[363,10119,10120,10123,10128,10131],{},[381,10121,10122],{},"执行远程包",[381,10124,10125],{},[75,10126,10127],{},"npx \u003Cpkg>",[381,10129,10130],{},"—",[381,10132,10133],{},[75,10134,10135],{},"pnpm dlx \u003Cpkg>",[363,10137,10138,10141,10146,10151],{},[381,10139,10140],{},"查看顶层依赖",[381,10142,10143],{},[75,10144,10145],{},"npm ls --depth=0",[381,10147,10148],{},[75,10149,10150],{},"yarn list --depth=0",[381,10152,10153],{},[75,10154,10155],{},"pnpm list --depth=0",[363,10157,10158,10161,10166,10171],{},[381,10159,10160],{},"查过时依赖",[381,10162,10163],{},[75,10164,10165],{},"npm outdated",[381,10167,10168],{},[75,10169,10170],{},"yarn outdated",[381,10172,10173],{},[75,10174,10175],{},"pnpm outdated",[363,10177,10178,10181,10186,10191],{},[381,10179,10180],{},"清缓存",[381,10182,10183],{},[75,10184,10185],{},"npm cache clean --force",[381,10187,10188],{},[75,10189,10190],{},"yarn cache clean",[381,10192,10193],{},[75,10194,10195],{},"pnpm store prune",[363,10197,10198,10201,10206,10211],{},[381,10199,10200],{},"查看为什么装了某包",[381,10202,10203],{},[75,10204,10205],{},"npm why \u003Cpkg>",[381,10207,10208],{},[75,10209,10210],{},"yarn why \u003Cpkg>",[381,10212,10213],{},[75,10214,10215],{},"pnpm why \u003Cpkg>",[29,10217,10219],{"id":10218},"四锁文件","四、锁文件",[357,10221,10222,10235],{},[360,10223,10224],{},[363,10225,10226,10229,10232],{},[366,10227,10228],{},"包管理器",[366,10230,10231],{},"锁文件",[366,10233,10234],{},"提交 Git",[376,10236,10237,10249,10261],{},[363,10238,10239,10241,10246],{},[381,10240,9016],{},[381,10242,10243],{},[75,10244,10245],{},"package-lock.json",[381,10247,10248],{},"✅",[363,10250,10251,10254,10259],{},[381,10252,10253],{},"yarn v1",[381,10255,10256],{},[75,10257,10258],{},"yarn.lock",[381,10260,10248],{},[363,10262,10263,10265,10270],{},[381,10264,9218],{},[381,10266,10267],{},[75,10268,10269],{},"pnpm-lock.yaml",[381,10271,10248],{},[15,10273,10274,10277],{},[19,10275,10276],{},"同一仓库只保留一种锁文件","。混用会导致依赖树不一致。",[1390,10279,10280],{"id":10280},"清理重装",[90,10282,10284],{"className":1062,"code":10283,"language":1064,"meta":49,"style":49},"# 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",[75,10285,10286,10290,10309,10313,10318,10335,10339,10343],{"__ignoreMap":49},[98,10287,10288],{"class":100,"line":101},[98,10289,9123],{"class":1071},[98,10291,10292,10294,10296,10299,10302,10304,10306],{"class":100,"line":50},[98,10293,4364],{"class":704},[98,10295,4367],{"class":1083},[98,10297,10298],{"class":711}," node_modules",[98,10300,10301],{"class":711}," package-lock.json",[98,10303,3724],{"class":696},[98,10305,9016],{"class":704},[98,10307,10308],{"class":711}," install\n",[98,10310,10311],{"class":100,"line":112},[98,10312,109],{"emptyLinePlaceholder":58},[98,10314,10315],{"class":100,"line":197},[98,10316,10317],{"class":1071},"# yarn\n",[98,10319,10320,10322,10324,10326,10329,10331,10333],{"class":100,"line":203},[98,10321,4364],{"class":704},[98,10323,4367],{"class":1083},[98,10325,10298],{"class":711},[98,10327,10328],{"class":711}," yarn.lock",[98,10330,3724],{"class":696},[98,10332,9176],{"class":704},[98,10334,10308],{"class":711},[98,10336,10337],{"class":100,"line":344},[98,10338,109],{"emptyLinePlaceholder":58},[98,10340,10341],{"class":100,"line":350},[98,10342,9213],{"class":1071},[98,10344,10345,10347,10349,10351,10354,10356,10358],{"class":100,"line":1134},[98,10346,4364],{"class":704},[98,10348,4367],{"class":1083},[98,10350,10298],{"class":711},[98,10352,10353],{"class":711}," pnpm-lock.yaml",[98,10355,3724],{"class":696},[98,10357,9218],{"class":704},[98,10359,10308],{"class":711},[1390,10361,10363],{"id":10362},"ci-严格安装","CI 严格安装",[90,10365,10367],{"className":1062,"code":10366,"language":1064,"meta":49,"style":49},"npm ci                            # 严格按 lock 装，不更新\npnpm install --frozen-lockfile\nyarn install --frozen-lockfile\n",[75,10368,10369,10379,10388],{"__ignoreMap":49},[98,10370,10371,10373,10376],{"class":100,"line":101},[98,10372,9016],{"class":704},[98,10374,10375],{"class":711}," ci",[98,10377,10378],{"class":1071},"                            # 严格按 lock 装，不更新\n",[98,10380,10381,10383,10385],{"class":100,"line":50},[98,10382,9218],{"class":704},[98,10384,3941],{"class":711},[98,10386,10387],{"class":1083}," --frozen-lockfile\n",[98,10389,10390,10392,10394],{"class":100,"line":112},[98,10391,9176],{"class":704},[98,10393,3941],{"class":711},[98,10395,10387],{"class":1083},[15,10397,10398,10401,10402,10404,10405,10408],{},[75,10399,10400],{},"npm ci"," 要求 ",[75,10403,10245],{}," 与 ",[75,10406,10407],{},"package.json"," 完全一致，否则直接报错退出。",[29,10410,10412],{"id":10411},"五依赖版本语义","五、依赖版本语义",[357,10414,10415,10425],{},[360,10416,10417],{},[363,10418,10419,10422],{},[366,10420,10421],{},"写法",[366,10423,10424],{},"允许升级范围",[376,10426,10427,10437,10449,10461,10474],{},[363,10428,10429,10434],{},[381,10430,10431],{},[75,10432,10433],{},"1.2.3",[381,10435,10436],{},"精确，不升级",[363,10438,10439,10444],{},[381,10440,10441],{},[75,10442,10443],{},"~1.2.3",[381,10445,10446],{},[75,10447,10448],{},">=1.2.3 \u003C1.3.0",[363,10450,10451,10456],{},[381,10452,10453],{},[75,10454,10455],{},"^1.2.3",[381,10457,10458],{},[75,10459,10460],{},">=1.2.3 \u003C2.0.0",[363,10462,10463,10468],{},[381,10464,10465],{},[75,10466,10467],{},"^0.2.3",[381,10469,10470,10473],{},[75,10471,10472],{},">=0.2.3 \u003C0.3.0","（0.x 例外，锁次版本）",[363,10475,10476,10483],{},[381,10477,10478,424,10480],{},[75,10479,3595],{},[75,10481,10482],{},"latest",[381,10484,10485],{},"不限（不推荐）",[29,10487,10489],{"id":10488},"六脚本scripts","六、脚本（scripts）",[1390,10491,10492],{"id":10492},"钩子",[357,10494,10495,10504],{},[360,10496,10497],{},[363,10498,10499,10501],{},[366,10500,10492],{},[366,10502,10503],{},"触发时机",[376,10505,10506,10516,10525,10535,10549,10561],{},[363,10507,10508,10513],{},[381,10509,10510],{},[75,10511,10512],{},"preinstall",[381,10514,10515],{},"install 之前",[363,10517,10518,10522],{},[381,10519,10520],{},[75,10521,9605],{},[381,10523,10524],{},"install 之后",[363,10526,10527,10532],{},[381,10528,10529],{},[75,10530,10531],{},"prepare",[381,10533,10534],{},"install 和 publish 之前都触发（husky 常用）",[363,10536,10537,10542],{},[381,10538,10539],{},[75,10540,10541],{},"prepublishOnly",[381,10543,10544,10545,10548],{},"仅 ",[75,10546,10547],{},"npm publish"," 之前",[363,10550,10551,10556],{},[381,10552,10553],{},[75,10554,10555],{},"pre\u003Cscript>",[381,10557,10558,10548],{},[75,10559,10560],{},"npm run \u003Cscript>",[363,10562,10563,10568],{},[381,10564,10565],{},[75,10566,10567],{},"post\u003Cscript>",[381,10569,10570],{},"执行之后",[1390,10572,10573],{"id":10573},"传参与环境变量",[90,10575,10577],{"className":1062,"code":10576,"language":1064,"meta":49,"style":49},"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",[75,10578,10579,10597,10607,10617,10621,10626,10638],{"__ignoreMap":49},[98,10580,10581,10583,10586,10589,10591,10594],{"class":100,"line":101},[98,10582,9016],{"class":704},[98,10584,10585],{"class":711}," run",[98,10587,10588],{"class":711}," build",[98,10590,1859],{"class":1083},[98,10592,10593],{"class":1083}," --mode",[98,10595,10596],{"class":711}," production\n",[98,10598,10599,10601,10603,10605],{"class":100,"line":50},[98,10600,9176],{"class":704},[98,10602,10588],{"class":711},[98,10604,10593],{"class":1083},[98,10606,10596],{"class":711},[98,10608,10609,10611,10613,10615],{"class":100,"line":112},[98,10610,9218],{"class":704},[98,10612,10588],{"class":711},[98,10614,10593],{"class":1083},[98,10616,10596],{"class":711},[98,10618,10619],{"class":100,"line":197},[98,10620,109],{"emptyLinePlaceholder":58},[98,10622,10623],{"class":100,"line":203},[98,10624,10625],{"class":1071},"# 跨平台环境变量\n",[98,10627,10628,10630,10633,10635],{"class":100,"line":344},[98,10629,9016],{"class":704},[98,10631,10632],{"class":711}," i",[98,10634,1607],{"class":1083},[98,10636,10637],{"class":711}," cross-env\n",[98,10639,10640,10643,10645],{"class":100,"line":350},[98,10641,10642],{"class":704},"\"build\"",[98,10644,8653],{"class":4320},[98,10646,10647],{"class":711}," \"cross-env NODE_ENV=production vite build\"\n",[29,10649,10651],{"id":10650},"七依赖管理","七、依赖管理",[1390,10653,10655],{"id":10654},"overrides-resolutions强制覆盖版本","overrides \u002F resolutions（强制覆盖版本）",[15,10657,10658,3439],{},[19,10659,10660],{},"npm (>= 8.3)",[90,10662,10664],{"className":4028,"code":10663,"language":4030,"meta":49,"style":49},"{\n  \"overrides\": {\n    \"lodash\": \"4.17.21\",\n    \"some-pkg\": { \"lodash\": \"4.17.21\" }\n  }\n}\n",[75,10665,10666,10670,10678,10691,10709,10714],{"__ignoreMap":49},[98,10667,10668],{"class":100,"line":101},[98,10669,4037],{"class":696},[98,10671,10672,10675],{"class":100,"line":50},[98,10673,10674],{"class":4042},"  \"overrides\"",[98,10676,10677],{"class":696},": {\n",[98,10679,10680,10683,10686,10689],{"class":100,"line":112},[98,10681,10682],{"class":4042},"    \"lodash\"",[98,10684,10685],{"class":696},": ",[98,10687,10688],{"class":4051},"\"4.17.21\"",[98,10690,4055],{"class":696},[98,10692,10693,10696,10699,10702,10704,10706],{"class":100,"line":197},[98,10694,10695],{"class":4042},"    \"some-pkg\"",[98,10697,10698],{"class":696},": { ",[98,10700,10701],{"class":4042},"\"lodash\"",[98,10703,10685],{"class":696},[98,10705,10688],{"class":4051},[98,10707,10708],{"class":696}," }\n",[98,10710,10711],{"class":100,"line":203},[98,10712,10713],{"class":696},"  }\n",[98,10715,10716],{"class":100,"line":344},[98,10717,4084],{"class":696},[15,10719,10720,3439],{},[19,10721,10253],{},[90,10723,10725],{"className":4028,"code":10724,"language":4030,"meta":49,"style":49},"{\n  \"resolutions\": {\n    \"lodash\": \"4.17.21\",\n    \"**\u002Flodash\": \"4.17.21\"\n  }\n}\n",[75,10726,10727,10731,10738,10748,10758,10762],{"__ignoreMap":49},[98,10728,10729],{"class":100,"line":101},[98,10730,4037],{"class":696},[98,10732,10733,10736],{"class":100,"line":50},[98,10734,10735],{"class":4042},"  \"resolutions\"",[98,10737,10677],{"class":696},[98,10739,10740,10742,10744,10746],{"class":100,"line":112},[98,10741,10682],{"class":4042},[98,10743,10685],{"class":696},[98,10745,10688],{"class":4051},[98,10747,4055],{"class":696},[98,10749,10750,10753,10755],{"class":100,"line":197},[98,10751,10752],{"class":4042},"    \"**\u002Flodash\"",[98,10754,10685],{"class":696},[98,10756,10757],{"class":4051},"\"4.17.21\"\n",[98,10759,10760],{"class":100,"line":203},[98,10761,10713],{"class":696},[98,10763,10764],{"class":100,"line":344},[98,10765,4084],{"class":696},[15,10767,10768,3439],{},[19,10769,9218],{},[90,10771,10773],{"className":4028,"code":10772,"language":4030,"meta":49,"style":49},"{\n  \"pnpm\": {\n    \"overrides\": {\n      \"lodash\": \"4.17.21\"\n    }\n  }\n}\n",[75,10774,10775,10779,10786,10793,10802,10807,10811],{"__ignoreMap":49},[98,10776,10777],{"class":100,"line":101},[98,10778,4037],{"class":696},[98,10780,10781,10784],{"class":100,"line":50},[98,10782,10783],{"class":4042},"  \"pnpm\"",[98,10785,10677],{"class":696},[98,10787,10788,10791],{"class":100,"line":112},[98,10789,10790],{"class":4042},"    \"overrides\"",[98,10792,10677],{"class":696},[98,10794,10795,10798,10800],{"class":100,"line":197},[98,10796,10797],{"class":4042},"      \"lodash\"",[98,10799,10685],{"class":696},[98,10801,10757],{"class":4051},[98,10803,10804],{"class":100,"line":203},[98,10805,10806],{"class":696},"    }\n",[98,10808,10809],{"class":100,"line":344},[98,10810,10713],{"class":696},[98,10812,10813],{"class":100,"line":350},[98,10814,4084],{"class":696},[1390,10816,10817],{"id":10817},"依赖分析",[90,10819,10821],{"className":1062,"code":10820,"language":1064,"meta":49,"style":49},"npm ls \u003Cpkg>                      # 谁依赖了它\nnpm why \u003Cpkg>                     # 同上（npm 8+）\npnpm why \u003Cpkg>\nyarn why \u003Cpkg>\n",[75,10822,10823,10840,10858,10872],{"__ignoreMap":49},[98,10824,10825,10827,10829,10831,10833,10835,10837],{"class":100,"line":101},[98,10826,9016],{"class":704},[98,10828,9036],{"class":711},[98,10830,1302],{"class":700},[98,10832,3946],{"class":711},[98,10834,3949],{"class":696},[98,10836,1311],{"class":700},[98,10838,10839],{"class":1071},"                      # 谁依赖了它\n",[98,10841,10842,10844,10847,10849,10851,10853,10855],{"class":100,"line":50},[98,10843,9016],{"class":704},[98,10845,10846],{"class":711}," why",[98,10848,1302],{"class":700},[98,10850,3946],{"class":711},[98,10852,3949],{"class":696},[98,10854,1311],{"class":700},[98,10856,10857],{"class":1071},"                     # 同上（npm 8+）\n",[98,10859,10860,10862,10864,10866,10868,10870],{"class":100,"line":112},[98,10861,9218],{"class":704},[98,10863,10846],{"class":711},[98,10865,1302],{"class":700},[98,10867,3946],{"class":711},[98,10869,3949],{"class":696},[98,10871,720],{"class":700},[98,10873,10874,10876,10878,10880,10882,10884],{"class":100,"line":197},[98,10875,9176],{"class":704},[98,10877,10846],{"class":711},[98,10879,1302],{"class":700},[98,10881,3946],{"class":711},[98,10883,3949],{"class":696},[98,10885,720],{"class":700},[29,10887,10889],{"id":10888},"八npm-专属","八、npm 专属",[90,10891,10893],{"className":1062,"code":10892,"language":1064,"meta":49,"style":49},"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",[75,10894,10895,10913,10933,10953,10973,10977,10984,10994,11009,11024],{"__ignoreMap":49},[98,10896,10897,10899,10902,10904,10906,10908,10910],{"class":100,"line":101},[98,10898,9016],{"class":704},[98,10900,10901],{"class":711}," view",[98,10903,1302],{"class":700},[98,10905,3946],{"class":711},[98,10907,3949],{"class":696},[98,10909,1311],{"class":700},[98,10911,10912],{"class":1071},"                    # 包信息\n",[98,10914,10915,10917,10919,10921,10923,10925,10927,10930],{"class":100,"line":50},[98,10916,9016],{"class":704},[98,10918,10901],{"class":711},[98,10920,1302],{"class":700},[98,10922,3946],{"class":711},[98,10924,3949],{"class":696},[98,10926,1311],{"class":700},[98,10928,10929],{"class":711}," versions",[98,10931,10932],{"class":1071},"           # 所有版本\n",[98,10934,10935,10937,10939,10941,10943,10945,10947,10950],{"class":100,"line":112},[98,10936,9016],{"class":704},[98,10938,10901],{"class":711},[98,10940,1302],{"class":700},[98,10942,3946],{"class":711},[98,10944,3949],{"class":696},[98,10946,1311],{"class":700},[98,10948,10949],{"class":711}," dist-tags",[98,10951,10952],{"class":1071},"          # 标签\n",[98,10954,10955,10957,10959,10961,10963,10965,10967,10970],{"class":100,"line":197},[98,10956,9016],{"class":704},[98,10958,4119],{"class":711},[98,10960,1302],{"class":700},[98,10962,3946],{"class":711},[98,10964,3949],{"class":696},[98,10966,1311],{"class":700},[98,10968,10969],{"class":711}," repository.url",[98,10971,10972],{"class":1071},"     # 仓库地址\n",[98,10974,10975],{"class":100,"line":203},[98,10976,109],{"emptyLinePlaceholder":58},[98,10978,10979,10981],{"class":100,"line":344},[98,10980,9016],{"class":704},[98,10982,10983],{"class":711}," login\n",[98,10985,10986,10988,10991],{"class":100,"line":350},[98,10987,9016],{"class":704},[98,10989,10990],{"class":711}," publish",[98,10992,10993],{"class":1071},"                       # 发布\n",[98,10995,10996,10998,11000,11003,11006],{"class":100,"line":1134},[98,10997,9016],{"class":704},[98,10999,10990],{"class":711},[98,11001,11002],{"class":1083}," --access",[98,11004,11005],{"class":711}," public",[98,11007,11008],{"class":1071},"       # scoped 包首次发布\n",[98,11010,11011,11013,11015,11018,11021],{"class":100,"line":1140},[98,11012,9016],{"class":704},[98,11014,10990],{"class":711},[98,11016,11017],{"class":1083}," --tag",[98,11019,11020],{"class":711}," beta",[98,11022,11023],{"class":1071},"            # 打标签\n",[98,11025,11026,11028,11031,11033,11035,11037,11039,11042],{"class":100,"line":1155},[98,11027,9016],{"class":704},[98,11029,11030],{"class":711}," unpublish",[98,11032,1302],{"class":700},[98,11034,3946],{"class":711},[98,11036,3949],{"class":696},[98,11038,1311],{"class":700},[98,11040,11041],{"class":711},"@1.0.0",[98,11043,11044],{"class":1071},"         # 撤销（24h 内）\n",[29,11046,11048],{"id":11047},"九yarn-v1-专属","九、yarn v1 专属",[1390,11050,11051],{"id":11051},"workspaces",[90,11053,11055],{"className":4028,"code":11054,"language":4030,"meta":49,"style":49},"{\n  \"private\": true,\n  \"workspaces\": [\"packages\u002F*\"]\n}\n",[75,11056,11057,11061,11073,11087],{"__ignoreMap":49},[98,11058,11059],{"class":100,"line":101},[98,11060,4037],{"class":696},[98,11062,11063,11066,11068,11071],{"class":100,"line":50},[98,11064,11065],{"class":4042},"  \"private\"",[98,11067,10685],{"class":696},[98,11069,11070],{"class":1083},"true",[98,11072,4055],{"class":696},[98,11074,11075,11078,11081,11084],{"class":100,"line":112},[98,11076,11077],{"class":4042},"  \"workspaces\"",[98,11079,11080],{"class":696},": [",[98,11082,11083],{"class":4051},"\"packages\u002F*\"",[98,11085,11086],{"class":696},"]\n",[98,11088,11089],{"class":100,"line":197},[98,11090,4084],{"class":696},[90,11092,11094],{"className":1062,"code":11093,"language":1064,"meta":49,"style":49},"yarn workspace \u003Cpkg> add \u003Cdep>\nyarn workspaces info\n",[75,11095,11096,11122],{"__ignoreMap":49},[98,11097,11098,11100,11103,11105,11107,11109,11111,11113,11115,11118,11120],{"class":100,"line":101},[98,11099,9176],{"class":704},[98,11101,11102],{"class":711}," workspace",[98,11104,1302],{"class":700},[98,11106,3946],{"class":711},[98,11108,3949],{"class":696},[98,11110,1311],{"class":700},[98,11112,1299],{"class":711},[98,11114,1302],{"class":700},[98,11116,11117],{"class":711},"de",[98,11119,15],{"class":696},[98,11121,720],{"class":700},[98,11123,11124,11126,11129],{"class":100,"line":50},[98,11125,9176],{"class":704},[98,11127,11128],{"class":711}," workspaces",[98,11130,11131],{"class":711}," info\n",[1390,11133,11134],{"id":11134},"常用",[90,11136,11138],{"className":1062,"code":11137,"language":1064,"meta":49,"style":49},"yarn licenses list                # 许可证\nyarn audit                        # 安全审计\nyarn autoclean --init\n",[75,11139,11140,11152,11162],{"__ignoreMap":49},[98,11141,11142,11144,11147,11149],{"class":100,"line":101},[98,11143,9176],{"class":704},[98,11145,11146],{"class":711}," licenses",[98,11148,2099],{"class":711},[98,11150,11151],{"class":1071},"                # 许可证\n",[98,11153,11154,11156,11159],{"class":100,"line":50},[98,11155,9176],{"class":704},[98,11157,11158],{"class":711}," audit",[98,11160,11161],{"class":1071},"                        # 安全审计\n",[98,11163,11164,11166,11169],{"class":100,"line":112},[98,11165,9176],{"class":704},[98,11167,11168],{"class":711}," autoclean",[98,11170,11171],{"class":1083}," --init\n",[43,11173,11174],{},[15,11175,11176],{},"yarn v1 已停止新功能开发，长期建议迁移到 pnpm 或 yarn berry (v2+)。",[29,11178,11180],{"id":11179},"十pnpm-专属","十、pnpm 专属",[1390,11182,11183],{"id":11183},"核心优势",[33,11185,11186,11192,11198],{},[36,11187,11188,11191],{},[19,11189,11190],{},"硬链接 + 内容寻址存储","：磁盘只存一份包实体，多项目共享。",[36,11193,11194,11197],{},[19,11195,11196],{},"非扁平化 node_modules","：只有直接依赖可见，杜绝幽灵依赖。",[36,11199,11200,11203],{},[19,11201,11202],{},"严格 peerDependencies","：不隐式提升未声明依赖。",[1390,11205,11134],{"id":11206},"常用-1",[90,11208,11210],{"className":1062,"code":11209,"language":1064,"meta":49,"style":49},"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",[75,11211,11212,11225,11237,11247,11265,11281,11285,11305],{"__ignoreMap":49},[98,11213,11214,11216,11219,11222],{"class":100,"line":101},[98,11215,9218],{"class":704},[98,11217,11218],{"class":711}," store",[98,11220,11221],{"class":711}," path",[98,11223,11224],{"class":1071},"                   # store 位置\n",[98,11226,11227,11229,11231,11234],{"class":100,"line":50},[98,11228,9218],{"class":704},[98,11230,11218],{"class":711},[98,11232,11233],{"class":711}," prune",[98,11235,11236],{"class":1071},"                  # 清缓存\n",[98,11238,11239,11241,11244],{"class":100,"line":112},[98,11240,9218],{"class":704},[98,11242,11243],{"class":711}," dedupe",[98,11245,11246],{"class":1071},"                       # 去重\n",[98,11248,11249,11251,11254,11256,11258,11260,11262],{"class":100,"line":197},[98,11250,9218],{"class":704},[98,11252,11253],{"class":711}," patch",[98,11255,1302],{"class":700},[98,11257,3946],{"class":711},[98,11259,3949],{"class":696},[98,11261,1311],{"class":700},[98,11263,11264],{"class":1071},"                  # 打补丁\n",[98,11266,11267,11269,11272,11274,11277,11279],{"class":100,"line":203},[98,11268,9218],{"class":704},[98,11270,11271],{"class":711}," patch-commit",[98,11273,1302],{"class":700},[98,11275,11276],{"class":711},"pat",[98,11278,1672],{"class":696},[98,11280,720],{"class":700},[98,11282,11283],{"class":100,"line":344},[98,11284,109],{"emptyLinePlaceholder":58},[98,11286,11287,11289,11291,11294,11296,11298,11300,11302],{"class":100,"line":350},[98,11288,9218],{"class":704},[98,11290,1299],{"class":711},[98,11292,11293],{"class":1083}," -O",[98,11295,1302],{"class":700},[98,11297,3946],{"class":711},[98,11299,3949],{"class":696},[98,11301,1311],{"class":700},[98,11303,11304],{"class":1071},"                 # optionalDependencies\n",[98,11306,11307,11309,11311,11314,11316,11318,11320,11322],{"class":100,"line":1134},[98,11308,9218],{"class":704},[98,11310,1299],{"class":711},[98,11312,11313],{"class":1083}," -P",[98,11315,1302],{"class":700},[98,11317,3946],{"class":711},[98,11319,3949],{"class":696},[98,11321,1311],{"class":700},[98,11323,11324],{"class":1071},"                 # peerDependencies\n",[1390,11326,11327],{"id":11327},"工作区",[90,11329,11333],{"className":11330,"code":11331,"language":11332,"meta":49,"style":49},"language-yaml shiki shiki-themes monokai","# pnpm-workspace.yaml\npackages:\n  - \"packages\u002F*\"\n  - \"apps\u002F*\"\n","yaml",[75,11334,11335,11340,11345,11350],{"__ignoreMap":49},[98,11336,11337],{"class":100,"line":101},[98,11338,11339],{},"# pnpm-workspace.yaml\n",[98,11341,11342],{"class":100,"line":50},[98,11343,11344],{},"packages:\n",[98,11346,11347],{"class":100,"line":112},[98,11348,11349],{},"  - \"packages\u002F*\"\n",[98,11351,11352],{"class":100,"line":197},[98,11353,11354],{},"  - \"apps\u002F*\"\n",[90,11356,11358],{"className":1062,"code":11357,"language":1064,"meta":49,"style":49},"pnpm -r build                     # 递归所有包\npnpm --filter web build           # 只跑 web\npnpm --filter \"web...\" build      # web 及其依赖\npnpm --filter \"...web\" build      # web 及其被依赖者\n",[75,11359,11360,11371,11386,11400],{"__ignoreMap":49},[98,11361,11362,11364,11366,11368],{"class":100,"line":101},[98,11363,9218],{"class":704},[98,11365,2887],{"class":1083},[98,11367,10588],{"class":711},[98,11369,11370],{"class":1071},"                     # 递归所有包\n",[98,11372,11373,11375,11378,11381,11383],{"class":100,"line":50},[98,11374,9218],{"class":704},[98,11376,11377],{"class":1083}," --filter",[98,11379,11380],{"class":711}," web",[98,11382,10588],{"class":711},[98,11384,11385],{"class":1071},"           # 只跑 web\n",[98,11387,11388,11390,11392,11395,11397],{"class":100,"line":112},[98,11389,9218],{"class":704},[98,11391,11377],{"class":1083},[98,11393,11394],{"class":711}," \"web...\"",[98,11396,10588],{"class":711},[98,11398,11399],{"class":1071},"      # web 及其依赖\n",[98,11401,11402,11404,11406,11409,11411],{"class":100,"line":197},[98,11403,9218],{"class":704},[98,11405,11377],{"class":1083},[98,11407,11408],{"class":711}," \"...web\"",[98,11410,10588],{"class":711},[98,11412,11413],{"class":1071},"      # web 及其被依赖者\n",[1390,11415,11417],{"id":11416},"npmrc-常用",".npmrc 常用",[90,11419,11421],{"className":6850,"code":11420,"language":6852,"meta":49,"style":49},"shamefully-hoist=true             # 兼容老包（临时用）\nstrict-peer-dependencies=false\nauto-install-peers=true\nnode-linker=hoisted               # 扁平常见兼容方案\n",[75,11422,11423,11428,11433,11438],{"__ignoreMap":49},[98,11424,11425],{"class":100,"line":101},[98,11426,11427],{},"shamefully-hoist=true             # 兼容老包（临时用）\n",[98,11429,11430],{"class":100,"line":50},[98,11431,11432],{},"strict-peer-dependencies=false\n",[98,11434,11435],{"class":100,"line":112},[98,11436,11437],{},"auto-install-peers=true\n",[98,11439,11440],{"class":100,"line":197},[98,11441,11442],{},"node-linker=hoisted               # 扁平常见兼容方案\n",[29,11444,11446],{"id":11445},"十一常见问题","十一、常见问题",[1390,11448,11450,11451,11454],{"id":11449},"_1-err_ossl_evp_unsupportednode-17","1. ",[75,11452,11453],{},"ERR_OSSL_EVP_UNSUPPORTED","（Node 17+）",[15,11456,11457],{},"老项目 + 新 Node，OpenSSL 3 引起。",[90,11459,11461],{"className":1062,"code":11460,"language":1064,"meta":49,"style":49},"export NODE_OPTIONS=--openssl-legacy-provider\n# 或降级 Node 16\n",[75,11462,11463,11475],{"__ignoreMap":49},[98,11464,11465,11467,11470,11472],{"class":100,"line":101},[98,11466,7848],{"class":700},[98,11468,11469],{"class":696}," NODE_OPTIONS",[98,11471,708],{"class":700},[98,11473,11474],{"class":696},"--openssl-legacy-provider\n",[98,11476,11477],{"class":100,"line":50},[98,11478,11479],{"class":1071},"# 或降级 Node 16\n",[1390,11481,11483,11484,11487],{"id":11482},"_2-eacces-权限错误","2. ",[75,11485,11486],{},"EACCES"," 权限错误",[15,11489,11490,11493],{},[19,11491,11492],{},"别用 sudo","，改 npm 全局目录：",[90,11495,11497],{"className":1062,"code":11496,"language":1064,"meta":49,"style":49},"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",[75,11498,11499,11508,11522,11534],{"__ignoreMap":49},[98,11500,11501,11503,11505],{"class":100,"line":101},[98,11502,4351],{"class":704},[98,11504,2505],{"class":1083},[98,11506,11507],{"class":711}," ~\u002F.npm-global\n",[98,11509,11510,11512,11514,11516,11519],{"class":100,"line":50},[98,11511,9016],{"class":704},[98,11513,1080],{"class":711},[98,11515,3881],{"class":711},[98,11517,11518],{"class":711}," prefix",[98,11520,11521],{"class":711}," '~\u002F.npm-global'\n",[98,11523,11524,11526,11529,11532],{"class":100,"line":112},[98,11525,7840],{"class":4320},[98,11527,11528],{"class":711}," 'export PATH=~\u002F.npm-global\u002Fbin:$PATH'",[98,11530,11531],{"class":700}," >>",[98,11533,7923],{"class":711},[98,11535,11536,11538],{"class":100,"line":197},[98,11537,7920],{"class":4320},[98,11539,7923],{"class":711},[1390,11541,11543,11544,11547],{"id":11542},"_3-peer-dep-冲突npm-7","3. ",[75,11545,11546],{},"peer dep"," 冲突（npm 7+）",[90,11549,11551],{"className":1062,"code":11550,"language":1064,"meta":49,"style":49},"npm install --legacy-peer-deps    # 按 npm 6 行为忽略 peer 冲突\nnpm install --force               # 强制（危险）\n",[75,11552,11553,11565],{"__ignoreMap":49},[98,11554,11555,11557,11559,11562],{"class":100,"line":101},[98,11556,9016],{"class":704},[98,11558,3941],{"class":711},[98,11560,11561],{"class":1083}," --legacy-peer-deps",[98,11563,11564],{"class":1071},"    # 按 npm 6 行为忽略 peer 冲突\n",[98,11566,11567,11569,11571,11573],{"class":100,"line":50},[98,11568,9016],{"class":704},[98,11570,3941],{"class":711},[98,11572,2335],{"class":1083},[98,11574,11575],{"class":1071},"               # 强制（危险）\n",[1390,11577,11579],{"id":11578},"_4-安装慢","4. 安装慢",[15,11581,11582],{},"先换源（见第一节）。如果还慢，看是不是在下载 binary：",[90,11584,11586],{"className":1062,"code":11585,"language":1064,"meta":49,"style":49},"npm install --verbose 2>&1 | grep -i \"http\"\n",[75,11587,11588],{"__ignoreMap":49},[98,11589,11590,11592,11594,11597,11599,11601,11603,11605],{"class":100,"line":101},[98,11591,9016],{"class":704},[98,11593,3941],{"class":711},[98,11595,11596],{"class":1083}," --verbose",[98,11598,8399],{"class":700},[98,11600,4122],{"class":700},[98,11602,4125],{"class":704},[98,11604,1724],{"class":1083},[98,11606,11607],{"class":711}," \"http\"\n",[15,11609,11610],{},"看到下载 electron \u002F puppeteer 之类的，就要配对应的 binary 镜像。",[1390,11612,11614],{"id":11613},"_5-幽灵依赖","5. 幽灵依赖",[15,11616,11617,11618,11620],{},"代码用了没在 ",[75,11619,10407],{}," 里声明的包（因为被提升到顶层才碰巧能用）。",[15,11622,11623,11626,11627,3439,11630,11632],{},[19,11624,11625],{},"根治","：用 pnpm。",[19,11628,11629],{},"缓解",[75,11631,10145],{}," 核对，把用到的都显式声明。",[1390,11634,11636],{"id":11635},"_6-ci-报-lock-不一致","6. CI 报 lock 不一致",[15,11638,11639,11640,424,11642,11645,11646,11648,11649,11651,11652,11655],{},"用 ",[75,11641,10400],{},[75,11643,11644],{},"pnpm install --frozen-lockfile"," 时，",[75,11647,10407],{}," 与 lock 必须同步。本地改完 ",[75,11650,10407],{}," 一定要重跑一次 ",[75,11653,11654],{},"install"," 让 lock 更新，再提交。",[1390,11657,11659],{"id":11658},"_7-强制项目使用某个包管理器","7. 强制项目使用某个包管理器",[90,11661,11663],{"className":4028,"code":11662,"language":4030,"meta":49,"style":49},"{\n  \"scripts\": {\n    \"preinstall\": \"npx only-allow pnpm\"\n  }\n}\n",[75,11664,11665,11669,11676,11686,11690],{"__ignoreMap":49},[98,11666,11667],{"class":100,"line":101},[98,11668,4037],{"class":696},[98,11670,11671,11674],{"class":100,"line":50},[98,11672,11673],{"class":4042},"  \"scripts\"",[98,11675,10677],{"class":696},[98,11677,11678,11681,11683],{"class":100,"line":112},[98,11679,11680],{"class":4042},"    \"preinstall\"",[98,11682,10685],{"class":696},[98,11684,11685],{"class":4051},"\"npx only-allow pnpm\"\n",[98,11687,11688],{"class":100,"line":197},[98,11689,10713],{"class":696},[98,11691,11692],{"class":100,"line":203},[98,11693,4084],{"class":696},[1390,11695,11697,11698,11701],{"id":11696},"_8-npm-audit-fix-force-引入-breaking-change","8. ",[75,11699,11700],{},"npm audit fix --force"," 引入 breaking change",[15,11703,11704,11707],{},[75,11705,11706],{},"--force"," 会跨越主版本升级。先看不 force 能修多少：",[90,11709,11711],{"className":1062,"code":11710,"language":1064,"meta":49,"style":49},"npm audit\nnpm audit fix\nnpm audit --production            # 只看生产依赖\n",[75,11712,11713,11720,11729],{"__ignoreMap":49},[98,11714,11715,11717],{"class":100,"line":101},[98,11716,9016],{"class":704},[98,11718,11719],{"class":711}," audit\n",[98,11721,11722,11724,11726],{"class":100,"line":50},[98,11723,9016],{"class":704},[98,11725,11158],{"class":711},[98,11727,11728],{"class":711}," fix\n",[98,11730,11731,11733,11735,11738],{"class":100,"line":112},[98,11732,9016],{"class":704},[98,11734,11158],{"class":711},[98,11736,11737],{"class":1083}," --production",[98,11739,11740],{"class":1071},"            # 只看生产依赖\n",[29,11742,11744],{"id":11743},"十二安全审计","十二、安全审计",[90,11746,11748],{"className":1062,"code":11747,"language":1064,"meta":49,"style":49},"npm audit\nyarn audit\npnpm audit\n",[75,11749,11750,11756,11762],{"__ignoreMap":49},[98,11751,11752,11754],{"class":100,"line":101},[98,11753,9016],{"class":704},[98,11755,11719],{"class":711},[98,11757,11758,11760],{"class":100,"line":50},[98,11759,9176],{"class":704},[98,11761,11719],{"class":711},[98,11763,11764,11766],{"class":100,"line":112},[98,11765,9218],{"class":704},[98,11767,11719],{"class":711},[959,11769],{},[29,11771,3285],{"id":3285},[33,11773,11774,11781,11788,11795],{},[36,11775,11776,11777],{},"npm 文档：",[972,11778,11779],{"href":11779,"rel":11780,"target":975},"https:\u002F\u002Fdocs.npmjs.com\u002F",[3295,977,3296],[36,11782,11783,11784],{},"yarn v1：",[972,11785,11786],{"href":11786,"rel":11787,"target":975},"https:\u002F\u002Fclassic.yarnpkg.com\u002F",[3295,977,3296],[36,11789,11790,11791],{},"pnpm：",[972,11792,11793],{"href":11793,"rel":11794,"target":975},"https:\u002F\u002Fpnpm.io\u002Fzh\u002F",[3295,977,3296],[36,11796,8916,11797],{},[972,11798,8919],{"href":8919,"rel":11799,"target":975},[3295,977,3296],[559,11801,11802],{},"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":49,"searchDepth":50,"depth":50,"links":11804},[11805,11815,11824,11825,11829,11830,11834,11838,11839,11843,11849,11863,11864],{"id":3364,"depth":50,"text":3365,"children":11806},[11807,11808,11809,11810,11811,11812,11813,11814],{"id":9005,"depth":112,"text":9006},{"id":9112,"depth":112,"text":9113},{"id":9239,"depth":112,"text":9240},{"id":9316,"depth":112,"text":9317},{"id":9366,"depth":112,"text":9367},{"id":9412,"depth":112,"text":9413},{"id":9457,"depth":112,"text":9458},{"id":9516,"depth":112,"text":9517},{"id":9598,"depth":50,"text":9599,"children":11816},[11817,11818,11819,11820,11821,11822,11823],{"id":9613,"depth":112,"text":9614},{"id":9679,"depth":112,"text":9680},{"id":9713,"depth":112,"text":9714},{"id":9747,"depth":112,"text":9748},{"id":9777,"depth":112,"text":9778},{"id":9820,"depth":112,"text":9821},{"id":9841,"depth":112,"text":9842},{"id":9904,"depth":50,"text":9905},{"id":10218,"depth":50,"text":10219,"children":11826},[11827,11828],{"id":10280,"depth":112,"text":10280},{"id":10362,"depth":112,"text":10363},{"id":10411,"depth":50,"text":10412},{"id":10488,"depth":50,"text":10489,"children":11831},[11832,11833],{"id":10492,"depth":112,"text":10492},{"id":10573,"depth":112,"text":10573},{"id":10650,"depth":50,"text":10651,"children":11835},[11836,11837],{"id":10654,"depth":112,"text":10655},{"id":10817,"depth":112,"text":10817},{"id":10888,"depth":50,"text":10889},{"id":11047,"depth":50,"text":11048,"children":11840},[11841,11842],{"id":11051,"depth":112,"text":11051},{"id":11134,"depth":112,"text":11134},{"id":11179,"depth":50,"text":11180,"children":11844},[11845,11846,11847,11848],{"id":11183,"depth":112,"text":11183},{"id":11206,"depth":112,"text":11134},{"id":11327,"depth":112,"text":11327},{"id":11416,"depth":112,"text":11417},{"id":11445,"depth":50,"text":11446,"children":11850},[11851,11853,11855,11857,11858,11859,11860,11861],{"id":11449,"depth":112,"text":11852},"1. ERR_OSSL_EVP_UNSUPPORTED（Node 17+）",{"id":11482,"depth":112,"text":11854},"2. EACCES 权限错误",{"id":11542,"depth":112,"text":11856},"3. peer dep 冲突（npm 7+）",{"id":11578,"depth":112,"text":11579},{"id":11613,"depth":112,"text":11614},{"id":11635,"depth":112,"text":11636},{"id":11658,"depth":112,"text":11659},{"id":11696,"depth":112,"text":11862},"8. npm audit fix --force 引入 breaking change",{"id":11743,"depth":50,"text":11744},{"id":3285,"depth":50,"text":3285},{},"\u002Fnode-package-managers-memo-2026-09-25",{"title":8995,"description":9000},"node-package-managers-memo-2026-09-25",[9016,9176,9218,11870,3352],"包管理","JkdpCYfPGT7iWzYMx8X-4vzuHBW9MP1FBF9nLBNfuew",{"id":11873,"title":11874,"author":9,"body":11875,"cover":3,"date":12393,"description":49,"extension":56,"meta":12394,"navigation":58,"path":12395,"seo":12396,"stem":12397,"tags":12398,"__hash__":12401},"content\u002Fmarkdown-vue-usage-2026-09-18.md","关于在 Markdown 中嵌入 Vue 组件的说明",{"type":12,"value":11876,"toc":12389},[11877,11882,11886,11899,11901,11907,12015,12018,12386],[43,11878,11879],{},[15,11880,11881],{},"这篇文章已经过时，此描述的内容与现有架构不相同",[11883,11884,11885],"script",{"setup":49},"\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",[15,11887,73,11888,11890,11891,11894,11895,11898],{},[75,11889,77],{}," 文件由 ",[75,11892,11893],{},"unplugin-vue-markdown"," 在构建时编译为 Vue 单文件组件。正文中的 Vue 组件标签会被当作模板的一部分解析，",[75,11896,11897],{},"\u003Cscript setup>"," 中的逻辑对正文完全可见。现将使用方法说明如下。",[29,11900,82],{"id":81},[15,11902,11903,11904,11906],{},"在 frontmatter 之后、正文之前书写 ",[75,11905,11897],{},"，导入所需组件与响应式 API 即可。",[90,11908,11910],{"className":687,"code":11909,"language":689,"meta":49,"style":49},"\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",[75,11911,11912,11923,11940,11954,11958,11978,11987,11991,11996],{"__ignoreMap":49},[98,11913,11914,11916,11918,11921],{"class":100,"line":101},[98,11915,697],{"class":696},[98,11917,11883],{"class":700},[98,11919,11920],{"class":704}," setup",[98,11922,720],{"class":696},[98,11924,11925,11928,11931,11934,11937],{"class":100,"line":50},[98,11926,11927],{"class":700},"import",[98,11929,11930],{"class":696}," { ref } ",[98,11932,11933],{"class":700},"from",[98,11935,11936],{"class":711}," \"vue\"",[98,11938,11939],{"class":696},";\n",[98,11941,11942,11944,11947,11949,11952],{"class":100,"line":112},[98,11943,11927],{"class":700},[98,11945,11946],{"class":696}," GovButton ",[98,11948,11933],{"class":700},[98,11950,11951],{"class":711}," \"@\u002Findex\u002Fcomponents\u002Fcommon\u002FGovButton.vue\"",[98,11953,11939],{"class":696},[98,11955,11956],{"class":100,"line":197},[98,11957,109],{"emptyLinePlaceholder":58},[98,11959,11960,11963,11966,11968,11971,11973,11975],{"class":100,"line":203},[98,11961,11962],{"class":4042},"const",[98,11964,11965],{"class":696}," count ",[98,11967,708],{"class":700},[98,11969,11970],{"class":704}," ref",[98,11972,8565],{"class":696},[98,11974,2129],{"class":1083},[98,11976,11977],{"class":696},");\n",[98,11979,11980,11983,11985],{"class":100,"line":344},[98,11981,11982],{"class":696},"\u003C\u002F",[98,11984,11883],{"class":700},[98,11986,720],{"class":696},[98,11988,11989],{"class":100,"line":350},[98,11990,109],{"emptyLinePlaceholder":58},[98,11992,11993],{"class":100,"line":1134},[98,11994,11995],{"class":696},"正文中可以像这样使用：\n",[98,11997,11998,12000,12002,12004,12006,12008,12011,12013],{"class":100,"line":1140},[98,11999,697],{"class":696},[98,12001,701],{"class":700},[98,12003,705],{"class":704},[98,12005,708],{"class":696},[98,12007,712],{"class":711},[98,12009,12010],{"class":696},">按钮\u003C\u002F",[98,12012,701],{"class":700},[98,12014,720],{"class":696},[15,12016,12017],{},"组件标签与 Markdown 语法可以混用。以下为实际渲染效果：",[12019,12020,968,12022,968,12029,12038,12039,12041,968,12043,12047,12058,12062,12072],"gov-panel",{"title":12021},"示例一：响应式计数器",[15,12023,12024,12025],{},"当前计数：",[12026,12027,12028],"b",{},"{{ count }}",[12030,12031,12032,12033,12037],"govbutton",{"variant":423},"\n    ",[12034,12035],"myicon",{"icon":12036},"plus"," 增加\n  "," ",[2833,12040],{},[2833,12042],{},[12030,12044,12046],{"variant":12045},"default","重置",[12048,12049,12053,12054,12057],"div",{"className":12050},[12051,12052],"md-alert","md-alert--tip","\n  文章内的 ",[75,12055,12056],{},"ref"," 是独立的响应式状态，作用域限于当前文章的组件实例，不会与其他文章或站点状态相互影响。\n",[29,12059,12061],{"id":12060},"二条件渲染与列表渲染","二、条件渲染与列表渲染",[15,12063,12064,12065,769,12068,12071],{},"Vue 的 ",[75,12066,12067],{},"v-if",[75,12069,12070],{},"v-for"," 等指令在正文中同样有效。",[12019,12073,968,12075,968,12081,968,12089,12096,12104,12111,12115,12118],{"title":12074},"示例二：条件渲染",[12030,12076,12032,12077,12080],{"variant":423},[12034,12078],{"icon":12079},"eye"," 切换显示\n  ",[15,12082,12085,12086,12088],{"v-if":12083,"style":12084},"showTip","margin-top: 12px;","\n    这段文字由 ",[75,12087,12067],{}," 控制，当前可见。\n  ",[15,12090,12085,12092,12095],{"v-else":49,"style":12091},"margin-top: 12px; color: #999;",[75,12093,12094],{},"v-else"," 控制，当前显示的是它。\n  ",[15,12097,12098,12099,12101,12102,3439],{},"下面的列表由 ",[75,12100,12070],{}," 渲染，数据来自文章内的 ",[75,12103,11897],{},[33,12105,968,12106],{},[36,12107,12110],{"v-for":12108,":key":12109},"i in 3","i","第 {{ i }} 项，共 3 项",[29,12112,12114],{"id":12113},"三嵌入组件","三、嵌入组件",[15,12116,12117],{},"本站提供的政务组件均可在正文中直接使用。",[12019,12119,968,12122,968,12131,12143],{"title":12120,"tone":12121},"示例三：组件组合","red",[15,12123,12124,12125,12127,12128,3439],{},"以下按钮均为 ",[75,12126,701],{}," 组件的不同 ",[75,12129,12130],{},"variant",[12048,12132,12032,12134,12032,12137,12032,12140,968],{"style":12133},"display: flex; gap: 12px; flex-wrap: wrap; margin-top: 12px;",[12030,12135,12136],{"variant":423},"主要操作",[12030,12138,12139],{"variant":433},"危险操作",[12030,12141,12142],{"variant":12045},"次要操作",[12019,12144,968,12146,12164,12168,12175],{"title":12145},"示例四：图标使用",[15,12147,12032,12148,12151,12152,12155,12156,12159,12160,12163],{},[12034,12149],{"icon":12150},"download"," 下载\n    ",[12034,12153],{"icon":12154},"web"," 官网\n    ",[12034,12157],{"icon":12158},"code-tags"," 源码\n    ",[12034,12161],{"icon":12162},"file-document-outline"," 文档\n  ",[29,12165,12167],{"id":12166},"四事件绑定","四、事件绑定",[15,12169,12170,12171,12174],{},"组件上的 ",[75,12172,12173],{},"@click"," 等事件可以直接绑定到文章内的函数。",[12019,12176,968,12178,12181,12184,12280,12284,12295,12320,12339,12344,12360,12372,12376,12379],{"title":12177},"示例五：事件处理",[12030,12179,12180],{"variant":423},"\n    点击弹出提示\n  ",[15,12182,12183],{},"实际写法如下：",[90,12185,12187],{"className":687,"code":12186,"language":689,"meta":49,"style":49},"\u003Cscript setup>\nfunction handleAlert() {\n  alert(\"来自文章内的事件\");\n}\n\u003C\u002Fscript>\n\n\u003CGovButton variant=\"primary\" @click=\"handleAlert\">\n  点击弹出提示\n\u003C\u002FGovButton>\n",[75,12188,12189,12199,12210,12222,12226,12234,12238,12267,12272],{"__ignoreMap":49},[98,12190,12191,12193,12195,12197],{"class":100,"line":101},[98,12192,697],{"class":696},[98,12194,11883],{"class":700},[98,12196,11920],{"class":704},[98,12198,720],{"class":696},[98,12200,12201,12204,12207],{"class":100,"line":50},[98,12202,12203],{"class":4042},"function",[98,12205,12206],{"class":704}," handleAlert",[98,12208,12209],{"class":696},"() {\n",[98,12211,12212,12215,12217,12220],{"class":100,"line":112},[98,12213,12214],{"class":704},"  alert",[98,12216,8565],{"class":696},[98,12218,12219],{"class":711},"\"来自文章内的事件\"",[98,12221,11977],{"class":696},[98,12223,12224],{"class":100,"line":197},[98,12225,4084],{"class":696},[98,12227,12228,12230,12232],{"class":100,"line":203},[98,12229,11982],{"class":696},[98,12231,11883],{"class":700},[98,12233,720],{"class":696},[98,12235,12236],{"class":100,"line":344},[98,12237,109],{"emptyLinePlaceholder":58},[98,12239,12240,12242,12244,12246,12248,12250,12253,12256,12258,12260,12263,12265],{"class":100,"line":350},[98,12241,697],{"class":696},[98,12243,701],{"class":700},[98,12245,705],{"class":704},[98,12247,708],{"class":696},[98,12249,712],{"class":711},[98,12251,12252],{"class":696}," @",[98,12254,12255],{"class":704},"click",[98,12257,708],{"class":696},[98,12259,7939],{"class":696},[98,12261,12262],{"class":696},"handleAlert",[98,12264,7939],{"class":696},[98,12266,720],{"class":696},[98,12268,12269],{"class":100,"line":1134},[98,12270,12271],{"class":696},"  点击弹出提示\n",[98,12273,12274,12276,12278],{"class":100,"line":1140},[98,12275,11982],{"class":696},[98,12277,701],{"class":700},[98,12279,720],{"class":696},[29,12281,12283],{"id":12282},"五注意事项","五、注意事项",[15,12285,484,12286,12288,12289,12291,12292,12294],{},[19,12287,487],{},"。方案 B 下文章是独立的 Vue 组件，组件不会自动注册。必须在 ",[75,12290,11897],{}," 中 ",[75,12293,11927],{},"，不能依赖全局注册。",[15,12296,495,12297,12300,12301,12304,12305,12308,12309,12312,12313,769,12316,12319],{},[19,12298,12299],{},"自定义组件请显式闭合","。markdown-it 在处理块级 HTML 时，自闭合的自定义组件标签（",[75,12302,12303],{},"\u003CMyIcon ... \u002F>","）容易丢失自闭合标志，导致 Vue 编译器报 ",[75,12306,12307],{},"Element is missing end tag","。建议所有自定义组件都写成 ",[75,12310,12311],{},"\u003CMyIcon ...>\u003C\u002FMyIcon>","，HTML void 元素（",[75,12314,12315],{},"\u003Cbr>",[75,12317,12318],{},"\u003Cimg>","）不受影响。",[15,12321,521,12322,12325,12326,424,12329,424,12332,12335,12336,22],{},[19,12323,12324],{},"旧版容器语法不再生效","。本站早期的 ",[75,12327,12328],{},"::: tip",[75,12330,12331],{},"::: warning",[75,12333,12334],{},"::: tabs"," 等自定义容器已在迁移中移除，改用原生 HTML 类表达，例如 ",[75,12337,12338],{},"\u003Cdiv class=\"md-alert md-alert--tip\">…\u003C\u002Fdiv>",[15,12340,538,12341,12343],{},[19,12342,541],{},"。正文中的组件在构建阶段编译为 render function，而非运行时解析。若组件名拼写错误，会在构建时或开发时控制台提示，而不会静默忽略。",[15,12345,545,12346,12349,12350,12352,12353,12356,12357,12359],{},[19,12347,12348],{},"样式作用域","。文章内联写的 ",[75,12351,559],{}," 属性作用于当前元素，Markdown 渲染出的标签样式由 ",[75,12354,12355],{},"markdown.css"," 统一控制。若需要局部样式，建议在文章内使用内联 ",[75,12358,559],{},"，或封装为独立组件。",[15,12361,552,12362,12368,12369,12371],{},[19,12363,12364,12365,12367],{},"不要写 ",[75,12366,563],{}," 块","。本站暂不支持在 Markdown 中书写 ",[75,12370,563],{},"，会与 SFC 编译流程冲突。需要样式时优先使用已有 CSS 变量或内联样式。",[29,12373,12375],{"id":12374},"六小结","六、小结",[15,12377,12378],{},"Markdown 与 Vue 的融合让静态内容具备了组件化的能力。文章不再只是纯文本，而是可以拥有响应式状态、可复用组件与事件交互的完整页面单元。这使得一些原本需要额外页面承载的功能，可以直接在文章内表达。",[15,12380,12381,12382,22],{},"如需查看本站组件清单，可参阅",[972,12383,12385],{"href":12384},"\u002Fsite-design-compliance-2026-09-16","《关于本站对照国办发〔2017〕47号文开展设计规范调整的说明》",[559,12387,12388],{},"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":49,"searchDepth":50,"depth":50,"links":12390},[12391,12392],{"id":81,"depth":50,"text":82},{"id":12060,"depth":50,"text":12061},"2026-09-18",{},"\u002Fmarkdown-vue-usage-2026-09-18",{"title":11874,"description":49},"markdown-vue-usage-2026-09-18",[12399,591,12400],"Vue","内容层","pLUYvePhQ2UO_ExUlCY-OCrjlRk013xQpue_6Xm0wzs",{"id":12403,"title":12404,"author":9,"body":12405,"cover":3,"date":12623,"description":12409,"extension":56,"meta":12624,"navigation":58,"path":12384,"seo":12626,"stem":12627,"tags":12628,"__hash__":12631},"content\u002Fsite-design-compliance-2026-09-16.md","关于本站对照国办发〔2017〕47号文开展设计规范调整的说明",{"type":12,"value":12406,"toc":12616},[12407,12410,12414,12417,12420,12423,12426,12430,12436,12467,12473,12482,12488,12498,12502,12508,12514,12520,12526,12532,12534,12537,12540,12543,12545,12548,12550,12552,12556,12586,12590],[15,12408,12409],{},"为进一步规范本站页面展现形式，提升信息服务质量，根据《政府网站发展指引》（国办发〔2017〕47号）及其附件《网页设计规范》有关要求，结合《政府网站与政务新媒体检查指标》（国办秘函〔2019〕19号）有关考核标准，本站于2026年9月对整体设计进行系统性调整。现将调整依据及主要内容说明如下。",[29,12411,12413],{"id":12412},"一调整依据","一、调整依据",[15,12415,12416],{},"（一）《政府网站发展指引》（国办发〔2017〕47号）。该文件由国务院办公厅印发，是全国政府网站建设的基本规范，其中附件《网页设计规范》对网站的展现布局、地址链接、网页标签等提出了明确要求。",[15,12418,12419],{},"（二）《政府网站与政务新媒体检查指标》（国办秘函〔2019〕19号）。该文件明确了政府网站考核的单项否决指标和扣分指标，其中涉及页面加载时长、栏目更新情况、内容发布规范等具体要求。",[15,12421,12422],{},"（三）《政府网站集约化试点工作方案》（国办函〔2018〕71号）。该方案要求实现\"统一标准体系、统一技术平台、统一安全防护、统一运维监管\"，对站点技术架构和设计模式具有指导意义。",[15,12424,12425],{},"（四）山西省地方标准《政府网站集约化平台 网页设计规范》（DB14\u002FT 2544—2022）等行业性、地方性标准，作为本站在具体设计实施中的参考依据。",[29,12427,12429],{"id":12428},"二调整主要内容","二、调整主要内容",[15,12431,484,12432,12435],{},[19,12433,12434],{},"规范色调使用","。规范要求\"确定1种主色调，总色调不宜超过3种\"。本站原设计围绕蓝色系展开了多个派生色，色值数量偏多。经调整，确立以深蓝（#015293）为主色调、白色为辅助色、红色（#e4393c）为强调色的三色体系，其余派生色统一收归为主色调的透明度变体，不再作为独立色值维护。",[15,12437,495,12438,12441,12442,12445,12446,12448,12449,769,12451,12448,12454,12456,12457,12460,12461,769,12464,12466],{},[19,12439,12440],{},"统一字体字号","。规范要求\"同一类别的栏目和信息使用同一模板，统一字体、字号、行间距和布局\"。经排查，原设计在 ",[75,12443,12444],{},"GovPanel"," 标题、",[75,12447,12355],{}," 的 ",[75,12450,29],{},[75,12452,12453],{},"DocLayout",[75,12455,29],{}," 等位置存在字号不一致问题。本次调整将上述位置的字号统一为 ",[75,12458,12459],{},"--gov-fs-lg","，并清理了 ",[75,12462,12463],{},"SiteFooter",[75,12465,12453],{}," 中重复定义的样式规则。",[15,12468,521,12469,12472],{},[19,12470,12471],{},"优化加载性能","。规范要求\"页面加载时长不宜超过3秒\"，检查指标将\"网站打不开次数累计占比超过5%\"列为单项否决。本站原内容层采用构建时全量内联方式，随内容数量增长将影响首屏体积。本次调整改为按需异步加载，配合空闲时预加载后续路由组件的方式，兼顾首屏速度与导航体验。",[15,12474,538,12475,12478,12479,12481],{},[19,12476,12477],{},"完善内容展示","。规范要求\"网站内容要清晰显示发布时间，时间格式为YYYY—MM—DD HH:MM\"。本站原列表项仅显示日期，本次调整在内容层增加 ",[75,12480,8477],{}," 字段，列表与详情页均按规范格式显示完整时间。",[15,12483,545,12484,12487],{},[19,12485,12486],{},"健全栏目管理","。规范要求\"栏目设置应科学合理，避免出现空白栏目\"。本次调整新增\"资源\"栏目，统一收录开发工具、组件库等资源信息，并对文章列表、资源列表、搜索页的展示规则进行一致性梳理，明确各栏目数据来源，避免出现重复或空白栏目。",[15,12489,552,12490,12493,12494,12497],{},[19,12491,12492],{},"扩展检索范围","。在原站内搜索仅覆盖文章的基础上，新增资源检索，统一为 ",[75,12495,12496],{},"\u002Fsearch"," 页面，支持全部、文章、资源三类筛选，并可分享、可回退、可刷新，符合规范中\"提供信息检索功能\"的相关要求。",[29,12499,12501],{"id":12500},"三调整后效果","三、调整后效果",[15,12503,484,12504,12507],{},[19,12505,12506],{},"色调统一","。全站主色调、辅助色、强调色使用规范，页面整体观感协调一致。",[15,12509,495,12510,12513],{},[19,12511,12512],{},"字号规范","。同级标题字号一致，正文、辅助信息、数字等各级字号层级分明，符合用户阅读习惯。",[15,12515,521,12516,12519],{},[19,12517,12518],{},"加载优化","。首屏体积得到控制，配合路由预加载，主流网络环境下页面加载时长稳定控制在规范要求以内。",[15,12521,538,12522,12525],{},[19,12523,12524],{},"内容完整","。发布时间、信息来源、分类标签等要素展示完整，符合规范对内容展示的要求。",[15,12527,545,12528,12531],{},[19,12529,12530],{},"结构清晰","。头部标识区、中部内容区、底部功能区划分明确，底部功能区列明网站名称、备案编号、联系方式等信息。",[29,12533,932],{"id":931},[15,12535,12536],{},"（一）持续跟踪国家关于政府网站建设的相关文件更新情况，及时对照调整本站设计。",[15,12538,12539],{},"（二）定期对站点进行自查，重点检查栏目更新、内容发布、页面性能等考核指标涉及的内容。",[15,12541,12542],{},"（三）结合用户反馈，进一步优化站内检索、无障碍访问、移动端适配等体验。",[29,12544,951],{"id":950},[15,12546,12547],{},"本站为个人技术项目，非政府网站，本站视觉设计参照政府网站规范进行，旨在为用户提供规范、清晰、易读的信息服务。所有内容仅代表个人观点，与任何机构无关。",[15,12549,957],{},[959,12551],{},[15,12553,12554],{},[19,12555,965],{},[33,12557,968,12558,968,12565,968,12572,968,12579],{},[36,12559,12560],{},[972,12561,12564],{"href":12562,"target":975,"rel":12563},"https:\u002F\u002Fwww.gov.cn\u002Fzhengce\u002Fcontent\u002F2017-06\u002F08\u002Fcontent_5200760.htm",[977],"国务院办公厅关于印发政府网站发展指引的通知（国办发〔2017〕47号）",[36,12566,12567],{},[972,12568,12571],{"href":12569,"target":975,"rel":12570},"https:\u002F\u002Fwww.gov.cn\u002Fzhengce\u002Fcontent\u002F2019-04\u002F18\u002Fcontent_5384134.htm",[977],"国务院办公厅秘书局关于印发政府网站与政务新媒体检查指标、监管工作年度考核指标的通知（国办秘函〔2019〕19号）",[36,12573,12574],{},[972,12575,12578],{"href":12576,"target":975,"rel":12577},"https:\u002F\u002Fwww.gov.cn\u002Fgongbao\u002Fcontent\u002F2018\u002Fcontent_5343741.htm",[977],"国务院办公厅关于印发《政府网站集约化试点工作方案》的通知（国办函〔2018〕71号）",[36,12580,12581],{},[972,12582,12585],{"href":12583,"target":975,"rel":12584},"https:\u002F\u002Fba.sacinfo.org.cn\u002FstdDetail\u002Ff0d57c3b3c953827ce262a46b434d20685261c7714f6a0060ce1c7467868eae2",[977],"《政府网站集约化平台 网页设计规范》（DB14\u002FT 2544—2022）",[15,12587,12588],{},[19,12589,1004],{},[33,12591,12592,12598,12604,12610],{},[36,12593,12594,12597],{},[19,12595,12596],{},"国办发〔2017〕47号","：国务院办公厅2017年5月15日成文，6月8日发布，附件含《网页设计规范》。",[36,12599,12600,12603],{},[19,12601,12602],{},"国办秘函〔2019〕19号","：国务院办公厅秘书局2019年4月1日成文，4月18日发布，含单项否决指标和扣分、加分指标。",[36,12605,12606,12609],{},[19,12607,12608],{},"国办函〔2018〕71号","：国务院办公厅2018年10月27日成文，11月9日发布，要求“统一标准体系、统一技术平台”等。",[36,12611,12612,12615],{},[19,12613,12614],{},"DB14\u002FT 2544—2022","：山西省地方标准，2022年9月30日发布，12月30日实施，技术归口为山西省电子政务信息标准化技术委员会。",{"title":49,"searchDepth":50,"depth":50,"links":12617},[12618,12619,12620,12621,12622],{"id":12412,"depth":50,"text":12413},{"id":12428,"depth":50,"text":12429},{"id":12500,"depth":50,"text":12501},{"id":931,"depth":50,"text":932},{"id":950,"depth":50,"text":951},"2026-09-16",{"summary":12625},"依据《政府网站发展指引》（国办发〔2017〕47号）及其附件《网页设计规范》，本站于2026年9月对站点色调、字体、内容加载、栏目结构等进行系统性调整，现将有关情况说明如下。",{"title":12404,"description":12409},"site-design-compliance-2026-09-16",[12629,12630,1046],"政务规范","设计规范","I50wAQqluw6aWoAAxOoH_vbyt8zi5pxzlknAQfy5hiQ",{"id":12633,"title":12634,"author":9,"body":12635,"cover":3,"date":12886,"description":12887,"extension":56,"meta":12888,"navigation":58,"path":12889,"seo":12890,"stem":12891,"tags":12892,"__hash__":12893},"content\u002Fabout.md","关于本站",{"type":12,"value":12636,"toc":12875},[12637,12641,12688,12692,12703,12707,12777,12781,12791,12795,12803,12807,12810,12813,12816,12825,12836,12845,12849,12863,12867],[29,12638,12640],{"id":12639},"一网站简介","一、网站简介",[357,12642,12643,12654],{},[360,12644,12645],{},[363,12646,12647,12651],{},[366,12648,12650],{"align":12649},"left","项",[366,12652,12653],{"align":12649},"内容",[376,12655,12656,12666,12676],{},[363,12657,12658,12663],{},[381,12659,12660],{"align":12649},[19,12661,12662],{},"站名",[381,12664,12665],{"align":12649},"韵典综合平台（undz）",[363,12667,12668,12673],{},[381,12669,12670],{"align":12649},[19,12671,12672],{},"建站时间",[381,12674,12675],{"align":12649},"2025-02-22",[363,12677,12678,12683],{},[381,12679,12680],{"align":12649},[19,12681,12682],{},"域名",[381,12684,12685],{"align":12649},[75,12686,12687],{},"undz.cn",[29,12689,12691],{"id":12690},"二内容范围","二、内容范围",[33,12693,12694,12697,12700],{},[36,12695,12696],{},"前端工程实践（Vue \u002F CSS \u002F 构建工具）",[36,12698,12699],{},"设计系统与视觉规范",[36,12701,12702],{},"开发随笔与读书笔记",[29,12704,12706],{"id":12705},"三技术实现","三、技术实现",[357,12708,12709,12719],{},[360,12710,12711],{},[363,12712,12713,12716],{},[366,12714,12715],{"align":12649},"层级",[366,12717,12718],{"align":12649},"选型",[376,12720,12721,12731,12740,12751,12761],{},[363,12722,12723,12728],{},[381,12724,12725],{"align":12649},[19,12726,12727],{},"框架",[381,12729,12730],{"align":12649},"Nuxt 4 (Vue 3) + Nuxt Content",[363,12732,12733,12737],{},[381,12734,12735],{"align":12649},[19,12736,12653],{},[381,12738,12739],{"align":12649},"Markdown (MDC)",[363,12741,12742,12746],{},[381,12743,12744],{"align":12649},[19,12745,12682],{},[381,12747,12748,12750],{"align":12649},[75,12749,12687],{}," 由阿里云智能科技（杭州）有限公司注册，Cloudflare 提供 DNS 解析与 SSL 证书",[363,12752,12753,12758],{},[381,12754,12755],{"align":12649},[19,12756,12757],{},"证书",[381,12759,12760],{"align":12649},"两个域名均持有中国互联网络信息中心（CNNIC）颁发的合法域名证书，注册人信息已通过实名认证",[363,12762,12763,12768],{},[381,12764,12765],{"align":12649},[19,12766,12767],{},"安全加密",[381,12769,12770,12771,12776],{"align":12649},"全站 HTTPS 加密访问，SSL 证书由 ",[972,12772,12775],{"href":12773,"rel":12774,"target":975},"https:\u002F\u002Fwww.cloudflare.com\u002F",[3295,977,3296],"Cloudflare"," 提供",[29,12778,12780],{"id":12779},"四关于-ai-学习","四、关于 AI 学习",[15,12782,12783,12784],{},"本站不反对机器人从网站爬取数据进行学习，甚至支持，",[19,12785,12786,12787,22],{},"但您必须遵守",[972,12788,12790],{"href":12789},"#%E7%89%88%E6%9D%83%E5%A3%B0%E6%98%8E","版权声明",[29,12792,12794],{"id":12793},"五我的理念","五、我的理念",[43,12796,12797,12800],{},[15,12798,12799],{},"代码改变世界",[15,12801,12802],{},"Code changes the world",[29,12804,12806],{"id":12805},"六免责声明","六、免责声明",[15,12808,12809],{},"本站所载文章、数据仅供参考，使用前请自行核实。因使用本站内容造成的任何损失，本站不承担责任。",[29,12811,12812],{"id":12790},"七、版权声明",[15,12814,12815],{},"© 2025-2026 韵典（AeYunDian）。",[15,12817,12818,12819,12824],{},"本站所有原创文章（除特别说明外）均采用 ",[972,12820,12823],{"href":12821,"rel":12822,"target":975},"https:\u002F\u002Fcreativecommons.org\u002Flicenses\u002Fby-sa\u002F4.0\u002Fdeed.zh",[3295,977,3296],"知识共享署名-相同方式共享 4.0 国际许可协议（CC BY-SA 4.0）"," 进行许可。您可以自由分享并演绎本站作品，但必须：",[33,12826,12827,12830,12833],{},[36,12828,12829],{},"在适当位置给予署名（如在文章开头显著位置注明作者 AeYunDian 并附上原文链接）；",[36,12831,12832],{},"可以用于商业目的；",[36,12834,12835],{},"演绎作品也必须采用相同的许可协议。",[15,12837,12838,12839,12844],{},"本站展示的示例代码（除特别说明外）均采用 ",[972,12840,12843],{"href":12841,"rel":12842,"target":975},"https:\u002F\u002Fopensource.org\u002Flicenses\u002FMIT",[3295,977,3296],"MIT 许可证"," 开源，您可以自由使用，但必须给予适当位置的署名。如果您在文章或项目中使用这些代码，希望您能在合适的位置注明作者 AeYunDian 并附上原文链接，可以用于商业目的。",[29,12846,12848],{"id":12847},"八特此声明","八、特此声明",[15,12850,12851,12854,12855,12858,12859,12862],{},[19,12852,12853],{},"UNDZ"," 是本站的技术项目名称，与加拿大内衣品牌 UNDZ（",[75,12856,12857],{},"undz.ca","）",[19,12860,12861],{},"无任何关联","。本站及关联社交媒体绝不出现任何与内衣、时尚相关的内容，也不会链接到该品牌。请勿混淆。",[29,12864,12866],{"id":12865},"九联系方式","九、联系方式",[15,12868,12869,12870,12874],{},"如需联系，请前往 ",[972,12871,12873],{"href":12872},"\u002Fcontact","联系我"," 页面。",{"title":49,"searchDepth":50,"depth":50,"links":12876},[12877,12878,12879,12880,12881,12882,12883,12884,12885],{"id":12639,"depth":50,"text":12640},{"id":12690,"depth":50,"text":12691},{"id":12705,"depth":50,"text":12706},{"id":12779,"depth":50,"text":12780},{"id":12793,"depth":50,"text":12794},{"id":12805,"depth":50,"text":12806},{"id":12790,"depth":50,"text":12812},{"id":12847,"depth":50,"text":12848},{"id":12865,"depth":50,"text":12866},"2026-09-13","关于韵典综合平台的信息、定位、技术实现与版权声明。",{},"\u002Fabout",{"title":12634,"description":12887},"about",[],"ps6kgQJLqF-0Kskn6eHMrc_Rt7hFvVkMaunCIZXfpJA",{"id":12895,"title":12873,"author":9,"body":12896,"cover":3,"date":12886,"description":13076,"extension":56,"meta":13077,"navigation":58,"path":12872,"seo":13078,"stem":13079,"tags":13080,"__hash__":13081},"content\u002Fcontact.md",{"type":12,"value":12897,"toc":13069},[12898,12902,12940,12944,12972,12976,13029,13033,13040,13048,13054,13058],[29,12899,12901],{"id":12900},"一电子邮箱","一、电子邮箱",[33,12903,12904,12910,12916,12922,12928,12934],{},[36,12905,12906],{},[972,12907,12909],{"href":12908},"mailto:aeyundian@gmail.com","aeyundian@gmail.com",[36,12911,12912],{},[972,12913,12915],{"href":12914},"mailto:aeyundian@qq.com","aeyundian@qq.com",[36,12917,12918],{},[972,12919,12921],{"href":12920},"mailto:aeyundian@outlook.com","aeyundian@outlook.com",[36,12923,12924],{},[972,12925,12927],{"href":12926},"mailto:aeyundian@sina.com","aeyundian@sina.com",[36,12929,12930],{},[972,12931,12933],{"href":12932},"mailto:aeyundian@sina.cn","aeyundian@sina.cn",[36,12935,12936],{},[972,12937,12939],{"href":12938},"mailto:aeyundian@foxmail.com","aeyundian@foxmail.com",[29,12941,12943],{"id":12942},"二即时通讯","二、即时通讯",[357,12945,12946,12956],{},[360,12947,12948],{},[363,12949,12950,12953],{},[366,12951,12952],{"align":12649},"平台",[366,12954,12955],{"align":12649},"账号",[376,12957,12958],{},[363,12959,12960,12965],{},[381,12961,12962],{"align":12649},[19,12963,12964],{},"QQ",[381,12966,12967],{"align":12649},[972,12968,12971],{"href":12969,"rel":12970,"target":975},"https:\u002F\u002Fapi.undz.cn\u002Faddqq?uid=2768223712",[3295,977,3296],"2768223712",[29,12973,12975],{"id":12974},"三其他平台","三、其他平台",[357,12977,12978,12986],{},[360,12979,12980],{},[363,12981,12982,12984],{},[366,12983,12952],{"align":12649},[366,12985,12955],{"align":12649},[376,12987,12988,13001,13015],{},[363,12989,12990,12995],{},[381,12991,12992],{"align":12649},[19,12993,12994],{},"GitHub",[381,12996,12997],{"align":12649},[972,12998,9],{"href":12999,"rel":13000,"target":975},"https:\u002F\u002Fgithub.com\u002FAeYunDian\u002F",[3295,977,3296],[363,13002,13003,13008],{},[381,13004,13005],{"align":12649},[19,13006,13007],{},"哔哩哔哩",[381,13009,13010],{"align":12649},[972,13011,13014],{"href":13012,"rel":13013,"target":975},"https:\u002F\u002Fspace.bilibili.com\u002F3494370328185235",[3295,977,3296],"3494370328185235",[363,13016,13017,13022],{},[381,13018,13019],{"align":12649},[19,13020,13021],{},"YouTube",[381,13023,13024],{"align":12649},[972,13025,13028],{"href":13026,"rel":13027,"target":975},"https:\u002F\u002Fwww.youtube.com\u002F@aeydundz",[3295,977,3296],"@aeydundz",[29,13030,13032],{"id":13031},"四在线留言","四、在线留言",[15,13034,13035,13036,13039],{},"留言反馈已统一迁移至 ",[19,13037,13038],{},"反馈中心","。为便于跟踪处理进度、留存沟通记录，请前往反馈中心提交您的问题或建议。",[13041,13042,13045],"app-button",{"href":13043,"rel":13044,"target":975},"https:\u002F\u002Fconsole.undz.cn\u002Fconsole-panel\u002Ffeedback-center",[977],[15,13046,13047],{},"前往反馈中心留言",[15,13049,13051,13052],{"style":13050},"font-size: 0.85em; color: #888; margin-top: 1em;","\n  反馈中心地址：",[75,13053,13043],{},[29,13055,13057],{"id":13056},"五友情提示","五、友情提示",[33,13059,13060,13063,13066],{},[36,13061,13062],{},"请勿在留言中提交身份证号、银行卡等敏感信息。",[36,13064,13065],{},"广告、推广类留言将被直接忽略。",[36,13067,13068],{},"技术问题建议优先通过 GitHub Issue 反馈，便于追溯。",{"title":49,"searchDepth":50,"depth":50,"links":13070},[13071,13072,13073,13074,13075],{"id":12900,"depth":50,"text":12901},{"id":12942,"depth":50,"text":12943},{"id":12974,"depth":50,"text":12975},{"id":13031,"depth":50,"text":13032},{"id":13056,"depth":50,"text":13057},"联系韵典（AeYunDian）的方式、反馈渠道与办公信息。",{},{"title":12873,"description":13076},"contact",[],"dD1y8Tz7ngiw_-NdOudmTA-1x8PZUESfWxY26pUpejE",{"id":13083,"title":13084,"author":9,"body":13085,"cover":3,"date":12886,"description":13364,"extension":56,"meta":13365,"navigation":58,"path":13366,"seo":13367,"stem":13368,"tags":13369,"__hash__":13370},"content\u002Fcookies.md","Cookie 政策",{"type":12,"value":13086,"toc":13338},[13087,13090,13094,13097,13100,13103,13106,13110,13112,13120,13123,13127,13135,13139,13142,13145,13149,13152,13168,13172,13175,13178,13182,13185,13189,13192,13196,13199,13210,13213,13264,13267,13270,13273,13277,13281,13284,13287,13290,13293,13296,13299,13302,13305,13308,13311,13314,13318,13321,13325,13328,13332,13335],[15,13088,13089],{},"欢迎阅读 undz.cn 的 Cookie 政策。本政策将帮助您了解我们使用哪些 Cookie 和追踪技术、我们如何使用它们以及您享有的相关权利。",[29,13091,13093],{"id":13092},"一介绍","一、介绍",[15,13095,13096],{},"本文档旨在告知用户本网站所使用的技术，这些技术有助于实现下述目的。这些技术允许所有者在用户与本网站互动时，存取和存储用户设备上的信息（例如，通过使用 Cookie）或使用用户设备上的资源（例如，通过执行脚本）。",[15,13098,13099],{},"为简便起见，除非另有说明，本文档中所有此类技术均统称为「追踪器」。例如，虽然 Cookie 可用于网页浏览器和移动浏览器，但在移动网站的语境下讨论 Cookie 并不准确，因为移动网站本身就是一种基于浏览器的追踪器。因此，本文档中仅在特指此类追踪器时才使用「Cookie」一词。",[15,13101,13102],{},"追踪器的某些用途可能需要用户同意。用户一旦同意，即可随时按照本文档中的说明自由撤回同意。",[15,13104,13105],{},"本网站使用第一方追踪器，同时也使用第三方广告和分析服务（如 Google AdSense、百度统计）。第一方 Cookie 和其他类似追踪器的有效期和过期时间可能因所有者设置的生命周期而异。其中一些追踪器会在用户浏览会话结束时过期。",[29,13107,13109],{"id":13108},"二所有者和数据控制者","二、所有者和数据控制者",[15,13111,9],{},[15,13113,13114,13115,13117,13118,12874],{},"联系邮箱：",[972,13116,12915],{"href":12914},"，更多联系方式请前往 ",[972,13119,12873],{"href":12872},[15,13121,13122],{},"在本政策中，「AeYunDian」即网站所有者和数据控制者，以下简称「所有者」。",[29,13124,13126],{"id":13125},"三google-doubleclick-dart-cookie","三、Google DoubleClick DART Cookie",[15,13128,13129,13130,13134],{},"Google 是我们网站上的第三方供应商之一。它还使用名为 DART Cookie 的技术，根据访问者对我们网站及互联网上其他网站的访问情况向他们投放广告。访问者可以通过访问 Google 广告和内容网络隐私政策（网址：",[972,13131,13132],{"href":13132,"rel":13133,"target":975},"https:\u002F\u002Fpolicies.google.com",[3295,977,3296],"）来选择拒绝使用 DART Cookie。",[29,13136,13138],{"id":13137},"四我们的广告合作伙伴","四、我们的广告合作伙伴",[15,13140,13141],{},"我们网站上的一些广告商可能会使用 Cookie 和网络信标。我们的广告合作伙伴包括：Google AdSense。",[15,13143,13144],{},"我们的每个广告合作伙伴都有其各自关于用户数据的隐私政策。",[29,13146,13148],{"id":13147},"五第三方隐私政策","五、第三方隐私政策",[15,13150,13151],{},"本博客的隐私政策不适用于其他广告商或网站。因此，我们建议您咨询这些第三方广告服务器各自的隐私政策，以获取更详细的信息。",[33,13153,13154,13161],{},[36,13155,13156],{},[972,13157,13160],{"href":13158,"rel":13159,"target":975},"https:\u002F\u002Fadsense.google.com\u002Fadsense\u002Fterms?rc=CN&ce=1&hl=zh-CN",[3295,977,3296],"Google AdSense 隐私政策",[36,13162,13163],{},[972,13164,13167],{"href":13165,"rel":13166,"target":975},"https:\u002F\u002Ftongji.baidu.com\u002Fweb\u002Fhelp\u002Farticle?id=330&castk=LTE%3D",[3295,977,3296],"百度统计隐私政策",[29,13169,13171],{"id":13170},"六本网站如何使用追踪器","六、本网站如何使用追踪器",[1390,13173,13174],{"id":13174},"必要的追踪器",[15,13176,13177],{},"本网站使用所谓的「技术性」Cookie 和其他类似追踪器来执行对服务运行或交付绝对必要的活动，例如：维持您的登录会话状态（包括通过第三方 OAuth 登录后的状态保持）、保障网站安全（如 CSRF 防护）以及记住您的语言偏好等。",[1390,13179,13181],{"id":13180},"本地存储localstorage","本地存储（localStorage）",[15,13183,13184],{},"本站使用浏览器 localStorage 保存主题偏好、大字无障碍模式开关、访问计数等 UI 状态，这类数据不上传服务器，仅在本地浏览器中保留。",[29,13186,13188],{"id":13187},"七如何管理偏好设置并提供或撤回同意","七、如何管理偏好设置并提供或撤回同意",[15,13190,13191],{},"当使用追踪器需要用户同意时，用户可以通过本网站上提供的相关隐私选择面板设置或更新其偏好来提供或撤回此类同意。",[1390,13193,13195],{"id":13194},"通过设备设置控制或删除-cookie-及类似技术","通过设备设置控制或删除 Cookie 及类似技术",[15,13197,13198],{},"用户可以使用自己的浏览器设置来：",[33,13200,13201,13204,13207],{},[36,13202,13203],{},"查看设备上已设置哪些 Cookie 或其他类似技术；",[36,13205,13206],{},"阻止 Cookie 或类似技术；",[36,13208,13209],{},"清除浏览器中的 Cookie 或类似技术。",[15,13211,13212],{},"但是，浏览器设置不允许按类别对同意进行精细控制。例如，用户可以在以下地址找到有关如何在最常用的浏览器中管理 Cookie 的信息：",[33,13214,13215,13222,13229,13236,13243,13250,13257],{},[36,13216,13217],{},[972,13218,13221],{"href":13219,"rel":13220,"target":975},"https:\u002F\u002Fsupport.google.com\u002Fchrome\u002Fanswer\u002F95647?hl=zh-CN&p=cpn_cookies",[3295,977,3296],"Google Chrome",[36,13223,13224],{},[972,13225,13228],{"href":13226,"rel":13227,"target":975},"https:\u002F\u002Fsupport.mozilla.org\u002Fzh-CN\u002Fkb\u002Fenable-and-disable-cookies-website-preferences",[3295,977,3296],"Mozilla Firefox",[36,13230,13231],{},[972,13232,13235],{"href":13233,"rel":13234,"target":975},"https:\u002F\u002Fsupport.apple.com\u002Fguide\u002Fsafari\u002Fmanage-cookies-and-website-data-sfri11471\u002F",[3295,977,3296],"Apple Safari",[36,13237,13238],{},[972,13239,13242],{"href":13240,"rel":13241,"target":975},"https:\u002F\u002Fwindows.microsoft.com\u002Fzh-cn\u002Fwindows-vista\u002Fblock-or-allow-cookies",[3295,977,3296],"Microsoft Internet Explorer",[36,13244,13245],{},[972,13246,13249],{"href":13247,"rel":13248,"target":975},"https:\u002F\u002Fsupport.microsoft.com\u002Fzh-cn\u002Fhelp\u002F4027947",[3295,977,3296],"Microsoft Edge",[36,13251,13252],{},[972,13253,13256],{"href":13254,"rel":13255,"target":975},"https:\u002F\u002Fsupport.brave.com\u002Fhc\u002Fzh-cn\u002Farticles\u002F360022806212-How-do-I-use-Shields-while-browsing",[3295,977,3296],"Brave",[36,13258,13259],{},[972,13260,13263],{"href":13261,"rel":13262,"target":975},"https:\u002F\u002Fhelp.opera.com\u002Fen\u002Flatest\u002Fweb-preferences\u002F#cookies",[3295,977,3296],"Opera",[15,13265,13266],{},"用户还可以通过相关设备设置（例如移动设备的广告设置或一般追踪设置）选择退出，从而管理移动网站上使用的某些类别的追踪器。",[1390,13268,13269],{"id":13269},"禁止使用追踪器的后果",[15,13271,13272],{},"用户可自行决定是否允许使用追踪器。但请注意，追踪器有助于本网站为用户提供更佳体验和高级功能（符合本文档所述用途）。因此，如果用户选择阻止使用追踪器，则所有者可能无法提供相关功能。",[29,13274,13276],{"id":13275},"八定义和法律参考","八、定义和法律参考",[1390,13278,13280],{"id":13279},"个人数据或数据","个人数据（或数据）",[15,13282,13283],{},"任何直接、间接或与其他信息结合使用，能够识别或确定自然人身份的信息（包括个人身份号码）。",[1390,13285,13286],{"id":13286},"使用数据",[15,13288,13289],{},"本网站（或本网站中使用的第三方服务）自动收集的信息可能包括：使用本网站的用户的计算机的 IP 地址或域名、URI 地址（统一资源标识符）、请求时间、向服务器提交请求的方法、响应中收到的文件大小、指示服务器响应状态的数字代码（成功、错误等）、来源国家\u002F地区、用户使用的浏览器和操作系统的特征、每次访问的各种时间详情（例如，在网站中每个页面上花费的时间）以及有关在网站中遵循的路径的详细信息，特别是访问页面的顺序，以及有关设备操作系统和\u002F或用户 IT 环境的其他参数。",[1390,13291,13292],{"id":13292},"用户",[15,13294,13295],{},"使用本网站的个人，除非另有规定，否则即为数据主体。",[1390,13297,13298],{"id":13298},"数据主体",[15,13300,13301],{},"个人数据所指的自然人。",[1390,13303,13304],{"id":13304},"数据处理者",[15,13306,13307],{},"根据本隐私政策所述，代表控制者处理个人数据的自然人或法人、公共机构、代理机构或其他机构。",[1390,13309,13310],{"id":13310},"数据控制者",[15,13312,13313],{},"数据控制者是指单独或与他人共同决定个人数据处理的目的和方式（包括与本网站的运行和使用相关的安全措施）的自然人或法人、公共机构、机关或其他机构。除非另有说明，数据控制者即为本网站的所有者。",[1390,13315,13317],{"id":13316},"欧盟或-eu","欧盟（或 EU）",[15,13319,13320],{},"除非另有规定，本文件中所有提及欧盟之处均包括欧盟所有现有成员国和欧洲经济区。",[29,13322,13324],{"id":13323},"九法律信息","九、法律信息",[15,13326,13327],{},"除非本文件中另有规定，否则本政策仅适用于本网站。",[29,13329,13331],{"id":13330},"十重新设置授权","十、重新设置授权",[15,13333,13334],{},"如果您希望重新选择 Cookie 授权偏好，可以点击下方按钮。",[13336,13337],"reset-cookie-button",{},{"title":49,"searchDepth":50,"depth":50,"links":13339},[13340,13341,13342,13343,13344,13345,13349,13353,13362,13363],{"id":13092,"depth":50,"text":13093},{"id":13108,"depth":50,"text":13109},{"id":13125,"depth":50,"text":13126},{"id":13137,"depth":50,"text":13138},{"id":13147,"depth":50,"text":13148},{"id":13170,"depth":50,"text":13171,"children":13346},[13347,13348],{"id":13174,"depth":112,"text":13174},{"id":13180,"depth":112,"text":13181},{"id":13187,"depth":50,"text":13188,"children":13350},[13351,13352],{"id":13194,"depth":112,"text":13195},{"id":13269,"depth":112,"text":13269},{"id":13275,"depth":50,"text":13276,"children":13354},[13355,13356,13357,13358,13359,13360,13361],{"id":13279,"depth":112,"text":13280},{"id":13286,"depth":112,"text":13286},{"id":13292,"depth":112,"text":13292},{"id":13298,"depth":112,"text":13298},{"id":13304,"depth":112,"text":13304},{"id":13310,"depth":112,"text":13310},{"id":13316,"depth":112,"text":13317},{"id":13323,"depth":50,"text":13324},{"id":13330,"depth":50,"text":13331},"了解 undz.cn 使用的 Cookie 和追踪技术，以及您享有的相关权利。",{},"\u002Fcookies",{"title":13084,"description":13364},"cookies",[],"JOuWXG7utbxmFtT2F7qK6LRRrS4d5eS6nY-vz0FHWgg",1794733995721]