Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add unstable_onPerformanceData helper for performance entries #8480

Merged
merged 13 commits into from
Oct 3, 2019

Conversation

prateekbh
Copy link
Contributor

@ijjk
Copy link
Member

ijjk commented Aug 22, 2019

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
buildDuration 22s 23.3s ⚠️ +1.3s
nodeModulesSize 41.2 MB 41.2 MB ⚠️ +2.85 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.js 18.1 kB 19.1 kB ⚠️ +997 B
main-HASH.js gzip 6.63 kB 6.81 kB ⚠️ +182 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
Overall change ⚠️ +997 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.module.js 16.5 kB 17.4 kB ⚠️ +895 B
main-HASH.module.js gzip 6.36 kB 6.52 kB ⚠️ +164 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH.module.js gzip 746 B 746 B
Overall change ⚠️ +895 B
Client Pages Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.js 1.83 kB 1.88 kB ⚠️ +48 B
_app.js gzip 884 B 913 B ⚠️ +29 B
_error.js 12.1 kB 12.2 kB ⚠️ +48 B
_error.js gzip 4.76 kB 4.78 kB ⚠️ +17 B
hooks.js 12.7 kB 12.8 kB ⚠️ +48 B
hooks.js gzip 4.81 kB 4.83 kB ⚠️ +23 B
index.js 343 B 391 B ⚠️ +48 B
index.js gzip 237 B 264 B ⚠️ +27 B
link.js 8.14 kB 8.18 kB ⚠️ +48 B
link.js gzip 3.49 kB 3.51 kB ⚠️ +22 B
routerDirect.js 433 B 481 B ⚠️ +48 B
routerDirect.js gzip 296 B 325 B ⚠️ +29 B
withRouter.js 444 B 492 B ⚠️ +48 B
withRouter.js gzip 294 B 322 B ⚠️ +28 B
Overall change ⚠️ +336 B
Client Pages Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.module.js 1.73 kB 1.77 kB ⚠️ +44 B
_app.module.js gzip 840 B 869 B ⚠️ +29 B
_error.module.js 23.3 kB 23.4 kB ⚠️ +44 B
_error.module.js gzip 8.62 kB 8.65 kB ⚠️ +27 B
hooks.module.js 1.55 kB 1.59 kB ⚠️ +44 B
hooks.module.js gzip 804 B 826 B ⚠️ +22 B
index.module.js 319 B 363 B ⚠️ +44 B
index.module.js gzip 238 B 265 B ⚠️ +27 B
link.module.js 8.52 kB 8.57 kB ⚠️ +44 B
link.module.js gzip 3.68 kB 3.7 kB ⚠️ +19 B
routerDirect.module.js 419 B 463 B ⚠️ +44 B
routerDirect.module.js gzip 294 B 323 B ⚠️ +29 B
withRouter.module.js 429 B 473 B ⚠️ +44 B
withRouter.module.js gzip 293 B 322 B ⚠️ +29 B
Overall change ⚠️ +308 B
Client Build Manifests
zeit/next.js canary azukaru/next.js relay-analytics Change
_buildManifest.js 81 B 81 B
_buildManifest.js gzip 61 B 61 B
_buildManifest.module.js 81 B 81 B
_buildManifest.module.js gzip 61 B 61 B
Overall change
Fetched pages Overall decrease ✓
zeit/next.js canary azukaru/next.js relay-analytics Change
link 3.75 kB 3.74 kB -1 B
link gzip 963 B 961 B -2 B
index 3.69 kB 3.69 kB -1 B
index gzip 954 B 953 B -1 B
withRouter 3.75 kB 3.75 kB -1 B
withRouter gzip 950 B 948 B -2 B
Overall change -3 B

Diffs

Diff for main-HASH.js
@@ -385,7 +385,7 @@ exports.router = router;
 var ErrorComponent;
 exports.ErrorComponent = ErrorComponent;
 var Component;
-var App;
+var App, perfDataRelayer;
 
 var Container =
 /*#__PURE__*/
@@ -458,7 +458,7 @@ function () {
   var _ref2 = (0, _asyncToGenerator2["default"])(
   /*#__PURE__*/
   _regeneratorRuntime.mark(function _callee(_temp) {
-    var _ref, passedWebpackHMR, initialErr, _require, isValidElementType, renderCtx;
+    var _ref, passedWebpackHMR, _ref3, pageExports, app, initialErr, _require, isValidElementType, renderCtx;
 
     return _regeneratorRuntime.wrap(function _callee$(_context) {
       while (1) {
@@ -469,52 +469,60 @@ function () {
             if (false) {}
 
             _context.next = 4;
-            return pageLoader.loadPage('/_app');
+            return pageLoader.loadPageScript('/_app');
 
           case 4:
-            App = _context.sent;
+            _ref3 = _context.sent;
+            pageExports = _ref3.pageExports;
+            app = _ref3.page;
+            App = app;
+
+            if (pageExports && pageExports.relayPerformanceData) {
+              perfDataRelayer = pageExports.relayPerformanceData;
+            }
+
             initialErr = err;
-            _context.prev = 6;
-            _context.next = 9;
+            _context.prev = 10;
+            _context.next = 13;
             return pageLoader.loadPage(page);
 
-          case 9:
+          case 13:
             Component = _context.sent;
 
             if (true) {
-              _context.next = 14;
+              _context.next = 18;
               break;
             }
 
             _require = __webpack_require__(!(function webpackMissingModule() { var e = new Error("Cannot find module 'react-is'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())), isValidElementType = _require.isValidElementType;
 
             if (isValidElementType(Component)) {
-              _context.next = 14;
+              _context.next = 18;
               break;
             }
 
             throw new Error("The default export is not a React Component in page: \"" + page + "\"");
 
-          case 14:
-            _context.next = 19;
+          case 18:
+            _context.next = 23;
             break;
 
-          case 16:
-            _context.prev = 16;
-            _context.t0 = _context["catch"](6);
+          case 20:
+            _context.prev = 20;
+            _context.t0 = _context["catch"](10);
             // This catches errors like throwing in the top level of a module
             initialErr = _context.t0;
 
-          case 19:
+          case 23:
             if (!window.__NEXT_PRELOADREADY) {
-              _context.next = 22;
+              _context.next = 26;
               break;
             }
 
-            _context.next = 22;
+            _context.next = 26;
             return window.__NEXT_PRELOADREADY(dynamicIds);
 
-          case 22:
+          case 26:
             exports.router = router = (0, _router.createRouter)(page, query, asPath, {
               initialProps: props,
               pageLoader: pageLoader,
@@ -545,12 +553,12 @@ function () {
             render(renderCtx);
             return _context.abrupt("return", emitter);
 
-          case 26:
+          case 30:
           case "end":
             return _context.stop();
         }
       }
-    }, _callee, null, [[6, 16]]);
+    }, _callee, null, [[10, 20]]);
   }));
 
   return function (_x) {
@@ -713,6 +721,20 @@ function renderReactElement(reactEl, domEl) {
   } else {
     _reactDom["default"].render(reactEl, domEl, markRenderComplete);
   }
+
+  relayPaintMetrics();
+}
+
+function relayPaintMetrics() {
+  if (perfDataRelayer) {
+    performance.getEntriesByType('paint').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
 }
 
 function markHydrateComplete() {
@@ -721,6 +743,24 @@ function markHydrateComplete() {
 
   performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
   performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-hydration').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('beforeRender').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
@@ -736,16 +776,30 @@ function markRenderComplete() {
 
   performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
   performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-render').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('beforeRender').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
 function clearMarks() {
   performance.clearMarks();
-  /*
-  * TODO: uncomment the following line when we have a way to
-  * expose this to user code.
-  */
-  // performance.clearMeasures()
+  performance.clearMeasures();
 }
 
 function AppContainer(_ref4) {
@@ -1477,13 +1531,21 @@ function () {
   }, {
     key: "loadPage",
     value: function loadPage(route) {
+      return this.loadPageScript(route).then(function (value) {
+        return value ? value.page : value;
+      });
+    }
+  }, {
+    key: "loadPageScript",
+    value: function loadPageScript(route) {
       var _this3 = this;
 
       route = this.normalizeRoute(route);
       return new _promise["default"](function (resolve, reject) {
         var fire = function fire(_ref) {
           var error = _ref.error,
-              page = _ref.page;
+              page = _ref.page,
+              pageExports = _ref.pageExports;
 
           _this3.pageRegisterEvents.off(route, fire);
 
@@ -1492,7 +1554,10 @@ function () {
           if (error) {
             reject(error);
           } else {
-            resolve(page);
+            resolve({
+              page: page,
+              pageExports: pageExports
+            });
           }
         }; // If there's a cached version of the page, let's use it.
 
@@ -1501,8 +1566,12 @@ function () {
 
         if (cachedPage) {
           var error = cachedPage.error,
-              page = cachedPage.page;
-          error ? reject(error) : resolve(page);
+              page = cachedPage.page,
+              pageExports = cachedPage.pageExports;
+          error ? reject(error) : resolve({
+            page: page,
+            pageExports: pageExports
+          });
           return;
         } // Register a listener to get the page
 
@@ -1597,16 +1666,19 @@ function () {
         try {
           var _regFn = regFn(),
               error = _regFn.error,
-              page = _regFn.page;
+              page = _regFn.page,
+              pageExports = _regFn.pageExports;
 
           _this5.pageCache[route] = {
             error: error,
-            page: page
+            page: page,
+            pageExports: pageExports
           };
 
           _this5.pageRegisterEvents.emit(route, {
             error: error,
-            page: page
+            page: page,
+            pageExports: pageExports
           });
         } catch (error) {
           _this5.pageCache[route] = {
Diff for main-HASH.module.js
@@ -456,7 +456,7 @@ exports.router = router;
 let ErrorComponent;
 exports.ErrorComponent = ErrorComponent;
 let Component;
-let App;
+let App, perfDataRelayer;
 
 class Container extends _react.default.Component {
   componentDidCatch(err, info) {
@@ -514,7 +514,16 @@ function () {
 
     if (false) {}
 
-    App = yield pageLoader.loadPage('/_app');
+    const {
+      pageExports,
+      page: app
+    } = yield pageLoader.loadPageScript('/_app');
+    App = app;
+
+    if (pageExports && pageExports.relayPerformanceData) {
+      perfDataRelayer = pageExports.relayPerformanceData;
+    }
+
     let initialErr = err;
 
     try {
@@ -655,6 +664,20 @@ function renderReactElement(reactEl, domEl) {
   } else {
     _reactDom.default.render(reactEl, domEl, markRenderComplete);
   }
+
+  relayPaintMetrics();
+}
+
+function relayPaintMetrics() {
+  if (perfDataRelayer) {
+    performance.getEntriesByType('paint').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
 }
 
 function markHydrateComplete() {
@@ -663,6 +686,24 @@ function markHydrateComplete() {
 
   performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
   performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-hydration').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('beforeRender').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
@@ -678,16 +719,30 @@ function markRenderComplete() {
 
   performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
   performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-render').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('beforeRender').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
 function clearMarks() {
   performance.clearMarks();
-  /*
-  * TODO: uncomment the following line when we have a way to
-  * expose this to user code.
-  */
-  // performance.clearMeasures()
+  performance.clearMeasures();
 }
 
 function AppContainer(_ref4) {
@@ -1378,12 +1433,17 @@ class PageLoader {
   }
 
   loadPage(route) {
+    return this.loadPageScript(route).then(value => value ? value.page : value);
+  }
+
+  loadPageScript(route) {
     route = this.normalizeRoute(route);
     return new _promise.default((resolve, reject) => {
       const fire = _ref => {
         let {
           error,
-          page
+          page,
+          pageExports
         } = _ref;
         this.pageRegisterEvents.off(route, fire);
         delete this.loadingRoutes[route];
@@ -1391,7 +1451,10 @@ class PageLoader {
         if (error) {
           reject(error);
         } else {
-          resolve(page);
+          resolve({
+            page,
+            pageExports
+          });
         }
       }; // If there's a cached version of the page, let's use it.
 
@@ -1401,9 +1464,13 @@ class PageLoader {
       if (cachedPage) {
         const {
           error,
-          page
+          page,
+          pageExports
         } = cachedPage;
-        error ? reject(error) : resolve(page);
+        error ? reject(error) : resolve({
+          page,
+          pageExports
+        });
         return;
       } // Register a listener to get the page
 
@@ -1473,15 +1540,18 @@ class PageLoader {
       try {
         const {
           error,
-          page
+          page,
+          pageExports
         } = regFn();
         this.pageCache[route] = {
           error,
-          page
+          page,
+          pageExports
         };
         this.pageRegisterEvents.emit(route, {
           error,
-          page
+          page,
+          pageExports
         });
       } catch (error) {
         this.pageCache[route] = {
Diff for _app.js
@@ -194,7 +194,14 @@ function createUrl(router) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_app", function() {
       var page = __webpack_require__("B5Ud")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for _error.js
@@ -144,7 +144,14 @@ var styles = {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_error", function() {
       var page = __webpack_require__("/a9y")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for hooks.js
@@ -996,7 +996,14 @@ module.exports = __webpack_require__("jmDH") ? Object.defineProperties : functio
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/hooks", function() {
       var page = __webpack_require__("+MDD")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for index.js
@@ -24,7 +24,14 @@ Page.getInitialProps = function () {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/", function() {
       var page = __webpack_require__("RNiq")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for link.js
@@ -169,7 +169,14 @@ module.exports = function (TYPE, $create) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/link", function() {
       var page = __webpack_require__("ObF3")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for routerDirect.js
@@ -7,7 +7,14 @@
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/routerDirect", function() {
       var page = __webpack_require__("jSAA")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for withRouter.js
@@ -32,7 +32,14 @@ useWithRouter.getInitialProps = function () {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/withRouter", function() {
       var page = __webpack_require__("0Hlz")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for _app.module.js
@@ -199,7 +199,14 @@ function createUrl(router) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_app", function() {
       var page = __webpack_require__("B5Ud")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for _error.module.js
@@ -123,7 +123,14 @@ const styles = {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_error", function() {
       var page = __webpack_require__("/a9y")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for hooks.module.js
@@ -135,7 +135,14 @@ module.exports = shouldUseNative() ? Object.assign : function (target, source) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/hooks", function() {
       var page = __webpack_require__("+MDD")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for index.module.js
@@ -20,7 +20,14 @@ Page.getInitialProps = () => ({});
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/", function() {
       var page = __webpack_require__("RNiq")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for link.module.js
@@ -227,7 +227,14 @@ module.exports = function (TYPE, $create) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/link", function() {
       var page = __webpack_require__("ObF3")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for routerDirect.module.js
@@ -7,7 +7,14 @@
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/routerDirect", function() {
       var page = __webpack_require__("jSAA")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for withRouter.module.js
@@ -30,7 +30,14 @@ useWithRouter.getInitialProps = () => ({});
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/withRouter", function() {
       var page = __webpack_require__("0Hlz")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
buildDuration 24.5s 24.5s ⚠️ +7ms
nodeModulesSize 41.2 MB 41.2 MB ⚠️ +2.85 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.js 18.1 kB 19.1 kB ⚠️ +997 B
main-HASH.js gzip 6.63 kB 6.81 kB ⚠️ +182 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
Overall change ⚠️ +997 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.module.js 16.5 kB 17.4 kB ⚠️ +895 B
main-HASH.module.js gzip 6.36 kB 6.52 kB ⚠️ +164 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH.module.js gzip 746 B 746 B
Overall change ⚠️ +895 B
Client Pages Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.js 1.83 kB 1.88 kB ⚠️ +48 B
_app.js gzip 884 B 913 B ⚠️ +29 B
_error.js 12.1 kB 12.2 kB ⚠️ +48 B
_error.js gzip 4.76 kB 4.78 kB ⚠️ +17 B
hooks.js 12.7 kB 12.8 kB ⚠️ +48 B
hooks.js gzip 4.81 kB 4.83 kB ⚠️ +23 B
index.js 343 B 391 B ⚠️ +48 B
index.js gzip 237 B 264 B ⚠️ +27 B
link.js 8.14 kB 8.18 kB ⚠️ +48 B
link.js gzip 3.49 kB 3.51 kB ⚠️ +22 B
routerDirect.js 433 B 481 B ⚠️ +48 B
routerDirect.js gzip 296 B 325 B ⚠️ +29 B
withRouter.js 444 B 492 B ⚠️ +48 B
withRouter.js gzip 294 B 322 B ⚠️ +28 B
Overall change ⚠️ +336 B
Client Pages Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.module.js 1.73 kB 1.77 kB ⚠️ +44 B
_app.module.js gzip 840 B 869 B ⚠️ +29 B
_error.module.js 23.3 kB 23.4 kB ⚠️ +44 B
_error.module.js gzip 8.62 kB 8.65 kB ⚠️ +27 B
hooks.module.js 1.55 kB 1.59 kB ⚠️ +44 B
hooks.module.js gzip 804 B 826 B ⚠️ +22 B
index.module.js 319 B 363 B ⚠️ +44 B
index.module.js gzip 238 B 265 B ⚠️ +27 B
link.module.js 8.52 kB 8.57 kB ⚠️ +44 B
link.module.js gzip 3.68 kB 3.7 kB ⚠️ +19 B
routerDirect.module.js 419 B 463 B ⚠️ +44 B
routerDirect.module.js gzip 294 B 323 B ⚠️ +29 B
withRouter.module.js 429 B 473 B ⚠️ +44 B
withRouter.module.js gzip 293 B 322 B ⚠️ +29 B
Overall change ⚠️ +308 B
Client Build Manifests
zeit/next.js canary azukaru/next.js relay-analytics Change
_buildManifest.js 81 B 81 B
_buildManifest.js gzip 61 B 61 B
_buildManifest.module.js 81 B 81 B
_buildManifest.module.js gzip 61 B 61 B
Overall change
Serverless bundles Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_error.js 247 kB 247 kB ⚠️ +5 B
_error.js gzip 66.3 kB 66.3 kB -66 B
hooks.html 3.81 kB 3.81 kB ⚠️ +1 B
hooks.html gzip 981 B 979 B -2 B
index.js 248 kB 248 kB
index.js gzip 66.7 kB 66.6 kB -117 B
link.js 255 kB 255 kB
link.js gzip 68.9 kB 68.9 kB -2 B
routerDirect.js 249 kB 249 kB
routerDirect.js gzip 66.7 kB 66.6 kB -53 B
withRouter.js 248 kB 248 kB
withRouter.js gzip 66.7 kB 66.7 kB ⚠️ +13 B
Overall change ⚠️ +6 B

@ijjk
Copy link
Member

ijjk commented Aug 22, 2019

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
buildDuration 22.9s 23.4s ⚠️ +427ms
nodeModulesSize 41.2 MB 41.2 MB ⚠️ +2.85 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.js 18.1 kB 19.1 kB ⚠️ +997 B
main-HASH.js gzip 6.63 kB 6.81 kB ⚠️ +182 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
Overall change ⚠️ +997 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.module.js 16.5 kB 17.4 kB ⚠️ +895 B
main-HASH.module.js gzip 6.36 kB 6.52 kB ⚠️ +164 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH.module.js gzip 746 B 746 B
Overall change ⚠️ +895 B
Client Pages Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.js 1.83 kB 1.88 kB ⚠️ +48 B
_app.js gzip 884 B 913 B ⚠️ +29 B
_error.js 12.1 kB 12.2 kB ⚠️ +48 B
_error.js gzip 4.76 kB 4.78 kB ⚠️ +17 B
hooks.js 12.7 kB 12.8 kB ⚠️ +48 B
hooks.js gzip 4.81 kB 4.83 kB ⚠️ +23 B
index.js 343 B 391 B ⚠️ +48 B
index.js gzip 237 B 264 B ⚠️ +27 B
link.js 8.14 kB 8.18 kB ⚠️ +48 B
link.js gzip 3.49 kB 3.51 kB ⚠️ +22 B
routerDirect.js 433 B 481 B ⚠️ +48 B
routerDirect.js gzip 296 B 325 B ⚠️ +29 B
withRouter.js 444 B 492 B ⚠️ +48 B
withRouter.js gzip 294 B 322 B ⚠️ +28 B
Overall change ⚠️ +336 B
Client Pages Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.module.js 1.73 kB 1.77 kB ⚠️ +44 B
_app.module.js gzip 840 B 869 B ⚠️ +29 B
_error.module.js 23.3 kB 23.4 kB ⚠️ +44 B
_error.module.js gzip 8.62 kB 8.65 kB ⚠️ +27 B
hooks.module.js 1.55 kB 1.59 kB ⚠️ +44 B
hooks.module.js gzip 804 B 826 B ⚠️ +22 B
index.module.js 319 B 363 B ⚠️ +44 B
index.module.js gzip 238 B 265 B ⚠️ +27 B
link.module.js 8.52 kB 8.57 kB ⚠️ +44 B
link.module.js gzip 3.68 kB 3.7 kB ⚠️ +19 B
routerDirect.module.js 419 B 463 B ⚠️ +44 B
routerDirect.module.js gzip 294 B 323 B ⚠️ +29 B
withRouter.module.js 429 B 473 B ⚠️ +44 B
withRouter.module.js gzip 293 B 322 B ⚠️ +29 B
Overall change ⚠️ +308 B
Client Build Manifests
zeit/next.js canary azukaru/next.js relay-analytics Change
_buildManifest.js 81 B 81 B
_buildManifest.js gzip 61 B 61 B
_buildManifest.module.js 81 B 81 B
_buildManifest.module.js gzip 61 B 61 B
Overall change
Fetched pages Overall decrease ✓
zeit/next.js canary azukaru/next.js relay-analytics Change
link 3.75 kB 3.74 kB -1 B
link gzip 963 B 964 B ⚠️ +1 B
index 3.69 kB 3.69 kB -1 B
index gzip 956 B 955 B -1 B
withRouter 3.75 kB 3.75 kB -1 B
withRouter gzip 950 B 950 B
Overall change -3 B

Diffs

Diff for main-HASH.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[11],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[4],{
 
 /***/ "/h46":
 /***/ (function(module, exports, __webpack_require__) {
@@ -385,7 +385,7 @@ exports.router = router;
 var ErrorComponent;
 exports.ErrorComponent = ErrorComponent;
 var Component;
-var App;
+var App, perfDataRelayer;
 
 var Container =
 /*#__PURE__*/
@@ -458,7 +458,7 @@ function () {
   var _ref2 = (0, _asyncToGenerator2["default"])(
   /*#__PURE__*/
   _regeneratorRuntime.mark(function _callee(_temp) {
-    var _ref, passedWebpackHMR, initialErr, _require, isValidElementType, renderCtx;
+    var _ref, passedWebpackHMR, _ref3, pageExports, app, initialErr, _require, isValidElementType, renderCtx;
 
     return _regeneratorRuntime.wrap(function _callee$(_context) {
       while (1) {
@@ -469,52 +469,60 @@ function () {
             if (false) {}
 
             _context.next = 4;
-            return pageLoader.loadPage('/_app');
+            return pageLoader.loadPageScript('/_app');
 
           case 4:
-            App = _context.sent;
+            _ref3 = _context.sent;
+            pageExports = _ref3.pageExports;
+            app = _ref3.page;
+            App = app;
+
+            if (pageExports && pageExports.relayPerformanceData) {
+              perfDataRelayer = pageExports.relayPerformanceData;
+            }
+
             initialErr = err;
-            _context.prev = 6;
-            _context.next = 9;
+            _context.prev = 10;
+            _context.next = 13;
             return pageLoader.loadPage(page);
 
-          case 9:
+          case 13:
             Component = _context.sent;
 
             if (true) {
-              _context.next = 14;
+              _context.next = 18;
               break;
             }
 
             _require = __webpack_require__(!(function webpackMissingModule() { var e = new Error("Cannot find module 'react-is'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())), isValidElementType = _require.isValidElementType;
 
             if (isValidElementType(Component)) {
-              _context.next = 14;
+              _context.next = 18;
               break;
             }
 
             throw new Error("The default export is not a React Component in page: \"" + page + "\"");
 
-          case 14:
-            _context.next = 19;
+          case 18:
+            _context.next = 23;
             break;
 
-          case 16:
-            _context.prev = 16;
-            _context.t0 = _context["catch"](6);
+          case 20:
+            _context.prev = 20;
+            _context.t0 = _context["catch"](10);
             // This catches errors like throwing in the top level of a module
             initialErr = _context.t0;
 
-          case 19:
+          case 23:
             if (!window.__NEXT_PRELOADREADY) {
-              _context.next = 22;
+              _context.next = 26;
               break;
             }
 
-            _context.next = 22;
+            _context.next = 26;
             return window.__NEXT_PRELOADREADY(dynamicIds);
 
-          case 22:
+          case 26:
             exports.router = router = (0, _router.createRouter)(page, query, asPath, {
               initialProps: props,
               pageLoader: pageLoader,
@@ -545,12 +553,12 @@ function () {
             render(renderCtx);
             return _context.abrupt("return", emitter);
 
-          case 26:
+          case 30:
           case "end":
             return _context.stop();
         }
       }
-    }, _callee, null, [[6, 16]]);
+    }, _callee, null, [[10, 20]]);
   }));
 
   return function (_x) {
@@ -713,6 +721,20 @@ function renderReactElement(reactEl, domEl) {
   } else {
     _reactDom["default"].render(reactEl, domEl, markRenderComplete);
   }
+
+  relayPaintMetrics();
+}
+
+function relayPaintMetrics() {
+  if (perfDataRelayer) {
+    performance.getEntriesByType('paint').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
 }
 
 function markHydrateComplete() {
@@ -721,6 +743,24 @@ function markHydrateComplete() {
 
   performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
   performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-hydration').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('beforeRender').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
@@ -736,16 +776,30 @@ function markRenderComplete() {
 
   performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
   performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-render').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('beforeRender').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
 function clearMarks() {
   performance.clearMarks();
-  /*
-  * TODO: uncomment the following line when we have a way to
-  * expose this to user code.
-  */
-  // performance.clearMeasures()
+  performance.clearMeasures();
 }
 
 function AppContainer(_ref4) {
@@ -1477,13 +1531,21 @@ function () {
   }, {
     key: "loadPage",
     value: function loadPage(route) {
+      return this.loadPageScript(route).then(function (value) {
+        return value ? value.page : value;
+      });
+    }
+  }, {
+    key: "loadPageScript",
+    value: function loadPageScript(route) {
       var _this3 = this;
 
       route = this.normalizeRoute(route);
       return new _promise["default"](function (resolve, reject) {
         var fire = function fire(_ref) {
           var error = _ref.error,
-              page = _ref.page;
+              page = _ref.page,
+              pageExports = _ref.pageExports;
 
           _this3.pageRegisterEvents.off(route, fire);
 
@@ -1492,7 +1554,10 @@ function () {
           if (error) {
             reject(error);
           } else {
-            resolve(page);
+            resolve({
+              page: page,
+              pageExports: pageExports
+            });
           }
         }; // If there's a cached version of the page, let's use it.
 
@@ -1501,8 +1566,12 @@ function () {
 
         if (cachedPage) {
           var error = cachedPage.error,
-              page = cachedPage.page;
-          error ? reject(error) : resolve(page);
+              page = cachedPage.page,
+              pageExports = cachedPage.pageExports;
+          error ? reject(error) : resolve({
+            page: page,
+            pageExports: pageExports
+          });
           return;
         } // Register a listener to get the page
 
@@ -1597,16 +1666,19 @@ function () {
         try {
           var _regFn = regFn(),
               error = _regFn.error,
-              page = _regFn.page;
+              page = _regFn.page,
+              pageExports = _regFn.pageExports;
 
           _this5.pageCache[route] = {
             error: error,
-            page: page
+            page: page,
+            pageExports: pageExports
           };
 
           _this5.pageRegisterEvents.emit(route, {
             error: error,
-            page: page
+            page: page,
+            pageExports: pageExports
           });
         } catch (error) {
           _this5.pageCache[route] = {
Diff for main-HASH.module.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[10],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[3],{
 
 /***/ "+oT+":
 /***/ (function(module, exports, __webpack_require__) {
@@ -456,7 +456,7 @@ exports.router = router;
 let ErrorComponent;
 exports.ErrorComponent = ErrorComponent;
 let Component;
-let App;
+let App, perfDataRelayer;
 
 class Container extends _react.default.Component {
   componentDidCatch(err, info) {
@@ -514,7 +514,16 @@ function () {
 
     if (false) {}
 
-    App = yield pageLoader.loadPage('/_app');
+    const {
+      pageExports,
+      page: app
+    } = yield pageLoader.loadPageScript('/_app');
+    App = app;
+
+    if (pageExports && pageExports.relayPerformanceData) {
+      perfDataRelayer = pageExports.relayPerformanceData;
+    }
+
     let initialErr = err;
 
     try {
@@ -655,6 +664,20 @@ function renderReactElement(reactEl, domEl) {
   } else {
     _reactDom.default.render(reactEl, domEl, markRenderComplete);
   }
+
+  relayPaintMetrics();
+}
+
+function relayPaintMetrics() {
+  if (perfDataRelayer) {
+    performance.getEntriesByType('paint').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
 }
 
 function markHydrateComplete() {
@@ -663,6 +686,24 @@ function markHydrateComplete() {
 
   performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
   performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-hydration').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('beforeRender').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
@@ -678,16 +719,30 @@ function markRenderComplete() {
 
   performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
   performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-render').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('beforeRender').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
 function clearMarks() {
   performance.clearMarks();
-  /*
-  * TODO: uncomment the following line when we have a way to
-  * expose this to user code.
-  */
-  // performance.clearMeasures()
+  performance.clearMeasures();
 }
 
 function AppContainer(_ref4) {
@@ -1378,12 +1433,17 @@ class PageLoader {
   }
 
   loadPage(route) {
+    return this.loadPageScript(route).then(value => value ? value.page : value);
+  }
+
+  loadPageScript(route) {
     route = this.normalizeRoute(route);
     return new _promise.default((resolve, reject) => {
       const fire = _ref => {
         let {
           error,
-          page
+          page,
+          pageExports
         } = _ref;
         this.pageRegisterEvents.off(route, fire);
         delete this.loadingRoutes[route];
@@ -1391,7 +1451,10 @@ class PageLoader {
         if (error) {
           reject(error);
         } else {
-          resolve(page);
+          resolve({
+            page,
+            pageExports
+          });
         }
       }; // If there's a cached version of the page, let's use it.
 
@@ -1401,9 +1464,13 @@ class PageLoader {
       if (cachedPage) {
         const {
           error,
-          page
+          page,
+          pageExports
         } = cachedPage;
-        error ? reject(error) : resolve(page);
+        error ? reject(error) : resolve({
+          page,
+          pageExports
+        });
         return;
       } // Register a listener to get the page
 
@@ -1473,15 +1540,18 @@ class PageLoader {
       try {
         const {
           error,
-          page
+          page,
+          pageExports
         } = regFn();
         this.pageCache[route] = {
           error,
-          page
+          page,
+          pageExports
         };
         this.pageRegisterEvents.emit(route, {
           error,
-          page
+          page,
+          pageExports
         });
       } catch (error) {
         this.pageCache[route] = {
Diff for _app.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[4],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[5],{
 
 /***/ "B5Ud":
 /***/ (function(module, exports, __webpack_require__) {
@@ -194,7 +194,14 @@ function createUrl(router) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_app", function() {
       var page = __webpack_require__("B5Ud")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for _error.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[5],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[6],{
 
 /***/ "+iuc":
 /***/ (function(module, exports, __webpack_require__) {
@@ -144,7 +144,14 @@ var styles = {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_error", function() {
       var page = __webpack_require__("/a9y")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for hooks.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[6],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[7],{
 
 /***/ "+MDD":
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
@@ -996,7 +996,14 @@ module.exports = __webpack_require__("jmDH") ? Object.defineProperties : functio
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/hooks", function() {
       var page = __webpack_require__("+MDD")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for index.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[7],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[8],{
 
 /***/ "RNiq":
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
@@ -24,7 +24,14 @@ Page.getInitialProps = function () {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/", function() {
       var page = __webpack_require__("RNiq")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for link.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[8],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[9],{
 
 /***/ "/h46":
 /***/ (function(module, exports, __webpack_require__) {
@@ -169,7 +169,14 @@ module.exports = function (TYPE, $create) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/link", function() {
       var page = __webpack_require__("ObF3")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for routerDirect.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[9],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[10],{
 
 /***/ "LtRI":
 /***/ (function(module, exports, __webpack_require__) {
@@ -7,7 +7,14 @@
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/routerDirect", function() {
       var page = __webpack_require__("jSAA")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for withRouter.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[10],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[11],{
 
 /***/ "0Hlz":
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
@@ -32,7 +32,14 @@ useWithRouter.getInitialProps = function () {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/withRouter", function() {
       var page = __webpack_require__("0Hlz")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for _app.module.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[3],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[4],{
 
 /***/ "+oT+":
 /***/ (function(module, exports, __webpack_require__) {
@@ -199,7 +199,14 @@ function createUrl(router) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_app", function() {
       var page = __webpack_require__("B5Ud")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for _error.module.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[4],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[5],{
 
 /***/ "+iuc":
 /***/ (function(module, exports, __webpack_require__) {
@@ -123,7 +123,14 @@ const styles = {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_error", function() {
       var page = __webpack_require__("/a9y")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for hooks.module.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[5],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[6],{
 
 /***/ "+MDD":
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
@@ -135,7 +135,14 @@ module.exports = shouldUseNative() ? Object.assign : function (target, source) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/hooks", function() {
       var page = __webpack_require__("+MDD")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for index.module.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[6],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[7],{
 
 /***/ "RNiq":
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
@@ -20,7 +20,14 @@ Page.getInitialProps = () => ({});
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/", function() {
       var page = __webpack_require__("RNiq")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for link.module.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[7],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[8],{
 
 /***/ "/h46":
 /***/ (function(module, exports, __webpack_require__) {
@@ -227,7 +227,14 @@ module.exports = function (TYPE, $create) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/link", function() {
       var page = __webpack_require__("ObF3")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for routerDirect.module.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[8],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[9],{
 
 /***/ "LtRI":
 /***/ (function(module, exports, __webpack_require__) {
@@ -7,7 +7,14 @@
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/routerDirect", function() {
       var page = __webpack_require__("jSAA")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for withRouter.module.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[9],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[10],{
 
 /***/ "0Hlz":
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
@@ -30,7 +30,14 @@ useWithRouter.getInitialProps = () => ({});
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/withRouter", function() {
       var page = __webpack_require__("0Hlz")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
buildDuration 25.1s 25.4s ⚠️ +325ms
nodeModulesSize 41.2 MB 41.2 MB ⚠️ +2.85 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.js 18.1 kB 19.1 kB ⚠️ +996 B
main-HASH.js gzip 6.63 kB 6.81 kB ⚠️ +181 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
Overall change ⚠️ +996 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.module.js 16.5 kB 17.4 kB ⚠️ +894 B
main-HASH.module.js gzip 6.36 kB 6.52 kB ⚠️ +163 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH.module.js gzip 746 B 746 B
Overall change ⚠️ +894 B
Client Pages Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.js 1.83 kB 1.88 kB ⚠️ +48 B
_app.js gzip 884 B 913 B ⚠️ +29 B
_error.js 12.1 kB 12.2 kB ⚠️ +48 B
_error.js gzip 4.76 kB 4.78 kB ⚠️ +17 B
hooks.js 12.7 kB 12.8 kB ⚠️ +48 B
hooks.js gzip 4.81 kB 4.83 kB ⚠️ +23 B
index.js 343 B 391 B ⚠️ +48 B
index.js gzip 237 B 264 B ⚠️ +27 B
link.js 8.14 kB 8.18 kB ⚠️ +48 B
link.js gzip 3.49 kB 3.51 kB ⚠️ +22 B
routerDirect.js 433 B 482 B ⚠️ +49 B
routerDirect.js gzip 296 B 325 B ⚠️ +29 B
withRouter.js 444 B 492 B ⚠️ +48 B
withRouter.js gzip 294 B 322 B ⚠️ +28 B
Overall change ⚠️ +337 B
Client Pages Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.module.js 1.73 kB 1.77 kB ⚠️ +44 B
_app.module.js gzip 840 B 869 B ⚠️ +29 B
_error.module.js 23.3 kB 23.4 kB ⚠️ +44 B
_error.module.js gzip 8.62 kB 8.65 kB ⚠️ +27 B
hooks.module.js 1.55 kB 1.59 kB ⚠️ +44 B
hooks.module.js gzip 804 B 827 B ⚠️ +23 B
index.module.js 319 B 363 B ⚠️ +44 B
index.module.js gzip 238 B 265 B ⚠️ +27 B
link.module.js 8.52 kB 8.57 kB ⚠️ +44 B
link.module.js gzip 3.68 kB 3.7 kB ⚠️ +19 B
routerDirect.module.js 419 B 463 B ⚠️ +44 B
routerDirect.module.js gzip 294 B 323 B ⚠️ +29 B
withRouter.module.js 429 B 474 B ⚠️ +45 B
withRouter.module.js gzip 293 B 322 B ⚠️ +29 B
Overall change ⚠️ +309 B
Client Build Manifests
zeit/next.js canary azukaru/next.js relay-analytics Change
_buildManifest.js 81 B 81 B
_buildManifest.js gzip 61 B 61 B
_buildManifest.module.js 81 B 81 B
_buildManifest.module.js gzip 61 B 61 B
Overall change
Serverless bundles Overall decrease ✓
zeit/next.js canary azukaru/next.js relay-analytics Change
_error.js 247 kB 247 kB -13 B
_error.js gzip 66.2 kB 66.3 kB ⚠️ +48 B
hooks.html 3.81 kB 3.81 kB -4 B
hooks.html gzip 979 B 976 B -3 B
index.js 248 kB 248 kB -13 B
index.js gzip 66.6 kB 66.7 kB ⚠️ +149 B
link.js 255 kB 255 kB -13 B
link.js gzip 68.9 kB 68.8 kB -130 B
routerDirect.js 249 kB 249 kB -13 B
routerDirect.js gzip 66.6 kB 66.7 kB ⚠️ +91 B
withRouter.js 248 kB 248 kB -13 B
withRouter.js gzip 66.7 kB 66.7 kB -4 B
Overall change -69 B

@prateekbh prateekbh marked this pull request as ready for review August 26, 2019 17:01
@ijjk
Copy link
Member

ijjk commented Aug 26, 2019

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
buildDuration 21.2s 22.7s ⚠️ +1.5s
nodeModulesSize 41.3 MB 41.3 MB ⚠️ +2.91 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.js 18.1 kB 19.2 kB ⚠️ +1.01 kB
main-HASH.js gzip 6.64 kB 6.83 kB ⚠️ +186 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
Overall change ⚠️ +1.01 kB
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.module.js 16.5 kB 17.4 kB ⚠️ +913 B
main-HASH.module.js gzip 6.37 kB 6.54 kB ⚠️ +169 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH.module.js gzip 746 B 746 B
Overall change ⚠️ +913 B
Client Pages Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.js 1.83 kB 1.88 kB ⚠️ +48 B
_app.js gzip 884 B 913 B ⚠️ +29 B
_error.js 12.1 kB 12.2 kB ⚠️ +48 B
_error.js gzip 4.76 kB 4.78 kB ⚠️ +17 B
hooks.js 12.7 kB 12.8 kB ⚠️ +48 B
hooks.js gzip 4.81 kB 4.83 kB ⚠️ +23 B
index.js 343 B 391 B ⚠️ +48 B
index.js gzip 237 B 264 B ⚠️ +27 B
link.js 8.14 kB 8.18 kB ⚠️ +48 B
link.js gzip 3.49 kB 3.51 kB ⚠️ +22 B
routerDirect.js 433 B 481 B ⚠️ +48 B
routerDirect.js gzip 296 B 325 B ⚠️ +29 B
withRouter.js 444 B 492 B ⚠️ +48 B
withRouter.js gzip 294 B 322 B ⚠️ +28 B
Overall change ⚠️ +336 B
Client Pages Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.module.js 1.73 kB 1.77 kB ⚠️ +44 B
_app.module.js gzip 840 B 869 B ⚠️ +29 B
_error.module.js 23.3 kB 23.4 kB ⚠️ +44 B
_error.module.js gzip 8.62 kB 8.65 kB ⚠️ +27 B
hooks.module.js 1.55 kB 1.59 kB ⚠️ +44 B
hooks.module.js gzip 804 B 826 B ⚠️ +22 B
index.module.js 319 B 363 B ⚠️ +44 B
index.module.js gzip 238 B 265 B ⚠️ +27 B
link.module.js 8.52 kB 8.57 kB ⚠️ +44 B
link.module.js gzip 3.68 kB 3.7 kB ⚠️ +19 B
routerDirect.module.js 419 B 463 B ⚠️ +44 B
routerDirect.module.js gzip 294 B 323 B ⚠️ +29 B
withRouter.module.js 429 B 473 B ⚠️ +44 B
withRouter.module.js gzip 293 B 322 B ⚠️ +29 B
Overall change ⚠️ +308 B
Client Build Manifests
zeit/next.js canary azukaru/next.js relay-analytics Change
_buildManifest.js 81 B 81 B
_buildManifest.js gzip 61 B 61 B
_buildManifest.module.js 81 B 81 B
_buildManifest.module.js gzip 61 B 61 B
Overall change
Rendered Page Sizes Overall decrease ✓
zeit/next.js canary azukaru/next.js relay-analytics Change
index.html 3.7 kB 3.7 kB -1 B
index.html gzip 958 B 957 B -1 B
link.html 3.75 kB 3.74 kB -1 B
link.html gzip 966 B 965 B -1 B
withRouter.html 3.75 kB 3.75 kB -1 B
withRouter.html gzip 953 B 952 B -1 B
Overall change -3 B

Diffs

Diff for main-HASH.js
@@ -387,7 +387,7 @@ exports.router = router;
 var ErrorComponent;
 exports.ErrorComponent = ErrorComponent;
 var Component;
-var App;
+var App, perfDataRelayer;
 
 var Container =
 /*#__PURE__*/
@@ -460,7 +460,7 @@ function () {
   var _ref2 = (0, _asyncToGenerator2["default"])(
   /*#__PURE__*/
   _regeneratorRuntime.mark(function _callee(_temp) {
-    var _ref, passedWebpackHMR, initialErr, _require, isValidElementType, renderCtx;
+    var _ref, passedWebpackHMR, _ref3, pageExports, app, initialErr, _require, isValidElementType, renderCtx;
 
     return _regeneratorRuntime.wrap(function _callee$(_context) {
       while (1) {
@@ -471,52 +471,60 @@ function () {
             if (false) {}
 
             _context.next = 4;
-            return pageLoader.loadPage('/_app');
+            return pageLoader.loadPageScript('/_app');
 
           case 4:
-            App = _context.sent;
+            _ref3 = _context.sent;
+            pageExports = _ref3.pageExports;
+            app = _ref3.page;
+            App = app;
+
+            if (pageExports && pageExports.relayPerformanceData) {
+              perfDataRelayer = pageExports.relayPerformanceData;
+            }
+
             initialErr = err;
-            _context.prev = 6;
-            _context.next = 9;
+            _context.prev = 10;
+            _context.next = 13;
             return pageLoader.loadPage(page);
 
-          case 9:
+          case 13:
             Component = _context.sent;
 
             if (true) {
-              _context.next = 14;
+              _context.next = 18;
               break;
             }
 
             _require = __webpack_require__(!(function webpackMissingModule() { var e = new Error("Cannot find module 'react-is'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())), isValidElementType = _require.isValidElementType;
 
             if (isValidElementType(Component)) {
-              _context.next = 14;
+              _context.next = 18;
               break;
             }
 
             throw new Error("The default export is not a React Component in page: \"" + page + "\"");
 
-          case 14:
-            _context.next = 19;
+          case 18:
+            _context.next = 23;
             break;
 
-          case 16:
-            _context.prev = 16;
-            _context.t0 = _context["catch"](6);
+          case 20:
+            _context.prev = 20;
+            _context.t0 = _context["catch"](10);
             // This catches errors like throwing in the top level of a module
             initialErr = _context.t0;
 
-          case 19:
+          case 23:
             if (!window.__NEXT_PRELOADREADY) {
-              _context.next = 22;
+              _context.next = 26;
               break;
             }
 
-            _context.next = 22;
+            _context.next = 26;
             return window.__NEXT_PRELOADREADY(dynamicIds);
 
-          case 22:
+          case 26:
             exports.router = router = (0, _router.createRouter)(page, query, asPath, {
               initialProps: props,
               pageLoader: pageLoader,
@@ -547,12 +555,12 @@ function () {
             render(renderCtx);
             return _context.abrupt("return", emitter);
 
-          case 26:
+          case 30:
           case "end":
             return _context.stop();
         }
       }
-    }, _callee, null, [[6, 16]]);
+    }, _callee, null, [[10, 20]]);
   }));
 
   return function (_x) {
@@ -715,6 +723,20 @@ function renderReactElement(reactEl, domEl) {
   } else {
     _reactDom["default"].render(reactEl, domEl, markRenderComplete);
   }
+
+  relayPaintMetrics();
+}
+
+function relayPaintMetrics() {
+  if (perfDataRelayer) {
+    performance.getEntriesByType('paint').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
 }
 
 function markHydrateComplete() {
@@ -723,6 +745,24 @@ function markHydrateComplete() {
 
   performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
   performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-hydration').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('beforeRender').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
@@ -738,16 +778,30 @@ function markRenderComplete() {
 
   performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
   performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-render').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('Next.js-route-change-to-render').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
 function clearMarks() {
   performance.clearMarks();
-  /*
-  * TODO: uncomment the following line when we have a way to
-  * expose this to user code.
-  */
-  // performance.clearMeasures()
+  performance.clearMeasures();
 }
 
 function AppContainer(_ref4) {
@@ -1479,13 +1533,21 @@ function () {
   }, {
     key: "loadPage",
     value: function loadPage(route) {
+      return this.loadPageScript(route).then(function (value) {
+        return value ? value.page : value;
+      });
+    }
+  }, {
+    key: "loadPageScript",
+    value: function loadPageScript(route) {
       var _this3 = this;
 
       route = this.normalizeRoute(route);
       return new _promise["default"](function (resolve, reject) {
         var fire = function fire(_ref) {
           var error = _ref.error,
-              page = _ref.page;
+              page = _ref.page,
+              pageExports = _ref.pageExports;
 
           _this3.pageRegisterEvents.off(route, fire);
 
@@ -1494,7 +1556,10 @@ function () {
           if (error) {
             reject(error);
           } else {
-            resolve(page);
+            resolve({
+              page: page,
+              pageExports: pageExports
+            });
           }
         }; // If there's a cached version of the page, let's use it.
 
@@ -1503,8 +1568,12 @@ function () {
 
         if (cachedPage) {
           var error = cachedPage.error,
-              page = cachedPage.page;
-          error ? reject(error) : resolve(page);
+              page = cachedPage.page,
+              pageExports = cachedPage.pageExports;
+          error ? reject(error) : resolve({
+            page: page,
+            pageExports: pageExports
+          });
           return;
         } // Register a listener to get the page
 
@@ -1599,16 +1668,19 @@ function () {
         try {
           var _regFn = regFn(),
               error = _regFn.error,
-              page = _regFn.page;
+              page = _regFn.page,
+              pageExports = _regFn.pageExports;
 
           _this5.pageCache[route] = {
             error: error,
-            page: page
+            page: page,
+            pageExports: pageExports
           };
 
           _this5.pageRegisterEvents.emit(route, {
             error: error,
-            page: page
+            page: page,
+            pageExports: pageExports
           });
         } catch (error) {
           _this5.pageCache[route] = {
Diff for main-HASH.module.js
@@ -458,7 +458,7 @@ exports.router = router;
 let ErrorComponent;
 exports.ErrorComponent = ErrorComponent;
 let Component;
-let App;
+let App, perfDataRelayer;
 
 class Container extends _react.default.Component {
   componentDidCatch(err, info) {
@@ -516,7 +516,16 @@ function () {
 
     if (false) {}
 
-    App = yield pageLoader.loadPage('/_app');
+    const {
+      pageExports,
+      page: app
+    } = yield pageLoader.loadPageScript('/_app');
+    App = app;
+
+    if (pageExports && pageExports.relayPerformanceData) {
+      perfDataRelayer = pageExports.relayPerformanceData;
+    }
+
     let initialErr = err;
 
     try {
@@ -657,6 +666,20 @@ function renderReactElement(reactEl, domEl) {
   } else {
     _reactDom.default.render(reactEl, domEl, markRenderComplete);
   }
+
+  relayPaintMetrics();
+}
+
+function relayPaintMetrics() {
+  if (perfDataRelayer) {
+    performance.getEntriesByType('paint').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
 }
 
 function markHydrateComplete() {
@@ -665,6 +688,24 @@ function markHydrateComplete() {
 
   performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
   performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-hydration').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('beforeRender').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
@@ -680,16 +721,30 @@ function markRenderComplete() {
 
   performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
   performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-render').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('Next.js-route-change-to-render').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
 function clearMarks() {
   performance.clearMarks();
-  /*
-  * TODO: uncomment the following line when we have a way to
-  * expose this to user code.
-  */
-  // performance.clearMeasures()
+  performance.clearMeasures();
 }
 
 function AppContainer(_ref4) {
@@ -1380,12 +1435,17 @@ class PageLoader {
   }
 
   loadPage(route) {
+    return this.loadPageScript(route).then(value => value ? value.page : value);
+  }
+
+  loadPageScript(route) {
     route = this.normalizeRoute(route);
     return new _promise.default((resolve, reject) => {
       const fire = _ref => {
         let {
           error,
-          page
+          page,
+          pageExports
         } = _ref;
         this.pageRegisterEvents.off(route, fire);
         delete this.loadingRoutes[route];
@@ -1393,7 +1453,10 @@ class PageLoader {
         if (error) {
           reject(error);
         } else {
-          resolve(page);
+          resolve({
+            page,
+            pageExports
+          });
         }
       }; // If there's a cached version of the page, let's use it.
 
@@ -1403,9 +1466,13 @@ class PageLoader {
       if (cachedPage) {
         const {
           error,
-          page
+          page,
+          pageExports
         } = cachedPage;
-        error ? reject(error) : resolve(page);
+        error ? reject(error) : resolve({
+          page,
+          pageExports
+        });
         return;
       } // Register a listener to get the page
 
@@ -1475,15 +1542,18 @@ class PageLoader {
       try {
         const {
           error,
-          page
+          page,
+          pageExports
         } = regFn();
         this.pageCache[route] = {
           error,
-          page
+          page,
+          pageExports
         };
         this.pageRegisterEvents.emit(route, {
           error,
-          page
+          page,
+          pageExports
         });
       } catch (error) {
         this.pageCache[route] = {
Diff for _app.js
@@ -194,7 +194,14 @@ function createUrl(router) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_app", function() {
       var page = __webpack_require__("B5Ud")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for _error.js
@@ -144,7 +144,14 @@ var styles = {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_error", function() {
       var page = __webpack_require__("/a9y")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for hooks.js
@@ -996,7 +996,14 @@ module.exports = __webpack_require__("jmDH") ? Object.defineProperties : functio
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/hooks", function() {
       var page = __webpack_require__("+MDD")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for index.js
@@ -24,7 +24,14 @@ Page.getInitialProps = function () {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/", function() {
       var page = __webpack_require__("RNiq")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for link.js
@@ -169,7 +169,14 @@ module.exports = function (TYPE, $create) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/link", function() {
       var page = __webpack_require__("ObF3")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for routerDirect.js
@@ -7,7 +7,14 @@
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/routerDirect", function() {
       var page = __webpack_require__("jSAA")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for withRouter.js
@@ -32,7 +32,14 @@ useWithRouter.getInitialProps = function () {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/withRouter", function() {
       var page = __webpack_require__("0Hlz")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for _app.module.js
@@ -199,7 +199,14 @@ function createUrl(router) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_app", function() {
       var page = __webpack_require__("B5Ud")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for _error.module.js
@@ -123,7 +123,14 @@ const styles = {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_error", function() {
       var page = __webpack_require__("/a9y")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for hooks.module.js
@@ -135,7 +135,14 @@ module.exports = shouldUseNative() ? Object.assign : function (target, source) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/hooks", function() {
       var page = __webpack_require__("+MDD")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for index.module.js
@@ -20,7 +20,14 @@ Page.getInitialProps = () => ({});
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/", function() {
       var page = __webpack_require__("RNiq")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for link.module.js
@@ -227,7 +227,14 @@ module.exports = function (TYPE, $create) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/link", function() {
       var page = __webpack_require__("ObF3")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for routerDirect.module.js
@@ -7,7 +7,14 @@
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/routerDirect", function() {
       var page = __webpack_require__("jSAA")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for withRouter.module.js
@@ -30,7 +30,14 @@ useWithRouter.getInitialProps = () => ({});
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/withRouter", function() {
       var page = __webpack_require__("0Hlz")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for index.html
@@ -6,19 +6,19 @@
         <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"
         />
         <meta name="next-head-count" content="2" />
-        <link rel="preload" href="/_next/static/7Yox49E87YeXbpGJ4lFVy/pages/index.module.js"
+        <link rel="preload" href="/_next/static/UlJzb7EwBRmzVsewWlDRV/pages/index.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/7Yox49E87YeXbpGJ4lFVy/pages/_app.module.js"
+        <link rel="preload" href="/_next/static/UlJzb7EwBRmzVsewWlDRV/pages/_app.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-9c0b8b62a2fb27af35b2.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-6a9256f9bf0c4935aaa0.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/sLguUO4qDi9z2xjLkRJoRxTj5c=.72ab6ea1ebeafbd8c735.module.js"
+        <link rel="preload" href="/_next/static/chunks/2k7dqw7KDRig9NpaRCwLPvBUBco=.72ab6ea1ebeafbd8c735.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/7Yox49E87YeXbpGJ4lFVy/_buildManifest.module.js"
+        <link rel="preload" href="/_next/static/UlJzb7EwBRmzVsewWlDRV/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
     </head>
     
@@ -26,40 +26,40 @@
         <div id="__next">Hello world 👋</div>
         <script id="__NEXT_DATA__" type="application/json"
         crossorigin="anonymous">
-            {"dataManager":"[]","props":{"pageProps":{}},"page":"/","query":{},"buildId":"7Yox49E87YeXbpGJ4lFVy"}
+            {"dataManager":"[]","props":{"pageProps":{}},"page":"/","query":{},"buildId":"UlJzb7EwBRmzVsewWlDRV"}
         </script>
         <script crossorigin="anonymous" nomodule="">
             !function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();
         </script>
-        <script async="" data-next-page="/" src="/_next/static/7Yox49E87YeXbpGJ4lFVy/pages/index.js"
+        <script async="" data-next-page="/" src="/_next/static/UlJzb7EwBRmzVsewWlDRV/pages/index.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/" src="/_next/static/7Yox49E87YeXbpGJ4lFVy/pages/index.module.js"
+        <script async="" data-next-page="/" src="/_next/static/UlJzb7EwBRmzVsewWlDRV/pages/index.module.js"
         crossorigin="anonymous" type="module"></script>
-        <script async="" data-next-page="/_app" src="/_next/static/7Yox49E87YeXbpGJ4lFVy/pages/_app.js"
+        <script async="" data-next-page="/_app" src="/_next/static/UlJzb7EwBRmzVsewWlDRV/pages/_app.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/_app" src="/_next/static/7Yox49E87YeXbpGJ4lFVy/pages/_app.module.js"
+        <script async="" data-next-page="/_app" src="/_next/static/UlJzb7EwBRmzVsewWlDRV/pages/_app.module.js"
         crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/runtime/webpack-a470c2a25bcb4d5a8ec0.js"
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-97617d800ec2b207a20a.js"
+        <script src="/_next/static/runtime/main-4d07c17b2b85ef06f063.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-9c0b8b62a2fb27af35b2.module.js"
+        <script src="/_next/static/runtime/main-6a9256f9bf0c4935aaa0.module.js"
         async="" crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.js"
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/chunks/O4NQ5Fi2RhXN4bpZ7JTJhVZzWE=.155621535702fe040780.js"
+        <script src="/_next/static/chunks/Q1hCmAE9DplYmWNKldrvGCcml+o=.155621535702fe040780.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/sLguUO4qDi9z2xjLkRJoRxTj5c=.c99adde05e467047c83e.js"
+        <script src="/_next/static/chunks/2k7dqw7KDRig9NpaRCwLPvBUBco=.c99adde05e467047c83e.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/sLguUO4qDi9z2xjLkRJoRxTj5c=.72ab6ea1ebeafbd8c735.module.js"
+        <script src="/_next/static/chunks/2k7dqw7KDRig9NpaRCwLPvBUBco=.72ab6ea1ebeafbd8c735.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/7Yox49E87YeXbpGJ4lFVy/_buildManifest.js"
+        <script src="/_next/static/UlJzb7EwBRmzVsewWlDRV/_buildManifest.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/7Yox49E87YeXbpGJ4lFVy/_buildManifest.module.js"
+        <script src="/_next/static/UlJzb7EwBRmzVsewWlDRV/_buildManifest.module.js"
         async="" crossorigin="anonymous" type="module"></script>
     </body>
Diff for link.html
@@ -6,19 +6,19 @@
         <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"
         />
         <meta name="next-head-count" content="2" />
-        <link rel="preload" href="/_next/static/7Yox49E87YeXbpGJ4lFVy/pages/link.module.js"
+        <link rel="preload" href="/_next/static/UlJzb7EwBRmzVsewWlDRV/pages/link.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/7Yox49E87YeXbpGJ4lFVy/pages/_app.module.js"
+        <link rel="preload" href="/_next/static/UlJzb7EwBRmzVsewWlDRV/pages/_app.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/sLguUO4qDi9z2xjLkRJoRxTj5c=.72ab6ea1ebeafbd8c735.module.js"
+        <link rel="preload" href="/_next/static/chunks/2k7dqw7KDRig9NpaRCwLPvBUBco=.72ab6ea1ebeafbd8c735.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-9c0b8b62a2fb27af35b2.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-6a9256f9bf0c4935aaa0.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/7Yox49E87YeXbpGJ4lFVy/_buildManifest.module.js"
+        <link rel="preload" href="/_next/static/UlJzb7EwBRmzVsewWlDRV/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
     </head>
     
@@ -29,18 +29,18 @@
             </div>
         </div>
         <script id="__NEXT_DATA__" type="application/json" crossorigin="anonymous">
-            {"dataManager":"[]","props":{"pageProps":{}},"page":"/link","query":{},"buildId":"7Yox49E87YeXbpGJ4lFVy"}
+            {"dataManager":"[]","props":{"pageProps":{}},"page":"/link","query":{},"buildId":"UlJzb7EwBRmzVsewWlDRV"}
         </script>
         <script crossorigin="anonymous" nomodule="">
             !function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();
         </script>
-        <script async="" data-next-page="/link" src="/_next/static/7Yox49E87YeXbpGJ4lFVy/pages/link.js"
+        <script async="" data-next-page="/link" src="/_next/static/UlJzb7EwBRmzVsewWlDRV/pages/link.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/link" src="/_next/static/7Yox49E87YeXbpGJ4lFVy/pages/link.module.js"
+        <script async="" data-next-page="/link" src="/_next/static/UlJzb7EwBRmzVsewWlDRV/pages/link.module.js"
         crossorigin="anonymous" type="module"></script>
-        <script async="" data-next-page="/_app" src="/_next/static/7Yox49E87YeXbpGJ4lFVy/pages/_app.js"
+        <script async="" data-next-page="/_app" src="/_next/static/UlJzb7EwBRmzVsewWlDRV/pages/_app.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/_app" src="/_next/static/7Yox49E87YeXbpGJ4lFVy/pages/_app.module.js"
+        <script async="" data-next-page="/_app" src="/_next/static/UlJzb7EwBRmzVsewWlDRV/pages/_app.module.js"
         crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/runtime/webpack-a470c2a25bcb4d5a8ec0.js"
         async="" crossorigin="anonymous" nomodule=""></script>
@@ -50,19 +50,19 @@
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/chunks/O4NQ5Fi2RhXN4bpZ7JTJhVZzWE=.155621535702fe040780.js"
+        <script src="/_next/static/chunks/Q1hCmAE9DplYmWNKldrvGCcml+o=.155621535702fe040780.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/sLguUO4qDi9z2xjLkRJoRxTj5c=.c99adde05e467047c83e.js"
+        <script src="/_next/static/chunks/2k7dqw7KDRig9NpaRCwLPvBUBco=.c99adde05e467047c83e.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/sLguUO4qDi9z2xjLkRJoRxTj5c=.72ab6ea1ebeafbd8c735.module.js"
+        <script src="/_next/static/chunks/2k7dqw7KDRig9NpaRCwLPvBUBco=.72ab6ea1ebeafbd8c735.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-97617d800ec2b207a20a.js"
+        <script src="/_next/static/runtime/main-4d07c17b2b85ef06f063.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-9c0b8b62a2fb27af35b2.module.js"
+        <script src="/_next/static/runtime/main-6a9256f9bf0c4935aaa0.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/7Yox49E87YeXbpGJ4lFVy/_buildManifest.js"
+        <script src="/_next/static/UlJzb7EwBRmzVsewWlDRV/_buildManifest.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/7Yox49E87YeXbpGJ4lFVy/_buildManifest.module.js"
+        <script src="/_next/static/UlJzb7EwBRmzVsewWlDRV/_buildManifest.module.js"
         async="" crossorigin="anonymous" type="module"></script>
     </body>
Diff for withRouter.html
@@ -6,19 +6,19 @@
         <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"
         />
         <meta name="next-head-count" content="2" />
-        <link rel="preload" href="/_next/static/7Yox49E87YeXbpGJ4lFVy/pages/withRouter.module.js"
+        <link rel="preload" href="/_next/static/UlJzb7EwBRmzVsewWlDRV/pages/withRouter.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/7Yox49E87YeXbpGJ4lFVy/pages/_app.module.js"
+        <link rel="preload" href="/_next/static/UlJzb7EwBRmzVsewWlDRV/pages/_app.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/sLguUO4qDi9z2xjLkRJoRxTj5c=.72ab6ea1ebeafbd8c735.module.js"
+        <link rel="preload" href="/_next/static/chunks/2k7dqw7KDRig9NpaRCwLPvBUBco=.72ab6ea1ebeafbd8c735.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-9c0b8b62a2fb27af35b2.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-6a9256f9bf0c4935aaa0.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/7Yox49E87YeXbpGJ4lFVy/_buildManifest.module.js"
+        <link rel="preload" href="/_next/static/UlJzb7EwBRmzVsewWlDRV/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
     </head>
     
@@ -27,18 +27,18 @@
             <div>I use withRouter</div>
         </div>
         <script id="__NEXT_DATA__" type="application/json" crossorigin="anonymous">
-            {"dataManager":"[]","props":{"pageProps":{}},"page":"/withRouter","query":{},"buildId":"7Yox49E87YeXbpGJ4lFVy"}
+            {"dataManager":"[]","props":{"pageProps":{}},"page":"/withRouter","query":{},"buildId":"UlJzb7EwBRmzVsewWlDRV"}
         </script>
         <script crossorigin="anonymous" nomodule="">
             !function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();
         </script>
-        <script async="" data-next-page="/withRouter" src="/_next/static/7Yox49E87YeXbpGJ4lFVy/pages/withRouter.js"
+        <script async="" data-next-page="/withRouter" src="/_next/static/UlJzb7EwBRmzVsewWlDRV/pages/withRouter.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/withRouter" src="/_next/static/7Yox49E87YeXbpGJ4lFVy/pages/withRouter.module.js"
+        <script async="" data-next-page="/withRouter" src="/_next/static/UlJzb7EwBRmzVsewWlDRV/pages/withRouter.module.js"
         crossorigin="anonymous" type="module"></script>
-        <script async="" data-next-page="/_app" src="/_next/static/7Yox49E87YeXbpGJ4lFVy/pages/_app.js"
+        <script async="" data-next-page="/_app" src="/_next/static/UlJzb7EwBRmzVsewWlDRV/pages/_app.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/_app" src="/_next/static/7Yox49E87YeXbpGJ4lFVy/pages/_app.module.js"
+        <script async="" data-next-page="/_app" src="/_next/static/UlJzb7EwBRmzVsewWlDRV/pages/_app.module.js"
         crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/runtime/webpack-a470c2a25bcb4d5a8ec0.js"
         async="" crossorigin="anonymous" nomodule=""></script>
@@ -48,19 +48,19 @@
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/chunks/O4NQ5Fi2RhXN4bpZ7JTJhVZzWE=.155621535702fe040780.js"
+        <script src="/_next/static/chunks/Q1hCmAE9DplYmWNKldrvGCcml+o=.155621535702fe040780.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/sLguUO4qDi9z2xjLkRJoRxTj5c=.c99adde05e467047c83e.js"
+        <script src="/_next/static/chunks/2k7dqw7KDRig9NpaRCwLPvBUBco=.c99adde05e467047c83e.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/sLguUO4qDi9z2xjLkRJoRxTj5c=.72ab6ea1ebeafbd8c735.module.js"
+        <script src="/_next/static/chunks/2k7dqw7KDRig9NpaRCwLPvBUBco=.72ab6ea1ebeafbd8c735.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-97617d800ec2b207a20a.js"
+        <script src="/_next/static/runtime/main-4d07c17b2b85ef06f063.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-9c0b8b62a2fb27af35b2.module.js"
+        <script src="/_next/static/runtime/main-6a9256f9bf0c4935aaa0.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/7Yox49E87YeXbpGJ4lFVy/_buildManifest.js"
+        <script src="/_next/static/UlJzb7EwBRmzVsewWlDRV/_buildManifest.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/7Yox49E87YeXbpGJ4lFVy/_buildManifest.module.js"
+        <script src="/_next/static/UlJzb7EwBRmzVsewWlDRV/_buildManifest.module.js"
         async="" crossorigin="anonymous" type="module"></script>
     </body>

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
buildDuration 23.2s 22.9s -250ms
nodeModulesSize 41.3 MB 41.3 MB ⚠️ +2.91 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.js 18.1 kB 19.2 kB ⚠️ +1.02 kB
main-HASH.js gzip 6.64 kB 6.83 kB ⚠️ +187 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
Overall change ⚠️ +1.02 kB
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.module.js 16.5 kB 17.4 kB ⚠️ +914 B
main-HASH.module.js gzip 6.37 kB 6.54 kB ⚠️ +170 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH.module.js gzip 746 B 746 B
Overall change ⚠️ +914 B
Client Pages Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.js 1.83 kB 1.88 kB ⚠️ +48 B
_app.js gzip 884 B 913 B ⚠️ +29 B
_error.js 12.1 kB 12.2 kB ⚠️ +48 B
_error.js gzip 4.76 kB 4.78 kB ⚠️ +16 B
hooks.js 12.7 kB 12.8 kB ⚠️ +48 B
hooks.js gzip 4.81 kB 4.83 kB ⚠️ +23 B
index.js 343 B 391 B ⚠️ +48 B
index.js gzip 237 B 264 B ⚠️ +27 B
link.js 8.14 kB 8.18 kB ⚠️ +48 B
link.js gzip 3.49 kB 3.51 kB ⚠️ +21 B
routerDirect.js 434 B 481 B ⚠️ +47 B
routerDirect.js gzip 296 B 325 B ⚠️ +29 B
withRouter.js 444 B 492 B ⚠️ +48 B
withRouter.js gzip 294 B 322 B ⚠️ +28 B
Overall change ⚠️ +335 B
Client Pages Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.module.js 1.73 kB 1.77 kB ⚠️ +44 B
_app.module.js gzip 840 B 869 B ⚠️ +29 B
_error.module.js 23.3 kB 23.4 kB ⚠️ +44 B
_error.module.js gzip 8.62 kB 8.65 kB ⚠️ +27 B
hooks.module.js 1.55 kB 1.59 kB ⚠️ +44 B
hooks.module.js gzip 805 B 826 B ⚠️ +21 B
index.module.js 319 B 363 B ⚠️ +44 B
index.module.js gzip 238 B 265 B ⚠️ +27 B
link.module.js 8.52 kB 8.57 kB ⚠️ +44 B
link.module.js gzip 3.68 kB 3.7 kB ⚠️ +19 B
routerDirect.module.js 419 B 463 B ⚠️ +44 B
routerDirect.module.js gzip 294 B 323 B ⚠️ +29 B
withRouter.module.js 430 B 473 B ⚠️ +43 B
withRouter.module.js gzip 293 B 322 B ⚠️ +29 B
Overall change ⚠️ +307 B
Client Build Manifests
zeit/next.js canary azukaru/next.js relay-analytics Change
_buildManifest.js 81 B 81 B
_buildManifest.js gzip 61 B 61 B
_buildManifest.module.js 81 B 81 B
_buildManifest.module.js gzip 61 B 61 B
Overall change
Serverless bundles Overall decrease ✓
zeit/next.js canary azukaru/next.js relay-analytics Change
_error.js 247 kB 247 kB -3 B
_error.js gzip 66.4 kB 66.3 kB -101 B
hooks.html 3.81 kB 3.81 kB -2 B
hooks.html gzip 976 B 978 B ⚠️ +2 B
index.js 248 kB 248 kB -3 B
index.js gzip 66.7 kB 66.8 kB ⚠️ +76 B
link.js 255 kB 255 kB -3 B
link.js gzip 68.9 kB 68.8 kB -95 B
routerDirect.js 249 kB 249 kB -3 B
routerDirect.js gzip 66.6 kB 66.7 kB ⚠️ +135 B
withRouter.js 248 kB 248 kB -3 B
withRouter.js gzip 66.7 kB 66.8 kB ⚠️ +141 B
Overall change -17 B

@ijjk
Copy link
Member

ijjk commented Aug 26, 2019

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
buildDuration 26.6s 27s ⚠️ +329ms
nodeModulesSize 41.3 MB 41.3 MB ⚠️ +2.91 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.js 18.1 kB 19.2 kB ⚠️ +1.01 kB
main-HASH.js gzip 6.64 kB 6.83 kB ⚠️ +186 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
Overall change ⚠️ +1.01 kB
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.module.js 16.5 kB 17.4 kB ⚠️ +913 B
main-HASH.module.js gzip 6.37 kB 6.54 kB ⚠️ +169 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH.module.js gzip 746 B 746 B
Overall change ⚠️ +913 B
Client Pages Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.js 1.83 kB 1.88 kB ⚠️ +48 B
_app.js gzip 884 B 913 B ⚠️ +29 B
_error.js 12.1 kB 12.2 kB ⚠️ +48 B
_error.js gzip 4.76 kB 4.78 kB ⚠️ +17 B
hooks.js 12.7 kB 12.8 kB ⚠️ +48 B
hooks.js gzip 4.81 kB 4.83 kB ⚠️ +23 B
index.js 343 B 391 B ⚠️ +48 B
index.js gzip 237 B 264 B ⚠️ +27 B
link.js 8.14 kB 8.18 kB ⚠️ +48 B
link.js gzip 3.49 kB 3.51 kB ⚠️ +22 B
routerDirect.js 433 B 481 B ⚠️ +48 B
routerDirect.js gzip 296 B 325 B ⚠️ +29 B
withRouter.js 444 B 492 B ⚠️ +48 B
withRouter.js gzip 294 B 322 B ⚠️ +28 B
Overall change ⚠️ +336 B
Client Pages Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.module.js 1.73 kB 1.77 kB ⚠️ +44 B
_app.module.js gzip 840 B 869 B ⚠️ +29 B
_error.module.js 23.3 kB 23.4 kB ⚠️ +44 B
_error.module.js gzip 8.62 kB 8.65 kB ⚠️ +27 B
hooks.module.js 1.55 kB 1.59 kB ⚠️ +44 B
hooks.module.js gzip 804 B 826 B ⚠️ +22 B
index.module.js 319 B 363 B ⚠️ +44 B
index.module.js gzip 238 B 265 B ⚠️ +27 B
link.module.js 8.52 kB 8.57 kB ⚠️ +44 B
link.module.js gzip 3.68 kB 3.7 kB ⚠️ +19 B
routerDirect.module.js 419 B 463 B ⚠️ +44 B
routerDirect.module.js gzip 294 B 323 B ⚠️ +29 B
withRouter.module.js 429 B 473 B ⚠️ +44 B
withRouter.module.js gzip 293 B 322 B ⚠️ +29 B
Overall change ⚠️ +308 B
Client Build Manifests
zeit/next.js canary azukaru/next.js relay-analytics Change
_buildManifest.js 81 B 81 B
_buildManifest.js gzip 61 B 61 B
_buildManifest.module.js 81 B 81 B
_buildManifest.module.js gzip 61 B 61 B
Overall change
Rendered Page Sizes
zeit/next.js canary azukaru/next.js relay-analytics Change
index.html 3.7 kB 3.7 kB
index.html gzip 957 B 953 B -4 B
link.html 3.75 kB 3.75 kB
link.html gzip 965 B 961 B -4 B
withRouter.html 3.75 kB 3.75 kB
withRouter.html gzip 952 B 948 B -4 B
Overall change

Diffs

Diff for main-HASH.js
@@ -387,7 +387,7 @@ exports.router = router;
 var ErrorComponent;
 exports.ErrorComponent = ErrorComponent;
 var Component;
-var App;
+var App, perfDataRelayer;
 
 var Container =
 /*#__PURE__*/
@@ -460,7 +460,7 @@ function () {
   var _ref2 = (0, _asyncToGenerator2["default"])(
   /*#__PURE__*/
   _regeneratorRuntime.mark(function _callee(_temp) {
-    var _ref, passedWebpackHMR, initialErr, _require, isValidElementType, renderCtx;
+    var _ref, passedWebpackHMR, _ref3, pageExports, app, initialErr, _require, isValidElementType, renderCtx;
 
     return _regeneratorRuntime.wrap(function _callee$(_context) {
       while (1) {
@@ -471,52 +471,60 @@ function () {
             if (false) {}
 
             _context.next = 4;
-            return pageLoader.loadPage('/_app');
+            return pageLoader.loadPageScript('/_app');
 
           case 4:
-            App = _context.sent;
+            _ref3 = _context.sent;
+            pageExports = _ref3.pageExports;
+            app = _ref3.page;
+            App = app;
+
+            if (pageExports && pageExports.relayPerformanceData) {
+              perfDataRelayer = pageExports.relayPerformanceData;
+            }
+
             initialErr = err;
-            _context.prev = 6;
-            _context.next = 9;
+            _context.prev = 10;
+            _context.next = 13;
             return pageLoader.loadPage(page);
 
-          case 9:
+          case 13:
             Component = _context.sent;
 
             if (true) {
-              _context.next = 14;
+              _context.next = 18;
               break;
             }
 
             _require = __webpack_require__(!(function webpackMissingModule() { var e = new Error("Cannot find module 'react-is'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())), isValidElementType = _require.isValidElementType;
 
             if (isValidElementType(Component)) {
-              _context.next = 14;
+              _context.next = 18;
               break;
             }
 
             throw new Error("The default export is not a React Component in page: \"" + page + "\"");
 
-          case 14:
-            _context.next = 19;
+          case 18:
+            _context.next = 23;
             break;
 
-          case 16:
-            _context.prev = 16;
-            _context.t0 = _context["catch"](6);
+          case 20:
+            _context.prev = 20;
+            _context.t0 = _context["catch"](10);
             // This catches errors like throwing in the top level of a module
             initialErr = _context.t0;
 
-          case 19:
+          case 23:
             if (!window.__NEXT_PRELOADREADY) {
-              _context.next = 22;
+              _context.next = 26;
               break;
             }
 
-            _context.next = 22;
+            _context.next = 26;
             return window.__NEXT_PRELOADREADY(dynamicIds);
 
-          case 22:
+          case 26:
             exports.router = router = (0, _router.createRouter)(page, query, asPath, {
               initialProps: props,
               pageLoader: pageLoader,
@@ -547,12 +555,12 @@ function () {
             render(renderCtx);
             return _context.abrupt("return", emitter);
 
-          case 26:
+          case 30:
           case "end":
             return _context.stop();
         }
       }
-    }, _callee, null, [[6, 16]]);
+    }, _callee, null, [[10, 20]]);
   }));
 
   return function (_x) {
@@ -715,6 +723,20 @@ function renderReactElement(reactEl, domEl) {
   } else {
     _reactDom["default"].render(reactEl, domEl, markRenderComplete);
   }
+
+  relayPaintMetrics();
+}
+
+function relayPaintMetrics() {
+  if (perfDataRelayer) {
+    performance.getEntriesByType('paint').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
 }
 
 function markHydrateComplete() {
@@ -723,6 +745,24 @@ function markHydrateComplete() {
 
   performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
   performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-hydration').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('beforeRender').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
@@ -738,16 +778,30 @@ function markRenderComplete() {
 
   performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
   performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-render').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('Next.js-route-change-to-render').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
 function clearMarks() {
   performance.clearMarks();
-  /*
-  * TODO: uncomment the following line when we have a way to
-  * expose this to user code.
-  */
-  // performance.clearMeasures()
+  performance.clearMeasures();
 }
 
 function AppContainer(_ref4) {
@@ -1479,13 +1533,21 @@ function () {
   }, {
     key: "loadPage",
     value: function loadPage(route) {
+      return this.loadPageScript(route).then(function (value) {
+        return value ? value.page : value;
+      });
+    }
+  }, {
+    key: "loadPageScript",
+    value: function loadPageScript(route) {
       var _this3 = this;
 
       route = this.normalizeRoute(route);
       return new _promise["default"](function (resolve, reject) {
         var fire = function fire(_ref) {
           var error = _ref.error,
-              page = _ref.page;
+              page = _ref.page,
+              pageExports = _ref.pageExports;
 
           _this3.pageRegisterEvents.off(route, fire);
 
@@ -1494,7 +1556,10 @@ function () {
           if (error) {
             reject(error);
           } else {
-            resolve(page);
+            resolve({
+              page: page,
+              pageExports: pageExports
+            });
           }
         }; // If there's a cached version of the page, let's use it.
 
@@ -1503,8 +1568,12 @@ function () {
 
         if (cachedPage) {
           var error = cachedPage.error,
-              page = cachedPage.page;
-          error ? reject(error) : resolve(page);
+              page = cachedPage.page,
+              pageExports = cachedPage.pageExports;
+          error ? reject(error) : resolve({
+            page: page,
+            pageExports: pageExports
+          });
           return;
         } // Register a listener to get the page
 
@@ -1599,16 +1668,19 @@ function () {
         try {
           var _regFn = regFn(),
               error = _regFn.error,
-              page = _regFn.page;
+              page = _regFn.page,
+              pageExports = _regFn.pageExports;
 
           _this5.pageCache[route] = {
             error: error,
-            page: page
+            page: page,
+            pageExports: pageExports
           };
 
           _this5.pageRegisterEvents.emit(route, {
             error: error,
-            page: page
+            page: page,
+            pageExports: pageExports
           });
         } catch (error) {
           _this5.pageCache[route] = {
Diff for main-HASH.module.js
@@ -458,7 +458,7 @@ exports.router = router;
 let ErrorComponent;
 exports.ErrorComponent = ErrorComponent;
 let Component;
-let App;
+let App, perfDataRelayer;
 
 class Container extends _react.default.Component {
   componentDidCatch(err, info) {
@@ -516,7 +516,16 @@ function () {
 
     if (false) {}
 
-    App = yield pageLoader.loadPage('/_app');
+    const {
+      pageExports,
+      page: app
+    } = yield pageLoader.loadPageScript('/_app');
+    App = app;
+
+    if (pageExports && pageExports.relayPerformanceData) {
+      perfDataRelayer = pageExports.relayPerformanceData;
+    }
+
     let initialErr = err;
 
     try {
@@ -657,6 +666,20 @@ function renderReactElement(reactEl, domEl) {
   } else {
     _reactDom.default.render(reactEl, domEl, markRenderComplete);
   }
+
+  relayPaintMetrics();
+}
+
+function relayPaintMetrics() {
+  if (perfDataRelayer) {
+    performance.getEntriesByType('paint').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
 }
 
 function markHydrateComplete() {
@@ -665,6 +688,24 @@ function markHydrateComplete() {
 
   performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
   performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-hydration').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('beforeRender').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
@@ -680,16 +721,30 @@ function markRenderComplete() {
 
   performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
   performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-render').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('Next.js-route-change-to-render').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
 function clearMarks() {
   performance.clearMarks();
-  /*
-  * TODO: uncomment the following line when we have a way to
-  * expose this to user code.
-  */
-  // performance.clearMeasures()
+  performance.clearMeasures();
 }
 
 function AppContainer(_ref4) {
@@ -1380,12 +1435,17 @@ class PageLoader {
   }
 
   loadPage(route) {
+    return this.loadPageScript(route).then(value => value ? value.page : value);
+  }
+
+  loadPageScript(route) {
     route = this.normalizeRoute(route);
     return new _promise.default((resolve, reject) => {
       const fire = _ref => {
         let {
           error,
-          page
+          page,
+          pageExports
         } = _ref;
         this.pageRegisterEvents.off(route, fire);
         delete this.loadingRoutes[route];
@@ -1393,7 +1453,10 @@ class PageLoader {
         if (error) {
           reject(error);
         } else {
-          resolve(page);
+          resolve({
+            page,
+            pageExports
+          });
         }
       }; // If there's a cached version of the page, let's use it.
 
@@ -1403,9 +1466,13 @@ class PageLoader {
       if (cachedPage) {
         const {
           error,
-          page
+          page,
+          pageExports
         } = cachedPage;
-        error ? reject(error) : resolve(page);
+        error ? reject(error) : resolve({
+          page,
+          pageExports
+        });
         return;
       } // Register a listener to get the page
 
@@ -1475,15 +1542,18 @@ class PageLoader {
       try {
         const {
           error,
-          page
+          page,
+          pageExports
         } = regFn();
         this.pageCache[route] = {
           error,
-          page
+          page,
+          pageExports
         };
         this.pageRegisterEvents.emit(route, {
           error,
-          page
+          page,
+          pageExports
         });
       } catch (error) {
         this.pageCache[route] = {
Diff for _app.js
@@ -194,7 +194,14 @@ function createUrl(router) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_app", function() {
       var page = __webpack_require__("B5Ud")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for _error.js
@@ -144,7 +144,14 @@ var styles = {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_error", function() {
       var page = __webpack_require__("/a9y")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for hooks.js
@@ -996,7 +996,14 @@ module.exports = __webpack_require__("jmDH") ? Object.defineProperties : functio
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/hooks", function() {
       var page = __webpack_require__("+MDD")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for index.js
@@ -24,7 +24,14 @@ Page.getInitialProps = function () {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/", function() {
       var page = __webpack_require__("RNiq")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for link.js
@@ -169,7 +169,14 @@ module.exports = function (TYPE, $create) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/link", function() {
       var page = __webpack_require__("ObF3")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for routerDirect.js
@@ -7,7 +7,14 @@
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/routerDirect", function() {
       var page = __webpack_require__("jSAA")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for withRouter.js
@@ -32,7 +32,14 @@ useWithRouter.getInitialProps = function () {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/withRouter", function() {
       var page = __webpack_require__("0Hlz")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for _app.module.js
@@ -199,7 +199,14 @@ function createUrl(router) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_app", function() {
       var page = __webpack_require__("B5Ud")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for _error.module.js
@@ -123,7 +123,14 @@ const styles = {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_error", function() {
       var page = __webpack_require__("/a9y")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for hooks.module.js
@@ -135,7 +135,14 @@ module.exports = shouldUseNative() ? Object.assign : function (target, source) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/hooks", function() {
       var page = __webpack_require__("+MDD")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for index.module.js
@@ -20,7 +20,14 @@ Page.getInitialProps = () => ({});
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/", function() {
       var page = __webpack_require__("RNiq")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for link.module.js
@@ -227,7 +227,14 @@ module.exports = function (TYPE, $create) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/link", function() {
       var page = __webpack_require__("ObF3")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for routerDirect.module.js
@@ -7,7 +7,14 @@
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/routerDirect", function() {
       var page = __webpack_require__("jSAA")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for withRouter.module.js
@@ -30,7 +30,14 @@ useWithRouter.getInitialProps = () => ({});
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/withRouter", function() {
       var page = __webpack_require__("0Hlz")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        pageExports: pageExports
+      }
     }]);
Diff for index.html
@@ -6,19 +6,19 @@
         <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"
         />
         <meta name="next-head-count" content="2" />
-        <link rel="preload" href="/_next/static/7GSwdaNyJ8fTOQmdjdfw0/pages/index.module.js"
+        <link rel="preload" href="/_next/static/1IqgW4pgpQ3sNbCThb56p/pages/index.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/7GSwdaNyJ8fTOQmdjdfw0/pages/_app.module.js"
+        <link rel="preload" href="/_next/static/1IqgW4pgpQ3sNbCThb56p/pages/_app.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-9c0b8b62a2fb27af35b2.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-6a9256f9bf0c4935aaa0.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/IVfEZatEwUVrBMNw3oJ7d4Jh2mA=.72ab6ea1ebeafbd8c735.module.js"
+        <link rel="preload" href="/_next/static/chunks/mId4z8LszexLlIfYJ0d6Bbq1mc=.72ab6ea1ebeafbd8c735.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/7GSwdaNyJ8fTOQmdjdfw0/_buildManifest.module.js"
+        <link rel="preload" href="/_next/static/1IqgW4pgpQ3sNbCThb56p/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
     </head>
     
@@ -26,40 +26,40 @@
         <div id="__next">Hello world 👋</div>
         <script id="__NEXT_DATA__" type="application/json"
         crossorigin="anonymous">
-            {"dataManager":"[]","props":{"pageProps":{}},"page":"/","query":{},"buildId":"7GSwdaNyJ8fTOQmdjdfw0"}
+            {"dataManager":"[]","props":{"pageProps":{}},"page":"/","query":{},"buildId":"1IqgW4pgpQ3sNbCThb56p"}
         </script>
         <script crossorigin="anonymous" nomodule="">
             !function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();
         </script>
-        <script async="" data-next-page="/" src="/_next/static/7GSwdaNyJ8fTOQmdjdfw0/pages/index.js"
+        <script async="" data-next-page="/" src="/_next/static/1IqgW4pgpQ3sNbCThb56p/pages/index.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/" src="/_next/static/7GSwdaNyJ8fTOQmdjdfw0/pages/index.module.js"
+        <script async="" data-next-page="/" src="/_next/static/1IqgW4pgpQ3sNbCThb56p/pages/index.module.js"
         crossorigin="anonymous" type="module"></script>
-        <script async="" data-next-page="/_app" src="/_next/static/7GSwdaNyJ8fTOQmdjdfw0/pages/_app.js"
+        <script async="" data-next-page="/_app" src="/_next/static/1IqgW4pgpQ3sNbCThb56p/pages/_app.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/_app" src="/_next/static/7GSwdaNyJ8fTOQmdjdfw0/pages/_app.module.js"
+        <script async="" data-next-page="/_app" src="/_next/static/1IqgW4pgpQ3sNbCThb56p/pages/_app.module.js"
         crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/runtime/webpack-a470c2a25bcb4d5a8ec0.js"
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-97617d800ec2b207a20a.js"
+        <script src="/_next/static/runtime/main-4d07c17b2b85ef06f063.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-9c0b8b62a2fb27af35b2.module.js"
+        <script src="/_next/static/runtime/main-6a9256f9bf0c4935aaa0.module.js"
         async="" crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.js"
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/chunks/WSiibA5ZxHG+wvR0Umzd8riw9EM=.155621535702fe040780.js"
+        <script src="/_next/static/chunks/xQuRKcmjvKMeyO5HfV4mDvsslVg=.155621535702fe040780.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/IVfEZatEwUVrBMNw3oJ7d4Jh2mA=.c99adde05e467047c83e.js"
+        <script src="/_next/static/chunks/mId4z8LszexLlIfYJ0d6Bbq1mc=.c99adde05e467047c83e.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/IVfEZatEwUVrBMNw3oJ7d4Jh2mA=.72ab6ea1ebeafbd8c735.module.js"
+        <script src="/_next/static/chunks/mId4z8LszexLlIfYJ0d6Bbq1mc=.72ab6ea1ebeafbd8c735.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/7GSwdaNyJ8fTOQmdjdfw0/_buildManifest.js"
+        <script src="/_next/static/1IqgW4pgpQ3sNbCThb56p/_buildManifest.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/7GSwdaNyJ8fTOQmdjdfw0/_buildManifest.module.js"
+        <script src="/_next/static/1IqgW4pgpQ3sNbCThb56p/_buildManifest.module.js"
         async="" crossorigin="anonymous" type="module"></script>
     </body>
Diff for link.html
@@ -6,19 +6,19 @@
         <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"
         />
         <meta name="next-head-count" content="2" />
-        <link rel="preload" href="/_next/static/7GSwdaNyJ8fTOQmdjdfw0/pages/link.module.js"
+        <link rel="preload" href="/_next/static/1IqgW4pgpQ3sNbCThb56p/pages/link.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/7GSwdaNyJ8fTOQmdjdfw0/pages/_app.module.js"
+        <link rel="preload" href="/_next/static/1IqgW4pgpQ3sNbCThb56p/pages/_app.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/IVfEZatEwUVrBMNw3oJ7d4Jh2mA=.72ab6ea1ebeafbd8c735.module.js"
+        <link rel="preload" href="/_next/static/chunks/mId4z8LszexLlIfYJ0d6Bbq1mc=.72ab6ea1ebeafbd8c735.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-9c0b8b62a2fb27af35b2.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-6a9256f9bf0c4935aaa0.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/7GSwdaNyJ8fTOQmdjdfw0/_buildManifest.module.js"
+        <link rel="preload" href="/_next/static/1IqgW4pgpQ3sNbCThb56p/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
     </head>
     
@@ -29,18 +29,18 @@
             </div>
         </div>
         <script id="__NEXT_DATA__" type="application/json" crossorigin="anonymous">
-            {"dataManager":"[]","props":{"pageProps":{}},"page":"/link","query":{},"buildId":"7GSwdaNyJ8fTOQmdjdfw0"}
+            {"dataManager":"[]","props":{"pageProps":{}},"page":"/link","query":{},"buildId":"1IqgW4pgpQ3sNbCThb56p"}
         </script>
         <script crossorigin="anonymous" nomodule="">
             !function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();
         </script>
-        <script async="" data-next-page="/link" src="/_next/static/7GSwdaNyJ8fTOQmdjdfw0/pages/link.js"
+        <script async="" data-next-page="/link" src="/_next/static/1IqgW4pgpQ3sNbCThb56p/pages/link.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/link" src="/_next/static/7GSwdaNyJ8fTOQmdjdfw0/pages/link.module.js"
+        <script async="" data-next-page="/link" src="/_next/static/1IqgW4pgpQ3sNbCThb56p/pages/link.module.js"
         crossorigin="anonymous" type="module"></script>
-        <script async="" data-next-page="/_app" src="/_next/static/7GSwdaNyJ8fTOQmdjdfw0/pages/_app.js"
+        <script async="" data-next-page="/_app" src="/_next/static/1IqgW4pgpQ3sNbCThb56p/pages/_app.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/_app" src="/_next/static/7GSwdaNyJ8fTOQmdjdfw0/pages/_app.module.js"
+        <script async="" data-next-page="/_app" src="/_next/static/1IqgW4pgpQ3sNbCThb56p/pages/_app.module.js"
         crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/runtime/webpack-a470c2a25bcb4d5a8ec0.js"
         async="" crossorigin="anonymous" nomodule=""></script>
@@ -50,19 +50,19 @@
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/chunks/WSiibA5ZxHG+wvR0Umzd8riw9EM=.155621535702fe040780.js"
+        <script src="/_next/static/chunks/xQuRKcmjvKMeyO5HfV4mDvsslVg=.155621535702fe040780.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/IVfEZatEwUVrBMNw3oJ7d4Jh2mA=.c99adde05e467047c83e.js"
+        <script src="/_next/static/chunks/mId4z8LszexLlIfYJ0d6Bbq1mc=.c99adde05e467047c83e.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/IVfEZatEwUVrBMNw3oJ7d4Jh2mA=.72ab6ea1ebeafbd8c735.module.js"
+        <script src="/_next/static/chunks/mId4z8LszexLlIfYJ0d6Bbq1mc=.72ab6ea1ebeafbd8c735.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-97617d800ec2b207a20a.js"
+        <script src="/_next/static/runtime/main-4d07c17b2b85ef06f063.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-9c0b8b62a2fb27af35b2.module.js"
+        <script src="/_next/static/runtime/main-6a9256f9bf0c4935aaa0.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/7GSwdaNyJ8fTOQmdjdfw0/_buildManifest.js"
+        <script src="/_next/static/1IqgW4pgpQ3sNbCThb56p/_buildManifest.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/7GSwdaNyJ8fTOQmdjdfw0/_buildManifest.module.js"
+        <script src="/_next/static/1IqgW4pgpQ3sNbCThb56p/_buildManifest.module.js"
         async="" crossorigin="anonymous" type="module"></script>
     </body>
Diff for withRouter.html
@@ -6,19 +6,19 @@
         <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"
         />
         <meta name="next-head-count" content="2" />
-        <link rel="preload" href="/_next/static/7GSwdaNyJ8fTOQmdjdfw0/pages/withRouter.module.js"
+        <link rel="preload" href="/_next/static/1IqgW4pgpQ3sNbCThb56p/pages/withRouter.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/7GSwdaNyJ8fTOQmdjdfw0/pages/_app.module.js"
+        <link rel="preload" href="/_next/static/1IqgW4pgpQ3sNbCThb56p/pages/_app.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/IVfEZatEwUVrBMNw3oJ7d4Jh2mA=.72ab6ea1ebeafbd8c735.module.js"
+        <link rel="preload" href="/_next/static/chunks/mId4z8LszexLlIfYJ0d6Bbq1mc=.72ab6ea1ebeafbd8c735.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-9c0b8b62a2fb27af35b2.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-6a9256f9bf0c4935aaa0.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/7GSwdaNyJ8fTOQmdjdfw0/_buildManifest.module.js"
+        <link rel="preload" href="/_next/static/1IqgW4pgpQ3sNbCThb56p/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
     </head>
     
@@ -27,18 +27,18 @@
             <div>I use withRouter</div>
         </div>
         <script id="__NEXT_DATA__" type="application/json" crossorigin="anonymous">
-            {"dataManager":"[]","props":{"pageProps":{}},"page":"/withRouter","query":{},"buildId":"7GSwdaNyJ8fTOQmdjdfw0"}
+            {"dataManager":"[]","props":{"pageProps":{}},"page":"/withRouter","query":{},"buildId":"1IqgW4pgpQ3sNbCThb56p"}
         </script>
         <script crossorigin="anonymous" nomodule="">
             !function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();
         </script>
-        <script async="" data-next-page="/withRouter" src="/_next/static/7GSwdaNyJ8fTOQmdjdfw0/pages/withRouter.js"
+        <script async="" data-next-page="/withRouter" src="/_next/static/1IqgW4pgpQ3sNbCThb56p/pages/withRouter.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/withRouter" src="/_next/static/7GSwdaNyJ8fTOQmdjdfw0/pages/withRouter.module.js"
+        <script async="" data-next-page="/withRouter" src="/_next/static/1IqgW4pgpQ3sNbCThb56p/pages/withRouter.module.js"
         crossorigin="anonymous" type="module"></script>
-        <script async="" data-next-page="/_app" src="/_next/static/7GSwdaNyJ8fTOQmdjdfw0/pages/_app.js"
+        <script async="" data-next-page="/_app" src="/_next/static/1IqgW4pgpQ3sNbCThb56p/pages/_app.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/_app" src="/_next/static/7GSwdaNyJ8fTOQmdjdfw0/pages/_app.module.js"
+        <script async="" data-next-page="/_app" src="/_next/static/1IqgW4pgpQ3sNbCThb56p/pages/_app.module.js"
         crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/runtime/webpack-a470c2a25bcb4d5a8ec0.js"
         async="" crossorigin="anonymous" nomodule=""></script>
@@ -48,19 +48,19 @@
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/chunks/WSiibA5ZxHG+wvR0Umzd8riw9EM=.155621535702fe040780.js"
+        <script src="/_next/static/chunks/xQuRKcmjvKMeyO5HfV4mDvsslVg=.155621535702fe040780.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/IVfEZatEwUVrBMNw3oJ7d4Jh2mA=.c99adde05e467047c83e.js"
+        <script src="/_next/static/chunks/mId4z8LszexLlIfYJ0d6Bbq1mc=.c99adde05e467047c83e.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/IVfEZatEwUVrBMNw3oJ7d4Jh2mA=.72ab6ea1ebeafbd8c735.module.js"
+        <script src="/_next/static/chunks/mId4z8LszexLlIfYJ0d6Bbq1mc=.72ab6ea1ebeafbd8c735.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-97617d800ec2b207a20a.js"
+        <script src="/_next/static/runtime/main-4d07c17b2b85ef06f063.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-9c0b8b62a2fb27af35b2.module.js"
+        <script src="/_next/static/runtime/main-6a9256f9bf0c4935aaa0.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/7GSwdaNyJ8fTOQmdjdfw0/_buildManifest.js"
+        <script src="/_next/static/1IqgW4pgpQ3sNbCThb56p/_buildManifest.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/7GSwdaNyJ8fTOQmdjdfw0/_buildManifest.module.js"
+        <script src="/_next/static/1IqgW4pgpQ3sNbCThb56p/_buildManifest.module.js"
         async="" crossorigin="anonymous" type="module"></script>
     </body>

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
buildDuration 28.8s 28.7s -55ms
nodeModulesSize 41.3 MB 41.3 MB ⚠️ +2.91 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.js 18.1 kB 19.2 kB ⚠️ +1.02 kB
main-HASH.js gzip 6.64 kB 6.83 kB ⚠️ +187 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
Overall change ⚠️ +1.02 kB
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.module.js 16.5 kB 17.4 kB ⚠️ +914 B
main-HASH.module.js gzip 6.37 kB 6.54 kB ⚠️ +170 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH.module.js gzip 746 B 746 B
Overall change ⚠️ +914 B
Client Pages Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.js 1.83 kB 1.88 kB ⚠️ +48 B
_app.js gzip 884 B 913 B ⚠️ +29 B
_error.js 12.1 kB 12.2 kB ⚠️ +48 B
_error.js gzip 4.76 kB 4.78 kB ⚠️ +16 B
hooks.js 12.7 kB 12.8 kB ⚠️ +48 B
hooks.js gzip 4.81 kB 4.83 kB ⚠️ +23 B
index.js 343 B 391 B ⚠️ +48 B
index.js gzip 237 B 264 B ⚠️ +27 B
link.js 8.14 kB 8.18 kB ⚠️ +48 B
link.js gzip 3.49 kB 3.51 kB ⚠️ +21 B
routerDirect.js 434 B 481 B ⚠️ +47 B
routerDirect.js gzip 296 B 325 B ⚠️ +29 B
withRouter.js 444 B 492 B ⚠️ +48 B
withRouter.js gzip 294 B 322 B ⚠️ +28 B
Overall change ⚠️ +335 B
Client Pages Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.module.js 1.73 kB 1.77 kB ⚠️ +44 B
_app.module.js gzip 840 B 869 B ⚠️ +29 B
_error.module.js 23.3 kB 23.4 kB ⚠️ +44 B
_error.module.js gzip 8.62 kB 8.65 kB ⚠️ +27 B
hooks.module.js 1.55 kB 1.59 kB ⚠️ +44 B
hooks.module.js gzip 805 B 826 B ⚠️ +21 B
index.module.js 319 B 363 B ⚠️ +44 B
index.module.js gzip 238 B 265 B ⚠️ +27 B
link.module.js 8.52 kB 8.57 kB ⚠️ +44 B
link.module.js gzip 3.68 kB 3.7 kB ⚠️ +19 B
routerDirect.module.js 419 B 463 B ⚠️ +44 B
routerDirect.module.js gzip 294 B 323 B ⚠️ +29 B
withRouter.module.js 430 B 473 B ⚠️ +43 B
withRouter.module.js gzip 293 B 322 B ⚠️ +29 B
Overall change ⚠️ +307 B
Client Build Manifests
zeit/next.js canary azukaru/next.js relay-analytics Change
_buildManifest.js 81 B 81 B
_buildManifest.js gzip 61 B 61 B
_buildManifest.module.js 81 B 81 B
_buildManifest.module.js gzip 61 B 61 B
Overall change
Serverless bundles Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_error.js 247 kB 247 kB ⚠️ +10 B
_error.js gzip 66.2 kB 66.4 kB ⚠️ +181 B
hooks.html 3.81 kB 3.81 kB ⚠️ +2 B
hooks.html gzip 975 B 979 B ⚠️ +4 B
index.js 248 kB 248 kB ⚠️ +10 B
index.js gzip 66.6 kB 66.6 kB -32 B
link.js 255 kB 255 kB ⚠️ +10 B
link.js gzip 68.9 kB 68.7 kB -180 B
routerDirect.js 249 kB 249 kB ⚠️ +10 B
routerDirect.js gzip 66.7 kB 66.9 kB ⚠️ +117 B
withRouter.js 248 kB 248 kB ⚠️ +10 B
withRouter.js gzip 66.8 kB 66.8 kB ⚠️ +45 B
Overall change ⚠️ +52 B

@ijjk
Copy link
Member

ijjk commented Aug 29, 2019

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall decrease ✓
zeit/next.js canary azukaru/next.js relay-analytics Change
buildDuration 23.3s 22.2s -1.1s
nodeModulesSize 41.8 MB 41.3 MB -451 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.js 18.2 kB 19.1 kB ⚠️ +929 B
main-HASH.js gzip 6.64 kB 6.82 kB ⚠️ +176 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
Overall change ⚠️ +929 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.module.js 16.5 kB 17.3 kB ⚠️ +827 B
main-HASH.module.js gzip 6.38 kB 6.53 kB ⚠️ +157 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH.module.js gzip 746 B 746 B
Overall change ⚠️ +827 B
Client Pages Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.js 1.83 kB 1.88 kB ⚠️ +40 B
_app.js gzip 884 B 909 B ⚠️ +25 B
_error.js 12.1 kB 12.2 kB ⚠️ +40 B
_error.js gzip 4.76 kB 4.78 kB ⚠️ +16 B
hooks.js 12.7 kB 12.8 kB ⚠️ +40 B
hooks.js gzip 4.81 kB 4.83 kB ⚠️ +19 B
index.js 343 B 383 B ⚠️ +40 B
index.js gzip 237 B 260 B ⚠️ +23 B
link.js 8.14 kB 8.18 kB ⚠️ +40 B
link.js gzip 3.49 kB 3.51 kB ⚠️ +18 B
routerDirect.js 433 B 473 B ⚠️ +40 B
routerDirect.js gzip 296 B 320 B ⚠️ +24 B
withRouter.js 444 B 484 B ⚠️ +40 B
withRouter.js gzip 294 B 318 B ⚠️ +24 B
Overall change ⚠️ +280 B
Client Pages Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.module.js 1.73 kB 1.76 kB ⚠️ +36 B
_app.module.js gzip 840 B 866 B ⚠️ +26 B
_error.module.js 23.3 kB 23.4 kB ⚠️ +36 B
_error.module.js gzip 8.62 kB 8.65 kB ⚠️ +24 B
hooks.module.js 1.55 kB 1.58 kB ⚠️ +36 B
hooks.module.js gzip 804 B 823 B ⚠️ +19 B
index.module.js 319 B 355 B ⚠️ +36 B
index.module.js gzip 238 B 260 B ⚠️ +22 B
link.module.js 8.52 kB 8.56 kB ⚠️ +36 B
link.module.js gzip 3.68 kB 3.69 kB ⚠️ +17 B
routerDirect.module.js 419 B 455 B ⚠️ +36 B
routerDirect.module.js gzip 294 B 316 B ⚠️ +22 B
withRouter.module.js 429 B 465 B ⚠️ +36 B
withRouter.module.js gzip 293 B 318 B ⚠️ +25 B
Overall change ⚠️ +252 B
Client Build Manifests
zeit/next.js canary azukaru/next.js relay-analytics Change
_buildManifest.js 81 B 81 B
_buildManifest.js gzip 61 B 61 B
_buildManifest.module.js 81 B 81 B
_buildManifest.module.js gzip 61 B 61 B
Overall change
Rendered Page Sizes
zeit/next.js canary azukaru/next.js relay-analytics Change
index.html 3.7 kB 3.7 kB
index.html gzip 955 B 956 B ⚠️ +1 B
link.html 3.75 kB 3.75 kB
link.html gzip 964 B 964 B
withRouter.html 3.75 kB 3.75 kB
withRouter.html gzip 950 B 952 B ⚠️ +2 B
Overall change

Diffs

Diff for main-HASH.js
@@ -387,7 +387,7 @@ exports.router = router;
 var ErrorComponent;
 exports.ErrorComponent = ErrorComponent;
 var Component;
-var App;
+var App, perfDataRelayer;
 
 var Container =
 /*#__PURE__*/
@@ -460,7 +460,7 @@ function () {
   var _ref2 = (0, _asyncToGenerator2["default"])(
   /*#__PURE__*/
   _regeneratorRuntime.mark(function _callee(_temp) {
-    var _ref, passedWebpackHMR, initialErr, _require, isValidElementType, renderCtx;
+    var _ref, passedWebpackHMR, _ref3, app, mod, initialErr, _require, isValidElementType, renderCtx;
 
     return _regeneratorRuntime.wrap(function _callee$(_context) {
       while (1) {
@@ -471,52 +471,60 @@ function () {
             if (false) {}
 
             _context.next = 4;
-            return pageLoader.loadPage('/_app');
+            return pageLoader.loadPageScript('/_app');
 
           case 4:
-            App = _context.sent;
+            _ref3 = _context.sent;
+            app = _ref3.page;
+            mod = _ref3.mod;
+            App = app;
+
+            if (mod && mod.relayPerformanceData) {
+              perfDataRelayer = mod.relayPerformanceData;
+            }
+
             initialErr = err;
-            _context.prev = 6;
-            _context.next = 9;
+            _context.prev = 10;
+            _context.next = 13;
             return pageLoader.loadPage(page);
 
-          case 9:
+          case 13:
             Component = _context.sent;
 
             if (true) {
-              _context.next = 14;
+              _context.next = 18;
               break;
             }
 
             _require = __webpack_require__(!(function webpackMissingModule() { var e = new Error("Cannot find module 'react-is'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())), isValidElementType = _require.isValidElementType;
 
             if (isValidElementType(Component)) {
-              _context.next = 14;
+              _context.next = 18;
               break;
             }
 
             throw new Error("The default export is not a React Component in page: \"" + page + "\"");
 
-          case 14:
-            _context.next = 19;
+          case 18:
+            _context.next = 23;
             break;
 
-          case 16:
-            _context.prev = 16;
-            _context.t0 = _context["catch"](6);
+          case 20:
+            _context.prev = 20;
+            _context.t0 = _context["catch"](10);
             // This catches errors like throwing in the top level of a module
             initialErr = _context.t0;
 
-          case 19:
+          case 23:
             if (!window.__NEXT_PRELOADREADY) {
-              _context.next = 22;
+              _context.next = 26;
               break;
             }
 
-            _context.next = 22;
+            _context.next = 26;
             return window.__NEXT_PRELOADREADY(dynamicIds);
 
-          case 22:
+          case 26:
             exports.router = router = (0, _router.createRouter)(page, query, asPath, {
               initialProps: props,
               pageLoader: pageLoader,
@@ -547,12 +555,12 @@ function () {
             render(renderCtx);
             return _context.abrupt("return", emitter);
 
-          case 26:
+          case 30:
           case "end":
             return _context.stop();
         }
       }
-    }, _callee, null, [[6, 16]]);
+    }, _callee, null, [[10, 20]]);
   }));
 
   return function (_x) {
@@ -715,6 +723,20 @@ function renderReactElement(reactEl, domEl) {
   } else {
     _reactDom["default"].render(reactEl, domEl, markRenderComplete);
   }
+
+  relayPaintMetrics();
+}
+
+function relayPaintMetrics() {
+  if (perfDataRelayer) {
+    performance.getEntriesByType('paint').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
 }
 
 function markHydrateComplete() {
@@ -723,6 +745,24 @@ function markHydrateComplete() {
 
   performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
   performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-hydration').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('beforeRender').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
@@ -738,16 +778,30 @@ function markRenderComplete() {
 
   performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
   performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-render').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('Next.js-route-change-to-render').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
 function clearMarks() {
   performance.clearMarks();
-  /*
-  * TODO: uncomment the following line when we have a way to
-  * expose this to user code.
-  */
-  // performance.clearMeasures()
+  performance.clearMeasures();
 }
 
 function AppContainer(_ref4) {
@@ -1425,7 +1479,7 @@ function preloadScript(url) {
   var link = document.createElement('link');
   link.rel = 'preload';
   link.crossOrigin = "anonymous";
-  link.href = encodeURI(url);
+  link.href = url;
   link.as = 'script';
   document.head.appendChild(link);
 }
@@ -1479,13 +1533,21 @@ function () {
   }, {
     key: "loadPage",
     value: function loadPage(route) {
+      return this.loadPageScript(route).then(function (value) {
+        return value ? value.page : value;
+      });
+    }
+  }, {
+    key: "loadPageScript",
+    value: function loadPageScript(route) {
       var _this3 = this;
 
       route = this.normalizeRoute(route);
       return new _promise["default"](function (resolve, reject) {
         var fire = function fire(_ref) {
           var error = _ref.error,
-              page = _ref.page;
+              page = _ref.page,
+              mod = _ref.mod;
 
           _this3.pageRegisterEvents.off(route, fire);
 
@@ -1494,7 +1556,10 @@ function () {
           if (error) {
             reject(error);
           } else {
-            resolve(page);
+            resolve({
+              page: page,
+              mod: mod
+            });
           }
         }; // If there's a cached version of the page, let's use it.
 
@@ -1503,8 +1568,12 @@ function () {
 
         if (cachedPage) {
           var error = cachedPage.error,
-              page = cachedPage.page;
-          error ? reject(error) : resolve(page);
+              page = cachedPage.page,
+              mod = cachedPage.mod;
+          error ? reject(error) : resolve({
+            page: page,
+            mod: mod
+          });
           return;
         } // Register a listener to get the page
 
@@ -1576,7 +1645,7 @@ function () {
       }
 
       script.crossOrigin = "anonymous";
-      script.src = encodeURI(url);
+      script.src = url;
 
       script.onerror = function () {
         var error = new Error("Error loading script " + url);
@@ -1599,16 +1668,19 @@ function () {
         try {
           var _regFn = regFn(),
               error = _regFn.error,
-              page = _regFn.page;
+              page = _regFn.page,
+              mod = _regFn.mod;
 
           _this5.pageCache[route] = {
             error: error,
-            page: page
+            page: page,
+            mod: mod
           };
 
           _this5.pageRegisterEvents.emit(route, {
             error: error,
-            page: page
+            page: page,
+            mod: mod
           });
         } catch (error) {
           _this5.pageCache[route] = {
Diff for main-HASH.module.js
@@ -458,7 +458,7 @@ exports.router = router;
 let ErrorComponent;
 exports.ErrorComponent = ErrorComponent;
 let Component;
-let App;
+let App, perfDataRelayer;
 
 class Container extends _react.default.Component {
   componentDidCatch(err, info) {
@@ -516,7 +516,16 @@ function () {
 
     if (false) {}
 
-    App = yield pageLoader.loadPage('/_app');
+    const {
+      page: app,
+      mod
+    } = yield pageLoader.loadPageScript('/_app');
+    App = app;
+
+    if (mod && mod.relayPerformanceData) {
+      perfDataRelayer = mod.relayPerformanceData;
+    }
+
     let initialErr = err;
 
     try {
@@ -657,6 +666,20 @@ function renderReactElement(reactEl, domEl) {
   } else {
     _reactDom.default.render(reactEl, domEl, markRenderComplete);
   }
+
+  relayPaintMetrics();
+}
+
+function relayPaintMetrics() {
+  if (perfDataRelayer) {
+    performance.getEntriesByType('paint').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
 }
 
 function markHydrateComplete() {
@@ -665,6 +688,24 @@ function markHydrateComplete() {
 
   performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
   performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-hydration').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('beforeRender').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
@@ -680,16 +721,30 @@ function markRenderComplete() {
 
   performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
   performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-render').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('Next.js-route-change-to-render').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
 function clearMarks() {
   performance.clearMarks();
-  /*
-  * TODO: uncomment the following line when we have a way to
-  * expose this to user code.
-  */
-  // performance.clearMeasures()
+  performance.clearMeasures();
 }
 
 function AppContainer(_ref4) {
@@ -1338,7 +1393,7 @@ function preloadScript(url) {
   const link = document.createElement('link');
   link.rel = 'preload';
   link.crossOrigin = "anonymous";
-  link.href = encodeURI(url);
+  link.href = url;
   link.as = 'script';
   document.head.appendChild(link);
 }
@@ -1380,12 +1435,17 @@ class PageLoader {
   }
 
   loadPage(route) {
+    return this.loadPageScript(route).then(value => value ? value.page : value);
+  }
+
+  loadPageScript(route) {
     route = this.normalizeRoute(route);
     return new _promise.default((resolve, reject) => {
       const fire = _ref => {
         let {
           error,
-          page
+          page,
+          mod
         } = _ref;
         this.pageRegisterEvents.off(route, fire);
         delete this.loadingRoutes[route];
@@ -1393,7 +1453,10 @@ class PageLoader {
         if (error) {
           reject(error);
         } else {
-          resolve(page);
+          resolve({
+            page,
+            mod
+          });
         }
       }; // If there's a cached version of the page, let's use it.
 
@@ -1403,9 +1466,13 @@ class PageLoader {
       if (cachedPage) {
         const {
           error,
-          page
+          page,
+          mod
         } = cachedPage;
-        error ? reject(error) : resolve(page);
+        error ? reject(error) : resolve({
+          page,
+          mod
+        });
         return;
       } // Register a listener to get the page
 
@@ -1456,7 +1523,7 @@ class PageLoader {
     }
 
     script.crossOrigin = "anonymous";
-    script.src = encodeURI(url);
+    script.src = url;
 
     script.onerror = () => {
       const error = new Error("Error loading script " + url);
@@ -1475,15 +1542,18 @@ class PageLoader {
       try {
         const {
           error,
-          page
+          page,
+          mod
         } = regFn();
         this.pageCache[route] = {
           error,
-          page
+          page,
+          mod
         };
         this.pageRegisterEvents.emit(route, {
           error,
-          page
+          page,
+          mod
         });
       } catch (error) {
         this.pageCache[route] = {
Diff for _app.js
@@ -194,7 +194,14 @@ function createUrl(router) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_app", function() {
       var page = __webpack_require__("B5Ud")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for _error.js
@@ -144,7 +144,14 @@ var styles = {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_error", function() {
       var page = __webpack_require__("/a9y")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for hooks.js
@@ -996,7 +996,14 @@ module.exports = __webpack_require__("jmDH") ? Object.defineProperties : functio
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/hooks", function() {
       var page = __webpack_require__("+MDD")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for index.js
@@ -24,7 +24,14 @@ Page.getInitialProps = function () {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/", function() {
       var page = __webpack_require__("RNiq")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for link.js
@@ -169,7 +169,14 @@ module.exports = function (TYPE, $create) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/link", function() {
       var page = __webpack_require__("ObF3")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for routerDirect.js
@@ -7,7 +7,14 @@
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/routerDirect", function() {
       var page = __webpack_require__("jSAA")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for withRouter.js
@@ -32,7 +32,14 @@ useWithRouter.getInitialProps = function () {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/withRouter", function() {
       var page = __webpack_require__("0Hlz")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for _app.module.js
@@ -199,7 +199,14 @@ function createUrl(router) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_app", function() {
       var page = __webpack_require__("B5Ud")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for _error.module.js
@@ -123,7 +123,14 @@ const styles = {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_error", function() {
       var page = __webpack_require__("/a9y")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for hooks.module.js
@@ -135,7 +135,14 @@ module.exports = shouldUseNative() ? Object.assign : function (target, source) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/hooks", function() {
       var page = __webpack_require__("+MDD")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for index.module.js
@@ -20,7 +20,14 @@ Page.getInitialProps = () => ({});
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/", function() {
       var page = __webpack_require__("RNiq")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for link.module.js
@@ -227,7 +227,14 @@ module.exports = function (TYPE, $create) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/link", function() {
       var page = __webpack_require__("ObF3")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for routerDirect.module.js
@@ -7,7 +7,14 @@
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/routerDirect", function() {
       var page = __webpack_require__("jSAA")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for withRouter.module.js
@@ -30,7 +30,14 @@ useWithRouter.getInitialProps = () => ({});
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/withRouter", function() {
       var page = __webpack_require__("0Hlz")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for index.html
@@ -6,19 +6,19 @@
         <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"
         />
         <meta name="next-head-count" content="2" />
-        <link rel="preload" href="/_next/static/5Eh1axafPSTRLD8toI8KM/pages/index.module.js"
+        <link rel="preload" href="/_next/static/SEeYki11nDyxdy0R5PZZw/pages/index.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/5Eh1axafPSTRLD8toI8KM/pages/_app.module.js"
+        <link rel="preload" href="/_next/static/SEeYki11nDyxdy0R5PZZw/pages/_app.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-8dc7e72f54ca1d9c807d.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/54gIdfmqw4xwDBR0ch1lNpkYjZI=.c659a74b6088e6ac1abe.module.js"
+        <link rel="preload" href="/_next/static/chunks/fzW6nwZEuPxTmIJAPK5qcOX1nJw=.72ab6ea1ebeafbd8c735.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/5Eh1axafPSTRLD8toI8KM/_buildManifest.module.js"
+        <link rel="preload" href="/_next/static/SEeYki11nDyxdy0R5PZZw/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
     </head>
     
@@ -26,40 +26,40 @@
         <div id="__next">Hello world 👋</div>
         <script id="__NEXT_DATA__" type="application/json"
         crossorigin="anonymous">
-            {"dataManager":"[]","props":{"pageProps":{}},"page":"/","query":{},"buildId":"5Eh1axafPSTRLD8toI8KM"}
+            {"dataManager":"[]","props":{"pageProps":{}},"page":"/","query":{},"buildId":"SEeYki11nDyxdy0R5PZZw"}
         </script>
         <script crossorigin="anonymous" nomodule="">
             !function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();
         </script>
-        <script async="" data-next-page="/" src="/_next/static/5Eh1axafPSTRLD8toI8KM/pages/index.js"
+        <script async="" data-next-page="/" src="/_next/static/SEeYki11nDyxdy0R5PZZw/pages/index.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/" src="/_next/static/5Eh1axafPSTRLD8toI8KM/pages/index.module.js"
+        <script async="" data-next-page="/" src="/_next/static/SEeYki11nDyxdy0R5PZZw/pages/index.module.js"
         crossorigin="anonymous" type="module"></script>
-        <script async="" data-next-page="/_app" src="/_next/static/5Eh1axafPSTRLD8toI8KM/pages/_app.js"
+        <script async="" data-next-page="/_app" src="/_next/static/SEeYki11nDyxdy0R5PZZw/pages/_app.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/_app" src="/_next/static/5Eh1axafPSTRLD8toI8KM/pages/_app.module.js"
+        <script async="" data-next-page="/_app" src="/_next/static/SEeYki11nDyxdy0R5PZZw/pages/_app.module.js"
         crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/runtime/webpack-a470c2a25bcb4d5a8ec0.js"
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-2cd30e118423b74fdb03.js"
+        <script src="/_next/static/runtime/main-fdeaf1a90ba5883d457b.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <script src="/_next/static/runtime/main-8dc7e72f54ca1d9c807d.module.js"
         async="" crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.js"
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/chunks/G1BMzP2WDHFGOe8QjCJeB1jc+3E=.155621535702fe040780.js"
+        <script src="/_next/static/chunks/ksfkGmrB2KrQtWUODB3GbWRek=.155621535702fe040780.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/54gIdfmqw4xwDBR0ch1lNpkYjZI=.f6f7599a2edf91d8366a.js"
+        <script src="/_next/static/chunks/fzW6nwZEuPxTmIJAPK5qcOX1nJw=.c99adde05e467047c83e.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/54gIdfmqw4xwDBR0ch1lNpkYjZI=.c659a74b6088e6ac1abe.module.js"
+        <script src="/_next/static/chunks/fzW6nwZEuPxTmIJAPK5qcOX1nJw=.72ab6ea1ebeafbd8c735.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/5Eh1axafPSTRLD8toI8KM/_buildManifest.js"
+        <script src="/_next/static/SEeYki11nDyxdy0R5PZZw/_buildManifest.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/5Eh1axafPSTRLD8toI8KM/_buildManifest.module.js"
+        <script src="/_next/static/SEeYki11nDyxdy0R5PZZw/_buildManifest.module.js"
         async="" crossorigin="anonymous" type="module"></script>
     </body>
Diff for link.html
@@ -6,19 +6,19 @@
         <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"
         />
         <meta name="next-head-count" content="2" />
-        <link rel="preload" href="/_next/static/5Eh1axafPSTRLD8toI8KM/pages/link.module.js"
+        <link rel="preload" href="/_next/static/SEeYki11nDyxdy0R5PZZw/pages/link.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/5Eh1axafPSTRLD8toI8KM/pages/_app.module.js"
+        <link rel="preload" href="/_next/static/SEeYki11nDyxdy0R5PZZw/pages/_app.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/54gIdfmqw4xwDBR0ch1lNpkYjZI=.c659a74b6088e6ac1abe.module.js"
+        <link rel="preload" href="/_next/static/chunks/fzW6nwZEuPxTmIJAPK5qcOX1nJw=.72ab6ea1ebeafbd8c735.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-8dc7e72f54ca1d9c807d.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/5Eh1axafPSTRLD8toI8KM/_buildManifest.module.js"
+        <link rel="preload" href="/_next/static/SEeYki11nDyxdy0R5PZZw/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
     </head>
     
@@ -29,18 +29,18 @@
             </div>
         </div>
         <script id="__NEXT_DATA__" type="application/json" crossorigin="anonymous">
-            {"dataManager":"[]","props":{"pageProps":{}},"page":"/link","query":{},"buildId":"5Eh1axafPSTRLD8toI8KM"}
+            {"dataManager":"[]","props":{"pageProps":{}},"page":"/link","query":{},"buildId":"SEeYki11nDyxdy0R5PZZw"}
         </script>
         <script crossorigin="anonymous" nomodule="">
             !function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();
         </script>
-        <script async="" data-next-page="/link" src="/_next/static/5Eh1axafPSTRLD8toI8KM/pages/link.js"
+        <script async="" data-next-page="/link" src="/_next/static/SEeYki11nDyxdy0R5PZZw/pages/link.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/link" src="/_next/static/5Eh1axafPSTRLD8toI8KM/pages/link.module.js"
+        <script async="" data-next-page="/link" src="/_next/static/SEeYki11nDyxdy0R5PZZw/pages/link.module.js"
         crossorigin="anonymous" type="module"></script>
-        <script async="" data-next-page="/_app" src="/_next/static/5Eh1axafPSTRLD8toI8KM/pages/_app.js"
+        <script async="" data-next-page="/_app" src="/_next/static/SEeYki11nDyxdy0R5PZZw/pages/_app.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/_app" src="/_next/static/5Eh1axafPSTRLD8toI8KM/pages/_app.module.js"
+        <script async="" data-next-page="/_app" src="/_next/static/SEeYki11nDyxdy0R5PZZw/pages/_app.module.js"
         crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/runtime/webpack-a470c2a25bcb4d5a8ec0.js"
         async="" crossorigin="anonymous" nomodule=""></script>
@@ -50,19 +50,19 @@
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/chunks/G1BMzP2WDHFGOe8QjCJeB1jc+3E=.155621535702fe040780.js"
+        <script src="/_next/static/chunks/ksfkGmrB2KrQtWUODB3GbWRek=.155621535702fe040780.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/54gIdfmqw4xwDBR0ch1lNpkYjZI=.f6f7599a2edf91d8366a.js"
+        <script src="/_next/static/chunks/fzW6nwZEuPxTmIJAPK5qcOX1nJw=.c99adde05e467047c83e.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/54gIdfmqw4xwDBR0ch1lNpkYjZI=.c659a74b6088e6ac1abe.module.js"
+        <script src="/_next/static/chunks/fzW6nwZEuPxTmIJAPK5qcOX1nJw=.72ab6ea1ebeafbd8c735.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-2cd30e118423b74fdb03.js"
+        <script src="/_next/static/runtime/main-fdeaf1a90ba5883d457b.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <script src="/_next/static/runtime/main-8dc7e72f54ca1d9c807d.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/5Eh1axafPSTRLD8toI8KM/_buildManifest.js"
+        <script src="/_next/static/SEeYki11nDyxdy0R5PZZw/_buildManifest.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/5Eh1axafPSTRLD8toI8KM/_buildManifest.module.js"
+        <script src="/_next/static/SEeYki11nDyxdy0R5PZZw/_buildManifest.module.js"
         async="" crossorigin="anonymous" type="module"></script>
     </body>
Diff for withRouter.html
@@ -6,19 +6,19 @@
         <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"
         />
         <meta name="next-head-count" content="2" />
-        <link rel="preload" href="/_next/static/5Eh1axafPSTRLD8toI8KM/pages/withRouter.module.js"
+        <link rel="preload" href="/_next/static/SEeYki11nDyxdy0R5PZZw/pages/withRouter.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/5Eh1axafPSTRLD8toI8KM/pages/_app.module.js"
+        <link rel="preload" href="/_next/static/SEeYki11nDyxdy0R5PZZw/pages/_app.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/54gIdfmqw4xwDBR0ch1lNpkYjZI=.c659a74b6088e6ac1abe.module.js"
+        <link rel="preload" href="/_next/static/chunks/fzW6nwZEuPxTmIJAPK5qcOX1nJw=.72ab6ea1ebeafbd8c735.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-8dc7e72f54ca1d9c807d.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/5Eh1axafPSTRLD8toI8KM/_buildManifest.module.js"
+        <link rel="preload" href="/_next/static/SEeYki11nDyxdy0R5PZZw/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
     </head>
     
@@ -27,18 +27,18 @@
             <div>I use withRouter</div>
         </div>
         <script id="__NEXT_DATA__" type="application/json" crossorigin="anonymous">
-            {"dataManager":"[]","props":{"pageProps":{}},"page":"/withRouter","query":{},"buildId":"5Eh1axafPSTRLD8toI8KM"}
+            {"dataManager":"[]","props":{"pageProps":{}},"page":"/withRouter","query":{},"buildId":"SEeYki11nDyxdy0R5PZZw"}
         </script>
         <script crossorigin="anonymous" nomodule="">
             !function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();
         </script>
-        <script async="" data-next-page="/withRouter" src="/_next/static/5Eh1axafPSTRLD8toI8KM/pages/withRouter.js"
+        <script async="" data-next-page="/withRouter" src="/_next/static/SEeYki11nDyxdy0R5PZZw/pages/withRouter.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/withRouter" src="/_next/static/5Eh1axafPSTRLD8toI8KM/pages/withRouter.module.js"
+        <script async="" data-next-page="/withRouter" src="/_next/static/SEeYki11nDyxdy0R5PZZw/pages/withRouter.module.js"
         crossorigin="anonymous" type="module"></script>
-        <script async="" data-next-page="/_app" src="/_next/static/5Eh1axafPSTRLD8toI8KM/pages/_app.js"
+        <script async="" data-next-page="/_app" src="/_next/static/SEeYki11nDyxdy0R5PZZw/pages/_app.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/_app" src="/_next/static/5Eh1axafPSTRLD8toI8KM/pages/_app.module.js"
+        <script async="" data-next-page="/_app" src="/_next/static/SEeYki11nDyxdy0R5PZZw/pages/_app.module.js"
         crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/runtime/webpack-a470c2a25bcb4d5a8ec0.js"
         async="" crossorigin="anonymous" nomodule=""></script>
@@ -48,19 +48,19 @@
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/chunks/G1BMzP2WDHFGOe8QjCJeB1jc+3E=.155621535702fe040780.js"
+        <script src="/_next/static/chunks/ksfkGmrB2KrQtWUODB3GbWRek=.155621535702fe040780.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/54gIdfmqw4xwDBR0ch1lNpkYjZI=.f6f7599a2edf91d8366a.js"
+        <script src="/_next/static/chunks/fzW6nwZEuPxTmIJAPK5qcOX1nJw=.c99adde05e467047c83e.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/54gIdfmqw4xwDBR0ch1lNpkYjZI=.c659a74b6088e6ac1abe.module.js"
+        <script src="/_next/static/chunks/fzW6nwZEuPxTmIJAPK5qcOX1nJw=.72ab6ea1ebeafbd8c735.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-2cd30e118423b74fdb03.js"
+        <script src="/_next/static/runtime/main-fdeaf1a90ba5883d457b.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <script src="/_next/static/runtime/main-8dc7e72f54ca1d9c807d.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/5Eh1axafPSTRLD8toI8KM/_buildManifest.js"
+        <script src="/_next/static/SEeYki11nDyxdy0R5PZZw/_buildManifest.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/5Eh1axafPSTRLD8toI8KM/_buildManifest.module.js"
+        <script src="/_next/static/SEeYki11nDyxdy0R5PZZw/_buildManifest.module.js"
         async="" crossorigin="anonymous" type="module"></script>
     </body>

Serverless Mode (Increase detected ⚠️)
General Overall decrease ✓
zeit/next.js canary azukaru/next.js relay-analytics Change
buildDuration 24s 24.1s ⚠️ +67ms
nodeModulesSize 41.8 MB 41.3 MB -451 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.js 18.2 kB 19.1 kB ⚠️ +930 B
main-HASH.js gzip 6.64 kB 6.82 kB ⚠️ +177 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
Overall change ⚠️ +930 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.module.js 16.5 kB 17.3 kB ⚠️ +828 B
main-HASH.module.js gzip 6.37 kB 6.53 kB ⚠️ +158 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH.module.js gzip 746 B 746 B
Overall change ⚠️ +828 B
Client Pages Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.js 1.83 kB 1.88 kB ⚠️ +40 B
_app.js gzip 884 B 909 B ⚠️ +25 B
_error.js 12.1 kB 12.2 kB ⚠️ +40 B
_error.js gzip 4.76 kB 4.78 kB ⚠️ +15 B
hooks.js 12.7 kB 12.8 kB ⚠️ +40 B
hooks.js gzip 4.81 kB 4.83 kB ⚠️ +19 B
index.js 343 B 383 B ⚠️ +40 B
index.js gzip 237 B 260 B ⚠️ +23 B
link.js 8.14 kB 8.18 kB ⚠️ +40 B
link.js gzip 3.49 kB 3.51 kB ⚠️ +17 B
routerDirect.js 434 B 473 B ⚠️ +39 B
routerDirect.js gzip 296 B 320 B ⚠️ +24 B
withRouter.js 444 B 484 B ⚠️ +40 B
withRouter.js gzip 294 B 318 B ⚠️ +24 B
Overall change ⚠️ +279 B
Client Pages Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.module.js 1.73 kB 1.76 kB ⚠️ +36 B
_app.module.js gzip 840 B 866 B ⚠️ +26 B
_error.module.js 23.3 kB 23.4 kB ⚠️ +36 B
_error.module.js gzip 8.62 kB 8.65 kB ⚠️ +24 B
hooks.module.js 1.55 kB 1.58 kB ⚠️ +36 B
hooks.module.js gzip 805 B 823 B ⚠️ +18 B
index.module.js 319 B 355 B ⚠️ +36 B
index.module.js gzip 238 B 260 B ⚠️ +22 B
link.module.js 8.52 kB 8.56 kB ⚠️ +36 B
link.module.js gzip 3.68 kB 3.69 kB ⚠️ +17 B
routerDirect.module.js 419 B 455 B ⚠️ +36 B
routerDirect.module.js gzip 294 B 316 B ⚠️ +22 B
withRouter.module.js 430 B 465 B ⚠️ +35 B
withRouter.module.js gzip 293 B 318 B ⚠️ +25 B
Overall change ⚠️ +251 B
Client Build Manifests
zeit/next.js canary azukaru/next.js relay-analytics Change
_buildManifest.js 81 B 81 B
_buildManifest.js gzip 61 B 61 B
_buildManifest.module.js 81 B 81 B
_buildManifest.module.js gzip 61 B 61 B
Overall change
Serverless bundles Overall decrease ✓
zeit/next.js canary azukaru/next.js relay-analytics Change
_error.js 247 kB 247 kB -143 B
_error.js gzip 66.2 kB 66.3 kB ⚠️ +55 B
hooks.html 3.81 kB 3.81 kB ⚠️ +5 B
hooks.html gzip 980 B 980 B
index.js 248 kB 248 kB -143 B
index.js gzip 66.7 kB 66.7 kB ⚠️ +48 B
link.js 256 kB 255 kB -143 B
link.js gzip 68.9 kB 68.8 kB -42 B
routerDirect.js 249 kB 249 kB -143 B
routerDirect.js gzip 66.8 kB 66.6 kB -154 B
withRouter.js 249 kB 248 kB -143 B
withRouter.js gzip 66.9 kB 66.9 kB -20 B
Overall change -710 B

@ijjk
Copy link
Member

ijjk commented Aug 29, 2019

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
buildDuration 24s 24s -38ms
nodeModulesSize 41.8 MB 41.8 MB ⚠️ +2.71 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.js 18.2 kB 19.1 kB ⚠️ +950 B
main-HASH.js gzip 6.64 kB 6.82 kB ⚠️ +179 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
Overall change ⚠️ +950 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.module.js 16.5 kB 17.4 kB ⚠️ +848 B
main-HASH.module.js gzip 6.38 kB 6.54 kB ⚠️ +160 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH.module.js gzip 746 B 746 B
Overall change ⚠️ +848 B
Client Pages Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.js 1.83 kB 1.88 kB ⚠️ +40 B
_app.js gzip 884 B 909 B ⚠️ +25 B
_error.js 12.1 kB 12.2 kB ⚠️ +40 B
_error.js gzip 4.76 kB 4.78 kB ⚠️ +16 B
hooks.js 12.7 kB 12.8 kB ⚠️ +40 B
hooks.js gzip 4.81 kB 4.83 kB ⚠️ +20 B
index.js 343 B 383 B ⚠️ +40 B
index.js gzip 237 B 260 B ⚠️ +23 B
link.js 8.14 kB 8.18 kB ⚠️ +40 B
link.js gzip 3.49 kB 3.51 kB ⚠️ +19 B
routerDirect.js 433 B 474 B ⚠️ +41 B
routerDirect.js gzip 296 B 321 B ⚠️ +25 B
withRouter.js 444 B 484 B ⚠️ +40 B
withRouter.js gzip 294 B 318 B ⚠️ +24 B
Overall change ⚠️ +281 B
Client Pages Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.module.js 1.73 kB 1.76 kB ⚠️ +36 B
_app.module.js gzip 840 B 866 B ⚠️ +26 B
_error.module.js 23.3 kB 23.4 kB ⚠️ +36 B
_error.module.js gzip 8.62 kB 8.65 kB ⚠️ +25 B
hooks.module.js 1.55 kB 1.58 kB ⚠️ +36 B
hooks.module.js gzip 804 B 824 B ⚠️ +20 B
index.module.js 319 B 355 B ⚠️ +36 B
index.module.js gzip 238 B 260 B ⚠️ +22 B
link.module.js 8.52 kB 8.56 kB ⚠️ +36 B
link.module.js gzip 3.68 kB 3.69 kB ⚠️ +17 B
routerDirect.module.js 419 B 455 B ⚠️ +36 B
routerDirect.module.js gzip 294 B 316 B ⚠️ +22 B
withRouter.module.js 429 B 466 B ⚠️ +37 B
withRouter.module.js gzip 293 B 318 B ⚠️ +25 B
Overall change ⚠️ +253 B
Client Build Manifests
zeit/next.js canary azukaru/next.js relay-analytics Change
_buildManifest.js 81 B 81 B
_buildManifest.js gzip 61 B 61 B
_buildManifest.module.js 81 B 81 B
_buildManifest.module.js gzip 61 B 61 B
Overall change
Rendered Page Sizes Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
index.html 3.69 kB 3.7 kB ⚠️ +1 B
index.html gzip 956 B 956 B
link.html 3.74 kB 3.74 kB ⚠️ +1 B
link.html gzip 964 B 965 B ⚠️ +1 B
withRouter.html 3.75 kB 3.75 kB ⚠️ +1 B
withRouter.html gzip 952 B 951 B -1 B
Overall change ⚠️ +3 B

Diffs

Diff for main-HASH.js
@@ -387,7 +387,7 @@ exports.router = router;
 var ErrorComponent;
 exports.ErrorComponent = ErrorComponent;
 var Component;
-var App;
+var App, perfDataRelayer;
 
 var Container =
 /*#__PURE__*/
@@ -460,7 +460,7 @@ function () {
   var _ref2 = (0, _asyncToGenerator2["default"])(
   /*#__PURE__*/
   _regeneratorRuntime.mark(function _callee(_temp) {
-    var _ref, passedWebpackHMR, initialErr, _require, isValidElementType, renderCtx;
+    var _ref, passedWebpackHMR, _ref3, app, mod, initialErr, _require, isValidElementType, renderCtx;
 
     return _regeneratorRuntime.wrap(function _callee$(_context) {
       while (1) {
@@ -471,52 +471,60 @@ function () {
             if (false) {}
 
             _context.next = 4;
-            return pageLoader.loadPage('/_app');
+            return pageLoader.loadPageScript('/_app');
 
           case 4:
-            App = _context.sent;
+            _ref3 = _context.sent;
+            app = _ref3.page;
+            mod = _ref3.mod;
+            App = app;
+
+            if (mod && mod.relayPerformanceData) {
+              perfDataRelayer = mod.relayPerformanceData;
+            }
+
             initialErr = err;
-            _context.prev = 6;
-            _context.next = 9;
+            _context.prev = 10;
+            _context.next = 13;
             return pageLoader.loadPage(page);
 
-          case 9:
+          case 13:
             Component = _context.sent;
 
             if (true) {
-              _context.next = 14;
+              _context.next = 18;
               break;
             }
 
             _require = __webpack_require__(!(function webpackMissingModule() { var e = new Error("Cannot find module 'react-is'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())), isValidElementType = _require.isValidElementType;
 
             if (isValidElementType(Component)) {
-              _context.next = 14;
+              _context.next = 18;
               break;
             }
 
             throw new Error("The default export is not a React Component in page: \"" + page + "\"");
 
-          case 14:
-            _context.next = 19;
+          case 18:
+            _context.next = 23;
             break;
 
-          case 16:
-            _context.prev = 16;
-            _context.t0 = _context["catch"](6);
+          case 20:
+            _context.prev = 20;
+            _context.t0 = _context["catch"](10);
             // This catches errors like throwing in the top level of a module
             initialErr = _context.t0;
 
-          case 19:
+          case 23:
             if (!window.__NEXT_PRELOADREADY) {
-              _context.next = 22;
+              _context.next = 26;
               break;
             }
 
-            _context.next = 22;
+            _context.next = 26;
             return window.__NEXT_PRELOADREADY(dynamicIds);
 
-          case 22:
+          case 26:
             exports.router = router = (0, _router.createRouter)(page, query, asPath, {
               initialProps: props,
               pageLoader: pageLoader,
@@ -547,12 +555,12 @@ function () {
             render(renderCtx);
             return _context.abrupt("return", emitter);
 
-          case 26:
+          case 30:
           case "end":
             return _context.stop();
         }
       }
-    }, _callee, null, [[6, 16]]);
+    }, _callee, null, [[10, 20]]);
   }));
 
   return function (_x) {
@@ -715,6 +723,20 @@ function renderReactElement(reactEl, domEl) {
   } else {
     _reactDom["default"].render(reactEl, domEl, markRenderComplete);
   }
+
+  relayPaintMetrics();
+}
+
+function relayPaintMetrics() {
+  if (perfDataRelayer) {
+    performance.getEntriesByType('paint').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
 }
 
 function markHydrateComplete() {
@@ -723,6 +745,24 @@ function markHydrateComplete() {
 
   performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
   performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-hydration').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('beforeRender').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
@@ -738,16 +778,30 @@ function markRenderComplete() {
 
   performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
   performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-render').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('Next.js-route-change-to-render').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
 function clearMarks() {
   performance.clearMarks();
-  /*
-  * TODO: uncomment the following line when we have a way to
-  * expose this to user code.
-  */
-  // performance.clearMeasures()
+  performance.clearMeasures();
 }
 
 function AppContainer(_ref4) {
@@ -1479,13 +1533,21 @@ function () {
   }, {
     key: "loadPage",
     value: function loadPage(route) {
+      return this.loadPageScript(route).then(function (value) {
+        return value ? value.page : value;
+      });
+    }
+  }, {
+    key: "loadPageScript",
+    value: function loadPageScript(route) {
       var _this3 = this;
 
       route = this.normalizeRoute(route);
       return new _promise["default"](function (resolve, reject) {
         var fire = function fire(_ref) {
           var error = _ref.error,
-              page = _ref.page;
+              page = _ref.page,
+              mod = _ref.mod;
 
           _this3.pageRegisterEvents.off(route, fire);
 
@@ -1494,7 +1556,10 @@ function () {
           if (error) {
             reject(error);
           } else {
-            resolve(page);
+            resolve({
+              page: page,
+              mod: mod
+            });
           }
         }; // If there's a cached version of the page, let's use it.
 
@@ -1503,8 +1568,12 @@ function () {
 
         if (cachedPage) {
           var error = cachedPage.error,
-              page = cachedPage.page;
-          error ? reject(error) : resolve(page);
+              page = cachedPage.page,
+              mod = cachedPage.mod;
+          error ? reject(error) : resolve({
+            page: page,
+            mod: mod
+          });
           return;
         } // Register a listener to get the page
 
@@ -1599,16 +1668,19 @@ function () {
         try {
           var _regFn = regFn(),
               error = _regFn.error,
-              page = _regFn.page;
+              page = _regFn.page,
+              mod = _regFn.mod;
 
           _this5.pageCache[route] = {
             error: error,
-            page: page
+            page: page,
+            mod: mod
           };
 
           _this5.pageRegisterEvents.emit(route, {
             error: error,
-            page: page
+            page: page,
+            mod: mod
           });
         } catch (error) {
           _this5.pageCache[route] = {
Diff for main-HASH.module.js
@@ -458,7 +458,7 @@ exports.router = router;
 let ErrorComponent;
 exports.ErrorComponent = ErrorComponent;
 let Component;
-let App;
+let App, perfDataRelayer;
 
 class Container extends _react.default.Component {
   componentDidCatch(err, info) {
@@ -516,7 +516,16 @@ function () {
 
     if (false) {}
 
-    App = yield pageLoader.loadPage('/_app');
+    const {
+      page: app,
+      mod
+    } = yield pageLoader.loadPageScript('/_app');
+    App = app;
+
+    if (mod && mod.relayPerformanceData) {
+      perfDataRelayer = mod.relayPerformanceData;
+    }
+
     let initialErr = err;
 
     try {
@@ -657,6 +666,20 @@ function renderReactElement(reactEl, domEl) {
   } else {
     _reactDom.default.render(reactEl, domEl, markRenderComplete);
   }
+
+  relayPaintMetrics();
+}
+
+function relayPaintMetrics() {
+  if (perfDataRelayer) {
+    performance.getEntriesByType('paint').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
 }
 
 function markHydrateComplete() {
@@ -665,6 +688,24 @@ function markHydrateComplete() {
 
   performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
   performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-hydration').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('beforeRender').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
@@ -680,16 +721,30 @@ function markRenderComplete() {
 
   performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
   performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-render').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('Next.js-route-change-to-render').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
 function clearMarks() {
   performance.clearMarks();
-  /*
-  * TODO: uncomment the following line when we have a way to
-  * expose this to user code.
-  */
-  // performance.clearMeasures()
+  performance.clearMeasures();
 }
 
 function AppContainer(_ref4) {
@@ -1380,12 +1435,17 @@ class PageLoader {
   }
 
   loadPage(route) {
+    return this.loadPageScript(route).then(value => value ? value.page : value);
+  }
+
+  loadPageScript(route) {
     route = this.normalizeRoute(route);
     return new _promise.default((resolve, reject) => {
       const fire = _ref => {
         let {
           error,
-          page
+          page,
+          mod
         } = _ref;
         this.pageRegisterEvents.off(route, fire);
         delete this.loadingRoutes[route];
@@ -1393,7 +1453,10 @@ class PageLoader {
         if (error) {
           reject(error);
         } else {
-          resolve(page);
+          resolve({
+            page,
+            mod
+          });
         }
       }; // If there's a cached version of the page, let's use it.
 
@@ -1403,9 +1466,13 @@ class PageLoader {
       if (cachedPage) {
         const {
           error,
-          page
+          page,
+          mod
         } = cachedPage;
-        error ? reject(error) : resolve(page);
+        error ? reject(error) : resolve({
+          page,
+          mod
+        });
         return;
       } // Register a listener to get the page
 
@@ -1475,15 +1542,18 @@ class PageLoader {
       try {
         const {
           error,
-          page
+          page,
+          mod
         } = regFn();
         this.pageCache[route] = {
           error,
-          page
+          page,
+          mod
         };
         this.pageRegisterEvents.emit(route, {
           error,
-          page
+          page,
+          mod
         });
       } catch (error) {
         this.pageCache[route] = {
Diff for _app.js
@@ -194,7 +194,14 @@ function createUrl(router) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_app", function() {
       var page = __webpack_require__("B5Ud")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for _error.js
@@ -144,7 +144,14 @@ var styles = {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_error", function() {
       var page = __webpack_require__("/a9y")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for hooks.js
@@ -996,7 +996,14 @@ module.exports = __webpack_require__("jmDH") ? Object.defineProperties : functio
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/hooks", function() {
       var page = __webpack_require__("+MDD")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for index.js
@@ -24,7 +24,14 @@ Page.getInitialProps = function () {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/", function() {
       var page = __webpack_require__("RNiq")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for link.js
@@ -169,7 +169,14 @@ module.exports = function (TYPE, $create) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/link", function() {
       var page = __webpack_require__("ObF3")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for routerDirect.js
@@ -7,7 +7,14 @@
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/routerDirect", function() {
       var page = __webpack_require__("jSAA")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for withRouter.js
@@ -32,7 +32,14 @@ useWithRouter.getInitialProps = function () {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/withRouter", function() {
       var page = __webpack_require__("0Hlz")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for _app.module.js
@@ -199,7 +199,14 @@ function createUrl(router) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_app", function() {
       var page = __webpack_require__("B5Ud")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for _error.module.js
@@ -123,7 +123,14 @@ const styles = {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_error", function() {
       var page = __webpack_require__("/a9y")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for hooks.module.js
@@ -135,7 +135,14 @@ module.exports = shouldUseNative() ? Object.assign : function (target, source) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/hooks", function() {
       var page = __webpack_require__("+MDD")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for index.module.js
@@ -20,7 +20,14 @@ Page.getInitialProps = () => ({});
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/", function() {
       var page = __webpack_require__("RNiq")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for link.module.js
@@ -227,7 +227,14 @@ module.exports = function (TYPE, $create) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/link", function() {
       var page = __webpack_require__("ObF3")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for routerDirect.module.js
@@ -7,7 +7,14 @@
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/routerDirect", function() {
       var page = __webpack_require__("jSAA")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for withRouter.module.js
@@ -30,7 +30,14 @@ useWithRouter.getInitialProps = () => ({});
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/withRouter", function() {
       var page = __webpack_require__("0Hlz")
       if(false) {}
-      return { page: page.default || page }
+      var pageExports = {};
+      for (var exportKey in page) {
+        pageExports[exportKey] = page[exportKey];
+      }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for index.html
@@ -6,19 +6,19 @@
         <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"
         />
         <meta name="next-head-count" content="2" />
-        <link rel="preload" href="/_next/static/6U9BNV1NtTidOmRbE_ZtH/pages/index.module.js"
+        <link rel="preload" href="/_next/static/fR3Cl3XZa6fiX0b1NQ4NR/pages/index.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/6U9BNV1NtTidOmRbE_ZtH/pages/_app.module.js"
+        <link rel="preload" href="/_next/static/fR3Cl3XZa6fiX0b1NQ4NR/pages/_app.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-56045b40d3fb28f22ee2.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/xI1vo8AwOESJJaNETsbeb0Ny83Y=.c659a74b6088e6ac1abe.module.js"
+        <link rel="preload" href="/_next/static/chunks/HeNcc2XGPbMs5oGcisSM5ubeXU0=.c659a74b6088e6ac1abe.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/6U9BNV1NtTidOmRbE_ZtH/_buildManifest.module.js"
+        <link rel="preload" href="/_next/static/fR3Cl3XZa6fiX0b1NQ4NR/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
     </head>
     
@@ -26,40 +26,40 @@
         <div id="__next">Hello world 👋</div>
         <script id="__NEXT_DATA__" type="application/json"
         crossorigin="anonymous">
-            {"dataManager":"[]","props":{"pageProps":{}},"page":"/","query":{},"buildId":"6U9BNV1NtTidOmRbE_ZtH"}
+            {"dataManager":"[]","props":{"pageProps":{}},"page":"/","query":{},"buildId":"fR3Cl3XZa6fiX0b1NQ4NR"}
         </script>
         <script crossorigin="anonymous" nomodule="">
             !function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();
         </script>
-        <script async="" data-next-page="/" src="/_next/static/6U9BNV1NtTidOmRbE_ZtH/pages/index.js"
+        <script async="" data-next-page="/" src="/_next/static/fR3Cl3XZa6fiX0b1NQ4NR/pages/index.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/" src="/_next/static/6U9BNV1NtTidOmRbE_ZtH/pages/index.module.js"
+        <script async="" data-next-page="/" src="/_next/static/fR3Cl3XZa6fiX0b1NQ4NR/pages/index.module.js"
         crossorigin="anonymous" type="module"></script>
-        <script async="" data-next-page="/_app" src="/_next/static/6U9BNV1NtTidOmRbE_ZtH/pages/_app.js"
+        <script async="" data-next-page="/_app" src="/_next/static/fR3Cl3XZa6fiX0b1NQ4NR/pages/_app.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/_app" src="/_next/static/6U9BNV1NtTidOmRbE_ZtH/pages/_app.module.js"
+        <script async="" data-next-page="/_app" src="/_next/static/fR3Cl3XZa6fiX0b1NQ4NR/pages/_app.module.js"
         crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/runtime/webpack-a470c2a25bcb4d5a8ec0.js"
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-2cd30e118423b74fdb03.js"
+        <script src="/_next/static/runtime/main-a384efaae9c1fc560750.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <script src="/_next/static/runtime/main-56045b40d3fb28f22ee2.module.js"
         async="" crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.js"
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/chunks/YA5rfjZPcGuK5OHsplw7D2Xu+iw=.155621535702fe040780.js"
+        <script src="/_next/static/chunks/mILlP0rY+V3ndT9OlOHhA4iWDdI=.155621535702fe040780.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/xI1vo8AwOESJJaNETsbeb0Ny83Y=.f6f7599a2edf91d8366a.js"
+        <script src="/_next/static/chunks/HeNcc2XGPbMs5oGcisSM5ubeXU0=.f6f7599a2edf91d8366a.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/xI1vo8AwOESJJaNETsbeb0Ny83Y=.c659a74b6088e6ac1abe.module.js"
+        <script src="/_next/static/chunks/HeNcc2XGPbMs5oGcisSM5ubeXU0=.c659a74b6088e6ac1abe.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/6U9BNV1NtTidOmRbE_ZtH/_buildManifest.js"
+        <script src="/_next/static/fR3Cl3XZa6fiX0b1NQ4NR/_buildManifest.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/6U9BNV1NtTidOmRbE_ZtH/_buildManifest.module.js"
+        <script src="/_next/static/fR3Cl3XZa6fiX0b1NQ4NR/_buildManifest.module.js"
         async="" crossorigin="anonymous" type="module"></script>
     </body>
Diff for link.html
@@ -6,19 +6,19 @@
         <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"
         />
         <meta name="next-head-count" content="2" />
-        <link rel="preload" href="/_next/static/6U9BNV1NtTidOmRbE_ZtH/pages/link.module.js"
+        <link rel="preload" href="/_next/static/fR3Cl3XZa6fiX0b1NQ4NR/pages/link.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/6U9BNV1NtTidOmRbE_ZtH/pages/_app.module.js"
+        <link rel="preload" href="/_next/static/fR3Cl3XZa6fiX0b1NQ4NR/pages/_app.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/xI1vo8AwOESJJaNETsbeb0Ny83Y=.c659a74b6088e6ac1abe.module.js"
+        <link rel="preload" href="/_next/static/chunks/HeNcc2XGPbMs5oGcisSM5ubeXU0=.c659a74b6088e6ac1abe.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-56045b40d3fb28f22ee2.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/6U9BNV1NtTidOmRbE_ZtH/_buildManifest.module.js"
+        <link rel="preload" href="/_next/static/fR3Cl3XZa6fiX0b1NQ4NR/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
     </head>
     
@@ -29,18 +29,18 @@
             </div>
         </div>
         <script id="__NEXT_DATA__" type="application/json" crossorigin="anonymous">
-            {"dataManager":"[]","props":{"pageProps":{}},"page":"/link","query":{},"buildId":"6U9BNV1NtTidOmRbE_ZtH"}
+            {"dataManager":"[]","props":{"pageProps":{}},"page":"/link","query":{},"buildId":"fR3Cl3XZa6fiX0b1NQ4NR"}
         </script>
         <script crossorigin="anonymous" nomodule="">
             !function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();
         </script>
-        <script async="" data-next-page="/link" src="/_next/static/6U9BNV1NtTidOmRbE_ZtH/pages/link.js"
+        <script async="" data-next-page="/link" src="/_next/static/fR3Cl3XZa6fiX0b1NQ4NR/pages/link.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/link" src="/_next/static/6U9BNV1NtTidOmRbE_ZtH/pages/link.module.js"
+        <script async="" data-next-page="/link" src="/_next/static/fR3Cl3XZa6fiX0b1NQ4NR/pages/link.module.js"
         crossorigin="anonymous" type="module"></script>
-        <script async="" data-next-page="/_app" src="/_next/static/6U9BNV1NtTidOmRbE_ZtH/pages/_app.js"
+        <script async="" data-next-page="/_app" src="/_next/static/fR3Cl3XZa6fiX0b1NQ4NR/pages/_app.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/_app" src="/_next/static/6U9BNV1NtTidOmRbE_ZtH/pages/_app.module.js"
+        <script async="" data-next-page="/_app" src="/_next/static/fR3Cl3XZa6fiX0b1NQ4NR/pages/_app.module.js"
         crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/runtime/webpack-a470c2a25bcb4d5a8ec0.js"
         async="" crossorigin="anonymous" nomodule=""></script>
@@ -50,19 +50,19 @@
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/chunks/YA5rfjZPcGuK5OHsplw7D2Xu+iw=.155621535702fe040780.js"
+        <script src="/_next/static/chunks/mILlP0rY+V3ndT9OlOHhA4iWDdI=.155621535702fe040780.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/xI1vo8AwOESJJaNETsbeb0Ny83Y=.f6f7599a2edf91d8366a.js"
+        <script src="/_next/static/chunks/HeNcc2XGPbMs5oGcisSM5ubeXU0=.f6f7599a2edf91d8366a.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/xI1vo8AwOESJJaNETsbeb0Ny83Y=.c659a74b6088e6ac1abe.module.js"
+        <script src="/_next/static/chunks/HeNcc2XGPbMs5oGcisSM5ubeXU0=.c659a74b6088e6ac1abe.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-2cd30e118423b74fdb03.js"
+        <script src="/_next/static/runtime/main-a384efaae9c1fc560750.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <script src="/_next/static/runtime/main-56045b40d3fb28f22ee2.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/6U9BNV1NtTidOmRbE_ZtH/_buildManifest.js"
+        <script src="/_next/static/fR3Cl3XZa6fiX0b1NQ4NR/_buildManifest.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/6U9BNV1NtTidOmRbE_ZtH/_buildManifest.module.js"
+        <script src="/_next/static/fR3Cl3XZa6fiX0b1NQ4NR/_buildManifest.module.js"
         async="" crossorigin="anonymous" type="module"></script>
     </body>
Diff for withRouter.html
@@ -6,19 +6,19 @@
         <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"
         />
         <meta name="next-head-count" content="2" />
-        <link rel="preload" href="/_next/static/6U9BNV1NtTidOmRbE_ZtH/pages/withRouter.module.js"
+        <link rel="preload" href="/_next/static/fR3Cl3XZa6fiX0b1NQ4NR/pages/withRouter.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/6U9BNV1NtTidOmRbE_ZtH/pages/_app.module.js"
+        <link rel="preload" href="/_next/static/fR3Cl3XZa6fiX0b1NQ4NR/pages/_app.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/xI1vo8AwOESJJaNETsbeb0Ny83Y=.c659a74b6088e6ac1abe.module.js"
+        <link rel="preload" href="/_next/static/chunks/HeNcc2XGPbMs5oGcisSM5ubeXU0=.c659a74b6088e6ac1abe.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-56045b40d3fb28f22ee2.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/6U9BNV1NtTidOmRbE_ZtH/_buildManifest.module.js"
+        <link rel="preload" href="/_next/static/fR3Cl3XZa6fiX0b1NQ4NR/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
     </head>
     
@@ -27,18 +27,18 @@
             <div>I use withRouter</div>
         </div>
         <script id="__NEXT_DATA__" type="application/json" crossorigin="anonymous">
-            {"dataManager":"[]","props":{"pageProps":{}},"page":"/withRouter","query":{},"buildId":"6U9BNV1NtTidOmRbE_ZtH"}
+            {"dataManager":"[]","props":{"pageProps":{}},"page":"/withRouter","query":{},"buildId":"fR3Cl3XZa6fiX0b1NQ4NR"}
         </script>
         <script crossorigin="anonymous" nomodule="">
             !function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();
         </script>
-        <script async="" data-next-page="/withRouter" src="/_next/static/6U9BNV1NtTidOmRbE_ZtH/pages/withRouter.js"
+        <script async="" data-next-page="/withRouter" src="/_next/static/fR3Cl3XZa6fiX0b1NQ4NR/pages/withRouter.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/withRouter" src="/_next/static/6U9BNV1NtTidOmRbE_ZtH/pages/withRouter.module.js"
+        <script async="" data-next-page="/withRouter" src="/_next/static/fR3Cl3XZa6fiX0b1NQ4NR/pages/withRouter.module.js"
         crossorigin="anonymous" type="module"></script>
-        <script async="" data-next-page="/_app" src="/_next/static/6U9BNV1NtTidOmRbE_ZtH/pages/_app.js"
+        <script async="" data-next-page="/_app" src="/_next/static/fR3Cl3XZa6fiX0b1NQ4NR/pages/_app.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/_app" src="/_next/static/6U9BNV1NtTidOmRbE_ZtH/pages/_app.module.js"
+        <script async="" data-next-page="/_app" src="/_next/static/fR3Cl3XZa6fiX0b1NQ4NR/pages/_app.module.js"
         crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/runtime/webpack-a470c2a25bcb4d5a8ec0.js"
         async="" crossorigin="anonymous" nomodule=""></script>
@@ -48,19 +48,19 @@
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/chunks/YA5rfjZPcGuK5OHsplw7D2Xu+iw=.155621535702fe040780.js"
+        <script src="/_next/static/chunks/mILlP0rY+V3ndT9OlOHhA4iWDdI=.155621535702fe040780.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/xI1vo8AwOESJJaNETsbeb0Ny83Y=.f6f7599a2edf91d8366a.js"
+        <script src="/_next/static/chunks/HeNcc2XGPbMs5oGcisSM5ubeXU0=.f6f7599a2edf91d8366a.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/xI1vo8AwOESJJaNETsbeb0Ny83Y=.c659a74b6088e6ac1abe.module.js"
+        <script src="/_next/static/chunks/HeNcc2XGPbMs5oGcisSM5ubeXU0=.c659a74b6088e6ac1abe.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-2cd30e118423b74fdb03.js"
+        <script src="/_next/static/runtime/main-a384efaae9c1fc560750.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <script src="/_next/static/runtime/main-56045b40d3fb28f22ee2.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/6U9BNV1NtTidOmRbE_ZtH/_buildManifest.js"
+        <script src="/_next/static/fR3Cl3XZa6fiX0b1NQ4NR/_buildManifest.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/6U9BNV1NtTidOmRbE_ZtH/_buildManifest.module.js"
+        <script src="/_next/static/fR3Cl3XZa6fiX0b1NQ4NR/_buildManifest.module.js"
         async="" crossorigin="anonymous" type="module"></script>
     </body>

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
buildDuration 25.6s 25.6s
nodeModulesSize 41.8 MB 41.8 MB ⚠️ +2.71 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.js 18.2 kB 19.1 kB ⚠️ +951 B
main-HASH.js gzip 6.64 kB 6.83 kB ⚠️ +181 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
Overall change ⚠️ +951 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.module.js 16.5 kB 17.4 kB ⚠️ +849 B
main-HASH.module.js gzip 6.38 kB 6.54 kB ⚠️ +161 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH.module.js gzip 746 B 746 B
Overall change ⚠️ +849 B
Client Pages Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.js 1.83 kB 1.88 kB ⚠️ +40 B
_app.js gzip 884 B 909 B ⚠️ +25 B
_error.js 12.1 kB 12.2 kB ⚠️ +40 B
_error.js gzip 4.76 kB 4.78 kB ⚠️ +16 B
hooks.js 12.7 kB 12.8 kB ⚠️ +40 B
hooks.js gzip 4.81 kB 4.83 kB ⚠️ +19 B
index.js 343 B 383 B ⚠️ +40 B
index.js gzip 237 B 260 B ⚠️ +23 B
link.js 8.14 kB 8.18 kB ⚠️ +40 B
link.js gzip 3.49 kB 3.51 kB ⚠️ +18 B
routerDirect.js 433 B 473 B ⚠️ +40 B
routerDirect.js gzip 296 B 320 B ⚠️ +24 B
withRouter.js 444 B 484 B ⚠️ +40 B
withRouter.js gzip 294 B 318 B ⚠️ +24 B
Overall change ⚠️ +280 B
Client Pages Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.module.js 1.73 kB 1.76 kB ⚠️ +36 B
_app.module.js gzip 840 B 866 B ⚠️ +26 B
_error.module.js 23.3 kB 23.4 kB ⚠️ +36 B
_error.module.js gzip 8.62 kB 8.65 kB ⚠️ +24 B
hooks.module.js 1.55 kB 1.58 kB ⚠️ +36 B
hooks.module.js gzip 804 B 823 B ⚠️ +19 B
index.module.js 319 B 355 B ⚠️ +36 B
index.module.js gzip 238 B 260 B ⚠️ +22 B
link.module.js 8.52 kB 8.56 kB ⚠️ +36 B
link.module.js gzip 3.68 kB 3.69 kB ⚠️ +17 B
routerDirect.module.js 419 B 455 B ⚠️ +36 B
routerDirect.module.js gzip 294 B 316 B ⚠️ +22 B
withRouter.module.js 429 B 465 B ⚠️ +36 B
withRouter.module.js gzip 293 B 318 B ⚠️ +25 B
Overall change ⚠️ +252 B
Client Build Manifests
zeit/next.js canary azukaru/next.js relay-analytics Change
_buildManifest.js 81 B 81 B
_buildManifest.js gzip 61 B 61 B
_buildManifest.module.js 81 B 81 B
_buildManifest.module.js gzip 61 B 61 B
Overall change
Serverless bundles Overall decrease ✓
zeit/next.js canary azukaru/next.js relay-analytics Change
_error.js 247 kB 247 kB -3 B
_error.js gzip 66.3 kB 66.4 kB ⚠️ +102 B
hooks.html 3.81 kB 3.81 kB -2 B
hooks.html gzip 978 B 987 B ⚠️ +9 B
index.js 248 kB 248 kB -3 B
index.js gzip 66.6 kB 66.6 kB ⚠️ +4 B
link.js 256 kB 256 kB -3 B
link.js gzip 68.7 kB 68.9 kB ⚠️ +187 B
routerDirect.js 249 kB 249 kB -3 B
routerDirect.js gzip 66.7 kB 66.7 kB ⚠️ +50 B
withRouter.js 249 kB 249 kB -3 B
withRouter.js gzip 66.6 kB 66.7 kB ⚠️ +72 B
Overall change -17 B

@ijjk
Copy link
Member

ijjk commented Aug 30, 2019

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
buildDuration 23.2s 23.3s ⚠️ +76ms
nodeModulesSize 42 MB 42 MB ⚠️ +2.54 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.js 18.2 kB 19.1 kB ⚠️ +952 B
main-HASH.js gzip 6.64 kB 6.83 kB ⚠️ +182 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
Overall change ⚠️ +952 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.module.js 16.5 kB 17.4 kB ⚠️ +850 B
main-HASH.module.js gzip 6.37 kB 6.54 kB ⚠️ +162 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH.module.js gzip 746 B 746 B
Overall change ⚠️ +850 B
Client Pages Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.js 1.83 kB 1.84 kB ⚠️ +6 B
_app.js gzip 884 B 888 B ⚠️ +4 B
_error.js 12.1 kB 12.1 kB ⚠️ +6 B
_error.js gzip 4.76 kB 4.76 kB ⚠️ +2 B
hooks.js 12.7 kB 12.7 kB ⚠️ +6 B
hooks.js gzip 4.81 kB 4.81 kB ⚠️ +3 B
index.js 343 B 349 B ⚠️ +6 B
index.js gzip 237 B 242 B ⚠️ +5 B
link.js 8.14 kB 8.14 kB ⚠️ +6 B
link.js gzip 3.49 kB 3.5 kB ⚠️ +4 B
routerDirect.js 434 B 439 B ⚠️ +5 B
routerDirect.js gzip 296 B 300 B ⚠️ +4 B
withRouter.js 444 B 450 B ⚠️ +6 B
withRouter.js gzip 294 B 298 B ⚠️ +4 B
Overall change ⚠️ +41 B
Client Pages Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.module.js 1.73 kB 1.73 kB ⚠️ +6 B
_app.module.js gzip 840 B 845 B ⚠️ +5 B
_error.module.js 23.3 kB 23.3 kB ⚠️ +6 B
_error.module.js gzip 8.62 kB 8.63 kB ⚠️ +5 B
hooks.module.js 1.55 kB 1.55 kB ⚠️ +6 B
hooks.module.js gzip 805 B 809 B ⚠️ +4 B
index.module.js 319 B 325 B ⚠️ +6 B
index.module.js gzip 238 B 243 B ⚠️ +5 B
link.module.js 8.52 kB 8.53 kB ⚠️ +6 B
link.module.js gzip 3.68 kB 3.68 kB ⚠️ +4 B
routerDirect.module.js 419 B 425 B ⚠️ +6 B
routerDirect.module.js gzip 294 B 299 B ⚠️ +5 B
withRouter.module.js 430 B 435 B ⚠️ +5 B
withRouter.module.js gzip 293 B 297 B ⚠️ +4 B
Overall change ⚠️ +41 B
Client Build Manifests
zeit/next.js canary azukaru/next.js relay-analytics Change
_buildManifest.js 81 B 81 B
_buildManifest.js gzip 61 B 61 B
_buildManifest.module.js 81 B 81 B
_buildManifest.module.js gzip 61 B 61 B
Overall change
Rendered Page Sizes Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
index.html 3.69 kB 3.69 kB ⚠️ +1 B
index.html gzip 957 B 955 B -2 B
link.html 3.74 kB 3.74 kB ⚠️ +1 B
link.html gzip 965 B 962 B -3 B
withRouter.html 3.75 kB 3.75 kB ⚠️ +1 B
withRouter.html gzip 952 B 949 B -3 B
Overall change ⚠️ +3 B

Diffs

Diff for main-HASH.js
@@ -387,7 +387,7 @@ exports.router = router;
 var ErrorComponent;
 exports.ErrorComponent = ErrorComponent;
 var Component;
-var App;
+var App, perfDataRelayer;
 
 var Container =
 /*#__PURE__*/
@@ -460,7 +460,7 @@ function () {
   var _ref2 = (0, _asyncToGenerator2["default"])(
   /*#__PURE__*/
   _regeneratorRuntime.mark(function _callee(_temp) {
-    var _ref, passedWebpackHMR, initialErr, _require, isValidElementType, renderCtx;
+    var _ref, passedWebpackHMR, _ref3, app, mod, initialErr, _require, isValidElementType, renderCtx;
 
     return _regeneratorRuntime.wrap(function _callee$(_context) {
       while (1) {
@@ -471,52 +471,60 @@ function () {
             if (false) {}
 
             _context.next = 4;
-            return pageLoader.loadPage('/_app');
+            return pageLoader.loadPageScript('/_app');
 
           case 4:
-            App = _context.sent;
+            _ref3 = _context.sent;
+            app = _ref3.page;
+            mod = _ref3.mod;
+            App = app;
+
+            if (mod && mod.relayPerformanceData) {
+              perfDataRelayer = mod.relayPerformanceData;
+            }
+
             initialErr = err;
-            _context.prev = 6;
-            _context.next = 9;
+            _context.prev = 10;
+            _context.next = 13;
             return pageLoader.loadPage(page);
 
-          case 9:
+          case 13:
             Component = _context.sent;
 
             if (true) {
-              _context.next = 14;
+              _context.next = 18;
               break;
             }
 
             _require = __webpack_require__(!(function webpackMissingModule() { var e = new Error("Cannot find module 'react-is'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())), isValidElementType = _require.isValidElementType;
 
             if (isValidElementType(Component)) {
-              _context.next = 14;
+              _context.next = 18;
               break;
             }
 
             throw new Error("The default export is not a React Component in page: \"" + page + "\"");
 
-          case 14:
-            _context.next = 19;
+          case 18:
+            _context.next = 23;
             break;
 
-          case 16:
-            _context.prev = 16;
-            _context.t0 = _context["catch"](6);
+          case 20:
+            _context.prev = 20;
+            _context.t0 = _context["catch"](10);
             // This catches errors like throwing in the top level of a module
             initialErr = _context.t0;
 
-          case 19:
+          case 23:
             if (!window.__NEXT_PRELOADREADY) {
-              _context.next = 22;
+              _context.next = 26;
               break;
             }
 
-            _context.next = 22;
+            _context.next = 26;
             return window.__NEXT_PRELOADREADY(dynamicIds);
 
-          case 22:
+          case 26:
             exports.router = router = (0, _router.createRouter)(page, query, asPath, {
               initialProps: props,
               pageLoader: pageLoader,
@@ -547,12 +555,12 @@ function () {
             render(renderCtx);
             return _context.abrupt("return", emitter);
 
-          case 26:
+          case 30:
           case "end":
             return _context.stop();
         }
       }
-    }, _callee, null, [[6, 16]]);
+    }, _callee, null, [[10, 20]]);
   }));
 
   return function (_x) {
@@ -715,6 +723,20 @@ function renderReactElement(reactEl, domEl) {
   } else {
     _reactDom["default"].render(reactEl, domEl, markRenderComplete);
   }
+
+  relayPaintMetrics();
+}
+
+function relayPaintMetrics() {
+  if (perfDataRelayer) {
+    performance.getEntriesByType('paint').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
 }
 
 function markHydrateComplete() {
@@ -723,6 +745,24 @@ function markHydrateComplete() {
 
   performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
   performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-hydration').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('beforeRender').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
@@ -738,16 +778,30 @@ function markRenderComplete() {
 
   performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
   performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-render').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('Next.js-route-change-to-render').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
 function clearMarks() {
   performance.clearMarks();
-  /*
-  * TODO: uncomment the following line when we have a way to
-  * expose this to user code.
-  */
-  // performance.clearMeasures()
+  performance.clearMeasures();
 }
 
 function AppContainer(_ref4) {
@@ -1479,13 +1533,21 @@ function () {
   }, {
     key: "loadPage",
     value: function loadPage(route) {
+      return this.loadPageScript(route).then(function (value) {
+        return value ? value.page : value;
+      });
+    }
+  }, {
+    key: "loadPageScript",
+    value: function loadPageScript(route) {
       var _this3 = this;
 
       route = this.normalizeRoute(route);
       return new _promise["default"](function (resolve, reject) {
         var fire = function fire(_ref) {
           var error = _ref.error,
-              page = _ref.page;
+              page = _ref.page,
+              mod = _ref.mod;
 
           _this3.pageRegisterEvents.off(route, fire);
 
@@ -1494,7 +1556,10 @@ function () {
           if (error) {
             reject(error);
           } else {
-            resolve(page);
+            resolve({
+              page: page,
+              mod: mod
+            });
           }
         }; // If there's a cached version of the page, let's use it.
 
@@ -1503,8 +1568,12 @@ function () {
 
         if (cachedPage) {
           var error = cachedPage.error,
-              page = cachedPage.page;
-          error ? reject(error) : resolve(page);
+              page = cachedPage.page,
+              mod = cachedPage.mod;
+          error ? reject(error) : resolve({
+            page: page,
+            mod: mod
+          });
           return;
         } // Register a listener to get the page
 
@@ -1599,16 +1668,19 @@ function () {
         try {
           var _regFn = regFn(),
               error = _regFn.error,
-              page = _regFn.page;
+              page = _regFn.page,
+              mod = _regFn.mod;
 
           _this5.pageCache[route] = {
             error: error,
-            page: page
+            page: page,
+            mod: mod
           };
 
           _this5.pageRegisterEvents.emit(route, {
             error: error,
-            page: page
+            page: page,
+            mod: mod
           });
         } catch (error) {
           _this5.pageCache[route] = {
Diff for main-HASH.module.js
@@ -458,7 +458,7 @@ exports.router = router;
 let ErrorComponent;
 exports.ErrorComponent = ErrorComponent;
 let Component;
-let App;
+let App, perfDataRelayer;
 
 class Container extends _react.default.Component {
   componentDidCatch(err, info) {
@@ -516,7 +516,16 @@ function () {
 
     if (false) {}
 
-    App = yield pageLoader.loadPage('/_app');
+    const {
+      page: app,
+      mod
+    } = yield pageLoader.loadPageScript('/_app');
+    App = app;
+
+    if (mod && mod.relayPerformanceData) {
+      perfDataRelayer = mod.relayPerformanceData;
+    }
+
     let initialErr = err;
 
     try {
@@ -657,6 +666,20 @@ function renderReactElement(reactEl, domEl) {
   } else {
     _reactDom.default.render(reactEl, domEl, markRenderComplete);
   }
+
+  relayPaintMetrics();
+}
+
+function relayPaintMetrics() {
+  if (perfDataRelayer) {
+    performance.getEntriesByType('paint').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
 }
 
 function markHydrateComplete() {
@@ -665,6 +688,24 @@ function markHydrateComplete() {
 
   performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
   performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-hydration').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('beforeRender').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
@@ -680,16 +721,30 @@ function markRenderComplete() {
 
   performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
   performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-render').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('Next.js-route-change-to-render').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
 function clearMarks() {
   performance.clearMarks();
-  /*
-  * TODO: uncomment the following line when we have a way to
-  * expose this to user code.
-  */
-  // performance.clearMeasures()
+  performance.clearMeasures();
 }
 
 function AppContainer(_ref4) {
@@ -1380,12 +1435,17 @@ class PageLoader {
   }
 
   loadPage(route) {
+    return this.loadPageScript(route).then(value => value ? value.page : value);
+  }
+
+  loadPageScript(route) {
     route = this.normalizeRoute(route);
     return new _promise.default((resolve, reject) => {
       const fire = _ref => {
         let {
           error,
-          page
+          page,
+          mod
         } = _ref;
         this.pageRegisterEvents.off(route, fire);
         delete this.loadingRoutes[route];
@@ -1393,7 +1453,10 @@ class PageLoader {
         if (error) {
           reject(error);
         } else {
-          resolve(page);
+          resolve({
+            page,
+            mod
+          });
         }
       }; // If there's a cached version of the page, let's use it.
 
@@ -1403,9 +1466,13 @@ class PageLoader {
       if (cachedPage) {
         const {
           error,
-          page
+          page,
+          mod
         } = cachedPage;
-        error ? reject(error) : resolve(page);
+        error ? reject(error) : resolve({
+          page,
+          mod
+        });
         return;
       } // Register a listener to get the page
 
@@ -1475,15 +1542,18 @@ class PageLoader {
       try {
         const {
           error,
-          page
+          page,
+          mod
         } = regFn();
         this.pageCache[route] = {
           error,
-          page
+          page,
+          mod
         };
         this.pageRegisterEvents.emit(route, {
           error,
-          page
+          page,
+          mod
         });
       } catch (error) {
         this.pageCache[route] = {
Diff for _app.js
@@ -194,7 +194,10 @@ function createUrl(router) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_app", function() {
       var page = __webpack_require__("B5Ud")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for _error.js
@@ -144,7 +144,10 @@ var styles = {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_error", function() {
       var page = __webpack_require__("/a9y")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for hooks.js
@@ -996,7 +996,10 @@ module.exports = __webpack_require__("jmDH") ? Object.defineProperties : functio
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/hooks", function() {
       var page = __webpack_require__("+MDD")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for index.js
@@ -24,7 +24,10 @@ Page.getInitialProps = function () {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/", function() {
       var page = __webpack_require__("RNiq")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for link.js
@@ -169,7 +169,10 @@ module.exports = function (TYPE, $create) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/link", function() {
       var page = __webpack_require__("ObF3")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for routerDirect.js
@@ -7,7 +7,10 @@
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/routerDirect", function() {
       var page = __webpack_require__("jSAA")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for withRouter.js
@@ -32,7 +32,10 @@ useWithRouter.getInitialProps = function () {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/withRouter", function() {
       var page = __webpack_require__("0Hlz")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for _app.module.js
@@ -199,7 +199,10 @@ function createUrl(router) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_app", function() {
       var page = __webpack_require__("B5Ud")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for _error.module.js
@@ -123,7 +123,10 @@ const styles = {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_error", function() {
       var page = __webpack_require__("/a9y")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for hooks.module.js
@@ -135,7 +135,10 @@ module.exports = shouldUseNative() ? Object.assign : function (target, source) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/hooks", function() {
       var page = __webpack_require__("+MDD")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for index.module.js
@@ -20,7 +20,10 @@ Page.getInitialProps = () => ({});
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/", function() {
       var page = __webpack_require__("RNiq")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for link.module.js
@@ -227,7 +227,10 @@ module.exports = function (TYPE, $create) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/link", function() {
       var page = __webpack_require__("ObF3")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for routerDirect.module.js
@@ -7,7 +7,10 @@
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/routerDirect", function() {
       var page = __webpack_require__("jSAA")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for withRouter.module.js
@@ -30,7 +30,10 @@ useWithRouter.getInitialProps = () => ({});
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/withRouter", function() {
       var page = __webpack_require__("0Hlz")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for index.html
@@ -6,19 +6,19 @@
         <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"
         />
         <meta name="next-head-count" content="2" />
-        <link rel="preload" href="/_next/static/rTXu3bK_3RUwFB6TRpgF_/pages/index.module.js"
+        <link rel="preload" href="/_next/static/DAMo6--cK2kjSRJJgR4wZ/pages/index.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/rTXu3bK_3RUwFB6TRpgF_/pages/_app.module.js"
+        <link rel="preload" href="/_next/static/DAMo6--cK2kjSRJJgR4wZ/pages/_app.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-56045b40d3fb28f22ee2.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/SVYwRbR6GZbG0Jj2LYpZwmBDwA=.c659a74b6088e6ac1abe.module.js"
+        <link rel="preload" href="/_next/static/chunks/MHnPSQPpt8GgdlDKwkLzW0bTcw8=.c659a74b6088e6ac1abe.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/rTXu3bK_3RUwFB6TRpgF_/_buildManifest.module.js"
+        <link rel="preload" href="/_next/static/DAMo6--cK2kjSRJJgR4wZ/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
     </head>
     
@@ -26,40 +26,40 @@
         <div id="__next">Hello world 👋</div>
         <script id="__NEXT_DATA__" type="application/json"
         crossorigin="anonymous">
-            {"dataManager":"[]","props":{"pageProps":{}},"page":"/","query":{},"buildId":"rTXu3bK_3RUwFB6TRpgF_"}
+            {"dataManager":"[]","props":{"pageProps":{}},"page":"/","query":{},"buildId":"DAMo6--cK2kjSRJJgR4wZ"}
         </script>
         <script crossorigin="anonymous" nomodule="">
             !function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();
         </script>
-        <script async="" data-next-page="/" src="/_next/static/rTXu3bK_3RUwFB6TRpgF_/pages/index.js"
+        <script async="" data-next-page="/" src="/_next/static/DAMo6--cK2kjSRJJgR4wZ/pages/index.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/" src="/_next/static/rTXu3bK_3RUwFB6TRpgF_/pages/index.module.js"
+        <script async="" data-next-page="/" src="/_next/static/DAMo6--cK2kjSRJJgR4wZ/pages/index.module.js"
         crossorigin="anonymous" type="module"></script>
-        <script async="" data-next-page="/_app" src="/_next/static/rTXu3bK_3RUwFB6TRpgF_/pages/_app.js"
+        <script async="" data-next-page="/_app" src="/_next/static/DAMo6--cK2kjSRJJgR4wZ/pages/_app.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/_app" src="/_next/static/rTXu3bK_3RUwFB6TRpgF_/pages/_app.module.js"
+        <script async="" data-next-page="/_app" src="/_next/static/DAMo6--cK2kjSRJJgR4wZ/pages/_app.module.js"
         crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/runtime/webpack-a470c2a25bcb4d5a8ec0.js"
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-2cd30e118423b74fdb03.js"
+        <script src="/_next/static/runtime/main-a384efaae9c1fc560750.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <script src="/_next/static/runtime/main-56045b40d3fb28f22ee2.module.js"
         async="" crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.js"
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/chunks/gkG20eNMMZAkWScoF9Pb6KeD83M=.155621535702fe040780.js"
+        <script src="/_next/static/chunks/fIYEHslRdhyb7dId+7246PO1FM=.155621535702fe040780.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/SVYwRbR6GZbG0Jj2LYpZwmBDwA=.f6f7599a2edf91d8366a.js"
+        <script src="/_next/static/chunks/MHnPSQPpt8GgdlDKwkLzW0bTcw8=.f6f7599a2edf91d8366a.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/SVYwRbR6GZbG0Jj2LYpZwmBDwA=.c659a74b6088e6ac1abe.module.js"
+        <script src="/_next/static/chunks/MHnPSQPpt8GgdlDKwkLzW0bTcw8=.c659a74b6088e6ac1abe.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/rTXu3bK_3RUwFB6TRpgF_/_buildManifest.js"
+        <script src="/_next/static/DAMo6--cK2kjSRJJgR4wZ/_buildManifest.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/rTXu3bK_3RUwFB6TRpgF_/_buildManifest.module.js"
+        <script src="/_next/static/DAMo6--cK2kjSRJJgR4wZ/_buildManifest.module.js"
         async="" crossorigin="anonymous" type="module"></script>
     </body>
Diff for link.html
@@ -6,19 +6,19 @@
         <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"
         />
         <meta name="next-head-count" content="2" />
-        <link rel="preload" href="/_next/static/rTXu3bK_3RUwFB6TRpgF_/pages/link.module.js"
+        <link rel="preload" href="/_next/static/DAMo6--cK2kjSRJJgR4wZ/pages/link.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/rTXu3bK_3RUwFB6TRpgF_/pages/_app.module.js"
+        <link rel="preload" href="/_next/static/DAMo6--cK2kjSRJJgR4wZ/pages/_app.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/SVYwRbR6GZbG0Jj2LYpZwmBDwA=.c659a74b6088e6ac1abe.module.js"
+        <link rel="preload" href="/_next/static/chunks/MHnPSQPpt8GgdlDKwkLzW0bTcw8=.c659a74b6088e6ac1abe.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-56045b40d3fb28f22ee2.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/rTXu3bK_3RUwFB6TRpgF_/_buildManifest.module.js"
+        <link rel="preload" href="/_next/static/DAMo6--cK2kjSRJJgR4wZ/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
     </head>
     
@@ -29,18 +29,18 @@
             </div>
         </div>
         <script id="__NEXT_DATA__" type="application/json" crossorigin="anonymous">
-            {"dataManager":"[]","props":{"pageProps":{}},"page":"/link","query":{},"buildId":"rTXu3bK_3RUwFB6TRpgF_"}
+            {"dataManager":"[]","props":{"pageProps":{}},"page":"/link","query":{},"buildId":"DAMo6--cK2kjSRJJgR4wZ"}
         </script>
         <script crossorigin="anonymous" nomodule="">
             !function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();
         </script>
-        <script async="" data-next-page="/link" src="/_next/static/rTXu3bK_3RUwFB6TRpgF_/pages/link.js"
+        <script async="" data-next-page="/link" src="/_next/static/DAMo6--cK2kjSRJJgR4wZ/pages/link.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/link" src="/_next/static/rTXu3bK_3RUwFB6TRpgF_/pages/link.module.js"
+        <script async="" data-next-page="/link" src="/_next/static/DAMo6--cK2kjSRJJgR4wZ/pages/link.module.js"
         crossorigin="anonymous" type="module"></script>
-        <script async="" data-next-page="/_app" src="/_next/static/rTXu3bK_3RUwFB6TRpgF_/pages/_app.js"
+        <script async="" data-next-page="/_app" src="/_next/static/DAMo6--cK2kjSRJJgR4wZ/pages/_app.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/_app" src="/_next/static/rTXu3bK_3RUwFB6TRpgF_/pages/_app.module.js"
+        <script async="" data-next-page="/_app" src="/_next/static/DAMo6--cK2kjSRJJgR4wZ/pages/_app.module.js"
         crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/runtime/webpack-a470c2a25bcb4d5a8ec0.js"
         async="" crossorigin="anonymous" nomodule=""></script>
@@ -50,19 +50,19 @@
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/chunks/gkG20eNMMZAkWScoF9Pb6KeD83M=.155621535702fe040780.js"
+        <script src="/_next/static/chunks/fIYEHslRdhyb7dId+7246PO1FM=.155621535702fe040780.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/SVYwRbR6GZbG0Jj2LYpZwmBDwA=.f6f7599a2edf91d8366a.js"
+        <script src="/_next/static/chunks/MHnPSQPpt8GgdlDKwkLzW0bTcw8=.f6f7599a2edf91d8366a.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/SVYwRbR6GZbG0Jj2LYpZwmBDwA=.c659a74b6088e6ac1abe.module.js"
+        <script src="/_next/static/chunks/MHnPSQPpt8GgdlDKwkLzW0bTcw8=.c659a74b6088e6ac1abe.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-2cd30e118423b74fdb03.js"
+        <script src="/_next/static/runtime/main-a384efaae9c1fc560750.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <script src="/_next/static/runtime/main-56045b40d3fb28f22ee2.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/rTXu3bK_3RUwFB6TRpgF_/_buildManifest.js"
+        <script src="/_next/static/DAMo6--cK2kjSRJJgR4wZ/_buildManifest.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/rTXu3bK_3RUwFB6TRpgF_/_buildManifest.module.js"
+        <script src="/_next/static/DAMo6--cK2kjSRJJgR4wZ/_buildManifest.module.js"
         async="" crossorigin="anonymous" type="module"></script>
     </body>
Diff for withRouter.html
@@ -6,19 +6,19 @@
         <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"
         />
         <meta name="next-head-count" content="2" />
-        <link rel="preload" href="/_next/static/rTXu3bK_3RUwFB6TRpgF_/pages/withRouter.module.js"
+        <link rel="preload" href="/_next/static/DAMo6--cK2kjSRJJgR4wZ/pages/withRouter.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/rTXu3bK_3RUwFB6TRpgF_/pages/_app.module.js"
+        <link rel="preload" href="/_next/static/DAMo6--cK2kjSRJJgR4wZ/pages/_app.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/SVYwRbR6GZbG0Jj2LYpZwmBDwA=.c659a74b6088e6ac1abe.module.js"
+        <link rel="preload" href="/_next/static/chunks/MHnPSQPpt8GgdlDKwkLzW0bTcw8=.c659a74b6088e6ac1abe.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-56045b40d3fb28f22ee2.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/rTXu3bK_3RUwFB6TRpgF_/_buildManifest.module.js"
+        <link rel="preload" href="/_next/static/DAMo6--cK2kjSRJJgR4wZ/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
     </head>
     
@@ -27,18 +27,18 @@
             <div>I use withRouter</div>
         </div>
         <script id="__NEXT_DATA__" type="application/json" crossorigin="anonymous">
-            {"dataManager":"[]","props":{"pageProps":{}},"page":"/withRouter","query":{},"buildId":"rTXu3bK_3RUwFB6TRpgF_"}
+            {"dataManager":"[]","props":{"pageProps":{}},"page":"/withRouter","query":{},"buildId":"DAMo6--cK2kjSRJJgR4wZ"}
         </script>
         <script crossorigin="anonymous" nomodule="">
             !function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();
         </script>
-        <script async="" data-next-page="/withRouter" src="/_next/static/rTXu3bK_3RUwFB6TRpgF_/pages/withRouter.js"
+        <script async="" data-next-page="/withRouter" src="/_next/static/DAMo6--cK2kjSRJJgR4wZ/pages/withRouter.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/withRouter" src="/_next/static/rTXu3bK_3RUwFB6TRpgF_/pages/withRouter.module.js"
+        <script async="" data-next-page="/withRouter" src="/_next/static/DAMo6--cK2kjSRJJgR4wZ/pages/withRouter.module.js"
         crossorigin="anonymous" type="module"></script>
-        <script async="" data-next-page="/_app" src="/_next/static/rTXu3bK_3RUwFB6TRpgF_/pages/_app.js"
+        <script async="" data-next-page="/_app" src="/_next/static/DAMo6--cK2kjSRJJgR4wZ/pages/_app.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/_app" src="/_next/static/rTXu3bK_3RUwFB6TRpgF_/pages/_app.module.js"
+        <script async="" data-next-page="/_app" src="/_next/static/DAMo6--cK2kjSRJJgR4wZ/pages/_app.module.js"
         crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/runtime/webpack-a470c2a25bcb4d5a8ec0.js"
         async="" crossorigin="anonymous" nomodule=""></script>
@@ -48,19 +48,19 @@
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/chunks/gkG20eNMMZAkWScoF9Pb6KeD83M=.155621535702fe040780.js"
+        <script src="/_next/static/chunks/fIYEHslRdhyb7dId+7246PO1FM=.155621535702fe040780.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/SVYwRbR6GZbG0Jj2LYpZwmBDwA=.f6f7599a2edf91d8366a.js"
+        <script src="/_next/static/chunks/MHnPSQPpt8GgdlDKwkLzW0bTcw8=.f6f7599a2edf91d8366a.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/SVYwRbR6GZbG0Jj2LYpZwmBDwA=.c659a74b6088e6ac1abe.module.js"
+        <script src="/_next/static/chunks/MHnPSQPpt8GgdlDKwkLzW0bTcw8=.c659a74b6088e6ac1abe.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-2cd30e118423b74fdb03.js"
+        <script src="/_next/static/runtime/main-a384efaae9c1fc560750.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <script src="/_next/static/runtime/main-56045b40d3fb28f22ee2.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/rTXu3bK_3RUwFB6TRpgF_/_buildManifest.js"
+        <script src="/_next/static/DAMo6--cK2kjSRJJgR4wZ/_buildManifest.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/rTXu3bK_3RUwFB6TRpgF_/_buildManifest.module.js"
+        <script src="/_next/static/DAMo6--cK2kjSRJJgR4wZ/_buildManifest.module.js"
         async="" crossorigin="anonymous" type="module"></script>
     </body>

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
buildDuration 23.2s 23.7s ⚠️ +478ms
nodeModulesSize 42 MB 42 MB ⚠️ +2.54 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.js 18.2 kB 19.1 kB ⚠️ +952 B
main-HASH.js gzip 6.64 kB 6.83 kB ⚠️ +182 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
Overall change ⚠️ +952 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.module.js 16.5 kB 17.4 kB ⚠️ +850 B
main-HASH.module.js gzip 6.37 kB 6.54 kB ⚠️ +162 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH.module.js gzip 746 B 746 B
Overall change ⚠️ +850 B
Client Pages Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.js 1.83 kB 1.84 kB ⚠️ +6 B
_app.js gzip 884 B 888 B ⚠️ +4 B
_error.js 12.1 kB 12.1 kB ⚠️ +6 B
_error.js gzip 4.76 kB 4.76 kB ⚠️ +2 B
hooks.js 12.7 kB 12.7 kB ⚠️ +6 B
hooks.js gzip 4.81 kB 4.81 kB ⚠️ +3 B
index.js 343 B 349 B ⚠️ +6 B
index.js gzip 237 B 242 B ⚠️ +5 B
link.js 8.14 kB 8.14 kB ⚠️ +6 B
link.js gzip 3.49 kB 3.5 kB ⚠️ +4 B
routerDirect.js 434 B 439 B ⚠️ +5 B
routerDirect.js gzip 296 B 300 B ⚠️ +4 B
withRouter.js 444 B 450 B ⚠️ +6 B
withRouter.js gzip 294 B 298 B ⚠️ +4 B
Overall change ⚠️ +41 B
Client Pages Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.module.js 1.73 kB 1.73 kB ⚠️ +6 B
_app.module.js gzip 840 B 845 B ⚠️ +5 B
_error.module.js 23.3 kB 23.3 kB ⚠️ +6 B
_error.module.js gzip 8.62 kB 8.63 kB ⚠️ +5 B
hooks.module.js 1.55 kB 1.55 kB ⚠️ +6 B
hooks.module.js gzip 805 B 809 B ⚠️ +4 B
index.module.js 319 B 325 B ⚠️ +6 B
index.module.js gzip 238 B 243 B ⚠️ +5 B
link.module.js 8.52 kB 8.53 kB ⚠️ +6 B
link.module.js gzip 3.68 kB 3.68 kB ⚠️ +4 B
routerDirect.module.js 419 B 425 B ⚠️ +6 B
routerDirect.module.js gzip 294 B 299 B ⚠️ +5 B
withRouter.module.js 430 B 435 B ⚠️ +5 B
withRouter.module.js gzip 293 B 297 B ⚠️ +4 B
Overall change ⚠️ +41 B
Client Build Manifests
zeit/next.js canary azukaru/next.js relay-analytics Change
_buildManifest.js 81 B 81 B
_buildManifest.js gzip 61 B 61 B
_buildManifest.module.js 81 B 81 B
_buildManifest.module.js gzip 61 B 61 B
Overall change
Serverless bundles Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_error.js 247 kB 247 kB ⚠️ +5 B
_error.js gzip 66.4 kB 66.4 kB -23 B
hooks.html 3.81 kB 3.81 kB ⚠️ +1 B
hooks.html gzip 982 B 983 B ⚠️ +1 B
index.js 248 kB 248 kB
index.js gzip 66.8 kB 66.6 kB -196 B
link.js 256 kB 256 kB
link.js gzip 68.9 kB 68.9 kB -54 B
routerDirect.js 249 kB 249 kB
routerDirect.js gzip 66.7 kB 66.7 kB ⚠️ +14 B
withRouter.js 249 kB 249 kB
withRouter.js gzip 66.9 kB 66.7 kB -128 B
Overall change ⚠️ +6 B

@ijjk
Copy link
Member

ijjk commented Aug 30, 2019

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
buildDuration 21.6s 21.2s -353ms
nodeModulesSize 42 MB 42 MB ⚠️ +2.54 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.js 18.2 kB 19.1 kB ⚠️ +951 B
main-HASH.js gzip 6.64 kB 6.83 kB ⚠️ +181 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
Overall change ⚠️ +951 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.module.js 16.5 kB 17.4 kB ⚠️ +849 B
main-HASH.module.js gzip 6.38 kB 6.54 kB ⚠️ +161 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH.module.js gzip 746 B 746 B
Overall change ⚠️ +849 B
Client Pages Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.js 1.83 kB 1.84 kB ⚠️ +6 B
_app.js gzip 884 B 888 B ⚠️ +4 B
_error.js 12.1 kB 12.1 kB ⚠️ +6 B
_error.js gzip 4.76 kB 4.76 kB ⚠️ +3 B
hooks.js 12.7 kB 12.7 kB ⚠️ +6 B
hooks.js gzip 4.81 kB 4.81 kB ⚠️ +3 B
index.js 343 B 349 B ⚠️ +6 B
index.js gzip 237 B 242 B ⚠️ +5 B
link.js 8.14 kB 8.14 kB ⚠️ +6 B
link.js gzip 3.49 kB 3.5 kB ⚠️ +5 B
routerDirect.js 433 B 439 B ⚠️ +6 B
routerDirect.js gzip 296 B 300 B ⚠️ +4 B
withRouter.js 444 B 450 B ⚠️ +6 B
withRouter.js gzip 294 B 298 B ⚠️ +4 B
Overall change ⚠️ +42 B
Client Pages Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.module.js 1.73 kB 1.73 kB ⚠️ +6 B
_app.module.js gzip 840 B 845 B ⚠️ +5 B
_error.module.js 23.3 kB 23.3 kB ⚠️ +6 B
_error.module.js gzip 8.62 kB 8.63 kB ⚠️ +5 B
hooks.module.js 1.55 kB 1.55 kB ⚠️ +6 B
hooks.module.js gzip 804 B 809 B ⚠️ +5 B
index.module.js 319 B 325 B ⚠️ +6 B
index.module.js gzip 238 B 243 B ⚠️ +5 B
link.module.js 8.52 kB 8.53 kB ⚠️ +6 B
link.module.js gzip 3.68 kB 3.68 kB ⚠️ +4 B
routerDirect.module.js 419 B 425 B ⚠️ +6 B
routerDirect.module.js gzip 294 B 299 B ⚠️ +5 B
withRouter.module.js 429 B 435 B ⚠️ +6 B
withRouter.module.js gzip 293 B 297 B ⚠️ +4 B
Overall change ⚠️ +42 B
Client Build Manifests
zeit/next.js canary azukaru/next.js relay-analytics Change
_buildManifest.js 81 B 81 B
_buildManifest.js gzip 61 B 61 B
_buildManifest.module.js 81 B 81 B
_buildManifest.module.js gzip 61 B 61 B
Overall change
Rendered Page Sizes Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
index.html 3.69 kB 3.7 kB ⚠️ +4 B
index.html gzip 957 B 953 B -4 B
link.html 3.74 kB 3.75 kB ⚠️ +4 B
link.html gzip 966 B 962 B -4 B
withRouter.html 3.75 kB 3.75 kB ⚠️ +4 B
withRouter.html gzip 952 B 948 B -4 B
Overall change ⚠️ +12 B

Diffs

Diff for main-HASH.js
@@ -387,7 +387,7 @@ exports.router = router;
 var ErrorComponent;
 exports.ErrorComponent = ErrorComponent;
 var Component;
-var App;
+var App, perfDataRelayer;
 
 var Container =
 /*#__PURE__*/
@@ -460,7 +460,7 @@ function () {
   var _ref2 = (0, _asyncToGenerator2["default"])(
   /*#__PURE__*/
   _regeneratorRuntime.mark(function _callee(_temp) {
-    var _ref, passedWebpackHMR, initialErr, _require, isValidElementType, renderCtx;
+    var _ref, passedWebpackHMR, _ref3, app, mod, initialErr, _require, isValidElementType, renderCtx;
 
     return _regeneratorRuntime.wrap(function _callee$(_context) {
       while (1) {
@@ -471,52 +471,60 @@ function () {
             if (false) {}
 
             _context.next = 4;
-            return pageLoader.loadPage('/_app');
+            return pageLoader.loadPageScript('/_app');
 
           case 4:
-            App = _context.sent;
+            _ref3 = _context.sent;
+            app = _ref3.page;
+            mod = _ref3.mod;
+            App = app;
+
+            if (mod && mod.relayPerformanceData) {
+              perfDataRelayer = mod.relayPerformanceData;
+            }
+
             initialErr = err;
-            _context.prev = 6;
-            _context.next = 9;
+            _context.prev = 10;
+            _context.next = 13;
             return pageLoader.loadPage(page);
 
-          case 9:
+          case 13:
             Component = _context.sent;
 
             if (true) {
-              _context.next = 14;
+              _context.next = 18;
               break;
             }
 
             _require = __webpack_require__(!(function webpackMissingModule() { var e = new Error("Cannot find module 'react-is'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())), isValidElementType = _require.isValidElementType;
 
             if (isValidElementType(Component)) {
-              _context.next = 14;
+              _context.next = 18;
               break;
             }
 
             throw new Error("The default export is not a React Component in page: \"" + page + "\"");
 
-          case 14:
-            _context.next = 19;
+          case 18:
+            _context.next = 23;
             break;
 
-          case 16:
-            _context.prev = 16;
-            _context.t0 = _context["catch"](6);
+          case 20:
+            _context.prev = 20;
+            _context.t0 = _context["catch"](10);
             // This catches errors like throwing in the top level of a module
             initialErr = _context.t0;
 
-          case 19:
+          case 23:
             if (!window.__NEXT_PRELOADREADY) {
-              _context.next = 22;
+              _context.next = 26;
               break;
             }
 
-            _context.next = 22;
+            _context.next = 26;
             return window.__NEXT_PRELOADREADY(dynamicIds);
 
-          case 22:
+          case 26:
             exports.router = router = (0, _router.createRouter)(page, query, asPath, {
               initialProps: props,
               pageLoader: pageLoader,
@@ -547,12 +555,12 @@ function () {
             render(renderCtx);
             return _context.abrupt("return", emitter);
 
-          case 26:
+          case 30:
           case "end":
             return _context.stop();
         }
       }
-    }, _callee, null, [[6, 16]]);
+    }, _callee, null, [[10, 20]]);
   }));
 
   return function (_x) {
@@ -715,6 +723,20 @@ function renderReactElement(reactEl, domEl) {
   } else {
     _reactDom["default"].render(reactEl, domEl, markRenderComplete);
   }
+
+  relayPaintMetrics();
+}
+
+function relayPaintMetrics() {
+  if (perfDataRelayer) {
+    performance.getEntriesByType('paint').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
 }
 
 function markHydrateComplete() {
@@ -723,6 +745,24 @@ function markHydrateComplete() {
 
   performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
   performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-hydration').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('beforeRender').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
@@ -738,16 +778,30 @@ function markRenderComplete() {
 
   performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
   performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-render').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('Next.js-route-change-to-render').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
 function clearMarks() {
   performance.clearMarks();
-  /*
-  * TODO: uncomment the following line when we have a way to
-  * expose this to user code.
-  */
-  // performance.clearMeasures()
+  performance.clearMeasures();
 }
 
 function AppContainer(_ref4) {
@@ -1479,13 +1533,21 @@ function () {
   }, {
     key: "loadPage",
     value: function loadPage(route) {
+      return this.loadPageScript(route).then(function (value) {
+        return value ? value.page : value;
+      });
+    }
+  }, {
+    key: "loadPageScript",
+    value: function loadPageScript(route) {
       var _this3 = this;
 
       route = this.normalizeRoute(route);
       return new _promise["default"](function (resolve, reject) {
         var fire = function fire(_ref) {
           var error = _ref.error,
-              page = _ref.page;
+              page = _ref.page,
+              mod = _ref.mod;
 
           _this3.pageRegisterEvents.off(route, fire);
 
@@ -1494,7 +1556,10 @@ function () {
           if (error) {
             reject(error);
           } else {
-            resolve(page);
+            resolve({
+              page: page,
+              mod: mod
+            });
           }
         }; // If there's a cached version of the page, let's use it.
 
@@ -1503,8 +1568,12 @@ function () {
 
         if (cachedPage) {
           var error = cachedPage.error,
-              page = cachedPage.page;
-          error ? reject(error) : resolve(page);
+              page = cachedPage.page,
+              mod = cachedPage.mod;
+          error ? reject(error) : resolve({
+            page: page,
+            mod: mod
+          });
           return;
         } // Register a listener to get the page
 
@@ -1599,16 +1668,19 @@ function () {
         try {
           var _regFn = regFn(),
               error = _regFn.error,
-              page = _regFn.page;
+              page = _regFn.page,
+              mod = _regFn.mod;
 
           _this5.pageCache[route] = {
             error: error,
-            page: page
+            page: page,
+            mod: mod
           };
 
           _this5.pageRegisterEvents.emit(route, {
             error: error,
-            page: page
+            page: page,
+            mod: mod
           });
         } catch (error) {
           _this5.pageCache[route] = {
Diff for main-HASH.module.js
@@ -458,7 +458,7 @@ exports.router = router;
 let ErrorComponent;
 exports.ErrorComponent = ErrorComponent;
 let Component;
-let App;
+let App, perfDataRelayer;
 
 class Container extends _react.default.Component {
   componentDidCatch(err, info) {
@@ -516,7 +516,16 @@ function () {
 
     if (false) {}
 
-    App = yield pageLoader.loadPage('/_app');
+    const {
+      page: app,
+      mod
+    } = yield pageLoader.loadPageScript('/_app');
+    App = app;
+
+    if (mod && mod.relayPerformanceData) {
+      perfDataRelayer = mod.relayPerformanceData;
+    }
+
     let initialErr = err;
 
     try {
@@ -657,6 +666,20 @@ function renderReactElement(reactEl, domEl) {
   } else {
     _reactDom.default.render(reactEl, domEl, markRenderComplete);
   }
+
+  relayPaintMetrics();
+}
+
+function relayPaintMetrics() {
+  if (perfDataRelayer) {
+    performance.getEntriesByType('paint').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
 }
 
 function markHydrateComplete() {
@@ -665,6 +688,24 @@ function markHydrateComplete() {
 
   performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
   performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-hydration').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('beforeRender').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
@@ -680,16 +721,30 @@ function markRenderComplete() {
 
   performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
   performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-render').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('Next.js-route-change-to-render').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
 function clearMarks() {
   performance.clearMarks();
-  /*
-  * TODO: uncomment the following line when we have a way to
-  * expose this to user code.
-  */
-  // performance.clearMeasures()
+  performance.clearMeasures();
 }
 
 function AppContainer(_ref4) {
@@ -1380,12 +1435,17 @@ class PageLoader {
   }
 
   loadPage(route) {
+    return this.loadPageScript(route).then(value => value ? value.page : value);
+  }
+
+  loadPageScript(route) {
     route = this.normalizeRoute(route);
     return new _promise.default((resolve, reject) => {
       const fire = _ref => {
         let {
           error,
-          page
+          page,
+          mod
         } = _ref;
         this.pageRegisterEvents.off(route, fire);
         delete this.loadingRoutes[route];
@@ -1393,7 +1453,10 @@ class PageLoader {
         if (error) {
           reject(error);
         } else {
-          resolve(page);
+          resolve({
+            page,
+            mod
+          });
         }
       }; // If there's a cached version of the page, let's use it.
 
@@ -1403,9 +1466,13 @@ class PageLoader {
       if (cachedPage) {
         const {
           error,
-          page
+          page,
+          mod
         } = cachedPage;
-        error ? reject(error) : resolve(page);
+        error ? reject(error) : resolve({
+          page,
+          mod
+        });
         return;
       } // Register a listener to get the page
 
@@ -1475,15 +1542,18 @@ class PageLoader {
       try {
         const {
           error,
-          page
+          page,
+          mod
         } = regFn();
         this.pageCache[route] = {
           error,
-          page
+          page,
+          mod
         };
         this.pageRegisterEvents.emit(route, {
           error,
-          page
+          page,
+          mod
         });
       } catch (error) {
         this.pageCache[route] = {
Diff for _app.js
@@ -194,7 +194,10 @@ function createUrl(router) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_app", function() {
       var page = __webpack_require__("B5Ud")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for _error.js
@@ -144,7 +144,10 @@ var styles = {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_error", function() {
       var page = __webpack_require__("/a9y")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for hooks.js
@@ -996,7 +996,10 @@ module.exports = __webpack_require__("jmDH") ? Object.defineProperties : functio
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/hooks", function() {
       var page = __webpack_require__("+MDD")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for index.js
@@ -24,7 +24,10 @@ Page.getInitialProps = function () {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/", function() {
       var page = __webpack_require__("RNiq")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for link.js
@@ -169,7 +169,10 @@ module.exports = function (TYPE, $create) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/link", function() {
       var page = __webpack_require__("ObF3")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for routerDirect.js
@@ -7,7 +7,10 @@
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/routerDirect", function() {
       var page = __webpack_require__("jSAA")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for withRouter.js
@@ -32,7 +32,10 @@ useWithRouter.getInitialProps = function () {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/withRouter", function() {
       var page = __webpack_require__("0Hlz")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for _app.module.js
@@ -199,7 +199,10 @@ function createUrl(router) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_app", function() {
       var page = __webpack_require__("B5Ud")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for _error.module.js
@@ -123,7 +123,10 @@ const styles = {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_error", function() {
       var page = __webpack_require__("/a9y")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for hooks.module.js
@@ -135,7 +135,10 @@ module.exports = shouldUseNative() ? Object.assign : function (target, source) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/hooks", function() {
       var page = __webpack_require__("+MDD")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for index.module.js
@@ -20,7 +20,10 @@ Page.getInitialProps = () => ({});
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/", function() {
       var page = __webpack_require__("RNiq")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for link.module.js
@@ -227,7 +227,10 @@ module.exports = function (TYPE, $create) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/link", function() {
       var page = __webpack_require__("ObF3")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for routerDirect.module.js
@@ -7,7 +7,10 @@
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/routerDirect", function() {
       var page = __webpack_require__("jSAA")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for withRouter.module.js
@@ -30,7 +30,10 @@ useWithRouter.getInitialProps = () => ({});
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/withRouter", function() {
       var page = __webpack_require__("0Hlz")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for index.html
@@ -6,19 +6,19 @@
         <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"
         />
         <meta name="next-head-count" content="2" />
-        <link rel="preload" href="/_next/static/ZFx6UFNT-4h6qUfpU4vAM/pages/index.module.js"
+        <link rel="preload" href="/_next/static/KTGgepzl2zKOtJZliNsOm/pages/index.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/ZFx6UFNT-4h6qUfpU4vAM/pages/_app.module.js"
+        <link rel="preload" href="/_next/static/KTGgepzl2zKOtJZliNsOm/pages/_app.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-56045b40d3fb28f22ee2.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/1Vr+f78gae0dNxUA6qbyaNN82U=.c659a74b6088e6ac1abe.module.js"
+        <link rel="preload" href="/_next/static/chunks/Nh9l2gV3Sh5LlVSY3Po4au4p7pg=.c659a74b6088e6ac1abe.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/ZFx6UFNT-4h6qUfpU4vAM/_buildManifest.module.js"
+        <link rel="preload" href="/_next/static/KTGgepzl2zKOtJZliNsOm/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
     </head>
     
@@ -26,40 +26,40 @@
         <div id="__next">Hello world 👋</div>
         <script id="__NEXT_DATA__" type="application/json"
         crossorigin="anonymous">
-            {"dataManager":"[]","props":{"pageProps":{}},"page":"/","query":{},"buildId":"ZFx6UFNT-4h6qUfpU4vAM"}
+            {"dataManager":"[]","props":{"pageProps":{}},"page":"/","query":{},"buildId":"KTGgepzl2zKOtJZliNsOm"}
         </script>
         <script crossorigin="anonymous" nomodule="">
             !function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();
         </script>
-        <script async="" data-next-page="/" src="/_next/static/ZFx6UFNT-4h6qUfpU4vAM/pages/index.js"
+        <script async="" data-next-page="/" src="/_next/static/KTGgepzl2zKOtJZliNsOm/pages/index.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/" src="/_next/static/ZFx6UFNT-4h6qUfpU4vAM/pages/index.module.js"
+        <script async="" data-next-page="/" src="/_next/static/KTGgepzl2zKOtJZliNsOm/pages/index.module.js"
         crossorigin="anonymous" type="module"></script>
-        <script async="" data-next-page="/_app" src="/_next/static/ZFx6UFNT-4h6qUfpU4vAM/pages/_app.js"
+        <script async="" data-next-page="/_app" src="/_next/static/KTGgepzl2zKOtJZliNsOm/pages/_app.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/_app" src="/_next/static/ZFx6UFNT-4h6qUfpU4vAM/pages/_app.module.js"
+        <script async="" data-next-page="/_app" src="/_next/static/KTGgepzl2zKOtJZliNsOm/pages/_app.module.js"
         crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/runtime/webpack-a470c2a25bcb4d5a8ec0.js"
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-2cd30e118423b74fdb03.js"
+        <script src="/_next/static/runtime/main-a384efaae9c1fc560750.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <script src="/_next/static/runtime/main-56045b40d3fb28f22ee2.module.js"
         async="" crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.js"
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/chunks/HZgMkzmRLduqAa2t+BPh2v3jpU=.155621535702fe040780.js"
+        <script src="/_next/static/chunks/6teDmaHxw2SfC2vSUHKR531gVw=.155621535702fe040780.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/1Vr+f78gae0dNxUA6qbyaNN82U=.f6f7599a2edf91d8366a.js"
+        <script src="/_next/static/chunks/Nh9l2gV3Sh5LlVSY3Po4au4p7pg=.f6f7599a2edf91d8366a.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/1Vr+f78gae0dNxUA6qbyaNN82U=.c659a74b6088e6ac1abe.module.js"
+        <script src="/_next/static/chunks/Nh9l2gV3Sh5LlVSY3Po4au4p7pg=.c659a74b6088e6ac1abe.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/ZFx6UFNT-4h6qUfpU4vAM/_buildManifest.js"
+        <script src="/_next/static/KTGgepzl2zKOtJZliNsOm/_buildManifest.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/ZFx6UFNT-4h6qUfpU4vAM/_buildManifest.module.js"
+        <script src="/_next/static/KTGgepzl2zKOtJZliNsOm/_buildManifest.module.js"
         async="" crossorigin="anonymous" type="module"></script>
     </body>
Diff for link.html
@@ -6,19 +6,19 @@
         <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"
         />
         <meta name="next-head-count" content="2" />
-        <link rel="preload" href="/_next/static/ZFx6UFNT-4h6qUfpU4vAM/pages/link.module.js"
+        <link rel="preload" href="/_next/static/KTGgepzl2zKOtJZliNsOm/pages/link.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/ZFx6UFNT-4h6qUfpU4vAM/pages/_app.module.js"
+        <link rel="preload" href="/_next/static/KTGgepzl2zKOtJZliNsOm/pages/_app.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/1Vr+f78gae0dNxUA6qbyaNN82U=.c659a74b6088e6ac1abe.module.js"
+        <link rel="preload" href="/_next/static/chunks/Nh9l2gV3Sh5LlVSY3Po4au4p7pg=.c659a74b6088e6ac1abe.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-56045b40d3fb28f22ee2.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/ZFx6UFNT-4h6qUfpU4vAM/_buildManifest.module.js"
+        <link rel="preload" href="/_next/static/KTGgepzl2zKOtJZliNsOm/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
     </head>
     
@@ -29,18 +29,18 @@
             </div>
         </div>
         <script id="__NEXT_DATA__" type="application/json" crossorigin="anonymous">
-            {"dataManager":"[]","props":{"pageProps":{}},"page":"/link","query":{},"buildId":"ZFx6UFNT-4h6qUfpU4vAM"}
+            {"dataManager":"[]","props":{"pageProps":{}},"page":"/link","query":{},"buildId":"KTGgepzl2zKOtJZliNsOm"}
         </script>
         <script crossorigin="anonymous" nomodule="">
             !function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();
         </script>
-        <script async="" data-next-page="/link" src="/_next/static/ZFx6UFNT-4h6qUfpU4vAM/pages/link.js"
+        <script async="" data-next-page="/link" src="/_next/static/KTGgepzl2zKOtJZliNsOm/pages/link.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/link" src="/_next/static/ZFx6UFNT-4h6qUfpU4vAM/pages/link.module.js"
+        <script async="" data-next-page="/link" src="/_next/static/KTGgepzl2zKOtJZliNsOm/pages/link.module.js"
         crossorigin="anonymous" type="module"></script>
-        <script async="" data-next-page="/_app" src="/_next/static/ZFx6UFNT-4h6qUfpU4vAM/pages/_app.js"
+        <script async="" data-next-page="/_app" src="/_next/static/KTGgepzl2zKOtJZliNsOm/pages/_app.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/_app" src="/_next/static/ZFx6UFNT-4h6qUfpU4vAM/pages/_app.module.js"
+        <script async="" data-next-page="/_app" src="/_next/static/KTGgepzl2zKOtJZliNsOm/pages/_app.module.js"
         crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/runtime/webpack-a470c2a25bcb4d5a8ec0.js"
         async="" crossorigin="anonymous" nomodule=""></script>
@@ -50,19 +50,19 @@
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/chunks/HZgMkzmRLduqAa2t+BPh2v3jpU=.155621535702fe040780.js"
+        <script src="/_next/static/chunks/6teDmaHxw2SfC2vSUHKR531gVw=.155621535702fe040780.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/1Vr+f78gae0dNxUA6qbyaNN82U=.f6f7599a2edf91d8366a.js"
+        <script src="/_next/static/chunks/Nh9l2gV3Sh5LlVSY3Po4au4p7pg=.f6f7599a2edf91d8366a.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/1Vr+f78gae0dNxUA6qbyaNN82U=.c659a74b6088e6ac1abe.module.js"
+        <script src="/_next/static/chunks/Nh9l2gV3Sh5LlVSY3Po4au4p7pg=.c659a74b6088e6ac1abe.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-2cd30e118423b74fdb03.js"
+        <script src="/_next/static/runtime/main-a384efaae9c1fc560750.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <script src="/_next/static/runtime/main-56045b40d3fb28f22ee2.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/ZFx6UFNT-4h6qUfpU4vAM/_buildManifest.js"
+        <script src="/_next/static/KTGgepzl2zKOtJZliNsOm/_buildManifest.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/ZFx6UFNT-4h6qUfpU4vAM/_buildManifest.module.js"
+        <script src="/_next/static/KTGgepzl2zKOtJZliNsOm/_buildManifest.module.js"
         async="" crossorigin="anonymous" type="module"></script>
     </body>
Diff for withRouter.html
@@ -6,19 +6,19 @@
         <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"
         />
         <meta name="next-head-count" content="2" />
-        <link rel="preload" href="/_next/static/ZFx6UFNT-4h6qUfpU4vAM/pages/withRouter.module.js"
+        <link rel="preload" href="/_next/static/KTGgepzl2zKOtJZliNsOm/pages/withRouter.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/ZFx6UFNT-4h6qUfpU4vAM/pages/_app.module.js"
+        <link rel="preload" href="/_next/static/KTGgepzl2zKOtJZliNsOm/pages/_app.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/1Vr+f78gae0dNxUA6qbyaNN82U=.c659a74b6088e6ac1abe.module.js"
+        <link rel="preload" href="/_next/static/chunks/Nh9l2gV3Sh5LlVSY3Po4au4p7pg=.c659a74b6088e6ac1abe.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-56045b40d3fb28f22ee2.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/ZFx6UFNT-4h6qUfpU4vAM/_buildManifest.module.js"
+        <link rel="preload" href="/_next/static/KTGgepzl2zKOtJZliNsOm/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
     </head>
     
@@ -27,18 +27,18 @@
             <div>I use withRouter</div>
         </div>
         <script id="__NEXT_DATA__" type="application/json" crossorigin="anonymous">
-            {"dataManager":"[]","props":{"pageProps":{}},"page":"/withRouter","query":{},"buildId":"ZFx6UFNT-4h6qUfpU4vAM"}
+            {"dataManager":"[]","props":{"pageProps":{}},"page":"/withRouter","query":{},"buildId":"KTGgepzl2zKOtJZliNsOm"}
         </script>
         <script crossorigin="anonymous" nomodule="">
             !function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();
         </script>
-        <script async="" data-next-page="/withRouter" src="/_next/static/ZFx6UFNT-4h6qUfpU4vAM/pages/withRouter.js"
+        <script async="" data-next-page="/withRouter" src="/_next/static/KTGgepzl2zKOtJZliNsOm/pages/withRouter.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/withRouter" src="/_next/static/ZFx6UFNT-4h6qUfpU4vAM/pages/withRouter.module.js"
+        <script async="" data-next-page="/withRouter" src="/_next/static/KTGgepzl2zKOtJZliNsOm/pages/withRouter.module.js"
         crossorigin="anonymous" type="module"></script>
-        <script async="" data-next-page="/_app" src="/_next/static/ZFx6UFNT-4h6qUfpU4vAM/pages/_app.js"
+        <script async="" data-next-page="/_app" src="/_next/static/KTGgepzl2zKOtJZliNsOm/pages/_app.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/_app" src="/_next/static/ZFx6UFNT-4h6qUfpU4vAM/pages/_app.module.js"
+        <script async="" data-next-page="/_app" src="/_next/static/KTGgepzl2zKOtJZliNsOm/pages/_app.module.js"
         crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/runtime/webpack-a470c2a25bcb4d5a8ec0.js"
         async="" crossorigin="anonymous" nomodule=""></script>
@@ -48,19 +48,19 @@
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/chunks/HZgMkzmRLduqAa2t+BPh2v3jpU=.155621535702fe040780.js"
+        <script src="/_next/static/chunks/6teDmaHxw2SfC2vSUHKR531gVw=.155621535702fe040780.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/1Vr+f78gae0dNxUA6qbyaNN82U=.f6f7599a2edf91d8366a.js"
+        <script src="/_next/static/chunks/Nh9l2gV3Sh5LlVSY3Po4au4p7pg=.f6f7599a2edf91d8366a.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/1Vr+f78gae0dNxUA6qbyaNN82U=.c659a74b6088e6ac1abe.module.js"
+        <script src="/_next/static/chunks/Nh9l2gV3Sh5LlVSY3Po4au4p7pg=.c659a74b6088e6ac1abe.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-2cd30e118423b74fdb03.js"
+        <script src="/_next/static/runtime/main-a384efaae9c1fc560750.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <script src="/_next/static/runtime/main-56045b40d3fb28f22ee2.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/ZFx6UFNT-4h6qUfpU4vAM/_buildManifest.js"
+        <script src="/_next/static/KTGgepzl2zKOtJZliNsOm/_buildManifest.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/ZFx6UFNT-4h6qUfpU4vAM/_buildManifest.module.js"
+        <script src="/_next/static/KTGgepzl2zKOtJZliNsOm/_buildManifest.module.js"
         async="" crossorigin="anonymous" type="module"></script>
     </body>

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
buildDuration 22.1s 22.3s ⚠️ +233ms
nodeModulesSize 42 MB 42 MB ⚠️ +2.54 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.js 18.2 kB 19.1 kB ⚠️ +952 B
main-HASH.js gzip 6.64 kB 6.83 kB ⚠️ +182 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
Overall change ⚠️ +952 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.module.js 16.5 kB 17.4 kB ⚠️ +850 B
main-HASH.module.js gzip 6.37 kB 6.54 kB ⚠️ +162 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH.module.js gzip 746 B 746 B
Overall change ⚠️ +850 B
Client Pages Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.js 1.83 kB 1.84 kB ⚠️ +6 B
_app.js gzip 884 B 888 B ⚠️ +4 B
_error.js 12.1 kB 12.1 kB ⚠️ +6 B
_error.js gzip 4.76 kB 4.76 kB ⚠️ +2 B
hooks.js 12.7 kB 12.7 kB ⚠️ +6 B
hooks.js gzip 4.81 kB 4.81 kB ⚠️ +3 B
index.js 343 B 349 B ⚠️ +6 B
index.js gzip 237 B 242 B ⚠️ +5 B
link.js 8.14 kB 8.14 kB ⚠️ +6 B
link.js gzip 3.49 kB 3.5 kB ⚠️ +4 B
routerDirect.js 434 B 439 B ⚠️ +5 B
routerDirect.js gzip 296 B 300 B ⚠️ +4 B
withRouter.js 444 B 450 B ⚠️ +6 B
withRouter.js gzip 294 B 298 B ⚠️ +4 B
Overall change ⚠️ +41 B
Client Pages Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.module.js 1.73 kB 1.73 kB ⚠️ +6 B
_app.module.js gzip 840 B 845 B ⚠️ +5 B
_error.module.js 23.3 kB 23.3 kB ⚠️ +6 B
_error.module.js gzip 8.62 kB 8.63 kB ⚠️ +5 B
hooks.module.js 1.55 kB 1.55 kB ⚠️ +6 B
hooks.module.js gzip 805 B 809 B ⚠️ +4 B
index.module.js 319 B 325 B ⚠️ +6 B
index.module.js gzip 238 B 243 B ⚠️ +5 B
link.module.js 8.52 kB 8.53 kB ⚠️ +6 B
link.module.js gzip 3.68 kB 3.68 kB ⚠️ +4 B
routerDirect.module.js 419 B 425 B ⚠️ +6 B
routerDirect.module.js gzip 294 B 299 B ⚠️ +5 B
withRouter.module.js 430 B 435 B ⚠️ +5 B
withRouter.module.js gzip 293 B 297 B ⚠️ +4 B
Overall change ⚠️ +41 B
Client Build Manifests
zeit/next.js canary azukaru/next.js relay-analytics Change
_buildManifest.js 81 B 81 B
_buildManifest.js gzip 61 B 61 B
_buildManifest.module.js 81 B 81 B
_buildManifest.module.js gzip 61 B 61 B
Overall change
Serverless bundles Overall decrease ✓
zeit/next.js canary azukaru/next.js relay-analytics Change
_error.js 247 kB 247 kB -5 B
_error.js gzip 66.5 kB 66.3 kB -126 B
hooks.html 3.81 kB 3.81 kB -1 B
hooks.html gzip 982 B 979 B -3 B
index.js 248 kB 248 kB -5 B
index.js gzip 66.7 kB 66.8 kB ⚠️ +19 B
link.js 256 kB 256 kB -5 B
link.js gzip 68.9 kB 68.9 kB -69 B
routerDirect.js 249 kB 249 kB -5 B
routerDirect.js gzip 66.7 kB 66.7 kB -20 B
withRouter.js 249 kB 249 kB -5 B
withRouter.js gzip 66.7 kB 66.8 kB ⚠️ +29 B
Overall change -26 B

@ijjk
Copy link
Member

ijjk commented Aug 30, 2019

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
buildDuration 21.6s 21.8s ⚠️ +144ms
nodeModulesSize 42 MB 42 MB ⚠️ +2.47 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.js 18.2 kB 19.1 kB ⚠️ +952 B
main-HASH.js gzip 6.64 kB 6.83 kB ⚠️ +182 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
Overall change ⚠️ +952 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.module.js 16.5 kB 17.4 kB ⚠️ +850 B
main-HASH.module.js gzip 6.37 kB 6.54 kB ⚠️ +162 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH.module.js gzip 746 B 746 B
Overall change ⚠️ +850 B
Client Pages Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.js 1.83 kB 1.84 kB ⚠️ +6 B
_app.js gzip 884 B 888 B ⚠️ +4 B
_error.js 12.1 kB 12.1 kB ⚠️ +6 B
_error.js gzip 4.76 kB 4.76 kB ⚠️ +2 B
hooks.js 12.7 kB 12.7 kB ⚠️ +6 B
hooks.js gzip 4.81 kB 4.81 kB ⚠️ +3 B
index.js 343 B 349 B ⚠️ +6 B
index.js gzip 237 B 242 B ⚠️ +5 B
link.js 8.14 kB 8.14 kB ⚠️ +6 B
link.js gzip 3.49 kB 3.5 kB ⚠️ +4 B
routerDirect.js 434 B 439 B ⚠️ +5 B
routerDirect.js gzip 296 B 300 B ⚠️ +4 B
withRouter.js 444 B 450 B ⚠️ +6 B
withRouter.js gzip 294 B 298 B ⚠️ +4 B
Overall change ⚠️ +41 B
Client Pages Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.module.js 1.73 kB 1.73 kB ⚠️ +6 B
_app.module.js gzip 840 B 845 B ⚠️ +5 B
_error.module.js 23.3 kB 23.3 kB ⚠️ +6 B
_error.module.js gzip 8.62 kB 8.63 kB ⚠️ +5 B
hooks.module.js 1.55 kB 1.55 kB ⚠️ +6 B
hooks.module.js gzip 805 B 809 B ⚠️ +4 B
index.module.js 319 B 325 B ⚠️ +6 B
index.module.js gzip 238 B 243 B ⚠️ +5 B
link.module.js 8.52 kB 8.53 kB ⚠️ +6 B
link.module.js gzip 3.68 kB 3.68 kB ⚠️ +4 B
routerDirect.module.js 419 B 425 B ⚠️ +6 B
routerDirect.module.js gzip 294 B 299 B ⚠️ +5 B
withRouter.module.js 430 B 435 B ⚠️ +5 B
withRouter.module.js gzip 293 B 297 B ⚠️ +4 B
Overall change ⚠️ +41 B
Client Build Manifests
zeit/next.js canary azukaru/next.js relay-analytics Change
_buildManifest.js 81 B 81 B
_buildManifest.js gzip 61 B 61 B
_buildManifest.module.js 81 B 81 B
_buildManifest.module.js gzip 61 B 61 B
Overall change
Rendered Page Sizes Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
index.html 3.69 kB 3.7 kB ⚠️ +7 B
index.html gzip 952 B 955 B ⚠️ +3 B
link.html 3.74 kB 3.75 kB ⚠️ +7 B
link.html gzip 960 B 963 B ⚠️ +3 B
withRouter.html 3.75 kB 3.75 kB ⚠️ +7 B
withRouter.html gzip 948 B 950 B ⚠️ +2 B
Overall change ⚠️ +21 B

Diffs

Diff for main-HASH.js
@@ -387,7 +387,7 @@ exports.router = router;
 var ErrorComponent;
 exports.ErrorComponent = ErrorComponent;
 var Component;
-var App;
+var App, perfDataRelayer;
 
 var Container =
 /*#__PURE__*/
@@ -460,7 +460,7 @@ function () {
   var _ref2 = (0, _asyncToGenerator2["default"])(
   /*#__PURE__*/
   _regeneratorRuntime.mark(function _callee(_temp) {
-    var _ref, passedWebpackHMR, initialErr, _require, isValidElementType, renderCtx;
+    var _ref, passedWebpackHMR, _ref3, app, mod, initialErr, _require, isValidElementType, renderCtx;
 
     return _regeneratorRuntime.wrap(function _callee$(_context) {
       while (1) {
@@ -471,52 +471,60 @@ function () {
             if (false) {}
 
             _context.next = 4;
-            return pageLoader.loadPage('/_app');
+            return pageLoader.loadPageScript('/_app');
 
           case 4:
-            App = _context.sent;
+            _ref3 = _context.sent;
+            app = _ref3.page;
+            mod = _ref3.mod;
+            App = app;
+
+            if (mod && mod.relayPerformanceData) {
+              perfDataRelayer = mod.relayPerformanceData;
+            }
+
             initialErr = err;
-            _context.prev = 6;
-            _context.next = 9;
+            _context.prev = 10;
+            _context.next = 13;
             return pageLoader.loadPage(page);
 
-          case 9:
+          case 13:
             Component = _context.sent;
 
             if (true) {
-              _context.next = 14;
+              _context.next = 18;
               break;
             }
 
             _require = __webpack_require__(!(function webpackMissingModule() { var e = new Error("Cannot find module 'react-is'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())), isValidElementType = _require.isValidElementType;
 
             if (isValidElementType(Component)) {
-              _context.next = 14;
+              _context.next = 18;
               break;
             }
 
             throw new Error("The default export is not a React Component in page: \"" + page + "\"");
 
-          case 14:
-            _context.next = 19;
+          case 18:
+            _context.next = 23;
             break;
 
-          case 16:
-            _context.prev = 16;
-            _context.t0 = _context["catch"](6);
+          case 20:
+            _context.prev = 20;
+            _context.t0 = _context["catch"](10);
             // This catches errors like throwing in the top level of a module
             initialErr = _context.t0;
 
-          case 19:
+          case 23:
             if (!window.__NEXT_PRELOADREADY) {
-              _context.next = 22;
+              _context.next = 26;
               break;
             }
 
-            _context.next = 22;
+            _context.next = 26;
             return window.__NEXT_PRELOADREADY(dynamicIds);
 
-          case 22:
+          case 26:
             exports.router = router = (0, _router.createRouter)(page, query, asPath, {
               initialProps: props,
               pageLoader: pageLoader,
@@ -547,12 +555,12 @@ function () {
             render(renderCtx);
             return _context.abrupt("return", emitter);
 
-          case 26:
+          case 30:
           case "end":
             return _context.stop();
         }
       }
-    }, _callee, null, [[6, 16]]);
+    }, _callee, null, [[10, 20]]);
   }));
 
   return function (_x) {
@@ -715,6 +723,20 @@ function renderReactElement(reactEl, domEl) {
   } else {
     _reactDom["default"].render(reactEl, domEl, markRenderComplete);
   }
+
+  relayPaintMetrics();
+}
+
+function relayPaintMetrics() {
+  if (perfDataRelayer) {
+    performance.getEntriesByType('paint').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
 }
 
 function markHydrateComplete() {
@@ -723,6 +745,24 @@ function markHydrateComplete() {
 
   performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
   performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-hydration').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('beforeRender').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
@@ -738,16 +778,30 @@ function markRenderComplete() {
 
   performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
   performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-render').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('Next.js-route-change-to-render').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
 function clearMarks() {
   performance.clearMarks();
-  /*
-  * TODO: uncomment the following line when we have a way to
-  * expose this to user code.
-  */
-  // performance.clearMeasures()
+  performance.clearMeasures();
 }
 
 function AppContainer(_ref4) {
@@ -1479,13 +1533,21 @@ function () {
   }, {
     key: "loadPage",
     value: function loadPage(route) {
+      return this.loadPageScript(route).then(function (value) {
+        return value ? value.page : value;
+      });
+    }
+  }, {
+    key: "loadPageScript",
+    value: function loadPageScript(route) {
       var _this3 = this;
 
       route = this.normalizeRoute(route);
       return new _promise["default"](function (resolve, reject) {
         var fire = function fire(_ref) {
           var error = _ref.error,
-              page = _ref.page;
+              page = _ref.page,
+              mod = _ref.mod;
 
           _this3.pageRegisterEvents.off(route, fire);
 
@@ -1494,7 +1556,10 @@ function () {
           if (error) {
             reject(error);
           } else {
-            resolve(page);
+            resolve({
+              page: page,
+              mod: mod
+            });
           }
         }; // If there's a cached version of the page, let's use it.
 
@@ -1503,8 +1568,12 @@ function () {
 
         if (cachedPage) {
           var error = cachedPage.error,
-              page = cachedPage.page;
-          error ? reject(error) : resolve(page);
+              page = cachedPage.page,
+              mod = cachedPage.mod;
+          error ? reject(error) : resolve({
+            page: page,
+            mod: mod
+          });
           return;
         } // Register a listener to get the page
 
@@ -1599,16 +1668,19 @@ function () {
         try {
           var _regFn = regFn(),
               error = _regFn.error,
-              page = _regFn.page;
+              page = _regFn.page,
+              mod = _regFn.mod;
 
           _this5.pageCache[route] = {
             error: error,
-            page: page
+            page: page,
+            mod: mod
           };
 
           _this5.pageRegisterEvents.emit(route, {
             error: error,
-            page: page
+            page: page,
+            mod: mod
           });
         } catch (error) {
           _this5.pageCache[route] = {
Diff for main-HASH.module.js
@@ -458,7 +458,7 @@ exports.router = router;
 let ErrorComponent;
 exports.ErrorComponent = ErrorComponent;
 let Component;
-let App;
+let App, perfDataRelayer;
 
 class Container extends _react.default.Component {
   componentDidCatch(err, info) {
@@ -516,7 +516,16 @@ function () {
 
     if (false) {}
 
-    App = yield pageLoader.loadPage('/_app');
+    const {
+      page: app,
+      mod
+    } = yield pageLoader.loadPageScript('/_app');
+    App = app;
+
+    if (mod && mod.relayPerformanceData) {
+      perfDataRelayer = mod.relayPerformanceData;
+    }
+
     let initialErr = err;
 
     try {
@@ -657,6 +666,20 @@ function renderReactElement(reactEl, domEl) {
   } else {
     _reactDom.default.render(reactEl, domEl, markRenderComplete);
   }
+
+  relayPaintMetrics();
+}
+
+function relayPaintMetrics() {
+  if (perfDataRelayer) {
+    performance.getEntriesByType('paint').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
 }
 
 function markHydrateComplete() {
@@ -665,6 +688,24 @@ function markHydrateComplete() {
 
   performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
   performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-hydration').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('beforeRender').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
@@ -680,16 +721,30 @@ function markRenderComplete() {
 
   performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
   performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-render').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('Next.js-route-change-to-render').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
 function clearMarks() {
   performance.clearMarks();
-  /*
-  * TODO: uncomment the following line when we have a way to
-  * expose this to user code.
-  */
-  // performance.clearMeasures()
+  performance.clearMeasures();
 }
 
 function AppContainer(_ref4) {
@@ -1380,12 +1435,17 @@ class PageLoader {
   }
 
   loadPage(route) {
+    return this.loadPageScript(route).then(value => value ? value.page : value);
+  }
+
+  loadPageScript(route) {
     route = this.normalizeRoute(route);
     return new _promise.default((resolve, reject) => {
       const fire = _ref => {
         let {
           error,
-          page
+          page,
+          mod
         } = _ref;
         this.pageRegisterEvents.off(route, fire);
         delete this.loadingRoutes[route];
@@ -1393,7 +1453,10 @@ class PageLoader {
         if (error) {
           reject(error);
         } else {
-          resolve(page);
+          resolve({
+            page,
+            mod
+          });
         }
       }; // If there's a cached version of the page, let's use it.
 
@@ -1403,9 +1466,13 @@ class PageLoader {
       if (cachedPage) {
         const {
           error,
-          page
+          page,
+          mod
         } = cachedPage;
-        error ? reject(error) : resolve(page);
+        error ? reject(error) : resolve({
+          page,
+          mod
+        });
         return;
       } // Register a listener to get the page
 
@@ -1475,15 +1542,18 @@ class PageLoader {
       try {
         const {
           error,
-          page
+          page,
+          mod
         } = regFn();
         this.pageCache[route] = {
           error,
-          page
+          page,
+          mod
         };
         this.pageRegisterEvents.emit(route, {
           error,
-          page
+          page,
+          mod
         });
       } catch (error) {
         this.pageCache[route] = {
Diff for _app.js
@@ -194,7 +194,10 @@ function createUrl(router) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_app", function() {
       var page = __webpack_require__("B5Ud")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for _error.js
@@ -144,7 +144,10 @@ var styles = {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_error", function() {
       var page = __webpack_require__("/a9y")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for hooks.js
@@ -996,7 +996,10 @@ module.exports = __webpack_require__("jmDH") ? Object.defineProperties : functio
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/hooks", function() {
       var page = __webpack_require__("+MDD")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for index.js
@@ -24,7 +24,10 @@ Page.getInitialProps = function () {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/", function() {
       var page = __webpack_require__("RNiq")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for link.js
@@ -169,7 +169,10 @@ module.exports = function (TYPE, $create) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/link", function() {
       var page = __webpack_require__("ObF3")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for routerDirect.js
@@ -7,7 +7,10 @@
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/routerDirect", function() {
       var page = __webpack_require__("jSAA")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for withRouter.js
@@ -32,7 +32,10 @@ useWithRouter.getInitialProps = function () {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/withRouter", function() {
       var page = __webpack_require__("0Hlz")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for _app.module.js
@@ -199,7 +199,10 @@ function createUrl(router) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_app", function() {
       var page = __webpack_require__("B5Ud")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for _error.module.js
@@ -123,7 +123,10 @@ const styles = {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_error", function() {
       var page = __webpack_require__("/a9y")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for hooks.module.js
@@ -135,7 +135,10 @@ module.exports = shouldUseNative() ? Object.assign : function (target, source) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/hooks", function() {
       var page = __webpack_require__("+MDD")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for index.module.js
@@ -20,7 +20,10 @@ Page.getInitialProps = () => ({});
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/", function() {
       var page = __webpack_require__("RNiq")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for link.module.js
@@ -227,7 +227,10 @@ module.exports = function (TYPE, $create) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/link", function() {
       var page = __webpack_require__("ObF3")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for routerDirect.module.js
@@ -7,7 +7,10 @@
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/routerDirect", function() {
       var page = __webpack_require__("jSAA")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for withRouter.module.js
@@ -30,7 +30,10 @@ useWithRouter.getInitialProps = () => ({});
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/withRouter", function() {
       var page = __webpack_require__("0Hlz")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for index.html
@@ -6,19 +6,19 @@
         <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"
         />
         <meta name="next-head-count" content="2" />
-        <link rel="preload" href="/_next/static/Sb3t86FPmWptWC3nprpYj/pages/index.module.js"
+        <link rel="preload" href="/_next/static/UQpFXL1Nyh6SQfmCj_OU4/pages/index.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/Sb3t86FPmWptWC3nprpYj/pages/_app.module.js"
+        <link rel="preload" href="/_next/static/UQpFXL1Nyh6SQfmCj_OU4/pages/_app.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-56045b40d3fb28f22ee2.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/lAVapmIoStI8UhU414GJlnuCRE=.c659a74b6088e6ac1abe.module.js"
+        <link rel="preload" href="/_next/static/chunks/y+izAqJVpdgqvuT7i5zGls3v9s=.c659a74b6088e6ac1abe.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/Sb3t86FPmWptWC3nprpYj/_buildManifest.module.js"
+        <link rel="preload" href="/_next/static/UQpFXL1Nyh6SQfmCj_OU4/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
     </head>
     
@@ -26,40 +26,40 @@
         <div id="__next">Hello world 👋</div>
         <script id="__NEXT_DATA__" type="application/json"
         crossorigin="anonymous">
-            {"dataManager":"[]","props":{"pageProps":{}},"page":"/","query":{},"buildId":"Sb3t86FPmWptWC3nprpYj"}
+            {"dataManager":"[]","props":{"pageProps":{}},"page":"/","query":{},"buildId":"UQpFXL1Nyh6SQfmCj_OU4"}
         </script>
         <script crossorigin="anonymous" nomodule="">
             !function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();
         </script>
-        <script async="" data-next-page="/" src="/_next/static/Sb3t86FPmWptWC3nprpYj/pages/index.js"
+        <script async="" data-next-page="/" src="/_next/static/UQpFXL1Nyh6SQfmCj_OU4/pages/index.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/" src="/_next/static/Sb3t86FPmWptWC3nprpYj/pages/index.module.js"
+        <script async="" data-next-page="/" src="/_next/static/UQpFXL1Nyh6SQfmCj_OU4/pages/index.module.js"
         crossorigin="anonymous" type="module"></script>
-        <script async="" data-next-page="/_app" src="/_next/static/Sb3t86FPmWptWC3nprpYj/pages/_app.js"
+        <script async="" data-next-page="/_app" src="/_next/static/UQpFXL1Nyh6SQfmCj_OU4/pages/_app.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/_app" src="/_next/static/Sb3t86FPmWptWC3nprpYj/pages/_app.module.js"
+        <script async="" data-next-page="/_app" src="/_next/static/UQpFXL1Nyh6SQfmCj_OU4/pages/_app.module.js"
         crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/runtime/webpack-a470c2a25bcb4d5a8ec0.js"
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-2cd30e118423b74fdb03.js"
+        <script src="/_next/static/runtime/main-a384efaae9c1fc560750.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <script src="/_next/static/runtime/main-56045b40d3fb28f22ee2.module.js"
         async="" crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.js"
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/chunks/Z6JztBVt4CNv4R04BDKBm+UmU8=.155621535702fe040780.js"
+        <script src="/_next/static/chunks/+CLd1vtuilKt1m32bdBZGxI+1Y8=.155621535702fe040780.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/lAVapmIoStI8UhU414GJlnuCRE=.f6f7599a2edf91d8366a.js"
+        <script src="/_next/static/chunks/y+izAqJVpdgqvuT7i5zGls3v9s=.f6f7599a2edf91d8366a.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/lAVapmIoStI8UhU414GJlnuCRE=.c659a74b6088e6ac1abe.module.js"
+        <script src="/_next/static/chunks/y+izAqJVpdgqvuT7i5zGls3v9s=.c659a74b6088e6ac1abe.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/Sb3t86FPmWptWC3nprpYj/_buildManifest.js"
+        <script src="/_next/static/UQpFXL1Nyh6SQfmCj_OU4/_buildManifest.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/Sb3t86FPmWptWC3nprpYj/_buildManifest.module.js"
+        <script src="/_next/static/UQpFXL1Nyh6SQfmCj_OU4/_buildManifest.module.js"
         async="" crossorigin="anonymous" type="module"></script>
     </body>
Diff for link.html
@@ -6,19 +6,19 @@
         <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"
         />
         <meta name="next-head-count" content="2" />
-        <link rel="preload" href="/_next/static/Sb3t86FPmWptWC3nprpYj/pages/link.module.js"
+        <link rel="preload" href="/_next/static/UQpFXL1Nyh6SQfmCj_OU4/pages/link.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/Sb3t86FPmWptWC3nprpYj/pages/_app.module.js"
+        <link rel="preload" href="/_next/static/UQpFXL1Nyh6SQfmCj_OU4/pages/_app.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/lAVapmIoStI8UhU414GJlnuCRE=.c659a74b6088e6ac1abe.module.js"
+        <link rel="preload" href="/_next/static/chunks/y+izAqJVpdgqvuT7i5zGls3v9s=.c659a74b6088e6ac1abe.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-56045b40d3fb28f22ee2.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/Sb3t86FPmWptWC3nprpYj/_buildManifest.module.js"
+        <link rel="preload" href="/_next/static/UQpFXL1Nyh6SQfmCj_OU4/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
     </head>
     
@@ -29,18 +29,18 @@
             </div>
         </div>
         <script id="__NEXT_DATA__" type="application/json" crossorigin="anonymous">
-            {"dataManager":"[]","props":{"pageProps":{}},"page":"/link","query":{},"buildId":"Sb3t86FPmWptWC3nprpYj"}
+            {"dataManager":"[]","props":{"pageProps":{}},"page":"/link","query":{},"buildId":"UQpFXL1Nyh6SQfmCj_OU4"}
         </script>
         <script crossorigin="anonymous" nomodule="">
             !function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();
         </script>
-        <script async="" data-next-page="/link" src="/_next/static/Sb3t86FPmWptWC3nprpYj/pages/link.js"
+        <script async="" data-next-page="/link" src="/_next/static/UQpFXL1Nyh6SQfmCj_OU4/pages/link.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/link" src="/_next/static/Sb3t86FPmWptWC3nprpYj/pages/link.module.js"
+        <script async="" data-next-page="/link" src="/_next/static/UQpFXL1Nyh6SQfmCj_OU4/pages/link.module.js"
         crossorigin="anonymous" type="module"></script>
-        <script async="" data-next-page="/_app" src="/_next/static/Sb3t86FPmWptWC3nprpYj/pages/_app.js"
+        <script async="" data-next-page="/_app" src="/_next/static/UQpFXL1Nyh6SQfmCj_OU4/pages/_app.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/_app" src="/_next/static/Sb3t86FPmWptWC3nprpYj/pages/_app.module.js"
+        <script async="" data-next-page="/_app" src="/_next/static/UQpFXL1Nyh6SQfmCj_OU4/pages/_app.module.js"
         crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/runtime/webpack-a470c2a25bcb4d5a8ec0.js"
         async="" crossorigin="anonymous" nomodule=""></script>
@@ -50,19 +50,19 @@
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/chunks/Z6JztBVt4CNv4R04BDKBm+UmU8=.155621535702fe040780.js"
+        <script src="/_next/static/chunks/+CLd1vtuilKt1m32bdBZGxI+1Y8=.155621535702fe040780.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/lAVapmIoStI8UhU414GJlnuCRE=.f6f7599a2edf91d8366a.js"
+        <script src="/_next/static/chunks/y+izAqJVpdgqvuT7i5zGls3v9s=.f6f7599a2edf91d8366a.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/lAVapmIoStI8UhU414GJlnuCRE=.c659a74b6088e6ac1abe.module.js"
+        <script src="/_next/static/chunks/y+izAqJVpdgqvuT7i5zGls3v9s=.c659a74b6088e6ac1abe.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-2cd30e118423b74fdb03.js"
+        <script src="/_next/static/runtime/main-a384efaae9c1fc560750.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <script src="/_next/static/runtime/main-56045b40d3fb28f22ee2.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/Sb3t86FPmWptWC3nprpYj/_buildManifest.js"
+        <script src="/_next/static/UQpFXL1Nyh6SQfmCj_OU4/_buildManifest.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/Sb3t86FPmWptWC3nprpYj/_buildManifest.module.js"
+        <script src="/_next/static/UQpFXL1Nyh6SQfmCj_OU4/_buildManifest.module.js"
         async="" crossorigin="anonymous" type="module"></script>
     </body>
Diff for withRouter.html
@@ -6,19 +6,19 @@
         <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"
         />
         <meta name="next-head-count" content="2" />
-        <link rel="preload" href="/_next/static/Sb3t86FPmWptWC3nprpYj/pages/withRouter.module.js"
+        <link rel="preload" href="/_next/static/UQpFXL1Nyh6SQfmCj_OU4/pages/withRouter.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/Sb3t86FPmWptWC3nprpYj/pages/_app.module.js"
+        <link rel="preload" href="/_next/static/UQpFXL1Nyh6SQfmCj_OU4/pages/_app.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/lAVapmIoStI8UhU414GJlnuCRE=.c659a74b6088e6ac1abe.module.js"
+        <link rel="preload" href="/_next/static/chunks/y+izAqJVpdgqvuT7i5zGls3v9s=.c659a74b6088e6ac1abe.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-56045b40d3fb28f22ee2.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/Sb3t86FPmWptWC3nprpYj/_buildManifest.module.js"
+        <link rel="preload" href="/_next/static/UQpFXL1Nyh6SQfmCj_OU4/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
     </head>
     
@@ -27,18 +27,18 @@
             <div>I use withRouter</div>
         </div>
         <script id="__NEXT_DATA__" type="application/json" crossorigin="anonymous">
-            {"dataManager":"[]","props":{"pageProps":{}},"page":"/withRouter","query":{},"buildId":"Sb3t86FPmWptWC3nprpYj"}
+            {"dataManager":"[]","props":{"pageProps":{}},"page":"/withRouter","query":{},"buildId":"UQpFXL1Nyh6SQfmCj_OU4"}
         </script>
         <script crossorigin="anonymous" nomodule="">
             !function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();
         </script>
-        <script async="" data-next-page="/withRouter" src="/_next/static/Sb3t86FPmWptWC3nprpYj/pages/withRouter.js"
+        <script async="" data-next-page="/withRouter" src="/_next/static/UQpFXL1Nyh6SQfmCj_OU4/pages/withRouter.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/withRouter" src="/_next/static/Sb3t86FPmWptWC3nprpYj/pages/withRouter.module.js"
+        <script async="" data-next-page="/withRouter" src="/_next/static/UQpFXL1Nyh6SQfmCj_OU4/pages/withRouter.module.js"
         crossorigin="anonymous" type="module"></script>
-        <script async="" data-next-page="/_app" src="/_next/static/Sb3t86FPmWptWC3nprpYj/pages/_app.js"
+        <script async="" data-next-page="/_app" src="/_next/static/UQpFXL1Nyh6SQfmCj_OU4/pages/_app.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/_app" src="/_next/static/Sb3t86FPmWptWC3nprpYj/pages/_app.module.js"
+        <script async="" data-next-page="/_app" src="/_next/static/UQpFXL1Nyh6SQfmCj_OU4/pages/_app.module.js"
         crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/runtime/webpack-a470c2a25bcb4d5a8ec0.js"
         async="" crossorigin="anonymous" nomodule=""></script>
@@ -48,19 +48,19 @@
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/chunks/Z6JztBVt4CNv4R04BDKBm+UmU8=.155621535702fe040780.js"
+        <script src="/_next/static/chunks/+CLd1vtuilKt1m32bdBZGxI+1Y8=.155621535702fe040780.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/lAVapmIoStI8UhU414GJlnuCRE=.f6f7599a2edf91d8366a.js"
+        <script src="/_next/static/chunks/y+izAqJVpdgqvuT7i5zGls3v9s=.f6f7599a2edf91d8366a.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/lAVapmIoStI8UhU414GJlnuCRE=.c659a74b6088e6ac1abe.module.js"
+        <script src="/_next/static/chunks/y+izAqJVpdgqvuT7i5zGls3v9s=.c659a74b6088e6ac1abe.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-2cd30e118423b74fdb03.js"
+        <script src="/_next/static/runtime/main-a384efaae9c1fc560750.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-b34dfc4fd33bc7bccca0.module.js"
+        <script src="/_next/static/runtime/main-56045b40d3fb28f22ee2.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/Sb3t86FPmWptWC3nprpYj/_buildManifest.js"
+        <script src="/_next/static/UQpFXL1Nyh6SQfmCj_OU4/_buildManifest.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/Sb3t86FPmWptWC3nprpYj/_buildManifest.module.js"
+        <script src="/_next/static/UQpFXL1Nyh6SQfmCj_OU4/_buildManifest.module.js"
         async="" crossorigin="anonymous" type="module"></script>
     </body>

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
buildDuration 23.1s 23s -111ms
nodeModulesSize 42 MB 42 MB ⚠️ +2.47 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.js 18.2 kB 19.1 kB ⚠️ +951 B
main-HASH.js gzip 6.64 kB 6.83 kB ⚠️ +181 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
Overall change ⚠️ +951 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.module.js 16.5 kB 17.4 kB ⚠️ +849 B
main-HASH.module.js gzip 6.38 kB 6.54 kB ⚠️ +161 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH.module.js gzip 746 B 746 B
Overall change ⚠️ +849 B
Client Pages Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.js 1.83 kB 1.84 kB ⚠️ +6 B
_app.js gzip 884 B 888 B ⚠️ +4 B
_error.js 12.1 kB 12.1 kB ⚠️ +6 B
_error.js gzip 4.76 kB 4.76 kB ⚠️ +3 B
hooks.js 12.7 kB 12.7 kB ⚠️ +6 B
hooks.js gzip 4.81 kB 4.81 kB ⚠️ +3 B
index.js 343 B 349 B ⚠️ +6 B
index.js gzip 237 B 242 B ⚠️ +5 B
link.js 8.14 kB 8.14 kB ⚠️ +6 B
link.js gzip 3.49 kB 3.5 kB ⚠️ +5 B
routerDirect.js 433 B 439 B ⚠️ +6 B
routerDirect.js gzip 296 B 300 B ⚠️ +4 B
withRouter.js 444 B 450 B ⚠️ +6 B
withRouter.js gzip 294 B 298 B ⚠️ +4 B
Overall change ⚠️ +42 B
Client Pages Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.module.js 1.73 kB 1.73 kB ⚠️ +6 B
_app.module.js gzip 840 B 845 B ⚠️ +5 B
_error.module.js 23.3 kB 23.3 kB ⚠️ +6 B
_error.module.js gzip 8.62 kB 8.63 kB ⚠️ +5 B
hooks.module.js 1.55 kB 1.55 kB ⚠️ +6 B
hooks.module.js gzip 804 B 809 B ⚠️ +5 B
index.module.js 319 B 325 B ⚠️ +6 B
index.module.js gzip 238 B 243 B ⚠️ +5 B
link.module.js 8.52 kB 8.53 kB ⚠️ +6 B
link.module.js gzip 3.68 kB 3.68 kB ⚠️ +4 B
routerDirect.module.js 419 B 425 B ⚠️ +6 B
routerDirect.module.js gzip 294 B 299 B ⚠️ +5 B
withRouter.module.js 429 B 435 B ⚠️ +6 B
withRouter.module.js gzip 293 B 297 B ⚠️ +4 B
Overall change ⚠️ +42 B
Client Build Manifests
zeit/next.js canary azukaru/next.js relay-analytics Change
_buildManifest.js 81 B 81 B
_buildManifest.js gzip 61 B 61 B
_buildManifest.module.js 81 B 81 B
_buildManifest.module.js gzip 61 B 61 B
Overall change
Serverless bundles Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_error.js 247 kB 247 kB ⚠️ +5 B
_error.js gzip 66.4 kB 66.4 kB ⚠️ +4 B
hooks.html 3.81 kB 3.81 kB ⚠️ +1 B
hooks.html gzip 985 B 979 B -6 B
index.js 248 kB 248 kB ⚠️ +5 B
index.js gzip 66.6 kB 66.7 kB ⚠️ +127 B
link.js 256 kB 256 kB ⚠️ +5 B
link.js gzip 68.9 kB 68.8 kB -77 B
routerDirect.js 249 kB 249 kB ⚠️ +5 B
routerDirect.js gzip 66.7 kB 66.7 kB ⚠️ +23 B
withRouter.js 249 kB 249 kB ⚠️ +5 B
withRouter.js gzip 66.6 kB 66.8 kB ⚠️ +135 B
Overall change ⚠️ +26 B

Copy link
Contributor Author

@prateekbh prateekbh left a comment

Choose a reason for hiding this comment

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

addressed the comments

@ijjk
Copy link
Member

ijjk commented Sep 4, 2019

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
buildDuration 22.3s 22.1s -134ms
nodeModulesSize 42 MB 42 MB ⚠️ +2.73 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.js 18.2 kB 19.3 kB ⚠️ +1.07 kB
main-HASH.js gzip 6.64 kB 6.83 kB ⚠️ +189 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
Overall change 19.7 kB 20.8 kB ⚠️ +1.07 kB
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.module.js 16.6 kB 17.5 kB ⚠️ +955 B
main-HASH.module.js gzip 6.38 kB 6.55 kB ⚠️ +165 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH.module.js gzip 746 B 746 B
Overall change 18.1 kB 19 kB ⚠️ +955 B
Client Pages Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.js 1.83 kB 1.84 kB ⚠️ +6 B
_app.js gzip 883 B 887 B ⚠️ +4 B
_error.js 12.1 kB 12.1 kB ⚠️ +6 B
_error.js gzip 4.74 kB 4.75 kB ⚠️ +5 B
hooks.js 12.7 kB 12.7 kB ⚠️ +6 B
hooks.js gzip 4.81 kB 4.81 kB ⚠️ +3 B
index.js 343 B 349 B ⚠️ +6 B
index.js gzip 237 B 242 B ⚠️ +5 B
link.js 8.14 kB 8.14 kB ⚠️ +6 B
link.js gzip 3.49 kB 3.5 kB ⚠️ +4 B
routerDirect.js 433 B 439 B ⚠️ +6 B
routerDirect.js gzip 296 B 300 B ⚠️ +4 B
withRouter.js 444 B 450 B ⚠️ +6 B
withRouter.js gzip 294 B 298 B ⚠️ +4 B
Overall change 36 kB 36 kB ⚠️ +42 B
Client Pages Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.module.js 1.73 kB 1.73 kB ⚠️ +6 B
_app.module.js gzip 841 B 845 B ⚠️ +4 B
_error.module.js 23.3 kB 23.3 kB ⚠️ +6 B
_error.module.js gzip 8.6 kB 8.61 kB ⚠️ +4 B
hooks.module.js 1.55 kB 1.55 kB ⚠️ +6 B
hooks.module.js gzip 804 B 809 B ⚠️ +5 B
index.module.js 319 B 325 B ⚠️ +6 B
index.module.js gzip 238 B 243 B ⚠️ +5 B
link.module.js 8.52 kB 8.53 kB ⚠️ +6 B
link.module.js gzip 3.67 kB 3.68 kB ⚠️ +5 B
routerDirect.module.js 419 B 425 B ⚠️ +6 B
routerDirect.module.js gzip 294 B 299 B ⚠️ +5 B
withRouter.module.js 429 B 435 B ⚠️ +6 B
withRouter.module.js gzip 293 B 297 B ⚠️ +4 B
Overall change 36.2 kB 36.3 kB ⚠️ +42 B
Client Build Manifests
zeit/next.js canary azukaru/next.js relay-analytics Change
_buildManifest.js 81 B 81 B
_buildManifest.js gzip 61 B 61 B
_buildManifest.module.js 81 B 81 B
_buildManifest.module.js gzip 61 B 61 B
Overall change 162 B 162 B
Rendered Page Sizes
zeit/next.js canary azukaru/next.js relay-analytics Change
index.html 3.75 kB 3.75 kB
index.html gzip 959 B 961 B ⚠️ +2 B
link.html 3.79 kB 3.79 kB
link.html gzip 967 B 970 B ⚠️ +3 B
withRouter.html 3.8 kB 3.8 kB
withRouter.html gzip 955 B 957 B ⚠️ +2 B
Overall change 11.3 kB 11.3 kB

Diffs

Diff for main-HASH.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[11],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[4],{
 
 /***/ "/h46":
 /***/ (function(module, exports, __webpack_require__) {
@@ -417,7 +417,7 @@ exports.router = router;
 var ErrorComponent;
 exports.ErrorComponent = ErrorComponent;
 var Component;
-var App;
+var App, perfDataRelayer;
 
 var Container =
 /*#__PURE__*/
@@ -490,7 +490,7 @@ function () {
   var _ref2 = (0, _asyncToGenerator2["default"])(
   /*#__PURE__*/
   _regeneratorRuntime.mark(function _callee(_temp) {
-    var _ref, passedWebpackHMR, initialErr, _require, isValidElementType, renderCtx;
+    var _ref, passedWebpackHMR, _ref3, app, mod, initialErr, _require, isValidElementType, renderCtx;
 
     return _regeneratorRuntime.wrap(function _callee$(_context) {
       while (1) {
@@ -501,52 +501,60 @@ function () {
             if (false) {}
 
             _context.next = 4;
-            return pageLoader.loadPage('/_app');
+            return pageLoader.loadPageScript('/_app');
 
           case 4:
-            App = _context.sent;
+            _ref3 = _context.sent;
+            app = _ref3.page;
+            mod = _ref3.mod;
+            App = app;
+
+            if (mod && mod.onPerformanceData) {
+              perfDataRelayer = mod.onPerformanceData;
+            }
+
             initialErr = err;
-            _context.prev = 6;
-            _context.next = 9;
+            _context.prev = 10;
+            _context.next = 13;
             return pageLoader.loadPage(page);
 
-          case 9:
+          case 13:
             Component = _context.sent;
 
             if (true) {
-              _context.next = 14;
+              _context.next = 18;
               break;
             }
 
             _require = __webpack_require__(!(function webpackMissingModule() { var e = new Error("Cannot find module 'react-is'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())), isValidElementType = _require.isValidElementType;
 
             if (isValidElementType(Component)) {
-              _context.next = 14;
+              _context.next = 18;
               break;
             }
 
             throw new Error("The default export is not a React Component in page: \"" + page + "\"");
 
-          case 14:
-            _context.next = 19;
+          case 18:
+            _context.next = 23;
             break;
 
-          case 16:
-            _context.prev = 16;
-            _context.t0 = _context["catch"](6);
+          case 20:
+            _context.prev = 20;
+            _context.t0 = _context["catch"](10);
             // This catches errors like throwing in the top level of a module
             initialErr = _context.t0;
 
-          case 19:
+          case 23:
             if (!window.__NEXT_PRELOADREADY) {
-              _context.next = 22;
+              _context.next = 26;
               break;
             }
 
-            _context.next = 22;
+            _context.next = 26;
             return window.__NEXT_PRELOADREADY(dynamicIds);
 
-          case 22:
+          case 26:
             exports.router = router = (0, _router.createRouter)(page, query, asPath, {
               initialProps: props,
               pageLoader: pageLoader,
@@ -577,12 +585,12 @@ function () {
             render(renderCtx);
             return _context.abrupt("return", emitter);
 
-          case 26:
+          case 30:
           case "end":
             return _context.stop();
         }
       }
-    }, _callee, null, [[6, 16]]);
+    }, _callee, null, [[10, 20]]);
   }));
 
   return function (_x) {
@@ -745,6 +753,20 @@ function renderReactElement(reactEl, domEl) {
   } else {
     _reactDom["default"].render(reactEl, domEl, markRenderComplete);
   }
+
+  relayPaintMetrics();
+}
+
+function relayPaintMetrics() {
+  if (perfDataRelayer) {
+    performance.getEntriesByType('paint').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
 }
 
 function markHydrateComplete() {
@@ -753,6 +775,24 @@ function markHydrateComplete() {
 
   performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
   performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-hydration').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('beforeRender').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
@@ -768,6 +808,24 @@ function markRenderComplete() {
 
   performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
   performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-render').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('Next.js-route-change-to-render').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
@@ -776,11 +834,9 @@ function clearMarks() {
   ['beforeRender', 'afterHydrate', 'afterRender', 'routeChange'].forEach(function (mark) {
     return performance.clearMarks(mark);
   });
-  /*
-  * TODO: uncomment the following line when we have a way to
-  * expose this to user code.
-  */
-  // performance.clearMeasures()
+  ['Next.js-before-hydration', 'Next.js-hydration', 'Next.js-route-change-to-render', 'Next.js-render'].forEach(function (measure) {
+    return performance.clearMeasures(measure);
+  });
 }
 
 function AppContainer(_ref4) {
@@ -1474,13 +1530,21 @@ function () {
   }, {
     key: "loadPage",
     value: function loadPage(route) {
+      return this.loadPageScript(route).then(function (value) {
+        return value ? value.page : value;
+      });
+    }
+  }, {
+    key: "loadPageScript",
+    value: function loadPageScript(route) {
       var _this3 = this;
 
       route = this.normalizeRoute(route);
       return new _promise["default"](function (resolve, reject) {
         var fire = function fire(_ref) {
           var error = _ref.error,
-              page = _ref.page;
+              page = _ref.page,
+              mod = _ref.mod;
 
           _this3.pageRegisterEvents.off(route, fire);
 
@@ -1489,7 +1553,10 @@ function () {
           if (error) {
             reject(error);
           } else {
-            resolve(page);
+            resolve({
+              page: page,
+              mod: mod
+            });
           }
         }; // If there's a cached version of the page, let's use it.
 
@@ -1498,8 +1565,12 @@ function () {
 
         if (cachedPage) {
           var error = cachedPage.error,
-              page = cachedPage.page;
-          error ? reject(error) : resolve(page);
+              page = cachedPage.page,
+              mod = cachedPage.mod;
+          error ? reject(error) : resolve({
+            page: page,
+            mod: mod
+          });
           return;
         } // Register a listener to get the page
 
@@ -1594,16 +1665,19 @@ function () {
         try {
           var _regFn = regFn(),
               error = _regFn.error,
-              page = _regFn.page;
+              page = _regFn.page,
+              mod = _regFn.mod;
 
           _this5.pageCache[route] = {
             error: error,
-            page: page
+            page: page,
+            mod: mod
           };
 
           _this5.pageRegisterEvents.emit(route, {
             error: error,
-            page: page
+            page: page,
+            mod: mod
           });
         } catch (error) {
           _this5.pageCache[route] = {
Diff for main-HASH.module.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[10],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[3],{
 
 /***/ "+oT+":
 /***/ (function(module, exports, __webpack_require__) {
@@ -473,7 +473,7 @@ exports.router = router;
 let ErrorComponent;
 exports.ErrorComponent = ErrorComponent;
 let Component;
-let App;
+let App, perfDataRelayer;
 
 class Container extends _react.default.Component {
   componentDidCatch(err, info) {
@@ -531,7 +531,16 @@ function () {
 
     if (false) {}
 
-    App = yield pageLoader.loadPage('/_app');
+    const {
+      page: app,
+      mod
+    } = yield pageLoader.loadPageScript('/_app');
+    App = app;
+
+    if (mod && mod.onPerformanceData) {
+      perfDataRelayer = mod.onPerformanceData;
+    }
+
     let initialErr = err;
 
     try {
@@ -672,6 +681,20 @@ function renderReactElement(reactEl, domEl) {
   } else {
     _reactDom.default.render(reactEl, domEl, markRenderComplete);
   }
+
+  relayPaintMetrics();
+}
+
+function relayPaintMetrics() {
+  if (perfDataRelayer) {
+    performance.getEntriesByType('paint').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
 }
 
 function markHydrateComplete() {
@@ -680,6 +703,24 @@ function markHydrateComplete() {
 
   performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
   performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-hydration').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('beforeRender').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
@@ -695,17 +736,31 @@ function markRenderComplete() {
 
   performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
   performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-render').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('Next.js-route-change-to-render').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
 function clearMarks() {
   ;
   ['beforeRender', 'afterHydrate', 'afterRender', 'routeChange'].forEach(mark => performance.clearMarks(mark));
-  /*
-  * TODO: uncomment the following line when we have a way to
-  * expose this to user code.
-  */
-  // performance.clearMeasures()
+  ['Next.js-before-hydration', 'Next.js-hydration', 'Next.js-route-change-to-render', 'Next.js-render'].forEach(measure => performance.clearMeasures(measure));
 }
 
 function AppContainer(_ref4) {
@@ -1373,12 +1428,17 @@ class PageLoader {
   }
 
   loadPage(route) {
+    return this.loadPageScript(route).then(value => value ? value.page : value);
+  }
+
+  loadPageScript(route) {
     route = this.normalizeRoute(route);
     return new _promise.default((resolve, reject) => {
       const fire = _ref => {
         let {
           error,
-          page
+          page,
+          mod
         } = _ref;
         this.pageRegisterEvents.off(route, fire);
         delete this.loadingRoutes[route];
@@ -1386,7 +1446,10 @@ class PageLoader {
         if (error) {
           reject(error);
         } else {
-          resolve(page);
+          resolve({
+            page,
+            mod
+          });
         }
       }; // If there's a cached version of the page, let's use it.
 
@@ -1396,9 +1459,13 @@ class PageLoader {
       if (cachedPage) {
         const {
           error,
-          page
+          page,
+          mod
         } = cachedPage;
-        error ? reject(error) : resolve(page);
+        error ? reject(error) : resolve({
+          page,
+          mod
+        });
         return;
       } // Register a listener to get the page
 
@@ -1468,15 +1535,18 @@ class PageLoader {
       try {
         const {
           error,
-          page
+          page,
+          mod
         } = regFn();
         this.pageCache[route] = {
           error,
-          page
+          page,
+          mod
         };
         this.pageRegisterEvents.emit(route, {
           error,
-          page
+          page,
+          mod
         });
       } catch (error) {
         this.pageCache[route] = {
Diff for _app.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[4],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[5],{
 
 /***/ "B5Ud":
 /***/ (function(module, exports, __webpack_require__) {
@@ -194,7 +194,10 @@ function createUrl(router) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_app", function() {
       var page = __webpack_require__("B5Ud")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for _error.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[5],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[6],{
 
 /***/ "+iuc":
 /***/ (function(module, exports, __webpack_require__) {
@@ -189,7 +189,10 @@ var styles = {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_error", function() {
       var page = __webpack_require__("/a9y")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for hooks.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[6],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[7],{
 
 /***/ "+MDD":
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
@@ -996,7 +996,10 @@ module.exports = __webpack_require__("jmDH") ? Object.defineProperties : functio
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/hooks", function() {
       var page = __webpack_require__("+MDD")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for index.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[7],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[8],{
 
 /***/ "RNiq":
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
@@ -24,7 +24,10 @@ Page.getInitialProps = function () {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/", function() {
       var page = __webpack_require__("RNiq")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for link.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[8],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[9],{
 
 /***/ "/h46":
 /***/ (function(module, exports, __webpack_require__) {
@@ -169,7 +169,10 @@ module.exports = function (TYPE, $create) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/link", function() {
       var page = __webpack_require__("ObF3")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for routerDirect.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[9],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[10],{
 
 /***/ "LtRI":
 /***/ (function(module, exports, __webpack_require__) {
@@ -7,7 +7,10 @@
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/routerDirect", function() {
       var page = __webpack_require__("jSAA")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for withRouter.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[10],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[11],{
 
 /***/ "0Hlz":
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
@@ -32,7 +32,10 @@ useWithRouter.getInitialProps = function () {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/withRouter", function() {
       var page = __webpack_require__("0Hlz")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for _app.module.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[3],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[4],{
 
 /***/ "+oT+":
 /***/ (function(module, exports, __webpack_require__) {
@@ -199,7 +199,10 @@ function createUrl(router) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_app", function() {
       var page = __webpack_require__("B5Ud")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for _error.module.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[4],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[5],{
 
 /***/ "+iuc":
 /***/ (function(module, exports, __webpack_require__) {
@@ -165,7 +165,10 @@ const styles = {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/_error", function() {
       var page = __webpack_require__("/a9y")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for hooks.module.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[5],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[6],{
 
 /***/ "+MDD":
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
@@ -135,7 +135,10 @@ module.exports = shouldUseNative() ? Object.assign : function (target, source) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/hooks", function() {
       var page = __webpack_require__("+MDD")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for index.module.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[6],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[7],{
 
 /***/ "RNiq":
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
@@ -20,7 +20,10 @@ Page.getInitialProps = () => ({});
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/", function() {
       var page = __webpack_require__("RNiq")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for link.module.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[7],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[8],{
 
 /***/ "/h46":
 /***/ (function(module, exports, __webpack_require__) {
@@ -227,7 +227,10 @@ module.exports = function (TYPE, $create) {
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/link", function() {
       var page = __webpack_require__("ObF3")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for routerDirect.module.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[8],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[9],{
 
 /***/ "LtRI":
 /***/ (function(module, exports, __webpack_require__) {
@@ -7,7 +7,10 @@
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/routerDirect", function() {
       var page = __webpack_require__("jSAA")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for withRouter.module.js
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[9],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[10],{
 
 /***/ "0Hlz":
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
@@ -30,7 +30,10 @@ useWithRouter.getInitialProps = () => ({});
     (window.__NEXT_P=window.__NEXT_P||[]).push(["/withRouter", function() {
       var page = __webpack_require__("0Hlz")
       if(false) {}
-      return { page: page.default || page }
+      return {
+        page: page.default || page,
+        mod: page
+      };
     }]);
Diff for index.html
@@ -6,19 +6,19 @@
         <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"
         />
         <meta name="next-head-count" content="2" />
-        <link rel="preload" href="/_next/static/R5Wowtqs2TS20Qal_f-EJ/pages/index.module.js"
+        <link rel="preload" href="/_next/static/uh19y-U_ed6_Ud-HkJiFB/pages/index.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/R5Wowtqs2TS20Qal_f-EJ/pages/_app.module.js"
+        <link rel="preload" href="/_next/static/uh19y-U_ed6_Ud-HkJiFB/pages/_app.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-41b570be350e74cf32cb.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-1c09a250f20a6758c857.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/ec4972a4116496713bfedf2a7a8beaff6a1d068a.85e4c18b9e4b400e5496.module.js"
+        <link rel="preload" href="/_next/static/chunks/64505ab02b18ff12c7c57a2bba024c08d48c322f.85e4c18b9e4b400e5496.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/R5Wowtqs2TS20Qal_f-EJ/_buildManifest.module.js"
+        <link rel="preload" href="/_next/static/uh19y-U_ed6_Ud-HkJiFB/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
     </head>
     
@@ -26,40 +26,40 @@
         <div id="__next">Hello world 👋</div>
         <script id="__NEXT_DATA__" type="application/json"
         crossorigin="anonymous">
-            {"dataManager":"[]","props":{"pageProps":{}},"page":"/","query":{},"buildId":"R5Wowtqs2TS20Qal_f-EJ"}
+            {"dataManager":"[]","props":{"pageProps":{}},"page":"/","query":{},"buildId":"uh19y-U_ed6_Ud-HkJiFB"}
         </script>
         <script crossorigin="anonymous" nomodule="">
             !function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();
         </script>
-        <script async="" data-next-page="/" src="/_next/static/R5Wowtqs2TS20Qal_f-EJ/pages/index.js"
+        <script async="" data-next-page="/" src="/_next/static/uh19y-U_ed6_Ud-HkJiFB/pages/index.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/" src="/_next/static/R5Wowtqs2TS20Qal_f-EJ/pages/index.module.js"
+        <script async="" data-next-page="/" src="/_next/static/uh19y-U_ed6_Ud-HkJiFB/pages/index.module.js"
         crossorigin="anonymous" type="module"></script>
-        <script async="" data-next-page="/_app" src="/_next/static/R5Wowtqs2TS20Qal_f-EJ/pages/_app.js"
+        <script async="" data-next-page="/_app" src="/_next/static/uh19y-U_ed6_Ud-HkJiFB/pages/_app.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/_app" src="/_next/static/R5Wowtqs2TS20Qal_f-EJ/pages/_app.module.js"
+        <script async="" data-next-page="/_app" src="/_next/static/uh19y-U_ed6_Ud-HkJiFB/pages/_app.module.js"
         crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/runtime/webpack-a470c2a25bcb4d5a8ec0.js"
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-b50e91af3fd1d8cb23a4.js"
+        <script src="/_next/static/runtime/main-8c140d1a444c1b53a494.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-41b570be350e74cf32cb.module.js"
+        <script src="/_next/static/runtime/main-1c09a250f20a6758c857.module.js"
         async="" crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.js"
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/chunks/fb15c98e15e31af96805649408916ad204d3b811.155621535702fe040780.js"
+        <script src="/_next/static/chunks/20349d46e2c58cd2bc6cd389b878eed799dd3906.155621535702fe040780.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/ec4972a4116496713bfedf2a7a8beaff6a1d068a.474e0ebc58bce106266f.js"
+        <script src="/_next/static/chunks/64505ab02b18ff12c7c57a2bba024c08d48c322f.474e0ebc58bce106266f.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/ec4972a4116496713bfedf2a7a8beaff6a1d068a.85e4c18b9e4b400e5496.module.js"
+        <script src="/_next/static/chunks/64505ab02b18ff12c7c57a2bba024c08d48c322f.85e4c18b9e4b400e5496.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/R5Wowtqs2TS20Qal_f-EJ/_buildManifest.js"
+        <script src="/_next/static/uh19y-U_ed6_Ud-HkJiFB/_buildManifest.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/R5Wowtqs2TS20Qal_f-EJ/_buildManifest.module.js"
+        <script src="/_next/static/uh19y-U_ed6_Ud-HkJiFB/_buildManifest.module.js"
         async="" crossorigin="anonymous" type="module"></script>
     </body>
Diff for link.html
@@ -6,19 +6,19 @@
         <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"
         />
         <meta name="next-head-count" content="2" />
-        <link rel="preload" href="/_next/static/R5Wowtqs2TS20Qal_f-EJ/pages/link.module.js"
+        <link rel="preload" href="/_next/static/uh19y-U_ed6_Ud-HkJiFB/pages/link.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/R5Wowtqs2TS20Qal_f-EJ/pages/_app.module.js"
+        <link rel="preload" href="/_next/static/uh19y-U_ed6_Ud-HkJiFB/pages/_app.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/ec4972a4116496713bfedf2a7a8beaff6a1d068a.85e4c18b9e4b400e5496.module.js"
+        <link rel="preload" href="/_next/static/chunks/64505ab02b18ff12c7c57a2bba024c08d48c322f.85e4c18b9e4b400e5496.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-41b570be350e74cf32cb.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-1c09a250f20a6758c857.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/R5Wowtqs2TS20Qal_f-EJ/_buildManifest.module.js"
+        <link rel="preload" href="/_next/static/uh19y-U_ed6_Ud-HkJiFB/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
     </head>
     
@@ -29,18 +29,18 @@
             </div>
         </div>
         <script id="__NEXT_DATA__" type="application/json" crossorigin="anonymous">
-            {"dataManager":"[]","props":{"pageProps":{}},"page":"/link","query":{},"buildId":"R5Wowtqs2TS20Qal_f-EJ"}
+            {"dataManager":"[]","props":{"pageProps":{}},"page":"/link","query":{},"buildId":"uh19y-U_ed6_Ud-HkJiFB"}
         </script>
         <script crossorigin="anonymous" nomodule="">
             !function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();
         </script>
-        <script async="" data-next-page="/link" src="/_next/static/R5Wowtqs2TS20Qal_f-EJ/pages/link.js"
+        <script async="" data-next-page="/link" src="/_next/static/uh19y-U_ed6_Ud-HkJiFB/pages/link.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/link" src="/_next/static/R5Wowtqs2TS20Qal_f-EJ/pages/link.module.js"
+        <script async="" data-next-page="/link" src="/_next/static/uh19y-U_ed6_Ud-HkJiFB/pages/link.module.js"
         crossorigin="anonymous" type="module"></script>
-        <script async="" data-next-page="/_app" src="/_next/static/R5Wowtqs2TS20Qal_f-EJ/pages/_app.js"
+        <script async="" data-next-page="/_app" src="/_next/static/uh19y-U_ed6_Ud-HkJiFB/pages/_app.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/_app" src="/_next/static/R5Wowtqs2TS20Qal_f-EJ/pages/_app.module.js"
+        <script async="" data-next-page="/_app" src="/_next/static/uh19y-U_ed6_Ud-HkJiFB/pages/_app.module.js"
         crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/runtime/webpack-a470c2a25bcb4d5a8ec0.js"
         async="" crossorigin="anonymous" nomodule=""></script>
@@ -50,19 +50,19 @@
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/chunks/fb15c98e15e31af96805649408916ad204d3b811.155621535702fe040780.js"
+        <script src="/_next/static/chunks/20349d46e2c58cd2bc6cd389b878eed799dd3906.155621535702fe040780.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/ec4972a4116496713bfedf2a7a8beaff6a1d068a.474e0ebc58bce106266f.js"
+        <script src="/_next/static/chunks/64505ab02b18ff12c7c57a2bba024c08d48c322f.474e0ebc58bce106266f.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/ec4972a4116496713bfedf2a7a8beaff6a1d068a.85e4c18b9e4b400e5496.module.js"
+        <script src="/_next/static/chunks/64505ab02b18ff12c7c57a2bba024c08d48c322f.85e4c18b9e4b400e5496.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-b50e91af3fd1d8cb23a4.js"
+        <script src="/_next/static/runtime/main-8c140d1a444c1b53a494.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-41b570be350e74cf32cb.module.js"
+        <script src="/_next/static/runtime/main-1c09a250f20a6758c857.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/R5Wowtqs2TS20Qal_f-EJ/_buildManifest.js"
+        <script src="/_next/static/uh19y-U_ed6_Ud-HkJiFB/_buildManifest.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/R5Wowtqs2TS20Qal_f-EJ/_buildManifest.module.js"
+        <script src="/_next/static/uh19y-U_ed6_Ud-HkJiFB/_buildManifest.module.js"
         async="" crossorigin="anonymous" type="module"></script>
     </body>
Diff for withRouter.html
@@ -6,19 +6,19 @@
         <meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1"
         />
         <meta name="next-head-count" content="2" />
-        <link rel="preload" href="/_next/static/R5Wowtqs2TS20Qal_f-EJ/pages/withRouter.module.js"
+        <link rel="preload" href="/_next/static/uh19y-U_ed6_Ud-HkJiFB/pages/withRouter.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/R5Wowtqs2TS20Qal_f-EJ/pages/_app.module.js"
+        <link rel="preload" href="/_next/static/uh19y-U_ed6_Ud-HkJiFB/pages/_app.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/ec4972a4116496713bfedf2a7a8beaff6a1d068a.85e4c18b9e4b400e5496.module.js"
+        <link rel="preload" href="/_next/static/chunks/64505ab02b18ff12c7c57a2bba024c08d48c322f.85e4c18b9e4b400e5496.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-41b570be350e74cf32cb.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-1c09a250f20a6758c857.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/R5Wowtqs2TS20Qal_f-EJ/_buildManifest.module.js"
+        <link rel="preload" href="/_next/static/uh19y-U_ed6_Ud-HkJiFB/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
     </head>
     
@@ -27,18 +27,18 @@
             <div>I use withRouter</div>
         </div>
         <script id="__NEXT_DATA__" type="application/json" crossorigin="anonymous">
-            {"dataManager":"[]","props":{"pageProps":{}},"page":"/withRouter","query":{},"buildId":"R5Wowtqs2TS20Qal_f-EJ"}
+            {"dataManager":"[]","props":{"pageProps":{}},"page":"/withRouter","query":{},"buildId":"uh19y-U_ed6_Ud-HkJiFB"}
         </script>
         <script crossorigin="anonymous" nomodule="">
             !function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()},!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();
         </script>
-        <script async="" data-next-page="/withRouter" src="/_next/static/R5Wowtqs2TS20Qal_f-EJ/pages/withRouter.js"
+        <script async="" data-next-page="/withRouter" src="/_next/static/uh19y-U_ed6_Ud-HkJiFB/pages/withRouter.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/withRouter" src="/_next/static/R5Wowtqs2TS20Qal_f-EJ/pages/withRouter.module.js"
+        <script async="" data-next-page="/withRouter" src="/_next/static/uh19y-U_ed6_Ud-HkJiFB/pages/withRouter.module.js"
         crossorigin="anonymous" type="module"></script>
-        <script async="" data-next-page="/_app" src="/_next/static/R5Wowtqs2TS20Qal_f-EJ/pages/_app.js"
+        <script async="" data-next-page="/_app" src="/_next/static/uh19y-U_ed6_Ud-HkJiFB/pages/_app.js"
         crossorigin="anonymous" nomodule=""></script>
-        <script async="" data-next-page="/_app" src="/_next/static/R5Wowtqs2TS20Qal_f-EJ/pages/_app.module.js"
+        <script async="" data-next-page="/_app" src="/_next/static/uh19y-U_ed6_Ud-HkJiFB/pages/_app.module.js"
         crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/runtime/webpack-a470c2a25bcb4d5a8ec0.js"
         async="" crossorigin="anonymous" nomodule=""></script>
@@ -48,19 +48,19 @@
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/chunks/fb15c98e15e31af96805649408916ad204d3b811.155621535702fe040780.js"
+        <script src="/_next/static/chunks/20349d46e2c58cd2bc6cd389b878eed799dd3906.155621535702fe040780.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/ec4972a4116496713bfedf2a7a8beaff6a1d068a.474e0ebc58bce106266f.js"
+        <script src="/_next/static/chunks/64505ab02b18ff12c7c57a2bba024c08d48c322f.474e0ebc58bce106266f.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/ec4972a4116496713bfedf2a7a8beaff6a1d068a.85e4c18b9e4b400e5496.module.js"
+        <script src="/_next/static/chunks/64505ab02b18ff12c7c57a2bba024c08d48c322f.85e4c18b9e4b400e5496.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-b50e91af3fd1d8cb23a4.js"
+        <script src="/_next/static/runtime/main-8c140d1a444c1b53a494.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-41b570be350e74cf32cb.module.js"
+        <script src="/_next/static/runtime/main-1c09a250f20a6758c857.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/R5Wowtqs2TS20Qal_f-EJ/_buildManifest.js"
+        <script src="/_next/static/uh19y-U_ed6_Ud-HkJiFB/_buildManifest.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/R5Wowtqs2TS20Qal_f-EJ/_buildManifest.module.js"
+        <script src="/_next/static/uh19y-U_ed6_Ud-HkJiFB/_buildManifest.module.js"
         async="" crossorigin="anonymous" type="module"></script>
     </body>

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
buildDuration 24.1s 22.5s -1.6s
nodeModulesSize 42 MB 42 MB ⚠️ +2.73 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.js 18.2 kB 19.3 kB ⚠️ +1.07 kB
main-HASH.js gzip 6.64 kB 6.83 kB ⚠️ +188 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
Overall change 19.7 kB 20.8 kB ⚠️ +1.07 kB
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.module.js 16.6 kB 17.5 kB ⚠️ +954 B
main-HASH.module.js gzip 6.38 kB 6.55 kB ⚠️ +164 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH.module.js gzip 746 B 746 B
Overall change 18.1 kB 19 kB ⚠️ +954 B
Client Pages Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.js 1.83 kB 1.84 kB ⚠️ +6 B
_app.js gzip 883 B 887 B ⚠️ +4 B
_error.js 12.1 kB 12.1 kB ⚠️ +6 B
_error.js gzip 4.74 kB 4.75 kB ⚠️ +5 B
hooks.js 12.7 kB 12.7 kB ⚠️ +6 B
hooks.js gzip 4.81 kB 4.81 kB ⚠️ +3 B
index.js 343 B 349 B ⚠️ +6 B
index.js gzip 237 B 242 B ⚠️ +5 B
link.js 8.14 kB 8.14 kB ⚠️ +6 B
link.js gzip 3.49 kB 3.5 kB ⚠️ +5 B
routerDirect.js 433 B 440 B ⚠️ +7 B
routerDirect.js gzip 296 B 301 B ⚠️ +5 B
withRouter.js 444 B 450 B ⚠️ +6 B
withRouter.js gzip 294 B 298 B ⚠️ +4 B
Overall change 36 kB 36 kB ⚠️ +43 B
Client Pages Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.module.js 1.73 kB 1.73 kB ⚠️ +6 B
_app.module.js gzip 841 B 845 B ⚠️ +4 B
_error.module.js 23.3 kB 23.3 kB ⚠️ +6 B
_error.module.js gzip 8.6 kB 8.61 kB ⚠️ +4 B
hooks.module.js 1.55 kB 1.55 kB ⚠️ +6 B
hooks.module.js gzip 804 B 810 B ⚠️ +6 B
index.module.js 319 B 325 B ⚠️ +6 B
index.module.js gzip 238 B 243 B ⚠️ +5 B
link.module.js 8.52 kB 8.53 kB ⚠️ +6 B
link.module.js gzip 3.67 kB 3.68 kB ⚠️ +5 B
routerDirect.module.js 419 B 425 B ⚠️ +6 B
routerDirect.module.js gzip 294 B 299 B ⚠️ +5 B
withRouter.module.js 429 B 436 B ⚠️ +7 B
withRouter.module.js gzip 293 B 298 B ⚠️ +5 B
Overall change 36.2 kB 36.3 kB ⚠️ +43 B
Client Build Manifests
zeit/next.js canary azukaru/next.js relay-analytics Change
_buildManifest.js 81 B 81 B
_buildManifest.js gzip 61 B 61 B
_buildManifest.module.js 81 B 81 B
_buildManifest.module.js gzip 61 B 61 B
Overall change 162 B 162 B
Serverless bundles
zeit/next.js canary azukaru/next.js relay-analytics Change
_error.js 247 kB 247 kB
_error.js gzip 66.2 kB 66.2 kB ⚠️ +39 B
hooks.html 3.86 kB 3.86 kB
hooks.html gzip 986 B 984 B -2 B
index.js 248 kB 248 kB
index.js gzip 66.5 kB 66.5 kB -10 B
link.js 255 kB 255 kB
link.js gzip 68.5 kB 68.5 kB -4 B
routerDirect.js 249 kB 249 kB
routerDirect.js gzip 66.5 kB 66.6 kB ⚠️ +47 B
withRouter.js 249 kB 249 kB
withRouter.js gzip 66.5 kB 66.6 kB ⚠️ +96 B
Overall change 1.25 MB 1.25 MB

@ijjk
Copy link
Member

ijjk commented Sep 18, 2019

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall decrease ✓
zeit/next.js canary azukaru/next.js relay-analytics Change
buildDuration 15.4s 14s -1.4s
nodeModulesSize 48.4 MB 42 MB -6.41 MB
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.js 18.2 kB 19.3 kB ⚠️ +1.08 kB
main-HASH.js gzip 6.63 kB 6.85 kB ⚠️ +214 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
4952ddcd88e7..2b8407376.js 21.9 kB 21.9 kB
4952ddcd88e7..7376.js gzip 7.81 kB 7.81 kB
de003c3a9d30..3fa59b1f5.js 43.1 kB N/A N/A
de003c3a9d30..b1f5.js gzip 15.5 kB N/A N/A
framework.5b..dbaff70d3.js 125 kB 125 kB
framework.5b..70d3.js gzip 39.4 kB 39.4 kB
de003c3a9d30..1c5d17695.js N/A 43.1 kB N/A
de003c3a9d30..7695.js gzip N/A 15.4 kB N/A
Overall change 210 kB 211 kB ⚠️ +1.08 kB
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.module.js 16.5 kB 17.6 kB ⚠️ +1.02 kB
main-HASH.module.js gzip 6.38 kB 6.57 kB ⚠️ +190 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..4b.module.js 45.5 kB N/A N/A
de003c3a9d30..dule.js gzip 16.5 kB N/A N/A
framework.5b..d3.module.js 125 kB 125 kB
framework.5b..dule.js gzip 39.4 kB 39.4 kB
de003c3a9d30..5f.module.js N/A 45.5 kB N/A
de003c3a9d30..dule.js gzip N/A 16.5 kB N/A
Overall change 189 kB 190 kB ⚠️ +1.02 kB
Client Pages Overall decrease ✓
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.js 1.81 kB 1.81 kB
_app.js gzip 873 B 873 B
_error.js 12 kB 12 kB
_error.js gzip 4.73 kB 4.73 kB
hooks.js 12.7 kB 12.7 kB
hooks.js gzip 4.79 kB 4.79 kB
index.js 318 B 318 B
index.js gzip 222 B 222 B
link.js 8.14 kB 8.11 kB -30 B
link.js gzip 3.5 kB 3.48 kB -21 B
routerDirect.js 408 B 408 B
routerDirect.js gzip 281 B 281 B
withRouter.js 419 B 419 B
withRouter.js gzip 280 B 280 B
Overall change 35.8 kB 35.8 kB -30 B
Client Pages Modern Overall decrease ✓
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.module.js 1.7 kB 1.7 kB
_app.module.js gzip 832 B 832 B
_error.module.js 23.3 kB 23.3 kB
_error.module.js gzip 8.59 kB 8.59 kB
hooks.module.js 1.52 kB 1.52 kB
hooks.module.js gzip 793 B 793 B
index.module.js 294 B 294 B
index.module.js gzip 223 B 223 B
link.module.js 8.53 kB 8.5 kB -30 B
link.module.js gzip 3.68 kB 3.66 kB -20 B
routerDirect.module.js 394 B 394 B
routerDirect..dule.js gzip 281 B 281 B
withRouter.module.js 404 B 404 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 36.1 kB 36.1 kB -30 B
Client Build Manifests
zeit/next.js canary azukaru/next.js relay-analytics Change
_buildManifest.js 81 B 81 B
_buildManifest.js gzip 61 B 61 B
_buildManifest.module.js 81 B 81 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 162 B 162 B
Rendered Page Sizes
zeit/next.js canary azukaru/next.js relay-analytics Change
index.html 3.62 kB 3.62 kB
index.html gzip 947 B 946 B -1 B
link.html 3.66 kB 3.66 kB
link.html gzip 955 B 955 B
withRouter.html 3.67 kB 3.67 kB
withRouter.html gzip 942 B 942 B
Overall change 10.9 kB 10.9 kB

Diffs

Diff for main-HASH.js
@@ -368,7 +368,7 @@ if (!window.Promise) {
 
 var data = JSON.parse(document.getElementById('__NEXT_DATA__').textContent);
 window.__NEXT_DATA__ = data;
-var version = "9.0.6";
+var version = "9.0.6-canary.4";
 exports.version = version;
 var props = data.props,
     err = data.err,
@@ -417,7 +417,7 @@ exports.router = router;
 var ErrorComponent;
 exports.ErrorComponent = ErrorComponent;
 var Component;
-var App;
+var App, perfDataRelayer;
 
 var Container =
 /*#__PURE__*/
@@ -490,7 +490,7 @@ function () {
   var _ref2 = (0, _asyncToGenerator2["default"])(
   /*#__PURE__*/
   _regeneratorRuntime.mark(function _callee(_temp) {
-    var _ref, passedWebpackHMR, initialErr, _require, isValidElementType, renderCtx;
+    var _ref, passedWebpackHMR, _ref3, app, mod, initialErr, _require, isValidElementType, initialAsPath, renderCtx;
 
     return _regeneratorRuntime.wrap(function _callee$(_context) {
       while (1) {
@@ -501,53 +501,64 @@ function () {
             if (false) {}
 
             _context.next = 4;
-            return pageLoader.loadPage('/_app');
+            return pageLoader.loadPageScript('/_app');
 
           case 4:
-            App = _context.sent;
+            _ref3 = _context.sent;
+            app = _ref3.page;
+            mod = _ref3.mod;
+            App = app;
+
+            if (mod && mod.experimental_onPerformanceData) {
+              perfDataRelayer = mod.experimental_onPerformanceData;
+            }
+
             initialErr = err;
-            _context.prev = 6;
-            _context.next = 9;
+            _context.prev = 10;
+            _context.next = 13;
             return pageLoader.loadPage(page);
 
-          case 9:
+          case 13:
             Component = _context.sent;
 
             if (true) {
-              _context.next = 14;
+              _context.next = 18;
               break;
             }
 
             _require = __webpack_require__(!(function webpackMissingModule() { var e = new Error("Cannot find module 'react-is'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())), isValidElementType = _require.isValidElementType;
 
             if (isValidElementType(Component)) {
-              _context.next = 14;
+              _context.next = 18;
               break;
             }
 
             throw new Error("The default export is not a React Component in page: \"" + page + "\"");
 
-          case 14:
-            _context.next = 19;
+          case 18:
+            _context.next = 23;
             break;
 
-          case 16:
-            _context.prev = 16;
-            _context.t0 = _context["catch"](6);
+          case 20:
+            _context.prev = 20;
+            _context.t0 = _context["catch"](10);
             // This catches errors like throwing in the top level of a module
             initialErr = _context.t0;
 
-          case 19:
+          case 23:
             if (!window.__NEXT_PRELOADREADY) {
-              _context.next = 22;
+              _context.next = 26;
               break;
             }
 
-            _context.next = 22;
+            _context.next = 26;
             return window.__NEXT_PRELOADREADY(dynamicIds);
 
-          case 22:
-            exports.router = router = (0, _router.createRouter)(page, query, asPath, {
+          case 26:
+            // if auto prerendered and dynamic route wait to update asPath
+            // until after mount to prevent hydration mismatch
+            initialAsPath = (0, _isDynamic.isDynamicRoute)(page) && data.nextExport ? page : asPath;
+            exports.router = router = (0, _router.createRouter)(page, query, initialAsPath, {
               initialProps: props,
               pageLoader: pageLoader,
               App: App,
@@ -577,12 +588,12 @@ function () {
             render(renderCtx);
             return _context.abrupt("return", emitter);
 
-          case 26:
+          case 31:
           case "end":
             return _context.stop();
         }
       }
-    }, _callee, null, [[6, 16]]);
+    }, _callee, null, [[10, 20]]);
   }));
 
   return function (_x) {
@@ -739,18 +750,24 @@ function renderReactElement(reactEl, domEl) {
 
 
   if (isInitialRender) {
-    _reactDom["default"].hydrate(reactEl, domEl, function () {
-      if (false) {}
-
-      markHydrateComplete();
-    });
+    _reactDom["default"].hydrate(reactEl, domEl, markHydrateComplete);
 
     isInitialRender = false;
   } else {
-    _reactDom["default"].render(reactEl, domEl, function () {
-      if (false) {}
+    _reactDom["default"].render(reactEl, domEl, markRenderComplete);
+  }
 
-      markRenderComplete();
+  relayPaintMetrics();
+}
+
+function relayPaintMetrics() {
+  if (perfDataRelayer) {
+    performance.getEntriesByType('paint').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
     });
   }
 }
@@ -761,6 +778,24 @@ function markHydrateComplete() {
 
   performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
   performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-hydration').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('beforeRender').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
@@ -776,6 +811,24 @@ function markRenderComplete() {
 
   performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
   performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-render').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('Next.js-route-change-to-render').forEach(function (entry) {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
@@ -784,11 +837,9 @@ function clearMarks() {
   ['beforeRender', 'afterHydrate', 'afterRender', 'routeChange'].forEach(function (mark) {
     return performance.clearMarks(mark);
   });
-  /*
-  * TODO: uncomment the following line when we have a way to
-  * expose this to user code.
-  */
-  // performance.clearMeasures()
+  ['Next.js-before-hydration', 'Next.js-hydration', 'Next.js-route-change-to-render', 'Next.js-render'].forEach(function (measure) {
+    return performance.clearMeasures(measure);
+  });
 }
 
 function AppContainer(_ref4) {
@@ -1482,13 +1533,21 @@ function () {
   }, {
     key: "loadPage",
     value: function loadPage(route) {
+      return this.loadPageScript(route).then(function (value) {
+        return value ? value.page : value;
+      });
+    }
+  }, {
+    key: "loadPageScript",
+    value: function loadPageScript(route) {
       var _this3 = this;
 
       route = this.normalizeRoute(route);
       return new _promise["default"](function (resolve, reject) {
         var fire = function fire(_ref) {
           var error = _ref.error,
-              page = _ref.page;
+              page = _ref.page,
+              mod = _ref.mod;
 
           _this3.pageRegisterEvents.off(route, fire);
 
@@ -1497,7 +1556,10 @@ function () {
           if (error) {
             reject(error);
           } else {
-            resolve(page);
+            resolve({
+              page: page,
+              mod: mod
+            });
           }
         }; // If there's a cached version of the page, let's use it.
 
@@ -1506,8 +1568,12 @@ function () {
 
         if (cachedPage) {
           var error = cachedPage.error,
-              page = cachedPage.page;
-          error ? reject(error) : resolve(page);
+              page = cachedPage.page,
+              mod = cachedPage.mod;
+          error ? reject(error) : resolve({
+            page: page,
+            mod: mod
+          });
           return;
         } // Register a listener to get the page
Diff for main-HASH.module.js
@@ -425,7 +425,7 @@ if (!window.Promise) {
 
 const data = JSON.parse(document.getElementById('__NEXT_DATA__').textContent);
 window.__NEXT_DATA__ = data;
-const version = "9.0.6";
+const version = "9.0.6-canary.4";
 exports.version = version;
 const {
   props,
@@ -473,7 +473,7 @@ exports.router = router;
 let ErrorComponent;
 exports.ErrorComponent = ErrorComponent;
 let Component;
-let App;
+let App, perfDataRelayer;
 
 class Container extends _react.default.Component {
   componentDidCatch(err, info) {
@@ -531,7 +531,16 @@ function () {
 
     if (false) {}
 
-    App = yield pageLoader.loadPage('/_app');
+    const {
+      page: app,
+      mod
+    } = yield pageLoader.loadPageScript('/_app');
+    App = app;
+
+    if (mod && mod.experimental_onPerformanceData) {
+      perfDataRelayer = mod.experimental_onPerformanceData;
+    }
+
     let initialErr = err;
 
     try {
@@ -545,9 +554,12 @@ function () {
 
     if (window.__NEXT_PRELOADREADY) {
       yield window.__NEXT_PRELOADREADY(dynamicIds);
-    }
+    } // if auto prerendered and dynamic route wait to update asPath
+    // until after mount to prevent hydration mismatch
 
-    exports.router = router = (0, _router.createRouter)(page, query, asPath, {
+
+    const initialAsPath = (0, _isDynamic.isDynamicRoute)(page) && data.nextExport ? page : asPath;
+    exports.router = router = (0, _router.createRouter)(page, query, initialAsPath, {
       initialProps: props,
       pageLoader,
       App,
@@ -666,18 +678,24 @@ function renderReactElement(reactEl, domEl) {
 
 
   if (isInitialRender) {
-    _reactDom.default.hydrate(reactEl, domEl, function () {
-      if (false) {}
-
-      markHydrateComplete();
-    });
+    _reactDom.default.hydrate(reactEl, domEl, markHydrateComplete);
 
     isInitialRender = false;
   } else {
-    _reactDom.default.render(reactEl, domEl, function () {
-      if (false) {}
+    _reactDom.default.render(reactEl, domEl, markRenderComplete);
+  }
 
-      markRenderComplete();
+  relayPaintMetrics();
+}
+
+function relayPaintMetrics() {
+  if (perfDataRelayer) {
+    performance.getEntriesByType('paint').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
     });
   }
 }
@@ -688,6 +706,24 @@ function markHydrateComplete() {
 
   performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
   performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-hydration').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('beforeRender').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
@@ -703,17 +739,31 @@ function markRenderComplete() {
 
   performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
   performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+
+  if (perfDataRelayer) {
+    performance.getEntriesByName('Next.js-render').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+    performance.getEntriesByName('Next.js-route-change-to-render').forEach(entry => {
+      perfDataRelayer({
+        name: entry.name,
+        startTime: entry.startTime,
+        value: entry.duration
+      });
+    });
+  }
+
   clearMarks();
 }
 
 function clearMarks() {
   ;
   ['beforeRender', 'afterHydrate', 'afterRender', 'routeChange'].forEach(mark => performance.clearMarks(mark));
-  /*
-  * TODO: uncomment the following line when we have a way to
-  * expose this to user code.
-  */
-  // performance.clearMeasures()
+  ['Next.js-before-hydration', 'Next.js-hydration', 'Next.js-route-change-to-render', 'Next.js-render'].forEach(measure => performance.clearMeasures(measure));
 }
 
 function AppContainer(_ref4) {
@@ -1381,12 +1431,17 @@ class PageLoader {
   }
 
   loadPage(route) {
+    return this.loadPageScript(route).then(value => value ? value.page : value);
+  }
+
+  loadPageScript(route) {
     route = this.normalizeRoute(route);
     return new _promise.default((resolve, reject) => {
       const fire = _ref => {
         let {
           error,
-          page
+          page,
+          mod
         } = _ref;
         this.pageRegisterEvents.off(route, fire);
         delete this.loadingRoutes[route];
@@ -1394,7 +1449,10 @@ class PageLoader {
         if (error) {
           reject(error);
         } else {
-          resolve(page);
+          resolve({
+            page,
+            mod
+          });
         }
       }; // If there's a cached version of the page, let's use it.
 
@@ -1404,9 +1462,13 @@ class PageLoader {
       if (cachedPage) {
         const {
           error,
-          page
+          page,
+          mod
         } = cachedPage;
-        error ? reject(error) : resolve(page);
+        error ? reject(error) : resolve({
+          page,
+          mod
+        });
         return;
       } // Register a listener to get the page
Diff for link.js
@@ -512,12 +512,7 @@ var listenToIntersections = function listenToIntersections(el, cb) {
   observer.observe(el);
   listeners.set(el, cb);
   return function () {
-    try {
-      observer.unobserve(el);
-    } catch (err) {
-      console.error(err);
-    }
-
+    observer.unobserve(el);
     listeners["delete"](el);
   };
 };
Diff for link.module.js
@@ -560,12 +560,7 @@ const listenToIntersections = (el, cb) => {
   observer.observe(el);
   listeners.set(el, cb);
   return () => {
-    try {
-      observer.unobserve(el);
-    } catch (err) {
-      console.error(err);
-    }
-
+    observer.unobserve(el);
     listeners.delete(el);
   };
 };
Diff for index.html
@@ -12,11 +12,11 @@
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-c035a9ad7fa402c8993c.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-0367150f8032fd63aacc.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b5ebf6f8ef4730ac0f13.module.js"
+        <link rel="preload" href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.148b9d567c5ec499c554.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/BUILD_ID/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
@@ -43,9 +43,9 @@
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-4cfcf108ec60b95745d5.js"
+        <script src="/_next/static/runtime/main-e62fcf90f7314c515878.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-c035a9ad7fa402c8993c.module.js"
+        <script src="/_next/static/runtime/main-0367150f8032fd63aacc.module.js"
         async="" crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.js"
         async="" crossorigin="anonymous" nomodule=""></script>
@@ -53,9 +53,9 @@
         async="" crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/chunks/4952ddcd88e7185e66c9cf40e2d848b7e27f1574.155621535702fe040780.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.01cc4f1e34fde13f4eb9.js"
+        <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.884fe048044e62151ce8.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b5ebf6f8ef4730ac0f13.module.js"
+        <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.148b9d567c5ec499c554.module.js"
         async="" crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/BUILD_ID/_buildManifest.js" async=""
         crossorigin="anonymous" nomodule=""></script>
Diff for link.html
@@ -14,9 +14,9 @@
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b5ebf6f8ef4730ac0f13.module.js"
+        <link rel="preload" href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.148b9d567c5ec499c554.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-c035a9ad7fa402c8993c.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-0367150f8032fd63aacc.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/BUILD_ID/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
@@ -52,13 +52,13 @@
         async="" crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/chunks/4952ddcd88e7185e66c9cf40e2d848b7e27f1574.155621535702fe040780.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.01cc4f1e34fde13f4eb9.js"
+        <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.884fe048044e62151ce8.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b5ebf6f8ef4730ac0f13.module.js"
+        <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.148b9d567c5ec499c554.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-4cfcf108ec60b95745d5.js"
+        <script src="/_next/static/runtime/main-e62fcf90f7314c515878.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-c035a9ad7fa402c8993c.module.js"
+        <script src="/_next/static/runtime/main-0367150f8032fd63aacc.module.js"
         async="" crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/BUILD_ID/_buildManifest.js" async=""
         crossorigin="anonymous" nomodule=""></script>
Diff for withRouter.html
@@ -14,9 +14,9 @@
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b5ebf6f8ef4730ac0f13.module.js"
+        <link rel="preload" href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.148b9d567c5ec499c554.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-c035a9ad7fa402c8993c.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-0367150f8032fd63aacc.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/BUILD_ID/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
@@ -50,13 +50,13 @@
         async="" crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/chunks/4952ddcd88e7185e66c9cf40e2d848b7e27f1574.155621535702fe040780.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.01cc4f1e34fde13f4eb9.js"
+        <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.884fe048044e62151ce8.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.b5ebf6f8ef4730ac0f13.module.js"
+        <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.148b9d567c5ec499c554.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-4cfcf108ec60b95745d5.js"
+        <script src="/_next/static/runtime/main-e62fcf90f7314c515878.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-c035a9ad7fa402c8993c.module.js"
+        <script src="/_next/static/runtime/main-0367150f8032fd63aacc.module.js"
         async="" crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/BUILD_ID/_buildManifest.js" async=""
         crossorigin="anonymous" nomodule=""></script>

Serverless Mode (Increase detected ⚠️)
General Overall decrease ✓
zeit/next.js canary azukaru/next.js relay-analytics Change
buildDuration 14.5s 14.3s -145ms
nodeModulesSize 48.4 MB 42 MB -6.41 MB
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.js 18.2 kB 19.3 kB ⚠️ +1.08 kB
main-HASH.js gzip 6.63 kB 6.85 kB ⚠️ +214 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
4952ddcd88e7..2b8407376.js 21.9 kB 21.9 kB
4952ddcd88e7..7376.js gzip 7.81 kB 7.81 kB
de003c3a9d30..3fa59b1f5.js 43.1 kB N/A N/A
de003c3a9d30..b1f5.js gzip 15.5 kB N/A N/A
framework.5b..dbaff70d3.js 125 kB 125 kB
framework.5b..70d3.js gzip 39.4 kB 39.4 kB
de003c3a9d30..1c5d17695.js N/A 43.1 kB N/A
de003c3a9d30..7695.js gzip N/A 15.4 kB N/A
Overall change 210 kB 211 kB ⚠️ +1.08 kB
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.module.js 16.5 kB 17.6 kB ⚠️ +1.02 kB
main-HASH.module.js gzip 6.38 kB 6.57 kB ⚠️ +190 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..4b.module.js 45.5 kB N/A N/A
de003c3a9d30..dule.js gzip 16.5 kB N/A N/A
framework.5b..d3.module.js 125 kB 125 kB
framework.5b..dule.js gzip 39.4 kB 39.4 kB
de003c3a9d30..5f.module.js N/A 45.5 kB N/A
de003c3a9d30..dule.js gzip N/A 16.5 kB N/A
Overall change 189 kB 190 kB ⚠️ +1.02 kB
Client Pages Overall decrease ✓
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.js 1.81 kB 1.81 kB
_app.js gzip 873 B 873 B
_error.js 12 kB 12 kB
_error.js gzip 4.73 kB 4.73 kB
hooks.js 12.7 kB 12.7 kB
hooks.js gzip 4.79 kB 4.79 kB
index.js 318 B 318 B
index.js gzip 222 B 222 B
link.js 8.14 kB 8.11 kB -30 B
link.js gzip 3.5 kB 3.48 kB -21 B
routerDirect.js 408 B 408 B
routerDirect.js gzip 281 B 281 B
withRouter.js 419 B 419 B
withRouter.js gzip 280 B 280 B
Overall change 35.8 kB 35.8 kB -30 B
Client Pages Modern Overall decrease ✓
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.module.js 1.7 kB 1.7 kB
_app.module.js gzip 832 B 832 B
_error.module.js 23.3 kB 23.3 kB
_error.module.js gzip 8.59 kB 8.59 kB
hooks.module.js 1.52 kB 1.52 kB
hooks.module.js gzip 793 B 793 B
index.module.js 294 B 294 B
index.module.js gzip 223 B 223 B
link.module.js 8.53 kB 8.5 kB -30 B
link.module.js gzip 3.68 kB 3.66 kB -20 B
routerDirect.module.js 394 B 394 B
routerDirect..dule.js gzip 281 B 281 B
withRouter.module.js 404 B 404 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 36.1 kB 36.1 kB -30 B
Client Build Manifests
zeit/next.js canary azukaru/next.js relay-analytics Change
_buildManifest.js 81 B 81 B
_buildManifest.js gzip 61 B 61 B
_buildManifest.module.js 81 B 81 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 162 B 162 B
Serverless bundles Overall decrease ✓
zeit/next.js canary azukaru/next.js relay-analytics Change
_error.js 249 kB 248 kB -1.53 kB
_error.js gzip 66.4 kB 66.2 kB -238 B
hooks.html 3.75 kB 3.75 kB
hooks.html gzip 980 B 979 B -1 B
index.js 250 kB 248 kB -1.53 kB
index.js gzip 66.8 kB 66.5 kB -250 B
link.js 257 kB 255 kB -1.59 kB
link.js gzip 68.8 kB 68.5 kB -247 B
routerDirect.js 250 kB 249 kB -1.53 kB
routerDirect.js gzip 66.8 kB 66.5 kB -238 B
withRouter.js 250 kB 249 kB -1.53 kB
withRouter.js gzip 66.9 kB 66.6 kB -238 B
Overall change 1.26 MB 1.25 MB -7.71 kB

Commit: 6b33e05

Copy link
Member

@Timer Timer left a comment

Choose a reason for hiding this comment

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

Waiting on changes as discussed on Slack.

@Timer Timer added this to the 9.0.8 milestone Oct 3, 2019
@ijjk
Copy link
Member

ijjk commented Oct 3, 2019

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
buildDuration 16.4s 16.2s -265ms
nodeModulesSize 48.3 MB 48.3 MB ⚠️ +1.68 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.js 18.1 kB 18.9 kB ⚠️ +815 B
main-HASH.js gzip 6.61 kB 6.79 kB ⚠️ +182 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
4952ddcd88e7..2b8407376.js 21.9 kB 21.9 kB
4952ddcd88e7..7376.js gzip 7.81 kB 7.81 kB
de003c3a9d30..6604acae7.js 43.2 kB 43.2 kB
de003c3a9d30..cae7.js gzip 15.5 kB 15.5 kB
framework.5b..dbaff70d3.js 125 kB 125 kB
framework.5b..70d3.js gzip 39.4 kB 39.4 kB
Overall change 210 kB 211 kB ⚠️ +815 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.module.js 16.4 kB 17.2 kB ⚠️ +735 B
main-HASH.module.js gzip 6.35 kB 6.52 kB ⚠️ +162 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..42.module.js 45.6 kB 45.6 kB
de003c3a9d30..dule.js gzip 16.5 kB 16.5 kB
framework.5b..d3.module.js 125 kB 125 kB
framework.5b..dule.js gzip 39.4 kB 39.4 kB
Overall change 189 kB 190 kB ⚠️ +735 B
Client Pages
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.js 1.81 kB 1.81 kB
_app.js gzip 873 B 873 B
_error.js 12 kB 12 kB
_error.js gzip 4.73 kB 4.73 kB
hooks.js 12.7 kB 12.7 kB
hooks.js gzip 4.79 kB 4.79 kB
index.js 318 B 318 B
index.js gzip 222 B 222 B
link.js 8.14 kB 8.14 kB
link.js gzip 3.5 kB 3.5 kB
routerDirect.js 408 B 408 B
routerDirect.js gzip 281 B 281 B
withRouter.js 419 B 419 B
withRouter.js gzip 280 B 280 B
Overall change 35.8 kB 35.8 kB
Client Pages Modern
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.module.js 1.7 kB 1.7 kB
_app.module.js gzip 832 B 832 B
_error.module.js 23.3 kB 23.3 kB
_error.module.js gzip 8.59 kB 8.59 kB
hooks.module.js 1.52 kB 1.52 kB
hooks.module.js gzip 793 B 793 B
index.module.js 294 B 294 B
index.module.js gzip 223 B 223 B
link.module.js 8.53 kB 8.53 kB
link.module.js gzip 3.68 kB 3.68 kB
routerDirect.module.js 394 B 394 B
routerDirect..dule.js gzip 281 B 281 B
withRouter.module.js 404 B 404 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 36.1 kB 36.1 kB
Client Build Manifests
zeit/next.js canary azukaru/next.js relay-analytics Change
_buildManifest.js 81 B 81 B
_buildManifest.js gzip 61 B 61 B
_buildManifest.module.js 81 B 81 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 162 B 162 B
Rendered Page Sizes
zeit/next.js canary azukaru/next.js relay-analytics Change
index.html 3.62 kB 3.62 kB
index.html gzip 948 B 945 B -3 B
link.html 3.66 kB 3.66 kB
link.html gzip 955 B 952 B -3 B
withRouter.html 3.67 kB 3.67 kB
withRouter.html gzip 943 B 941 B -2 B
Overall change 10.9 kB 10.9 kB

Diffs

Diff for main-HASH.js
@@ -417,7 +417,7 @@ exports.router = router;
 var ErrorComponent;
 exports.ErrorComponent = ErrorComponent;
 var Component;
-var App;
+var App, onPerfEntry;
 
 var Container =
 /*#__PURE__*/
@@ -490,7 +490,7 @@ function () {
   var _ref2 = (0, _asyncToGenerator2["default"])(
   /*#__PURE__*/
   _regeneratorRuntime.mark(function _callee(_temp) {
-    var _ref, passedWebpackHMR, initialErr, _require, isValidElementType, renderCtx;
+    var _ref, passedWebpackHMR, _ref3, app, mod, initialErr, _require, isValidElementType, renderCtx;
 
     return _regeneratorRuntime.wrap(function _callee$(_context) {
       while (1) {
@@ -501,52 +501,69 @@ function () {
             if (false) {}
 
             _context.next = 4;
-            return pageLoader.loadPage('/_app');
+            return pageLoader.loadPageScript('/_app');
 
           case 4:
-            App = _context.sent;
+            _ref3 = _context.sent;
+            app = _ref3.page;
+            mod = _ref3.mod;
+            App = app;
+
+            if (mod && mod.unstable_onPerformanceData) {
+              onPerfEntry = function onPerfEntry(_ref3) {
+                var entry = _ref3.entry,
+                    startTime = _ref3.startTime,
+                    value = _ref3.value;
+                mod.unstable_onPerformanceData({
+                  entry: entry,
+                  startTime: startTime,
+                  value: value
+                });
+              };
+            }
+
             initialErr = err;
-            _context.prev = 6;
-            _context.next = 9;
+            _context.prev = 10;
+            _context.next = 13;
             return pageLoader.loadPage(page);
 
-          case 9:
+          case 13:
             Component = _context.sent;
 
             if (true) {
-              _context.next = 14;
+              _context.next = 18;
               break;
             }
 
             _require = __webpack_require__(!(function webpackMissingModule() { var e = new Error("Cannot find module 'react-is'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())), isValidElementType = _require.isValidElementType;
 
             if (isValidElementType(Component)) {
-              _context.next = 14;
+              _context.next = 18;
               break;
             }
 
             throw new Error("The default export is not a React Component in page: \"" + page + "\"");
 
-          case 14:
-            _context.next = 19;
+          case 18:
+            _context.next = 23;
             break;
 
-          case 16:
-            _context.prev = 16;
-            _context.t0 = _context["catch"](6);
+          case 20:
+            _context.prev = 20;
+            _context.t0 = _context["catch"](10);
             // This catches errors like throwing in the top level of a module
             initialErr = _context.t0;
 
-          case 19:
+          case 23:
             if (!window.__NEXT_PRELOADREADY) {
-              _context.next = 22;
+              _context.next = 26;
               break;
             }
 
-            _context.next = 22;
+            _context.next = 26;
             return window.__NEXT_PRELOADREADY(dynamicIds);
 
-          case 22:
+          case 26:
             exports.router = router = (0, _router.createRouter)(page, query, asPath, {
               initialProps: props,
               pageLoader: pageLoader,
@@ -554,10 +571,10 @@ function () {
               Component: Component,
               wrapApp: wrapApp,
               err: initialErr,
-              subscription: function subscription(_ref3, App) {
-                var Component = _ref3.Component,
-                    props = _ref3.props,
-                    err = _ref3.err;
+              subscription: function subscription(_ref4, App) {
+                var Component = _ref4.Component,
+                    props = _ref4.props,
+                    err = _ref4.err;
                 render({
                   App: App,
                   Component: Component,
@@ -577,12 +594,12 @@ function () {
             render(renderCtx);
             return _context.abrupt("return", emitter);
 
-          case 26:
+          case 30:
           case "end":
             return _context.stop();
         }
       }
-    }, _callee, null, [[6, 16]]);
+    }, _callee, null, [[10, 20]]);
   }));
 
   return function (_x) {
@@ -745,6 +762,14 @@ function renderReactElement(reactEl, domEl) {
   } else {
     _reactDom["default"].render(reactEl, domEl, markRenderComplete);
   }
+
+  relayPaintMetrics();
+}
+
+function relayPaintMetrics() {
+  if (onPerfEntry) {
+    performance.getEntriesByType('paint').forEach(onPerfEntry);
+  }
 }
 
 function markHydrateComplete() {
@@ -753,6 +778,12 @@ function markHydrateComplete() {
 
   performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
   performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+
+  if (onPerfEntry) {
+    performance.getEntriesByName('Next.js-hydration').forEach(onPerfEntry);
+    performance.getEntriesByName('beforeRender').forEach(onPerfEntry);
+  }
+
   clearMarks();
 }
 
@@ -768,6 +799,12 @@ function markRenderComplete() {
 
   performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
   performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+
+  if (onPerfEntry) {
+    performance.getEntriesByName('Next.js-render').forEach(onPerfEntry);
+    performance.getEntriesByName('Next.js-route-change-to-render').forEach(onPerfEntry);
+  }
+
   clearMarks();
 }
 
@@ -776,15 +813,13 @@ function clearMarks() {
   ['beforeRender', 'afterHydrate', 'afterRender', 'routeChange'].forEach(function (mark) {
     return performance.clearMarks(mark);
   });
-  /*
-  * TODO: uncomment the following line when we have a way to
-  * expose this to user code.
-  */
-  // performance.clearMeasures()
+  ['Next.js-before-hydration', 'Next.js-hydration', 'Next.js-route-change-to-render', 'Next.js-render'].forEach(function (measure) {
+    return performance.clearMeasures(measure);
+  });
 }
 
-function AppContainer(_ref4) {
-  var children = _ref4.children;
+function AppContainer(_ref5) {
+  var children = _ref5.children;
   return _react["default"].createElement(Container, {
     fn: function fn(error) {
       return renderError({
@@ -821,14 +856,14 @@ function doRender(_x4) {
 function _doRender() {
   _doRender = (0, _asyncToGenerator2["default"])(
   /*#__PURE__*/
-  _regeneratorRuntime.mark(function _callee4(_ref5) {
+  _regeneratorRuntime.mark(function _callee4(_ref6) {
     var App, Component, props, err, _router2, pathname, _query, _asPath, AppTree, appCtx, appProps;
 
     return _regeneratorRuntime.wrap(function _callee4$(_context4) {
       while (1) {
         switch (_context4.prev = _context4.next) {
           case 0:
-            App = _ref5.App, Component = _ref5.Component, props = _ref5.props, err = _ref5.err; // Usual getInitialProps fetching is handled in next/router
+            App = _ref6.App, Component = _ref6.Component, props = _ref6.props, err = _ref6.err; // Usual getInitialProps fetching is handled in next/router
             // this is for when ErrorComponent gets replaced by Component by HMR
 
             if (!(!props && Component && Component !== ErrorComponent && lastAppProps.Component === ErrorComponent)) {
@@ -1472,13 +1507,21 @@ function () {
   }, {
     key: "loadPage",
     value: function loadPage(route) {
+      return this.loadPageScript(route).then(function (v) {
+        return v.page;
+      });
+    }
+  }, {
+    key: "loadPageScript",
+    value: function loadPageScript(route) {
       var _this3 = this;
 
       route = this.normalizeRoute(route);
       return new _promise["default"](function (resolve, reject) {
         var fire = function fire(_ref) {
           var error = _ref.error,
-              page = _ref.page;
+              page = _ref.page,
+              mod = _ref.mod;
 
           _this3.pageRegisterEvents.off(route, fire);
 
@@ -1487,7 +1530,10 @@ function () {
           if (error) {
             reject(error);
           } else {
-            resolve(page);
+            resolve({
+              page: page,
+              mod: mod
+            });
           }
         }; // If there's a cached version of the page, let's use it.
 
@@ -1496,8 +1542,12 @@ function () {
 
         if (cachedPage) {
           var error = cachedPage.error,
-              page = cachedPage.page;
-          error ? reject(error) : resolve(page);
+              page = cachedPage.page,
+              mod = cachedPage.mod;
+          error ? reject(error) : resolve({
+            page: page,
+            mod: mod
+          });
           return;
         } // Register a listener to get the page
Diff for main-HASH.module.js
@@ -473,7 +473,7 @@ exports.router = router;
 let ErrorComponent;
 exports.ErrorComponent = ErrorComponent;
 let Component;
-let App;
+let App, onPerfEntry;
 
 class Container extends _react.default.Component {
   componentDidCatch(err, info) {
@@ -531,7 +531,27 @@ function () {
 
     if (false) {}
 
-    App = yield pageLoader.loadPage('/_app');
+    const {
+      page: app,
+      mod
+    } = yield pageLoader.loadPageScript('/_app');
+    App = app;
+
+    if (mod && mod.unstable_onPerformanceData) {
+      onPerfEntry = function onPerfEntry(_ref3) {
+        let {
+          entry,
+          startTime,
+          value
+        } = _ref3;
+        mod.unstable_onPerformanceData({
+          entry,
+          startTime,
+          value
+        });
+      };
+    }
+
     let initialErr = err;
 
     try {
@@ -554,12 +574,12 @@ function () {
       Component,
       wrapApp,
       err: initialErr,
-      subscription: (_ref3, App) => {
+      subscription: (_ref4, App) => {
         let {
           Component,
           props,
           err
-        } = _ref3;
+        } = _ref4;
         render({
           App,
           Component,
@@ -672,6 +692,14 @@ function renderReactElement(reactEl, domEl) {
   } else {
     _reactDom.default.render(reactEl, domEl, markRenderComplete);
   }
+
+  relayPaintMetrics();
+}
+
+function relayPaintMetrics() {
+  if (onPerfEntry) {
+    performance.getEntriesByType('paint').forEach(onPerfEntry);
+  }
 }
 
 function markHydrateComplete() {
@@ -680,6 +708,12 @@ function markHydrateComplete() {
 
   performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
   performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+
+  if (onPerfEntry) {
+    performance.getEntriesByName('Next.js-hydration').forEach(onPerfEntry);
+    performance.getEntriesByName('beforeRender').forEach(onPerfEntry);
+  }
+
   clearMarks();
 }
 
@@ -695,23 +729,25 @@ function markRenderComplete() {
 
   performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
   performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+
+  if (onPerfEntry) {
+    performance.getEntriesByName('Next.js-render').forEach(onPerfEntry);
+    performance.getEntriesByName('Next.js-route-change-to-render').forEach(onPerfEntry);
+  }
+
   clearMarks();
 }
 
 function clearMarks() {
   ;
   ['beforeRender', 'afterHydrate', 'afterRender', 'routeChange'].forEach(mark => performance.clearMarks(mark));
-  /*
-  * TODO: uncomment the following line when we have a way to
-  * expose this to user code.
-  */
-  // performance.clearMeasures()
+  ['Next.js-before-hydration', 'Next.js-hydration', 'Next.js-route-change-to-render', 'Next.js-render'].forEach(measure => performance.clearMeasures(measure));
 }
 
-function AppContainer(_ref4) {
+function AppContainer(_ref5) {
   let {
     children
-  } = _ref4;
+  } = _ref5;
   return _react.default.createElement(Container, {
     fn: error => renderError({
       App,
@@ -740,13 +776,13 @@ function doRender(_x4) {
 }
 
 function _doRender() {
-  _doRender = (0, _asyncToGenerator2.default)(function* (_ref5) {
+  _doRender = (0, _asyncToGenerator2.default)(function* (_ref6) {
     let {
       App,
       Component,
       props,
       err
-    } = _ref5; // Usual getInitialProps fetching is handled in next/router
+    } = _ref6; // Usual getInitialProps fetching is handled in next/router
     // this is for when ErrorComponent gets replaced by Component by HMR
 
     if (!props && Component && Component !== ErrorComponent && lastAppProps.Component === ErrorComponent) {
@@ -1371,12 +1407,17 @@ class PageLoader {
   }
 
   loadPage(route) {
+    return this.loadPageScript(route).then(v => v.page);
+  }
+
+  loadPageScript(route) {
     route = this.normalizeRoute(route);
     return new _promise.default((resolve, reject) => {
       const fire = _ref => {
         let {
           error,
-          page
+          page,
+          mod
         } = _ref;
         this.pageRegisterEvents.off(route, fire);
         delete this.loadingRoutes[route];
@@ -1384,7 +1425,10 @@ class PageLoader {
         if (error) {
           reject(error);
         } else {
-          resolve(page);
+          resolve({
+            page,
+            mod
+          });
         }
       }; // If there's a cached version of the page, let's use it.
 
@@ -1394,9 +1438,13 @@ class PageLoader {
       if (cachedPage) {
         const {
           error,
-          page
+          page,
+          mod
         } = cachedPage;
-        error ? reject(error) : resolve(page);
+        error ? reject(error) : resolve({
+          page,
+          mod
+        });
         return;
       } // Register a listener to get the page
Diff for index.html
@@ -12,7 +12,7 @@
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-07fec87b6447d72c084b.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-36e5d9061282fdca1f38.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
@@ -43,9 +43,9 @@
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-edef09c027e510e38028.js"
+        <script src="/_next/static/runtime/main-4f477bfcbe6c555d0733.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-07fec87b6447d72c084b.module.js"
+        <script src="/_next/static/runtime/main-36e5d9061282fdca1f38.module.js"
         async="" crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.js"
         async="" crossorigin="anonymous" nomodule=""></script>
Diff for link.html
@@ -16,7 +16,7 @@
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.119f7caa0f0e5f3f7629.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-07fec87b6447d72c084b.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-36e5d9061282fdca1f38.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/BUILD_ID/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
@@ -56,9 +56,9 @@
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.119f7caa0f0e5f3f7629.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-edef09c027e510e38028.js"
+        <script src="/_next/static/runtime/main-4f477bfcbe6c555d0733.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-07fec87b6447d72c084b.module.js"
+        <script src="/_next/static/runtime/main-36e5d9061282fdca1f38.module.js"
         async="" crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/BUILD_ID/_buildManifest.js" async=""
         crossorigin="anonymous" nomodule=""></script>
Diff for withRouter.html
@@ -16,7 +16,7 @@
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.119f7caa0f0e5f3f7629.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-07fec87b6447d72c084b.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-36e5d9061282fdca1f38.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/BUILD_ID/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
@@ -54,9 +54,9 @@
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.119f7caa0f0e5f3f7629.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-edef09c027e510e38028.js"
+        <script src="/_next/static/runtime/main-4f477bfcbe6c555d0733.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-07fec87b6447d72c084b.module.js"
+        <script src="/_next/static/runtime/main-36e5d9061282fdca1f38.module.js"
         async="" crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/BUILD_ID/_buildManifest.js" async=""
         crossorigin="anonymous" nomodule=""></script>

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
buildDuration 16.9s 16.7s -225ms
nodeModulesSize 48.3 MB 48.3 MB ⚠️ +1.68 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.js 18.1 kB 18.9 kB ⚠️ +815 B
main-HASH.js gzip 6.61 kB 6.79 kB ⚠️ +182 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
4952ddcd88e7..2b8407376.js 21.9 kB 21.9 kB
4952ddcd88e7..7376.js gzip 7.81 kB 7.81 kB
de003c3a9d30..6604acae7.js 43.2 kB 43.2 kB
de003c3a9d30..cae7.js gzip 15.5 kB 15.5 kB
framework.5b..dbaff70d3.js 125 kB 125 kB
framework.5b..70d3.js gzip 39.4 kB 39.4 kB
Overall change 210 kB 211 kB ⚠️ +815 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.module.js 16.4 kB 17.2 kB ⚠️ +735 B
main-HASH.module.js gzip 6.35 kB 6.52 kB ⚠️ +162 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..42.module.js 45.6 kB 45.6 kB
de003c3a9d30..dule.js gzip 16.5 kB 16.5 kB
framework.5b..d3.module.js 125 kB 125 kB
framework.5b..dule.js gzip 39.4 kB 39.4 kB
Overall change 189 kB 190 kB ⚠️ +735 B
Client Pages
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.js 1.81 kB 1.81 kB
_app.js gzip 873 B 873 B
_error.js 12 kB 12 kB
_error.js gzip 4.73 kB 4.73 kB
hooks.js 12.7 kB 12.7 kB
hooks.js gzip 4.79 kB 4.79 kB
index.js 318 B 318 B
index.js gzip 222 B 222 B
link.js 8.14 kB 8.14 kB
link.js gzip 3.5 kB 3.5 kB
routerDirect.js 408 B 408 B
routerDirect.js gzip 281 B 281 B
withRouter.js 419 B 419 B
withRouter.js gzip 280 B 280 B
Overall change 35.8 kB 35.8 kB
Client Pages Modern
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.module.js 1.7 kB 1.7 kB
_app.module.js gzip 832 B 832 B
_error.module.js 23.3 kB 23.3 kB
_error.module.js gzip 8.59 kB 8.59 kB
hooks.module.js 1.52 kB 1.52 kB
hooks.module.js gzip 793 B 793 B
index.module.js 294 B 294 B
index.module.js gzip 223 B 223 B
link.module.js 8.53 kB 8.53 kB
link.module.js gzip 3.68 kB 3.68 kB
routerDirect.module.js 394 B 394 B
routerDirect..dule.js gzip 281 B 281 B
withRouter.module.js 404 B 404 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 36.1 kB 36.1 kB
Client Build Manifests
zeit/next.js canary azukaru/next.js relay-analytics Change
_buildManifest.js 81 B 81 B
_buildManifest.js gzip 61 B 61 B
_buildManifest.module.js 81 B 81 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 162 B 162 B
Serverless bundles
zeit/next.js canary azukaru/next.js relay-analytics Change
_error.js 253 kB 253 kB
_error.js gzip 67.9 kB 67.9 kB -3 B
hooks.html 3.75 kB 3.75 kB
hooks.html gzip 980 B 978 B -2 B
index.js 254 kB 254 kB
index.js gzip 68.2 kB 68.2 kB -4 B
link.js 261 kB 261 kB
link.js gzip 70.3 kB 70.3 kB -4 B
routerDirect.js 255 kB 255 kB
routerDirect.js gzip 68.3 kB 68.3 kB -3 B
withRouter.js 254 kB 254 kB
withRouter.js gzip 68.4 kB 68.4 kB -4 B
Overall change 1.28 MB 1.28 MB

Commit: c97c142

@prateekbh
Copy link
Contributor Author

done

@Timer Timer changed the title Relays client side analytics to user code Add unstable_onPerformanceData helper for performance entries Oct 3, 2019
Copy link
Member

@Timer Timer left a comment

Choose a reason for hiding this comment

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

Great!

@ijjk
Copy link
Member

ijjk commented Oct 3, 2019

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
buildDuration 14.7s 14.7s ⚠️ +31ms
nodeModulesSize 48.3 MB 48.3 MB ⚠️ +1.68 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.js 18.1 kB 18.9 kB ⚠️ +813 B
main-HASH.js gzip 6.61 kB 6.79 kB ⚠️ +181 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
4952ddcd88e7..2b8407376.js 21.9 kB 21.9 kB
4952ddcd88e7..7376.js gzip 7.81 kB 7.81 kB
de003c3a9d30..6604acae7.js 43.2 kB 43.2 kB
de003c3a9d30..cae7.js gzip 15.5 kB 15.5 kB
framework.5b..dbaff70d3.js 125 kB 125 kB
framework.5b..70d3.js gzip 39.4 kB 39.4 kB
Overall change 210 kB 211 kB ⚠️ +813 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.module.js 16.4 kB 17.2 kB ⚠️ +733 B
main-HASH.module.js gzip 6.35 kB 6.52 kB ⚠️ +162 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..42.module.js 45.6 kB 45.6 kB
de003c3a9d30..dule.js gzip 16.5 kB 16.5 kB
framework.5b..d3.module.js 125 kB 125 kB
framework.5b..dule.js gzip 39.4 kB 39.4 kB
Overall change 189 kB 190 kB ⚠️ +733 B
Client Pages
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.js 1.81 kB 1.81 kB
_app.js gzip 873 B 873 B
_error.js 12 kB 12 kB
_error.js gzip 4.73 kB 4.73 kB
hooks.js 12.7 kB 12.7 kB
hooks.js gzip 4.79 kB 4.79 kB
index.js 318 B 318 B
index.js gzip 222 B 222 B
link.js 8.14 kB 8.14 kB
link.js gzip 3.5 kB 3.5 kB
routerDirect.js 408 B 408 B
routerDirect.js gzip 281 B 281 B
withRouter.js 419 B 419 B
withRouter.js gzip 280 B 280 B
Overall change 35.8 kB 35.8 kB
Client Pages Modern
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.module.js 1.7 kB 1.7 kB
_app.module.js gzip 832 B 832 B
_error.module.js 23.3 kB 23.3 kB
_error.module.js gzip 8.59 kB 8.59 kB
hooks.module.js 1.52 kB 1.52 kB
hooks.module.js gzip 793 B 793 B
index.module.js 294 B 294 B
index.module.js gzip 223 B 223 B
link.module.js 8.53 kB 8.53 kB
link.module.js gzip 3.68 kB 3.68 kB
routerDirect.module.js 394 B 394 B
routerDirect..dule.js gzip 281 B 281 B
withRouter.module.js 404 B 404 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 36.1 kB 36.1 kB
Client Build Manifests
zeit/next.js canary azukaru/next.js relay-analytics Change
_buildManifest.js 81 B 81 B
_buildManifest.js gzip 61 B 61 B
_buildManifest.module.js 81 B 81 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 162 B 162 B
Rendered Page Sizes
zeit/next.js canary azukaru/next.js relay-analytics Change
index.html 3.62 kB 3.62 kB
index.html gzip 948 B 947 B -1 B
link.html 3.66 kB 3.66 kB
link.html gzip 955 B 954 B -1 B
withRouter.html 3.67 kB 3.67 kB
withRouter.html gzip 943 B 942 B -1 B
Overall change 10.9 kB 10.9 kB

Diffs

Diff for main-HASH.js
@@ -417,7 +417,7 @@ exports.router = router;
 var ErrorComponent;
 exports.ErrorComponent = ErrorComponent;
 var Component;
-var App;
+var App, onPerfEntry;
 
 var Container =
 /*#__PURE__*/
@@ -490,7 +490,7 @@ function () {
   var _ref2 = (0, _asyncToGenerator2["default"])(
   /*#__PURE__*/
   _regeneratorRuntime.mark(function _callee(_temp) {
-    var _ref, passedWebpackHMR, initialErr, _require, isValidElementType, renderCtx;
+    var _ref, passedWebpackHMR, _ref3, app, mod, initialErr, _require, isValidElementType, renderCtx;
 
     return _regeneratorRuntime.wrap(function _callee$(_context) {
       while (1) {
@@ -501,52 +501,69 @@ function () {
             if (false) {}
 
             _context.next = 4;
-            return pageLoader.loadPage('/_app');
+            return pageLoader.loadPageScript('/_app');
 
           case 4:
-            App = _context.sent;
+            _ref3 = _context.sent;
+            app = _ref3.page;
+            mod = _ref3.mod;
+            App = app;
+
+            if (mod && mod.unstable_onPerformanceData) {
+              onPerfEntry = function onPerfEntry(_ref3) {
+                var name = _ref3.name,
+                    startTime = _ref3.startTime,
+                    value = _ref3.value;
+                mod.unstable_onPerformanceData({
+                  name: name,
+                  startTime: startTime,
+                  value: value
+                });
+              };
+            }
+
             initialErr = err;
-            _context.prev = 6;
-            _context.next = 9;
+            _context.prev = 10;
+            _context.next = 13;
             return pageLoader.loadPage(page);
 
-          case 9:
+          case 13:
             Component = _context.sent;
 
             if (true) {
-              _context.next = 14;
+              _context.next = 18;
               break;
             }
 
             _require = __webpack_require__(!(function webpackMissingModule() { var e = new Error("Cannot find module 'react-is'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())), isValidElementType = _require.isValidElementType;
 
             if (isValidElementType(Component)) {
-              _context.next = 14;
+              _context.next = 18;
               break;
             }
 
             throw new Error("The default export is not a React Component in page: \"" + page + "\"");
 
-          case 14:
-            _context.next = 19;
+          case 18:
+            _context.next = 23;
             break;
 
-          case 16:
-            _context.prev = 16;
-            _context.t0 = _context["catch"](6);
+          case 20:
+            _context.prev = 20;
+            _context.t0 = _context["catch"](10);
             // This catches errors like throwing in the top level of a module
             initialErr = _context.t0;
 
-          case 19:
+          case 23:
             if (!window.__NEXT_PRELOADREADY) {
-              _context.next = 22;
+              _context.next = 26;
               break;
             }
 
-            _context.next = 22;
+            _context.next = 26;
             return window.__NEXT_PRELOADREADY(dynamicIds);
 
-          case 22:
+          case 26:
             exports.router = router = (0, _router.createRouter)(page, query, asPath, {
               initialProps: props,
               pageLoader: pageLoader,
@@ -554,10 +571,10 @@ function () {
               Component: Component,
               wrapApp: wrapApp,
               err: initialErr,
-              subscription: function subscription(_ref3, App) {
-                var Component = _ref3.Component,
-                    props = _ref3.props,
-                    err = _ref3.err;
+              subscription: function subscription(_ref4, App) {
+                var Component = _ref4.Component,
+                    props = _ref4.props,
+                    err = _ref4.err;
                 render({
                   App: App,
                   Component: Component,
@@ -577,12 +594,12 @@ function () {
             render(renderCtx);
             return _context.abrupt("return", emitter);
 
-          case 26:
+          case 30:
           case "end":
             return _context.stop();
         }
       }
-    }, _callee, null, [[6, 16]]);
+    }, _callee, null, [[10, 20]]);
   }));
 
   return function (_x) {
@@ -745,6 +762,14 @@ function renderReactElement(reactEl, domEl) {
   } else {
     _reactDom["default"].render(reactEl, domEl, markRenderComplete);
   }
+
+  relayPaintMetrics();
+}
+
+function relayPaintMetrics() {
+  if (onPerfEntry) {
+    performance.getEntriesByType('paint').forEach(onPerfEntry);
+  }
 }
 
 function markHydrateComplete() {
@@ -753,6 +778,12 @@ function markHydrateComplete() {
 
   performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
   performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+
+  if (onPerfEntry) {
+    performance.getEntriesByName('Next.js-hydration').forEach(onPerfEntry);
+    performance.getEntriesByName('beforeRender').forEach(onPerfEntry);
+  }
+
   clearMarks();
 }
 
@@ -768,6 +799,12 @@ function markRenderComplete() {
 
   performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
   performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+
+  if (onPerfEntry) {
+    performance.getEntriesByName('Next.js-render').forEach(onPerfEntry);
+    performance.getEntriesByName('Next.js-route-change-to-render').forEach(onPerfEntry);
+  }
+
   clearMarks();
 }
 
@@ -776,15 +813,13 @@ function clearMarks() {
   ['beforeRender', 'afterHydrate', 'afterRender', 'routeChange'].forEach(function (mark) {
     return performance.clearMarks(mark);
   });
-  /*
-  * TODO: uncomment the following line when we have a way to
-  * expose this to user code.
-  */
-  // performance.clearMeasures()
+  ['Next.js-before-hydration', 'Next.js-hydration', 'Next.js-route-change-to-render', 'Next.js-render'].forEach(function (measure) {
+    return performance.clearMeasures(measure);
+  });
 }
 
-function AppContainer(_ref4) {
-  var children = _ref4.children;
+function AppContainer(_ref5) {
+  var children = _ref5.children;
   return _react["default"].createElement(Container, {
     fn: function fn(error) {
       return renderError({
@@ -821,14 +856,14 @@ function doRender(_x4) {
 function _doRender() {
   _doRender = (0, _asyncToGenerator2["default"])(
   /*#__PURE__*/
-  _regeneratorRuntime.mark(function _callee4(_ref5) {
+  _regeneratorRuntime.mark(function _callee4(_ref6) {
     var App, Component, props, err, _router2, pathname, _query, _asPath, AppTree, appCtx, appProps;
 
     return _regeneratorRuntime.wrap(function _callee4$(_context4) {
       while (1) {
         switch (_context4.prev = _context4.next) {
           case 0:
-            App = _ref5.App, Component = _ref5.Component, props = _ref5.props, err = _ref5.err; // Usual getInitialProps fetching is handled in next/router
+            App = _ref6.App, Component = _ref6.Component, props = _ref6.props, err = _ref6.err; // Usual getInitialProps fetching is handled in next/router
             // this is for when ErrorComponent gets replaced by Component by HMR
 
             if (!(!props && Component && Component !== ErrorComponent && lastAppProps.Component === ErrorComponent)) {
@@ -1472,13 +1507,21 @@ function () {
   }, {
     key: "loadPage",
     value: function loadPage(route) {
+      return this.loadPageScript(route).then(function (v) {
+        return v.page;
+      });
+    }
+  }, {
+    key: "loadPageScript",
+    value: function loadPageScript(route) {
       var _this3 = this;
 
       route = this.normalizeRoute(route);
       return new _promise["default"](function (resolve, reject) {
         var fire = function fire(_ref) {
           var error = _ref.error,
-              page = _ref.page;
+              page = _ref.page,
+              mod = _ref.mod;
 
           _this3.pageRegisterEvents.off(route, fire);
 
@@ -1487,7 +1530,10 @@ function () {
           if (error) {
             reject(error);
           } else {
-            resolve(page);
+            resolve({
+              page: page,
+              mod: mod
+            });
           }
         }; // If there's a cached version of the page, let's use it.
 
@@ -1496,8 +1542,12 @@ function () {
 
         if (cachedPage) {
           var error = cachedPage.error,
-              page = cachedPage.page;
-          error ? reject(error) : resolve(page);
+              page = cachedPage.page,
+              mod = cachedPage.mod;
+          error ? reject(error) : resolve({
+            page: page,
+            mod: mod
+          });
           return;
         } // Register a listener to get the page
Diff for main-HASH.module.js
@@ -473,7 +473,7 @@ exports.router = router;
 let ErrorComponent;
 exports.ErrorComponent = ErrorComponent;
 let Component;
-let App;
+let App, onPerfEntry;
 
 class Container extends _react.default.Component {
   componentDidCatch(err, info) {
@@ -531,7 +531,27 @@ function () {
 
     if (false) {}
 
-    App = yield pageLoader.loadPage('/_app');
+    const {
+      page: app,
+      mod
+    } = yield pageLoader.loadPageScript('/_app');
+    App = app;
+
+    if (mod && mod.unstable_onPerformanceData) {
+      onPerfEntry = function onPerfEntry(_ref3) {
+        let {
+          name,
+          startTime,
+          value
+        } = _ref3;
+        mod.unstable_onPerformanceData({
+          name,
+          startTime,
+          value
+        });
+      };
+    }
+
     let initialErr = err;
 
     try {
@@ -554,12 +574,12 @@ function () {
       Component,
       wrapApp,
       err: initialErr,
-      subscription: (_ref3, App) => {
+      subscription: (_ref4, App) => {
         let {
           Component,
           props,
           err
-        } = _ref3;
+        } = _ref4;
         render({
           App,
           Component,
@@ -672,6 +692,14 @@ function renderReactElement(reactEl, domEl) {
   } else {
     _reactDom.default.render(reactEl, domEl, markRenderComplete);
   }
+
+  relayPaintMetrics();
+}
+
+function relayPaintMetrics() {
+  if (onPerfEntry) {
+    performance.getEntriesByType('paint').forEach(onPerfEntry);
+  }
 }
 
 function markHydrateComplete() {
@@ -680,6 +708,12 @@ function markHydrateComplete() {
 
   performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
   performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+
+  if (onPerfEntry) {
+    performance.getEntriesByName('Next.js-hydration').forEach(onPerfEntry);
+    performance.getEntriesByName('beforeRender').forEach(onPerfEntry);
+  }
+
   clearMarks();
 }
 
@@ -695,23 +729,25 @@ function markRenderComplete() {
 
   performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
   performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+
+  if (onPerfEntry) {
+    performance.getEntriesByName('Next.js-render').forEach(onPerfEntry);
+    performance.getEntriesByName('Next.js-route-change-to-render').forEach(onPerfEntry);
+  }
+
   clearMarks();
 }
 
 function clearMarks() {
   ;
   ['beforeRender', 'afterHydrate', 'afterRender', 'routeChange'].forEach(mark => performance.clearMarks(mark));
-  /*
-  * TODO: uncomment the following line when we have a way to
-  * expose this to user code.
-  */
-  // performance.clearMeasures()
+  ['Next.js-before-hydration', 'Next.js-hydration', 'Next.js-route-change-to-render', 'Next.js-render'].forEach(measure => performance.clearMeasures(measure));
 }
 
-function AppContainer(_ref4) {
+function AppContainer(_ref5) {
   let {
     children
-  } = _ref4;
+  } = _ref5;
   return _react.default.createElement(Container, {
     fn: error => renderError({
       App,
@@ -740,13 +776,13 @@ function doRender(_x4) {
 }
 
 function _doRender() {
-  _doRender = (0, _asyncToGenerator2.default)(function* (_ref5) {
+  _doRender = (0, _asyncToGenerator2.default)(function* (_ref6) {
     let {
       App,
       Component,
       props,
       err
-    } = _ref5; // Usual getInitialProps fetching is handled in next/router
+    } = _ref6; // Usual getInitialProps fetching is handled in next/router
     // this is for when ErrorComponent gets replaced by Component by HMR
 
     if (!props && Component && Component !== ErrorComponent && lastAppProps.Component === ErrorComponent) {
@@ -1371,12 +1407,17 @@ class PageLoader {
   }
 
   loadPage(route) {
+    return this.loadPageScript(route).then(v => v.page);
+  }
+
+  loadPageScript(route) {
     route = this.normalizeRoute(route);
     return new _promise.default((resolve, reject) => {
       const fire = _ref => {
         let {
           error,
-          page
+          page,
+          mod
         } = _ref;
         this.pageRegisterEvents.off(route, fire);
         delete this.loadingRoutes[route];
@@ -1384,7 +1425,10 @@ class PageLoader {
         if (error) {
           reject(error);
         } else {
-          resolve(page);
+          resolve({
+            page,
+            mod
+          });
         }
       }; // If there's a cached version of the page, let's use it.
 
@@ -1394,9 +1438,13 @@ class PageLoader {
       if (cachedPage) {
         const {
           error,
-          page
+          page,
+          mod
         } = cachedPage;
-        error ? reject(error) : resolve(page);
+        error ? reject(error) : resolve({
+          page,
+          mod
+        });
         return;
       } // Register a listener to get the page
Diff for index.html
@@ -12,7 +12,7 @@
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-07fec87b6447d72c084b.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-006fa57c6c62f931d38d.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.cdb73e402d876d4ac87f.module.js"
         as="script" crossorigin="anonymous" />
@@ -43,9 +43,9 @@
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/runtime/webpack-7928590be3ef2e55b835.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-edef09c027e510e38028.js"
+        <script src="/_next/static/runtime/main-94e8f065677622433517.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-07fec87b6447d72c084b.module.js"
+        <script src="/_next/static/runtime/main-006fa57c6c62f931d38d.module.js"
         async="" crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/chunks/framework.cdb73e402d876d4ac87f.js"
         async="" crossorigin="anonymous" nomodule=""></script>
Diff for link.html
@@ -16,7 +16,7 @@
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.119f7caa0f0e5f3f7629.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-07fec87b6447d72c084b.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-006fa57c6c62f931d38d.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/BUILD_ID/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
@@ -56,9 +56,9 @@
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.119f7caa0f0e5f3f7629.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-edef09c027e510e38028.js"
+        <script src="/_next/static/runtime/main-94e8f065677622433517.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-07fec87b6447d72c084b.module.js"
+        <script src="/_next/static/runtime/main-006fa57c6c62f931d38d.module.js"
         async="" crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/BUILD_ID/_buildManifest.js" async=""
         crossorigin="anonymous" nomodule=""></script>
Diff for withRouter.html
@@ -16,7 +16,7 @@
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.119f7caa0f0e5f3f7629.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-07fec87b6447d72c084b.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-006fa57c6c62f931d38d.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/BUILD_ID/_buildManifest.module.js"
         as="script" crossorigin="anonymous" />
@@ -54,9 +54,9 @@
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.119f7caa0f0e5f3f7629.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-edef09c027e510e38028.js"
+        <script src="/_next/static/runtime/main-94e8f065677622433517.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-07fec87b6447d72c084b.module.js"
+        <script src="/_next/static/runtime/main-006fa57c6c62f931d38d.module.js"
         async="" crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/BUILD_ID/_buildManifest.js" async=""
         crossorigin="anonymous" nomodule=""></script>

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
buildDuration 14.9s 14.8s -89ms
nodeModulesSize 48.3 MB 48.3 MB ⚠️ +1.68 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.js 18.1 kB 18.9 kB ⚠️ +813 B
main-HASH.js gzip 6.61 kB 6.79 kB ⚠️ +181 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
4952ddcd88e7..2b8407376.js 21.9 kB 21.9 kB
4952ddcd88e7..7376.js gzip 7.81 kB 7.81 kB
de003c3a9d30..6604acae7.js 43.2 kB 43.2 kB
de003c3a9d30..cae7.js gzip 15.5 kB 15.5 kB
framework.5b..dbaff70d3.js 125 kB 125 kB
framework.5b..70d3.js gzip 39.4 kB 39.4 kB
Overall change 210 kB 211 kB ⚠️ +813 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
zeit/next.js canary azukaru/next.js relay-analytics Change
main-HASH.module.js 16.4 kB 17.2 kB ⚠️ +733 B
main-HASH.module.js gzip 6.35 kB 6.52 kB ⚠️ +162 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH..dule.js gzip 746 B 746 B
de003c3a9d30..42.module.js 45.6 kB 45.6 kB
de003c3a9d30..dule.js gzip 16.5 kB 16.5 kB
framework.5b..d3.module.js 125 kB 125 kB
framework.5b..dule.js gzip 39.4 kB 39.4 kB
Overall change 189 kB 190 kB ⚠️ +733 B
Client Pages
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.js 1.81 kB 1.81 kB
_app.js gzip 873 B 873 B
_error.js 12 kB 12 kB
_error.js gzip 4.73 kB 4.73 kB
hooks.js 12.7 kB 12.7 kB
hooks.js gzip 4.79 kB 4.79 kB
index.js 318 B 318 B
index.js gzip 222 B 222 B
link.js 8.14 kB 8.14 kB
link.js gzip 3.5 kB 3.5 kB
routerDirect.js 408 B 408 B
routerDirect.js gzip 281 B 281 B
withRouter.js 419 B 419 B
withRouter.js gzip 280 B 280 B
Overall change 35.8 kB 35.8 kB
Client Pages Modern
zeit/next.js canary azukaru/next.js relay-analytics Change
_app.module.js 1.7 kB 1.7 kB
_app.module.js gzip 832 B 832 B
_error.module.js 23.3 kB 23.3 kB
_error.module.js gzip 8.59 kB 8.59 kB
hooks.module.js 1.52 kB 1.52 kB
hooks.module.js gzip 793 B 793 B
index.module.js 294 B 294 B
index.module.js gzip 223 B 223 B
link.module.js 8.53 kB 8.53 kB
link.module.js gzip 3.68 kB 3.68 kB
routerDirect.module.js 394 B 394 B
routerDirect..dule.js gzip 281 B 281 B
withRouter.module.js 404 B 404 B
withRouter.m..dule.js gzip 278 B 278 B
Overall change 36.1 kB 36.1 kB
Client Build Manifests
zeit/next.js canary azukaru/next.js relay-analytics Change
_buildManifest.js 81 B 81 B
_buildManifest.js gzip 61 B 61 B
_buildManifest.module.js 81 B 81 B
_buildManife..dule.js gzip 61 B 61 B
Overall change 162 B 162 B
Serverless bundles
zeit/next.js canary azukaru/next.js relay-analytics Change
_error.js 253 kB 253 kB
_error.js gzip 67.9 kB 67.9 kB -2 B
hooks.html 3.75 kB 3.75 kB
hooks.html gzip 980 B 980 B
index.js 254 kB 254 kB
index.js gzip 68.2 kB 68.2 kB -2 B
link.js 261 kB 261 kB
link.js gzip 70.3 kB 70.3 kB -3 B
routerDirect.js 255 kB 255 kB
routerDirect.js gzip 68.3 kB 68.3 kB -2 B
withRouter.js 254 kB 254 kB
withRouter.js gzip 68.4 kB 68.4 kB -2 B
Overall change 1.28 MB 1.28 MB

Commit: ef1609d

@Timer Timer merged commit 5929e9d into vercel:canary Oct 3, 2019
@vercel vercel locked as resolved and limited conversation to collaborators Feb 1, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[RFC] Send client side performance data to user land code.
5 participants