2014-12-02 63 views
8

這裏是我的gulpfile.js咕嘟咕嘟與watchify/browserify運行兩次,然後停止看

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第三次

無輸出。

這似乎是做了我想要的前兩次,然後它只是停止觀看。任何人都可以將我指向正確的方向嗎?

+0

你是否真的改變了第二次和第三次保存之間的文件內容? – thataustin 2014-12-03 20:52:25

+0

@tataustin,是的,我是。 – thealexbaron 2014-12-03 22:41:14

+0

好吧,我不認爲這是你想聽到的答案,但我會說我使用[gulp-browserify](https://www.npmjs.org/package/gulp-browserify),我想我的設置涉及到你在那裏的複雜程度稍低。這裏有一個示例項目,我使用它來在瀏覽之前將jsx(即反應)文件轉換爲js:https://github.com/thataustin/react-maps/blob/master/gulpfile.js – thataustin 2014-12-03 23:12:50

回答

4

這是我的新工作吞噬文件的樣子。沒有給我任何問題,並完成同樣的事情。很確定@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); 
       }); 
      } 
     })); 
} 
2

我認爲watchifygulp.watch可能是衝突,當他們都試圖重建你的包。我將刪除watch任務,並直接使用browserify任務。

5

當我第一次使用watchify加快browserify 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; 
    } 

看看是否有幫助。

+0

可能會看到吞嚥持續時間作爲速記 – backdesk 2016-01-08 12:19:50

10

剛剛遇到此問題。在瀏覽網頁找到答案几個小時後,我嘗試在記事本中而不是PHPStorm IDE中編輯文件。事實證明,browserify/watchify繼續通過記事本工作。

那是當我試圖玩弄一些設置。原來PHPStorm /系統設置/使用「安全寫入」(如果啓用),在PHPStorm編輯文件後停止監視。

當我關閉「安全寫入」時,所有問題都神奇地消失了。我不確定你使用的是什麼IDE,但也許有一個「安全寫入」選項。

+1

非常感謝分享!我對此感到生氣:D – 2016-08-13 23:44:16

+1

我不能滿足這一點,我去了很多不同的瀏覽器設置,閱讀,並重新閱讀我所傳遞的所有選項,這讓我瘋狂。 – CoolGoose 2016-12-21 08:54:27

+0

這太棒了,非常感謝你! – 2017-07-21 17:20:42

0

如果您同時使用watchifygulp.watch使用vim,並運行到這個問題,並沒有,嘗試做:set noswapfile,或在您的.vimrc加入set noswapfile

我相信這個修補程序的工作原理是因爲vim的工作方式是在工作時創建和編輯.swp文件,然後在實際保存時用交換文件替換文件會干擾watchify接收文件系統事件的能力。

請注意,:set noswapfile表示您的編輯是而不是保存到磁盤,直到您實際上做:w