Skip to content

Commit

Permalink
v9.0.4-canary.8
Browse files Browse the repository at this point in the history
  • Loading branch information
ijjk committed Aug 19, 2019
1 parent ec95927 commit 8c26a08
Show file tree
Hide file tree
Showing 6 changed files with 7 additions and 7 deletions.
2 changes: 1 addition & 1 deletion lerna.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,5 @@
"registry": "https://registry.npmjs.org/"
}
},
"version": "9.0.4-canary.7"
"version": "9.0.4-canary.8"
}
2 changes: 1 addition & 1 deletion packages/create-next-app/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "create-next-app",
"version": "9.0.4-canary.7",
"version": "9.0.4-canary.8",
"keywords": [
"react",
"next",
Expand Down
2 changes: 1 addition & 1 deletion packages/next-bundle-analyzer/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@next/bundle-analyzer",
"version": "9.0.4-canary.7",
"version": "9.0.4-canary.8",
"main": "index.js",
"license": "MIT",
"repository": {
Expand Down
2 changes: 1 addition & 1 deletion packages/next-mdx/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@next/mdx",
"version": "9.0.4-canary.7",
"version": "9.0.4-canary.8",
"main": "index.js",
"license": "MIT",
"repository": {
Expand Down
2 changes: 1 addition & 1 deletion packages/next-server/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "next-server",
"version": "9.0.4-canary.7",
"version": "9.0.4-canary.8",
"main": "./index.js",
"license": "MIT",
"repository": "zeit/next.js",
Expand Down
4 changes: 2 additions & 2 deletions packages/next/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "next",
"version": "9.0.4-canary.7",
"version": "9.0.4-canary.8",
"description": "The React Framework",
"main": "./dist/server/next.js",
"license": "MIT",
Expand Down Expand Up @@ -81,7 +81,7 @@
"launch-editor": "2.2.1",
"loader-utils": "1.2.3",
"mkdirp": "0.5.1",
"next-server": "9.0.4-canary.7",
"next-server": "9.0.4-canary.8",
"prop-types": "15.7.2",
"prop-types-exact": "1.2.0",
"react-error-overlay": "5.1.6",
Expand Down

1 comment on commit 8c26a08

@ijjk
Copy link
Member Author

@ijjk ijjk commented on 8c26a08 Aug 19, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stats from current release

Default Server Mode (Decrease detected ✓)
General Overall decrease ✓
zeit/next.js canary zeit/next.js refs/tags/v9.0.4-canary.8 Change
buildDuration 21.6s 22.6s ⚠️ +1s
nodeModulesSize 41.5 MB 41.3 MB -238 kB
Client Bundles (main, webpack, commons) Overall decrease ✓
zeit/next.js canary zeit/next.js refs/tags/v9.0.4-canary.8 Change
main-HASH.js 19.9 kB 17.9 kB -2.02 kB
main-HASH.js gzip 7.1 kB 6.56 kB -537 B
webpack-HASH.js 1.49 kB 1.53 kB ⚠️ +43 B
webpack-HASH.js gzip 738 B 746 B ⚠️ +8 B
commons.HASH.js 191 kB 190 kB -604 B
commons.HASH.js gzip 61.6 kB 61.6 kB
Overall change -2.58 kB
Client Bundles (main, webpack, commons) Modern Overall decrease ✓
zeit/next.js canary zeit/next.js refs/tags/v9.0.4-canary.8 Change
main-HASH.module.js 17.7 kB 16.2 kB -1.47 kB
main-HASH.module.js gzip 6.73 kB 6.28 kB -449 B
webpack-HASH.module.js 1.49 kB 1.53 kB ⚠️ +43 B
webpack-HASH.module.js gzip 738 B 746 B ⚠️ +8 B
commons.HASH.module.js 171 kB 171 kB ⚠️ +43 B
commons.HASH.module.js gzip 55.3 kB 55.4 kB ⚠️ +94 B
Overall change -1.39 kB
Client Pages Overall decrease ✓
zeit/next.js canary zeit/next.js refs/tags/v9.0.4-canary.8 Change
_app.js 2.39 kB 1.9 kB -490 B
_app.js gzip 1.07 kB 905 B -169 B
_error.js 12.3 kB 12.1 kB -199 B
_error.js gzip 4.8 kB 4.76 kB -38 B
hooks.js 751 B 1.06 kB ⚠️ +311 B
hooks.js gzip 385 B 600 B ⚠️ +215 B
index.js 343 B 343 B
index.js gzip 237 B 237 B
link.js 8.17 kB 8.13 kB -41 B
link.js gzip 3.5 kB 3.49 kB -7 B
routerDirect.js 423 B 429 B ⚠️ +6 B
routerDirect.js gzip 290 B 292 B ⚠️ +2 B
withRouter.js 435 B 439 B ⚠️ +4 B
withRouter.js gzip 286 B 290 B ⚠️ +4 B
Overall change -409 B
Client Pages Modern Overall decrease ✓
zeit/next.js canary zeit/next.js refs/tags/v9.0.4-canary.8 Change
_app.module.js 1.83 kB 1.79 kB -35 B
_app.module.js gzip 875 B 865 B -10 B
_error.module.js 10.6 kB 10.6 kB -23 B
_error.module.js gzip 4.3 kB 4.31 kB ⚠️ +5 B
hooks.module.js 652 B 596 B -56 B
hooks.module.js gzip 352 B 354 B ⚠️ +2 B
index.module.js 319 B 319 B
index.module.js gzip 238 B 238 B
link.module.js 8.46 kB 8.52 kB ⚠️ +57 B
link.module.js gzip 3.65 kB 3.67 kB ⚠️ +21 B
routerDirect.module.js 411 B 417 B ⚠️ +6 B
routerDirect.module.js gzip 291 B 292 B ⚠️ +1 B
withRouter.module.js 423 B 427 B ⚠️ +4 B
withRouter.module.js gzip 288 B 291 B ⚠️ +3 B
Overall change -47 B
Fetched pages Overall decrease ✓
zeit/next.js canary zeit/next.js refs/tags/v9.0.4-canary.8 Change
link 2.81 kB 2.8 kB -4 B
link gzip 847 B 849 B ⚠️ +2 B
index 2.76 kB 2.75 kB -4 B
index gzip 837 B 841 B ⚠️ +4 B
withRouter 2.82 kB 2.81 kB -4 B
withRouter gzip 834 B 837 B ⚠️ +3 B
Overall change -12 B

Diffs

Diff for main-HASH.js

Diff too large to display

Diff for webpack-HASH.js
@@ -10,7 +10,7 @@
 /******/ 		var moduleId, chunkId, i = 0, resolves = [];
 /******/ 		for(;i < chunkIds.length; i++) {
 /******/ 			chunkId = chunkIds[i];
-/******/ 			if(installedChunks[chunkId]) {
+/******/ 			if(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {
 /******/ 				resolves.push(installedChunks[chunkId][0]);
 /******/ 			}
 /******/ 			installedChunks[chunkId] = 0;
Diff for commons.HASH.js

Diff too large to display

Diff for main-HASH.module.js
@@ -1,20 +1,5 @@
 (window["webpackJsonp"] = window["webpackJsonp"] || []).push([[9],{
 
-/***/ "+iuc":
-/***/ (function(module, exports, __webpack_require__) {
-
-__webpack_require__("wgeU");
-__webpack_require__("FlQf");
-__webpack_require__("bBy9");
-__webpack_require__("B9jh");
-__webpack_require__("dL40");
-__webpack_require__("xvv9");
-__webpack_require__("V+O7");
-module.exports = __webpack_require__("WEpk").Set;
-
-
-/***/ }),
-
 /***/ "+oT+":
 /***/ (function(module, exports, __webpack_require__) {
 
@@ -145,28 +130,6 @@ module.exports = function (NAME) {
 
 /***/ }),
 
-/***/ "B9jh":
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-var strong = __webpack_require__("Wu5q");
-var validate = __webpack_require__("n3ko");
-var SET = 'Set';
-
-// 23.2 Set Objects
-module.exports = __webpack_require__("raTm")(SET, function (get) {
-  return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };
-}, {
-  // 23.2.3.1 Set.prototype.add(value)
-  add: function add(value) {
-    return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);
-  }
-}, strong);
-
-
-/***/ }),
-
 /***/ "BMP1":
 /***/ (function(module, exports, __webpack_require__) {
 
@@ -270,6 +233,9 @@ class HeadManager {
   updateElements(type, components) {
     const headEl = document.getElementsByTagName('head')[0];
     const headCountEl = headEl.querySelector('meta[name=next-head-count]');
+
+    if (false) {}
+
     const headCount = Number(headCountEl.content);
     const oldTags = [];
 
@@ -336,13 +302,12 @@ function reactElementToDOM(_ref) {
 "use strict";
 
 
-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");
 
-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });
+
 let runtimeConfig;
 
 exports.default = () => {
@@ -363,11 +328,9 @@ exports.setConfig = setConfig;
 "use strict";
 
 
-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");
 
-var __importStar = void 0 && (void 0).__importStar || function (mod) {
+var __importStar = this && this.__importStar || function (mod) {
   if (mod && mod.__esModule) return mod;
   var result = {};
   if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
@@ -375,7 +338,7 @@ var __importStar = void 0 && (void 0).__importStar || function (mod) {
   return result;
 };
 
-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });
 
@@ -505,7 +468,7 @@ class Container extends _react.default.Component {
     this.scrollToHash(); // If page was exported and has a querystring
     // If it's a dynamic route or has a querystring
 
-    if (data.nextExport && ((0, _isDynamic.isDynamicRoute)(router.pathname) || location.search)) {
+    if (data.nextExport && ((0, _isDynamic.isDynamicRoute)(router.pathname) || location.search || data.skeleton)) {
       // update query on mount for exported pages
       router.replace(router.pathname + '?' + (0, _querystring.stringify)((0, _extends2.default)({}, router.query, (0, _querystring.parse)(location.search.substr(1)))), asPath, {
         // WARNING: `_h` is an internal option for handing Next.js
@@ -568,9 +531,7 @@ function () {
       yield window.__NEXT_PRELOADREADY(dynamicIds);
     }
 
-    if (dynamicBuildId === true) {
-      pageLoader.onDynamicBuildId();
-    }
+    if (false) {}
 
     exports.router = router = (0, _router.createRouter)(page, query, asPath, {
       initialProps: props,
@@ -594,13 +555,14 @@ function () {
         });
       }
     });
-    render({
+    const renderCtx = {
       App,
       Component,
       props,
       err: initialErr,
       emitter
-    });
+    };
+    render(renderCtx);
     return emitter;
   });
 
@@ -657,15 +619,17 @@ function _renderError() {
     // If we've gotten here upon initial render, we can use the props from the server.
     // Otherwise, we need to call `getInitialProps` on `App` before mounting.
 
+    const AppTree = wrapApp(App);
     const appCtx = {
-      AppTree: wrapApp(App),
       Component: ErrorComponent,
+      AppTree,
       router,
       ctx: {
         err,
         pathname: page,
         query,
-        asPath
+        asPath,
+        AppTree
       }
     };
     const initProps = props.props ? props.props : yield (0, _utils.loadGetInitialProps)(App, appCtx);
@@ -681,16 +645,54 @@ function _renderError() {
 let isInitialRender = typeof _reactDom.default.hydrate === 'function';
 
 function renderReactElement(reactEl, domEl) {
-  // The check for `.hydrate` is there to support React alternatives like preact
+  // mark start of hydrate/render
+  if (_utils.SUPPORTS_PERFORMANCE_USER_TIMING) {
+    performance.mark('beforeRender');
+  } // The check for `.hydrate` is there to support React alternatives like preact
+
+
   if (isInitialRender) {
-    _reactDom.default.hydrate(reactEl, domEl);
+    _reactDom.default.hydrate(reactEl, domEl, markHydrateComplete);
 
     isInitialRender = false;
   } else {
-    _reactDom.default.render(reactEl, domEl);
+    _reactDom.default.render(reactEl, domEl, markRenderComplete);
   }
 }
 
+function markHydrateComplete() {
+  if (!_utils.SUPPORTS_PERFORMANCE_USER_TIMING) return;
+  performance.mark('afterHydrate'); // mark end of hydration
+
+  performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
+  performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+  clearMarks();
+}
+
+function markRenderComplete() {
+  if (!_utils.SUPPORTS_PERFORMANCE_USER_TIMING) return;
+  performance.mark('afterRender'); // mark end of render
+
+  const navStartEntries = performance.getEntriesByName('routeChange', 'mark');
+
+  if (!navStartEntries.length) {
+    return;
+  }
+
+  performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
+  performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+  clearMarks();
+}
+
+function clearMarks() {
+  performance.clearMarks();
+  /*
+  * TODO: uncomment the following line when we have a way to
+  * expose this to user code.
+  */
+  // performance.clearMeasures()
+}
+
 function AppContainer(_ref4) {
   let {
     children
@@ -740,15 +742,17 @@ function _doRender() {
         query,
         asPath
       } = router;
+      const AppTree = wrapApp(App);
       const appCtx = {
         router,
-        AppTree: wrapApp(App),
+        AppTree,
         Component: ErrorComponent,
         ctx: {
           err,
           pathname,
           query,
-          asPath
+          asPath,
+          AppTree
         }
       };
       props = yield (0, _utils.loadGetInitialProps)(App, appCtx);
@@ -825,15 +829,6 @@ module.exports = __webpack_require__("WEpk").Map;
 
 /***/ }),
 
-/***/ "V+O7":
-/***/ (function(module, exports, __webpack_require__) {
-
-// https://tc39.github.io/proposal-setmap-offrom/#sec-set.from
-__webpack_require__("aPfg")('Set');
-
-
-/***/ }),
-
 /***/ "V7Et":
 /***/ (function(module, exports, __webpack_require__) {
 
@@ -1110,19 +1105,17 @@ module.exports = function (COLLECTION) {
 "use strict";
 
 
-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _map = _interopRequireDefault(__webpack_require__("LX0d"));
+var _Map = __webpack_require__("LX0d");
 
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");
 
-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });
 
 class DataManager {
   constructor(data) {
-    this.data = new _map.default(data);
+    this.data = new _Map(data);
   }
 
   getData() {
@@ -1138,7 +1131,7 @@ class DataManager {
   }
 
   overwrite(data) {
-    this.data = new _map.default(data);
+    this.data = new _Map(data);
   }
 
 }
@@ -1147,17 +1140,6 @@ exports.DataManager = DataManager;
 
 /***/ }),
 
-/***/ "dL40":
-/***/ (function(module, exports, __webpack_require__) {
-
-// https://github.com/DavidBruant/Map-Set.prototype.toJSON
-var $export = __webpack_require__("Y7ZC");
-
-$export($export.P + $export.R, 'Set', { toJSON: __webpack_require__("8iia")('Set') });
-
-
-/***/ }),
-
 /***/ "dVTT":
 /***/ (function(module, exports, __webpack_require__) {
 
@@ -1206,17 +1188,6 @@ module.exports = Array.isArray || function isArray(arg) {
 
 /***/ }),
 
-/***/ "m/Gl":
-/***/ (function(__webpack_module__, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony default export */ __webpack_exports__["default"] = (function(e,n){return n=n||{},new Promise(function(t,r){var s=new XMLHttpRequest,o=[],u=[],i={},a=function(){return{ok:2==(s.status/100|0),statusText:s.statusText,status:s.status,url:s.responseURL,text:function(){return Promise.resolve(s.responseText)},json:function(){return Promise.resolve(JSON.parse(s.responseText))},blob:function(){return Promise.resolve(new Blob([s.response]))},clone:a,headers:{keys:function(){return o},entries:function(){return u},get:function(e){return i[e.toLowerCase()]},has:function(e){return e.toLowerCase()in i}}}};for(var l in s.open(n.method||"get",e,!0),s.onload=function(){s.getAllResponseHeaders().replace(/^(.*?):[^\S\n]*([\s\S]*?)$/gm,function(e,n,t){o.push(n=n.toLowerCase()),u.push([n,t]),i[n]=i[n]?i[n]+","+t:t}),t(a())},s.onerror=r,s.withCredentials="include"==n.credentials,n.headers)s.setRequestHeader(l,n.headers[l]);s.send(n.body||null)})});
-//# sourceMappingURL=unfetch.mjs.map
-
-
-/***/ }),
-
 /***/ "n3ko":
 /***/ (function(module, exports, __webpack_require__) {
 
@@ -1235,11 +1206,9 @@ module.exports = function (it, TYPE) {
 "use strict";
 
 
-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");
 
-var __importStar = void 0 && (void 0).__importStar || function (mod) {
+var __importStar = this && this.__importStar || function (mod) {
   if (mod && mod.__esModule) return mod;
   var result = {};
   if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
@@ -1247,7 +1216,7 @@ var __importStar = void 0 && (void 0).__importStar || function (mod) {
   return result;
 };
 
-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });
 
@@ -1324,13 +1293,6 @@ module.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {
 
 /***/ }),
 
-/***/ "ttDY":
-/***/ (function(module, exports, __webpack_require__) {
-
-module.exports = __webpack_require__("+iuc");
-
-/***/ }),
-
 /***/ "v6xn":
 /***/ (function(module, exports, __webpack_require__) {
 
@@ -1344,15 +1306,6 @@ module.exports = function (original, length) {
 
 /***/ }),
 
-/***/ "xvv9":
-/***/ (function(module, exports, __webpack_require__) {
-
-// https://tc39.github.io/proposal-setmap-offrom/#sec-set.of
-__webpack_require__("cHUd")('Set');
-
-
-/***/ }),
-
 /***/ "zmvN":
 /***/ (function(module, exports, __webpack_require__) {
 
@@ -1368,38 +1321,46 @@ var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__("+oT+"));
 
 var _promise = _interopRequireDefault(__webpack_require__("eVuF"));
 
-var _set = _interopRequireDefault(__webpack_require__("ttDY"));
-
 var _mitt = _interopRequireDefault(__webpack_require__("kiME"));
+/* global document, window */
 
-var _unfetch = _interopRequireDefault(__webpack_require__("m/Gl"));
-/* global document */
-// smaller version of https://gist.github.com/igrigorik/a02f2359f3bc50ca7a9c
-
-
-function supportsPreload(list) {
-  if (!list || !list.supports) {
-    return false;
-  }
 
+function supportsPreload(el) {
   try {
-    return list.supports('preload');
-  } catch (e) {
+    return el.relList.supports('preload');
+  } catch (_unused) {
     return false;
   }
 }
 
-const hasPreload = supportsPreload(document.createElement('link').relList);
+const hasPreload = supportsPreload(document.createElement('link'));
+
+function preloadScript(url) {
+  const link = document.createElement('link');
+  link.rel = 'preload';
+  link.crossOrigin = "anonymous";
+  link.href = url;
+  link.as = 'script';
+  document.head.appendChild(link);
+}
 
 class PageLoader {
   constructor(buildId, assetPrefix) {
     this.buildId = buildId;
     this.assetPrefix = assetPrefix;
     this.pageCache = {};
-    this.prefetchCache = new _set.default();
     this.pageRegisterEvents = (0, _mitt.default)();
     this.loadingRoutes = {};
     this.promisedBuildId = _promise.default.resolve();
+
+    if (false) {}
+
+    if (false) {}
+  } // Returns a promise for the dependencies for a particular route
+
+
+  getDependencies(route) {
+    return this.promisedBuildManifest.then(man => man[route] && man[route].map(url => "/_next/" + url) || []);
   }
 
   normalizeRoute(route) {
@@ -1446,67 +1407,55 @@ class PageLoader {
       this.pageRegisterEvents.on(route, fire); // If the page is loading via SSR, we need to wait for it
       // rather downloading it again.
 
-      if (document.getElementById("__NEXT_PAGE__" + route)) {
+      if (document.querySelector("script[data-next-page=\"" + route + "\"]")) {
         return;
-      } // Load the script if not asked to load yet.
-
-
-      if (!this.loadingRoutes[route]) {
-        this.loadScript(route);
-        this.loadingRoutes[route] = true;
       }
-    });
-  }
 
-  onDynamicBuildId() {
-    this.promisedBuildId = new _promise.default(resolve => {
-      (0, _unfetch.default)(this.assetPrefix + "/_next/static/HEAD_BUILD_ID").then(res => {
-        if (res.ok) {
-          return res;
+      if (!this.loadingRoutes[route]) {
+        if (false) {} else {
+          this.loadRoute(route);
+          this.loadingRoutes[route] = true;
         }
-
-        const err = new Error('Failed to fetch HEAD buildId');
-        err.res = res;
-        throw err;
-      }).then(res => res.text()).then(buildId => {
-        this.buildId = buildId.trim();
-      }).catch(() => {
-        // When this fails it's not a _huge_ deal, preload wont work and page
-        // navigation will 404, triggering a SSR refresh
-        console.warn('Failed to load BUILD_ID from server. ' + 'The following client-side page transition will likely 404 and cause a SSR.\n' + 'http://err.sh/zeit/next.js/head-build-id');
-      }).then(resolve, resolve);
+      }
     });
   }
 
-  loadScript(route) {
+  loadRoute(route) {
     var _this = this;
 
     return (0, _asyncToGenerator2.default)(function* () {
-      yield _this.promisedBuildId;
+      if (false) {}
+
       route = _this.normalizeRoute(route);
       let scriptRoute = route === '/' ? '/index.js' : route + ".js";
-      const script = document.createElement('script');
+      const url = _this.assetPrefix + "/_next/static/" + encodeURIComponent(_this.buildId) + "/pages" + scriptRoute;
 
-      if ( true && 'noModule' in script) {
-        script.type = 'module';
-        scriptRoute = scriptRoute.replace(/\.js$/, '.module.js');
-      }
+      _this.loadScript(url, route, true);
+    })();
+  }
 
-      const url = _this.assetPrefix + "/_next/static/" + encodeURIComponent(_this.buildId) + "/pages" + scriptRoute;
-      script.crossOrigin = "anonymous";
-      script.src = url;
+  loadScript(url, route, isPage) {
+    const script = document.createElement('script');
 
-      script.onerror = () => {
-        const error = new Error("Error loading script " + url);
-        error.code = 'PAGE_LOAD_ERROR';
+    if ( true && 'noModule' in script) {
+      script.type = 'module'; // Only page bundle scripts need to have .module added to url,
+      // dependencies already have it added during build manifest creation
 
-        _this.pageRegisterEvents.emit(route, {
-          error
-        });
-      };
+      if (isPage) url = url.replace(/\.js$/, '.module.js');
+    }
 
-      document.body.appendChild(script);
-    })();
+    script.crossOrigin = "anonymous";
+    script.src = url;
+
+    script.onerror = () => {
+      const error = new Error("Error loading script " + url);
+      error.code = 'PAGE_LOAD_ERROR';
+      this.pageRegisterEvents.emit(route, {
+        error
+      });
+    };
+
+    document.body.appendChild(script);
   } // This method if called by the route code.
 
 
@@ -1540,10 +1489,12 @@ class PageLoader {
     register();
   }
 
-  prefetch(route) {
+  prefetch(route, isDependency) {
     var _this2 = this;
 
     return (0, _asyncToGenerator2.default)(function* () {
+      if (false) {}
+
       route = _this2.normalizeRoute(route);
       let scriptRoute = (route === '/' ? '/index' : route) + ".js";
 
@@ -1551,31 +1502,36 @@ class PageLoader {
         scriptRoute = scriptRoute.replace(/\.js$/, '.module.js');
       }
 
-      if (_this2.prefetchCache.has(scriptRoute) || document.getElementById("__NEXT_PAGE__" + route)) {
+      const url = isDependency ? route : _this2.assetPrefix + "/_next/static/" + encodeURIComponent(_this2.buildId) + "/pages" + scriptRoute; // n.b. If preload is not supported, we fall back to `loadPage` which has
+      // its own deduping mechanism.
+
+      if (document.querySelector("link[rel=\"preload\"][href^=\"" + url + "\"], script[data-next-page=\"" + route + "\"]")) {
         return;
-      }
+      } // Inspired by quicklink, license: https://github.com/GoogleChromeLabs/quicklink/blob/master/LICENSE
 
-      _this2.prefetchCache.add(scriptRoute); // Inspired by quicklink, license: https://github.com/GoogleChromeLabs/quicklink/blob/master/LICENSE
-      // Don't prefetch if the user is on 2G / Don't prefetch if Save-Data is enabled
 
+      let cn;
 
-      if ('connection' in navigator) {
-        if ((navigator.connection.effectiveType || '').indexOf('2g') !== -1 || navigator.connection.saveData) {
+      if (cn = navigator.connection) {
+        // Don't prefetch if the user is on 2G or if Save-Data is enabled.
+        if ((cn.effectiveType || '').indexOf('2g') !== -1 || cn.saveData) {
           return;
         }
-      } // Feature detection is used to see if preload is supported
+      }
+
+      if (false) {} // Feature detection is used to see if preload is supported
       // If not fall back to loading script tags before the page is loaded
       // https://caniuse.com/#feat=link-rel-preload
 
 
       if (hasPreload) {
-        yield _this2.promisedBuildId;
-        const link = document.createElement('link');
-        link.rel = 'preload';
-        link.crossOrigin = "anonymous";
-        link.href = _this2.assetPrefix + "/_next/static/" + encodeURIComponent(_this2.buildId) + "/pages" + scriptRoute;
-        link.as = 'script';
-        document.head.appendChild(link);
+        preloadScript(url);
+        return;
+      }
+
+      if (isDependency) {
+        // loadPage will automatically handle depencies, so no need to
+        // preload them manually
         return;
       }
 
@@ -1591,17 +1547,6 @@ class PageLoader {
     })();
   }
 
-  clearCache(route) {
-    route = this.normalizeRoute(route);
-    delete this.pageCache[route];
-    delete this.loadingRoutes[route];
-    const script = document.getElementById("__NEXT_PAGE__" + route);
-
-    if (script) {
-      script.parentNode.removeChild(script);
-    }
-  }
-
 }
 
 exports.default = PageLoader;
Diff for webpack-HASH.module.js
@@ -10,7 +10,7 @@
 /******/ 		var moduleId, chunkId, i = 0, resolves = [];
 /******/ 		for(;i < chunkIds.length; i++) {
 /******/ 			chunkId = chunkIds[i];
-/******/ 			if(installedChunks[chunkId]) {
+/******/ 			if(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {
 /******/ 				resolves.push(installedChunks[chunkId][0]);
 /******/ 			}
 /******/ 			installedChunks[chunkId] = 0;
Diff for commons.HASH.module.js
@@ -14,7 +14,7 @@
  */
 
 Object.defineProperty(exports,"__esModule",{value:!0});var d=void 0,e=void 0,g=void 0,m=void 0,n=void 0;exports.unstable_now=void 0;exports.unstable_forceFrameRate=void 0;
-if( false||"function"!==typeof MessageChannel){var p=null,q=null,r=function(){if(null!==p)try{var a=exports.unstable_now();p(!0,a);p=null}catch(b){throw setTimeout(r,0),b;}};exports.unstable_now=function(){return Date.now()};d=function(a){null!==p?setTimeout(d,0,a):(p=a,setTimeout(r,0))};e=function(a,b){q=setTimeout(a,b)};g=function(){clearTimeout(q)};m=function(){return!1};n=exports.unstable_forceFrameRate=function(){}}else{var t=window.performance,u=window.Date,v=window.setTimeout,
+if("undefined"===typeof window||"function"!==typeof MessageChannel){var p=null,q=null,r=function(){if(null!==p)try{var a=exports.unstable_now();p(!0,a);p=null}catch(b){throw setTimeout(r,0),b;}};exports.unstable_now=function(){return Date.now()};d=function(a){null!==p?setTimeout(d,0,a):(p=a,setTimeout(r,0))};e=function(a,b){q=setTimeout(a,b)};g=function(){clearTimeout(q)};m=function(){return!1};n=exports.unstable_forceFrameRate=function(){}}else{var t=window.performance,u=window.Date,v=window.setTimeout,
 w=window.clearTimeout,x=window.requestAnimationFrame,y=window.cancelAnimationFrame;"undefined"!==typeof console&&("function"!==typeof x&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"),"function"!==typeof y&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"));exports.unstable_now="object"===typeof t&&
 "function"===typeof t.now?function(){return t.now()}:function(){return u.now()};var z=!1,A=null,B=-1,C=-1,D=33.33,E=-1,F=-1,G=0,H=!1;m=function(){return exports.unstable_now()>=G};n=function(){};exports.unstable_forceFrameRate=function(a){0>a||125<a?console.error("forceFrameRate takes a positive int between 0 and 125, forcing framerates higher than 125 fps is not unsupported"):0<a?(D=Math.floor(1E3/a),H=!0):(D=33.33,H=!1)};var J=function(){if(null!==A){var a=exports.unstable_now(),b=0<G-a;try{A(b,
 a)||(A=null)}catch(c){throw I.postMessage(null),c;}}},K=new MessageChannel,I=K.port2;K.port1.onmessage=J;var L=function(a){if(null===A)F=E=-1,z=!1;else{z=!0;x(function(a){w(B);L(a)});var b=function(){G=exports.unstable_now()+D/2;J();B=v(b,3*D)};B=v(b,3*D);if(-1!==E&&.1<a-E){var c=a-E;!H&&-1!==F&&c<D&&F<D&&(D=c<F?F:c,8.33>D&&(D=8.33));F=c}E=a;G=a+D;I.postMessage(null)}};d=function(a){A=a;z||(z=!0,x(function(a){L(a)}))};e=function(a,b){C=v(function(){a(exports.unstable_now())},b)};g=function(){w(C);
@@ -360,13 +360,11 @@ var objectKeys = Object.keys || function (obj) {
 "use strict";
 
 
-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _keys = _interopRequireDefault(__webpack_require__("pLtp"));
+var _Object$keys = __webpack_require__("pLtp");
 
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");
 
-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });
 
@@ -383,13 +381,15 @@ function getRouteMatcher(routeRegex) {
     }
 
     const params = {};
-    (0, _keys.default)(groups).forEach(slugName => {
+
+    _Object$keys(groups).forEach(slugName => {
       const m = routeMatch[groups[slugName]];
 
       if (m !== undefined) {
         params[slugName] = decodeURIComponent(m);
       }
     });
+
     return params;
   };
 }
@@ -411,10 +411,10 @@ module.exports = function (it) {
 /***/ }),
 
 /***/ "5T2Y":
-/***/ (function(module, exports, __webpack_require__) {
+/***/ (function(module, exports) {
 
 // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
-var global = module.exports =  true && window.Math == Math
+var global = module.exports = typeof window != 'undefined' && window.Math == Math
   ? window : typeof self != 'undefined' && self.Math == Math ? self
   // eslint-disable-next-line no-new-func
   : Function('return this')();
@@ -489,11 +489,9 @@ module.exports = function (object, names) {
 "use strict";
 
 
-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");
 
-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });
 
@@ -546,11 +544,9 @@ module.exports = function (it) {
 "use strict";
 
 
-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");
 
-var __importStar = void 0 && (void 0).__importStar || function (mod) {
+var __importStar = this && this.__importStar || function (mod) {
   if (mod && mod.__esModule) return mod;
   var result = {};
   if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
@@ -558,7 +554,7 @@ var __importStar = void 0 && (void 0).__importStar || function (mod) {
   return result;
 };
 
-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });
 
@@ -585,13 +581,11 @@ module.exports = function (it, key) {
 "use strict";
 
 
-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _keys = _interopRequireDefault(__webpack_require__("pLtp"));
+var _Object$keys = __webpack_require__("pLtp");
 
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");
 
-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });
 
@@ -687,6 +681,8 @@ function formatWithValidation(url, options) {
 }
 
 exports.formatWithValidation = formatWithValidation;
+exports.SUPPORTS_PERFORMANCE = typeof performance !== 'undefined';
+exports.SUPPORTS_PERFORMANCE_USER_TIMING = exports.SUPPORTS_PERFORMANCE && typeof performance.mark === 'function' && typeof performance.measure === 'function';
 
 /***/ }),
 
@@ -2364,21 +2360,19 @@ $export($export.S + $export.F * !(USE_NATIVE && __webpack_require__("TuGD")(func
 "use strict";
 
 
-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _promise = _interopRequireDefault(__webpack_require__("eVuF"));
+var _Promise = __webpack_require__("eVuF");
 
-var _assign = _interopRequireDefault(__webpack_require__("UXZV"));
+var _Object$assign = __webpack_require__("UXZV");
 
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");
 
-var __importDefault = void 0 && (void 0).__importDefault || function (mod) {
+var __importDefault = this && this.__importDefault || function (mod) {
   return mod && mod.__esModule ? mod : {
     "default": mod
   };
 };
 
-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });
 
@@ -2504,13 +2498,14 @@ class Router {
             as,
             options
           } = history.state;
-          this.changeState('replaceState', url, as, (0, _assign.default)({}, options, {
+          this.changeState('replaceState', url, as, _Object$assign({}, options, {
             fromExternal: true
           }));
         }
       });
     }
-  }
+  } // @deprecated backwards compatibility even though it's a private method.
+
 
   static _rewriteUrlForNextExport(url) {
     return rewrite_url_for_export_1.rewriteUrlForNextExport(url);
@@ -2523,9 +2518,10 @@ class Router {
       throw new Error("Cannot update unavailable route: ".concat(route));
     }
 
-    const newData = (0, _assign.default)({}, data, {
+    const newData = _Object$assign({}, data, {
       Component
     });
+
     this.components[route] = newData; // pages/_app.js updated
 
     if (route === '/_app') {
@@ -2577,9 +2573,14 @@ class Router {
   }
 
   change(method, _url, _as, options) {
-    return new _promise.default((resolve, reject) => {
-      // If url and as provided as an object representation,
+    return new _Promise((resolve, reject) => {
+      // marking route changes as a navigation start entry
+      if (utils_1.SUPPORTS_PERFORMANCE_USER_TIMING) {
+        performance.mark('routeChange');
+      } // If url and as provided as an object representation,
       // we'll format them into the string version here.
+
+
       const url = typeof _url === 'object' ? utils_1.formatWithValidation(_url) : _url;
       let as = typeof _as === 'object' ? utils_1.formatWithValidation(_as) : _as; // Add the ending slash to the paths. So, we can serve the
       // "<page>/index.html" directly for the SSR page.
@@ -2603,13 +2604,21 @@ class Router {
 
       const {
         pathname,
-        query
-      } = url_1.parse(url, true); // If asked to change the current URL we should reload the current page
+        query,
+        protocol
+      } = url_1.parse(url, true);
+
+      if (!pathname || protocol) {
+        if (false) {}
+
+        return resolve(false);
+      } // If asked to change the current URL we should reload the current page
       // (not location.reload() but reload getInitialProps and other Next.js stuffs)
       // We also need to set the method = replaceState always
       // as this should not go into the history (That's how browsers work)
       // We should compare the new asPath to the current asPath, not the url
 
+
       if (!this.urlIsNew(as)) {
         method = 'replaceState';
       } // @ts-ignore pathname is always a string
@@ -2633,7 +2642,7 @@ class Router {
         } // Merge params into `query`, overwriting any specified in search
 
 
-        (0, _assign.default)(query, routeMatch);
+        _Object$assign(query, routeMatch);
       }
 
       Router.events.emit('routeChangeStart', as); // If shallow is true and the route exists in the router cache we reuse the previous result
@@ -2655,7 +2664,7 @@ class Router {
         if (false) {} // @ts-ignore pathname is always defined
 
 
-        this.set(route, pathname, query, as, (0, _assign.default)({}, routeInfo, {
+        this.set(route, pathname, query, as, _Object$assign({}, routeInfo, {
           hash
         }));
 
@@ -2691,10 +2700,10 @@ class Router {
     // If the route is already rendered on the screen.
 
     if (shallow && cachedRouteInfo && this.route === route) {
-      return _promise.default.resolve(cachedRouteInfo);
+      return _Promise.resolve(cachedRouteInfo);
     }
 
-    return new _promise.default((resolve, reject) => {
+    return new _Promise((resolve, reject) => {
       if (cachedRouteInfo) {
         return resolve(cachedRouteInfo);
       }
@@ -2709,25 +2718,20 @@ class Router {
 
       if (false) {}
 
-      return new _promise.default((resolve, reject) => {
-        const ctx = {
+      return new _Promise((resolve, reject) => {
+        // we provide AppTree later so this needs to be `any`
+        this.getInitialProps(Component, {
           pathname,
           query,
           asPath: as
-        };
-        this.getInitialProps(Component, ctx).then(props => {
-          // if data is inlined during prerender it is a string
-          if (props && typeof props.pageProps === 'string') {
-            props.pageProps = JSON.parse(props.pageProps);
-          }
-
+        }).then(props => {
           routeInfo.props = props;
           this.components[route] = routeInfo;
           resolve(routeInfo);
         }, reject);
       });
     }).catch(err => {
-      return new _promise.default(resolve => {
+      return new _Promise(resolve => {
         if (err.code === 'PAGE_LOAD_ERROR') {
           // If we can't load the page it could be one of following reasons
           //  1. Page doesn't exists
@@ -2756,13 +2760,12 @@ class Router {
             Component,
             err
           };
-          const ctx = {
-            err,
-            pathname,
-            query
-          };
-          return new _promise.default(resolve => {
-            this.getInitialProps(Component, ctx).then(props => {
+          return new _Promise(resolve => {
+            this.getInitialProps(Component, {
+              err,
+              pathname,
+              query
+            }).then(props => {
               routeInfo.props = props;
               routeInfo.error = err;
               resolve(routeInfo);
@@ -2852,12 +2855,20 @@ class Router {
 
 
   prefetch(url) {
-    return new _promise.default((resolve, reject) => {
-      // Prefetch is not supported in development mode because it would trigger on-demand-entries
-      if (false) {}
+    return new _Promise((resolve, reject) => {
       const {
-        pathname
-      } = url_1.parse(url); // @ts-ignore pathname is always defined
+        pathname,
+        protocol
+      } = url_1.parse(url);
+
+      if (!pathname || protocol) {
+        if (false) {}
+
+        return;
+      } // Prefetch is not supported in development mode because it would trigger on-demand-entries
+
+
+      if (false) {} // @ts-ignore pathname is always defined
 
       const route = toRoute(pathname);
       this.pageLoader.prefetch(route).then(resolve, reject);
@@ -2897,12 +2908,47 @@ class Router {
     const {
       Component: App
     } = this.components['/_app'];
-    const props = await utils_1.loadGetInitialProps(App, {
-      AppTree: this._wrapApp(App),
-      Component,
-      router: this,
-      ctx
-    });
+    let props;
+
+    if ( // @ts-ignore workaround for dead-code elimination
+    (self.__HAS_SPR || "production" !== 'production') && Component.__NEXT_SPR) {
+      let status;
+      const url = ctx.asPath ? ctx.asPath : url_1.format({
+        pathname: ctx.pathname,
+        query: ctx.query
+      });
+      props = await fetch(url, {
+        headers: {
+          'content-type': 'application/json'
+        }
+      }).then(res => {
+        if (!res.ok) {
+          status = res.status;
+          throw new Error('failed to load prerender data');
+        }
+
+        return res.json();
+      }).then(pageProps => {
+        return {
+          pageProps
+        };
+      }).catch(err => {
+        return {
+          error: err.message,
+          status
+        };
+      });
+    } else {
+      const AppTree = this._wrapApp(App);
+
+      ctx.AppTree = AppTree;
+      props = await utils_1.loadGetInitialProps(App, {
+        AppTree,
+        Component,
+        router: this,
+        ctx
+      });
+    }
 
     if (cancel === this.clc) {
       this.clc = null;
@@ -2963,11 +3009,9 @@ module.exports = __webpack_require__("/eQG");
 "use strict";
 
 
-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");
 
-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });
 
@@ -4192,14 +4236,13 @@ module.exports = __webpack_require__("NegM");
 "use strict";
 
 
-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");
 
-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 }); // Identify /[param]/ in route string
 
+
 const TEST_ROUTE = /\/\[[^\/]+?\](?=\/|$)/;
 
 function isDynamicRoute(route) {
@@ -4319,18 +4362,17 @@ The above copyright notice and this permission notice shall be included in all c
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
 
-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _create = _interopRequireDefault(__webpack_require__("SqZg"));
+var _Object$create = __webpack_require__("SqZg");
 
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");
 
-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });
 
 function mitt() {
-  const all = (0, _create.default)(null);
+  const all = _Object$create(null);
+
   return {
     on(type, handler) {
       ;
@@ -4474,8 +4516,7 @@ const singletonRouter = {
 
 }; // Create public properties and methods of the router in the singletonRouter
 
-const urlPropertyFields = ['pathname', 'route', 'query', 'asPath'];
-const propertyFields = ['components'];
+const urlPropertyFields = ['pathname', 'route', 'query', 'asPath', 'components'];
 const routerEvents = ['routeChangeStart', 'beforeHistoryChange', 'routeChangeComplete', 'routeChangeError', 'hashChangeStart', 'hashChangeComplete'];
 const coreMethodFields = ['push', 'replace', 'reload', 'back', 'prefetch', 'beforePopState']; // Events is a static property on the router, the router doesn't have to be initialized to use it
 
@@ -4485,7 +4526,7 @@ const coreMethodFields = ['push', 'replace', 'reload', 'back', 'prefetch', 'befo
   }
 
 });
-propertyFields.concat(urlPropertyFields).forEach(field => {
+urlPropertyFields.forEach(field => {
   // Here we need to use Object.defineProperty because, we need to return
   // the property assigned to the actual router
   // The value might get changed as we change routes and this is the
@@ -4581,18 +4622,6 @@ function makePublicRouterInstance(router) {
 
 
   instance.events = _router2.default.events;
-  propertyFields.forEach(field => {
-    // Here we need to use Object.defineProperty because, we need to return
-    // the property assigned to the actual router
-    // The value might get changed as we change routes and this is the
-    // proper way to access it
-    (0, _defineProperty.default)(instance, field, {
-      get() {
-        return _router[field];
-      }
-
-    });
-  });
   coreMethodFields.forEach(field => {
     instance[field] = function () {
       return _router[field](...arguments);
@@ -5004,7 +5033,7 @@ module.exports = Object.keys || function keys(O) {
 /***/ }),
 
 /***/ "yLpj":
-/***/ (function(module, exports, __webpack_require__) {
+/***/ (function(module, exports) {
 
 var g;
 
@@ -5018,7 +5047,7 @@ try {
 	g = g || new Function("return this")();
 } catch (e) {
 	// This works if the window reference is available
-	if (true) g = window;
+	if (typeof window === "object") g = window;
 }
 
 // g can still be undefined, but nothing to do about it...
@@ -5055,7 +5084,7 @@ var Ca={injectEventPluginOrder:function(a){if(ba)throw t(Error(101));ba=Array.pr
 function Da(a,b){var c=a.stateNode;if(!c)return null;var d=sa(c);if(!d)return null;c=d[b];a:switch(b){case "onClick":case "onClickCapture":case "onDoubleClick":case "onDoubleClickCapture":case "onMouseDown":case "onMouseDownCapture":case "onMouseMove":case "onMouseMoveCapture":case "onMouseUp":case "onMouseUpCapture":(d=!d.disabled)||(a=a.type,d=!("button"===a||"input"===a||"select"===a||"textarea"===a));a=!d;break a;default:a=!1}if(a)return null;if(c&&"function"!==typeof c)throw t(Error(231),b,typeof c);
 return c}var Ea=Math.random().toString(36).slice(2),Fa="__reactInternalInstance$"+Ea,Ga="__reactEventHandlers$"+Ea;function Ha(a){if(a[Fa])return a[Fa];for(;!a[Fa];)if(a.parentNode)a=a.parentNode;else return null;a=a[Fa];return 5===a.tag||6===a.tag?a:null}function Ia(a){a=a[Fa];return!a||5!==a.tag&&6!==a.tag?null:a}function Ja(a){if(5===a.tag||6===a.tag)return a.stateNode;throw t(Error(33));}function Ka(a){return a[Ga]||null}function La(a){do a=a.return;while(a&&5!==a.tag);return a?a:null}
 function Ma(a,b,c){if(b=Da(a,c.dispatchConfig.phasedRegistrationNames[b]))c._dispatchListeners=xa(c._dispatchListeners,b),c._dispatchInstances=xa(c._dispatchInstances,a)}function Na(a){if(a&&a.dispatchConfig.phasedRegistrationNames){for(var b=a._targetInst,c=[];b;)c.push(b),b=La(b);for(b=c.length;0<b--;)Ma(c[b],"captured",a);for(b=0;b<c.length;b++)Ma(c[b],"bubbled",a)}}
-function Oa(a,b,c){a&&c&&c.dispatchConfig.registrationName&&(b=Da(a,c.dispatchConfig.registrationName))&&(c._dispatchListeners=xa(c._dispatchListeners,b),c._dispatchInstances=xa(c._dispatchInstances,a))}function Pa(a){a&&a.dispatchConfig.registrationName&&Oa(a._targetInst,null,a)}function Qa(a){ya(a,Na)}var Ra=!( false||"undefined"===typeof window.document||"undefined"===typeof window.document.createElement);
+function Oa(a,b,c){a&&c&&c.dispatchConfig.registrationName&&(b=Da(a,c.dispatchConfig.registrationName))&&(c._dispatchListeners=xa(c._dispatchListeners,b),c._dispatchInstances=xa(c._dispatchInstances,a))}function Pa(a){a&&a.dispatchConfig.registrationName&&Oa(a._targetInst,null,a)}function Qa(a){ya(a,Na)}var Ra=!("undefined"===typeof window||"undefined"===typeof window.document||"undefined"===typeof window.document.createElement);
 function Sa(a,b){var c={};c[a.toLowerCase()]=b.toLowerCase();c["Webkit"+a]="webkit"+b;c["Moz"+a]="moz"+b;return c}var Ta={animationend:Sa("Animation","AnimationEnd"),animationiteration:Sa("Animation","AnimationIteration"),animationstart:Sa("Animation","AnimationStart"),transitionend:Sa("Transition","TransitionEnd")},Ua={},Va={};
 Ra&&(Va=document.createElement("div").style,"AnimationEvent"in window||(delete Ta.animationend.animation,delete Ta.animationiteration.animation,delete Ta.animationstart.animation),"TransitionEvent"in window||delete Ta.transitionend.transition);function Wa(a){if(Ua[a])return Ua[a];if(!Ta[a])return a;var b=Ta[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in Va)return Ua[a]=b[c];return a}
 var Xa=Wa("animationend"),Ya=Wa("animationiteration"),Za=Wa("animationstart"),ab=Wa("transitionend"),bb="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),cb=null,db=null,eb=null;
Diff for _app.js
@@ -1,69 +1,22 @@
 (window["webpackJsonp"] = window["webpackJsonp"] || []).push([[2],{
 
-/***/ "+oT+":
-/***/ (function(module, exports, __webpack_require__) {
-
-var _Promise = __webpack_require__("eVuF");
-
-function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
-  try {
-    var info = gen[key](arg);
-    var value = info.value;
-  } catch (error) {
-    reject(error);
-    return;
-  }
-
-  if (info.done) {
-    resolve(value);
-  } else {
-    _Promise.resolve(value).then(_next, _throw);
-  }
-}
-
-function _asyncToGenerator(fn) {
-  return function () {
-    var self = this,
-        args = arguments;
-    return new _Promise(function (resolve, reject) {
-      var gen = fn.apply(self, args);
-
-      function _next(value) {
-        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
-      }
-
-      function _throw(err) {
-        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
-      }
-
-      _next(undefined);
-    });
-  };
-}
-
-module.exports = _asyncToGenerator;
-
-/***/ }),
-
 /***/ "B5Ud":
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
-var _interopRequireDefault2 = __webpack_require__("KI45");
-
-var _classCallCheck2 = _interopRequireDefault2(__webpack_require__("0iUn"));
+var _classCallCheck = __webpack_require__("/HRN");
 
-var _createClass2 = _interopRequireDefault2(__webpack_require__("sLSF"));
+var _createClass = __webpack_require__("WaGi");
 
-var _possibleConstructorReturn2 = _interopRequireDefault2(__webpack_require__("MI3g"));
+var _possibleConstructorReturn = __webpack_require__("ZDA2");
 
-var _getPrototypeOf2 = _interopRequireDefault2(__webpack_require__("a7VT"));
+var _getPrototypeOf = __webpack_require__("/+P4");
 
-var _inherits2 = _interopRequireDefault2(__webpack_require__("Tit0"));
+var _inherits = __webpack_require__("N9n2");
 
-var _regenerator = _interopRequireDefault2(__webpack_require__("ln6h"));
+var _regeneratorRuntime = __webpack_require__("ln6h");
 
 var _interopRequireDefault = __webpack_require__("KI45");
 
@@ -98,9 +51,9 @@ function appGetInitialProps(_x) {
 function _appGetInitialProps() {
   _appGetInitialProps = (0, _asyncToGenerator2["default"])(
   /*#__PURE__*/
-  _regenerator["default"].mark(function _callee(_ref) {
+  _regeneratorRuntime.mark(function _callee(_ref) {
     var Component, ctx, pageProps;
-    return _regenerator["default"].wrap(function _callee$(_context) {
+    return _regeneratorRuntime.wrap(function _callee$(_context) {
       while (1) {
         switch (_context.prev = _context.next) {
           case 0:
@@ -127,14 +80,15 @@ function _appGetInitialProps() {
 var App =
 /*#__PURE__*/
 function (_react$default$Compon) {
-  (0, _inherits2["default"])(App, _react$default$Compon);
+  _inherits(App, _react$default$Compon);
 
   function App() {
-    (0, _classCallCheck2["default"])(this, App);
-    return (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(App).apply(this, arguments));
+    _classCallCheck(this, App);
+
+    return _possibleConstructorReturn(this, _getPrototypeOf(App).apply(this, arguments));
   }
 
-  (0, _createClass2["default"])(App, [{
+  _createClass(App, [{
     key: "getChildContext",
     value: function getChildContext() {
       return {
@@ -157,11 +111,12 @@ function (_react$default$Compon) {
           Component = _this$props.Component,
           pageProps = _this$props.pageProps;
       var url = createUrl(router);
-      return _react["default"].createElement(Container, null, _react["default"].createElement(Component, (0, _extends2["default"])({}, pageProps, {
+      return _react["default"].createElement(Component, (0, _extends2["default"])({}, pageProps, {
         url: url
-      })));
+      }));
     }
   }]);
+
   return App;
 }(_react["default"].Component); // @deprecated noop for now until removal
Diff for _error.js
@@ -21,17 +21,15 @@ module.exports = __webpack_require__("WEpk").Set;
 "use strict";
 
 
-var _interopRequireDefault2 = __webpack_require__("KI45");
+var _classCallCheck = __webpack_require__("/HRN");
 
-var _classCallCheck2 = _interopRequireDefault2(__webpack_require__("0iUn"));
+var _createClass = __webpack_require__("WaGi");
 
-var _createClass2 = _interopRequireDefault2(__webpack_require__("sLSF"));
+var _possibleConstructorReturn = __webpack_require__("ZDA2");
 
-var _possibleConstructorReturn2 = _interopRequireDefault2(__webpack_require__("MI3g"));
+var _getPrototypeOf = __webpack_require__("/+P4");
 
-var _getPrototypeOf2 = _interopRequireDefault2(__webpack_require__("a7VT"));
-
-var _inherits2 = _interopRequireDefault2(__webpack_require__("Tit0"));
+var _inherits = __webpack_require__("N9n2");
 
 var _interopRequireDefault = __webpack_require__("KI45");
 
@@ -55,14 +53,15 @@ var statusCodes = {
 var Error =
 /*#__PURE__*/
 function (_react$default$Compon) {
-  (0, _inherits2["default"])(Error, _react$default$Compon);
+  _inherits(Error, _react$default$Compon);
 
   function Error() {
-    (0, _classCallCheck2["default"])(this, Error);
-    return (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(Error).apply(this, arguments));
+    _classCallCheck(this, Error);
+
+    return _possibleConstructorReturn(this, _getPrototypeOf(Error).apply(this, arguments));
   }
 
-  (0, _createClass2["default"])(Error, [{
+  _createClass(Error, [{
     key: "render",
     value: function render() {
       var statusCode = this.props.statusCode;
@@ -92,6 +91,7 @@ function (_react$default$Compon) {
       };
     }
   }]);
+
   return Error;
 }(_react["default"].Component);
 
@@ -160,17 +160,26 @@ module.exports = __webpack_require__("WEpk").Array.from;
 
 /***/ }),
 
+/***/ "2PDY":
+/***/ (function(module, exports) {
+
+function _nonIterableSpread() {
+  throw new TypeError("Invalid attempt to spread non-iterable instance");
+}
+
+module.exports = _nonIterableSpread;
+
+/***/ }),
+
 /***/ "3JuP":
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");
 
-var __importStar = void 0 && (void 0).__importStar || function (mod) {
+var __importStar = this && this.__importStar || function (mod) {
   if (mod && mod.__esModule) return mod;
   var result = {};
   if (mod != null) for (var k in mod) {
@@ -180,7 +189,7 @@ var __importStar = void 0 && (void 0).__importStar || function (mod) {
   return result;
 };
 
-(0, _defineProperty["default"])(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });
 
@@ -196,40 +205,38 @@ exports.AmpStateContext = React.createContext({});
 "use strict";
 
 
-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _classCallCheck2 = _interopRequireDefault(__webpack_require__("0iUn"));
+var _classCallCheck = __webpack_require__("/HRN");
 
-var _possibleConstructorReturn2 = _interopRequireDefault(__webpack_require__("MI3g"));
+var _possibleConstructorReturn = __webpack_require__("ZDA2");
 
-var _getPrototypeOf2 = _interopRequireDefault(__webpack_require__("a7VT"));
+var _getPrototypeOf = __webpack_require__("/+P4");
 
-var _assertThisInitialized2 = _interopRequireDefault(__webpack_require__("AT/M"));
+var _assertThisInitialized = __webpack_require__("K47E");
 
-var _createClass2 = _interopRequireDefault(__webpack_require__("sLSF"));
+var _createClass = __webpack_require__("WaGi");
 
-var _inherits2 = _interopRequireDefault(__webpack_require__("Tit0"));
+var _inherits = __webpack_require__("N9n2");
 
-var _toConsumableArray2 = _interopRequireDefault(__webpack_require__("dfwq"));
+var _toConsumableArray = __webpack_require__("TbGu");
 
-var _set = _interopRequireDefault(__webpack_require__("ttDY"));
+var _Set = __webpack_require__("ttDY");
 
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");
 
-(0, _defineProperty["default"])(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });
 
 var react_1 = __webpack_require__("q1tI");
 
-var isServer = "object" === 'undefined';
+var isServer = false;
 
 exports["default"] = function () {
-  var mountedInstances = new _set["default"]();
+  var mountedInstances = new _Set();
   var state;
 
   function emitChange(component) {
-    state = component.props.reduceComponentsToState((0, _toConsumableArray2["default"])(mountedInstances), component.props);
+    state = component.props.reduceComponentsToState(_toConsumableArray(mountedInstances), component.props);
 
     if (component.props.handleStateChange) {
       component.props.handleStateChange(state);
@@ -239,8 +246,9 @@ exports["default"] = function () {
   return (
     /*#__PURE__*/
     function (_react_1$Component) {
-      (0, _inherits2["default"])(_class, _react_1$Component);
-      (0, _createClass2["default"])(_class, null, [{
+      _inherits(_class, _react_1$Component);
+
+      _createClass(_class, null, [{
         key: "rewind",
         // Used when server rendering
         value: function rewind() {
@@ -254,18 +262,19 @@ exports["default"] = function () {
       function _class(props) {
         var _this;
 
-        (0, _classCallCheck2["default"])(this, _class);
-        _this = (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(_class).call(this, props));
+        _classCallCheck(this, _class);
+
+        _this = _possibleConstructorReturn(this, _getPrototypeOf(_class).call(this, props));
 
         if (isServer) {
-          mountedInstances.add((0, _assertThisInitialized2["default"])(_this));
-          emitChange((0, _assertThisInitialized2["default"])(_this));
+          mountedInstances.add(_assertThisInitialized(_this));
+          emitChange(_assertThisInitialized(_this));
         }
 
         return _this;
       }
 
-      (0, _createClass2["default"])(_class, [{
+      _createClass(_class, [{
         key: "componentDidMount",
         value: function componentDidMount() {
           mountedInstances.add(this);
@@ -288,6 +297,7 @@ exports["default"] = function () {
           return null;
         }
       }]);
+
       return _class;
     }(react_1.Component)
   );
@@ -362,11 +372,9 @@ module.exports = function (original) {
 "use strict";
 
 
-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");
 
-var __importStar = void 0 && (void 0).__importStar || function (mod) {
+var __importStar = this && this.__importStar || function (mod) {
   if (mod && mod.__esModule) return mod;
   var result = {};
   if (mod != null) for (var k in mod) {
@@ -376,7 +384,7 @@ var __importStar = void 0 && (void 0).__importStar || function (mod) {
   return result;
 };
 
-(0, _defineProperty["default"])(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });
 
@@ -402,6 +410,21 @@ module.exports = function (object, index, value) {
 
 /***/ }),
 
+/***/ "PQJW":
+/***/ (function(module, exports, __webpack_require__) {
+
+var _Array$from = __webpack_require__("d04V");
+
+var _isIterable = __webpack_require__("yLu3");
+
+function _iterableToArray(iter) {
+  if (_isIterable(Object(iter)) || Object.prototype.toString.call(iter) === "[object Arguments]") return _Array$from(iter);
+}
+
+module.exports = _iterableToArray;
+
+/***/ }),
+
 /***/ "PgRs":
 /***/ (function(module, exports, __webpack_require__) {
 
@@ -424,6 +447,23 @@ module.exports = function (iter, ITERATOR) {
 
 /***/ }),
 
+/***/ "TbGu":
+/***/ (function(module, exports, __webpack_require__) {
+
+var arrayWithoutHoles = __webpack_require__("fGSI");
+
+var iterableToArray = __webpack_require__("PQJW");
+
+var nonIterableSpread = __webpack_require__("2PDY");
+
+function _toConsumableArray(arr) {
+  return arrayWithoutHoles(arr) || iterableToArray(arr) || nonIterableSpread();
+}
+
+module.exports = _toConsumableArray;
+
+/***/ }),
+
 /***/ "V+O7":
 /***/ (function(module, exports, __webpack_require__) {
 
@@ -697,17 +737,15 @@ module.exports = {
 "use strict";
 
 
-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");
 
-var __importDefault = void 0 && (void 0).__importDefault || function (mod) {
+var __importDefault = this && this.__importDefault || function (mod) {
   return mod && mod.__esModule ? mod : {
     "default": mod
   };
 };
 
-(0, _defineProperty["default"])(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });
 
@@ -730,9 +768,8 @@ function isInAmpMode() {
 exports.isInAmpMode = isInAmpMode;
 
 function useAmp() {
-  var ampState = react_1["default"].useContext(amp_context_1.AmpStateContext); // un-comment below to not be considered AMP in dirty mode
-
-  return isInAmpMode(ampState); // && ampMode.hasQuery
+  // Don't assign the context value to a variable to save bytes
+  return isInAmpMode(react_1["default"].useContext(amp_context_1.AmpStateContext));
 }
 
 exports.useAmp = useAmp;
@@ -813,20 +850,13 @@ $export($export.P + $export.R, 'Set', { toJSON: __webpack_require__("8iia")('Set
 
 /***/ }),
 
-/***/ "dfwq":
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-
-// EXTERNAL MODULE: ./node_modules/@babel/runtime-corejs2/core-js/array/is-array.js
-var is_array = __webpack_require__("p0XB");
-var is_array_default = /*#__PURE__*/__webpack_require__.n(is_array);
+/***/ "fGSI":
+/***/ (function(module, exports, __webpack_require__) {
 
-// CONCATENATED MODULE: ./node_modules/@babel/runtime-corejs2/helpers/esm/arrayWithoutHoles.js
+var _Array$isArray = __webpack_require__("p0XB");
 
 function _arrayWithoutHoles(arr) {
-  if (is_array_default()(arr)) {
+  if (_Array$isArray(arr)) {
     for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) {
       arr2[i] = arr[i];
     }
@@ -834,32 +864,8 @@ function _arrayWithoutHoles(arr) {
     return arr2;
   }
 }
-// EXTERNAL MODULE: ./node_modules/@babel/runtime-corejs2/core-js/array/from.js
-var from = __webpack_require__("d04V");
-var from_default = /*#__PURE__*/__webpack_require__.n(from);
 
-// EXTERNAL MODULE: ./node_modules/@babel/runtime-corejs2/core-js/is-iterable.js
-var is_iterable = __webpack_require__("yLu3");
-var is_iterable_default = /*#__PURE__*/__webpack_require__.n(is_iterable);
-
-// CONCATENATED MODULE: ./node_modules/@babel/runtime-corejs2/helpers/esm/iterableToArray.js
-
-
-function _iterableToArray(iter) {
-  if (is_iterable_default()(Object(iter)) || Object.prototype.toString.call(iter) === "[object Arguments]") return from_default()(iter);
-}
-// CONCATENATED MODULE: ./node_modules/@babel/runtime-corejs2/helpers/esm/nonIterableSpread.js
-function _nonIterableSpread() {
-  throw new TypeError("Invalid attempt to spread non-iterable instance");
-}
-// CONCATENATED MODULE: ./node_modules/@babel/runtime-corejs2/helpers/esm/toConsumableArray.js
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _toConsumableArray; });
-
-
-
-function _toConsumableArray(arr) {
-  return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();
-}
+module.exports = _arrayWithoutHoles;
 
 /***/ }),
 
@@ -886,19 +892,17 @@ module.exports = __webpack_require__("WEpk").isIterable = function (it) {
 "use strict";
 
 
-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _set = _interopRequireDefault(__webpack_require__("ttDY"));
+var _Set = __webpack_require__("ttDY");
 
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");
 
-var __importDefault = void 0 && (void 0).__importDefault || function (mod) {
+var __importDefault = this && this.__importDefault || function (mod) {
   return mod && mod.__esModule ? mod : {
     "default": mod
   };
 };
 
-(0, _defineProperty["default"])(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });
 
@@ -960,9 +964,9 @@ var METATYPES = ['name', 'httpEquiv', 'charSet', 'itemProp'];
 */
 
 function unique() {
-  var keys = new _set["default"]();
-  var tags = new _set["default"]();
-  var metaTypes = new _set["default"]();
+  var keys = new _Set();
+  var tags = new _Set();
+  var metaTypes = new _Set();
   var metaCategories = {};
   return function (h) {
     if (h.key && typeof h.key !== 'number' && h.key.indexOf('.$') === 0) {
@@ -988,7 +992,7 @@ function unique() {
             metaTypes.add(metatype);
           } else {
             var category = h.props[metatype];
-            var categories = metaCategories[metatype] || new _set["default"]();
+            var categories = metaCategories[metatype] || new _Set();
             if (categories.has(category)) return false;
             categories.add(category);
             metaCategories[metatype] = categories;
Diff for hooks.js
@@ -5,31 +5,85 @@
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
-/* harmony import */ var _babel_runtime_corejs2_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("doui");
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("q1tI");
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
 
+// EXTERNAL MODULE: ./node_modules/@babel/runtime-corejs2/core-js/array/is-array.js
+var is_array = __webpack_require__("p0XB");
+var is_array_default = /*#__PURE__*/__webpack_require__.n(is_array);
 
-/* harmony default export */ __webpack_exports__["default"] = (function () {
-  var _React$useState = react__WEBPACK_IMPORTED_MODULE_1___default.a.useState(0),
-      _React$useState2 = Object(_babel_runtime_corejs2_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__["default"])(_React$useState, 2),
+// CONCATENATED MODULE: ./node_modules/@babel/runtime-corejs2/helpers/esm/arrayWithHoles.js
+
+function _arrayWithHoles(arr) {
+  if (is_array_default()(arr)) return arr;
+}
+// EXTERNAL MODULE: ./node_modules/@babel/runtime-corejs2/core-js/get-iterator.js
+var get_iterator = __webpack_require__("XXOK");
+var get_iterator_default = /*#__PURE__*/__webpack_require__.n(get_iterator);
+
+// CONCATENATED MODULE: ./node_modules/@babel/runtime-corejs2/helpers/esm/iterableToArrayLimit.js
+
+function _iterableToArrayLimit(arr, i) {
+  var _arr = [];
+  var _n = true;
+  var _d = false;
+  var _e = undefined;
+
+  try {
+    for (var _i = get_iterator_default()(arr), _s; !(_n = (_s = _i.next()).done); _n = true) {
+      _arr.push(_s.value);
+
+      if (i && _arr.length === i) break;
+    }
+  } catch (err) {
+    _d = true;
+    _e = err;
+  } finally {
+    try {
+      if (!_n && _i["return"] != null) _i["return"]();
+    } finally {
+      if (_d) throw _e;
+    }
+  }
+
+  return _arr;
+}
+// CONCATENATED MODULE: ./node_modules/@babel/runtime-corejs2/helpers/esm/nonIterableRest.js
+function _nonIterableRest() {
+  throw new TypeError("Invalid attempt to destructure non-iterable instance");
+}
+// CONCATENATED MODULE: ./node_modules/@babel/runtime-corejs2/helpers/esm/slicedToArray.js
+
+
+
+function _slicedToArray(arr, i) {
+  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();
+}
+// EXTERNAL MODULE: ./node_modules/react/index.js
+var react = __webpack_require__("q1tI");
+var react_default = /*#__PURE__*/__webpack_require__.n(react);
+
+// CONCATENATED MODULE: ./pages/hooks.js
+
+var __jsx = react_default.a.createElement;
+
+/* harmony default export */ var hooks = __webpack_exports__["default"] = (function () {
+  var _React$useState = react_default.a.useState(0),
+      _React$useState2 = _slicedToArray(_React$useState, 2),
       clicks1 = _React$useState2[0],
       setClicks1 = _React$useState2[1];
 
-  var _useState = Object(react__WEBPACK_IMPORTED_MODULE_1__["useState"])(0),
-      _useState2 = Object(_babel_runtime_corejs2_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__["default"])(_useState, 2),
-      clicks2 = _useState2[0],
-      setClicks2 = _useState2[1];
+  var _useState = Object(react["useState"])(0),
+      clicks2 = _useState[0],
+      setClicks2 = _useState[1];
 
-  var doClick1 = react__WEBPACK_IMPORTED_MODULE_1___default.a.useCallback(function () {
+  var doClick1 = react_default.a.useCallback(function () {
     setClicks1(clicks1 + 1);
   }, [clicks1]);
-  var doClick2 = Object(react__WEBPACK_IMPORTED_MODULE_1__["useCallback"])(function () {
+  var doClick2 = Object(react["useCallback"])(function () {
     setClicks2(clicks2 + 1);
   }, [clicks2]);
-  return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_1___default.a.Fragment, null, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("h3", null, "Clicks ", clicks1), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("button", {
+  return __jsx(react_default.a.Fragment, null, __jsx("h3", null, "Clicks ", clicks1), __jsx("button", {
     onClick: doClick1
-  }, "Click me"), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("h3", null, "Clicks ", clicks2), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("button", {
+  }, "Click me"), __jsx("h3", null, "Clicks ", clicks2), __jsx("button", {
     onClick: doClick2
   }, "Click me"));
 });
Diff for link.js
@@ -65,10 +65,11 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("YFqc");
 /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(next_link__WEBPACK_IMPORTED_MODULE_1__);
 
+var __jsx = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement;
 
 
 function aLink(props) {
-  return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("h3", null, "A Link page!"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(next_link__WEBPACK_IMPORTED_MODULE_1___default.a, {
+  return __jsx("div", null, __jsx("h3", null, "A Link page!"), __jsx(next_link__WEBPACK_IMPORTED_MODULE_1___default.a, {
     href: "/"
   }, "Go to /"));
 }
@@ -407,17 +408,15 @@ module.exports = function (COLLECTION) {
 "use strict";
 
 
-var _interopRequireDefault2 = __webpack_require__("KI45");
+var _classCallCheck = __webpack_require__("/HRN");
 
-var _classCallCheck2 = _interopRequireDefault2(__webpack_require__("0iUn"));
+var _createClass = __webpack_require__("WaGi");
 
-var _createClass2 = _interopRequireDefault2(__webpack_require__("sLSF"));
+var _possibleConstructorReturn = __webpack_require__("ZDA2");
 
-var _possibleConstructorReturn2 = _interopRequireDefault2(__webpack_require__("MI3g"));
+var _getPrototypeOf = __webpack_require__("/+P4");
 
-var _getPrototypeOf2 = _interopRequireDefault2(__webpack_require__("a7VT"));
-
-var _inherits2 = _interopRequireDefault2(__webpack_require__("Tit0"));
+var _inherits = __webpack_require__("N9n2");
 
 var _interopRequireWildcard = __webpack_require__("5Uuq");
 
@@ -471,7 +470,7 @@ function formatUrl(url) {
 
 var observer;
 var listeners = new _map["default"]();
-var IntersectionObserver =  true ? window.IntersectionObserver : undefined;
+var IntersectionObserver = true ? window.IntersectionObserver : undefined;
 
 function getObserver() {
   // Return shared instance of IntersectionObserver if already created
@@ -521,13 +520,15 @@ var listenToIntersections = function listenToIntersections(el, cb) {
 var Link =
 /*#__PURE__*/
 function (_react$Component) {
-  (0, _inherits2["default"])(Link, _react$Component);
+  _inherits(Link, _react$Component);
 
-  function Link() {
+  function Link(props) {
     var _this;
 
-    (0, _classCallCheck2["default"])(this, Link);
-    _this = (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(Link).apply(this, arguments));
+    _classCallCheck(this, Link);
+
+    _this = _possibleConstructorReturn(this, _getPrototypeOf(Link).call(this, props));
+    _this.p = void 0;
 
     _this.cleanUpListeners = function () {};
 
@@ -554,7 +555,7 @@ function (_react$Component) {
           as = _this$formatUrls.as;
 
       if (!isLocal(href)) {
-        // ignore click if it's outside our scope
+        // ignore click if it's outside our scope (e.g. https://google.com)
         return;
       }
 
@@ -582,10 +583,13 @@ function (_react$Component) {
       });
     };
 
+    if (false) {}
+
+    _this.p = props.prefetch !== false;
     return _this;
   }
 
-  (0, _createClass2["default"])(Link, [{
+  _createClass(Link, [{
     key: "componentWillUnmount",
     value: function componentWillUnmount() {
       this.cleanUpListeners();
@@ -595,7 +599,7 @@ function (_react$Component) {
     value: function handleRef(ref) {
       var _this2 = this;
 
-      if (this.props.prefetch && IntersectionObserver && ref && ref.tagName) {
+      if (this.p && IntersectionObserver && ref && ref.tagName) {
         this.cleanUpListeners();
         this.cleanUpListeners = listenToIntersections(ref, function () {
           _this2.prefetch();
@@ -607,7 +611,7 @@ function (_react$Component) {
   }, {
     key: "prefetch",
     value: function prefetch() {
-      if (!this.props.prefetch || "object" === 'undefined') return; // Prefetch the JSON page if asked (only in the client)
+      if (!this.p || false) return; // Prefetch the JSON page if asked (only in the client)
 
       var pathname = window.location.pathname;
 
@@ -627,7 +631,7 @@ function (_react$Component) {
 
       var _this$formatUrls3 = this.formatUrls(this.props.href, this.props.as),
           href = _this$formatUrls3.href,
-          as = _this$formatUrls3.as; // Deprecated. Warning shown by propType check. If the childen provided is a string (<Link>example</Link>) we wrap it in an <a> tag
+          as = _this$formatUrls3.as; // Deprecated. Warning shown by propType check. If the children provided is a string (<Link>example</Link>) we wrap it in an <a> tag
 
 
       if (typeof children === 'string') {
@@ -639,7 +643,13 @@ function (_react$Component) {
 
       var props = {
         ref: function ref(el) {
-          return _this3.handleRef(el);
+          _this3.handleRef(el);
+
+          if (child && typeof child === 'object' && child.ref) {
+            if (typeof child.ref === 'function') child.ref(el);else if (typeof child.ref === 'object') {
+              child.ref.current = el;
+            }
+          }
         },
         onMouseEnter: function onMouseEnter(e) {
           if (child.props && typeof child.props.onMouseEnter === 'function') {
@@ -672,13 +682,11 @@ function (_react$Component) {
       return _react["default"].cloneElement(child, props);
     }
   }]);
+
   return Link;
 }(_react.Component);
 
 Link.propTypes = void 0;
-Link.defaultProps = {
-  prefetch: true
-};
 
 if (false) { var exact, warn; }
Diff for routerDirect.js
@@ -23,12 +23,13 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("nOHt");
 /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(next_router__WEBPACK_IMPORTED_MODULE_1__);
 
+var __jsx = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement;
 
 /* eslint-disable-next-line */
 
 
 function routerDirect(props) {
-  return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, "I import the router directly");
+  return __jsx("div", null, "I import the router directly");
 }
 
 routerDirect.getInitialProps = function () {
Diff for withRouter.js
@@ -10,10 +10,11 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("nOHt");
 /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(next_router__WEBPACK_IMPORTED_MODULE_1__);
 
+var __jsx = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement;
 
 
 function useWithRouter(props) {
-  return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, "I use withRouter");
+  return __jsx("div", null, "I use withRouter");
 }
 
 useWithRouter.getInitialProps = function () {
Diff for _app.module.js
@@ -116,9 +116,9 @@ class App extends _react.default.Component {
       pageProps
     } = this.props;
     const url = createUrl(router);
-    return _react.default.createElement(Container, null, _react.default.createElement(Component, (0, _extends2.default)({}, pageProps, {
+    return _react.default.createElement(Component, (0, _extends2.default)({}, pageProps, {
       url: url
-    })));
+    }));
   }
 
 } // @deprecated noop for now until removal
Diff for _error.module.js
@@ -135,11 +135,9 @@ const styles = {
 "use strict";
 
 
-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");
 
-var __importStar = void 0 && (void 0).__importStar || function (mod) {
+var __importStar = this && this.__importStar || function (mod) {
   if (mod && mod.__esModule) return mod;
   var result = {};
   if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
@@ -147,7 +145,7 @@ var __importStar = void 0 && (void 0).__importStar || function (mod) {
   return result;
 };
 
-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });
 
@@ -163,22 +161,20 @@ exports.AmpStateContext = React.createContext({});
 "use strict";
 
 
-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _set = _interopRequireDefault(__webpack_require__("ttDY"));
+var _Set = __webpack_require__("ttDY");
 
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");
 
-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });
 
 const react_1 = __webpack_require__("q1tI");
 
-const isServer = "object" === 'undefined';
+const isServer = false;
 
 exports.default = () => {
-  const mountedInstances = new _set.default();
+  const mountedInstances = new _Set();
   let state;
 
   function emitChange(component) {
@@ -357,11 +353,9 @@ module.exports = function (original) {
 "use strict";
 
 
-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");
 
-var __importStar = void 0 && (void 0).__importStar || function (mod) {
+var __importStar = this && this.__importStar || function (mod) {
   if (mod && mod.__esModule) return mod;
   var result = {};
   if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
@@ -369,7 +363,7 @@ var __importStar = void 0 && (void 0).__importStar || function (mod) {
   return result;
 };
 
-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });
 
@@ -619,17 +613,15 @@ module.exports = {
 "use strict";
 
 
-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");
 
-var __importDefault = void 0 && (void 0).__importDefault || function (mod) {
+var __importDefault = this && this.__importDefault || function (mod) {
   return mod && mod.__esModule ? mod : {
     "default": mod
   };
 };
 
-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });
 
@@ -649,9 +641,8 @@ function isInAmpMode() {
 exports.isInAmpMode = isInAmpMode;
 
 function useAmp() {
-  const ampState = react_1.default.useContext(amp_context_1.AmpStateContext); // un-comment below to not be considered AMP in dirty mode
-
-  return isInAmpMode(ampState); // && ampMode.hasQuery
+  // Don't assign the context value to a variable to save bytes
+  return isInAmpMode(react_1.default.useContext(amp_context_1.AmpStateContext));
 }
 
 exports.useAmp = useAmp;
@@ -743,19 +734,17 @@ module.exports = Array.isArray || function isArray(arg) {
 "use strict";
 
 
-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _set = _interopRequireDefault(__webpack_require__("ttDY"));
+var _Set = __webpack_require__("ttDY");
 
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");
 
-var __importDefault = void 0 && (void 0).__importDefault || function (mod) {
+var __importDefault = this && this.__importDefault || function (mod) {
   return mod && mod.__esModule ? mod : {
     "default": mod
   };
 };
 
-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });
 
@@ -817,9 +806,9 @@ const METATYPES = ['name', 'httpEquiv', 'charSet', 'itemProp'];
 */
 
 function unique() {
-  const keys = new _set.default();
-  const tags = new _set.default();
-  const metaTypes = new _set.default();
+  const keys = new _Set();
+  const tags = new _Set();
+  const metaTypes = new _Set();
   const metaCategories = {};
   return h => {
     if (h.key && typeof h.key !== 'number' && h.key.indexOf('.$') === 0) {
@@ -845,7 +834,7 @@ function unique() {
             metaTypes.add(metatype);
           } else {
             const category = h.props[metatype];
-            const categories = metaCategories[metatype] || new _set.default();
+            const categories = metaCategories[metatype] || new _Set();
             if (categories.has(category)) return false;
             categories.add(category);
             metaCategories[metatype] = categories;
Diff for hooks.module.js
@@ -7,19 +7,23 @@
 __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("q1tI");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+var __jsx = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement;
 
 /* harmony default export */ __webpack_exports__["default"] = (() => {
   const [clicks1, setClicks1] = react__WEBPACK_IMPORTED_MODULE_0___default.a.useState(0);
-  const [clicks2, setClicks2] = Object(react__WEBPACK_IMPORTED_MODULE_0__["useState"])(0);
+  const {
+    0: clicks2,
+    1: setClicks2
+  } = Object(react__WEBPACK_IMPORTED_MODULE_0__["useState"])(0);
   const doClick1 = react__WEBPACK_IMPORTED_MODULE_0___default.a.useCallback(() => {
     setClicks1(clicks1 + 1);
   }, [clicks1]);
   const doClick2 = Object(react__WEBPACK_IMPORTED_MODULE_0__["useCallback"])(() => {
     setClicks2(clicks2 + 1);
   }, [clicks2]);
-  return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("h3", null, "Clicks ", clicks1), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("button", {
+  return __jsx(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, __jsx("h3", null, "Clicks ", clicks1), __jsx("button", {
     onClick: doClick1
-  }, "Click me"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("h3", null, "Clicks ", clicks2), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("button", {
+  }, "Click me"), __jsx("h3", null, "Clicks ", clicks2), __jsx("button", {
     onClick: doClick2
   }, "Click me"));
 });
Diff for link.module.js
@@ -125,10 +125,11 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("YFqc");
 /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(next_link__WEBPACK_IMPORTED_MODULE_1__);
 
+var __jsx = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement;
 
 
 function aLink(props) {
-  return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("h3", null, "A Link page!"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(next_link__WEBPACK_IMPORTED_MODULE_1___default.a, {
+  return __jsx("div", null, __jsx("h3", null, "A Link page!"), __jsx(next_link__WEBPACK_IMPORTED_MODULE_1___default.a, {
     href: "/"
   }, "Go to /"));
 }
@@ -517,7 +518,7 @@ function formatUrl(url) {
 
 let observer;
 const listeners = new _map.default();
-const IntersectionObserver =  true ? window.IntersectionObserver : undefined;
+const IntersectionObserver = true ? window.IntersectionObserver : undefined;
 
 function getObserver() {
   // Return shared instance of IntersectionObserver if already created
@@ -565,8 +566,9 @@ const listenToIntersections = (el, cb) => {
 };
 
 class Link extends _react.Component {
-  constructor() {
-    super(...arguments);
+  constructor(props) {
+    super(props);
+    this.p = void 0;
 
     this.cleanUpListeners = () => {};
 
@@ -595,7 +597,7 @@ class Link extends _react.Component {
       } = this.formatUrls(this.props.href, this.props.as);
 
       if (!isLocal(href)) {
-        // ignore click if it's outside our scope
+        // ignore click if it's outside our scope (e.g. https://google.com)
         return;
       }
 
@@ -626,6 +628,10 @@ class Link extends _react.Component {
         }
       });
     };
+
+    if (false) {}
+
+    this.p = props.prefetch !== false;
   }
 
   componentWillUnmount() {
@@ -633,7 +639,7 @@ class Link extends _react.Component {
   }
 
   handleRef(ref) {
-    if (this.props.prefetch && IntersectionObserver && ref && ref.tagName) {
+    if (this.p && IntersectionObserver && ref && ref.tagName) {
       this.cleanUpListeners();
       this.cleanUpListeners = listenToIntersections(ref, () => {
         this.prefetch();
@@ -644,7 +650,7 @@ class Link extends _react.Component {
 
 
   prefetch() {
-    if (!this.props.prefetch || "object" === 'undefined') return; // Prefetch the JSON page if asked (only in the client)
+    if (!this.p || false) return; // Prefetch the JSON page if asked (only in the client)
 
     const {
       pathname
@@ -664,7 +670,7 @@ class Link extends _react.Component {
     const {
       href,
       as
-    } = this.formatUrls(this.props.href, this.props.as); // Deprecated. Warning shown by propType check. If the childen provided is a string (<Link>example</Link>) we wrap it in an <a> tag
+    } = this.formatUrls(this.props.href, this.props.as); // Deprecated. Warning shown by propType check. If the children provided is a string (<Link>example</Link>) we wrap it in an <a> tag
 
     if (typeof children === 'string') {
       children = _react.default.createElement("a", null, children);
@@ -674,7 +680,15 @@ class Link extends _react.Component {
     const child = _react.Children.only(children);
 
     const props = {
-      ref: el => this.handleRef(el),
+      ref: el => {
+        this.handleRef(el);
+
+        if (child && typeof child === 'object' && child.ref) {
+          if (typeof child.ref === 'function') child.ref(el);else if (typeof child.ref === 'object') {
+            child.ref.current = el;
+          }
+        }
+      },
       onMouseEnter: e => {
         if (child.props && typeof child.props.onMouseEnter === 'function') {
           child.props.onMouseEnter(e);
@@ -709,9 +723,6 @@ class Link extends _react.Component {
 }
 
 Link.propTypes = void 0;
-Link.defaultProps = {
-  prefetch: true
-};
 
 if (false) {}
Diff for routerDirect.module.js
@@ -23,12 +23,13 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("nOHt");
 /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(next_router__WEBPACK_IMPORTED_MODULE_1__);
 
+var __jsx = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement;
 
 /* eslint-disable-next-line */
 
 
 function routerDirect(props) {
-  return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, "I import the router directly");
+  return __jsx("div", null, "I import the router directly");
 }
 
 routerDirect.getInitialProps = () => ({});
Diff for withRouter.module.js
@@ -10,10 +10,11 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("nOHt");
 /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(next_router__WEBPACK_IMPORTED_MODULE_1__);
 
+var __jsx = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement;
 
 
 function useWithRouter(props) {
-  return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, "I use withRouter");
+  return __jsx("div", null, "I use withRouter");
 }
 
 useWithRouter.getInitialProps = () => ({});

Serverless Mode (Increase detected ⚠️)
General Overall decrease ✓
zeit/next.js canary zeit/next.js refs/tags/v9.0.4-canary.8 Change
buildDuration 22.9s 24.3s ⚠️ +1.4s
nodeModulesSize 41.5 MB 41.3 MB -238 kB
Client Bundles (main, webpack, commons) Overall decrease ✓
zeit/next.js canary zeit/next.js refs/tags/v9.0.4-canary.8 Change
main-HASH.js 19.9 kB 17.9 kB -2.02 kB
main-HASH.js gzip 7.1 kB 6.56 kB -536 B
webpack-HASH.js 1.49 kB 1.53 kB ⚠️ +43 B
webpack-HASH.js gzip 738 B 746 B ⚠️ +8 B
commons.HASH.js 191 kB 190 kB -604 B
commons.HASH.js gzip 61.6 kB 61.6 kB
Overall change -2.58 kB
Client Bundles (main, webpack, commons) Modern Overall decrease ✓
zeit/next.js canary zeit/next.js refs/tags/v9.0.4-canary.8 Change
main-HASH.module.js 17.7 kB 16.2 kB -1.47 kB
main-HASH.module.js gzip 6.72 kB 6.28 kB -448 B
webpack-HASH.module.js 1.49 kB 1.53 kB ⚠️ +43 B
webpack-HASH.module.js gzip 738 B 746 B ⚠️ +8 B
commons.HASH.module.js 171 kB 171 kB ⚠️ +43 B
commons.HASH.module.js gzip 55.3 kB 55.4 kB ⚠️ +94 B
Overall change -1.39 kB
Client Pages Overall decrease ✓
zeit/next.js canary zeit/next.js refs/tags/v9.0.4-canary.8 Change
_app.js 2.39 kB 1.9 kB -490 B
_app.js gzip 1.07 kB 905 B -168 B
_error.js 12.3 kB 12.1 kB -199 B
_error.js gzip 4.8 kB 4.76 kB -38 B
hooks.js 751 B 1.06 kB ⚠️ +311 B
hooks.js gzip 386 B 600 B ⚠️ +214 B
index.js 343 B 343 B
index.js gzip 237 B 237 B
link.js 8.17 kB 8.13 kB -41 B
link.js gzip 3.5 kB 3.49 kB -7 B
routerDirect.js 423 B 429 B ⚠️ +6 B
routerDirect.js gzip 289 B 292 B ⚠️ +3 B
withRouter.js 435 B 439 B ⚠️ +4 B
withRouter.js gzip 286 B 290 B ⚠️ +4 B
Overall change -409 B
Client Pages Modern Overall decrease ✓
zeit/next.js canary zeit/next.js refs/tags/v9.0.4-canary.8 Change
_app.module.js 1.83 kB 1.79 kB -35 B
_app.module.js gzip 875 B 865 B -10 B
_error.module.js 10.6 kB 10.6 kB -23 B
_error.module.js gzip 4.3 kB 4.31 kB ⚠️ +4 B
hooks.module.js 652 B 596 B -56 B
hooks.module.js gzip 353 B 354 B ⚠️ +1 B
index.module.js 319 B 319 B
index.module.js gzip 238 B 238 B
link.module.js 8.46 kB 8.52 kB ⚠️ +57 B
link.module.js gzip 3.65 kB 3.67 kB ⚠️ +21 B
routerDirect.module.js 411 B 417 B ⚠️ +6 B
routerDirect.module.js gzip 290 B 292 B ⚠️ +2 B
withRouter.module.js 423 B 427 B ⚠️ +4 B
withRouter.module.js gzip 288 B 291 B ⚠️ +3 B
Overall change -47 B
Serverless bundles Overall increase ⚠️
zeit/next.js canary zeit/next.js refs/tags/v9.0.4-canary.8 Change
_error.js 247 kB 247 kB -5 B
_error.js gzip 65.7 kB 66.3 kB ⚠️ +546 B
404.html 3.21 kB N/A N/A
404.html gzip 1.23 kB N/A N/A
hooks.html 2.88 kB 2.87 kB -4 B
hooks.html gzip 865 B 863 B -2 B
index.js 248 kB 248 kB -5 B
index.js gzip 66 kB 66.6 kB ⚠️ +597 B
link.js 255 kB 255 kB ⚠️ +223 B
link.js gzip 68.2 kB 68.8 kB ⚠️ +618 B
routerDirect.js 248 kB 248 kB ⚠️ +14 B
routerDirect.js gzip 65.9 kB 66.5 kB ⚠️ +593 B
withRouter.js 248 kB 248 kB ⚠️ +14 B
withRouter.js gzip 66.1 kB 66.6 kB ⚠️ +570 B
Overall change ⚠️ +237 B

Please sign in to comment.