监视模式与 HMR
Deno 内置了文件监视器,因此在编辑时你不需要 nodemon 或任何其他外部工具来重新加载程序。本页将介绍会被监视的内容、如何排除路径,以及热模块替换。
监视模式 Jump to heading
你可以为 deno run、deno test 和 deno fmt 提供 --watch 标志,以启用内置文件监视器。该监视器会在检测到源文件发生变化时自动重新加载你的应用程序。这在开发过程中尤其有用,因为它可以让你无需手动重启应用程序,就能立即看到更改的效果。
deno run --watch main.ts
deno test --watch
deno fmt --watch
被监视的文件将取决于所使用的子命令:
- 对于
deno run和deno test,会监视入口点以及入口点静态导入的所有本地文件。 - 对于
deno fmt,会监视作为命令行参数指定的所有本地文件和目录(如果没有传入特定的文件/目录,则监视工作目录)。
你可以通过提供 --watch-exclude 标志来从监视中排除路径或模式。语法是 --watch-exclude=path1,path2。例如:
deno run --watch --watch-exclude=file1.ts,file2.ts main.ts
这将使 file1.ts 和 file2.ts 不被监视。
要排除某个模式,请记得将其用引号括起来,以防止你的 shell 展开 glob:
deno run --watch --watch-exclude='*.js' main.ts
热模块替换 Jump to heading
deno run 还支持 --watch-hmr 标志,它会在运行中的进程中热替换已更改的模块,而不是重启进程。这样可以在编辑过程中保留应用程序的状态。如果热替换失败,进程会回退为完整重启。
deno run --watch-hmr main.ts
带原子保存的编辑器 Jump to heading
某些编辑器使用“原子保存”(也称为安全写入),即编辑器会将你的更改写入临时文件,然后在每次保存时将其重命名覆盖原文件。在 Linux 上,这会把磁盘上的文件替换为一个新文件,这可能会在第一次更改后使 --watch-hmr 使用的文件监视器失去连接。其表现是热替换只会生效一次,然后就停止检测该模块后续的编辑。
如果你遇到这种情况,请在编辑器中禁用原子保存:
- Helix:设置
[editor] atomic-save = false(默认启用)。 - Neovim/Vim:设置
:set backupcopy=yes。
普通的 --watch 不受影响,因为每次更改都会触发完整重启,从而重新建立监视器。