自从使用 Windows 10 April 2020 更新从 WSL 1 更新到 WSL 2(之后将 Ubuntu 18 更新到 Ubuntu 20)后,我一直无法获得 nodemon
当项目目录中有文件更改时热重新加载。当我对 .js
进行任何更改时文件,没有重新启动服务器或终端输出:
我用 nodemon
启动我的 Node.js 服务器像这样:
NODE_ENV=development DEBUG='knex:*' nodemon --verbose --inspect ./server.js"
如果它有用,这里是我的 server.js :const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server started and listening on port ${PORT}`);
});
我什至不确定如何进一步解决此问题以获得有关正在发生的事情的更多有用信息。
最佳答案
根本原因:
WSL2 上的 9P 文件系统协议(protocol)不完全支持 inotify。
WSL 项目上有几个与此相关的 github 问题,但可能最相关的是 #4739 .
可能的解决方法:
nodemon -L
(又名 --legacy-watch
)正如 Simperfy 建议的那样。mkdir -p $HOME/Projects/testserver
)。请注意,指向 Windows 文件系统的符号链接(symbolic link)仍然不起作用。作为奖励,对于像 git 这样的文件密集型操作,WSL ext4 文件系统将更快。您仍然可以通过
\\wsl$\
从 Windows 编辑器和工具访问源代码。 .code .
.由于某种原因,Visual Studio Code 的 WSL 集成确实会触发 inotify。
wsl --export
创建 session 备份。和 wsl --import
.您可以随时使用 wsl --set-version
切换 WSL 发行版的版本。 .我确实在 WSL1 上使用 Windows 文件系统下的示例项目对此进行了测试,并且在 Windows 下通过诸如 notepad.exe 之类的基本内容进行编辑仍然会触发 nodemon 重新启动。
更长的答案:
nodemon 在根 (
/
) ext4 挂载 (例如 $HOME/src/testserver
) 上的 WSL2 上为我“开箱即用”地工作。当我在默认
/mnt/c
下尝试时,它也可以正常工作WSL/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
运行nodemon
从此挂载失败的方式与您描述的相同-对源的更改未触发重新启动。但是,使用
nodemon -L
运行更改源文件时,在此安装上确实触发了重新启动。也可以通过安装不同的选项来解决问题,但我现在不确定。 编辑 - 鉴于 Github 上的错误报告,似乎不太可能。
此外,您可能希望创建一些 WSL session 的导出/备份。此时为时已晚(对于您之前的安装),但您可以运行
wsl.exe --export
在升级之前创建 Ubuntu 18.04/WSL1 文件系统的备份。您还可以使用 wsl.exe --set-version
更改特定发行版的版本。 .这可以为您提供更好的“之前/之后”测试比较。
关于node.js - 如何使 nodemon 与 WSL 2 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63402588/