解决Windows Docker环境下Nextjs热更新失效问题
开发
Windows Docker Desktop
为了在Windows
下搭建Linux
开发环境,可以使用Windows Docker Desktop
创建开发容器Dev Container
,然后在开发容器内进行开发,如果项目本身也使用到了Docker
,可以在开发容器内安装docker-in-docker
或者docker-from-docker
,而VSCode
编辑器支持快速配置开发容器,使用起来非常方便。
现在,Windows
版本的Docker
在安装时会默认选择WSL2
作为后端,代替Hyper-V
。WSL2
是微软推出的一种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
来提交代码了。
问题出在WSL2
对mount
到Linux
上的文件系统的改变的监听上。这是一个已知的待解决的问题,详细可以参考这里。简单来说就是,WSL2
目前仍然无法监听到从Windows
上mount
到Linux
上的文件系统的改变,所以Nextjs
热更新失效了。
解决办法
抛弃Docker
的Dev Container
,直接在WSL2 Linux
上拉代码,目前Windows
已经支持在资源管理器直接打开已安装的WSL2 Linux
文件系统,所以可以直接通过资源管理器打开Linux
目录然后在里面创建文件夹放项目代码,一般确保代码不在/mnt/c/Users/...
这样的目录下,就不会出现这个问题了。
上述的操作也可以通过VSCode
的Remote - WSL
插件来轻松完成,可以在VSCode
里直接打开Linux
目录和终端。
要注意的是如果安装了WSL2
后端的Windows Docker Desktop
,那么在WSL Linux
里可以直接使用docker
命令,而不需要再次安装。在WSL Linux
里启动的Docker
容器,都会出现在Windows Docker Desktop
的容器列表里。这相当于Dev Container
里的docker_from_docker
的表现。
终于可以打游戏搞开发两不误了,不用双系统切来切去了23333
标签:
上一篇
下一篇