Mac上使用Homebrew安装Node.js:从环境配置到npm优化全攻略
1. 为什么在Mac上选择Homebrew安装Node.js如果你刚拿到一台Mac或者准备开始学习前端、后端开发安装Node.js几乎是绕不开的第一步。网上教程五花八门有让你去官网下载pkg安装包的有让你用nvm版本管理工具的还有直接让你用包管理器Homebrew的。作为一个在Mac上折腾了十多年的老开发我几乎把所有方法都试了个遍。今天我就来聊聊为什么我最终把Homebrew作为了首选的Node.js安装方式以及在这个过程中你可能会遇到哪些“坑”以及如何优雅地避开它们。首先你得明白Node.js是什么。简单来说它是一个能让JavaScript代码在服务器端运行的环境。以前JavaScript只能在浏览器里跑做做网页特效有了Node.jsJavaScript就能用来写服务器程序、命令行工具甚至桌面应用了。而npmNode Package Manager是随Node.js一同安装的包管理器你可以把它想象成JavaScript世界的“应用商店”绝大多数JavaScript库和工具都通过它来发布和安装。那么为什么是HomebrewHomebrew是Mac上最受欢迎的包管理器它的设计哲学是“安装苹果没有预装但你需要的东西”。用Homebrew安装Node.js核心优势在于统一管理和便捷更新。你的Mac上可能不止需要Node.js还需要Git、Python、Redis、MySQL等等。如果每个软件都去官网下载、手动配置环境变量不仅繁琐而且容易把系统搞得一团糟。Homebrew就像一个尽职的管家帮你把所有这些“依赖”和“工具”统一安装在/usr/local在Apple Silicon Mac上是/opt/homebrew目录下并用一套简单的命令brew install,brew upgrade,brew uninstall来管理它们。当你需要升级Node.js时一句brew upgrade node就能搞定远比去官网下载新版本、卸载旧版本、再手动清理要省心得多。很多人会提到nvmNode Version Manager它确实在管理多个Node.js版本上非常出色特别适合需要在不同项目间切换不同Node版本的同学。但对于绝大多数开发者尤其是新手或者主要进行现代Web全栈开发的从业者来说一个稳定、统一、易于维护的单一Node.js版本往往更实际。Homebrew提供的正是这种“开箱即用”的体验它安装的Node.js自带npm环境变量自动配置好你几乎不需要做任何额外操作就能开始写代码。这大大降低了入门门槛让你能把精力集中在学习JavaScript和Node.js本身而不是和环境配置作斗争。2. 安装Homebrew避开网络与权限的“深水区”在安装Node.js之前我们必须先请来这位“大管家”——Homebrew。虽然它的安装命令看起来简单但国内网络环境以及Mac系统的权限设置常常会让这个过程变得磕磕绊绊。下面我结合自己的踩坑经验给你梳理一条最稳妥的路径。2.1 官方安装命令与它的“天敌”Homebrew的官方安装命令是下面这一长串/bin/bash -c $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)这条命令的意思是使用curl工具从GitHub下载安装脚本然后交给bashshell来执行。问题就出在raw.githubusercontent.com这个域名上。由于网络原因直接从GitHub下载速度可能极慢甚至直接超时失败你会看到curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused之类的错误。所以我们的第一步不是盲目执行命令而是先解决网络访问问题。有几种备选方案使用国内镜像源推荐这是最一劳永逸的方法。国内高校和社区维护了Homebrew的镜像速度飞快。常用的有中科大USTC和清华Tuna的源。以中科大的安装脚本镜像为例你可以使用以下命令替代官方命令/bin/bash -c $(curl -fsSL https://mirrors.ustc.edu.cn/brew/install.sh)这条命令从国内的镜像服务器下载安装脚本成功率极高。配置终端代理如果你有如果你在终端配置了可靠的网络代理可以确保curl命令能正常访问GitHub。但这对于新手来说配置略显复杂。手动下载脚本备用如果上述镜像地址也访问不畅你可以尝试用浏览器直接打开https://mirrors.ustc.edu.cn/brew/install.sh将脚本内容保存为一个本地文件比如install_brew.sh然后通过终端进入该文件所在目录执行bash ./install_brew.sh。注意无论采用哪种方式请务必从可信的镜像源获取脚本。不要随意执行来路不明的脚本以免安全风险。2.2 执行安装与关键权限授予解决了网络问题执行安装命令后安装程序会做以下几件事检查系统依赖如Xcode Command Line Tools如果没有会提示安装。在/usr/localIntel芯片或/opt/homebrewApple Silicon芯片目录下创建Homebrew的完整目录结构。将Homebrew的可执行文件路径添加到你的Shell配置文件如~/.zshrc或~/.bash_profile中。在这个过程中最关键的一步会出现在最后。安装脚本成功运行完毕后它会在终端里打印出两行至关重要的“Next steps”提示大概长这样 Next steps: - Run these two commands in your terminal to add Homebrew to your PATH: echo eval $(/opt/homebrew/bin/brew shellenv) ~/.zshrc eval $(/opt/homebrew/bin/brew shellenv)请你务必、一定、必须要按照它的提示执行这两条命令我见过太多新手忽略了这一步导致安装完Homebrew后在终端里输入brew系统却回复command not found。这两条命令的作用是第一条将初始化Homebrew环境的命令写入你的Shell配置文件第二条立即在当前终端会话中生效。执行完后务必关闭当前终端窗口再重新打开一个新的终端窗口这是为了让Shell配置文件的改动生效。之后输入brew --version如果能看到版本号恭喜你Homebrew安装成功。2.3 基础操作与健康检查安装成功后你可以用几个简单命令感受一下brew update更新Homebrew自身到最新版本。brew doctor给Homebrew做个体检它会检查你的环境是否有潜在问题如权限冲突、残留配置等。如果报告有Warning可以根据提示处理但通常不影响基本使用。brew search 软件名搜索软件包比如brew search node。至此一个健康可靠的Homebrew环境就准备好了。它将成为你在Mac上管理开发工具的基石。3. 使用Homebrew安装Node.js与npm有了Homebrew安装Node.js就变得异常简单。但“简单”不代表没有细节不同的命令选项和安装后的验证同样藏着一些需要注意的地方。3.1 一行命令完成安装在终端中输入以下命令brew install node对就这么简单。Homebrew会自动处理所有事情从它的软件仓库Tap中查找最新的稳定版Node.js软件包解析其依赖Node.js本身依赖不多然后下载、解压、安装到正确的目录通常是/usr/local/Cellar/node下并链接到/usr/local/bin最后自动配置好环境变量。这里有一个非常重要的细节当你用Homebrew安装node时npm是作为Node.js的一个“依赖”或“组成部分”被自动安装的。你不需要也不应该再单独执行brew install npm。事实上Homebrew的仓库里并没有一个独立的npm包因为npm是Node.js官方的、标准的包管理器已经捆绑在Node.js的发行版中。安装完成后Node.js和npm的可执行文件会被符号链接symlink到/usr/local/bin目录下这个目录通常已经在你的系统PATH环境变量中因此你可以在任何终端位置直接使用node和npm命令。3.2 验证安装结果与版本解读安装完成后我们需要验证一下。分别执行node -v npm -v这两条命令会分别输出Node.js和npm的版本号例如v20.11.0和10.2.4。看到版本号就证明安装成功了。但版本号背后还有信息。Node.js版本号遵循语义化版本规则主版本.次版本.修订版本。偶数主版本号如v18.x, v20.x是长期支持版本LTS意味着它会获得更长时间的安全和维护更新非常适合用于生产环境和新手学习稳定性是第一位的。奇数主版本号如v19.x, v21.x是当前发布版本包含最新的特性但支持周期短。Homebrew默认安装的通常是最新的稳定LTS版本这是比较省心的选择。至于npm它的版本独立于Node.js更新但通常一个Node.js大版本会捆绑一个相应时代的npm。你可以通过npm install -g npmlatest来将npm升级到最新版-g代表全局安装。不过一般情况下除非有特定需求跟随Node.js版本自带的npm已经足够稳定可靠。3.3 安装目录结构与“Cellar”的奥秘了解Homebrew的安装目录有助于你在出问题时进行排查。执行brew --prefix node可以查看Node.js的安装前缀。对于Apple Silicon Mac结果可能是/opt/homebrew/opt/node。这其实是一个指向实际安装目录的符号链接。真正的软件文件被安装在Cellar里。Cellar是Homebrew的核心概念你可以把它理解为一个“酒窖”所有通过Homebrew安装的软件都像一瓶瓶酒一样被整齐地存放在这里。对于Node.js它的实际路径可能是/opt/homebrew/Cellar/node/20.11.0版本号会变化。在这个目录下你会看到标准的Unix软件目录结构bin/,include/,lib/等。而/opt/homebrew/opt/node这个链接永远指向Cellar中当前已激活的Node.js版本。/opt/homebrew/bin目录下的node和npm命令又是指向../opt/node/bin/目录下对应命令的链接。这种多层链接的结构使得版本管理和切换虽然Homebrew对单个软件版本管理不如nvm专业在理论上成为可能也保持了系统路径的整洁。4. 安装后的首要配置为npm提速与初始化Node.js和npm安装成功只是万里长征第一步。默认的npm配置面向全球在国内直接使用可能会因为网络问题导致安装包慢如蜗牛甚至失败。因此安装后的第一件事就是优化npm的配置。4.1 配置npm国内镜像源淘宝源这是提升npm体验最有效的一步。npm默认从 registry.npmjs.org 拉取包国内访问速度不理想。我们可以将其替换为国内的镜像源淘宝NPM镜像https://registry.npmmirror.com/是首选。设置全局镜像源命令如下npm config set registry https://registry.npmmirror.com/执行后你可以通过npm config get registry来验证是否设置成功。除了主要的包 registry对于一些需要从其他地址下载的二进制包比如node-sass、puppeteer自带的Chromium同样可能存在下载慢的问题。我们可以为这些二进制包也配置镜像npm config set sass_binary_site https://npmmirror.com/mirrors/node-sass/ npm config set electron_mirror https://npmmirror.com/mirrors/electron/ npm config set puppeteer_download_host https://npmmirror.com/mirrors/这些配置会被写入到用户主目录下的.npmrc文件中~/.npmrc。你可以用文本编辑器打开这个文件查看所有配置。配置了镜像源后无论是npm install安装项目依赖还是npm install -g全局安装命令行工具速度都会有质的飞跃。4.2 npm的全局安装路径与权限问题当你第一次尝试全局安装一个包时例如npm install -g yarn可能会遇到EACCES权限错误。这是因为npm默认的全局安装目录可以通过npm config get prefix查看可能是一个需要系统管理员权限才能写入的路径如/usr/local。有几种解决方案修改npm的默认全局安装目录推荐将其改到你有完全读写权限的用户目录下。mkdir -p ~/.npm-global npm config set prefix ~/.npm-global然后你需要将新的路径添加到系统的PATH环境变量中。打开你的Shell配置文件如~/.zshrc添加一行export PATH~/.npm-global/bin:$PATH保存后执行source ~/.zshrc或重启终端。这样之后全局安装的包都会在~/.npm-global/bin下且不会遇到权限问题。使用Node.js版本管理器如nvmnvm会将Node.js和全局包完全安装在你的用户目录下从根本上避免权限问题。但这与我们使用Homebrew的初衷简单统一略有背离。使用sudo不推荐用sudo npm install -g强制安装。这种做法可能会引起后续的文件所有权混乱带来更多麻烦应尽量避免。4.3 初始化你的第一个Node.js项目配置好环境后让我们快速体验一下。创建一个项目目录并进入mkdir my-first-node-app cd my-first-node-app运行npm init -y。这个命令会快速生成一个package.json文件-y参数表示全部接受默认选项。package.json是Node.js项目的“身份证”和“清单”记录了项目名称、版本、依赖等信息。现在安装一个流行的Web框架Express作为依赖npm install express观察node_modules文件夹的创建和package.json中dependencies字段的变化。然后创建一个app.js文件写入以下代码const express require(express); const app express(); const port 3000; app.get(/, (req, res) { res.send(Hello World from my Homebrew-installed Node.js!); }); app.listen(port, () { console.log(App listening at http://localhost:${port}); });最后运行node app.js打开浏览器访问http://localhost:3000。如果你看到了“Hello World”消息那么恭喜你的Node.js开发环境已经完全就绪并且成功运行了第一个服务器程序。5. 进阶多版本管理、问题排查与维护对于大多数场景一个全局的Node.js版本足够了。但如果你需要接触不同的老项目或者想尝鲜最新特性就可能需要管理多个Node.js版本。此外维护好这个环境也同样重要。5.1 当需要多个Node.js版本时Homebrew与nvm的抉择Homebrew本身并不是一个专业的Node.js版本管理工具。虽然你可以通过brew install node18来安装特定的老版本如Node.js 18并通过brew link命令切换但这个过程比较手动且容易产生冲突。因此当你有强烈的多版本切换需求时我建议在Homebrew之外额外安装nvm。是的它们可以共存。你可以用Homebrew安装nvmbrew install nvm安装后同样需要按照安装完成后的提示将nvm的初始化脚本添加到你的Shell配置文件中例如在~/.zshrc中添加source $(brew --prefix nvm)/nvm.sh。之后你就可以使用nvm的命令来无缝切换Node.js版本了nvm install 18 # 安装Node.js 18 nvm use 18 # 在当前终端切换到18版本 nvm install 20 # 安装Node.js 20 nvm use 20 # 切换到20版本 nvm alias default 20 # 将20版本设为默认版本这样你可以通过Homebrew管理“系统级”或“基础级”的Node.js通常是最新LTS而用nvm在项目目录中管理特定的版本两者互不干扰。在终端中nvm管理的版本优先级会高于Homebrew安装的版本。5.2 常见问题排查指南即使按照步骤操作你也可能遇到问题。这里是一些常见问题的排查思路command not found: brew说明Homebrew的PATH没有配置成功。请回头仔细检查安装Homebrew最后一步的“Next steps”并确保正确执行了那两条命令且重启了终端。command not found: node或command not found: npm首先确认Homebrew安装Node.js是否成功brew list node。如果已安装可能是/usr/local/bin或/opt/homebrew/bin不在你的PATH中。检查Shell配置文件确保包含了Homebrew的bin目录。对于Apple Silicon Mac确保没有残留的Intel版Homebrew路径干扰。npm install速度极慢或失败99%的原因是网络。请确认是否已正确配置淘宝镜像源npm config get registry。如果已配置仍慢可以尝试npm cache clean --force清空缓存或检查网络连接。有时特定的包可能需要额外的二进制镜像配置。权限错误EACCES如前所述避免使用sudo安装全局包。按照4.2节的方法更改npm全局安装路径到用户目录下。安装特定版本Node.js失败例如brew install node14可能提示该版本已不再被Homebrew core支持。这时可以考虑使用nvm来安装历史版本或者从Node.js官网下载二进制包。5.3 日常维护与卸载一个好的开发习惯是定期维护你的环境更新Homebrew与软件定期运行brew update和brew upgrade。这会更新Homebrew自身并升级所有通过它安装的软件包括Node.js。升级Node.js前注意检查项目依赖是否兼容新版本。清理无用文件Homebrew会保留旧版本的软件“酒瓶”。运行brew cleanup可以删除这些旧版本释放磁盘空间。如何卸载如果你决定彻底移除通过Homebrew安装的Node.js可以运行brew uninstall node。Homebrew会尝试卸载Node.js及其未被其他软件依赖的部分。要卸载Homebrew本身官网提供了卸载脚本。但请注意卸载Homebrew可能会影响其他通过它安装的软件。最后我想分享一点个人体会工具的选择没有绝对的对错只有是否适合当下的你。对于Mac上的Node.js环境搭建Homebrew方案提供了在简单性、统一性和可维护性之间一个极佳的平衡点。它让你能快速拥有一个可工作的环境把时间留给更重要的编码和学习。当你成长到一定阶段自然会遇到需要更精细版本管理的场景那时再引入nvm这样的工具也不迟。环境配置是开发者的基本功但不要让工具本身成为你前进的障碍。希望这篇详尽的指南能帮你顺利迈出Node.js世界的第一步。

相关新闻

校园榜样评选活动全流程策划:从打call机制到价值延伸的实战指南

校园榜样评选活动全流程策划:从打call机制到价值延伸的实战指南

1. 项目概述:一场校园“打call”活动的深度策划与执行“来为你心仪的优秀青年学生标兵打call吧!”——看到这个标题,你脑海里浮现的是什么?是朋友圈里刷屏的投票链接,还是校园公告栏里一张色彩鲜艳的海报?作…

2026/10/18 7:34:46 阅读更多 →
数据挖掘十年演进:从算法到价值,实战趋势与技术栈解析

数据挖掘十年演进:从算法到价值,实战趋势与技术栈解析

1. 从“挖矿”到“炼金”:数据挖掘的十年演进与我的实战观察 十年前,我刚入行时,大家提起数据挖掘,脑海里浮现的往往是“啤酒与尿布”的经典故事,或者是一堆复杂的算法公式。那时候,数据挖掘更像是一门“挖…

2026/10/18 15:40:30 阅读更多 →
使用GIMP为营业执照添加专业水印:从图层原理到安全导出的完整指南

使用GIMP为营业执照添加专业水印:从图层原理到安全导出的完整指南

1. 项目概述:为什么选择GIMP处理营业执照给营业执照加水印,听起来是个简单的操作,但背后涉及的需求其实相当严肃。无论是财务人员、法务顾问,还是中小企业的老板,都可能遇到需要将营业执照副本提供给第三方&#xff08…

2026/10/19 4:17:12 阅读更多 →

最新新闻

三端口固态变压器MPDPC全栈控制架构逆向与实战演训

三端口固态变压器MPDPC全栈控制架构逆向与实战演训

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

2026/10/19 6:40:56 阅读更多 →
开关电源EMC整改的关键:PCB布局高频环路与接地设计要点

开关电源EMC整改的关键:PCB布局高频环路与接地设计要点

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

2026/10/19 6:40:56 阅读更多 →
Pin-to-Pin替代CLRC663实战:迁移成本、射频验证与选型清单

Pin-to-Pin替代CLRC663实战:迁移成本、射频验证与选型清单

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

2026/10/19 6:40:56 阅读更多 →
从零构建递归自我改进系统:自动调优与策略迭代实战

从零构建递归自我改进系统:自动调优与策略迭代实战

递归自我改进这个词,听起来特别像科幻电影里的某种黑科技。但说白了,它就是一个非常朴素的工程循环:让系统自己观察自己的产出,按照一套标准打分,然后针对低分点调整自己的策略,再把调整后的策略带入下一轮…

2026/10/19 6:40:56 阅读更多 →
基于DQN与Matlab的数据中心电力-热力-算力三维协同调度仿真

基于DQN与Matlab的数据中心电力-热力-算力三维协同调度仿真

做数据中心调度优化的仿真不是第一次了,但把电力、热力、算力三个维度同时塞进一个强化学习框架里,确实花了我不少时间。这个项目用 Deep Q-Network 把数据中心当作一个智能体,输入服务器负载、进回水温度、实时电价这些状态,输出…

2026/10/19 6:40:56 阅读更多 →
国产FPGA选型实战指南:从需求分析到型号落地的完整决策流程

国产FPGA选型实战指南:从需求分析到型号落地的完整决策流程

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

2026/10/19 6:39:56 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 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/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54:50 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →