使用 gulp-coffeeify + watch,如何在文件修改时重新遍历 coffeeify 所有依赖?


我在项目中使用了 CoffeeScript 以及 Gulp,最近采用了 Browserify 这个模块化方案,对应的 gulp 插件有 gulp-browserify,而 gulp-coffeeify 是 for CoffeeScript 的,但是我在项目中使用 watch 的时候,却发现它监测到文件改动的时候,仅仅是改动该文件,而不是所有与它有依赖关系的文件。举个例子:

gulpfile.js


 var MODULARIZE_LIST = [
    'js/www/main.coffee',
    'js/shared/modules/*'
];

var config = {
    assetsDir: 'resource/assets/',
    publicAssetsDir: 'resource/public/assets/'
};
function getModularizedList() {
    var src = [];

    for (i = 0; i < MODULARIZE_LIST.length; i++)
        src.push(config.assetsDir + MODULARIZE_COFFEE_IGONRE_LIST[i]);

    return src;
}

gulp.task('watch:coffeeify', function(){
    var src = getModularizedList();

    return gulp.src(src, {base: config.assetsDir + 'js'})
               .pipe(watch(src, {base: config.assetsDir + 'js'}))
               .pipe(coffeeify().on('error', gutil.log))
               .pipe(gulp.dest(config.publicAssetsDir));
});

main.coffee:


 sayHi = require '../shared/modules/sayHi'

sayHi 'Jack'

sayHi.coffee:


 module.exports = (name) ->
    console.log "Hi, #{name}"

当我将 sayHi.coffee 中的 Hi 改为 Hello 并保存后,它仅仅会 coffeeify sayHi.coffee ,而并不会把依赖它的 main.coffee 也重新打包,所以这个 watch 基本是没有什么作用的,现在每次都需要手动去 coffeeify,很麻烦,不知道有什么办法?

coffeescript gulp browserify

sdsaber 9 years, 8 months ago

我之前为了增量构建而写了一个反向依赖收集。原理也比较简单,遍历所有模块文件,用正则提取依赖。目前速度还不错,两秒内可以完成 250 多个模块的收集,你可以用缓存提升速度,我为了构建的正确性并没有使用缓存。

工口豆抚子 answered 9 years, 8 months ago

Your Answer