彻底卸载Node.js:三平台残留清理与环境变量修复指南
如果你已经和Node.js环境折腾过一段时间大概率会遇到这样一种局面项目要求Node 16本机装的却是Node 20或者全局包装了一堆互相之间起了冲突又或者npm突然开始报各种玄学错误查来查去最后都会指向同一个结论——不如直接把Node.js卸载干净重新来过。但这里有个很反直觉的真相Node.js卸载从来都不是卸完就好了这么简单。它的可执行文件、全局模块目录、npm缓存、环境变量PATH里留下的痕迹一层套一层漏掉任何一处重装之后老问题就会原封不动地回来。我见过有人明明卸载了两次打开终端敲node -v居然还能输出版本号就是典型的回魂残留。这篇文章我会把Windows、macOS、Linux三平台的Node.js卸载完整过一遍重点不是让你点一下卸载按钮就完事而是把那些藏在系统深处的文件目录、缓存和环境变量一并筛出来。每一步都会写到你能对照着屏幕确认自己正在操作什么最后再用几个命令验证是否真的卸干净了。1. 先想清楚你到底卸载的是哪种形态的Node.js很多人一上来就搜卸载步骤却忽略了一个关键前提Node.js并不是只有一种安装方式而不同安装方式对应的卸载路径完全是两套逻辑。我在帮人排查环境问题时至少有三分之一的情况是连自己当初怎么装的都记不清了结果用错了卸载方法越卸越乱。1.1 三种主流安装形态对应三条卸载路线第一种是官方安装包。Windows上是.msi或.exe安装包macOS上是.pkg安装包。这种形态的特点是你能在系统的应用程序/软件列表里找到Node.js的条目可以直接从那里发起卸载。第二种是压缩包解压版就是所谓的绿色版从官网下载zip/tar.gz解压到一个目录就能用。这种形态没有任何卸载入口只能手动删目录清理环境变量。第三种是通过版本管理器安装的比如nvm-windows、nvm、fnm、volta这类工具。如果你是用它们装的Node.js直接从系统设置里卸载是没用的必须先用版本管理器自己的命令把对应版本卸载掉否则版本管理器里的软链接会一直指向一个已经不存在的目录。这三者的关系打个比方官方安装包像是把文件种进了系统里绿色版只是在某个角落放了文件、然后在PATH里留了个门牌号版本管理器则是在你系统和各个Node版本之间立了一个中转站。中转站还在你光拔掉后面的插头是没用的。1.2 动手之前先给当前环境留一份体检报告不管你是要卸载重装还是只是想升级版本动手之前我强烈建议先花两分钟记录一下当前环境。这一步90%的人会跳过直到重装之后发现全局包找不齐了才后悔当初没截图。打开终端依次执行以下命令把输出结果保存成一个文本文件# 查看当前Node和npm版本 node -v npm -v # 查看全局包安装位置 npm prefix -g # 查看全局安装的包列表 npm ls -g --depth0 # 查看npm当前所有配置 npm config list这几条命令不是随便敲的。node -v和npm -v是让你知道原本的版本基线npm prefix -g告诉你全局模块到底放在哪个目录npm ls -g --depth0则是一份全局包清单重装之后照着这份清单逐个恢复能省下大把时间npm config list里面可能记录了registry镜像地址、代理、cache路径等这些配置在新环境里很可能还要用到。我自己的习惯是在做任何环境大改动之前都会把这类信息存到一个名为env-backup.md的笔记里。别嫌麻烦这一步做完了后面就算卸出问题你也永远有一条退路。2. Windows环境下从程序列表到残留目录的完整清理Windows是Node.js卸载翻车率最高的平台原因很简单——Windows的环境变量和用户目录藏得深而且每个版本、每种安装方式留下的痕迹都不一样。下面我把一套完整的清理流程按顺序走一遍。2.1 先从官方卸载程序走一遍明面流程如果你的Node.js是通过安装包安装的第一步还是老老实实走系统的卸载入口。在Windows 10/11上按Win I打开设置进入应用 安装的应用或者按Win R输入appwiz.cpl打开老式的程序和功能面板在列表里搜索Node.js找到对应条目后点击卸载按向导走到结束。需要注意的是有些情况下卸载向导会显示修复而不是卸载这通常说明MSI安装记录已经损坏。这时你的选择是要么先点修复修复完成后再回到列表进行卸载要么直接跳过官方卸载程序进入下一步手动清理。从软件列表发起的卸载一般会移除主要的可执行文件但它基本不会清理全局包目录、npm缓存和用户目录下的配置文件所以这个入口只能算上半场。2.2 手动清除安装目录和用户目录下的残留文件夹卸载程序跑完之后需要检查以下目录是否还存在。头两个是最容易发现的后面几个就属于隐藏副本级别的了目录路径作用卸载后状态C:\Program Files\nodejs\Node.js主安装目录卸载程序一般会删除但有时会残留空壳C:\Program Files (x86)\nodejs\32位Node.js安装目录如果装过旧版本可能残留在这一层%APPDATA%\npm即C:\Users\用户名\AppData\Roaming\npmnpm全局可执行文件目录卸载程序不动必须手动删%APPDATA%\npm-cachenpm缓存目录卸载程序不动必须手动删%LOCALAPPDATA%\npm-cache部分版本单独使用的缓存目录卸载程序不动必须手动删C:\Users\用户名\.npmrcnpm用户配置文件卸载程序不动必须手动删C:\Users\用户名\.node-gypnode-gyp编译缓存常被忽略建议删手动删除时有一个实用技巧打开文件资源管理器在地址栏输入%APPDATA%回车可以快速跳到AppData\Roaming目录再把其中的npm和npm-cache文件夹整个删掉。同理在地址栏输入%LOCALAPPDATA%可以跳到AppData\Local。用这种方式比自己一层层点开用户目录要快得多也不容易走错路径。如果你当初是用zip包解压的绿色版Node.js那C:\Program Files\nodejs这个目录可能根本不存在需要回想一下自己当初解压到了哪个位置找到后把整个目录删掉即可。2.3 PATH环境变量最容易留下回魂痕迹的地方这个是Windows平台卸载Node.js最关键的一步也是最容易被忽略的。控制面板卸载完之后PATH里的路径往往还留在那里。这就是为什么很多人卸载之后打开终端敲node -v仍然能弹出版本号——命令解析器在PATH里找到了已经不在的路径不对准确说是找到了其他残留的副本或者是找到了一个无害但报错的死链。清理步骤按Win R输入sysdm.cpl回车打开系统属性切到高级选项卡点击环境变量按钮分别检查上方用户变量和下方系统变量里的Path在系统变量Path中找到包含C:\Program Files\nodejs\的条目选中并删除在用户变量Path中检查是否有%APPDATA%\npm或C:\Users\用户名\AppData\Roaming\npm如果有也需要删除顺便扫一眼有没有第三方工具添加的其他node相关路径一并清掉。编辑Path时建议双击Path条目在弹窗里逐条确认之后再删除别把整行内容都抹掉。改完Path之后记得点击确定然后关掉所有已打开的终端窗口重新开一个新的。这一点非常重要——旧终端在启动时已经把环境变量加载进内存了不重开窗口你看到的还是旧Path。还有一些情况要特别说明如果你在PATH清理过程中发现了类似C:\Users\用户名\scoop\shims、C:\Program Files\nvm\nvm这样的路径说明这台机器上还装了别的软件包管理器你的Node可能是它们装进去的。这种情况下单纯清nodejs路径还不行得回到对应的包管理器里卸载。2.4 已经通过版本管理器安装的先走管理器自己的卸载Windows上很多人是用nvm-windows来管理Node版本的。如果你属于这种情况前面说的所有手动删除步骤几乎都可以跳过直接打开终端# 先看当前装了哪些版本 nvm list # 逐个卸载不需要的版本 nvm uninstall 20.11.0 nvm uninstall 18.19.0执行完nvm list发现列表还是空的时候再回到第2.2和2.3节去检查残留目录和环境变量。不要在nvm还有版本记录时手动删除nvm安装目录否则nvm自身的配置会处于半挂起状态将来再装版本时会有各种诡异问题。另外nvm-windows默认会把Node版本安装到C:\Users\用户名\AppData\Roaming\nvm这个目录在nvm全部卸载完之后也应该手动清理连同settings.txt一并删掉。3. macOS与Linux的卸载差异命令清单与软链接排查到了macOS和Linux上卸载的逻辑不太一样。这里没有统一的程序和功能入口一切都靠命令行。但也正因为命令行看得见摸得着反而比Windows更容易彻底——只要你知道该删哪些路径。3.1 macOS上区分官方pkg安装与Homebrew安装macOS卸载Node.js首先要判断当初是怎么装的。通过官方pkg安装包安装的情况macOS没有标准的pkg卸载器所以只能手动删除文件。需要清理的路径包括# 主程序和全局模块 sudo rm -rf /usr/local/bin/node sudo rm -rf /usr/local/lib/node_modules sudo rm -rf /usr/local/include/node sudo rm -rf /usr/local/share/doc/node sudo rm -rf /usr/local/share/man/man1/node.1 sudo rm -rf /usr/local/share/systemtap/tapset/node.stp通过Homebrew安装的情况更简单也更干净因为包管理器本身就能追踪文件来源# 先确认是否通过brew安装 brew list | grep node # 卸载Node.js加--ignore-dependencies是因为有可能其他包依赖它 brew uninstall node --ignore-dependencies # 清理无用的依赖包和缓存 brew autoremove brew cleanup无论哪种方式macOS用户目录下的这些残留也建议一并删除# npm全局包目录和缓存如果存在 rm -rf ~/.npm rm -rf ~/.npm-global rm -rf ~/.node-gyp # npm配置文件 rm -f ~/.npmrcmacOS上还有个细节值得注意如果你的Node是通过.pkg安装的/usr/local/bin/node这个文件可能带着固定的文件权限直接用普通用户身份执行rm会报Permission denied。这时候要么加sudo要么删除后重启终端。我通常建议先执行ls -l /usr/local/bin/node看一下文件所有者再决定用什么权限去删。3.2 Linux上区分发行版包管理器与源码编译的卸载Linux发行版分两大阵营包管理器完全不同对应的卸载命令也各不相同。Debian/Ubuntu系# --purge表示连同配置文件一起删除 sudo apt remove --purge nodejs npm # 清理不再需要的依赖 sudo apt autoremoveRHEL/CentOS/Fedora系# 新版使用dnf旧版使用yum二选一 sudo dnf remove nodejs npm # 或 sudo yum remove nodejs npm用包管理器装的Node.js卸载之后其实还有一关软链接。很多时候你执行node -v能正常显示版本是因为/usr/bin/node或/usr/local/bin/node是指向真实文件的一个符号链接。包管理器卸载通常会顺带移除软链接但如果当初是通过源码编译安装的就需要手动处理了。源码编译安装的Node.jsmake uninstall有时候并不好用因为Makefile里未必注册了uninstall目标。这种情况下最稳妥的做法是找到你当初执行./configure --prefix...时指定的前缀路径默认一般是/usr/local然后用find把相关文件找出来逐个删除# 查看当前实际生效的node路径 which node # 检查是否为软链接 ls -l $(which node) # 如果是软链接删除链接本身 sudo rm /usr/bin/node sudo rm /usr/bin/npm # 删除可能的残余目录 sudo rm -rf /usr/local/lib/node_modules sudo rm -rf ~/.npm sudo rm -rf ~/.node-gyp sudo rm -f ~/.npmrc另外无论macOS还是Linux如果你使用的是nvm、fnm或volta这类版本管理器请记住一条铁律不要手动去删管理器目录下的某个Node版本一定要用管理器自己的命令卸载。比如nvm是nvm uninstall versionfnm是fnm uninstall versionvolta是volta uninstall node。手动删版本目录会导致管理器内的版本列表与实际文件不同步比不卸还麻烦。4. 验证卸载是否彻底三个命令和时间点的小陷阱卸载完不等于成功验证才是验收环节。这里要敲三个命令而且必须在全新打开的终端里执行因为旧终端还保留着卸载前的环境变量快照。你先开一个全新终端再依次执行# 验证node命令是否已消失 node -v # 验证npm命令是否已消失 npm -v # 确认PATH中还有没有node相关路径 which node where node正常的输出应该是not found或找不到指定的程序。如果敲node -v仍然有输出不要慌这大概率是下面三种情况之一。4.1 版本管理器造成的幽灵命令最常见的回魂原因就是版本管理器。你明明卸载了Node但nvm的软链接还留在系统PATH里指向一个已经不存在的目录。打个比方你把房子拆了但门牌号还挂在原地快递员照着门牌号还往那里送。解决方法是回到版本管理器里卸载完所有版本后再把管理器相关的PATH条目清掉。4.2 Windows下npm全局shim的半残留还有一种Windows特有的情况卸载Node.js主程序之后%APPDATA%\npm目录没有被删除而这里面存放着所有全局安装的命令行工具的壳程序shim比如vue.cmd、hexo.cmd、nodemon.cmd这些文件。即便Node本体不在了你打开终端敲vue -v系统仍然能在%APPDATA%\npm里找到这个壳程序并尝试执行只不过执行时会报错。这就是为什么第2.2节我特别强调要删%APPDATA%\npm它的存在价值就是这类全局包的启动文件删掉之后这些命令才会彻底消失。小于300字继续写。4.3 确认Node相关目录是否真的空了命令验证通过之后最后再顺手检查一下文件系统层面。我通常会用带隐藏文件的列表命令把可能残留的目录过一遍Windows上检查C:\Program Files\nodejs、%APPDATA%\npm、%APPDATA%\npm-cache是否已删除macOS/Linux上检查/usr/local/lib/node_modules、~/.npm、~/.node-gyp是否存在检查用户主目录下有没有.npmrc文件残存。这个步骤看似多余但实际价值很大。当我后来重装Node时如果遇到npm全局包路径异常、安装权限报错多半就是这些目录里的旧配置在中作祟。与其到时候排查不如在卸载这个环节一次清干净。5. 重装与防复发别急着双击安装包先上版本管理器如果你卸载Node.js是为了修环境那最后这一步非常重要重新安装之前先把版本管理器装上。曾经很多年我都是直接下载官方安装包用了一段时间又卸卸了又装每次都重复走着清理残留的老路。直到改用版本管理器之后我才真正告别了这种循环。5.1 为什么推荐版本管理器而非直接安装官方包直接安装官方Node.js的痛点是升级要下载完整安装包回退要先把新版卸载干净同时不同项目对Node版本的要求往往互相冲突。版本管理器则把这个问题简化成了多版本共存、一键切换。Windows上我用的是nvm-windowsmacOS/Linux上用的是nvm装好之后日常操作统一是这样# 安装指定版本 nvm install 20.11.0 # 切换当前使用的版本 nvm use 20.11.0 # 查看本地已有的版本列表 nvm list现在的fnm和volta也都值得关注。fnm用Rust写的执行速度更快volta则更进一步能直接把Node版本和npm版本写进项目配置里团队成员打开项目就能自动切到正确版本几乎不需要人干预。5.2 恢复全局包把第1.2节那份清单用起来重装Node之后全局包恢复很简单。打开第1.2节保存下来的npm ls -g --depth0输出把里面的包名和版本整理成一行执行npm install -g 包名版本如果当初全局包数量多还可以用npm rebuild重建原生模块或者用npm update -g统一升级一波。这里有一个我踩过的坑恢复全局包时不要用手动拷贝node_modules目录的方式因为不同版本的Node对应的原生模块编译产物可能并不兼容拷贝只会给你留下一堆启动即报错的问题。老老实实用npm安装走正规渠道远比复制粘贴省心。5.3 说在最后环境清理这件事投入产出比极高每次给别人的机器清理Node.js环境两三个小时都是常事。一开始觉得繁琐后来才意识到环境清理这件事的投入产出比其实很高——你花40分钟把残留清干净换来的是接下来几个月、甚至几年稳定的开发环境不用再被各种莫名其妙的依赖报错打断思路。如果你看完这篇还是不确定自己的Node.js到底是哪种安装方式先别急着手动删文件。回到第1.1节重新对照一下把安装入口确认清楚再动手。卸载本身不复杂复杂的是搞清楚这扇门是从哪儿进来的。有了版本管理器兜底之后你以后几乎不会再经历卸载不干净的痛苦——因为所有Node版本都活在用户目录的某个角落想不用了就直接删那一块不碰系统目录不动环境变量。这大概是我在踩了无数次坑之后最想让你直接避开的终点。

相关新闻

HDFS性能优化:从关键指标到监控排查实战指南

HDFS性能优化:从关键指标到监控排查实战指南

1. 先说清楚:HDFS 性能优化到底在优化什么做分布式存储运维这些年,我越来越觉得 HDFS 性能优化这件事,本质上就一条主线:把客户端、NameNode、DataNode 这条链路上的时间花在哪、资源耗在哪,用关键指标一层层量清楚&am…

2026/10/13 7:47:13 阅读更多 →
SQL Server + Tkinter 课设全链路实战:从建库到打包避坑指南

SQL Server + Tkinter 课设全链路实战:从建库到打包避坑指南

简介:这是一份面向数据库课程设计学习者与Python初学者的完整项目包,以SQL Server为后台数据库、Tkinter为GUI库,构建了一个可运行的销售管理系统,覆盖从数据库设计、增删改查操作到桌面应用打包发布的完整流程。压缩包内共22个文…

2026/10/13 7:47:13 阅读更多 →
Vagaa 2.6.6.7实战:老协议P2P客户端的安装配置与迁移

Vagaa 2.6.6.7实战:老协议P2P客户端的安装配置与迁移

简介:经典P2P文件共享软件 Vagaa 2.6.6.7 的完整安装与绿色运行包,适合需要离线安装、研究早期P2P客户端结构或收藏经典软件的爱好者。Vagaa基于点对点网络实现文件搜索与多任务下载,本版本在连接优化、界面操作和隐私保护方面有所调整&#…

2026/10/13 7:47:13 阅读更多 →

最新新闻

视频目标跟踪标注工具VATIC非Docker安装全攻略

视频目标跟踪标注工具VATIC非Docker安装全攻略

如果你要做目标检测或者视频目标跟踪,第一步往往不是调模型,而是先把训练数据准备好。标注一个视频里每个目标每一帧的位置,听起来不复杂,真做起来又磨人又容易出错。VATIC 就是干这个的开源视频标注工具:打开浏览器&a…

2026/10/13 8:36:51 阅读更多 →
Jupyter实战多模态情感分析:文本+图像联合建模与可解释融合

Jupyter实战多模态情感分析:文本+图像联合建模与可解释融合

简介:本资源是一套基于Jupyter Notebook与Python实现的多模态情感分析完整项目,专为本科毕业设计、课程设计及中小型AI项目开发场景打造,面向具备Python基础与机器学习入门知识的学习者,解决文本图像/语音等多源异构数据融合建模的…

2026/10/13 8:36:51 阅读更多 →
LSTM股票收益率预测:时间序列建模四步闭环与避坑指南

LSTM股票收益率预测:时间序列建模四步闭环与避坑指南

简介:本资源是一套基于Keras实现的LSTM股票收益率预测实践方案,面向对量化交易与深度学习交叉应用感兴趣的学生及初学者,聚焦时间序列建模中的数据预处理、多变量训练适配与结果逆变换等核心难点。压缩包共4个文件,含2个压缩包&am…

2026/10/13 8:36:51 阅读更多 →
OpenMontage:用视觉特征与节拍对齐实现自动蒙太奇粗剪

OpenMontage:用视觉特征与节拍对齐实现自动蒙太奇粗剪

1. 为什么我会需要一个"自动蒙太奇"工具先说结论:我给自己的短视频工作流里开发了一个叫 OpenMontage 的开源小工具,专门用来做素材的自动化粗剪和蒙太奇节奏编排。这东西不复杂,但它确实解决了我过去两年里最烦的一件事——批量素…

2026/10/13 8:36:51 阅读更多 →
OpenMontage:开源命令行智能混剪工具,自动高光卡点出片

OpenMontage:开源命令行智能混剪工具,自动高光卡点出片

1. 从"两小时素材剪三十秒高光"说起做高光混剪这件事,最折磨人的永远不是"按删除键"那一下,而是素材看得人想睡觉。我有次给一场两个多小时的游戏直播做回顾视频,来回拖进度条找击杀镜头、看回放、找表情包瞬间&#xff…

2026/10/13 8:36:51 阅读更多 →
预测性维护落地实战:从振动采集到MES工单闭环

预测性维护落地实战:从振动采集到MES工单闭环

简介:本资源是一份面向智能制造领域工程师、工业数字化转型从业者及高校相关专业师生的预测性维护平台建设方案PPT,聚焦生产设备全生命周期健康管理与AI驱动的故障预警。文档共26页,系统梳理了工业IoT平台、设备健康管理平台与机器学习平台三…

2026/10/13 8:35:50 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式: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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/12 18:11:17 阅读更多 →