新闻详情

新闻详情

首页 / 资讯中心 / 详情

本地NPM包目录管理:全局依赖台账与快照恢复方案

发布时间:2026/10/1 19:12:19来源:尧图网络
本地NPM包目录管理:全局依赖台账与快照恢复方案
1. 这套方案是怎么来的我为什么受够了“包放在哪都行”的日子干前端这些年NPM 一直是绕不开的搭档。npm install按一下几百个包哗啦啦进node_modulesnpm install -g一下全局工具也能随叫随到。但时间久了你会发现一个问题你的电脑上到底装了多少 npm 包它们都放在哪哪些是项目要用的、哪些是全局的、哪些是装完就忘了的我试过打开C:\Users\用户名\AppData\Roaming\npm和C:\Users\用户名\AppData\Local\npm-cache看着一屏又一屏的目录名说实话绝大多数我根本想不起来是干嘛用的。更别提哪天 C 盘飘红想清理一下又怕手一抖删了哪个还在用的全局命令。这个痛点听起来不值一提但真的折腾过的人都知道它属于那种“平时不疼疼起来要命”的类型。你换电脑、重装系统、或者把项目从 Windows 迁到 macOS/Linux 上npm install从头再来是小事真正恼火的是那些全局装的命令行工具——vue、pnpm、typeorm、nodemon、claude code之类的你得一个个重新装回来。而这个“一个个重新装回来”的过程里你大概率还会遇到网络慢、镜像源问题、版本选错、依赖冲突。于是我就琢磨着能不能用一套特别轻的本地方案把“包目录”这件事管起来让包的结构可见、位置可控、恢复可预期。这套方案不是什么高大上的产品也不是分布式镜像系统就是一套结合目录规范、软链接、脚本快照的本地管理思路。它适合谁呢适合那些电脑上装了大量全局 npm 工具想知道它们到底在哪、占多少空间的人经常换电脑、换系统希望把全局依赖“一键恢复”的人和我一样项目目录里node_modules动辄几个 G想统一归置、减少重复下载的人。方案本身不依赖任何额外的注册表、不用装守护进程、不用改 npm 源地址。只用到了 Node.js 内置能力、系统自带的目录链接命令以及几个几 KB 的脚本。你如果之前踩过一堆 npm 安装乱七八糟的坑——比如npm warn ERESOLVE overriding peer dependency、npm 不是内部或外部命令、npm.ps1 因为在此系统上禁止运行脚本——那这套方案可以从根上帮你少踩一部分坑因为我们把“目录”这个复杂度提前管起来了。2. 设计思路拆解把“目录”当作一种可以备份和恢复的数据资产2.1 先想清楚本地包到底有哪几类在动手设计之前我先把电脑上常见的 npm 目录分了个类。你会发现只要分清楚类型后面所有管理动作都自然有章法。第一类是项目内依赖也就是node_modules它跟着项目走是package.json的直接产物。第二类是全局安装的包在 Windows 上是npm prefix -g指定的目录在 macOS/Linux 上是/usr/local/lib/node_modules之类的位置。第三类是npm 缓存npm-cache它保存了下载过的压缩包和元数据理论上是可以全部删掉重新下载的但删之前的体积往往大得吓人而且一旦删了又得重新走一遍网络。我最初的直觉是把这三类全塞进一个统一目录但很快发现不行项目内的node_modules不能被移动因为它内部的很多工具通过相对路径找依赖你挪了位置整个项目就废了。全局包也不能随意移动因为系统PATH里指向的是老位置。所以方案的设计目标不是“搬家”而是**“台账化”和“快照化”**。我最终定的核心思路是给本地 npm 包目录建立一个“清单台账 符号链接归位 快照恢复”的三层结构。听起来玄乎实际落地的时候极简到让你惊讶。2.2 核心设计一份清单顶一万次记忆这套方案最核心的文件是一份npm-pkg-manifest.json它记录了三块内容全局顶层包名列表执行npm ls -g --depth0拿到的结果全局包的安装位置执行npm prefix -g拿到的结果本机缓存目录的位置和体积执行npm config get cache以及循环统计目录体积得到的结果。这份清单不需要手工维护它由一个小脚本生成。每次你装新全局包、卸载旧全局包跑一下脚本清单自动更新。那你可能会问光有清单有什么用接下来是关键清单里不仅要记名字还要记来源。但这里我没做成复杂的锁定文件而是记录了包的入口命令和顶层包名。恢复的时候脚本会读取所有顶层包名直接去调用npm install -g 包名一条命令批量装回。有人会吐槽说这不就等于npm ls -g之后手抄一遍再来一次npm install -g吗对本质上就是这个逻辑但手抄和脚本之间差了十万八千里。真实场景里你电脑上全局包可能有几十个其中有的是scope/包名有的是带版本后缀的靠人眼看很容易漏而且当你换了镜像源、换了 node 版本还要再处理平台差异。脚本保证的是**“恢复动作可重复”**配合后续的目录链接方案就能在换电脑一小时内恢复一个熟悉的开发环境。2.3 为什么用“符号链接 目录骨架”而不是“复制粘贴”方案还涉及一个关键决策全局包的目录要不要做统一归集我最初想过把C:\Users\xxx\AppData\Roaming\npm\node_modules里的实际文件夹复制到一个统一目录再建符号链接指回去。但实测下来符号链接方案比复制粘贴要合理得多原因有三一是体积。node_modules 这种目录的硬伤是压缩后很小、解压后巨大符号链接本身是一个极小条目指哪打哪几乎不占额外空间。二是在 Windows 上node_modules里很多文件路径本来就长再复制一份路径长度直接踩到 Win32 的 260 字符限制。三是更新一致性链接过去之后全局包更新时真实文件和链接指向始终是同一份不会出现两份副本越走越偏的情况。但这里必须强调一个前提符号链接在 macOS/Linux 上非常丝滑在 Windows 上要用mklink /J目录联接而不是普通快捷方式否则 Node 解析真实路径会有怪异行为。Windows 目录联接对用户几乎透明不需要管理员权限这是我反复测试后最稳的组合。所以方案里只要是涉及 Windows 的操作我都默认用目录联接junction而不是符号链接symlink。2.4 设计里的“抗错原则”宁可脚本多问一句不让目录静默错位管理脚本有个细节值得单独说每次操作前后都校验一遍“目录当前状态是否与台账一致”。比如恢复全局包时恢复脚本先读取清单里的包名列表再执行npm ls -g --depth0对比当前安装状态列出缺失项和多余项然后打印出来让你确认。这一步不是多余的。因为全局环境不像项目环境有package-lock.json锁着你随手npm i -g xxx之后可能什么都不影响但台账就失真了。如果不管三七二十一直接批量恢复很容易把后来单独装的包误删掉。我加了一层“生成 diff → 人工确认 → 执行差异”的逻辑慢了几秒但规避了灾难。这个思路放到项目管理里也成立对“目录”这种容易失控的资产结构上尽量收敛操作上尽量显式。我见过太多人热衷于各种自动同步工具结果同步错乱之后反而比手工维护更浪费时间。3. 实操从零搭建一套本地 NPM 包目录管理方案3.1 第一步梳理当前环境建立“台账”假设你已经在 Windows 上装好了 Node.js 和 npm第一步不是写脚本而是先把自己的家底摸清楚。打开 PowerShell 或 CMD依次执行下面几条命令node -v npm -v npm prefix -g npm config get cache npm ls -g --depth0npm prefix -g会告诉你全局包的真实安装根目录比如C:\Users\admin\AppData\Roaming\npm。npm config get cache会告诉你缓存目录比如C:\Users\admin\AppData\Local\npm-cache。npm ls -g --depth0会列出所有顶层全局包名字。把这三组信息记下来存成一个文本文件也行存成一个 JSON 更好。比如{ nodeVersion: v22.11.0, npmVersion: 10.9.2, globalPrefix: C:\\Users\\admin\\AppData\\Roaming\\npm, globalCache: C:\\Users\\admin\\AppData\\Local\\npm-cache, globalPackages: [ vue/cli, pnpm, nodemon, typescript, claude-code ] }这一步执行完你对本机包的“台账”就建好了。你可能会发现自己的全局包列表比想象中短得多也可能长到吓人。我在帮朋友整理时见过一个极端案例全局包有 80 多个占了 3 个多 G其中有 20 多个都来自同一个工具的不同版本。这就是典型的“安装一时爽清理火葬场”。3.2 第二步创建目录骨架和链接脚本接下来创建统一的包目录骨架。我建议的目录结构如下C:\DevTools\npm-local\ ├── manifest.json # 台账清单 ├── scripts\ │ ├── snapshot.cmd # 生成快照 │ ├── restore.cmd # 恢复全局包 │ ├── link-global.cmd # 建立全局包目录的目录联接 │ └── analyze-size.ps1 # 统计各目录体积 ├── global-node_modules\ # 指向真实全局包的目录联接 └── cache-mirror\ # 指向 npm 缓存的目录联接这个结构的精髓在于你用两条目录联接把分散在系统深处的 npm 相关目录全部“映射”到一个统一入口下。以后想看自己的全局包不用再一层层点进 AppData只要进C:\DevTools\npm-local\global-node_modules就能看到。建立目录联接的命令如下mklink /J C:\DevTools\npm-local\global-node_modules C:\Users\admin\AppData\Roaming\npm\node_modules mklink /J C:\DevTools\npm-local\cache-mirror C:\Users\admin\AppData\Local\npm-cache注意mklink 在普通 CMD 窗口即可运行不需要管理员权限因为/J参数创建的是目录联接junction而不是符号链接。这是 Windows 上最稳的方式。3.3 第三步编写快照脚本一键记录当前状态快照脚本的作用是把“当前状态”存档。我写了一个snapshot.cmd和配套的 Node.js 脚本但为了极简你也可以直接用批处理加 PowerShell。下面是一个可以用的核心片段echo off set MANIFESTC:\DevTools\npm-local\manifest.json echo { %MANIFEST% echo time: %date% %time%, echo globalPrefix: %APPDATA%\npm, echo globalPackages: [ powershell -Command npm ls -g --depth0 | Select-String ^[├└] | ForEach-Object { $_.Line -replace .*?([\w][\w.-]*([\w.-])?).*$,$1 } echo ] echo } %MANIFEST%不要被这个脚本的粗糙吓到他的输出格式可能不够完美但方向是对的。因为我真正建议的做法是用 npm 自带的 JSON 输出能力。你完全可以用下面这条命令一次性拿一个机器可读的清单npm ls -g --depth0 --json global-packages.json然后写一个几十行的 Node.js 脚本读取global-packages.json做一下名字抽取、格式整理、与旧清单对比最后写回manifest.json。这个脚本的好处是不管你的 npm 版本多新、输出格式怎么变化npm ls --json的输出结构都是稳定的。我在实际项目中就吃过npm ls人类可读格式的亏换了 npm 10 之后缩进都变了所以坚持用 JSON 格式做中间载体是最省心的选择。3.4 第四步恢复脚本换电脑时的“一键还原”恢复脚本的职责是读取manifest.json拿到全局包名列表然后逐个批量安装。我写了一个最小可用的版本const fs require(fs); const { execSync } require(child_process); const manifestPath process.argv[2] || ./manifest.json; const manifest JSON.parse(fs.readFileSync(manifestPath, utf8)); const packages manifest.globalPackages || []; console.log(待安装全局包数量: ${packages.length}); // 获取当前已有的全局包列表避免重复安装 const currentOutput execSync(npm ls -g --depth0 --json).toString(); let current []; try { const json JSON.parse(currentOutput); current Object.keys(json.dependencies || {}); } catch (e) { console.warn(当前全局包列表解析失败将全部重新安装。); } const missing packages.filter(pkg { const name pkg.startsWith() ? pkg.split().slice(0, 2).join() : pkg.split()[0]; return !current.some(c c name); }); if (missing.length 0) { console.log(全部全局包已安装无需操作。); process.exit(0); } console.log(缺失列表:); missing.forEach(pkg console.log( ${pkg})); console.log(开始安装...); for (const pkg of missing) { console.log(安装 ${pkg} ...); try { execSync(npm install -g ${pkg}, { stdio: inherit }); } catch (e) { console.error(安装失败: ${pkg}); } } console.log(恢复完成。);这段脚本有几个细节值得说明。第一pkg.startsWith()的判断是为了处理scoped 包。vue/cli这种包名里带斜杠和 符号如果直接用pkg.split()[0]取到的就是一个空字符串所以在判断已安装列表时scoped 包必须特殊处理。第二脚本里先获取“当前已安装的全局包列表”目的是避免重复安装。全局包安装往往有 peerDependency 检查和网络开销无脑全装一遍又慢又容易报错。第三stdio: inherit会让 npm 的日志直接输出到终端方便你实时看到每个包的安装进度。3.5 第五步目录体积分析与清理建议有了统一入口之后第二个实用的功能就是体积分析。Windows 自带的文件夹右键属性也能看体积但要一个个点开而且 node_modules 这种目录动辄几万个小文件Windows 计算起来非常慢。我写了一个 PowerShell 脚本专门统计目录体积和文件数量param([string]$Path C:\DevTools\npm-local\global-node_modules) if (!(Test-Path $Path)) { Write-Host 目录不存在: $Path -ForegroundColor Red exit 1 } $items Get-ChildItem $Path -Directory $totalSize 0 $totalFiles 0 foreach ($item in $items) { $size (Get-ChildItem $item.FullName -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum $fileCount (Get-ChildItem $item.FullName -Recurse -Force -File -ErrorAction SilentlyContinue).Count $sizeMB [math]::Round($size / 1MB, 2) Write-Host ({0,-40} {1,10} MB {2,12} files -f $item.Name, $sizeMB, $fileCount) $totalSize $size $totalFiles $fileCount } $totalSizeMB [math]::Round($totalSize / 1MB, 2) Write-Host (- * 70) Write-Host (总计: {0} MB, 文件数: {1} -f $totalSizeMB, $totalFiles)这个脚本的价值不在于它用了多牛的技术而在于它把“我这全局包到底多大”这个问题变成了一个命令两秒钟出结果。我在已经记不清多少次帮人排查 C 盘爆炸的过程中都是靠这个脚本快速定位到某个全局工具占用异常。4. 实操中一定会踩的坑问题排查与技巧实录4.1 npm.ps1 无法加载运行脚本被禁止在 Windows 上跑任何.ps1脚本都有可能遇到这句话npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1因为在此系统上禁止运行脚本这个问题跟我们的目录脚本其实无关但你会发现只要你想用 PowerShell 做自动化它就阴魂不散。原因是 Windows 默认执行策略是Restricted不允许运行本地脚本文件。解决办法是打开管理员 PowerShell执行Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUserRemoteSigned的含义是本机创建的脚本可以运行从互联网下载的脚本需要有数字签名。这是安全和便利之间比较平衡的选项。需要注意的是修改执行策略不需要重启但要以管理员身份运行 PowerShell。如果你在公司电脑上可能有域策略覆盖这个命令会报错那就在 CMD 里运行.cmd脚本避开 PowerShell 限制。4.2 npm 不是内部或外部命令环境变量 PATH 配置问题换电脑后恢复全局包最常遇到的就是 npm 命令直接失踪。报错信息一般是这样npm 不是内部或外部命令也不是可运行的程序或批处理文件。这背后的原因十有八九是Node.js 没装或者 PATH 没配。但还有一个隐蔽情况Node 装了但 npm 前缀确实没在 PATH 里。我之前在这套方案里加了一个自动检测逻辑恢复脚本第一步就检查npm是否可用不可用时打印一个提示告诉你“先安装 Node.js LTS并把%APPDATA%\npm加入 PATH”。实测下来这套方案能减少至少一半的“一键恢复失败”问题。具体配置 PATH 的方法在 Windows 设置里搜“编辑账户的环境变量”在用户变量里找到Path新增两行一行是 Node 安装目录如C:\Program Files\nodejs\一行是全局包前缀目录如C:\Users\admin\AppData\Roaming\npm。注意这些操作之后要重开终端才生效这就是很多人改了 PATH 却仍然“npm 不是内部或外部命令”的原因。4.3 npm warn ERESOLVE overriding peer dependency全局包冲突恢复多个全局包时你极大概率会遇到类似这样的警告npm warn ERESOLVE overriding peer dependency npm warn While resolving: compression-webpack-plugin2.0.0 npm warn Found: webpack5这种情况下 npm 并没有直接中断安装它只是告诉你A 包依赖的 peerDependency 版本和 B 包实际使用的版本不一致。在全局环境里这种冲突比项目环境更常见因为全局包之间没有独立的 node_modules 隔离顶层包共享同一个依赖空间。我的处理原则是如果警告里出现 “Found: xxx版本” 且版本号大版本一致基本可以忽略。如果出现的是 “Conflicting peer dependency” 整行报错那需要权衡要不要加--legacy-peer-deps。在全局包恢复场景里我建议你先不加先把所有包装一遍看哪些真正失败再去处理个别冲突。因为--legacy-peer-deps本质上就是把 peerDependency 的检查全跳过可能带来运行时隐性问题。4.4 全局包安装后命令用不了前缀目录被篡改还有一种比较隐蔽的情况全局包明明装上了npm ls -g也能看到但执行命令时提示“无法识别”。这通常是npm prefix -g指向的目录和 PATH 里的目录不是同一个。比如说你在 Windows 上装 Node 时选了默认路径但后来手动把全局前缀改到了D:\nodejs\却没有同步改 PATH。这时候npm i -g装的东西确实进了D:\nodejs\node_modules但你的终端在 PATH 里找的还是C:\Users\admin\AppData\Roaming\npm。在我要设计的目录管理方案里manifest.json里保存的globalPrefix就是用来干这个的。恢复环境时脚本先从台账里读出历史前缀路径然后对比当前npm prefix -g的输出不一致就打印警告并给出修改建议。这个设计看起来简单但实际帮我在两台电脑间迁移环境时省了大量排查时间。4.5 缓存目录占用巨大到底能不能删npm 缓存目录npm-cache是另一个空间占用大户。npm cache verify这个命令会检查缓存完整性并且能清理一部分无用数据但不会清空全部。如果你决定清空缓存执行npm cache clean --force清空之后唯一的代价是后面所有 install 都要重新走网络下载。如果你的镜像源速度一般这会有明显体验下降。我的建议是缓存目录用npm-cache的目录联接暴露出来定期用脚本统计体积如果超过 2GB 且最近没大版本更新干净利落地清一次。比清理缓存更重要的是要养成优化网络源的习惯。如果下载慢大概率是源的问题而不是缓存的问题。这里顺便提一下很多新人在配置镜像源时容易踩坑不要把镜像源永久改成 https 协议之外的地址也不要同时配置多个源。我在实践中唯一推荐的方案是npm config set registry https://registry.npmmirror.com这是国内速度较快的公共镜像或者用nrm这类工具来快速切换。但注意公司内网环境要用公司统一指定的源这个必须优先适配。4.6 目录联接 mklink 的权限与路径坑再回到 Windows 目录联接本身。mklink /J创建目录联接时有几个坑值得单独说。第一个坑是源路径必须用绝对路径。如果你写相对路径或者路径里有空格但没有加引号都会失败。比如C:\Program Files这种带空格的路径必须像我上面示例那样用双引号括起来。第二个坑是目标目录不能提前存在。mklink /J要求目标位置是“不存在的路径”它会创建这个路径并指向源。如果你已经手工建了一个空文件夹C:\DevTools\npm-local\global-node_modules再去执行mklink就会报错“文件已存在”。正确做法是先确保目标路径不存在再执行链接命令。第三个坑是目录联接在跨盘符时也能工作。mklink /J和mklink /D符号链接都能跨盘但/J更健壮对权限要求更低。实测中把全局包目录从 C 盘联接到 D 盘的管理目录下完全可行。但要注意如果 D 盘是移动硬盘或网络驱动器Node 在解析真实路径时可能会有奇怪的行为我不建议在这种场景下用联接。4.7 node_modules 目录残留删除慢到怀疑人生这个坑和 npm 本身关系不大但在清理旧目录时你一定躲不过Windows 上删除 node_modules 极慢尤其是里面有几万个文件的时候。我自己练出了一套比较实用的组合操作优先用rimraf工具npm install -g rimraf然后rimraf node_modules。这个工具专门处理 Windows 长路径删除问题。或者用 PowerShell 的Remove-Item -Recurse -Force但实测速度比 rimraf 慢不少。最极端的情况下直接使用robocopy的镜像删除技巧先创建一个空目录C:\empty然后执行robocopy C:\empty D:\target\node_modules /MIR原理是用空目录镜像洗掉目标目录。这个技巧快得离谱。在我的目录管理方案里analyze-size.ps1脚本会顺带生成“哪些目录体积超过 500MB”的报告看到这种东西你就知道下一步该启动清理了。5. 一点后续方案还能怎么扩展这套方案我用了大半年整体感受是“小而美花了半天搭好省了无数个半天”。如果后续你还想继续深入有几个很自然的扩展方向。一个方向是把台账升级成“带版本锁定的完整备份”。现在的manifest.json只记了顶层包名恢复时会默认装最新版本。如果想精确锁定版本可以在快照脚本里多执行一步npm ls -g --json把每个包的 version 字段一并记下恢复时改成npm install -g packageversion。这样换电脑后恢复出的环境就和旧环境完全一致连 A 包依赖的 peerDependency 版本都能对上。另一个方向是用定时任务做自动快照。Windows 的任务计划程序可以设置每天或每周跑一次snapshot.cmd这样台账永远是最新的。我已经在自己的电脑上设置了每周日晚十点自动快照平时完全无感但那台电脑要是突然出事我随时能把手头的环境复制到任何一台新机器上。还有一个偏进阶的方向把脚本里对 Windows 的mklink调用改成跨平台的 Node.js 脚本里用fs.symlinkSync加junction类型参数统一处理。这样一套代码在 macOS、Linux、Windows 上都能跑配合 WSL 使用也没问题。我目前没做这一步是因为日常主力环境就是 Windows但如果你有跨平台需求这个改造方向是顺理成章的。最后再分享一个我在整个设计过程中最深的一个体会管理本地 npm 包本质上不是管理“包”而是管理“预期”。你预期自己电脑上装了什么、放在哪、占多大地方、能不能快速重建这些预期一旦清晰了用什么工具反而是次要的。这套方案里的脚本每一个都很简陋它真正值钱的地方是“先把结构定下来再把动作变成脚本最后把历史变成台账”。你要是从来没想过自己电脑上的包归谁管那现在就可以从npm prefix -g开始花十分钟把台账建起来。相信我这十分钟的投入后面会以“省下半天”的形式回报给你。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

为机器人 Agent 设计 Harness 实时控制循环:TaoToken 统一 Key 接入与 config.toml 配置骨架 2026/10/1 19:54:52

为机器人 Agent 设计 Harness 实时控制循环:TaoToken 统一 Key 接入与 config.toml 配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
职业背景调查应该查到什么程度?职业经历核验范围配置指南 2026/10/1 19:54:52

职业背景调查应该查到什么程度?职业经历核验范围配置指南

职业背景调查应查到与拟任岗位直接相关、能够影响任职判断的职业事实为止。企业要从职责、权限和潜在损失反推核验项目,并为每个字段写明目的、来源和必要性;与岗位无关、无法合法取得或影响明显过大的信息,应删除或改用影响更小的验证方式。…

阅读更多 →
Visual Basic 6.0 连点器制作原理 + 源码:鼠标点击与鼠标录制完整实现(TaoToken 统一 Key 通道) 2026/10/1 19:54:51

Visual Basic 6.0 连点器制作原理 + 源码:鼠标点击与鼠标录制完整实现(TaoToken 统一 Key 通道)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
SqlServer 游标实战:用 TaoToken 统一 Key 跑通学生姓名、选修课程与期末成绩三表输出 2026/10/1 19:54:51

SqlServer 游标实战:用 TaoToken 统一 Key 跑通学生姓名、选修课程与期末成绩三表输出

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
小米/红米国际版系统找回小米钱包:公交卡与门禁卡完整攻略 2026/10/1 19:54:51

小米/红米国际版系统找回小米钱包:公交卡与门禁卡完整攻略

前几天有个朋友私信我,说他把手头的小米手机刷成了国际版系统,日常用得很顺手,但一到地铁闸机口就尴尬了——手机NFC扫上去没反应,钱包App也是空的,公交卡刷不了,门禁卡更是无从谈起。这个问题我在系列前几…

阅读更多 →
恶意样本与APT情报收集实战:从IOC到自动化分析工作流 2026/10/1 19:54:32

恶意样本与APT情报收集实战:从IOC到自动化分析工作流

做威胁情报和应急响应这几年,我遇到的最尴尬的事情之一就是:明明搜的是“APT样本下载”,网页前排却跳出一堆Linux下面 sudo apt install 的教程——没办法, APT 这个缩写撞车太严重,一个指高级持续性威胁&#xff…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉