Skip to content

Commit 1b8a0ce

Browse files
committed
Add experimental.appNewScrollHandler
1 parent 97d7a61 commit 1b8a0ce

File tree

9 files changed

+58
-14
lines changed

9 files changed

+58
-14
lines changed

.github/workflows/build_and_test.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -891,6 +891,7 @@ jobs:
891891
afterBuild: |
892892
export __NEXT_EXPERIMENTAL_PPR=true # for compatibility with the existing tests
893893
export __NEXT_EXPERIMENTAL_CACHE_COMPONENTS=true
894+
export __NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER=true
894895
export NEXT_EXTERNAL_TESTS_FILTERS="test/experimental-tests-manifest.json"
895896
896897
node run-tests.js \
@@ -913,6 +914,7 @@ jobs:
913914
afterBuild: |
914915
export __NEXT_EXPERIMENTAL_PPR=true # for compatibility with the existing tests
915916
export __NEXT_EXPERIMENTAL_CACHE_COMPONENTS=true
917+
export __NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER=true
916918
export NEXT_EXTERNAL_TESTS_FILTERS="test/experimental-tests-manifest.json"
917919
export NEXT_TEST_MODE=dev
918920
@@ -937,6 +939,7 @@ jobs:
937939
afterBuild: |
938940
export __NEXT_EXPERIMENTAL_PPR=true # for compatibility with the existing tests
939941
export __NEXT_EXPERIMENTAL_CACHE_COMPONENTS=true
942+
export __NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER=true
940943
export NEXT_EXTERNAL_TESTS_FILTERS="test/experimental-tests-manifest.json"
941944
export NEXT_TEST_MODE=start
942945

crates/next-core/src/next_config.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -832,6 +832,7 @@ pub struct ExperimentalConfig {
832832
after: Option<bool>,
833833
amp: Option<serde_json::Value>,
834834
app_document_preloading: Option<bool>,
835+
app_new_scroll_handler: Option<bool>,
835836
cache_handlers: Option<FxIndexMap<RcStr, RcStr>>,
836837
cache_life: Option<FxIndexMap<String, CacheLifeProfile>>,
837838
case_sensitive_routes: Option<bool>,
@@ -1779,6 +1780,11 @@ impl NextConfig {
17791780
Vc::cell(self.experimental.view_transition.unwrap_or(false))
17801781
}
17811782

1783+
#[turbo_tasks::function]
1784+
pub fn enable_app_new_scroll_handler(&self) -> Vc<bool> {
1785+
Vc::cell(self.experimental.app_new_scroll_handler.unwrap_or(false))
1786+
}
1787+
17821788
#[turbo_tasks::function]
17831789
pub fn enable_cache_components(&self) -> Vc<bool> {
17841790
Vc::cell(self.experimental.cache_components.unwrap_or(false))

crates/next-core/src/next_import_map.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ pub async fn get_next_client_import_map(
130130
|| *next_config.enable_taint().await?
131131
|| *next_config.enable_view_transition().await?
132132
|| *next_config.enable_router_bfcache().await?
133+
|| *next_config.enable_app_new_scroll_handler().await?
133134
{
134135
"-experimental"
135136
} else {
@@ -841,11 +842,13 @@ async fn apply_vendored_react_aliases_server(
841842
let taint = *next_config.enable_taint().await?;
842843
let router_bfcache = *next_config.enable_router_bfcache().await?;
843844
let view_transition = *next_config.enable_view_transition().await?;
844-
let react_channel = if ppr || taint || view_transition || router_bfcache {
845-
"-experimental"
846-
} else {
847-
""
848-
};
845+
let app_new_scroll_handler = *next_config.enable_app_new_scroll_handler().await?;
846+
let react_channel =
847+
if ppr || taint || view_transition || router_bfcache || app_new_scroll_handler {
848+
"-experimental"
849+
} else {
850+
""
851+
};
849852
let react_condition = if ty.should_use_react_server_condition() {
850853
"server"
851854
} else {

packages/next/src/build/define-env.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,9 @@ export function getDefineEnv({
165165
'process.env.__NEXT_CACHE_COMPONENTS': isCacheComponentsEnabled,
166166
'process.env.__NEXT_USE_CACHE': isUseCacheEnabled,
167167

168+
'process.env.__NEXT_APP_NEW_SCROLL_HANDLER': Boolean(
169+
config.experimental.appNewScrollHandler
170+
),
168171
'process.env.NEXT_DEPLOYMENT_ID': config.experimental?.useSkewCookie
169172
? false
170173
: config.deploymentId || false,
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import type { NextConfig } from '../server/config-shared'
22

33
export function needsExperimentalReact(config: NextConfig) {
4-
const { ppr, taint, viewTransition, routerBFCache } =
4+
const { ppr, taint, viewTransition, routerBFCache, appNewScrollHandler } =
55
config.experimental || {}
6-
return Boolean(ppr || taint || viewTransition || routerBFCache)
6+
return Boolean(
7+
ppr || taint || viewTransition || routerBFCache || appNewScrollHandler
8+
)
79
}

packages/next/src/server/config-schema.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,7 @@ export const configSchema: zod.ZodType<NextConfig> = z.lazy(() =>
335335
experimental: z
336336
.strictObject({
337337
adapterPath: z.string().optional(),
338+
appNewScrollHandler: z.boolean().optional(),
338339
useSkewCookie: z.boolean().optional(),
339340
after: z.boolean().optional(),
340341
appNavFailHandling: z.boolean().optional(),

packages/next/src/server/config-shared.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,7 @@ export interface LoggingConfig {
453453

454454
export interface ExperimentalConfig {
455455
adapterPath?: string
456+
appNewScrollHandler?: boolean
456457
useSkewCookie?: boolean
457458
cacheHandlers?: {
458459
default?: string
@@ -1519,6 +1520,7 @@ export const defaultConfig = Object.freeze({
15191520
allowedDevOrigins: undefined,
15201521
experimental: {
15211522
adapterPath: process.env.NEXT_ADAPTER_PATH || undefined,
1523+
appNewScrollHandler: false,
15221524
useSkewCookie: false,
15231525
cacheLife: {
15241526
default: {

packages/next/src/server/config.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1752,6 +1752,24 @@ function enforceExperimentalFeatures(
17521752
}
17531753
}
17541754

1755+
if (
1756+
process.env.__NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER === 'true' &&
1757+
// We do respect an explicit value in the user config.
1758+
(config.experimental.appNewScrollHandler === undefined ||
1759+
(isDefaultConfig && !config.experimental.appNewScrollHandler))
1760+
) {
1761+
config.experimental.appNewScrollHandler = true
1762+
1763+
if (configuredExperimentalFeatures) {
1764+
addConfiguredExperimentalFeature(
1765+
configuredExperimentalFeatures,
1766+
'appNewScrollHandler',
1767+
true,
1768+
'enabled by `__NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER`'
1769+
)
1770+
}
1771+
}
1772+
17551773
if (
17561774
config.experimental.enablePrerenderSourceMaps === undefined &&
17571775
config.experimental.cacheComponents === true

test/production/app-dir/build-output-prerender/build-output-prerender.test.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@ import { nextTestSetup } from 'e2e-utils'
22
import path from 'path'
33
const { version: nextVersion } = require('next/package.json')
44

5-
const cacheComponentsEnabled =
6-
process.env.__NEXT_EXPERIMENTAL_CACHE_COMPONENTS === 'true'
7-
5+
const isVariant = process.env.__NEXT_EXPERIMENTAL_CACHE_COMPONENTS === 'true'
86
const pprEnabled = process.env.__NEXT_EXPERIMENTAL_PPR === 'true'
97

108
describe('build-output-prerender', () => {
@@ -18,7 +16,7 @@ describe('build-output-prerender', () => {
1816
beforeAll(() => next.build())
1917

2018
it('prints only the user-selected experimental flags (and the ones enabled via env variable)', async () => {
21-
if (cacheComponentsEnabled) {
19+
if (isVariant) {
2220
if (isTurbopack) {
2321
expect(getPreambleOutput(next.cliOutput)).toMatchInlineSnapshot(`
2422
"▲ Next.js x.y.z (Turbopack)
@@ -27,6 +25,7 @@ describe('build-output-prerender', () => {
2725
✓ cacheComponents
2826
✓ clientSegmentCache (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
2927
✓ clientParamParsing (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
28+
✓ appNewScrollHandler (enabled by \`__NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER\`)
3029
✓ enablePrerenderSourceMaps (enabled by \`experimental.cacheComponents\`)"
3130
`)
3231
} else {
@@ -37,6 +36,7 @@ describe('build-output-prerender', () => {
3736
✓ cacheComponents
3837
✓ clientSegmentCache (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
3938
✓ clientParamParsing (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
39+
✓ appNewScrollHandler (enabled by \`__NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER\`)
4040
✓ enablePrerenderSourceMaps (enabled by \`experimental.cacheComponents\`)"
4141
`)
4242
}
@@ -123,7 +123,7 @@ describe('build-output-prerender', () => {
123123
beforeAll(() => next.build())
124124

125125
it('prints a warning and the customized experimental flags', async () => {
126-
if (cacheComponentsEnabled) {
126+
if (isVariant) {
127127
if (isTurbopack) {
128128
expect(getPreambleOutput(next.cliOutput)).toMatchInlineSnapshot(`
129129
"⚠ Prerendering is running in debug mode. Note: This may affect performance and should not be used for production.
@@ -136,6 +136,7 @@ describe('build-output-prerender', () => {
136136
⨯ prerenderEarlyExit (disabled by \`--debug-prerender\`)
137137
✓ clientSegmentCache (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
138138
✓ clientParamParsing (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
139+
✓ appNewScrollHandler (enabled by \`__NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER\`)
139140
✓ enablePrerenderSourceMaps (enabled by \`--debug-prerender\`)"
140141
`)
141142
} else {
@@ -150,6 +151,7 @@ describe('build-output-prerender', () => {
150151
⨯ prerenderEarlyExit (disabled by \`--debug-prerender\`)
151152
✓ clientSegmentCache (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
152153
✓ clientParamParsing (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
154+
✓ appNewScrollHandler (enabled by \`__NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER\`)
153155
✓ enablePrerenderSourceMaps (enabled by \`--debug-prerender\`)"
154156
`)
155157
}
@@ -251,7 +253,7 @@ describe('build-output-prerender', () => {
251253
beforeAll(() => next.build())
252254

253255
it('prints no experimental flags (unless enabled via env variable)', async () => {
254-
if (cacheComponentsEnabled) {
256+
if (isVariant) {
255257
if (isTurbopack) {
256258
expect(getPreambleOutput(next.cliOutput)).toMatchInlineSnapshot(`
257259
"▲ Next.js x.y.z (Turbopack)
@@ -260,6 +262,7 @@ describe('build-output-prerender', () => {
260262
✓ cacheComponents (enabled by \`__NEXT_EXPERIMENTAL_CACHE_COMPONENTS\`)
261263
✓ clientSegmentCache (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
262264
✓ clientParamParsing (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
265+
✓ appNewScrollHandler (enabled by \`__NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER\`)
263266
✓ enablePrerenderSourceMaps (enabled by \`experimental.cacheComponents\`)"
264267
`)
265268
} else {
@@ -270,6 +273,7 @@ describe('build-output-prerender', () => {
270273
✓ cacheComponents (enabled by \`__NEXT_EXPERIMENTAL_CACHE_COMPONENTS\`)
271274
✓ clientSegmentCache (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
272275
✓ clientParamParsing (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
276+
✓ appNewScrollHandler (enabled by \`__NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER\`)
273277
✓ enablePrerenderSourceMaps (enabled by \`experimental.cacheComponents\`)"
274278
`)
275279
}
@@ -315,7 +319,7 @@ describe('build-output-prerender', () => {
315319
beforeAll(() => next.build())
316320

317321
it('prints a warning and the customized experimental flags', async () => {
318-
if (cacheComponentsEnabled) {
322+
if (isVariant) {
319323
if (isTurbopack) {
320324
expect(getPreambleOutput(next.cliOutput)).toMatchInlineSnapshot(`
321325
"⚠ Prerendering is running in debug mode. Note: This may affect performance and should not be used for production.
@@ -328,6 +332,7 @@ describe('build-output-prerender', () => {
328332
⨯ prerenderEarlyExit (disabled by \`--debug-prerender\`)
329333
✓ clientSegmentCache (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
330334
✓ clientParamParsing (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
335+
✓ appNewScrollHandler (enabled by \`__NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER\`)
331336
✓ enablePrerenderSourceMaps (enabled by \`--debug-prerender\`)"
332337
`)
333338
} else {
@@ -342,6 +347,7 @@ describe('build-output-prerender', () => {
342347
⨯ prerenderEarlyExit (disabled by \`--debug-prerender\`)
343348
✓ clientSegmentCache (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
344349
✓ clientParamParsing (enabled by \`__NEXT_EXPERIMENTAL_PPR\`)
350+
✓ appNewScrollHandler (enabled by \`__NEXT_EXPERIMENTAL_APP_NEW_SCROLL_HANDLER\`)
345351
✓ enablePrerenderSourceMaps (enabled by \`--debug-prerender\`)"
346352
`)
347353
}

0 commit comments

Comments
 (0)