gulp-pug仅编译变更文件问询(含includes与extends场景)
关于Gulp Pug任务增量编译(含includes/extends场景)的问题解答
你提到的这个场景很常见——单纯使用{since: gulp.lastRun('pug')}在Pug包含继承关系的情况下,并不能完全实现只编译变更或受影响的文件,具体原因和解决方案如下:
1. gulp.lastRun的核心局限性
{since: gulp.lastRun('pug')}的逻辑很直接:记录pug任务上次成功执行的时间,让gulp.src只选择这个时间点之后被修改过的文件。
- 如果只是直接修改
test1.pug,这个配置确实会只编译test1.pug,符合预期; - 但如果修改的是被
test1.pug、test2.pug通过include/extends引用的partials/partial1.pug,问题就出现了:gulp.lastRun只会检查你在src中指定的pug/*.pug文件,不会追踪Pug文件内部的依赖关系。这时候test1.pug和test2.pug本身的修改时间没变化,所以不会被重新编译,但它们的输出其实应该因为依赖的partial更新而改变。
2. 实现真正的增量编译(含依赖追踪)
要处理Pug的依赖关系,需要结合专门的插件来分析哪些文件因为依赖变更需要重新编译,常用的组合是gulp-cached + gulp-pug-inheritance:
示例代码
const gulp = require('gulp'); const pug = require('gulp-pug'); const cached = require('gulp-cached'); const pugInheritance = require('gulp-pug-inheritance'); gulp.task('pug', () => { return gulp.src('pug/*.pug') // 缓存已处理的文件,避免重复编译未变更的文件 .pipe(cached('pug')) // 分析当前文件的依赖关系,找出所有受影响的Pug文件 .pipe(pugInheritance({ basedir: 'pug' })) // 编译Pug .pipe(pug()) // 输出到dist目录 .pipe(gulp.dest('dist')); });
这个组合的工作逻辑:
gulp-cached会把已编译过的文件存在缓存里,只有文件内容变化时才会继续往下处理;pugInheritance会解析Pug文件的include/extends关系,当某个partial被修改时,它会把所有引用该partial的主文件都纳入编译队列,确保输出内容是最新的。
3. 额外注意事项
- 确保
pugInheritance的basedir配置正确,指向你的Pug主文件所在目录(这里是pug/); - 如果你的项目有复杂的目录结构,可能需要调整
src的路径和插件配置,保证依赖分析准确。
内容的提问来源于stack exchange,提问作者Takeshi Tokugawa YD
相关产品推荐
相关产品推荐

