在 Windows 上配置开发环境,长期以来都不是一件足够“干净”的事情。
Java、Node.js、Python、数据库、Shell 工具链、Docker 这一整套开发基础设施,本身更接近 Unix 生态。Windows 当然可以承载这些工具,但经常需要额外处理环境变量、路径、权限、服务、缓存目录和版本切换。最典型的是全局环境状态。
JAVA_HOMEMAVEN_HOMEGRADLE_USER_HOMEPATH、npm cache、pip cache、Conda env、数据库 data 目录……这些配置单独看都不复杂,但它们会逐渐散落到系统的不同位置。项目数量增加之后,版本冲突、C 盘占用、卸载残留、路径污染都会变成持续存在的问题。
开发环境不应该依赖一堆隐式的系统状态。更合理的方式,是把运行时、依赖和项目数据控制在一个边界明确的环境里。

开发环境需要边界

一个理想的本地开发环境,至少应该满足几个条件:
  • 开发工具链和日常桌面系统隔离。
  • 本地运行环境尽量接近服务器和容器环境。
  • 依赖、缓存、构建产物有明确归属。
  • 不工作时不污染主系统状态。
直接使用 Linux 或 macOS 是最直接的答案。但在很多场景下,Windows 仍然是主力桌面系统:游戏、驱动、外设、办公软件、显卡工具和厂商生态都更省心。
WSL2 的定位正好处在两者之间:Windows 负责桌面体验,Linux 负责开发环境。
WSL2 最有价值的地方,是把开发环境从 Windows 主系统里拆出来。

不建议把 Windows 适配经验当成学习主线

很多初学者在学习 Java、Python、Node.js 时,第一步往往不是语言本身,而是 Windows 环境配置:安装 JDK、配置 JAVA_HOME、安装 Maven、修改本地仓库、安装 MySQL、配置系统服务、安装 Git Bash,再补一套类 Unix 命令体验。
这条路线可以跑通,但会引入大量一次性的 Windows 适配经验。这些经验对理解语言、构建系统、服务部署、容器化并没有太多帮助;当项目部署到 Linux 服务器,或 CI/CD 跑在 Linux 容器中时,本地 Windows 环境的很多细节又会失效。
对于 Python、Java、Node.js、Docker 这类常见开发栈,最终运行环境通常仍然是 Linux。学习阶段直接进入 WSL2,可以减少不必要的环境差异。
初学阶段最应该减少的是环境噪音。工具链应该服务于语言、框架和工程实践,而不是反过来消耗注意力。

WSL2 解决的是系统污染问题

WSL2 的优势不在于“更高级”,而在于边界清楚。
问题
Windows 主系统硬装
WSL2
工具链版本
容易污染全局 PATH
保留在 Linux 用户空间内
依赖缓存
散落在 C 盘和各类隐藏目录
集中在 WSL2 文件系统中
Shell 体验
PowerShell、Git Bash、MSYS2 混用
直接使用 Linux shell
部署一致性
本地和线上差异更大
更接近服务器和容器环境
系统状态
开发工具长期占用主系统
不使用时基本无感
一种更清晰的使用方式是:Windows 中只保留 IDE、浏览器、通信工具和必要桌面软件;项目代码、运行时、依赖、数据库、脚本和容器相关操作都放在 WSL2 内。
项目目录必须放在 WSL2 的 Linux 文件系统中,例如 ~/projects。不要把项目放在 Windows 盘,再通过 /mnt/c 从 WSL2 里访问。
这条规则可以直接当成硬约束。前端项目的 node_modules、Java 项目的 Gradle 缓存、Python 虚拟环境都会产生大量小文件读写。项目一旦放在 Windows 文件系统上,依赖安装、构建、热更新、测试和 IDE 索引都会被跨文件系统访问拖慢。
项目目录规则
允许:~/projects/my-app
禁止:/mnt/c/Users/xxx/Desktop/my-app
Windows 访问 WSL2 文件可以使用 \\wsl$,IDE 也可以直接打开 WSL 项目。项目目录只能留在 Linux 文件系统内,不要为了在资源管理器里顺手,把项目放回 Windows 盘。

IDE 支持已经足够成熟

VS Code 对 WSL 的支持已经非常成熟,Remote WSL 基本可以视为官方级工作流。
JetBrains 系列也能使用 WSL 内部的 SDK、解释器和构建工具。Java / Kotlin 项目可以使用 WSL 内的 JDK 和 Gradle,Python 项目可以使用 WSL 内的解释器,Node.js 项目可以使用 WSL 内的 npm、pnpm 或 yarn。
IDE 能无感接入 WSL2,是这套方案成立的关键。否则 WSL2 只能作为独立终端存在,无法真正进入日常开发链路。

Docker 更适合留在 Linux 侧

Docker 本身属于 Linux 生态。虽然 Docker Desktop 已经让 Windows 上的 Docker 体验足够简单,但其 WSL2 backend 才是更自然的运行方式。
在 WSL2 中编写项目、执行 docker compose up,由 Docker Desktop 管理后端,IDE 正常连接,是大多数场景下最省心的方案。相比在 Windows 主系统里处理路径挂载、换行符、权限和端口问题,WSL2 的边界更清晰。
也可以在 WSL2 内直接安装 Docker Engine。这个方案更接近原生 Linux,但维护成本略高,适合对 Docker 运行环境有更强控制需求的场景。

WSL2 并不完美

WSL2 并不完美,它只是把问题收敛到了更合理的位置。
  • WSL2 的磁盘仍然会增长,只是被限制在虚拟磁盘边界内。
  • 跨文件系统访问应尽量减少,尤其是项目目录。
  • 网络、代理、端口转发在部分场景下仍然需要额外配置。
  • WSLg 可以运行 Linux GUI 应用,但 WSL2 更适合作为开发运行环境,而不是第二套桌面系统。
这些问题需要理解,但相比把 Windows 主系统改造成半个 Linux,它们更可控,也更容易定位。

起步配置

安装 WSL2 本身并不复杂:
发行版选择 Ubuntu 即可。进入 WSL2 后,先安装基础工具链:
之后按项目需要补充工具:
  • Java:使用 sdkman 管理 JDK、Maven、Gradle。
  • Node.js:使用 fnm 管理版本。
  • Python:在 uvpyenv、Conda 中选择一种主方案,避免混用。
  • 数据库和中间件:优先使用 Docker Compose。
开发环境不需要一开始就装满。工具越多,全局状态越复杂;按项目补齐,反而更容易维护。

结尾

WSL2 更像是一条工程边界
Windows 保持桌面系统的职责,Linux 承接开发工具链、依赖、容器和脚本。两侧职责清楚之后,本地开发环境会少很多隐式状态,也更接近真实部署环境。
对于仍在 Windows 主系统中维护大量 JDK、Node.js、Python、数据库、环境变量和缓存目录的开发方式,WSL2 是一个更合理的默认选项。