Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Update fallback 404 handling to prevent reload loop #18119

Merged
merged 2 commits into from
Oct 22, 2020

Conversation

ijjk
Copy link
Member

@ijjk ijjk commented Oct 22, 2020

This updates the fallback 404 handling to render the correct 404 page on the client when a 404 is returned from fetching the data route on a fallback page on the client. This prevents us from having to rely on a cache to be updated by the time we reload the page to prevent non-stop reloading.

This also adds handling in serverless mode to ensure the correct 404 page is rendered when leveraging fallback: 'blocking' mode.

Additional tests for the fallback: 'blocking' 404 handling will be added in a follow-up where returning notFound from getServerSideProps is also added.

@ijjk
Copy link
Member Author

ijjk commented Oct 22, 2020

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary ijjk/next.js ssg/not-found-serverless Change
buildDuration 11.6s 11.3s -310ms
nodeModulesSize 91.2 MB 91.2 MB ⚠️ +2.36 kB
Page Load Tests Overall increase ✓
vercel/next.js canary ijjk/next.js ssg/not-found-serverless Change
/ failed reqs 0 0
/ total time (seconds) 2.287 2.26 -0.03
/ avg req/sec 1093.24 1106.3 +13.06
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.41 1.397 -0.01
/error-in-render avg req/sec 1773.41 1790.11 +16.7
Client Bundles (main, webpack, commons) Overall increase ⚠️
vercel/next.js canary ijjk/next.js ssg/not-found-serverless Change
677f882d2ed8..35e7.js gzip 11.1 kB 11.2 kB ⚠️ +126 B
framework.HASH.js gzip 39 kB 39 kB
main-23d7afb..be6f.js gzip 7.34 kB 7.34 kB
webpack-e067..f178.js gzip 751 B 751 B
Overall change 58.1 kB 58.3 kB ⚠️ +126 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
vercel/next.js canary ijjk/next.js ssg/not-found-serverless Change
677f882d2ed8..dule.js gzip 6.94 kB 7.01 kB ⚠️ +68 B
framework.HA..dule.js gzip 39 kB 39 kB
main-ccae7c3..dule.js gzip 6.32 kB 6.32 kB
webpack-07c5..dule.js gzip 751 B 751 B
Overall change 53 kB 53 kB ⚠️ +68 B
Legacy Client Bundles (polyfills)
vercel/next.js canary ijjk/next.js ssg/not-found-serverless Change
polyfills-4b..e242.js gzip 31 kB 31 kB
Overall change 31 kB 31 kB
Client Pages
vercel/next.js canary ijjk/next.js ssg/not-found-serverless 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-89ad9e7..25bb.js gzip 1.34 kB 1.34 kB
routerDirect..924c.js gzip 284 B 284 B
withRouter-7..c13d.js gzip 284 B 284 B
Overall change 7.74 kB 7.74 kB
Client Pages Modern
vercel/next.js canary ijjk/next.js ssg/not-found-serverless 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-aeb707b..dule.js gzip 1.29 kB 1.29 kB
routerDirect..dule.js gzip 284 B 284 B
withRouter-f..dule.js gzip 282 B 282 B
Overall change 5.39 kB 5.39 kB
Client Build Manifests
vercel/next.js canary ijjk/next.js ssg/not-found-serverless Change
_buildManifest.js gzip 322 B 322 B
_buildManife..dule.js gzip 329 B 329 B
Overall change 651 B 651 B
Rendered Page Sizes Overall decrease ✓
vercel/next.js canary ijjk/next.js ssg/not-found-serverless Change
index.html gzip 1 kB 1 kB -1 B
link.html gzip 1.01 kB 1.01 kB -1 B
withRouter.html gzip 994 B 994 B
Overall change 3.01 kB 3 kB -2 B

Diffs

Diff for 677f882d2ed8..d3.module.js
@@ -832,7 +832,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
           // We should only trigger a server-side transition if this was caused
           // on a client-side transition. Otherwise, we'd get into an infinite
           // loop.
-          if (!isServerRender || err.message === "SSG Data NOT_FOUND") {
+          if (!isServerRender) {
             markLoadingError(err);
           }
 
@@ -1322,9 +1322,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
             //  3. Internal error while loading the page
             // So, doing a hard reload is the proper way to deal with this.
 
-            if (false) {
-            }
-
             window.location.href = as; // Changing the URL doesn't block executing the current code path.
             // So let's throw a cancellation error stop the routing logic.
 
@@ -1332,14 +1329,34 @@ 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 ssg404 = err.message === SSG_DATA_NOT_FOUND_ERROR;
+
+            if (ssg404) {
+              try {
+                ({ page: Component, styleSheets } = await this.fetchComponent(
+                  "/404"
+                ));
+              } catch (_err) {
+                // non-fatal fallback to _error
+              }
+            }
+
+            if (
+              typeof Component === "undefined" ||
+              typeof styleSheets === "undefined"
+            ) {
+              ({ page: Component, styleSheets } = await this.fetchComponent(
+                "/_error"
+              ));
+            }
+
             var routeInfo = {
               Component,
               styleSheets,
-              err,
-              error: err
+              err: ssg404 ? undefined : err,
+              error: ssg404 ? undefined : err
             };
 
             try {
@@ -1348,6 +1365,12 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
                 pathname,
                 query
               });
+
+              if (ssg404 && routeInfo.props && routeInfo.props.pageProps) {
+                routeInfo.props.pageProps.statusCode = 404;
+              }
+
+              console.log(routeInfo);
             } catch (gipErr) {
               console.error("Error in error page `getInitialProps`: ", gipErr);
               routeInfo.props = {};
Diff for 677f882d2ed8..5b45de20a.js
@@ -978,7 +978,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
           // We should only trigger a server-side transition if this was caused
           // on a client-side transition. Otherwise, we'd get into an infinite
           // loop.
-          if (!isServerRender || err.message === "SSG Data NOT_FOUND") {
+          if (!isServerRender) {
             markLoadingError(err);
           }
 
@@ -1661,7 +1661,12 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
                   as,
                   loadErrorFail
                 ) {
-                  var _yield$this$fetchComp, Component, styleSheets, routeInfo;
+                  var Component,
+                    styleSheets,
+                    ssg404,
+                    _yield$this$fetchComp,
+                    _yield$this$fetchComp2,
+                    routeInfo;
 
                   return _regeneratorRuntime.wrap(
                     function _callee2$(_context2) {
@@ -1677,7 +1682,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
 
                           case 2:
                             if (!(PAGE_LOAD_ERROR in err || loadErrorFail)) {
-                              _context2.next = 7;
+                              _context2.next = 6;
                               break;
                             }
 
@@ -1687,61 +1692,103 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
                             //  3. Internal error while loading the page
                             // So, doing a hard reload is the proper way to deal with this.
 
-                            if (false) {
-                            }
-
                             window.location.href = as; // Changing the URL doesn't block executing the current code path.
                             // So let's throw a cancellation error stop the routing logic.
 
                             throw buildCancellationError();
 
-                          case 7:
-                            _context2.prev = 7;
-                            _context2.next = 10;
-                            return this.fetchComponent("/_error");
+                          case 6:
+                            _context2.prev = 6;
+                            ssg404 = err.message === SSG_DATA_NOT_FOUND_ERROR;
 
-                          case 10:
+                            if (!ssg404) {
+                              _context2.next = 20;
+                              break;
+                            }
+
+                            _context2.prev = 9;
+                            _context2.next = 13;
+                            return this.fetchComponent("/404");
+
+                          case 13:
                             _yield$this$fetchComp = _context2.sent;
                             Component = _yield$this$fetchComp.page;
                             styleSheets = _yield$this$fetchComp.styleSheets;
+                            _context2.next = 20;
+                            break;
+
+                          case 18:
+                            _context2.prev = 18;
+                            _context2.t0 = _context2["catch"](9);
+
+                          case 20:
+                            if (
+                              !(
+                                typeof Component === "undefined" ||
+                                typeof styleSheets === "undefined"
+                              )
+                            ) {
+                              _context2.next = 27;
+                              break;
+                            }
+
+                            _context2.next = 24;
+                            return this.fetchComponent("/_error");
+
+                          case 24:
+                            _yield$this$fetchComp2 = _context2.sent;
+                            Component = _yield$this$fetchComp2.page;
+                            styleSheets = _yield$this$fetchComp2.styleSheets;
+
+                          case 27:
                             routeInfo = {
                               Component: Component,
                               styleSheets: styleSheets,
-                              err: err,
-                              error: err
+                              err: ssg404 ? undefined : err,
+                              error: ssg404 ? undefined : err
                             };
-                            _context2.prev = 14;
-                            _context2.next = 17;
+                            _context2.prev = 28;
+                            _context2.next = 31;
                             return this.getInitialProps(Component, {
                               err: err,
                               pathname: pathname,
                               query: query
                             });
 
-                          case 17:
+                          case 31:
                             routeInfo.props = _context2.sent;
-                            _context2.next = 24;
+
+                            if (
+                              ssg404 &&
+                              routeInfo.props &&
+                              routeInfo.props.pageProps
+                            ) {
+                              routeInfo.props.pageProps.statusCode = 404;
+                            }
+
+                            console.log(routeInfo);
+                            _context2.next = 40;
                             break;
 
-                          case 20:
-                            _context2.prev = 20;
-                            _context2.t0 = _context2["catch"](14);
+                          case 36:
+                            _context2.prev = 36;
+                            _context2.t1 = _context2["catch"](28);
                             console.error(
                               "Error in error page `getInitialProps`: ",
-                              _context2.t0
+                              _context2.t1
                             );
                             routeInfo.props = {};
 
-                          case 24:
+                          case 40:
                             return _context2.abrupt("return", routeInfo);
 
-                          case 27:
-                            _context2.prev = 27;
-                            _context2.t1 = _context2["catch"](7);
+                          case 43:
+                            _context2.prev = 43;
+                            _context2.t2 = _context2["catch"](6);
                             return _context2.abrupt(
                               "return",
                               this.handleRouteInfoError(
-                                _context2.t1,
+                                _context2.t2,
                                 pathname,
                                 query,
                                 as,
@@ -1749,7 +1796,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
                               )
                             );
 
-                          case 30:
+                          case 46:
                           case "end":
                             return _context2.stop();
                         }
@@ -1758,8 +1805,9 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
                     _callee2,
                     this,
                     [
-                      [7, 27],
-                      [14, 20]
+                      [6, 43],
+                      [9, 18],
+                      [28, 36]
                     ]
                   );
                 })
Diff for index.html
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.15d98acc7b022abf75d3.module.js"
+      href="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.7827d40c702a1237b9a4.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -121,13 +121,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.1f665b9cff05b45de20a.js"
+      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.35448a3636e5a670ac55.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.15d98acc7b022abf75d3.module.js"
+      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.7827d40c702a1237b9a4.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
Diff for link.html
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.15d98acc7b022abf75d3.module.js"
+      href="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.7827d40c702a1237b9a4.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -126,13 +126,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.1f665b9cff05b45de20a.js"
+      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.35448a3636e5a670ac55.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.15d98acc7b022abf75d3.module.js"
+      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.7827d40c702a1237b9a4.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
Diff for withRouter.html
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.15d98acc7b022abf75d3.module.js"
+      href="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.7827d40c702a1237b9a4.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -121,13 +121,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.1f665b9cff05b45de20a.js"
+      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.35448a3636e5a670ac55.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.15d98acc7b022abf75d3.module.js"
+      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.7827d40c702a1237b9a4.module.js"
       async=""
       crossorigin="anonymous"
       type="module"

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary ijjk/next.js ssg/not-found-serverless Change
buildDuration 12.8s 12.7s -118ms
nodeModulesSize 91.2 MB 91.2 MB ⚠️ +2.36 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
vercel/next.js canary ijjk/next.js ssg/not-found-serverless Change
677f882d2ed8..35e7.js gzip 11.1 kB N/A N/A
framework.HASH.js gzip 39 kB 39 kB
main-23d7afb..be6f.js gzip 7.34 kB 7.34 kB
webpack-e067..f178.js gzip 751 B 751 B
677f882d2ed8..c743.js gzip N/A 11.2 kB N/A
Overall change 58.1 kB 58.3 kB ⚠️ +126 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
vercel/next.js canary ijjk/next.js ssg/not-found-serverless Change
677f882d2ed8..dule.js gzip 6.94 kB N/A N/A
framework.HA..dule.js gzip 39 kB 39 kB
main-ccae7c3..dule.js gzip 6.32 kB 6.32 kB
webpack-07c5..dule.js gzip 751 B 751 B
677f882d2ed8..dule.js gzip N/A 7.01 kB N/A
Overall change 53 kB 53 kB ⚠️ +68 B
Legacy Client Bundles (polyfills)
vercel/next.js canary ijjk/next.js ssg/not-found-serverless Change
polyfills-4b..e242.js gzip 31 kB 31 kB
Overall change 31 kB 31 kB
Client Pages
vercel/next.js canary ijjk/next.js ssg/not-found-serverless 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-89ad9e7..25bb.js gzip 1.34 kB 1.34 kB
routerDirect..924c.js gzip 284 B 284 B
withRouter-7..c13d.js gzip 284 B 284 B
Overall change 7.74 kB 7.74 kB
Client Pages Modern
vercel/next.js canary ijjk/next.js ssg/not-found-serverless 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-aeb707b..dule.js gzip 1.29 kB 1.29 kB
routerDirect..dule.js gzip 284 B 284 B
withRouter-f..dule.js gzip 282 B 282 B
Overall change 5.39 kB 5.39 kB
Client Build Manifests
vercel/next.js canary ijjk/next.js ssg/not-found-serverless Change
_buildManifest.js gzip 322 B 322 B
_buildManife..dule.js gzip 329 B 329 B
Overall change 651 B 651 B
Serverless bundles Overall increase ⚠️
vercel/next.js canary ijjk/next.js ssg/not-found-serverless Change
_error.js 1.06 MB 1.06 MB ⚠️ +821 B
404.html 4.73 kB 4.73 kB
hooks.html 3.92 kB 3.92 kB
index.js 1.06 MB 1.06 MB ⚠️ +821 B
link.js 1.1 MB 1.1 MB ⚠️ +1.43 kB
routerDirect.js 1.1 MB 1.1 MB ⚠️ +1.43 kB
withRouter.js 1.1 MB 1.1 MB ⚠️ +1.43 kB
Overall change 5.42 MB 5.42 MB ⚠️ +5.92 kB
Commit: 21c9d83

@ijjk
Copy link
Member Author

ijjk commented Oct 22, 2020

Stats from current PR

Default Server Mode (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary ijjk/next.js ssg/not-found-serverless Change
buildDuration 13.7s 13.6s -23ms
nodeModulesSize 91.2 MB 91.2 MB ⚠️ +2.36 kB
Page Load Tests Overall decrease ⚠️
vercel/next.js canary ijjk/next.js ssg/not-found-serverless Change
/ failed reqs 0 0
/ total time (seconds) 2.599 2.611 ⚠️ +0.01
/ avg req/sec 962 957.59 ⚠️ -4.41
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 1.412 1.513 ⚠️ +0.1
/error-in-render avg req/sec 1770.48 1652.04 ⚠️ -118.44
Client Bundles (main, webpack, commons) Overall increase ⚠️
vercel/next.js canary ijjk/next.js ssg/not-found-serverless Change
677f882d2ed8..35e7.js gzip 11.1 kB 11.2 kB ⚠️ +126 B
framework.HASH.js gzip 39 kB 39 kB
main-23d7afb..be6f.js gzip 7.34 kB 7.34 kB
webpack-e067..f178.js gzip 751 B 751 B
Overall change 58.1 kB 58.3 kB ⚠️ +126 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
vercel/next.js canary ijjk/next.js ssg/not-found-serverless Change
677f882d2ed8..dule.js gzip 6.94 kB 7.01 kB ⚠️ +68 B
framework.HA..dule.js gzip 39 kB 39 kB
main-ccae7c3..dule.js gzip 6.32 kB 6.32 kB
webpack-07c5..dule.js gzip 751 B 751 B
Overall change 53 kB 53 kB ⚠️ +68 B
Legacy Client Bundles (polyfills)
vercel/next.js canary ijjk/next.js ssg/not-found-serverless Change
polyfills-4b..e242.js gzip 31 kB 31 kB
Overall change 31 kB 31 kB
Client Pages
vercel/next.js canary ijjk/next.js ssg/not-found-serverless 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-89ad9e7..25bb.js gzip 1.34 kB 1.34 kB
routerDirect..924c.js gzip 284 B 284 B
withRouter-7..c13d.js gzip 284 B 284 B
Overall change 7.74 kB 7.74 kB
Client Pages Modern
vercel/next.js canary ijjk/next.js ssg/not-found-serverless 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-aeb707b..dule.js gzip 1.29 kB 1.29 kB
routerDirect..dule.js gzip 284 B 284 B
withRouter-f..dule.js gzip 282 B 282 B
Overall change 5.39 kB 5.39 kB
Client Build Manifests
vercel/next.js canary ijjk/next.js ssg/not-found-serverless Change
_buildManifest.js gzip 322 B 322 B
_buildManife..dule.js gzip 329 B 329 B
Overall change 651 B 651 B
Rendered Page Sizes Overall decrease ✓
vercel/next.js canary ijjk/next.js ssg/not-found-serverless Change
index.html gzip 1 kB 1 kB -1 B
link.html gzip 1.01 kB 1.01 kB -1 B
withRouter.html gzip 994 B 994 B
Overall change 3.01 kB 3 kB -2 B

Diffs

Diff for 677f882d2ed8..d3.module.js
@@ -832,7 +832,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
           // We should only trigger a server-side transition if this was caused
           // on a client-side transition. Otherwise, we'd get into an infinite
           // loop.
-          if (!isServerRender || err.message === "SSG Data NOT_FOUND") {
+          if (!isServerRender) {
             markLoadingError(err);
           }
 
@@ -1322,9 +1322,6 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
             //  3. Internal error while loading the page
             // So, doing a hard reload is the proper way to deal with this.
 
-            if (false) {
-            }
-
             window.location.href = as; // Changing the URL doesn't block executing the current code path.
             // So let's throw a cancellation error stop the routing logic.
 
@@ -1332,14 +1329,34 @@ 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 ssg404 = err.message === SSG_DATA_NOT_FOUND_ERROR;
+
+            if (ssg404) {
+              try {
+                ({ page: Component, styleSheets } = await this.fetchComponent(
+                  "/404"
+                ));
+              } catch (_err) {
+                // non-fatal fallback to _error
+              }
+            }
+
+            if (
+              typeof Component === "undefined" ||
+              typeof styleSheets === "undefined"
+            ) {
+              ({ page: Component, styleSheets } = await this.fetchComponent(
+                "/_error"
+              ));
+            }
+
             var routeInfo = {
               Component,
               styleSheets,
-              err,
-              error: err
+              err: ssg404 ? undefined : err,
+              error: ssg404 ? undefined : err
             };
 
             try {
@@ -1348,6 +1365,12 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
                 pathname,
                 query
               });
+
+              if (ssg404 && routeInfo.props && routeInfo.props.pageProps) {
+                routeInfo.props.pageProps.statusCode = 404;
+              }
+
+              console.log(routeInfo);
             } catch (gipErr) {
               console.error("Error in error page `getInitialProps`: ", gipErr);
               routeInfo.props = {};
Diff for 677f882d2ed8..5b45de20a.js
@@ -978,7 +978,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
           // We should only trigger a server-side transition if this was caused
           // on a client-side transition. Otherwise, we'd get into an infinite
           // loop.
-          if (!isServerRender || err.message === "SSG Data NOT_FOUND") {
+          if (!isServerRender) {
             markLoadingError(err);
           }
 
@@ -1661,7 +1661,12 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
                   as,
                   loadErrorFail
                 ) {
-                  var _yield$this$fetchComp, Component, styleSheets, routeInfo;
+                  var Component,
+                    styleSheets,
+                    ssg404,
+                    _yield$this$fetchComp,
+                    _yield$this$fetchComp2,
+                    routeInfo;
 
                   return _regeneratorRuntime.wrap(
                     function _callee2$(_context2) {
@@ -1677,7 +1682,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
 
                           case 2:
                             if (!(PAGE_LOAD_ERROR in err || loadErrorFail)) {
-                              _context2.next = 7;
+                              _context2.next = 6;
                               break;
                             }
 
@@ -1687,61 +1692,103 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
                             //  3. Internal error while loading the page
                             // So, doing a hard reload is the proper way to deal with this.
 
-                            if (false) {
-                            }
-
                             window.location.href = as; // Changing the URL doesn't block executing the current code path.
                             // So let's throw a cancellation error stop the routing logic.
 
                             throw buildCancellationError();
 
-                          case 7:
-                            _context2.prev = 7;
-                            _context2.next = 10;
-                            return this.fetchComponent("/_error");
+                          case 6:
+                            _context2.prev = 6;
+                            ssg404 = err.message === SSG_DATA_NOT_FOUND_ERROR;
 
-                          case 10:
+                            if (!ssg404) {
+                              _context2.next = 20;
+                              break;
+                            }
+
+                            _context2.prev = 9;
+                            _context2.next = 13;
+                            return this.fetchComponent("/404");
+
+                          case 13:
                             _yield$this$fetchComp = _context2.sent;
                             Component = _yield$this$fetchComp.page;
                             styleSheets = _yield$this$fetchComp.styleSheets;
+                            _context2.next = 20;
+                            break;
+
+                          case 18:
+                            _context2.prev = 18;
+                            _context2.t0 = _context2["catch"](9);
+
+                          case 20:
+                            if (
+                              !(
+                                typeof Component === "undefined" ||
+                                typeof styleSheets === "undefined"
+                              )
+                            ) {
+                              _context2.next = 27;
+                              break;
+                            }
+
+                            _context2.next = 24;
+                            return this.fetchComponent("/_error");
+
+                          case 24:
+                            _yield$this$fetchComp2 = _context2.sent;
+                            Component = _yield$this$fetchComp2.page;
+                            styleSheets = _yield$this$fetchComp2.styleSheets;
+
+                          case 27:
                             routeInfo = {
                               Component: Component,
                               styleSheets: styleSheets,
-                              err: err,
-                              error: err
+                              err: ssg404 ? undefined : err,
+                              error: ssg404 ? undefined : err
                             };
-                            _context2.prev = 14;
-                            _context2.next = 17;
+                            _context2.prev = 28;
+                            _context2.next = 31;
                             return this.getInitialProps(Component, {
                               err: err,
                               pathname: pathname,
                               query: query
                             });
 
-                          case 17:
+                          case 31:
                             routeInfo.props = _context2.sent;
-                            _context2.next = 24;
+
+                            if (
+                              ssg404 &&
+                              routeInfo.props &&
+                              routeInfo.props.pageProps
+                            ) {
+                              routeInfo.props.pageProps.statusCode = 404;
+                            }
+
+                            console.log(routeInfo);
+                            _context2.next = 40;
                             break;
 
-                          case 20:
-                            _context2.prev = 20;
-                            _context2.t0 = _context2["catch"](14);
+                          case 36:
+                            _context2.prev = 36;
+                            _context2.t1 = _context2["catch"](28);
                             console.error(
                               "Error in error page `getInitialProps`: ",
-                              _context2.t0
+                              _context2.t1
                             );
                             routeInfo.props = {};
 
-                          case 24:
+                          case 40:
                             return _context2.abrupt("return", routeInfo);
 
-                          case 27:
-                            _context2.prev = 27;
-                            _context2.t1 = _context2["catch"](7);
+                          case 43:
+                            _context2.prev = 43;
+                            _context2.t2 = _context2["catch"](6);
                             return _context2.abrupt(
                               "return",
                               this.handleRouteInfoError(
-                                _context2.t1,
+                                _context2.t2,
                                 pathname,
                                 query,
                                 as,
@@ -1749,7 +1796,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
                               )
                             );
 
-                          case 30:
+                          case 46:
                           case "end":
                             return _context2.stop();
                         }
@@ -1758,8 +1805,9 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
                     _callee2,
                     this,
                     [
-                      [7, 27],
-                      [14, 20]
+                      [6, 43],
+                      [9, 18],
+                      [28, 36]
                     ]
                   );
                 })
Diff for index.html
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.15d98acc7b022abf75d3.module.js"
+      href="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.7827d40c702a1237b9a4.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -121,13 +121,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.1f665b9cff05b45de20a.js"
+      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.35448a3636e5a670ac55.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.15d98acc7b022abf75d3.module.js"
+      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.7827d40c702a1237b9a4.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
Diff for link.html
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.15d98acc7b022abf75d3.module.js"
+      href="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.7827d40c702a1237b9a4.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -126,13 +126,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.1f665b9cff05b45de20a.js"
+      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.35448a3636e5a670ac55.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.15d98acc7b022abf75d3.module.js"
+      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.7827d40c702a1237b9a4.module.js"
       async=""
       crossorigin="anonymous"
       type="module"
Diff for withRouter.html
@@ -24,7 +24,7 @@
     />
     <link
       rel="preload"
-      href="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.15d98acc7b022abf75d3.module.js"
+      href="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.7827d40c702a1237b9a4.module.js"
       as="script"
       crossorigin="anonymous"
     />
@@ -121,13 +121,13 @@
       type="module"
     ></script>
     <script
-      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.1f665b9cff05b45de20a.js"
+      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.35448a3636e5a670ac55.js"
       async=""
       crossorigin="anonymous"
       nomodule=""
     ></script>
     <script
-      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.15d98acc7b022abf75d3.module.js"
+      src="/_next/static/chunks/677f882d2ed86fa3467b8979053c1a4c3f8bc4df.7827d40c702a1237b9a4.module.js"
       async=""
       crossorigin="anonymous"
       type="module"

Serverless Mode (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary ijjk/next.js ssg/not-found-serverless Change
buildDuration 15.6s 15.7s ⚠️ +85ms
nodeModulesSize 91.2 MB 91.2 MB ⚠️ +2.36 kB
Client Bundles (main, webpack, commons) Overall increase ⚠️
vercel/next.js canary ijjk/next.js ssg/not-found-serverless Change
677f882d2ed8..35e7.js gzip 11.1 kB N/A N/A
framework.HASH.js gzip 39 kB 39 kB
main-23d7afb..be6f.js gzip 7.34 kB 7.34 kB
webpack-e067..f178.js gzip 751 B 751 B
677f882d2ed8..c743.js gzip N/A 11.2 kB N/A
Overall change 58.1 kB 58.3 kB ⚠️ +126 B
Client Bundles (main, webpack, commons) Modern Overall increase ⚠️
vercel/next.js canary ijjk/next.js ssg/not-found-serverless Change
677f882d2ed8..dule.js gzip 6.94 kB N/A N/A
framework.HA..dule.js gzip 39 kB 39 kB
main-ccae7c3..dule.js gzip 6.32 kB 6.32 kB
webpack-07c5..dule.js gzip 751 B 751 B
677f882d2ed8..dule.js gzip N/A 7.01 kB N/A
Overall change 53 kB 53 kB ⚠️ +68 B
Legacy Client Bundles (polyfills)
vercel/next.js canary ijjk/next.js ssg/not-found-serverless Change
polyfills-4b..e242.js gzip 31 kB 31 kB
Overall change 31 kB 31 kB
Client Pages
vercel/next.js canary ijjk/next.js ssg/not-found-serverless 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-89ad9e7..25bb.js gzip 1.34 kB 1.34 kB
routerDirect..924c.js gzip 284 B 284 B
withRouter-7..c13d.js gzip 284 B 284 B
Overall change 7.74 kB 7.74 kB
Client Pages Modern
vercel/next.js canary ijjk/next.js ssg/not-found-serverless 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-aeb707b..dule.js gzip 1.29 kB 1.29 kB
routerDirect..dule.js gzip 284 B 284 B
withRouter-f..dule.js gzip 282 B 282 B
Overall change 5.39 kB 5.39 kB
Client Build Manifests
vercel/next.js canary ijjk/next.js ssg/not-found-serverless Change
_buildManifest.js gzip 322 B 322 B
_buildManife..dule.js gzip 329 B 329 B
Overall change 651 B 651 B
Serverless bundles Overall increase ⚠️
vercel/next.js canary ijjk/next.js ssg/not-found-serverless Change
_error.js 1.06 MB 1.06 MB ⚠️ +821 B
404.html 4.73 kB 4.73 kB
hooks.html 3.92 kB 3.92 kB
index.js 1.06 MB 1.06 MB ⚠️ +821 B
link.js 1.1 MB 1.1 MB ⚠️ +1.43 kB
routerDirect.js 1.1 MB 1.1 MB ⚠️ +1.43 kB
withRouter.js 1.1 MB 1.1 MB ⚠️ +1.43 kB
Overall change 5.42 MB 5.42 MB ⚠️ +5.92 kB
Commit: 4c8f375

@kodiakhq kodiakhq bot merged commit 81e667b into vercel:canary Oct 22, 2020
@vercel vercel locked as resolved and limited conversation to collaborators Jan 29, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants