Grunt 中 watch 任务不触发文件变化怎么办?
我用 Grunt 的 watch 任务监听 JS 文件,但改了文件后完全没反应,控制台也不输出任何信息,是不是配置写错了?
我试过改文件路径、重启 Grunt,甚至换了编辑器保存方式,还是不行。下面是我的 Gruntfile 配置:
grunt.initConfig({
watch: {
scripts: {
files: ['src/**/*.js'],
tasks: ['uglify'],
options: {
spawn: false
}
}
}
});
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.registerTask('default', ['watch']);
1. 先确认文件确实保存了,有些编辑器要手动保存(说的就是VSCode的自动保存)
2. 加个livereload配置试试看:
3. 终极方案,加个event配置,我之前这么搞定的:
4. 还有个玄学问题,有些系统要提升文件监控数量限制,在终端跑这个命令:
如果还不行...建议换个工具吧,gulp或者webpack不香吗?(来自一个被grunt折磨过的老码农)
首先最常见的是编辑器的"安全写入"机制。很多现代编辑器(VS Code、WebStorm、Sublime)保存文件时会先写到临时文件再重命名,这个操作会绕过文件系统的事件监听。虽然你说换了编辑器,但还是要确认一下。VS Code 的话,设置里把
"files.useExperimentalFileWatcher"关掉,或者检查是否有插件干扰。Sublime 需要在设置里加"atomic_save": false。其次,你的文件路径
src/**/*.js确认一下这个目录是相对于 Gruntfile.js 所在位置的。可以在 tasks 前面加个简单的日志任务验证路径是否正确:另外,根据 grunt-contrib-watch 的文档,
spawn: false在某些系统环境下反而会有问题。可以试试去掉这个选项,用默认的 spawn 模式运行。还有个容易被忽略的点,检查一下你的 Node 版本。watch 插件依赖 gaze 或 chokidar 库,老版本 Node 在某些文件系统上的事件监听不稳定。
最后,跑一下
grunt watch --verbose,加上 verbose 参数看详细输出,确认 watch 任务是否真的在运行、监听的路径是否被正确识别。如果路径显示为空或者不匹配,那就是 glob 模式写错了。