3

BrowserSyncを使用して自分のプロジェクトの監視タスクを作成しましたが、理解できない障害に遭遇しました。このタスクはそれほどクレイジーではありません。ファイルを監視し、ブラウザをリロードし、必要に応じて sass または js(browserify) をコンパイルします。

問題は、jsファイルを保存すると(たとえばapp.js)、ブラウザが更新され、jsがコンパイルされてbundle.jsファイルが作成され、ブラウザの更新もトリガーされることです。だから私は常に少なくとも2回リフレッシュしています。場合によっては、10 ~ 15 回のリフレッシュのループに当たることもあります。

私にとって完璧なのは、自動更新を無効にして自分でトリガーできることです。これにより、ロジックをコンパイルしたままにし、プロセスが終了した後にブラウザーの更新をトリガーできます。

BrowserSync には更新をトリガーする方法がありますが、デフォルトの更新が行われないようにするにはどうすればよいですか?

以下にJSが含まれていますが、watchifyなどのモジュールをこれ以上含めたくないことにも注意してください。

// Dependancies
// ---------------------------
var browserSync = require("browser-sync");
var sass = require('node-sass');
var fs = require('fs');
var sys = require('sys');
var exec = require('child_process').exec;
var chalk = require('chalk');



// Used to create & listen for events
var emit = browserSync.emitter;



// Start BrowserSync
browserSync({
  files: [
    'views/**',
    'assets/js/**',
    'assets/sass/**'
  ],
  proxy: "localhost:8080",
  ghostMode: false,
  open: false,
  port: 9090,
  watchOptions: {
    reloadDelay: 1000,
    debounceDelay: 1000
  }
});



// When a file is changed
emit.on("file:changed", function (res) {

  // On file save, the `file:changed` event is fired twice.
  // Only listen for the `core` response.
  if(res.namespace !== 'core') return false;

  // File extention
  var ext = res.path.split('.').pop();

  // Emit the compile events when appropriate
  switch(ext){
    case 'scss':
      emit.emit('compile-sass');
    break;
    case 'js':
      emit.emit('compile-js');
    break;
  }

});



// Compile Sass Event
emit.on("compile-sass", function(){
  sass.render({
    file: 'assets/sass/styles.scss',
    outFile: 'assets/css/styles.css',
    sourceMap: true,
    sourceMapEmbed: true,
    outputStyle: 'compressed',

    success: function(result) {
      console.log("[" + chalk.blue('SS') + "] " + chalk.cyan("Watch:") + " Sass -> Css Compiling Successful");

      // Write the results to the css file
      fs.writeFile("assets/css/styles.css", result.css, function(err) {
        if(!err) return console.log("[" + chalk.blue('SS') + "] " + chalk.cyan("Watch:") + chalk.magenta(' styles.css') + " saved successfully");
        console.log("[" + chalk.blue('SS') + "] " + chalk.cyan("Watch:") + "There was an error writing to styles.css", err);
      });
    }

  });
});



// Compile Js Event
emit.on("compile-js", function(){
  exec("browserify assets/js/app.js -o assets/js/bundle.js --debug", function (err, stdout, stderr) {
    if(err) throw err;
    console.log("[" + chalk.blue('SS') + "] " + chalk.cyan('Watch:') + chalk.magenta(' bundle.js') + ' successfully created');
  });
});
4

1 に答える 1

1

BrowserSync がソース ファイルを監視する理由はありません。あなたの説明から、BrowserSyncが気にする必要がある唯一のイベントは、いつbundle.js書き込まれるか、他のツールがコンパイルのためにソースファイルを監視していることです。

あなたの JS ウォッチはちょうどに減らすことbundle.jsができ、おそらくreloadDelayそしてdebounceDelayも落とすことができます。

于 2015-05-11T21:08:58.843 に答える