node.js - 如何使 nodemon 与 WSL 2 一起工作?

标签 node.js windows-subsystem-for-linux nodemon ubuntu-20.04 wsl-2

自从使用 Windows 10 April 2020 更新从 WSL 1 更新到 WSL 2(之后将 Ubuntu 18 更新到 Ubuntu 20)后,我一直无法获得 nodemon当项目目录中有文件更改时热重新加载。当我对 .js 进行任何更改时文件,没有重新启动服务器或终端输出:
enter image description here
我用 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 建议的那样。

  • 尝试从默认的 ext4 文件系统运行(例如 mkdir -p $HOME/Projects/testserver )。请注意,指向 Windows 文件系统的符号链接(symbolic link)仍然不起作用。作为奖励,对于像 git 这样的文件密集型操作,WSL ext4 文件系统将更快。

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

  • 将 Visual Studio Code 与 Remote-WSL extension 一起使用在 Windows 文件系统上编辑您的源代码。最简单的方法是在 WSL 中导航到您的项目目录并运行 code . .
    由于某种原因,Visual Studio Code 的 WSL 集成确实会触发 inotify。

  • 如果您不需要任何 WSL2 功能,请将 session 降级到 WSL1。我保留了 WSL1 和 WSL2 session 。最好的方法是使用 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/

    相关文章:

    node.js - 无法让 nodemon/ts-node-dev 在 dockerized 平均堆栈上工作

    node.js - Linux 上需要 ('os' ).homedir() 错误

    visual-studio-code - 我无法在 Win Subsystem for Linux 的 Visual Studio Code 中创建文件或目录

    node.js - 使用 grunt-express-server 和 grunt-contrib-watch 进行实时重新加载

    bash - 从 Visual Studio 2015 开始基于 WSL bash 的构建

    Node.js - nodemon vs node - 开发与生产

    node.js - 尝试连接调试器时 Azure Functions 崩溃,导致 nodemon 永久重新加载

    node.js - npm install 忽略自己的 ssh+git 存储库

    Node.js 安装失败。日志在哪里?