devAlice
← Windows

Windows 上的 Node.js — 原生 vs WSL2,该选哪个?

原生 Windows Node.js 与 WSL2 Linux Node.js 的差异——安装、故障排查,以及按项目类型划分的决策表。

在 Windows 上运行 Node.js 时,第一个问题往往是:「安装在 WSL2 Linux 里,还是直接安装在 Windows 上?」两者都能用,但性能、工具兼容性和调试体验差异显著。本指南对比两种环境,给出决策规则,并讲解两种安装方式。

我认为这个选择的核心不在于 Node.js 本身,而在于你的目标平台。以前很多人直接在 Windows 原生环境安装;如今 Web 开发选 WSL2、桌面应用选原生,因为工具链对运行环境的假设决定了最终选择。

适用对象:在 Windows 11 上编写 JavaScript/TypeScript 的开发者。假设已完成 Windows 初始设置

TL;DR

场景选择
Next.js · React · Express · NestJS · Vite · 通用 Web 后端WSL2 Linux Node
Electron · Tauri 桌面应用原生 Windows Node
公司 CI 是 LinuxWSL2 Linux Node
依赖 Windows 专属原生模块原生 Windows Node
学习 / 入门WSL2 Linux Node(与 Mac 指南保持一致)

经验法则:生产环境反正是 Linux,在 WSL2 中开发可以贴近生产环境。没有强烈的反对理由,就选 WSL2。

前置条件

1. 原生 vs WSL2 — 核心差异

性能

操作原生 NodeWSL2 Node
npm install(1000 个包)25s15s
next dev 首次编译5s2s
HMR(热模块替换)800ms+300ms
jest 1000 个测试25s18s
文件监听稳定但偏慢快速但偶尔漏事件

WSL2 的 ext4 在 Node 产生的「大量小文件读取」模式下完胜 NTFS。注意:在 WSL2 内挂载 Windows 文件(/mnt/c/...)反而比原生更慢——详见第 6.2 节。

工具兼容性

工具原生 WindowsWSL2
node-gyp 构建(原生模块)需要 Visual Studio Build Tools标准 build-essential
sharp · canvas · node-sass预构建二进制包经常缺失始终可用
playwright可用可用(Linux 浏览器)
puppeteer可用可用(单独安装 Chrome)
Docker通过 Docker Desktop直接使用 docker CLI

调试体验

方面原生WSL2
VS Code 调试器开箱即用需要 Remote-WSL 扩展
Chrome DevTools直接访问 localhost:3000自动转发 WSL2 → Windows
环境变量.env 可用.env 可用
路径分隔符C:\Users\...(反斜杠)/home/...(正斜杠)

2. 决策表

选 WSL2 的情况

  • 生产环境是 Linux — Vercel / AWS / GCP / Heroku 覆盖了 99% 的情况
  • 大量使用 node-gyp 模块sharpcanvas@tensorflow/tfjs-node
  • 需要快速的 dev server + HMR — 日常开发最直观的差异
  • CI 运行 Ubuntu/Alpine — 在 Linux 上开发确保 CI 通过
  • 与 Mac 用户协作 — 几乎完全相同的(POSIX)环境

选原生 Windows 的情况

  • 构建 Electron 桌面应用 — 生成 Windows 二进制文件
  • Tauri Windows 构建 — Rust + WebView2
  • Windows 专属 API — COM、注册表访问
  • 简单自动化脚本 — Notepad 自动化等
  • 低配机器上 VS Code Remote-WSL 太慢

或者两者都用

常见做法:WSL2 用于工作项目,原生用于桌面侧项目。无冲突——PATH 相互独立。


3. WSL2 Node.js 安装(推荐)

3.1 进入 WSL Ubuntu

wsl -d Ubuntu-24.04

3.2 mise 安装 Node(推荐)

# 安装 mise(语言版本管理器)
curl https://mise.run | sh
echo 'eval "$(/home/$USER/.local/bin/mise activate bash)"' >> ~/.bashrc
exec bash
 
# 安装 Node
mise use --global node@22
node --version    # v22.x

更多关于 mise 的内容:mac/dev-toolchain——在 Linux 上用法相同。

3.3 或使用 nvm

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
exec bash
nvm install --lts
nvm use --lts

3.4 或使用 apt(系统包)

curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs

⚠️ apt 方式切换版本不方便,且依赖 sudo。优先选择 mise 或 nvm。

3.5 pnpm · yarn

npm install -g pnpm yarn

3.6 验证

node --version    # v22.x
npm --version
pnpm --version
which node        # ~/.local/share/mise/installs/node/22/bin/node(使用 mise 时)

4. WSL2 + VS Code 集成

4.1 Remote-WSL 扩展

VS Code 扩展:

  • WSLms-vscode-remote.remote-wsl

安装后,命令面板 → WSL: Connect to WSL → 选择 Ubuntu。

或者,从 WSL Ubuntu 内:

cd ~/projects/myapp
code .

VS Code 在 Windows 上打开,后端运行在 WSL2 中。

4.2 效果

  • node / npm / pnpm 在 WSL2 内执行
  • 文件存储在 WSL2 的 ext4 上(~/projects/myapp
  • 终端是 WSL2 bash
  • 调试器和扩展在 WSL2 侧运行

不要在 Windows 文件系统(C:\)下工作——性能会急剧下降。


5. 原生 Windows Node.js 安装

5.1 winget 安装

# 最新 LTS
winget install OpenJS.NodeJS.LTS
 
node --version    # v22.x

5.2 或使用 fnm(版本管理器)

winget install Schniz.fnm
 
# 从 PowerShell profile 自动激活
notepad $PROFILE
# 添加:
# fnm env --use-on-cd | Out-String | Invoke-Expression

根据 .nvmrc / package.json#engines.node 自动切换版本。

5.3 或使用 NVM for Windows

winget install CoreyButler.NVMforWindows
 
nvm install lts
nvm use lts

nvm-windows 是与 Unix nvm 独立的项目,命令类似。

5.4 构建工具(用于编译原生模块)

构建 sharp / canvas / bcrypt 等需要:

winget install Microsoft.VisualStudio.2022.BuildTools

或:

npm install -g windows-build-tools  # 已弃用——优先使用 Visual Studio Build Tools

5.5 验证

node --version
npm --version
pnpm --version

6. 常见陷阱

6.1 两者都安装了,不知道运行的是哪个

WSL2 有自己的 node,Windows 有自己的 node——不同终端版本不同。解决方法:

  • WSL bash 内,使用 WSL 的 Node(which node~/.local/share/mise/...
  • PowerShell 内,使用原生 Node(Get-Command nodeC:\Program Files\nodejs\...
  • 固定 VS Code 终端默认值(terminal.integrated.defaultProfile.windowsUbuntu (WSL)

6.2 Windows 文件系统挂载速度慢

在 WSL2 中从 /mnt/c/Users/me/projects/myapp 工作,I/O 速度慢 5–10 倍。

# 慢(不推荐)
cd /mnt/c/Users/me/projects/myapp
npm install
 
# 快(推荐)
cp -r /mnt/c/Users/me/projects/myapp ~/projects/
cd ~/projects/myapp
npm install

一次性将现有 Windows 文件夹项目迁移到 WSL2。

6.3 换行符问题(CRLF vs LF)

在 WSL2 中编辑 → 提交 → 在 Windows 中打开同一文件 → 可能注入 CRLF。修复:

git config --global core.autocrlf input    # 在 WSL2 内

更多内容:/multi-os/git-line-endings

6.4 npm install -g 报 EACCES 错误

# 在 WSL2 内——修改 npm prefix
mkdir -p ~/.npm-global
npm config set prefix ~/.npm-global
echo 'export PATH=$HOME/.npm-global/bin:$PATH' >> ~/.bashrc
exec bash

原生 Windows 请使用管理员 PowerShell。


7. 验证(无论选哪个环境)

# WSL2 或 PowerShell
node --version
npm --version
 
# 创建 package.json + 安装依赖 + 运行
mkdir hello-node && cd hello-node
npm init -y
npm install express
cat > index.js <<'EOF'
const express = require('express');
const app = express();
app.get('/', (req, res) => res.send('hello'));
app.listen(3000, () => console.log('http://localhost:3000'));
EOF
node index.js
# → 浏览器访问 localhost:3000 → 显示「hello」

成功即安装完成。


8. 故障排查

Cannot find module 'sharp'(或其他原生模块)

  • 原生 Windows:安装 Visual Studio Build Tools,然后 npm rebuild
  • WSL2:sudo apt install build-essential,然后 npm rebuild

WSL2 中的 dev server 无法从 Windows 浏览器访问

  • 让应用绑定 0.0.0.0::(例如 next dev -H 0.0.0.0
  • Windows 11 22H2+ 会自动转发;更早版本通过 localhost 访问

pnpm 命令找不到(PATH 问题)

  • 找到 npm install -g 放置二进制文件的位置并加入 PATH
  • 原生:npm config get prefix<prefix>\bin
  • WSL2:$HOME/.npm-global/bin 或 mise 路径

node-gyp 构建提示「Python not found」

  • 原生 Windows:winget install Python.Python.3.12
  • WSL2:sudo apt install python3 python3-pip

能从 WSL2 构建 Electron 吗?

可以,但很复杂。Electron 打包会生成主机 OS 的产物(.exe / .app / .deb),所以 Windows 构建在原生 Windows 上做,Linux 构建在 WSL2 中做。Electron 优先选原生 Windows。

Next.js dev server 不断重启(WSL2)

不要在 /mnt/c/ 下工作(第 6.2 节)。也可以使用 turbopack 或在 next.config.ts 中配置 webpackDevMiddleware 选项。


9. 下一步


参考资料

更新日志

  • 2026-05-16:初稿。WSL vs 原生对比 + 两种安装路径 + 四个陷阱 + 六个故障排查案例。