Node.js 如何让nodemon与WSL2一起工作?

Node.js 如何让nodemon与WSL2一起工作?,node.js,windows-subsystem-for-linux,nodemon,ubuntu-20.04,wsl-2,Node.js,Windows Subsystem For Linux,Nodemon,Ubuntu 20.04,Wsl 2,自从用Windows 2020年4月10日的更新从WSL 1更新到WSL 2(然后将Ubuntu 18更新到Ubuntu 20),当项目目录中有文件更改时,我一直无法使nodemon进行热重新加载。当我对.js文件进行任何更改时,不会重新启动服务器或在终端上进行输出: 我用nodemon启动Node.js服务器,如下所示: NODE\u ENV=development DEBUG='knex:'nodemon--verbose--inspect./server.js” 如果有用,下面是我的s

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

我用
nodemon
启动Node.js服务器,如下所示:

NODE\u ENV=development DEBUG='knex:'nodemon--verbose--inspect./server.js”
如果有用,下面是我的server.js

const-PORT=process.env.PORT | 3000;
应用程序侦听(端口,()=>{
log(`Server started and listing on port${port}`);
});
我甚至不知道如何进一步排除故障,以获得关于发生了什么的更多有用信息。

根本原因: WSL2上的9P文件系统协议不完全支持inotify

WSL项目中有几个与此相关的github问题,但可能最相关的是

可能的解决办法:
  • 按照Simperfy的建议,尝试使用
    nodemon-L
    (也称为
    ——传统手表
    )。

  • 请尝试从默认的ext4文件系统(例如,
    mkdir-p$HOME/Projects/testserver
    )运行。请注意,到Windows文件系统的符号链接仍然不起作用。另外,WSL ext4文件系统对于像git这样的文件密集型操作会快得多。

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

  • 使用Visual Studio代码在Windows文件系统上编辑源代码。最简单的方法是在WSL中导航到项目目录并运行Code.

    VisualStudio代码的WSL集成确实会出于某种原因触发inotify。

  • 如果您不需要任何WSL2功能,请将会话降级为WSL1。我保留WSL1和WSL2会话。最好的方法是使用
    wsl--export
    wsl--import
    创建会话备份。您可以在任何时候使用
    wsl--set version
    切换wsl发行版的版本。

    我用Windows文件系统下的一个示例项目在WSL1上测试了这一点,并且在Windows下通过notepad.exe等基本工具进行编辑仍然会触发nodemon重新启动

  • 详细回答: nodemon在根(
    /
    )ext4挂载(例如,
    $HOME/src/testserver
    )上的WSL2上为我“开箱即用”

    当我在WSL/WSL2创建的默认
    /mnt/c
    挂载下尝试它时,它也能正常工作。当然,
    /mnt/c
    在WSL2下的速度要慢得多。编辑-结果表明,我在尝试此操作时使用的是Visual Studio代码。从Windows文件系统上的其他Windows应用程序进行编辑不会触发nodemon重新启动

    但是看一下屏幕截图的第一行,我看到您是从
    /c/Users/
    运行这个挂载的……我想您创建这个(可能是CIFS)挂载是为了解决WSL2性能问题——这是一个常见的解决方法

    我没有设置CIFS装载,但通过装载(替换您的Windows用户名),我可以重现您的问题:

    从该装载运行
    nodemon
    失败的方式与您描述的相同——对源代码的更改不会触发重新启动

    但是,在这个挂载上运行
    nodemon-L
    确实会在源文件更改时触发重新启动

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


    此外,您可能需要创建WSL会话的一些导出/备份。现在已经太迟了(对于您以前的安装),但您可以在升级之前运行
    wsl.exe--export
    来创建Ubuntu 18.04/WSL1文件系统的备份。您还可以使用
    wsl.exe--set version
    更改特定发行版的版本。这可能会给您一些更好的“之前/之后”测试比较。

    在我这边修复了这种方法

    尝试使用
    -g
    标志和
    sudo

    sudo npm安装-g nodemon
    
    我正在使用WSL2,通过添加以下env变量解决了这个问题:CHOKIDAR\u USEPOLLING=true。

    这是我的nodemon命令的外观:

    CHOKIDAR_USEPOLLING=true nodemon index.js
    

    现在您可以保留WSL2而不是将您的环境移动到WSL1。

    您是否尝试过
    nodemon-L
    ?@Simperfy,您是对的,它与
    nodemon-L
    一样工作,谢谢您。我为什么需要使用旧版watcher?添加了“为什么?”“我的回答是——事实证明WSL2在Windows文件系统上不完全支持inotify(由9P文件系统协议处理)。非常好的解释,谢谢。正如您所想,它在
    nodemon--legacy-watch
    上可以正常工作。您能否告诉我如何修复此问题,以便不需要传统的监视程序?我执行了
    cd$HOME/Projects/testserver
    ,然后在没有
    -l
    的情况下运行了
    nodemon
    ,但它无法再次识别文件更改。我应该提到,Projects是一个符号链接:除了--legacy-watch之外,还添加了一些变通方法。此外,符号链接仍然意味着源代码位于Windows文件系统上,并且将出现inotify问题(如您所见)。您必须真正使用WSL2ext4文件系统才能获得全面的inotify支持。同样,回答得很好,谢谢。我想提到的是,我在导航到
    cd$HOME/Projects/testserver
    (同样
    Projects
    是一个符号链接)之后,然后键入
    code。
    在状态栏中以
    WSL:Ubuntu
    开头,文件更改仍然无法识别(
    CHOKIDAR_USEPOLLING=true nodemon index.js