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

Allow to opt-out from preflight cache #32767

Merged
merged 3 commits into from
Jan 3, 2022

Conversation

javivelasco
Copy link
Member

Fixes #32727

With this PR we introduce a new header that can be used to respond from Middleware x-middleware-cache. When the value of this header is set to no-cache, the client will not store the effects read from a preflight response to be used in an upcoming check.

Instead of using Cache-Control we are using a custom header to not mess with browser specific caching. Accepting a specific value to opt out (no-cache) opens the future opportunity of having other caching strategies.

This feature solves the issue of having a preflight request whose parameters can change from the client affecting the effects. For example, having a cookie that would make a middleware rewrite to one pathname or another and allowing to change that cookie from the client. In that case we'd always need to revalidate the effects on navigation synchronously.

Of course when using this feature it is possible that we add some latency on navigation so the preferred mechanism will be caching by default since it covers the most common use cases.

@ijjk

This comment has been minimized.

@ijjk

This comment has been minimized.

@ijjk
Copy link
Member

ijjk commented Jan 3, 2022

Stats from current PR

Default Build (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary javivelasco/next.js add/prelight-cache-opt-out Change
buildDuration 20.3s 19.6s -690ms
buildDurationCached 4.4s 4.4s ⚠️ +82ms
nodeModulesSize 348 MB 348 MB ⚠️ +202 B
Page Load Tests Overall decrease ⚠️
vercel/next.js canary javivelasco/next.js add/prelight-cache-opt-out Change
/ failed reqs 0 0
/ total time (seconds) 4.149 4.095 -0.05
/ avg req/sec 602.5 610.54 +8.04
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 2.226 2.245 ⚠️ +0.02
/error-in-render avg req/sec 1123.22 1113.52 ⚠️ -9.7
Client Bundles (main, webpack, commons) Overall increase ⚠️
vercel/next.js canary javivelasco/next.js add/prelight-cache-opt-out Change
450.HASH.js gzip 179 B 179 B
framework-HASH.js gzip 42.2 kB 42.2 kB
main-HASH.js gzip 27 kB 27.1 kB ⚠️ +15 B
webpack-HASH.js gzip 1.45 kB 1.45 kB
Overall change 70.9 kB 70.9 kB ⚠️ +15 B
Legacy Client Bundles (polyfills)
vercel/next.js canary javivelasco/next.js add/prelight-cache-opt-out Change
polyfills-HASH.js gzip 31 kB 31 kB
Overall change 31 kB 31 kB
Client Pages
vercel/next.js canary javivelasco/next.js add/prelight-cache-opt-out Change
_app-HASH.js gzip 1.37 kB 1.37 kB
_error-HASH.js gzip 194 B 194 B
amp-HASH.js gzip 312 B 312 B
css-HASH.js gzip 326 B 326 B
dynamic-HASH.js gzip 2.37 kB 2.37 kB
head-HASH.js gzip 350 B 350 B
hooks-HASH.js gzip 919 B 919 B
image-HASH.js gzip 4.74 kB 4.74 kB
index-HASH.js gzip 263 B 263 B
link-HASH.js gzip 2.13 kB 2.13 kB
routerDirect..HASH.js gzip 321 B 321 B
script-HASH.js gzip 383 B 383 B
withRouter-HASH.js gzip 318 B 318 B
85e02e95b279..7e3.css gzip 107 B 107 B
Overall change 14.1 kB 14.1 kB
Client Build Manifests
vercel/next.js canary javivelasco/next.js add/prelight-cache-opt-out Change
_buildManifest.js gzip 459 B 459 B
Overall change 459 B 459 B
Rendered Page Sizes
vercel/next.js canary javivelasco/next.js add/prelight-cache-opt-out Change
index.html gzip 533 B 533 B
link.html gzip 547 B 547 B
withRouter.html gzip 527 B 527 B
Overall change 1.61 kB 1.61 kB

Diffs

Diff for main-HASH.js
@@ -6288,6 +6288,7 @@
                     throw new Error("Failed to preflight request");
                   }
                   return {
+                    cache: res.headers.get("x-middleware-cache"),
                     redirect: res.headers.get("Location"),
                     refresh: res.headers.has("x-middleware-refresh"),
                     rewrite: res.headers.get("x-middleware-rewrite"),
@@ -6295,7 +6296,7 @@
                   };
                 })
                 .then(function(data) {
-                  if (shouldCache) {
+                  if (shouldCache && data.cache !== "no-cache") {
                     _this.sde[cacheKey] = data;
                   }
                   return data;
Diff for index.html
@@ -19,7 +19,7 @@
       defer=""
     ></script>
     <script
-      src="/_next/static/chunks/main-9cee2973de78a626.js"
+      src="/_next/static/chunks/main-810ef4d365d73085.js"
       defer=""
     ></script>
     <script
Diff for link.html
@@ -19,7 +19,7 @@
       defer=""
     ></script>
     <script
-      src="/_next/static/chunks/main-9cee2973de78a626.js"
+      src="/_next/static/chunks/main-810ef4d365d73085.js"
       defer=""
     ></script>
     <script
Diff for withRouter.html
@@ -19,7 +19,7 @@
       defer=""
     ></script>
     <script
-      src="/_next/static/chunks/main-9cee2973de78a626.js"
+      src="/_next/static/chunks/main-810ef4d365d73085.js"
       defer=""
     ></script>
     <script

Default Build with SWC (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary javivelasco/next.js add/prelight-cache-opt-out Change
buildDuration 21.9s 21.3s -585ms
buildDurationCached 4.4s 4.2s -242ms
nodeModulesSize 348 MB 348 MB ⚠️ +202 B
Page Load Tests Overall increase ✓
vercel/next.js canary javivelasco/next.js add/prelight-cache-opt-out Change
/ failed reqs 0 0
/ total time (seconds) 4.072 4.081 ⚠️ +0.01
/ avg req/sec 613.89 612.56 ⚠️ -1.33
/error-in-render failed reqs 0 0
/error-in-render total time (seconds) 2.299 2.207 -0.09
/error-in-render avg req/sec 1087.35 1132.77 +45.42
Client Bundles (main, webpack, commons) Overall increase ⚠️
vercel/next.js canary javivelasco/next.js add/prelight-cache-opt-out Change
450.HASH.js gzip 179 B 179 B
framework-HASH.js gzip 42.3 kB 42.3 kB
main-HASH.js gzip 27.2 kB 27.2 kB ⚠️ +17 B
webpack-HASH.js gzip 1.44 kB 1.44 kB
Overall change 71.1 kB 71.1 kB ⚠️ +17 B
Legacy Client Bundles (polyfills)
vercel/next.js canary javivelasco/next.js add/prelight-cache-opt-out Change
polyfills-HASH.js gzip 31 kB 31 kB
Overall change 31 kB 31 kB
Client Pages
vercel/next.js canary javivelasco/next.js add/prelight-cache-opt-out Change
_app-HASH.js gzip 1.35 kB 1.35 kB
_error-HASH.js gzip 180 B 180 B
amp-HASH.js gzip 305 B 305 B
css-HASH.js gzip 321 B 321 B
dynamic-HASH.js gzip 2.36 kB 2.36 kB
head-HASH.js gzip 342 B 342 B
hooks-HASH.js gzip 906 B 906 B
image-HASH.js gzip 4.76 kB 4.76 kB
index-HASH.js gzip 256 B 256 B
link-HASH.js gzip 2.19 kB 2.19 kB
routerDirect..HASH.js gzip 314 B 314 B
script-HASH.js gzip 375 B 375 B
withRouter-HASH.js gzip 309 B 309 B
85e02e95b279..7e3.css gzip 107 B 107 B
Overall change 14.1 kB 14.1 kB
Client Build Manifests
vercel/next.js canary javivelasco/next.js add/prelight-cache-opt-out Change
_buildManifest.js gzip 459 B 459 B
Overall change 459 B 459 B
Rendered Page Sizes
vercel/next.js canary javivelasco/next.js add/prelight-cache-opt-out Change
index.html gzip 531 B 531 B
link.html gzip 545 B 545 B
withRouter.html gzip 526 B 526 B
Overall change 1.6 kB 1.6 kB

Diffs

Diff for main-HASH.js
@@ -6288,6 +6288,7 @@
                     throw new Error("Failed to preflight request");
                   }
                   return {
+                    cache: res.headers.get("x-middleware-cache"),
                     redirect: res.headers.get("Location"),
                     refresh: res.headers.has("x-middleware-refresh"),
                     rewrite: res.headers.get("x-middleware-rewrite"),
@@ -6295,7 +6296,7 @@
                   };
                 })
                 .then(function(data) {
-                  if (shouldCache) {
+                  if (shouldCache && data.cache !== "no-cache") {
                     _this.sde[cacheKey] = data;
                   }
                   return data;
Diff for index.html
@@ -19,7 +19,7 @@
       defer=""
     ></script>
     <script
-      src="/_next/static/chunks/main-9cee2973de78a626.js"
+      src="/_next/static/chunks/main-810ef4d365d73085.js"
       defer=""
     ></script>
     <script
Diff for link.html
@@ -19,7 +19,7 @@
       defer=""
     ></script>
     <script
-      src="/_next/static/chunks/main-9cee2973de78a626.js"
+      src="/_next/static/chunks/main-810ef4d365d73085.js"
       defer=""
     ></script>
     <script
Diff for withRouter.html
@@ -19,7 +19,7 @@
       defer=""
     ></script>
     <script
-      src="/_next/static/chunks/main-9cee2973de78a626.js"
+      src="/_next/static/chunks/main-810ef4d365d73085.js"
       defer=""
     ></script>
     <script
Commit: 29caf7a

@kodiakhq kodiakhq bot merged commit 82adaee into vercel:canary Jan 3, 2022
@javivelasco javivelasco deleted the add/prelight-cache-opt-out branch January 3, 2022 18:15
@vercel vercel locked as resolved and limited conversation to collaborators Feb 2, 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.

Allow to opt-out from caching Middleware Preflight
2 participants