PaRaD1SE

解决Windows Docker环境下Nextjs热更新失效问题

发布时间: 2022/10/13 访问量: 3663

分类: 

开发

用WSL2代替Docker Dev Container并在Windows直接使用Linux文件系统

Windows Docker Desktop

为了在Windows下搭建Linux开发环境,可以使用Windows Docker Desktop创建开发容器Dev Container,然后在开发容器内进行开发,如果项目本身也使用到了Docker,可以在开发容器内安装docker-in-docker或者docker-from-docker,而VSCode编辑器支持快速配置开发容器,使用起来非常方便。

现在,Windows版本的Docker在安装时会默认选择WSL2作为后端,代替Hyper-VWSL2是微软推出的一种Windows子系统,可以在里面安装常用的Linux系统。综合来说,用WSL2会比用Hyper-V运行起来快一些,推荐使用WSL2作为后端。

Nextjs热更新失效问题

在使用Windows Docker Desktop创建开发容器Dev Container后,发现Nextjs出现热更新失效的问题,每次修改代码后,都需要手动重启容器才能看到修改后的效果。虽然我们可以通过在next.config.js里添加如下配置来暂时性地解决这个问题,


但是这样做会导致Nextjs的热更新变得非常慢,每次修改代码后,都需要等待大概几十秒钟才能看到修改后的效果。这是因为这个配置是开启了使用webpack的watch模式来监听文件变化,而最新版的Nextjs已经不再使用webpack来编译代码了,而是使用比webpack快6到7倍的Rust SWC

原因

我习惯在Windows本地拉代码,然后用Dev Container打开Windows本地的代码,这样做实际上是将Windows文件系统转换成Linux版,然后以数据卷volume的形式mount到容器的文件系统里,然后在开发容器内修改代码。这样我修改的代码就会同步到Windows本地,这样就可以在Windows本地使用git来提交代码了。

问题出在WSL2mountLinux上的文件系统的改变的监听上。这是一个已知的待解决的问题,详细可以参考这里。简单来说就是,WSL2目前仍然无法监听到从WindowsmountLinux上的文件系统的改变,所以Nextjs热更新失效了。

解决办法

抛弃DockerDev Container,直接在WSL2 Linux上拉代码,目前Windows已经支持在资源管理器直接打开已安装的WSL2 Linux文件系统,所以可以直接通过资源管理器打开Linux目录然后在里面创建文件夹放项目代码,一般确保代码不在/mnt/c/Users/...这样的目录下,就不会出现这个问题了。

上述的操作也可以通过VSCodeRemote - WSL插件来轻松完成,可以在VSCode里直接打开Linux目录和终端。

要注意的是如果安装了WSL2后端的Windows Docker Desktop,那么在WSL Linux里可以直接使用docker命令,而不需要再次安装。在WSL Linux里启动的Docker容器,都会出现在Windows Docker Desktop的容器列表里。这相当于Dev Container里的docker_from_docker的表现。

终于可以打游戏搞开发两不误了,不用双系统切来切去了23333

标签:

Docker
开发
网站
WSL
Nextjs

上一篇

下一篇