如何使 nodemon 与 WSL 2 一起使用?

Raj*_*Raj 4 node.js nodemon windows-subsystem-for-linux wsl-2 ubuntu-20.04

自从使用 Windows 2020 年 4 月 10 日更新从 WSL 1 更新到 WSL 2(然后将 Ubuntu 18 更新到 Ubuntu 20)以来,nodemon当项目目录中的文件发生更改时,我一直无法进行热重载。当我对.js文件进行任何更改时,不会重新启动服务器或在终端输出:

在此处输入图片说明

我用nodemon这样的方式启动我的 Node.js 服务器:

NODE_ENV=development DEBUG='knex:*' nodemon --verbose --inspect ./server.js"
Run Code Online (Sandbox Code Playgroud)

如果它有用,这是我的server.js

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server started and listening on port ${PORT}`);
});
Run Code Online (Sandbox Code Playgroud)

我什至不确定如何进一步解决此问题以获取有关正在发生的事情的更多有用信息。

Not*_*1ds 17

根本原因:

WSL2 上的 9P 文件系统协议不完全支持 inotify。

WSL 项目上有几个与此相关的 github 问题,但也许最相关的是#4739

可能的解决方法:

  1. 按照 Simperfy 的建议尝试nodemon -L(又名--legacy-watch)。

  2. 尝试从默认的 ext4 文件系统(例如mkdir -p $HOME/Projects/testserver)运行。请注意,指向 Windows 文件系统的符号链接仍然无效。作为奖励,WSL ext4 文件系统对于 git 等文件密集型操作将快得多。

    您仍然可以通过 Windows 编辑器和工具访问源代码\\wsl$\

  3. 使用带有Remote-WSL 扩展的Visual Studio Code来编辑 Windows 文件系统上的源代码。最简单的方法是在 WSL 中导航到您的项目目录并运行code ..

    由于某种原因,Visual Studio Code 的 WSL 集成确实会触发 inotify。

  4. 如果您不需要任何 WSL2 功能,请将会话降级到 WSL1。我同时保留 WSL1 和 WSL2 会话。要做到这一点,最好的方法是创建一个会话的备份wsl --exportwsl --import。您可以随时使用wsl --set-version.

    我确实在 WSL1 上使用 Windows 文件系统下的示例项目对此进行了测试,并且在 Windows 下通过诸如 notepad.exe 之类的基本内容进行编辑仍会触发 nodemon 重新启动。

更长的答案:

nodemon 在根 ( /) ext4 挂载 ( 例如$HOME/src/testserver)上的 WSL2 上为我“开箱即用” 。

当我在/mnt/cWSL/WSL2 创建的默认挂载下尝试它时,它也能正常工作。当然,/mnt/c很多慢下WSL2。 编辑- 事实证明,当我尝试这样做时,我正在使用 Visual Studio Code。从 Windows 文件系统上的其他 Windows 应用程序进行编辑不会触发 nodemon 重新启动。

但是查看屏幕截图的第一行,我看到您正在从/c/Users/...运行它。我想也许您创建了这个(可能是 CIFS)挂载以尝试解决 WSL2 性能问题 - 这是一种常见的解决方法。

我没有设置 CIFS 挂载,但我能够通过挂载(替换您的 Windows 用户名)来重现您的问题:

mkdir $HOME/mnttest
sudo mount -t drvfs 'C:' $HOME/mnttest
cd $HOME/mnttest/Users/Raj/Projects/testserver
Run Code Online (Sandbox Code Playgroud)

nodemon从此安装运行失败,方式与您描述的相同 - 对源的更改未触发重新启动。

但是,nodemon -L在此安装上运行时确实会在更改源文件时触发重新启动。

也可以通过安装不同的选项来解决问题,但我现在不确定。 编辑- 鉴于 Github 上的错误报告,这似乎不太可能。

此外,您可能希望为 WSL 会话创建一些导出/备份。现在为时已晚(对于您之前的安装),但您可以wsl.exe --export在升级之前运行以创建 Ubuntu 18.04/WSL1 文件系统的备份。您还可以使用wsl.exe --set-version. 这可以为您提供更好的“之前/之后”测试比较。

  • 非常好的解释,谢谢。正如您所想,它与“nodemon --legacy-watch”一起按预期工作。你能告诉我如何解决这个问题,这样就不需要遗留观察程序了吗? (2认同)
  • 再次,很好的答案,谢谢。我确实想提一下,导航到“cd $HOME/Projects/testserver”(同样,“Projects”是一个符号链接),然后输入“code .”,这会在状态栏中使用“WSL:Ubuntu”启动 VSCode:https ://i.imgur.com/lv9WQUa.png ,文件更改仍然无法识别(热重载仍然不起作用)。 (2认同)
  • 多谢!`nodemon -L index.js` 工作完美。Win 10、WSL2 (Ubuntu 20) (2认同)

小智 5

我正在使用 WSL 2,并通过添加以下环境变量解决了该问题:CHOKIDAR_USEPOLLING=true。

这就是我的 nodemon 命令的样子:

CHOKIDAR_USEPOLLING=true nodemon index.js
Run Code Online (Sandbox Code Playgroud)

现在,您可以保留 WSL2,而不是将环境移至 WSL1。

  • 这不是与 Simperfy 的原始评论(和我的答案)中提到的“nodemon -L”或“nodemon --legacy-watch”具有完全相同的效果,只是需要输入更多内容吗?不过,如果将环境变量添加到启动脚本中,则可以使用该环境变量在所有会话中将其关闭。 (2认同)