Gulp с watchify/browserify запускается дважды, а затем прекращает просмотр

Вот мой gulpfile.js

var gulp = require('gulp');
var browserify = require('browserify');
var source = require("vinyl-source-stream");
var reactify = require("reactify");
var watchify = require('watchify');
var gutil = require('gulp-util');

var paths = {
    scripts: ['src/jsx/index.jsx']
};

gulp.task('browserify', function(){


    var bundler = watchify(browserify('./src/jsx/index.jsx', watchify.args));
    bundler.transform(reactify);

    bundler.on('update', rebundle);

    function rebundle() {
        return bundler.bundle()
            // log errors if they happen
            .on('error', gutil.log.bind(gutil, 'Browserify Error'))
            .pipe(source('bundle.js'))
            .pipe(gulp.dest('./public/js'));
    }

    return rebundle();

});

gulp.task('watch', function() {
    gulp.watch(paths.scripts, ['browserify']);
});

Тогда мой вывод командной строки выглядит так:

$ gulp watch

[15:10:41] Using gulpfile ~/blizztrack/dashboard/gulpfile.js
[15:10:41] Starting 'watch'...
[15:10:41] Finished 'watch' after 9.95 ms

сохранить index.jsx

[15:10:45] Starting 'browserify'...
[15:10:51] Finished 'browserify' after 5.33 s

сохранить index.jsx во второй раз

[15:11:08] Starting 'browserify'...
[15:11:10] Finished 'browserify' after 2.02 s

сохранить index.jsx в третий раз

Нет вывода.

Кажется, это делает именно то, что я хочу, в первые два раза, а затем просто перестает смотреть. Может кто-то указать мне верное направление?


person thealexbaron    schedule 02.12.2014    source источник
comment
вы на самом деле меняете содержимое файла между 2-м и 3-м сохранением?   -  person thataustin    schedule 03.12.2014
comment
@thataustin, да, я.   -  person thealexbaron    schedule 04.12.2014
comment
хорошо, я не думаю, что это ответ, который вы хотите услышать, но я скажу, что использую gulp-browserify, и я думаю, что моя установка менее сложная, чем у вас. Вот пример проекта, в котором я использую его для преобразования файлов jsx (т.е. реакции) в js перед браузером: github.com/thataustin/react-maps/blob/master/gulpfile.js   -  person thataustin    schedule 04.12.2014
comment
@thataustin, этот модуль занесен в черный список. github.com/deepak1556/gulp-browserify/issues/64   -  person thealexbaron    schedule 04.12.2014
comment
Не понимаю, почему они занесли его в черный список. Это похоже на то, как я просто занес яблочный пирог в черный список, потому что он не соответствует моим идеалам. Я все еще использую глоток; Я все еще ем яблочный пирог. Нет необходимости ограничивать мой пояс с инструментами без причины.   -  person thataustin    schedule 04.12.2014
comment
Есть ли причина, по которой вы используете и watchify, и gulp.watch?   -  person Ben    schedule 04.12.2014
comment
@ Бен, нет причин. Что я должен делать?   -  person thealexbaron    schedule 04.12.2014
comment
Насколько я понимаю watchify, он обрабатывает добавочные сборки браузера для вас. Таким образом, вам не нужно использовать gulp.watch, если вы используете watchify. Я подозреваю, что они как-то конфликтуют.   -  person Ben    schedule 05.12.2014
comment
Похоже на мою проблему... github.com/gulpjs/gulp/issues/407   -  person thealexbaron    schedule 05.12.2014


Ответы (5)


Только что столкнулся с этой проблемой. После просмотра ответов в Интернете в течение пары часов я попытался отредактировать файл в Блокноте вместо PHPStorm IDE. Оказалось, что browserify/watchify продолжали работать через блокнот.

Именно тогда я попытался поиграться с некоторыми настройками. Оказалось PHPStorm/Системные настройки/Использовать «безопасную запись», если включено, прекращает watchify после того, как PHPStorm отредактирует файл.

Все проблемы волшебным образом исчезли, когда я отключил «безопасную запись». Я не уверен, какую IDE вы используете, но, возможно, есть опция «Безопасная запись».

person Jeremy    schedule 02.04.2015
comment
большое спасибо, что поделились! я злился на это :D - person Alexandre Martini; 14.08.2016
comment
Я не могу проголосовать за это достаточно, я прошел через множество различных настроек браузера, прочитал и перечитал все варианты, которые я проходил, и это сводило меня с ума. - person CoolGoose; 21.12.2016

Для меня это тоже не было очевидным, когда я впервые использовал watchify для ускорения времени компиляции браузера js. При использовании watchify gulp.watch больше не требуется. Чтобы увидеть время компиляции/сборки в окне вывода/задач, вы можете сделать следующее (обратите внимание на команду gutil.log):



    var gulp = require('gulp');
    var gutil = require('gulp-util');
    var source = require('vinyl-source-stream');
    var buffer = require('vinyl-buffer');
    var watchify = require('watchify');
    var browserify = require('browserify');

    var bundler = watchify(browserify('./src/app.js', watchify.args));
    gulp.task('browserify', bundle);

    bundler.on('update', bundle); 

    function bundle() {
        var start = new Date().getTime();

        var b = bundler.bundle()
          .on('error', gutil.log.bind(gutil, 'Browserify Error'))
          .pipe(source('bundle.js'))
          .pipe(buffer())
          .pipe(gulp.dest('./src/dist'));

        var end = new Date().getTime();
        var time = end - start;

        gutil.log('[browserify]', 'rebundle took ', gutil.colors.cyan(time + ' ms'));
        return b;
    }

Посмотрите, поможет ли это.

person mike123    schedule 27.02.2015
comment
можно рассматривать gulp-duration как сокращение - person backdesk; 08.01.2016

Вот как выглядит мой новый рабочий файл gulp. Не доставил мне никаких проблем и выполняет то же самое. Почти уверен, что @Ben был прав - gulp.watch и watchify конфликтовали.

var gulp = require('gulp');
var source = require('vinyl-source-stream');
var browserify = require('browserify');
var watchify = require('watchify');
var reactify = require('reactify');
var chalk = require('chalk');
var gcallback = require('gulp-callback');
var moment = require('moment');
var gutil = require('gutil');

var jsDest = '../../server/webship/html/html/static/js';
var viewsDir = './js/views';

var watchifyArgs = watchify.args;
watchifyArgs.debug = true;

var bundler = watchify(browserify('./js/views/main.jsx', watchifyArgs));
// add any other browserify options or transforms here
bundler.transform(reactify);

bundler.on('time', function (time) {
    var durationOfBundleBuild = moment.duration(time).asSeconds();
    console.log(chalk.green('Updated'), ' bundle in ', chalk.bold(durationOfBundleBuild + 's'), '\n');
});

gulp.task('watch', function() {

    bundle(true);

    bundler.on('update', function() {
        console.log('updating...');
        bundle(true);
    });
});

gulp.task('build', function() {
    bundle();
    bundler.close();
});

function bundle(watching) {

    console.log(chalk.yellow('Updating') + ' bundle...');

    bundler.bundle()
        .on('error', gutil.log.bind(gutil, 'Browserify Error'))
        .pipe(source('bundle.js'))
        .pipe(gulp.dest(jsDest))
        .pipe(gcallback(function() {

            if (!watching) {
                process.nextTick(function() {
                    process.exit(0);
                });
            }
        }));
}
person thealexbaron    schedule 02.04.2015

Я думаю, что watchify и gulp.watch, вероятно, конфликтуют, когда они оба пытаются перестроить ваш пакет. Я бы удалил задачу watch и просто использовал задачу browserify напрямую.

person Ben    schedule 05.12.2014

Если вы используете vim и столкнулись с этой проблемой, но не используете и watchify, и gulp.watch, попробуйте выполнить :set noswapfile или добавить set noswapfile в .vimrc.

Я считаю, что это исправление работает, потому что схема vim создания и редактирования файла .swp во время работы и последующей замены файла файлом подкачки при фактическом сохранении мешает способности watchify получать события файловой системы.

Обратите внимание, что :set noswapfile означает, что ваши изменения не сохраняются на диск до тех пор, пока вы не сделаете :w!

person kellen    schedule 10.11.2015