Skip to content

Commit 38d62c9

Browse files
committed
feat(reload): Add reload-delay and reload-debounce to cli - fixes #329, fixes #562
1 parent a75dd5a commit 38d62c9

File tree

4 files changed

+111
-1
lines changed

4 files changed

+111
-1
lines changed

lib/browser-sync.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -613,16 +613,25 @@ BrowserSync.prototype.doFileReload = function (data) {
613613
);
614614

615615
bs._reloadTimer = setTimeout(function () {
616+
616617
if (willReload) {
617-
bs.io.sockets.emit("browser:reload");
618+
if (!bs._reloadDebounced) {
619+
bs._reloadDebounced = setTimeout(function () {
620+
bs._reloadDebounced = false;
621+
}, bs.options.get("reloadDebounce"));
622+
bs.io.sockets.emit("browser:reload");
623+
}
618624
} else {
619625
bs._reloadQueue.forEach(function (item) {
620626
bs.io.sockets.emit("file:reload", item);
621627
});
622628
}
629+
623630
clearTimeout(bs._reloadTimer);
631+
624632
bs._reloadTimer = undefined;
625633
bs._reloadQueue = [];
634+
626635
}, bs.options.get("reloadDelay"));
627636
};
628637

lib/cli/opts.start.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
"host": "Specify a hostname to use",
1818
"logLevel": "Set the logger output level (silent, info or debug)",
1919
"port": "Specify a port to use",
20+
"reload-delay": "Time in milliseconds to delay the reload event following file changes",
21+
"reload-debounce": "Time in milliseconds to delay the reload event following file changes",
2022
"ui-port": "Specify a port for the UI to use",
2123
"no-notify": "Disable the notify element in browsers",
2224
"no-open": "Don't open a new browser window",

lib/default-config.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,12 +262,24 @@ module.exports = {
262262
scrollThrottle: 0,
263263

264264
/**
265+
* Time, in milliseconds, to wait before
266+
* instruction browser to reload/inject following a
267+
* file change event
265268
* @property reloadDelay
266269
* @type Number
267270
* @default 0
268271
*/
269272
reloadDelay: 0,
270273

274+
/**
275+
* Restrict the frequency in which browser:reload events
276+
* can be emitted to connected clients
277+
* @property reloadDebounce
278+
* @type Number
279+
* @default 0
280+
*/
281+
reloadDebounce: 0,
282+
271283
/**
272284
* User provided plugins
273285
* @property plugins
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
"use strict";
2+
3+
var browserSync = require("../../../");
4+
var sinon = require("sinon");
5+
var assert = require("chai").assert;
6+
7+
describe("File Watcher Module - reloadDebounce = 0", function () {
8+
var bs, clock, stub, data;
9+
before(function (done) {
10+
browserSync.reset();
11+
var config = {
12+
server: "test/fixtures",
13+
open: false,
14+
logLevel: "silent",
15+
reloadDebounce: 0,
16+
online: false
17+
};
18+
clock = sinon.useFakeTimers();
19+
bs = browserSync(config, function () {
20+
stub = sinon.stub(bs.io.sockets, "emit");
21+
done();
22+
}).instance;
23+
});
24+
beforeEach(function () {
25+
data = {path: "/index.html"};
26+
clock.now = 0;
27+
});
28+
after(function () {
29+
clock.restore();
30+
bs.io.sockets.emit.restore();
31+
bs.cleanup();
32+
});
33+
afterEach(function () {
34+
stub.reset();
35+
});
36+
it("Fires as fast as possible with no debounce", function (done) {
37+
bs.events.emit("file:reload", data);
38+
clock.tick();
39+
bs.events.emit("file:reload", data);
40+
clock.tick();
41+
assert.isTrue(stub.withArgs("browser:reload").calledTwice); // should be called for each
42+
done();
43+
});
44+
});
45+
46+
describe("File Watcher Module - reloadDebounce = 1000", function () {
47+
var bs, clock, stub, data;
48+
before(function (done) {
49+
browserSync.reset();
50+
var config = {
51+
server: "test/fixtures",
52+
open: false,
53+
logLevel: "silent",
54+
reloadDebounce: 1000,
55+
online: false
56+
};
57+
clock = sinon.useFakeTimers();
58+
bs = browserSync(config, function () {
59+
stub = sinon.stub(bs.io.sockets, "emit");
60+
done();
61+
}).instance;
62+
});
63+
beforeEach(function () {
64+
data = {path: "/index.html"};
65+
clock.now = 0;
66+
});
67+
after(function () {
68+
clock.restore();
69+
bs.io.sockets.emit.restore();
70+
bs.cleanup();
71+
});
72+
afterEach(function () {
73+
stub.reset();
74+
});
75+
it("limits events to a 1000 interval", function (done) {
76+
bs.events.emit("file:reload", data);
77+
clock.tick(50);
78+
bs.events.emit("file:reload", data);
79+
clock.tick(50);
80+
bs.events.emit("file:reload", data);
81+
clock.tick(50);
82+
bs.events.emit("file:reload", data);
83+
clock.tick(1000);
84+
assert.isTrue(stub.withArgs("browser:reload").calledOnce);
85+
done();
86+
});
87+
});

0 commit comments

Comments
 (0)