diff --git a/README.md b/README.md index 6748b81..082ad8f 100644 --- a/README.md +++ b/README.md @@ -382,6 +382,12 @@ It's called every time a page is switched, even for history buttons. Value (in px) to scrollTo when a page is switched. +##### `cacheBust` (Boolean, default true) + +When set to true, +append a timestamp query string segment to the requested URLs +in order to skip browser cache. + ##### `debug` (Boolean, default to false) Enable verbose mode & doesn't use fallback when there is an error. diff --git a/lib/proto/parse-options.js b/lib/proto/parse-options.js index c5cbf10..5384e5b 100644 --- a/lib/proto/parse-options.js +++ b/lib/proto/parse-options.js @@ -19,6 +19,7 @@ module.exports = function(options){ } } this.options.scrollTo = (typeof this.options.scrollTo === 'undefined') ? 0 : this.options.scrollTo; + this.options.cacheBust = (typeof this.options.cacheBust === 'undefined') ? true : this.options.cacheBust this.options.debug = this.options.debug || false // we can’t replace body.outerHTML or head.outerHTML diff --git a/lib/request.js b/lib/request.js index fd6aca7..892e28d 100644 --- a/lib/request.js +++ b/lib/request.js @@ -12,7 +12,12 @@ module.exports = function(location, callback) { } } - request.open("GET", location + (!/[?&]/.test(location) ? "?" : "&") + (new Date().getTime()), true) + // Add a timestamp as part of the query string if cache busting is enabled + if (this.options.cacheBust) { + location += (!/[?&]/.test(location) ? "?" : "&") + new Date().getTime() + } + + request.open("GET", location, true) request.setRequestHeader("X-Requested-With", "XMLHttpRequest") request.send(null) return request diff --git a/tests/lib/proto/parse-options.js b/tests/lib/proto/parse-options.js index 1fb30be..e9c2044 100644 --- a/tests/lib/proto/parse-options.js +++ b/tests/lib/proto/parse-options.js @@ -46,6 +46,7 @@ tape("test parse initalization options function", function(t) { t.deepEqual(typeof body_1.options.analytics,"function"); t.deepEqual(body_1.options.scrollTo,0); + t.deepEqual(body_1.options.cacheBust,true); t.deepEqual(body_1.options.debug,false); t.end(); }); diff --git a/tests/lib/request.js b/tests/lib/request.js index 42af8d5..4237ebb 100644 --- a/tests/lib/request.js +++ b/tests/lib/request.js @@ -3,14 +3,34 @@ var tape = require("tape") var request = require("../../lib/request.js") tape("test xhr request", function(t) { - request("https://api.github.com/", function(result) { - try { - result = JSON.parse(result) - } - catch (e) { - t.fail("xhr doesn't get a JSON response") - } - t.same(typeof result, "object", "xhr request get a result") - t.end() + t.test("- request is made, gets a result, and is cache-busted", function(t) { + var requestCacheBust = request.bind({ + options: { + cacheBust: true, + }, + }); + var r = requestCacheBust("https://api.github.com/", function(result) { + t.equal(r.responseURL.indexOf("?"), 23, "XHR URL is cache-busted when configured to be") + try { + result = JSON.parse(result) + } + catch (e) { + t.fail("xhr doesn't get a JSON response") + } + t.same(typeof result, "object", "xhr request get a result") + t.end() + }) }) + t.test("- request is not cache-busted when configured not to be", function(t) { + var requestNoCacheBust = request.bind({ + options: { + cacheBust: false, + }, + }); + var r = requestNoCacheBust("https://api.github.com/", function() { + t.equal(r.responseURL, "https://api.github.com/", "XHR URL is left untouched") + t.end() + }) + }) + t.end() })