Skip to content

Commit

Permalink
v9.1.7-canary.4
Browse files Browse the repository at this point in the history
  • Loading branch information
timneutkens committed Dec 24, 2019
1 parent 93c745c commit 3e05139
Show file tree
Hide file tree
Showing 8 changed files with 8 additions and 8 deletions.
2 changes: 1 addition & 1 deletion lerna.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@
"registry": "https://registry.npmjs.org/"
}
},
"version": "9.1.7-canary.3"
"version": "9.1.7-canary.4"
}
2 changes: 1 addition & 1 deletion packages/create-next-app/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "create-next-app",
"version": "9.1.7-canary.3",
"version": "9.1.7-canary.4",
"keywords": [
"react",
"next",
Expand Down
2 changes: 1 addition & 1 deletion packages/next-bundle-analyzer/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@next/bundle-analyzer",
"version": "9.1.7-canary.3",
"version": "9.1.7-canary.4",
"main": "index.js",
"license": "MIT",
"repository": {
Expand Down
2 changes: 1 addition & 1 deletion packages/next-mdx/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@next/mdx",
"version": "9.1.7-canary.3",
"version": "9.1.7-canary.4",
"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": "9.1.7-canary.3",
"version": "9.1.7-canary.4",
"nextjs": {
"name": "Google Analytics",
"required-env": [
Expand Down
2 changes: 1 addition & 1 deletion packages/next-plugin-material-ui/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@next/plugin-material-ui",
"version": "9.1.7-canary.3",
"version": "9.1.7-canary.4",
"nextjs": {
"name": "Material UI",
"required-env": []
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": "9.1.7-canary.3",
"version": "9.1.7-canary.4",
"nextjs": {
"name": "Sentry",
"required-env": [
Expand Down
2 changes: 1 addition & 1 deletion packages/next/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "next",
"version": "9.1.7-canary.3",
"version": "9.1.7-canary.4",
"description": "The React Framework",
"main": "./dist/server/next.js",
"license": "MIT",
Expand Down

1 comment on commit 3e05139

@ijjk
Copy link
Member

@ijjk ijjk commented on 3e05139 Dec 24, 2019

Choose a reason for hiding this comment

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

Stats from current release

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
zeit/next.js canary zeit/next.js refs/tags/v9.1.7-canary.4 Change
buildDuration 14.3s 14s -243ms
nodeModulesSize 48.7 MB 48.9 MB ⚠️ +271 kB
Client Bundles (main, webpack, commons) Overall decrease ✓
zeit/next.js canary zeit/next.js refs/tags/v9.1.7-canary.4 Change
main-HASH.js 18.5 kB 18.2 kB -336 B
main-HASH.js gzip 6.49 kB 6.43 kB -63 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
4952ddcd88e7..1db6754d3.js 12 kB 12 kB
4952ddcd88e7..54d3.js gzip 4.68 kB 4.68 kB
commons.HASH.js 10.9 kB 10.9 kB
commons.HASH.js gzip 4.06 kB 4.06 kB
de003c3a9d30..7d55a2235.js 38.3 kB N/A N/A
de003c3a9d30..2235.js gzip 13.9 kB N/A N/A
framework.HASH.js 126 kB 126 kB
framework.HASH.js gzip 39.5 kB 39.5 kB
de003c3a9d30..17cdc0d60.js N/A 38.3 kB N/A
de003c3a9d30..0d60.js gzip N/A 13.9 kB N/A
Overall change 207 kB 206 kB -336 B
Client Bundles (main, webpack, commons) Modern Overall decrease ✓
zeit/next.js canary zeit/next.js refs/tags/v9.1.7-canary.4 Change
main-HASH.module.js 14.5 kB 14.4 kB -109 B
main-HASH.module.js gzip 5.41 kB 5.41 kB -1 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH..dule.js gzip 746 B 746 B
4952ddcd88e7..b9.module.js 14.9 kB 14.9 kB
4952ddcd88e7..dule.js gzip 5.56 kB 5.56 kB
de003c3a9d30..a0.module.js 33.1 kB N/A N/A
de003c3a9d30..dule.js gzip 12.5 kB N/A N/A
framework.HASH.module.js 126 kB 126 kB
framework.HA..dule.js gzip 39.4 kB 39.4 kB
de003c3a9d30..e3.module.js N/A 33.1 kB N/A
de003c3a9d30..dule.js gzip N/A 12.5 kB N/A
Overall change 190 kB 189 kB -109 B
Legacy Client Bundles (polyfills)
zeit/next.js canary zeit/next.js refs/tags/v9.1.7-canary.4 Change
polyfills-HASH.js 15.3 kB 15.3 kB
polyfills-HASH.js gzip 4.76 kB 4.76 kB
Overall change 15.3 kB 15.3 kB
Client Pages Overall increase ⚠️
zeit/next.js canary zeit/next.js refs/tags/v9.1.7-canary.4 Change
_app.js 2.94 kB 2.94 kB
_app.js gzip 1.33 kB 1.33 kB
_error.js 10.4 kB 10.4 kB
_error.js gzip 4.07 kB 4.07 kB
hooks.js 1.44 kB 1.44 kB
hooks.js gzip 779 B 779 B
index.js 318 B 318 B
index.js gzip 222 B 222 B
link.js 6.77 kB 6.88 kB ⚠️ +109 B
link.js gzip 2.89 kB 2.93 kB ⚠️ +37 B
routerDirect.js 411 B 411 B
routerDirect.js gzip 283 B 283 B
withRouter.js 421 B 421 B
withRouter.js gzip 282 B 282 B
Overall change 22.7 kB 22.8 kB ⚠️ +109 B
Client Pages Modern Overall increase ⚠️
zeit/next.js canary zeit/next.js refs/tags/v9.1.7-canary.4 Change
_app.module.js 1.54 kB 1.54 kB
_app.module.js gzip 757 B 757 B
_error.module.js 7.35 kB 7.35 kB
_error.module.js gzip 3.06 kB 3.06 kB
hooks.module.js 651 B 651 B
hooks.module.js gzip 371 B 371 B
index.module.js 276 B 276 B
index.module.js gzip 212 B 212 B
link.module.js 5.45 kB 5.54 kB ⚠️ +89 B
link.module.js gzip 2.46 kB 2.49 kB ⚠️ +35 B
routerDirect.module.js 383 B 383 B
routerDirect..dule.js gzip 273 B 273 B
withRouter.module.js 394 B 394 B
withRouter.m..dule.js gzip 272 B 272 B
Overall change 16 kB 16.1 kB ⚠️ +89 B
Client Build Manifests
zeit/next.js canary zeit/next.js refs/tags/v9.1.7-canary.4 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 zeit/next.js refs/tags/v9.1.7-canary.4 Change
index.html 4.06 kB 4.06 kB
index.html gzip 1.04 kB 1.04 kB
link.html 4.11 kB 4.11 kB
link.html gzip 1.05 kB 1.04 kB -1 B
withRouter.html 4.12 kB 4.12 kB
withRouter.html gzip 1.03 kB 1.03 kB -1 B
Overall change 12.3 kB 12.3 kB

Diffs

Diff for main-HASH.js
@@ -437,7 +437,7 @@ if (!window.Promise) {
 
 var data = JSON.parse(document.getElementById('__NEXT_DATA__').textContent);
 window.__NEXT_DATA__ = data;
-var version = "9.1.6";
+var version = "9.1.7-canary.4";
 exports.version = version;
 var props = data.props,
     err = data.err,
@@ -1387,36 +1387,32 @@ var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__("+oT+"));
 var _promise = _interopRequireDefault(__webpack_require__("eVuF"));
 
 var _mitt = _interopRequireDefault(__webpack_require__("dZ6Y"));
-/* global document, window */
 
-
-var prefetchOrPreload = undefined ? 'prefetch' : 'preload';
-
-function supportsPreload(el) {
+function hasPrefetch(link) {
   try {
-    return el.relList.supports(prefetchOrPreload);
-  } catch (_unused) {
-    return false;
-  }
+    link = document.createElement('link');
+    return link.relList.supports('prefetch');
+  } catch (_unused) {}
 }
 
-var hasPreload = supportsPreload(document.createElement('link'));
-
-function preloadLink(url, resourceType) {
-  var link = document.createElement('link');
-  link.rel = prefetchOrPreload;
-  link.crossOrigin = "anonymous";
-  link.href = url;
-  link.as = resourceType;
-  document.head.appendChild(link);
-}
-
-function loadStyle(url) {
-  var link = document.createElement('link');
-  link.rel = 'stylesheet';
-  link.crossOrigin = "anonymous";
-  link.href = url;
-  document.head.appendChild(link);
+var relPrefetch = hasPrefetch() ? // https://caniuse.com/#feat=link-rel-prefetch
+// IE 11, Edge 12+, nearly all evergreen
+'prefetch' : // https://caniuse.com/#feat=link-rel-preload
+// macOS and iOS (Safari does not support prefetch)
+'preload';
+var hasNoModule = 'noModule' in document.createElement('script');
+
+function appendLink(href, rel, as) {
+  return new _promise["default"](function (res, rej, link) {
+    link = document.createElement('link');
+    link.crossOrigin = "anonymous";
+    link.href = href;
+    link.rel = rel;
+    if (as) link.as = as;
+    link.onload = res;
+    link.onerror = rej;
+    document.head.appendChild(link);
+  });
 }
 
 var PageLoader =
@@ -1428,6 +1424,7 @@ function () {
     this.buildId = buildId;
     this.assetPrefix = assetPrefix;
     this.pageCache = {};
+    this.prefetched = {};
     this.pageRegisterEvents = (0, _mitt["default"])();
     this.loadingRoutes = {};
 
@@ -1530,7 +1527,9 @@ function () {
                 }
 
                 if (/\.css$/.test(d) && !document.querySelector("link[rel=stylesheet][href^=\"" + d + "\"]")) {
-                  loadStyle(d); // FIXME: handle failure
+                  appendLink(d, 'stylesheet')["catch"](function () {// FIXME: handle failure
+                    // Right now, this is needed to prevent an unhandled rejection.
+                  });
                 }
               });
 
@@ -1576,7 +1575,7 @@ function () {
 
       var script = document.createElement('script');
 
-      if ( true && 'noModule' in script) {
+      if ( true && hasNoModule) {
         script.type = 'module'; // Only page bundle scripts need to have .module added to url,
         // dependencies already have it added during build manifest creation
 
@@ -1636,95 +1635,57 @@ function () {
       return (0, _asyncToGenerator2["default"])(
       /*#__PURE__*/
       _regeneratorRuntime.mark(function _callee2() {
-        var scriptRoute, url, cn;
+        var cn, url, scriptRoute;
         return _regeneratorRuntime.wrap(function _callee2$(_context2) {
           while (1) {
             switch (_context2.prev = _context2.next) {
               case 0:
-                route = _this2.normalizeRoute(route);
-                scriptRoute = (route === '/' ? '/index' : route) + ".js";
-
-                if ( true && 'noModule' in document.createElement('script')) {
-                  scriptRoute = scriptRoute.replace(/\.js$/, '.module.js');
-                }
-
-                url = _this2.assetPrefix + (isDependency ? route : "/_next/static/" + encodeURIComponent(_this2.buildId) + "/pages" + encodeURI(scriptRoute)); // n.b. If preload is not supported, we fall back to `loadPage` which has
-                // its own deduping mechanism.
-
-                if (!document.querySelector("link[rel=\"" + prefetchOrPreload + "\"][href^=\"" + url + "\"], script[data-next-page=\"" + route + "\"]")) {
-                  _context2.next = 6;
-                  break;
-                }
-
-                return _context2.abrupt("return");
-
-              case 6:
                 if (!(cn = navigator.connection)) {
-                  _context2.next = 9;
+                  _context2.next = 3;
                   break;
                 }
 
-                if (!((cn.effectiveType || '').indexOf('2g') !== -1 || cn.saveData)) {
-                  _context2.next = 9;
+                if (!(cn.saveData || /2g/.test(cn.effectiveType))) {
+                  _context2.next = 3;
                   break;
                 }
 
                 return _context2.abrupt("return");
 
-              case 9:
-                if (!( true && !isDependency)) {
-                  _context2.next = 15;
-                  break;
-                }
-
-                ;
-                _context2.next = 13;
-                return _this2.getDependencies(route);
+              case 3:
+                url = _this2.assetPrefix;
 
-              case 13:
-                _context2.t0 = function (url) {
-                  _this2.prefetch(url, true);
-                };
+                if (isDependency) {
+                  url += route;
+                } else {
+                  route = _this2.normalizeRoute(route);
+                  _this2.prefetched[route] = true;
+                  scriptRoute = (route === '/' ? '/index' : route) + ".js";
 
-                _context2.sent.forEach(_context2.t0);
+                  if ( true && hasNoModule) {
+                    scriptRoute = scriptRoute.replace(/\.js$/, '.module.js');
+                  }
 
-              case 15:
-                if (!hasPreload) {
-                  _context2.next = 18;
-                  break;
+                  url += "/_next/static/" + encodeURIComponent(_this2.buildId) + "/pages" + encodeURI(scriptRoute);
                 }
 
-                preloadLink(url, url.match(/\.css$/) ? 'style' : 'script');
-                return _context2.abrupt("return");
-
-              case 18:
-                if (!isDependency) {
-                  _context2.next = 20;
+                if (!document.querySelector("link[rel=\"" + relPrefetch + "\"][href^=\"" + url + "\"], script[data-next-page=\"" + route + "\"]")) {
+                  _context2.next = 7;
                   break;
                 }
 
                 return _context2.abrupt("return");
 
-              case 20:
-                if (!(document.readyState === 'complete')) {
-                  _context2.next = 24;
-                  break;
-                }
-
-                return _context2.abrupt("return", _this2.loadPage(route)["catch"](function () {}));
-
-              case 24:
-                return _context2.abrupt("return", new _promise["default"](function (resolve) {
-                  window.addEventListener('load', function () {
-                    _this2.loadPage(route).then(function () {
-                      return resolve();
-                    }, function () {
-                      return resolve();
-                    });
-                  });
-                }));
+              case 7:
+                return _context2.abrupt("return", _promise["default"].all([appendLink(url, relPrefetch, url.match(/\.css$/) ? 'style' : 'script'),  true && !isDependency && _this2.getDependencies(route).then(function (urls) {
+                  return _promise["default"].all(urls.map(function (url) {
+                    return _this2.prefetch(url, true);
+                  }));
+                })]).then( // do not return any data
+                function () {}, // swallow prefetch errors
+                function () {}));
 
-              case 25:
+              case 8:
               case "end":
                 return _context2.stop();
             }
Diff for main-HASH.module.js
@@ -341,7 +341,7 @@ if (!window.Promise) {
 
 var data = JSON.parse(document.getElementById('__NEXT_DATA__').textContent);
 window.__NEXT_DATA__ = data;
-var version = "9.1.6";
+var version = "9.1.7-canary.4";
 exports.version = version;
 var {
   props,
@@ -1078,36 +1078,32 @@ var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__("+oT+"));
 var _promise = _interopRequireDefault(__webpack_require__("eVuF"));
 
 var _mitt = _interopRequireDefault(__webpack_require__("dZ6Y"));
-/* global document, window */
 
-
-var prefetchOrPreload = undefined ? 'prefetch' : 'preload';
-
-function supportsPreload(el) {
+function hasPrefetch(link) {
   try {
-    return el.relList.supports(prefetchOrPreload);
-  } catch (_unused) {
-    return false;
-  }
+    link = document.createElement('link');
+    return link.relList.supports('prefetch');
+  } catch (_unused) {}
 }
 
-var hasPreload = supportsPreload(document.createElement('link'));
-
-function preloadLink(url, resourceType) {
-  var link = document.createElement('link');
-  link.rel = prefetchOrPreload;
-  link.crossOrigin = "anonymous";
-  link.href = url;
-  link.as = resourceType;
-  document.head.appendChild(link);
-}
-
-function loadStyle(url) {
-  var link = document.createElement('link');
-  link.rel = 'stylesheet';
-  link.crossOrigin = "anonymous";
-  link.href = url;
-  document.head.appendChild(link);
+var relPrefetch = hasPrefetch() ? // https://caniuse.com/#feat=link-rel-prefetch
+// IE 11, Edge 12+, nearly all evergreen
+'prefetch' : // https://caniuse.com/#feat=link-rel-preload
+// macOS and iOS (Safari does not support prefetch)
+'preload';
+var hasNoModule = 'noModule' in document.createElement('script');
+
+function appendLink(href, rel, as) {
+  return new _promise.default((res, rej, link) => {
+    link = document.createElement('link');
+    link.crossOrigin = "anonymous";
+    link.href = href;
+    link.rel = rel;
+    if (as) link.as = as;
+    link.onload = res;
+    link.onerror = rej;
+    document.head.appendChild(link);
+  });
 }
 
 class PageLoader {
@@ -1115,6 +1111,7 @@ class PageLoader {
     this.buildId = buildId;
     this.assetPrefix = assetPrefix;
     this.pageCache = {};
+    this.prefetched = {};
     this.pageRegisterEvents = (0, _mitt.default)();
     this.loadingRoutes = {};
 
@@ -1205,7 +1202,9 @@ class PageLoader {
               }
 
               if (/\.css$/.test(d) && !document.querySelector("link[rel=stylesheet][href^=\"" + d + "\"]")) {
-                loadStyle(d); // FIXME: handle failure
+                appendLink(d, 'stylesheet').catch(() => {// FIXME: handle failure
+                  // Right now, this is needed to prevent an unhandled rejection.
+                });
               }
             });
             this.loadRoute(route);
@@ -1231,7 +1230,7 @@ class PageLoader {
   loadScript(url, route, isPage) {
     var script = document.createElement('script');
 
-    if ( true && 'noModule' in script) {
+    if ( true && hasNoModule) {
       script.type = 'module'; // Only page bundle scripts need to have .module added to url,
       // dependencies already have it added during build manifest creation
 
@@ -1282,60 +1281,38 @@ class PageLoader {
     var _this2 = this;
 
     return (0, _asyncToGenerator2.default)(function* () {
-      route = _this2.normalizeRoute(route);
-      var scriptRoute = (route === '/' ? '/index' : route) + ".js";
-
-      if ( true && 'noModule' in document.createElement('script')) {
-        scriptRoute = scriptRoute.replace(/\.js$/, '.module.js');
-      }
-
-      var url = _this2.assetPrefix + (isDependency ? route : "/_next/static/" + encodeURIComponent(_this2.buildId) + "/pages" + encodeURI(scriptRoute)); // n.b. If preload is not supported, we fall back to `loadPage` which has
-      // its own deduping mechanism.
-
-      if (document.querySelector("link[rel=\"" + prefetchOrPreload + "\"][href^=\"" + url + "\"], script[data-next-page=\"" + route + "\"]")) {
-        return;
-      } // Inspired by quicklink, license: https://github.com/GoogleChromeLabs/quicklink/blob/master/LICENSE
-
-
+      // 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 the user is on 2G or if Save-Data is enabled.
-        if ((cn.effectiveType || '').indexOf('2g') !== -1 || cn.saveData) {
-          return;
-        }
+        // Don't prefetch if using 2G or if Save-Data is enabled.
+        if (cn.saveData || /2g/.test(cn.effectiveType)) return;
       }
 
-      if ( true && !isDependency) {
-        ;
-        (yield _this2.getDependencies(route)).forEach(url => {
-          _this2.prefetch(url, true);
-        });
-      } // Feature detection is used to see if preload is supported
-      // If not fall back to loading script tags before the page is loaded
-      // https://caniuse.com/#feat=link-rel-preload
+      var url = _this2.assetPrefix;
 
+      if (isDependency) {
+        url += route;
+      } else {
+        route = _this2.normalizeRoute(route);
+        _this2.prefetched[route] = true;
+        var scriptRoute = (route === '/' ? '/index' : route) + ".js";
 
-      if (hasPreload) {
-        preloadLink(url, url.match(/\.css$/) ? 'style' : 'script');
-        return;
+        if ( true && hasNoModule) {
+          scriptRoute = scriptRoute.replace(/\.js$/, '.module.js');
+        }
+
+        url += "/_next/static/" + encodeURIComponent(_this2.buildId) + "/pages" + encodeURI(scriptRoute);
       }
 
-      if (isDependency) {
-        // loadPage will automatically handle depencies, so no need to
-        // preload them manually
+      if (document.querySelector("link[rel=\"" + relPrefetch + "\"][href^=\"" + url + "\"], script[data-next-page=\"" + route + "\"]")) {
         return;
       }
 
-      if (document.readyState === 'complete') {
-        return _this2.loadPage(route).catch(() => {});
-      } else {
-        return new _promise.default(resolve => {
-          window.addEventListener('load', () => {
-            _this2.loadPage(route).then(() => resolve(), () => resolve());
-          });
-        });
-      }
+      return _promise.default.all([appendLink(url, relPrefetch, url.match(/\.css$/) ? 'style' : 'script'),  true && !isDependency && _this2.getDependencies(route).then(urls => _promise.default.all(urls.map(url => _this2.prefetch(url, true))))]).then( // do not return any data
+      () => {}, // swallow prefetch errors
+      () => {});
     })();
   }
Diff for link.js
@@ -578,15 +578,30 @@ function (_react$Component) {
       this.cleanUpListeners();
     }
   }, {
+    key: "getHref",
+    value: function getHref() {
+      var pathname = window.location.pathname;
+
+      var _this$formatUrls2 = this.formatUrls(this.props.href, this.props.as),
+          parsedHref = _this$formatUrls2.href;
+
+      return (0, _url.resolve)(pathname, parsedHref);
+    }
+  }, {
     key: "handleRef",
     value: function handleRef(ref) {
       var _this2 = this;
 
+      var isPrefetched = _router["default"].router.pageLoader.prefetched[this.getHref()];
+
       if (this.p && IntersectionObserver && ref && ref.tagName) {
         this.cleanUpListeners();
-        this.cleanUpListeners = listenToIntersections(ref, function () {
-          _this2.prefetch();
-        });
+
+        if (!isPrefetched) {
+          this.cleanUpListeners = listenToIntersections(ref, function () {
+            _this2.prefetch();
+          });
+        }
       }
     } // The function is memoized so that no extra lifecycles are needed
     // as per https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html
@@ -596,14 +611,7 @@ function (_react$Component) {
     value: function prefetch() {
       if (!this.p || false) return; // Prefetch the JSON page if asked (only in the client)
 
-      var pathname = window.location.pathname;
-
-      var _this$formatUrls2 = this.formatUrls(this.props.href, this.props.as),
-          parsedHref = _this$formatUrls2.href;
-
-      var href = (0, _url.resolve)(pathname, parsedHref);
-
-      _router["default"].prefetch(href);
+      _router["default"].prefetch(this.getHref());
     }
   }, {
     key: "render",
Diff for link.module.js
@@ -451,12 +451,27 @@ class Link extends _react.Component {
     this.cleanUpListeners();
   }
 
+  getHref() {
+    var {
+      pathname
+    } = window.location;
+    var {
+      href: parsedHref
+    } = this.formatUrls(this.props.href, this.props.as);
+    return (0, _url.resolve)(pathname, parsedHref);
+  }
+
   handleRef(ref) {
+    var isPrefetched = _router.default.router.pageLoader.prefetched[this.getHref()];
+
     if (this.p && IntersectionObserver && ref && ref.tagName) {
       this.cleanUpListeners();
-      this.cleanUpListeners = listenToIntersections(ref, () => {
-        this.prefetch();
-      });
+
+      if (!isPrefetched) {
+        this.cleanUpListeners = listenToIntersections(ref, () => {
+          this.prefetch();
+        });
+      }
     }
   } // The function is memoized so that no extra lifecycles are needed
   // as per https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html
@@ -465,15 +480,7 @@ class Link extends _react.Component {
   prefetch() {
     if (!this.p || false) return; // Prefetch the JSON page if asked (only in the client)
 
-    var {
-      pathname
-    } = window.location;
-    var {
-      href: parsedHref
-    } = this.formatUrls(this.props.href, this.props.as);
-    var href = (0, _url.resolve)(pathname, parsedHref);
-
-    _router.default.prefetch(href);
+    _router.default.prefetch(this.getHref());
   }
 
   render() {
Diff for index.html
@@ -12,13 +12,13 @@
         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-e6c4147e120731ef04d8.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-8fb9ec4f0f41c17577d8.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/framework.9c9aa574c484a7d0240e.module.js"
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/4952ddcd88e7185e66c9cf40e2d848b7e27f1574.6406830adfd759a39616.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.6544e81bc61166e45e0f.module.js"
+        <link rel="preload" href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.bdb1895cb5ac008f5797.module.js"
         as="script" crossorigin="anonymous" />
     </head>
     
@@ -44,9 +44,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-8500e7d614d5ca841401.js"
+        <script src="/_next/static/runtime/main-246540ff72f7208eb5c5.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-e6c4147e120731ef04d8.module.js"
+        <script src="/_next/static/runtime/main-8fb9ec4f0f41c17577d8.module.js"
         async="" crossorigin="anonymous" type="module"></script>
         <script src="/_next/static/chunks/framework.4c64484d8a631a55b435.js"
         async="" crossorigin="anonymous" nomodule=""></script>
@@ -58,9 +58,9 @@
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/4952ddcd88e7185e66c9cf40e2d848b7e27f1574.6406830adfd759a39616.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.4c305695c6fb0e06633d.js"
+        <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.48a2d28f0c3bd751be36.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.6544e81bc61166e45e0f.module.js"
+        <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.bdb1895cb5ac008f5797.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
@@ -16,9 +16,9 @@
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/4952ddcd88e7185e66c9cf40e2d848b7e27f1574.6406830adfd759a39616.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.6544e81bc61166e45e0f.module.js"
+        <link rel="preload" href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.bdb1895cb5ac008f5797.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-e6c4147e120731ef04d8.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-8fb9ec4f0f41c17577d8.module.js"
         as="script" crossorigin="anonymous" />
     </head>
     
@@ -57,13 +57,13 @@
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/4952ddcd88e7185e66c9cf40e2d848b7e27f1574.6406830adfd759a39616.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.4c305695c6fb0e06633d.js"
+        <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.48a2d28f0c3bd751be36.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.6544e81bc61166e45e0f.module.js"
+        <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.bdb1895cb5ac008f5797.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-8500e7d614d5ca841401.js"
+        <script src="/_next/static/runtime/main-246540ff72f7208eb5c5.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-e6c4147e120731ef04d8.module.js"
+        <script src="/_next/static/runtime/main-8fb9ec4f0f41c17577d8.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,9 +16,9 @@
         as="script" crossorigin="anonymous" />
         <link rel="preload" href="/_next/static/chunks/4952ddcd88e7185e66c9cf40e2d848b7e27f1574.6406830adfd759a39616.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.6544e81bc61166e45e0f.module.js"
+        <link rel="preload" href="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.bdb1895cb5ac008f5797.module.js"
         as="script" crossorigin="anonymous" />
-        <link rel="preload" href="/_next/static/runtime/main-e6c4147e120731ef04d8.module.js"
+        <link rel="preload" href="/_next/static/runtime/main-8fb9ec4f0f41c17577d8.module.js"
         as="script" crossorigin="anonymous" />
     </head>
     
@@ -55,13 +55,13 @@
         async="" crossorigin="anonymous" nomodule=""></script>
         <script src="/_next/static/chunks/4952ddcd88e7185e66c9cf40e2d848b7e27f1574.6406830adfd759a39616.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.4c305695c6fb0e06633d.js"
+        <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.48a2d28f0c3bd751be36.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.6544e81bc61166e45e0f.module.js"
+        <script src="/_next/static/chunks/de003c3a9d308750aa009870a5926f9b18ab31f4.bdb1895cb5ac008f5797.module.js"
         async="" crossorigin="anonymous" type="module"></script>
-        <script src="/_next/static/runtime/main-8500e7d614d5ca841401.js"
+        <script src="/_next/static/runtime/main-246540ff72f7208eb5c5.js"
         async="" crossorigin="anonymous" nomodule=""></script>
-        <script src="/_next/static/runtime/main-e6c4147e120731ef04d8.module.js"
+        <script src="/_next/static/runtime/main-8fb9ec4f0f41c17577d8.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 zeit/next.js refs/tags/v9.1.7-canary.4 Change
buildDuration 14.6s 14.6s ⚠️ +65ms
nodeModulesSize 48.7 MB 48.9 MB ⚠️ +271 kB
Client Bundles (main, webpack, commons) Overall decrease ✓
zeit/next.js canary zeit/next.js refs/tags/v9.1.7-canary.4 Change
main-HASH.js 18.5 kB 18.2 kB -336 B
main-HASH.js gzip 6.49 kB 6.43 kB -63 B
webpack-HASH.js 1.53 kB 1.53 kB
webpack-HASH.js gzip 746 B 746 B
4952ddcd88e7..1db6754d3.js 12 kB 12 kB
4952ddcd88e7..54d3.js gzip 4.68 kB 4.68 kB
commons.HASH.js 10.9 kB 10.9 kB
commons.HASH.js gzip 4.06 kB 4.06 kB
de003c3a9d30..7d55a2235.js 38.3 kB N/A N/A
de003c3a9d30..2235.js gzip 13.9 kB N/A N/A
framework.HASH.js 126 kB 126 kB
framework.HASH.js gzip 39.5 kB 39.5 kB
de003c3a9d30..17cdc0d60.js N/A 38.3 kB N/A
de003c3a9d30..0d60.js gzip N/A 13.9 kB N/A
Overall change 207 kB 206 kB -336 B
Client Bundles (main, webpack, commons) Modern Overall decrease ✓
zeit/next.js canary zeit/next.js refs/tags/v9.1.7-canary.4 Change
main-HASH.module.js 14.5 kB 14.4 kB -109 B
main-HASH.module.js gzip 5.41 kB 5.41 kB -1 B
webpack-HASH.module.js 1.53 kB 1.53 kB
webpack-HASH..dule.js gzip 746 B 746 B
4952ddcd88e7..b9.module.js 14.9 kB 14.9 kB
4952ddcd88e7..dule.js gzip 5.56 kB 5.56 kB
de003c3a9d30..a0.module.js 33.1 kB N/A N/A
de003c3a9d30..dule.js gzip 12.5 kB N/A N/A
framework.HASH.module.js 126 kB 126 kB
framework.HA..dule.js gzip 39.4 kB 39.4 kB
de003c3a9d30..e3.module.js N/A 33.1 kB N/A
de003c3a9d30..dule.js gzip N/A 12.5 kB N/A
Overall change 190 kB 189 kB -109 B
Legacy Client Bundles (polyfills)
zeit/next.js canary zeit/next.js refs/tags/v9.1.7-canary.4 Change
polyfills-HASH.js 15.3 kB 15.3 kB
polyfills-HASH.js gzip 4.76 kB 4.76 kB
Overall change 15.3 kB 15.3 kB
Client Pages Overall increase ⚠️
zeit/next.js canary zeit/next.js refs/tags/v9.1.7-canary.4 Change
_app.js 2.94 kB 2.94 kB
_app.js gzip 1.33 kB 1.33 kB
_error.js 10.4 kB 10.4 kB
_error.js gzip 4.07 kB 4.07 kB
hooks.js 1.44 kB 1.44 kB
hooks.js gzip 779 B 779 B
index.js 318 B 318 B
index.js gzip 222 B 222 B
link.js 6.77 kB 6.88 kB ⚠️ +109 B
link.js gzip 2.89 kB 2.93 kB ⚠️ +37 B
routerDirect.js 411 B 411 B
routerDirect.js gzip 283 B 283 B
withRouter.js 421 B 421 B
withRouter.js gzip 282 B 282 B
Overall change 22.7 kB 22.8 kB ⚠️ +109 B
Client Pages Modern Overall increase ⚠️
zeit/next.js canary zeit/next.js refs/tags/v9.1.7-canary.4 Change
_app.module.js 1.54 kB 1.54 kB
_app.module.js gzip 757 B 757 B
_error.module.js 7.35 kB 7.35 kB
_error.module.js gzip 3.06 kB 3.06 kB
hooks.module.js 651 B 651 B
hooks.module.js gzip 371 B 371 B
index.module.js 276 B 276 B
index.module.js gzip 212 B 212 B
link.module.js 5.45 kB 5.54 kB ⚠️ +89 B
link.module.js gzip 2.46 kB 2.49 kB ⚠️ +35 B
routerDirect.module.js 383 B 383 B
routerDirect..dule.js gzip 273 B 273 B
withRouter.module.js 394 B 394 B
withRouter.m..dule.js gzip 272 B 272 B
Overall change 16 kB 16.1 kB ⚠️ +89 B
Client Build Manifests
zeit/next.js canary zeit/next.js refs/tags/v9.1.7-canary.4 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 increase ⚠️
zeit/next.js canary zeit/next.js refs/tags/v9.1.7-canary.4 Change
_error.js 281 kB 299 kB ⚠️ +17.8 kB
_error.js gzip 74.8 kB 78.8 kB ⚠️ +4 kB
hooks.html 4.19 kB 4.19 kB
hooks.html gzip 1.07 kB 1.07 kB -1 B
index.js 281 kB 299 kB ⚠️ +17.2 kB
index.js gzip 75.1 kB 79.1 kB ⚠️ +3.97 kB
link.js 289 kB 306 kB ⚠️ +17.4 kB
link.js gzip 77.1 kB 81.1 kB ⚠️ +4 kB
routerDirect.js 282 kB 299 kB ⚠️ +17.3 kB
routerDirect.js gzip 75.2 kB 79.1 kB ⚠️ +3.93 kB
withRouter.js 282 kB 299 kB ⚠️ +17.3 kB
withRouter.js gzip 75.3 kB 79.3 kB ⚠️ +3.98 kB
Overall change 1.42 MB 1.51 MB ⚠️ +86.9 kB

Please sign in to comment.