parcel watch运行报module not found,serve/build可正常编译
Parcel watch模式报模块未找到故障排查
已知复现条件:相同入口配置下parcel serve、parcel build可正常完成编译,仅执行parcel watch时触发module not found报错,结合提供的package.json配置,按以下优先级排查修复:
1. 本地缓存异常
Parcel 2.6.0版本watch模式的缓存逻辑与serve、build模式存在差异,历史异常缓存是该类问题的最高发诱因。
修复操作:
- 彻底删除项目根目录下的
.parcel-cache文件夹,同时清理parcel之前在输出目录生成的所有编译产物(注意不要误删自行编写的源码文件) - 重新执行watch命令即可。如果问题频繁复现,可以给watch命令追加
--no-cache参数禁用缓存,修改后的脚本配置:
"watch:js": "parcel watch ./frontend/public/js/controller/index.js --dist-dir ./frontend/public --no-cache"
2. 输出目录配置冲突
当前配置中--dist-dir指向./frontend/public,该目录本身就是存放前端源码的静态资源根目录(js、sass源码均在该目录下):
- watch模式启动后会持续监听指定目录下的文件变动,首次编译生成的产物会被判定为新增源文件触发重复编译,二次编译时产物内的路径映射无法被正常解析就会报模块不存在;而serve模式基于内存虚拟文件系统运行、build模式为一次性编译不会二次监听产物,因此不会触发该问题。
修复操作:
为parcel编译产物设置独立的输出子目录,不要与源码存放根目录重合,例如修改脚本为:
"watch:js": "parcel watch ./frontend/public/js/controller/index.js --dist-dir ./frontend/public/compiled"
同步修改前端页面中对编译后js文件的引用路径到新的输出目录即可。
3. EJS转换规则未声明
项目已安装parcel-transformer-ejs依赖,但未在Parcel配置文件中声明对应后缀的转换规则:
- serve、build模式对未显式配置的转换器存在默认容错逻辑,watch模式的文件扫描规则更严格,会将引入的ejs模板识别为无法解析的模块,报模块不存在错误。
修复操作:
在项目根目录新建.parcelrc配置文件,写入以下内容:
{ "extends": "@parcel/config-default", "transformers": { "*.ejs": ["parcel-transformer-ejs"] } }
保存后清理缓存重新运行watch命令即可。
4. 版本已知bug
你当前使用的Parcel 2.6.0是2022年发布的早期2.x版本,该版本watch模式存在已知的相对路径解析缺陷,在跨磁盘分区、WSL2挂载Windows目录的场景下复现概率极高。
修复操作:
将parcel升级到2.x后续稳定修复版本,执行以下命令:
npm install -D parcel@2.x
升级完成后清理缓存重新运行即可。
内容的提问来源于stack exchange,提问作者Eloho Kennedy
相关产品推荐
相关产品推荐

