Skip to content

Commit d98efc1

Browse files
Skn0ttnickytonline
andauthored
feat: split up API Routes + use .nft.json files to make builds fast (#2058)
* feat: split up API Routes Brings back the functionality that was reverted in #1731, but under a flag. This will be utterly slow in building, so let's try to speed that up in the next step! * feat: load includedFiles for every page * refactor: extract function config logic * refactor: extract flag into own definition * feat: use "none" bundler for split-up api routes * feat: list some more dependencies * feat: use NFT to trace common required files * refactor: clean up a wee bit * fix: please don't include /sh * feat: enable flag by default, so tests use it * feat: add a naïve packing algo * feat: write rough sketch for packing lambdas * refactor: add constructor for APILambda * feat: pack handlers together into bundles * fix: linter * feat: exclude some heavy unneeded files * fix: trigger CI again, now that it supports `none` bundler * feat: remove code for old mechanism If we'll be doing a staged rollout, and our test suite covers most of the cases, we should be able to roll this out without a self-serve opt-out mechanism. * fix: remove test for deleted code * fix: ensure that react doesn't try to load development build * fix: move test directory into repo, so node_modules can be read * fix: snapshot with API redirects * fix: remove .only * fix: don't assert on _api_* * fix: another test * fix: apply NODE_ENV=prod to right generated handler * feat: remove nft tracing * feat: put change behind flag again * feat: source flag from plugin input * fix: add default value for featureflags * fix: default flag to true for testing * fix: revert changes to lockfiles * fix: eslint it/test * fix: lint * fix: revert distracting change * fix: now that we don't use nft anymore, we don't have to copy over node_modules * fix: swallow require.resolve errors for unit tests * fix: remove timing logs * fix: lint name * fix: lint * fix: isr needs _document.js * fix: add _app for ISR * fix: correct wrong output of some npm versions * fix: integration test For some reason, ZISI doesn't like relative paths in this integration test. We can fix it by using absolute paths. Since this PR moves API routes out of __netlify_handler, we can no longer make the assertion on x-nf-render-mode. * fix: assemble npm package path correctly, also for monorepos * fix: try what happens if we use next-netlify server * fix: check what happens when we skip revalidation * fix: dont let revalidate request time out * fix: send x-nextjs-cache header to prevent error * fix: update error message in test * fix: resolve relative paths based on data in required-server-files * fix: test * fix: keep manually-added `included_files` * fix: try something * fix: don't include unneeded _app pages in ISR * fix: finalize includedFiles before writing it onto netlifyConfig * chore: update comment * fix: exclude sass file in monorepos * Update packages/runtime/src/helpers/functions.ts * chore: remove comment * fix: update flag impl * refactor: use getRequiredServerFiles * chore: add comment on route[0] * fix: set NEXT_SPLIT_API_ROUTES in netlify.toml * fix: put updated revalidate behaviour behind flag * fix: supply splitApiRoutes in getHandler * fix: better run your code before committing it and embarrassing yourself --------- Co-authored-by: Nick Taylor <[email protected]>
1 parent 5ee2fce commit d98efc1

File tree

27 files changed

+547
-101
lines changed

27 files changed

+547
-101
lines changed

.github/workflows/e2e-appdir.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ on:
66
push:
77
branches: [main]
88

9+
env:
10+
NEXT_SPLIT_API_ROUTES: true
11+
912
jobs:
1013
setup:
1114
runs-on: ubuntu-latest

.github/workflows/e2e-next.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ on:
88
schedule:
99
- cron: '0 0 * * *'
1010

11+
env:
12+
NEXT_SPLIT_API_ROUTES: true
13+
1114
jobs:
1215
setup:
1316
runs-on: ubuntu-latest

.github/workflows/test-integration.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ concurrency:
99
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
1010
cancel-in-progress: true
1111

12+
env:
13+
NEXT_SPLIT_API_ROUTES: true
14+
1215
jobs:
1316
build:
1417
name: Integration tests

.github/workflows/test.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ concurrency:
1111
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
1212
cancel-in-progress: true
1313

14+
env:
15+
NEXT_SPLIT_API_ROUTES: true
16+
1417
jobs:
1518
build:
1619
name: Unit tests

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,4 +152,6 @@ packages/*/lib
152152
cypress/screenshots
153153

154154
# Test cases have node module fixtures
155-
!test/**/node_modules
155+
!test/**/node_modules
156+
157+
/tmp

cypress/e2e/default/revalidate.cy.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ describe('On-demand revalidation', () => {
3333
cy.request({ url: '/api/revalidate/?select=5', failOnStatusCode: false }).then((res) => {
3434
expect(res.status).to.eq(500)
3535
expect(res.body).to.have.property('message')
36-
expect(res.body.message).to.include('Invalid response 404')
36+
expect(res.body.message).to.include('could not refresh content for path /getStaticProps/withRevalidate/3/, path is not handled by an odb')
3737
})
3838
})
3939
it('revalidates dynamic non-prerendered ISR route with fallback blocking', () => {

demos/default/netlify.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ CYPRESS_CACHE_FOLDER = "../node_modules/.CypressBinary"
1010
# set TERM variable for terminal output
1111
TERM = "xterm"
1212
NODE_VERSION = "16.15.1"
13+
NEXT_SPLIT_API_ROUTES = "true"
1314

1415
[[headers]]
1516
for = "/_next/image/*"

demos/middleware/netlify.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ command = "npm run build"
33
publish = ".next"
44
ignore = "if [ $CACHED_COMMIT_REF == $COMMIT_REF ]; then (exit 1); else git diff --quiet $CACHED_COMMIT_REF $COMMIT_REF ../..; fi;"
55

6+
[build.environment]
7+
NEXT_SPLIT_API_ROUTES = "true"
8+
69
[[plugins]]
710
package = "@netlify/plugin-nextjs"
811

demos/nx-next-monorepo-demo/netlify.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ command = "npm run build"
33
publish = "dist/apps/demo-monorepo/.next"
44
ignore = "if [ $CACHED_COMMIT_REF == $COMMIT_REF ]; then (exit 1); else git diff --quiet $CACHED_COMMIT_REF $COMMIT_REF ../..; fi;"
55

6+
[build.environment]
7+
NEXT_SPLIT_API_ROUTES = "true"
8+
69
[dev]
710
command = "npm run start"
811
targetPort = 4200

demos/static-root/netlify.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ command = "next build"
33
publish = ".next"
44
ignore = "if [ $CACHED_COMMIT_REF == $COMMIT_REF ]; then (exit 1); else git diff --quiet $CACHED_COMMIT_REF $COMMIT_REF ../..; fi;"
55

6+
[build.environment]
7+
NEXT_SPLIT_API_ROUTES = "true"
8+
69
[[plugins]]
710
package = "@netlify/plugin-nextjs"
811

0 commit comments

Comments
 (0)