使用PhpStorm与node-watch实现文件监听构建及服务器上传问题
解决node-watch构建后文件需手动触发上传的问题
我之前踩过类似的异步监听+文件构建的坑,给你几个能让变更即时同步到服务器的解决方案:
1. 确保构建完成后强制触发文件变更检测
问题大概率是node-watch的回调触发后,concat还没完全把文件写入磁盘,或者写入后文件的修改时间没被正确更新,导致IDE/服务器同步工具没捕捉到变化。你可以用异步等待确保构建完成,再手动更新文件的时间戳:
const watch = require('node-watch'); const concat = require('concat'); const fs = require('fs'); watch('src/', { recursive: true }, async (evt, name) => { // 等待concat完成文件写入 await concat(['src/file1.js', 'src/file2.js'], 'dist/bundle.js'); // 手动修改文件的访问和修改时间,强制触发同步工具的检测 fs.utimesSync('dist/bundle.js', new Date(), new Date()); });
await会确保concat的写入操作完全完成,utimesSync则通过更新文件时间戳,让IDE的自动上传工具立刻察觉到文件变化,不需要手动双击。
2. 换用更可靠的文件监听工具
node-watch的事件触发时机有时候会偏早,在文件还在写入过程中就执行回调。试试chokidar——它会等待文件完全写入磁盘后再触发change事件,能避免异步时序问题:
const chokidar = require('chokidar'); const concat = require('concat'); const watcher = chokidar.watch('src/', { persistent: true }); watcher.on('change', async (path) => { // 文件已经完全写入,直接执行构建 await concat(['src/file1.js', 'src/file2.js'], 'dist/bundle.js'); });
chokidar的事件触发逻辑更严谨,很多主流构建工具都用它做文件监听,稳定性更高。
3. 检查PhpStorm的自动上传设置
有时候问题不在脚本,而是IDE的自动上传没配置到位:
- 打开PhpStorm的
Settings > Build, Execution, Deployment > Deployment - 找到你的服务器配置,切换到
Options标签 - 确保
Upload changed files automatically to the default server设置为**On frame deactivation或者Automatically** - 另外,确认
dist目录被包含在IDE的文件监听范围内(可在Settings > Appearance & Behavior > System Settings > Synchronization里检查)
4. 构建完成后手动触发服务器同步
如果IDE的自动上传始终不生效,你可以在构建完成后直接用命令行工具同步到服务器,比如用rsync:
const watch = require('node-watch'); const concat = require('concat'); const { execSync } = require('child_process'); watch('src/', { recursive: true }, async (evt, name) => { await concat(['src/file1.js', 'src/file2.js'], 'dist/bundle.js'); // 手动执行同步命令 execSync('rsync -avz ./dist/ your-server-user@your-server-ip:/path/to/server/directory'); });
这种方式完全不依赖IDE的自动上传,构建完成后直接把文件推到服务器,能保证即时看到变更。
内容的提问来源于stack exchange,提问作者Adam Jakś
相关产品推荐
相关产品推荐

