Skip to content

Commit

Permalink
v10.0.2-canary.12
Browse files Browse the repository at this point in the history
  • Loading branch information
Timer committed Nov 12, 2020
1 parent c78c982 commit 88db0c7
Show file tree
Hide file tree
Showing 15 changed files with 20 additions and 20 deletions.
2 changes: 1 addition & 1 deletion lerna.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,5 @@
"registry": "https://registry.npmjs.org/"
}
},
"version": "10.0.2-canary.11"
"version": "10.0.2-canary.12"
}
2 changes: 1 addition & 1 deletion packages/create-next-app/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "create-next-app",
"version": "10.0.2-canary.11",
"version": "10.0.2-canary.12",
"keywords": [
"react",
"next",
Expand Down
2 changes: 1 addition & 1 deletion packages/eslint-plugin-next/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@next/eslint-plugin-next",
"version": "10.0.2-canary.11",
"version": "10.0.2-canary.12",
"description": "ESLint plugin for NextJS.",
"main": "lib/index.js",
"license": "MIT",
Expand Down
2 changes: 1 addition & 1 deletion packages/next-bundle-analyzer/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@next/bundle-analyzer",
"version": "10.0.2-canary.11",
"version": "10.0.2-canary.12",
"main": "index.js",
"license": "MIT",
"repository": {
Expand Down
2 changes: 1 addition & 1 deletion packages/next-codemod/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@next/codemod",
"version": "10.0.2-canary.11",
"version": "10.0.2-canary.12",
"license": "MIT",
"dependencies": {
"chalk": "4.1.0",
Expand Down
2 changes: 1 addition & 1 deletion packages/next-env/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@next/env",
"version": "10.0.2-canary.11",
"version": "10.0.2-canary.12",
"keywords": [
"react",
"next",
Expand Down
2 changes: 1 addition & 1 deletion packages/next-mdx/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@next/mdx",
"version": "10.0.2-canary.11",
"version": "10.0.2-canary.12",
"main": "index.js",
"license": "MIT",
"repository": {
Expand Down
2 changes: 1 addition & 1 deletion packages/next-plugin-google-analytics/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@next/plugin-google-analytics",
"version": "10.0.2-canary.11",
"version": "10.0.2-canary.12",
"repository": {
"url": "vercel/next.js",
"directory": "packages/next-plugin-google-analytics"
Expand Down
2 changes: 1 addition & 1 deletion packages/next-plugin-sentry/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@next/plugin-sentry",
"version": "10.0.2-canary.11",
"version": "10.0.2-canary.12",
"repository": {
"url": "vercel/next.js",
"directory": "packages/next-plugin-sentry"
Expand Down
2 changes: 1 addition & 1 deletion packages/next-plugin-storybook/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@next/plugin-storybook",
"version": "10.0.2-canary.11",
"version": "10.0.2-canary.12",
"repository": {
"url": "vercel/next.js",
"directory": "packages/next-plugin-storybook"
Expand Down
2 changes: 1 addition & 1 deletion packages/next-polyfill-module/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@next/polyfill-module",
"version": "10.0.2-canary.11",
"version": "10.0.2-canary.12",
"description": "A standard library polyfill for ES Modules supporting browsers (Edge 16+, Firefox 60+, Chrome 61+, Safari 10.1+)",
"main": "dist/polyfill-module.js",
"license": "MIT",
Expand Down
2 changes: 1 addition & 1 deletion packages/next-polyfill-nomodule/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@next/polyfill-nomodule",
"version": "10.0.2-canary.11",
"version": "10.0.2-canary.12",
"description": "A polyfill for non-dead, nomodule browsers.",
"main": "dist/polyfill-nomodule.js",
"license": "MIT",
Expand Down
12 changes: 6 additions & 6 deletions packages/next/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "next",
"version": "10.0.2-canary.11",
"version": "10.0.2-canary.12",
"description": "The React Framework",
"main": "./dist/server/next.js",
"license": "MIT",
Expand Down Expand Up @@ -63,10 +63,10 @@
"@ampproject/toolbox-optimizer": "2.7.0-alpha.1",
"@babel/runtime": "7.12.5",
"@hapi/accept": "5.0.1",
"@next/env": "10.0.2-canary.11",
"@next/polyfill-module": "10.0.2-canary.11",
"@next/react-dev-overlay": "10.0.2-canary.11",
"@next/react-refresh-utils": "10.0.2-canary.11",
"@next/env": "10.0.2-canary.12",
"@next/polyfill-module": "10.0.2-canary.12",
"@next/react-dev-overlay": "10.0.2-canary.12",
"@next/react-refresh-utils": "10.0.2-canary.12",
"ast-types": "0.13.2",
"babel-plugin-transform-define": "2.0.0",
"babel-plugin-transform-react-remove-prop-types": "0.4.24",
Expand Down Expand Up @@ -128,7 +128,7 @@
"@babel/preset-react": "7.12.5",
"@babel/preset-typescript": "7.12.1",
"@babel/types": "7.12.6",
"@next/polyfill-nomodule": "10.0.2-canary.11",
"@next/polyfill-nomodule": "10.0.2-canary.12",
"@taskr/clear": "1.1.0",
"@taskr/esnext": "1.1.0",
"@taskr/watch": "1.1.0",
Expand Down
2 changes: 1 addition & 1 deletion packages/react-dev-overlay/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@next/react-dev-overlay",
"version": "10.0.2-canary.11",
"version": "10.0.2-canary.12",
"description": "A development-only overlay for developing React applications.",
"repository": {
"url": "vercel/next.js",
Expand Down
2 changes: 1 addition & 1 deletion packages/react-refresh-utils/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@next/react-refresh-utils",
"version": "10.0.2-canary.11",
"version": "10.0.2-canary.12",
"description": "An experimental package providing utilities for React Refresh.",
"repository": {
"url": "vercel/next.js",
Expand Down

1 comment on commit 88db0c7

@ijjk
Copy link
Member

@ijjk ijjk commented on 88db0c7 Nov 12, 2020

Choose a reason for hiding this comment

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

Stats from current release

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary v9.5.5 vercel/next.js refs/heads/canary Change
buildDuration 12.6s 13.1s ⚠️ +490ms
nodeModulesSize 61.7 MB 84.8 MB ⚠️ +23.1 MB
Page Load Tests Overall decrease ⚠️
vercel/next.js canary v9.5.5 vercel/next.js refs/heads/canary Change
/ failed reqs 0 0
/ total time (seconds) 2.374 2.372 0
/ avg req/sec 1053.2 1053.94 +0.74
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.212 1.259 ⚠️ +0.05
/error-in-render avg req/sec 2063.11 1985.99 ⚠️ -77.12
Client Bundles (main, webpack, commons) Overall increase ⚠️
vercel/next.js canary v9.5.5 vercel/next.js refs/heads/canary Change
677f882d2ed8..9b19.js gzip 11.1 kB 12.6 kB ⚠️ +1.59 kB
framework.HASH.js gzip 39 kB 39 kB
main-51c1c2f..7e91.js gzip 7.23 kB N/A N/A
webpack-e067..f178.js gzip 751 B 751 B
main-43dd9e5..8439.js gzip N/A 6.48 kB N/A
Overall change 58 kB 58.8 kB ⚠️ +840 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
vercel/next.js canary v9.5.5 vercel/next.js refs/heads/canary Change
677f882d2ed8..dule.js gzip 6.9 kB N/A N/A
framework.HA..dule.js gzip 39 kB 39 kB
main-87d379f..dule.js gzip 6.29 kB N/A N/A
webpack-07c5..dule.js gzip 751 B 751 B
677f882d2ed8..dule.js gzip N/A 8.22 kB N/A
main-472f7d5..dule.js gzip N/A 5.58 kB N/A
Overall change 52.9 kB 53.5 kB ⚠️ +625 B
Legacy Client Bundles (polyfills)
vercel/next.js canary v9.5.5 vercel/next.js refs/heads/canary Change
polyfills-4b..e242.js gzip 31 kB 31 kB
Overall change 31 kB 31 kB
Client Pages Overall increase ⚠️
vercel/next.js canary v9.5.5 vercel/next.js refs/heads/canary Change
_app-9a0b9e1..b37e.js gzip 1.28 kB 1.28 kB
_error-ed1b0..8fbd.js gzip 3.44 kB 3.44 kB
hooks-89731c..c609.js gzip 887 B 887 B
index-17468f..5d83.js gzip 227 B 227 B
link-409b283..e3ab.js gzip 1.32 kB N/A N/A
routerDirect..924c.js gzip 284 B 284 B
withRouter-7..c13d.js gzip 284 B 284 B
link-d9a15a0..130a.js gzip N/A 1.57 kB N/A
Overall change 7.73 kB 7.98 kB ⚠️ +251 B
Client Pages Modern Overall increase ⚠️
vercel/next.js canary v9.5.5 vercel/next.js refs/heads/canary Change
_app-75d3a82..dule.js gzip 625 B 625 B
_error-4469a..dule.js gzip 2.29 kB 2.29 kB
hooks-cbf13f..dule.js gzip 387 B 387 B
index-b9a643..dule.js gzip 226 B 226 B
link-92d3016..dule.js gzip 1.28 kB N/A N/A
routerDirect..dule.js gzip 284 B 284 B
withRouter-f..dule.js gzip 282 B 282 B
link-973cce3..dule.js gzip N/A 1.51 kB N/A
Overall change 5.37 kB 5.6 kB ⚠️ +231 B
Client Build Manifests Overall decrease ✓
vercel/next.js canary v9.5.5 vercel/next.js refs/heads/canary Change
_buildManifest.js gzip 323 B 321 B -2 B
_buildManife..dule.js gzip 329 B 330 B ⚠️ +1 B
Overall change 652 B 651 B -1 B
Rendered Page Sizes Overall decrease ✓
vercel/next.js canary v9.5.5 vercel/next.js refs/heads/canary Change
index.html gzip 1 kB 970 B -34 B
link.html gzip 1.01 kB 977 B -35 B
withRouter.html gzip 997 B 962 B -35 B
Overall change 3.01 kB 2.91 kB -104 B

Diffs

Diff for _buildManifest.js
@@ -2,12 +2,12 @@ self.__BUILD_MANIFEST = {
   __rewrites: [],
   "/": ["static\u002Fchunks\u002Fpages\u002Findex-283eed3c1520dcc26e8d.js"],
   "/_error": [
-    "static\u002Fchunks\u002Fpages\u002F_error-a0c4519f5ca8e97fa7be.js"
+    "static\u002Fchunks\u002Fpages\u002F_error-760f653e71e48010adf7.js"
   ],
   "/hooks": [
-    "static\u002Fchunks\u002Fpages\u002Fhooks-8001dc76075832ee8949.js"
+    "static\u002Fchunks\u002Fpages\u002Fhooks-880757f1d73d6b241fc3.js"
   ],
-  "/link": ["static\u002Fchunks\u002Fpages\u002Flink-67e857671520c009f99f.js"],
+  "/link": ["static\u002Fchunks\u002Fpages\u002Flink-4218f7a274c65b7f23dd.js"],
   "/routerDirect": [
     "static\u002Fchunks\u002Fpages\u002FrouterDirect-2e9bfd441bd88cd3382e.js"
   ],
Diff for _buildManifest.module.js
@@ -4,13 +4,13 @@ self.__BUILD_MANIFEST = {
     "static\u002Fchunks\u002Fpages\u002Findex-dc79232991b9d18c3260.module.js"
   ],
   "/_error": [
-    "static\u002Fchunks\u002Fpages\u002F_error-714d7bb4196263406c6e.module.js"
+    "static\u002Fchunks\u002Fpages\u002F_error-b59ce1d1aef722bdb502.module.js"
   ],
   "/hooks": [
     "static\u002Fchunks\u002Fpages\u002Fhooks-56fa58a6f0993d7d36d7.module.js"
   ],
   "/link": [
-    "static\u002Fchunks\u002Fpages\u002Flink-1de2ef9a42400a3bd1f2.module.js"
+    "static\u002Fchunks\u002Fpages\u002Flink-cd84dab1f87965855b1c.module.js"
   ],
   "/routerDirect": [
     "static\u002Fchunks\u002Fpages\u002FrouterDirect-368af3dfef3c9cd99dc3.module.js"
Diff for link-1de2ef9..f2.module.js
@@ -76,62 +76,9 @@
 
       var _router2 = __webpack_require__("nOHt");
 
-      var cachedObserver;
-      var listeners = new Map();
-      var IntersectionObserver = true ? window.IntersectionObserver : undefined;
-      var prefetched = {};
-
-      function getObserver() {
-        // Return shared instance of IntersectionObserver if already created
-        if (cachedObserver) {
-          return cachedObserver;
-        } // Only create shared IntersectionObserver if supported in browser
-
-        if (!IntersectionObserver) {
-          return undefined;
-        }
-
-        return (cachedObserver = new IntersectionObserver(
-          entries => {
-            entries.forEach(entry => {
-              if (!listeners.has(entry.target)) {
-                return;
-              }
-
-              var cb = listeners.get(entry.target);
+      var _useIntersection = __webpack_require__("vNVm");
 
-              if (entry.isIntersecting || entry.intersectionRatio > 0) {
-                cachedObserver.unobserve(entry.target);
-                listeners.delete(entry.target);
-                cb();
-              }
-            });
-          },
-          {
-            rootMargin: "200px"
-          }
-        ));
-      }
-
-      var listenToIntersections = (el, cb) => {
-        var observer = getObserver();
-
-        if (!observer) {
-          return () => {};
-        }
-
-        observer.observe(el);
-        listeners.set(el, cb);
-        return () => {
-          try {
-            observer.unobserve(el);
-          } catch (err) {
-            console.error(err);
-          }
-
-          listeners.delete(el);
-        };
-      };
+      var prefetched = {};
 
       function prefetch(router, href, as, options) {
         if (false) {
@@ -161,7 +108,16 @@
         );
       }
 
-      function linkClicked(e, router, href, as, replace, shallow, scroll) {
+      function linkClicked(
+        e,
+        router,
+        href,
+        as,
+        replace,
+        shallow,
+        scroll,
+        locale
+      ) {
         var { nodeName } = e.currentTarget;
 
         if (
@@ -179,7 +135,8 @@
         } // replace state instead of push if prop is present
 
         router[replace ? "replace" : "push"](href, as, {
-          shallow
+          shallow,
+          locale
         }).then(success => {
           if (!success) return;
 
@@ -200,9 +157,6 @@
         }
 
         var p = props.prefetch !== false;
-
-        var [childElm, setChildElm] = _react.default.useState();
-
         var router = (0, _router2.useRouter)();
         var pathname = (router && router.pathname) || "/";
 
@@ -220,26 +174,7 @@
           };
         }, [pathname, props.href, props.as]);
 
-        _react.default.useEffect(() => {
-          if (
-            p &&
-            IntersectionObserver &&
-            childElm &&
-            childElm.tagName &&
-            (0, _router.isLocalURL)(href)
-          ) {
-            // Join on an invalid URI character
-            var isPrefetched = prefetched[href + "%" + as];
-
-            if (!isPrefetched) {
-              return listenToIntersections(childElm, () => {
-                prefetch(router, href, as);
-              });
-            }
-          }
-        }, [p, childElm, href, as, router]);
-
-        var { children, replace, shallow, scroll } = props; // Deprecated. Warning shown by propType check. If the children provided is a string (<Link>example</Link>) we wrap it in an <a> tag
+        var { children, replace, shallow, scroll, locale } = props; // Deprecated. Warning shown by propType check. If the children provided is a string (<Link>example</Link>) we wrap it in an <a> tag
 
         if (typeof children === "string") {
           children = /*#__PURE__*/ _react.default.createElement(
@@ -251,41 +186,70 @@
 
         var child = _react.Children.only(children);
 
-        var childProps = {
-          ref: el => {
-            if (el) setChildElm(el);
+        var childRef = child && typeof child === "object" && child.ref;
+        var [setIntersectionRef, isVisible] = (0,
+        _useIntersection.useIntersection)({
+          rootMargin: "200px"
+        });
+
+        var setRef = _react.default.useCallback(
+          el => {
+            setIntersectionRef(el);
 
-            if (child && typeof child === "object" && child.ref) {
-              if (typeof child.ref === "function") child.ref(el);
-              else if (typeof child.ref === "object") {
-                child.ref.current = el;
+            if (childRef) {
+              if (typeof childRef === "function") childRef(el);
+              else if (typeof childRef === "object") {
+                childRef.current = el;
               }
             }
           },
+          [childRef, setIntersectionRef]
+        );
+
+        (0, _react.useEffect)(() => {
+          var shouldPrefetch = isVisible && p && (0, _router.isLocalURL)(href);
+          var isPrefetched = prefetched[href + "%" + as];
+
+          if (shouldPrefetch && !isPrefetched) {
+            prefetch(router, href, as, {
+              locale:
+                typeof locale !== "undefined" ? locale : router && router.locale
+            });
+          }
+        }, [as, href, isVisible, locale, p, router]);
+        var childProps = {
+          ref: setRef,
           onClick: e => {
             if (child.props && typeof child.props.onClick === "function") {
               child.props.onClick(e);
             }
 
             if (!e.defaultPrevented) {
-              linkClicked(e, router, href, as, replace, shallow, scroll);
+              linkClicked(
+                e,
+                router,
+                href,
+                as,
+                replace,
+                shallow,
+                scroll,
+                locale
+              );
             }
           }
         };
 
-        if (p) {
-          childProps.onMouseEnter = e => {
-            if (!(0, _router.isLocalURL)(href)) return;
+        childProps.onMouseEnter = e => {
+          if (!(0, _router.isLocalURL)(href)) return;
 
-            if (child.props && typeof child.props.onMouseEnter === "function") {
-              child.props.onMouseEnter(e);
-            }
+          if (child.props && typeof child.props.onMouseEnter === "function") {
+            child.props.onMouseEnter(e);
+          }
 
-            prefetch(router, href, as, {
-              priority: true
-            });
-          };
-        } // If child is an <a> tag and doesn't have a href attribute, or if the 'passHref' property is
+          prefetch(router, href, as, {
+            priority: true
+          });
+        }; // If child is an <a> tag and doesn't have a href attribute, or if the 'passHref' property is
         // defined, we specify the current 'href', so that repetition is not needed by the user
 
         if (
@@ -295,7 +259,7 @@
           childProps.href = (0, _router.addBasePath)(
             (0, _router.addLocale)(
               as,
-              router && router.locale,
+              typeof locale !== "undefined" ? locale : router && router.locale,
               router && router.defaultLocale
             )
           );
@@ -307,6 +271,106 @@
       var _default = Link;
       exports.default = _default;
 
+      /***/
+    },
+
+    /***/ vNVm: /***/ function(module, exports, __webpack_require__) {
+      "use strict";
+
+      var _interopRequireDefault = __webpack_require__("TqRt");
+
+      exports.__esModule = true;
+      exports.useIntersection = useIntersection;
+
+      var _react = __webpack_require__("q1tI");
+
+      var _requestIdleCallback = _interopRequireDefault(
+        __webpack_require__("0G5g")
+      );
+
+      var hasIntersectionObserver = typeof IntersectionObserver !== "undefined";
+
+      function useIntersection(_ref) {
+        var { rootMargin, disabled } = _ref;
+        var isDisabled = disabled || !hasIntersectionObserver;
+        var unobserve = (0, _react.useRef)();
+        var [visible, setVisible] = (0, _react.useState)(false);
+        var setRef = (0, _react.useCallback)(
+          el => {
+            if (unobserve.current) {
+              unobserve.current();
+              unobserve.current = undefined;
+            }
+
+            if (isDisabled || visible) return;
+
+            if (el && el.tagName) {
+              unobserve.current = observe(
+                el,
+                isVisible => isVisible && setVisible(isVisible),
+                {
+                  rootMargin
+                }
+              );
+            }
+          },
+          [isDisabled, rootMargin, visible]
+        );
+        (0, _react.useEffect)(() => {
+          if (!hasIntersectionObserver) {
+            if (!visible)
+              (0, _requestIdleCallback.default)(() => setVisible(true));
+          }
+        }, [visible]);
+        return [setRef, visible];
+      }
+
+      function observe(element, callback, options) {
+        var { id, observer, elements } = createObserver(options);
+        elements.set(element, callback);
+        observer.observe(element);
+        return function unobserve() {
+          observer.unobserve(element); // Destroy observer when there's nothing left to watch:
+
+          if (elements.size === 0) {
+            observer.disconnect();
+            observers.delete(id);
+          }
+        };
+      }
+
+      var observers = new Map();
+
+      function createObserver(options) {
+        var id = options.rootMargin || "";
+        var instance = observers.get(id);
+
+        if (instance) {
+          return instance;
+        }
+
+        var elements = new Map();
+        var observer = new IntersectionObserver(entries => {
+          entries.forEach(entry => {
+            var callback = elements.get(entry.target);
+            var isVisible = entry.isIntersecting || entry.intersectionRatio > 0;
+
+            if (callback && isVisible) {
+              callback(isVisible);
+            }
+          });
+        }, options);
+        observers.set(
+          id,
+          (instance = {
+            id,
+            observer,
+            elements
+          })
+        );
+        return instance;
+      }
+
       /***/
     }
   },
Diff for link-67e8576..0c009f99f.js
@@ -80,62 +80,9 @@ _N_E = (window["webpackJsonp_N_E"] = window["webpackJsonp_N_E"] || []).push([
 
       var _router2 = __webpack_require__("nOHt");
 
-      var cachedObserver;
-      var listeners = new Map();
-      var IntersectionObserver = true ? window.IntersectionObserver : undefined;
-      var prefetched = {};
-
-      function getObserver() {
-        // Return shared instance of IntersectionObserver if already created
-        if (cachedObserver) {
-          return cachedObserver;
-        } // Only create shared IntersectionObserver if supported in browser
-
-        if (!IntersectionObserver) {
-          return undefined;
-        }
-
-        return (cachedObserver = new IntersectionObserver(
-          function(entries) {
-            entries.forEach(function(entry) {
-              if (!listeners.has(entry.target)) {
-                return;
-              }
+      var _useIntersection = __webpack_require__("vNVm");
 
-              var cb = listeners.get(entry.target);
-
-              if (entry.isIntersecting || entry.intersectionRatio > 0) {
-                cachedObserver.unobserve(entry.target);
-                listeners["delete"](entry.target);
-                cb();
-              }
-            });
-          },
-          {
-            rootMargin: "200px"
-          }
-        ));
-      }
-
-      var listenToIntersections = function listenToIntersections(el, cb) {
-        var observer = getObserver();
-
-        if (!observer) {
-          return function() {};
-        }
-
-        observer.observe(el);
-        listeners.set(el, cb);
-        return function() {
-          try {
-            observer.unobserve(el);
-          } catch (err) {
-            console.error(err);
-          }
-
-          listeners["delete"](el);
-        };
-      };
+      var prefetched = {};
 
       function prefetch(router, href, as, options) {
         if (false) {
@@ -165,7 +112,16 @@ _N_E = (window["webpackJsonp_N_E"] = window["webpackJsonp_N_E"] || []).push([
         );
       }
 
-      function linkClicked(e, router, href, as, replace, shallow, scroll) {
+      function linkClicked(
+        e,
+        router,
+        href,
+        as,
+        replace,
+        shallow,
+        scroll,
+        locale
+      ) {
         var nodeName = e.currentTarget.nodeName;
 
         if (
@@ -183,7 +139,8 @@ _N_E = (window["webpackJsonp_N_E"] = window["webpackJsonp_N_E"] || []).push([
         } // replace state instead of push if prop is present
 
         router[replace ? "replace" : "push"](href, as, {
-          shallow: shallow
+          shallow: shallow,
+          locale: locale
         }).then(function(success) {
           if (!success) return;
 
@@ -205,12 +162,6 @@ _N_E = (window["webpackJsonp_N_E"] = window["webpackJsonp_N_E"] || []).push([
         }
 
         var p = props.prefetch !== false;
-
-        var _react$default$useSta = _react["default"].useState(),
-          _react$default$useSta2 = _slicedToArray(_react$default$useSta, 2),
-          childElm = _react$default$useSta2[0],
-          setChildElm = _react$default$useSta2[1];
-
         var router = (0, _router2.useRouter)();
         var pathname = (router && router.pathname) || "/";
 
@@ -233,32 +184,11 @@ _N_E = (window["webpackJsonp_N_E"] = window["webpackJsonp_N_E"] || []).push([
           href = _react$default$useMem.href,
           as = _react$default$useMem.as;
 
-        _react["default"].useEffect(
-          function() {
-            if (
-              p &&
-              IntersectionObserver &&
-              childElm &&
-              childElm.tagName &&
-              (0, _router.isLocalURL)(href)
-            ) {
-              // Join on an invalid URI character
-              var isPrefetched = prefetched[href + "%" + as];
-
-              if (!isPrefetched) {
-                return listenToIntersections(childElm, function() {
-                  prefetch(router, href, as);
-                });
-              }
-            }
-          },
-          [p, childElm, href, as, router]
-        );
-
         var children = props.children,
           replace = props.replace,
           shallow = props.shallow,
-          scroll = props.scroll; // Deprecated. Warning shown by propType check. If the children provided is a string (<Link>example</Link>) we wrap it in an <a> tag
+          scroll = props.scroll,
+          locale = props.locale; // Deprecated. Warning shown by propType check. If the children provided is a string (<Link>example</Link>) we wrap it in an <a> tag
 
         if (typeof children === "string") {
           children = /*#__PURE__*/ _react["default"].createElement(
@@ -270,41 +200,79 @@ _N_E = (window["webpackJsonp_N_E"] = window["webpackJsonp_N_E"] || []).push([
 
         var child = _react.Children.only(children);
 
-        var childProps = {
-          ref: function ref(el) {
-            if (el) setChildElm(el);
+        var childRef = child && typeof child === "object" && child.ref;
 
-            if (child && typeof child === "object" && child.ref) {
-              if (typeof child.ref === "function") child.ref(el);
-              else if (typeof child.ref === "object") {
-                child.ref.current = el;
+        var _ref3 = (0, _useIntersection.useIntersection)({
+            rootMargin: "200px"
+          }),
+          _ref4 = _slicedToArray(_ref3, 2),
+          setIntersectionRef = _ref4[0],
+          isVisible = _ref4[1];
+
+        var setRef = _react["default"].useCallback(
+          function(el) {
+            setIntersectionRef(el);
+
+            if (childRef) {
+              if (typeof childRef === "function") childRef(el);
+              else if (typeof childRef === "object") {
+                childRef.current = el;
               }
             }
           },
+          [childRef, setIntersectionRef]
+        );
+
+        (0, _react.useEffect)(
+          function() {
+            var shouldPrefetch =
+              isVisible && p && (0, _router.isLocalURL)(href);
+            var isPrefetched = prefetched[href + "%" + as];
+
+            if (shouldPrefetch && !isPrefetched) {
+              prefetch(router, href, as, {
+                locale:
+                  typeof locale !== "undefined"
+                    ? locale
+                    : router && router.locale
+              });
+            }
+          },
+          [as, href, isVisible, locale, p, router]
+        );
+        var childProps = {
+          ref: setRef,
           onClick: function onClick(e) {
             if (child.props && typeof child.props.onClick === "function") {
               child.props.onClick(e);
             }
 
             if (!e.defaultPrevented) {
-              linkClicked(e, router, href, as, replace, shallow, scroll);
+              linkClicked(
+                e,
+                router,
+                href,
+                as,
+                replace,
+                shallow,
+                scroll,
+                locale
+              );
             }
           }
         };
 
-        if (p) {
-          childProps.onMouseEnter = function(e) {
-            if (!(0, _router.isLocalURL)(href)) return;
+        childProps.onMouseEnter = function(e) {
+          if (!(0, _router.isLocalURL)(href)) return;
 
-            if (child.props && typeof child.props.onMouseEnter === "function") {
-              child.props.onMouseEnter(e);
-            }
+          if (child.props && typeof child.props.onMouseEnter === "function") {
+            child.props.onMouseEnter(e);
+          }
 
-            prefetch(router, href, as, {
-              priority: true
-            });
-          };
-        } // If child is an <a> tag and doesn't have a href attribute, or if the 'passHref' property is
+          prefetch(router, href, as, {
+            priority: true
+          });
+        }; // If child is an <a> tag and doesn't have a href attribute, or if the 'passHref' property is
         // defined, we specify the current 'href', so that repetition is not needed by the user
 
         if (
@@ -314,7 +282,7 @@ _N_E = (window["webpackJsonp_N_E"] = window["webpackJsonp_N_E"] || []).push([
           childProps.href = (0, _router.addBasePath)(
             (0, _router.addLocale)(
               as,
-              router && router.locale,
+              typeof locale !== "undefined" ? locale : router && router.locale,
               router && router.defaultLocale
             )
           );
@@ -326,6 +294,125 @@ _N_E = (window["webpackJsonp_N_E"] = window["webpackJsonp_N_E"] || []).push([
       var _default = Link;
       exports["default"] = _default;
 
+      /***/
+    },
+
+    /***/ vNVm: /***/ function(module, exports, __webpack_require__) {
+      "use strict";
+
+      var _slicedToArray = __webpack_require__("J4zp");
+
+      var _interopRequireDefault = __webpack_require__("TqRt");
+
+      exports.__esModule = true;
+      exports.useIntersection = useIntersection;
+
+      var _react = __webpack_require__("q1tI");
+
+      var _requestIdleCallback = _interopRequireDefault(
+        __webpack_require__("0G5g")
+      );
+
+      var hasIntersectionObserver = typeof IntersectionObserver !== "undefined";
+
+      function useIntersection(_ref) {
+        var rootMargin = _ref.rootMargin,
+          disabled = _ref.disabled;
+        var isDisabled = disabled || !hasIntersectionObserver;
+        var unobserve = (0, _react.useRef)();
+
+        var _ref2 = (0, _react.useState)(false),
+          _ref3 = _slicedToArray(_ref2, 2),
+          visible = _ref3[0],
+          setVisible = _ref3[1];
+
+        var setRef = (0, _react.useCallback)(
+          function(el) {
+            if (unobserve.current) {
+              unobserve.current();
+              unobserve.current = undefined;
+            }
+
+            if (isDisabled || visible) return;
+
+            if (el && el.tagName) {
+              unobserve.current = observe(
+                el,
+                function(isVisible) {
+                  return isVisible && setVisible(isVisible);
+                },
+                {
+                  rootMargin: rootMargin
+                }
+              );
+            }
+          },
+          [isDisabled, rootMargin, visible]
+        );
+        (0, _react.useEffect)(
+          function() {
+            if (!hasIntersectionObserver) {
+              if (!visible)
+                (0, _requestIdleCallback["default"])(function() {
+                  return setVisible(true);
+                });
+            }
+          },
+          [visible]
+        );
+        return [setRef, visible];
+      }
+
+      function observe(element, callback, options) {
+        var _createObserver = createObserver(options),
+          id = _createObserver.id,
+          observer = _createObserver.observer,
+          elements = _createObserver.elements;
+
+        elements.set(element, callback);
+        observer.observe(element);
+        return function unobserve() {
+          observer.unobserve(element); // Destroy observer when there's nothing left to watch:
+
+          if (elements.size === 0) {
+            observer.disconnect();
+            observers["delete"](id);
+          }
+        };
+      }
+
+      var observers = new Map();
+
+      function createObserver(options) {
+        var id = options.rootMargin || "";
+        var instance = observers.get(id);
+
+        if (instance) {
+          return instance;
+        }
+
+        var elements = new Map();
+        var observer = new IntersectionObserver(function(entries) {
+          entries.forEach(function(entry) {
+            var callback = elements.get(entry.target);
+            var isVisible = entry.isIntersecting || entry.intersectionRatio > 0;
+
+            if (callback && isVisible) {
+              callback(isVisible);
+            }
+          });
+        }, options);
+        observers.set(
+          id,
+          (instance = {
+            id: id,
+            observer: observer,
+            elements: elements
+          })
+        );
+        return instance;
+      }
+
       /***/
     }
   },
Diff for 677f882d2ed8..4eeebf399.js

Diff too large to display

Diff for 677f882d2ed8..20.module.js
@@ -55,6 +55,32 @@
       /***/
     },
 
+    /***/ "0G5g": /***/ function(module, exports, __webpack_require__) {
+      "use strict";
+
+      exports.__esModule = true;
+      exports.default = void 0;
+
+      var requestIdleCallback =
+        (typeof self !== "undefined" && self.requestIdleCallback) ||
+        function(cb) {
+          var start = Date.now();
+          return setTimeout(function() {
+            cb({
+              didTimeout: false,
+              timeRemaining: function timeRemaining() {
+                return Math.max(0, 50 - (Date.now() - start));
+              }
+            });
+          }, 1);
+        };
+
+      var _default = requestIdleCallback;
+      exports.default = _default;
+
+      /***/
+    },
+
     /***/ "284h": /***/ function(module, exports, __webpack_require__) {
       var _typeof = __webpack_require__("cDf5");
 
@@ -333,6 +359,353 @@
       /***/
     },
 
+    /***/ Lab5: /***/ function(module, exports, __webpack_require__) {
+      "use strict";
+
+      exports.__esModule = true;
+      exports.default = getAssetPathFromRoute; // Translates a logical route into its pages asset path (relative from a common prefix)
+      // "asset path" being its javascript file, data file, prerendered html,...
+
+      function getAssetPathFromRoute(route) {
+        var ext =
+          arguments.length > 1 && arguments[1] !== undefined
+            ? arguments[1]
+            : "";
+        var path =
+          route === "/"
+            ? "/index"
+            : /^\/index(\/|$)/.test(route)
+            ? "/index".concat(route)
+            : "".concat(route);
+        return path + ext;
+      }
+
+      /***/
+    },
+
+    /***/ Nh2W: /***/ function(module, exports, __webpack_require__) {
+      "use strict";
+
+      var _interopRequireDefault = __webpack_require__("TqRt");
+
+      exports.__esModule = true;
+      exports.markAssetError = markAssetError;
+      exports.isAssetError = isAssetError;
+      exports.getClientBuildManifest = getClientBuildManifest;
+      exports.default = void 0;
+
+      var _getAssetPathFromRoute = _interopRequireDefault(
+        __webpack_require__("Lab5")
+      );
+
+      var _requestIdleCallback = _interopRequireDefault(
+        __webpack_require__("0G5g")
+      ); // 3.8s was arbitrarily chosen as it's what https://web.dev/interactive
+      // considers as "Good" time-to-interactive. We must assume something went
+      // wrong beyond this point, and then fall-back to a full page transition to
+      // show the user something of value.
+
+      var MS_MAX_IDLE_DELAY = 3800;
+
+      function withFuture(key, map, generator) {
+        var entry = map.get(key);
+
+        if (entry) {
+          if ("future" in entry) {
+            return entry.future;
+          }
+
+          return Promise.resolve(entry);
+        }
+
+        var resolver;
+        var prom = new Promise(resolve => {
+          resolver = resolve;
+        });
+        map.set(
+          key,
+          (entry = {
+            resolve: resolver,
+            future: prom
+          })
+        );
+        return generator // eslint-disable-next-line no-sequences
+          ? generator().then(value => (resolver(value), value))
+          : prom;
+      }
+
+      function hasPrefetch(link) {
+        try {
+          link = document.createElement("link");
+          return link.relList.supports("prefetch");
+        } catch (_unused) {
+          return false;
+        }
+      }
+
+      var canPrefetch = hasPrefetch();
+
+      function prefetchViaDom(href, as, link) {
+        return new Promise((res, rej) => {
+          if (
+            document.querySelector(
+              'link[rel="prefetch"][href^="'.concat(href, '"]')
+            )
+          ) {
+            return res();
+          }
+
+          link = document.createElement("link"); // The order of property assignment here is intentional:
+
+          if (as) link.as = as;
+          link.rel = "prefetch";
+          link.crossOrigin = "anonymous";
+          link.onload = res;
+          link.onerror = rej; // `href` should always be last:
+
+          link.href = href;
+          document.head.appendChild(link);
+        });
+      }
+
+      var ASSET_LOAD_ERROR = Symbol("ASSET_LOAD_ERROR"); // TODO: unexport
+
+      function markAssetError(err) {
+        return Object.defineProperty(err, ASSET_LOAD_ERROR, {});
+      }
+
+      function isAssetError(err) {
+        return err && ASSET_LOAD_ERROR in err;
+      }
+
+      function appendScript(src, script) {
+        return new Promise((resolve, reject) => {
+          script = document.createElement("script"); // The order of property assignment here is intentional.
+          // 1. Setup success/failure hooks in case the browser synchronously
+          //    executes when `src` is set.
+
+          script.onload = resolve;
+
+          script.onerror = () =>
+            reject(
+              markAssetError(new Error("Failed to load script: ".concat(src)))
+            ); // 2. Configure the cross-origin attribute before setting `src` in case the
+          //    browser begins to fetch.
+
+          script.crossOrigin = "anonymous"; // 3. Finally, set the source and inject into the DOM in case the child
+          //    must be appended for fetching to start.
+
+          script.src = src;
+          document.body.appendChild(script);
+        });
+      }
+
+      function idleTimeout(ms, err) {
+        return new Promise((_resolve, reject) =>
+          (0, _requestIdleCallback.default)(() =>
+            setTimeout(() => reject(err), ms)
+          )
+        );
+      } // TODO: stop exporting or cache the failure
+      // It'd be best to stop exporting this. It's an implementation detail. We're
+      // only exporting it for backwards compatibilty with the `page-loader`.
+      // Only cache this response as a last resort if we cannot eliminate all other
+      // code branches that use the Build Manifest Callback and push them through
+      // the Route Loader interface.
+
+      function getClientBuildManifest() {
+        if (self.__BUILD_MANIFEST) {
+          return Promise.resolve(self.__BUILD_MANIFEST);
+        }
+
+        var onBuildManifest = new Promise(resolve => {
+          // Mandatory because this is not concurrent safe:
+          var cb = self.__BUILD_MANIFEST_CB;
+
+          self.__BUILD_MANIFEST_CB = () => {
+            resolve(self.__BUILD_MANIFEST);
+            cb && cb();
+          };
+        });
+        return Promise.race([
+          onBuildManifest,
+          idleTimeout(
+            MS_MAX_IDLE_DELAY,
+            markAssetError(new Error("Failed to load client build manifest"))
+          )
+        ]);
+      }
+
+      function getFilesForRoute(assetPrefix, route) {
+        if (false) {
+        }
+
+        return getClientBuildManifest().then(manifest => {
+          if (!(route in manifest)) {
+            throw markAssetError(
+              new Error("Failed to lookup route: ".concat(route))
+            );
+          }
+
+          var allFiles = manifest[route].map(
+            entry => assetPrefix + "/_next/" + encodeURI(entry)
+          );
+          return {
+            scripts: allFiles.filter(v => v.endsWith(".js")),
+            css: allFiles.filter(v => v.endsWith(".css"))
+          };
+        });
+      }
+
+      function createRouteLoader(assetPrefix) {
+        var entrypoints = new Map();
+        var loadedScripts = new Map();
+        var styleSheets = new Map();
+        var routes = new Map();
+
+        function maybeExecuteScript(src) {
+          var prom = loadedScripts.get(src);
+
+          if (prom) {
+            return prom;
+          } // Skip executing script if it's already in the DOM:
+
+          if (document.querySelector('script[src^="'.concat(src, '"]'))) {
+            return Promise.resolve();
+          }
+
+          loadedScripts.set(src, (prom = appendScript(src)));
+          return prom;
+        }
+
+        function fetchStyleSheet(href) {
+          var prom = styleSheets.get(href);
+
+          if (prom) {
+            return prom;
+          }
+
+          styleSheets.set(
+            href,
+            (prom = fetch(href)
+              .then(res => {
+                if (!res.ok) {
+                  throw new Error("Failed to load stylesheet: ".concat(href));
+                }
+
+                return res.text().then(text => ({
+                  href: href,
+                  content: text
+                }));
+              })
+              .catch(err => {
+                throw markAssetError(err);
+              }))
+          );
+          return prom;
+        }
+
+        return {
+          whenEntrypoint(route) {
+            return withFuture(route, entrypoints);
+          },
+
+          onEntrypoint(route, execute) {
+            Promise.resolve(execute)
+              .then(fn => fn())
+              .then(
+                exports => ({
+                  component: (exports && exports.default) || exports,
+                  exports: exports
+                }),
+                err => ({
+                  error: err
+                })
+              )
+              .then(input => {
+                var old = entrypoints.get(route);
+                entrypoints.set(route, input);
+                if (old && "resolve" in old) old.resolve(input);
+              });
+          },
+
+          loadRoute(route) {
+            return withFuture(route, routes, async () => {
+              try {
+                var { scripts, css } = await getFilesForRoute(
+                  assetPrefix,
+                  route
+                );
+                var [, styles] = await Promise.all([
+                  entrypoints.has(route)
+                    ? []
+                    : Promise.all(scripts.map(maybeExecuteScript)),
+                  Promise.all(css.map(fetchStyleSheet))
+                ]);
+                var entrypoint = await Promise.race([
+                  this.whenEntrypoint(route),
+                  idleTimeout(
+                    MS_MAX_IDLE_DELAY,
+                    markAssetError(
+                      new Error(
+                        "Route did not complete loading: ".concat(route)
+                      )
+                    )
+                  )
+                ]);
+                var res = Object.assign(
+                  {
+                    styles
+                  },
+                  entrypoint
+                );
+                return "error" in entrypoint ? entrypoint : res;
+              } catch (err) {
+                return {
+                  error: err
+                };
+              }
+            });
+          },
+
+          prefetch(route) {
+            // https://github.com/GoogleChromeLabs/quicklink/blob/453a661fa1fa940e2d2e044452398e38c67a98fb/src/index.mjs#L115-L118
+            // License: Apache 2.0
+            var cn;
+
+            if ((cn = navigator.connection)) {
+              // Don't prefetch if using 2G or if Save-Data is enabled.
+              if (cn.saveData || /2g/.test(cn.effectiveType))
+                return Promise.resolve();
+            }
+
+            return getFilesForRoute(assetPrefix, route)
+              .then(output =>
+                Promise.all(
+                  canPrefetch
+                    ? output.scripts.map(script =>
+                        prefetchViaDom(script, "script")
+                      )
+                    : []
+                )
+              )
+              .then(() => {
+                (0, _requestIdleCallback.default)(() => this.loadRoute(route));
+              })
+              .catch(
+                // swallow prefetch errors
+                () => {}
+              );
+          }
+        };
+      }
+
+      var _default = createRouteLoader;
+      exports.default = _default;
+
+      /***/
+    },
+
     /***/ Qetd: /***/ function(module, exports, __webpack_require__) {
       "use strict";
       var assign = Object.assign.bind(Object);
@@ -560,17 +933,22 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
       exports.isLocalURL = isLocalURL;
       exports.interpolateAs = interpolateAs;
       exports.resolveHref = resolveHref;
-      exports.markLoadingError = markLoadingError;
       exports.default = void 0;
 
       var _normalizeTrailingSlash = __webpack_require__("X24+");
 
+      var _routeLoader = __webpack_require__("Nh2W");
+
       var _denormalizePagePath = __webpack_require__("wkBG");
 
       var _mitt = _interopRequireDefault(__webpack_require__("dZ6Y"));
 
       var _utils = __webpack_require__("g/15");
 
+      var _escapePathDelimiters = _interopRequireDefault(
+        __webpack_require__("fcRV")
+      );
+
       var _isDynamic = __webpack_require__("/jkW");
 
       var _parseRelativeUrl = __webpack_require__("hS4m");
@@ -585,10 +963,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
 
       var _routeRegex = __webpack_require__("YTqd");
 
-      var _escapePathDelimiters = _interopRequireDefault(
-        __webpack_require__("fcRV")
-      );
-
       function _interopRequireDefault(obj) {
         return obj && obj.__esModule
           ? obj
@@ -776,12 +1150,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
         }
       }
 
-      var PAGE_LOAD_ERROR = Symbol("PAGE_LOAD_ERROR");
-
-      function markLoadingError(err) {
-        return Object.defineProperty(err, PAGE_LOAD_ERROR, {});
-      }
-
       function prepareUrlAs(router, url, as) {
         // If url and as provided as an object representation,
         // we'll format them into the string version here.
@@ -792,6 +1160,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
       }
 
       var manualScrollRestoration = false && false;
+      var SSG_DATA_NOT_FOUND_ERROR = "SSG Data NOT_FOUND";
 
       function fetchRetry(url, attempts) {
         return fetch(url, {
@@ -813,6 +1182,12 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
               return fetchRetry(url, attempts - 1);
             }
 
+            if (res.status === 404) {
+              // TODO: handle reloading in development from fallback returning 200
+              // to on-demand-entry-handler causing it to reload periodically
+              throw new Error(SSG_DATA_NOT_FOUND_ERROR);
+            }
+
             throw new Error("Failed to load static props");
           }
 
@@ -826,7 +1201,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
           // on a client-side transition. Otherwise, we'd get into an infinite
           // loop.
           if (!isServerRender) {
-            markLoadingError(err);
+            (0, _routeLoader.markAssetError)(err);
           }
 
           throw err;
@@ -845,7 +1220,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
             App,
             wrapApp,
             Component,
-            initialStyleSheets,
             err,
             subscription,
             isFallback,
@@ -925,7 +1299,8 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
               url,
               as,
               Object.assign({}, options, {
-                shallow: options.shallow && this._shallow
+                shallow: options.shallow && this._shallow,
+                locale: options.locale || this.defaultLocale
               })
             );
           }; // represents the current component key
@@ -941,7 +1316,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
           if (_pathname !== "/_error") {
             this.components[this.route] = {
               Component,
-              styleSheets: initialStyleSheets,
+              initial: true,
               props: initialProps,
               err,
               __N_SSG: initialProps && initialProps.__N_SSG,
@@ -992,7 +1367,10 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
                   pathname: addBasePath(_pathname),
                   query: _query
                 }),
-                (0, _utils.getURL)()
+                (0, _utils.getURL)(),
+                {
+                  locale
+                }
               );
             }
 
@@ -1060,6 +1438,12 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
             return false;
           }
 
+          var localeChange = options.locale !== this.locale;
+
+          if (false) {
+            var localePathResult, parsedAs, normalizeLocalePath;
+          }
+
           if (!options._h) {
             this.isSsr = false;
           } // marking route changes as a navigation start entry
@@ -1072,7 +1456,13 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
             this.abortComponentLoad(this._inFlightRoute);
           }
 
-          as = addLocale(as, this.locale, this.defaultLocale);
+          as = addBasePath(
+            addLocale(
+              hasBasePath(as) ? delBasePath(as) : as,
+              options.locale,
+              this.defaultLocale
+            )
+          );
           var cleanedAs = delLocale(
             hasBasePath(as) ? delBasePath(as) : as,
             this.locale
@@ -1092,15 +1482,26 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
             this.notify(this.components[this.route]);
             Router.events.emit("hashChangeComplete", as);
             return true;
-          } // The build manifest needs to be loaded before auto-static dynamic pages
+          }
+
+          var parsed = (0, _parseRelativeUrl.parseRelativeUrl)(url);
+          var { pathname, query } = parsed; // The build manifest needs to be loaded before auto-static dynamic pages
           // get their query parameters to allow ensuring they can be parsed properly
           // when rewritten to
 
-          var pages = await this.pageLoader.getPageList();
-          var { __rewrites: rewrites } = await this.pageLoader
-            .promisedBuildManifest;
-          var parsed = (0, _parseRelativeUrl.parseRelativeUrl)(url);
-          var { pathname, query } = parsed;
+          var pages, rewrites;
+
+          try {
+            pages = await this.pageLoader.getPageList();
+            ({ __rewrites: rewrites } = await (0,
+            _routeLoader.getClientBuildManifest)());
+          } catch (err) {
+            // If we fail to resolve the page list or client-build manifest, we must
+            // do a server-side transition:
+            window.location.href = as;
+            return false;
+          }
+
           parsed = this._resolveHref(parsed, pages);
 
           if (parsed.pathname !== pathname) {
@@ -1120,7 +1521,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
           // as this should not go into the history (That's how browsers work)
           // We should compare the new asPath to the current asPath, not the url
 
-          if (!this.urlIsNew(cleanedAs)) {
+          if (!this.urlIsNew(cleanedAs) && !localeChange) {
             method = "replaceState";
           }
 
@@ -1139,8 +1540,9 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
           resolvedAs = delLocale(delBasePath(resolvedAs), this.locale);
 
           if ((0, _isDynamic.isDynamicRoute)(route)) {
-            var parsedAs = (0, _parseRelativeUrl.parseRelativeUrl)(resolvedAs);
-            var asPathname = parsedAs.pathname;
+            var _parsedAs = (0, _parseRelativeUrl.parseRelativeUrl)(resolvedAs);
+
+            var asPathname = _parsedAs.pathname;
             var routeRegex = (0, _routeRegex.getRouteRegex)(route);
             var routeMatch = (0, _routeMatcher.getRouteMatcher)(routeRegex)(
               asPathname
@@ -1182,7 +1584,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
               }
             } else if (shouldInterpolate) {
               as = (0, _utils.formatWithValidation)(
-                Object.assign({}, parsedAs, {
+                Object.assign({}, _parsedAs, {
                   pathname: interpolatedAs.result,
                   query: omitParmsFromQuery(query, interpolatedAs.params)
                 })
@@ -1220,15 +1622,15 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
                   destination
                 );
 
-                this._resolveHref(parsedHref, pages);
+                this._resolveHref(parsedHref, pages, false);
 
                 if (pages.includes(parsedHref.pathname)) {
-                  return this.change(
-                    "replaceState",
+                  var { url: newUrl, as: newAs } = prepareUrlAs(
+                    this,
                     destination,
-                    destination,
-                    options
+                    destination
                   );
+                  return this.change(method, newUrl, newAs, options);
                 }
               }
 
@@ -1237,12 +1639,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
             }
 
             Router.events.emit("beforeHistoryChange", as);
-            this.changeState(
-              method,
-              url,
-              addLocale(as, this.locale, this.defaultLocale),
-              options
-            );
+            this.changeState(method, url, as, options);
 
             if (false) {
               var appComp;
@@ -1263,6 +1660,9 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
             if (false) {
             }
 
+            if (false) {
+            }
+
             Router.events.emit("routeChangeComplete", as);
             return true;
           } catch (err) {
@@ -1306,7 +1706,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
             throw err;
           }
 
-          if (PAGE_LOAD_ERROR in err || loadErrorFail) {
+          if ((0, _routeLoader.isAssetError)(err) || loadErrorFail) {
             Router.events.emit("routeChangeError", err, as); // If we can't load the page it could be one of following reasons
             //  1. Page doesn't exists
             //  2. Page does exist in a different zone
@@ -1320,25 +1720,67 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
           }
 
           try {
-            var { page: Component, styleSheets } = await this.fetchComponent(
-              "/_error"
-            );
+            var Component;
+            var styleSheets;
+            var props;
+            var ssg404 = err.message === SSG_DATA_NOT_FOUND_ERROR;
+
+            if (ssg404) {
+              try {
+                var mod;
+                ({
+                  page: Component,
+                  styleSheets,
+                  mod
+                } = await this.fetchComponent("/404")); // TODO: should we tolerate these props missing and still render the
+                // page instead of falling back to _error?
+
+                if (mod && mod.__N_SSG) {
+                  props = await this._getStaticData(
+                    this.pageLoader.getDataHref(
+                      "/404",
+                      "/404",
+                      true,
+                      this.locale
+                    )
+                  );
+                }
+              } catch (_err) {
+                // non-fatal fallback to _error
+              }
+            }
+
+            if (
+              typeof Component === "undefined" ||
+              typeof styleSheets === "undefined"
+            ) {
+              ({ page: Component, styleSheets } = await this.fetchComponent(
+                "/_error"
+              ));
+            }
+
             var routeInfo = {
+              props,
               Component,
               styleSheets,
-              err,
-              error: err
+              err: ssg404 ? undefined : err,
+              error: ssg404 ? undefined : err
             };
 
-            try {
-              routeInfo.props = await this.getInitialProps(Component, {
-                err,
-                pathname,
-                query
-              });
-            } catch (gipErr) {
-              console.error("Error in error page `getInitialProps`: ", gipErr);
-              routeInfo.props = {};
+            if (!routeInfo.props) {
+              try {
+                routeInfo.props = await this.getInitialProps(Component, {
+                  err,
+                  pathname,
+                  query
+                });
+              } catch (gipErr) {
+                console.error(
+                  "Error in error page `getInitialProps`: ",
+                  gipErr
+                );
+                routeInfo.props = {};
+              }
             }
 
             return routeInfo;
@@ -1360,12 +1802,16 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
               : false;
 
           try {
-            var cachedRouteInfo = this.components[route];
+            var existingRouteInfo = this.components[route];
 
-            if (shallow && cachedRouteInfo && this.route === route) {
-              return cachedRouteInfo;
+            if (shallow && existingRouteInfo && this.route === route) {
+              return existingRouteInfo;
             }
 
+            var cachedRouteInfo =
+              existingRouteInfo && "initial" in existingRouteInfo
+                ? undefined
+                : existingRouteInfo;
             var routeInfo = cachedRouteInfo
               ? cachedRouteInfo
               : await this.fetchComponent(route).then(res => ({
@@ -1390,8 +1836,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
                 }),
                 delBasePath(as),
                 __N_SSG,
-                this.locale,
-                this.defaultLocale
+                this.locale
               );
             }
 
@@ -1530,8 +1975,13 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
               : {};
           var parsed = (0, _parseRelativeUrl.parseRelativeUrl)(url);
           var { pathname } = parsed;
+
+          if (false) {
+            var localePathResult, parsedAs, normalizeLocalePath;
+          }
+
           var pages = await this.pageLoader.getPageList();
-          parsed = this._resolveHref(parsed, pages);
+          parsed = this._resolveHref(parsed, pages, false);
 
           if (parsed.pathname !== pathname) {
             pathname = parsed.pathname;
@@ -1545,12 +1995,20 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
             pathname
           );
           await Promise.all([
-            this.pageLoader.prefetchData(
-              url,
-              asPath,
-              this.locale,
-              this.defaultLocale
-            ),
+            this.pageLoader._isSsg(url).then(isSsg => {
+              return isSsg
+                ? this._getStaticData(
+                    this.pageLoader.getDataHref(
+                      url,
+                      asPath,
+                      true,
+                      typeof options.locale !== "undefined"
+                        ? options.locale
+                        : this.locale
+                    )
+                  )
+                : false;
+            }),
             this.pageLoader[options.priority ? "loadPage" : "prefetch"](route)
           ]);
         }
@@ -1853,10 +2311,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
       var _utils = __webpack_require__("g/15");
 
       var _querystring = __webpack_require__("3WeD");
-
-      var DUMMY_BASE = new URL(
-        false ? undefined : (0, _utils.getLocationOrigin)()
-      );
       /**
        * Parses path-relative urls (e.g. `/hello/world?foo=bar`). If url isn't path-relative
        * (e.g. `./hello`) then at least base must be.
@@ -1865,21 +2319,16 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
        */
 
       function parseRelativeUrl(url, base) {
-        var resolvedBase = base ? new URL(base, DUMMY_BASE) : DUMMY_BASE;
-        var {
-          pathname,
-          searchParams,
-          search,
-          hash,
-          href,
-          origin,
-          protocol
-        } = new URL(url, resolvedBase);
-
-        if (
-          origin !== DUMMY_BASE.origin ||
-          (protocol !== "http:" && protocol !== "https:")
-        ) {
+        var globalBase = new URL(
+          false ? undefined : (0, _utils.getLocationOrigin)()
+        );
+        var resolvedBase = base ? new URL(base, globalBase) : globalBase;
+        var { pathname, searchParams, search, hash, href, origin } = new URL(
+          url,
+          resolvedBase
+        );
+
+        if (origin !== globalBase.origin) {
           throw new Error("invariant: invalid relative URL");
         }
 
@@ -1888,7 +2337,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
           query: (0, _querystring.searchParamsToUrlQuery)(searchParams),
           search,
           hash,
-          href: href.slice(DUMMY_BASE.origin.length)
+          href: href.slice(globalBase.origin.length)
         };
       }
Diff for main-8e73dd2..68413e28f.js

Diff too large to display

Diff for main-f21a93d..8d.module.js

Diff too large to display

Diff for index.html
@@ -3,10 +3,11 @@
   <head>
     <meta charset="utf-8" />
     <meta name="viewport" content="width=device-width" />
+    <meta name="next-head-count" content="2" />
     <noscript data-n-css="true"></noscript>
     <link
       rel="preload"
-      href="/_next/static/chunks/main-f21a93d0c5df5ac1d18d.module.js"
+      href="/_next/static/chunks/main-e47abb948dd778396dc8.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -24,7 +25,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.d950dcaaa011f2b8e120.module.js"
+      href="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.9a602fa3ecd8963feabd.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -50,11 +51,7 @@
         "query": {},
         "buildId": "BUILD_ID",
         "isFallback": false,
-        "gip": true,
-        "head": [
-          ["meta", { "charSet": "utf-8" }],
-          ["meta", { "name": "viewport", "content": "width=device-width" }]
-        ]
+        "gip": true
       }
     </script>
     <script crossorigin="anonymous" nomodule="">
@@ -85,13 +82,13 @@
       src="/_next/static/chunks/polyfills-f73ba3fc145972ef83e9.js"
     ></script>
     <script
-      src="/_next/static/chunks/main-8e73dd227e768413e28f.js"
+      src="/_next/static/chunks/main-b5f94b0d289bb8d446f2.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/main-f21a93d0c5df5ac1d18d.module.js"
+      src="/_next/static/chunks/main-e47abb948dd778396dc8.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
@@ -121,19 +118,19 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.5472d08d2594eeebf399.js"
+      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.70c34b1d8a5ae9f202fa.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.d950dcaaa011f2b8e120.module.js"
+      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.9a602fa3ecd8963feabd.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/pages/_app-7512045a5b3d9376e2ca.js"
+      src="/_next/static/chunks/pages/_app-a24430c6b07ae4b780ba.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
Diff for link.html
@@ -3,10 +3,11 @@
   <head>
     <meta charset="utf-8" />
     <meta name="viewport" content="width=device-width" />
+    <meta name="next-head-count" content="2" />
     <noscript data-n-css="true"></noscript>
     <link
       rel="preload"
-      href="/_next/static/chunks/main-f21a93d0c5df5ac1d18d.module.js"
+      href="/_next/static/chunks/main-e47abb948dd778396dc8.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -24,7 +25,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.d950dcaaa011f2b8e120.module.js"
+      href="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.9a602fa3ecd8963feabd.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -36,7 +37,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/pages/link-1de2ef9a42400a3bd1f2.module.js"
+      href="/_next/static/chunks/pages/link-cd84dab1f87965855b1c.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -55,11 +56,7 @@
         "query": {},
         "buildId": "BUILD_ID",
         "isFallback": false,
-        "gip": true,
-        "head": [
-          ["meta", { "charSet": "utf-8" }],
-          ["meta", { "name": "viewport", "content": "width=device-width" }]
-        ]
+        "gip": true
       }
     </script>
     <script crossorigin="anonymous" nomodule="">
@@ -90,13 +87,13 @@
       src="/_next/static/chunks/polyfills-f73ba3fc145972ef83e9.js"
     ></script>
     <script
-      src="/_next/static/chunks/main-8e73dd227e768413e28f.js"
+      src="/_next/static/chunks/main-b5f94b0d289bb8d446f2.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/main-f21a93d0c5df5ac1d18d.module.js"
+      src="/_next/static/chunks/main-e47abb948dd778396dc8.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
@@ -126,19 +123,19 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.5472d08d2594eeebf399.js"
+      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.70c34b1d8a5ae9f202fa.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.d950dcaaa011f2b8e120.module.js"
+      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.9a602fa3ecd8963feabd.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/pages/_app-7512045a5b3d9376e2ca.js"
+      src="/_next/static/chunks/pages/_app-a24430c6b07ae4b780ba.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
@@ -150,13 +147,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/pages/link-67e857671520c009f99f.js"
+      src="/_next/static/chunks/pages/link-4218f7a274c65b7f23dd.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/pages/link-1de2ef9a42400a3bd1f2.module.js"
+      src="/_next/static/chunks/pages/link-cd84dab1f87965855b1c.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
Diff for withRouter.html
@@ -3,10 +3,11 @@
   <head>
     <meta charset="utf-8" />
     <meta name="viewport" content="width=device-width" />
+    <meta name="next-head-count" content="2" />
     <noscript data-n-css="true"></noscript>
     <link
       rel="preload"
-      href="/_next/static/chunks/main-f21a93d0c5df5ac1d18d.module.js"
+      href="/_next/static/chunks/main-e47abb948dd778396dc8.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -24,7 +25,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.d950dcaaa011f2b8e120.module.js"
+      href="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.9a602fa3ecd8963feabd.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -50,11 +51,7 @@
         "query": {},
         "buildId": "BUILD_ID",
         "isFallback": false,
-        "gip": true,
-        "head": [
-          ["meta", { "charSet": "utf-8" }],
-          ["meta", { "name": "viewport", "content": "width=device-width" }]
-        ]
+        "gip": true
       }
     </script>
     <script crossorigin="anonymous" nomodule="">
@@ -85,13 +82,13 @@
       src="/_next/static/chunks/polyfills-f73ba3fc145972ef83e9.js"
     ></script>
     <script
-      src="/_next/static/chunks/main-8e73dd227e768413e28f.js"
+      src="/_next/static/chunks/main-b5f94b0d289bb8d446f2.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/main-f21a93d0c5df5ac1d18d.module.js"
+      src="/_next/static/chunks/main-e47abb948dd778396dc8.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
@@ -121,19 +118,19 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.5472d08d2594eeebf399.js"
+      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.70c34b1d8a5ae9f202fa.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.d950dcaaa011f2b8e120.module.js"
+      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.9a602fa3ecd8963feabd.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/pages/_app-7512045a5b3d9376e2ca.js"
+      src="/_next/static/chunks/pages/_app-a24430c6b07ae4b780ba.js"
       async=""
       crossorigin="anonymous"
       nomodule=""

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary v9.5.5 vercel/next.js refs/heads/canary Change
buildDuration 14.2s 14.9s ⚠️ +694ms
nodeModulesSize 61.7 MB 84.8 MB ⚠️ +23.1 MB
Client Bundles (main, webpack, commons) Overall increase ⚠️
vercel/next.js canary v9.5.5 vercel/next.js refs/heads/canary Change
677f882d2ed8..9b19.js gzip 11.1 kB N/A N/A
framework.HASH.js gzip 39 kB 39 kB
main-51c1c2f..7e91.js gzip 7.23 kB N/A N/A
webpack-e067..f178.js gzip 751 B 751 B
677f882d2ed8..d4b6.js gzip N/A 12.6 kB N/A
main-43dd9e5..8439.js gzip N/A 6.48 kB N/A
Overall change 58 kB 58.8 kB ⚠️ +840 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
vercel/next.js canary v9.5.5 vercel/next.js refs/heads/canary Change
677f882d2ed8..dule.js gzip 6.9 kB N/A N/A
framework.HA..dule.js gzip 39 kB 39 kB
main-87d379f..dule.js gzip 6.29 kB N/A N/A
webpack-07c5..dule.js gzip 751 B 751 B
677f882d2ed8..dule.js gzip N/A 8.22 kB N/A
main-472f7d5..dule.js gzip N/A 5.58 kB N/A
Overall change 52.9 kB 53.5 kB ⚠️ +625 B
Legacy Client Bundles (polyfills)
vercel/next.js canary v9.5.5 vercel/next.js refs/heads/canary Change
polyfills-4b..e242.js gzip 31 kB 31 kB
Overall change 31 kB 31 kB
Client Pages Overall increase ⚠️
vercel/next.js canary v9.5.5 vercel/next.js refs/heads/canary Change
_app-9a0b9e1..b37e.js gzip 1.28 kB N/A N/A
_error-ed1b0..8fbd.js gzip 3.44 kB N/A N/A
hooks-89731c..c609.js gzip 887 B N/A N/A
index-17468f..5d83.js gzip 227 B 227 B
link-409b283..e3ab.js gzip 1.32 kB N/A N/A
routerDirect..924c.js gzip 284 B 284 B
withRouter-7..c13d.js gzip 284 B 284 B
_app-3b0cf13..85f8.js gzip N/A 1.28 kB N/A
_error-6f635..c393.js gzip N/A 3.44 kB N/A
hooks-d4ffc3..9e0f.js gzip N/A 887 B N/A
link-d9a15a0..130a.js gzip N/A 1.57 kB N/A
Overall change 7.73 kB 7.98 kB ⚠️ +251 B
Client Pages Modern Overall increase ⚠️
vercel/next.js canary v9.5.5 vercel/next.js refs/heads/canary Change
_app-75d3a82..dule.js gzip 625 B 625 B
_error-4469a..dule.js gzip 2.29 kB N/A N/A
hooks-cbf13f..dule.js gzip 387 B 387 B
index-b9a643..dule.js gzip 226 B 226 B
link-92d3016..dule.js gzip 1.28 kB N/A N/A
routerDirect..dule.js gzip 284 B 284 B
withRouter-f..dule.js gzip 282 B 282 B
_error-f2fcc..dule.js gzip N/A 2.29 kB N/A
link-973cce3..dule.js gzip N/A 1.51 kB N/A
Overall change 5.37 kB 5.6 kB ⚠️ +231 B
Client Build Manifests Overall decrease ✓
vercel/next.js canary v9.5.5 vercel/next.js refs/heads/canary Change
_buildManifest.js gzip 323 B 321 B -2 B
_buildManife..dule.js gzip 329 B 330 B ⚠️ +1 B
Overall change 652 B 651 B -1 B
Serverless bundles Overall decrease ✓
vercel/next.js canary v9.5.5 vercel/next.js refs/heads/canary Change
_error.js 1.06 MB 916 kB -141 kB
404.html 4.34 kB 4.61 kB ⚠️ +275 B
hooks.html 3.92 kB 3.86 kB -56 B
index.js 1.06 MB 916 kB -141 kB
link.js 1.1 MB 974 kB -129 kB
routerDirect.js 1.1 MB 967 kB -130 kB
withRouter.js 1.1 MB 967 kB -130 kB
Overall change 5.42 MB 4.75 MB -670 kB

Please sign in to comment.