-
Notifications
You must be signed in to change notification settings - Fork 27.6k
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
Serverless loader: handle empty request url #10953
Conversation
Stats from current PRDefault Server ModeGeneral Overall increase
|
zeit/next.js canary | plumdog/next.js handle-index-no-trailing-slash | Change | |
---|---|---|---|
buildDuration | 9.2s | 9.4s | |
nodeModulesSize | 56.5 MB | 56.5 MB |
Client Bundles (main, webpack, commons)
zeit/next.js canary | plumdog/next.js handle-index-no-trailing-slash | Change | |
---|---|---|---|
main-HASH.js gzip | 5.77 kB | 5.77 kB | ✓ |
webpack-HASH.js gzip | 746 B | 746 B | ✓ |
de003c3a9d30..cfaa.js gzip | 9.77 kB | 9.77 kB | ✓ |
framework.HASH.js gzip | 39.1 kB | 39.1 kB | ✓ |
Overall change | 55.4 kB | 55.4 kB | ✓ |
Client Bundles (main, webpack, commons) Modern
zeit/next.js canary | plumdog/next.js handle-index-no-trailing-slash | Change | |
---|---|---|---|
main-HASH.module.js gzip | 4.78 kB | 4.78 kB | ✓ |
webpack-HASH..dule.js gzip | 746 B | 746 B | ✓ |
de003c3a9d30..dule.js gzip | 6.71 kB | 6.71 kB | ✓ |
framework.HA..dule.js gzip | 39.1 kB | 39.1 kB | ✓ |
Overall change | 51.4 kB | 51.4 kB | ✓ |
Legacy Client Bundles (polyfills)
zeit/next.js canary | plumdog/next.js handle-index-no-trailing-slash | Change | |
---|---|---|---|
polyfills-HASH.js gzip | 18.9 kB | 18.9 kB | ✓ |
Overall change | 18.9 kB | 18.9 kB | ✓ |
Client Pages
zeit/next.js canary | plumdog/next.js handle-index-no-trailing-slash | Change | |
---|---|---|---|
_app.js gzip | 1.09 kB | 1.09 kB | ✓ |
_error.js gzip | 2.96 kB | 2.96 kB | ✓ |
hooks.js gzip | 664 B | 664 B | ✓ |
index.js gzip | 222 B | 222 B | ✓ |
link.js gzip | 1.89 kB | 1.89 kB | ✓ |
routerDirect.js gzip | 279 B | 279 B | ✓ |
withRouter.js gzip | 278 B | 278 B | ✓ |
Overall change | 7.38 kB | 7.38 kB | ✓ |
Client Pages Modern
zeit/next.js canary | plumdog/next.js handle-index-no-trailing-slash | Change | |
---|---|---|---|
_app.module.js gzip | 594 B | 594 B | ✓ |
_error.module.js gzip | 2.06 kB | 2.06 kB | ✓ |
hooks.module.js gzip | 370 B | 370 B | ✓ |
index.module.js gzip | 212 B | 212 B | ✓ |
link.module.js gzip | 1.48 kB | 1.48 kB | ✓ |
routerDirect..dule.js gzip | 271 B | 271 B | ✓ |
withRouter.m..dule.js gzip | 270 B | 270 B | ✓ |
Overall change | 5.26 kB | 5.26 kB | ✓ |
Client Build Manifests
zeit/next.js canary | plumdog/next.js handle-index-no-trailing-slash | Change | |
---|---|---|---|
_buildManifest.js gzip | 61 B | 61 B | ✓ |
_buildManife..dule.js gzip | 61 B | 61 B | ✓ |
Overall change | 122 B | 122 B | ✓ |
Rendered Page Sizes
zeit/next.js canary | plumdog/next.js handle-index-no-trailing-slash | Change | |
---|---|---|---|
index.html gzip | 916 B | 916 B | ✓ |
link.html gzip | 925 B | 925 B | ✓ |
withRouter.html gzip | 914 B | 914 B | ✓ |
Overall change | 2.75 kB | 2.75 kB | ✓ |
Serverless Mode (Decrease detected ✓)
General Overall increase ⚠️
zeit/next.js canary | plumdog/next.js handle-index-no-trailing-slash | Change | |
---|---|---|---|
buildDuration | 9.9s | 10s | |
nodeModulesSize | 56.5 MB | 56.5 MB |
Client Bundles (main, webpack, commons)
zeit/next.js canary | plumdog/next.js handle-index-no-trailing-slash | Change | |
---|---|---|---|
main-HASH.js gzip | 5.77 kB | 5.77 kB | ✓ |
webpack-HASH.js gzip | 746 B | 746 B | ✓ |
de003c3a9d30..cfaa.js gzip | 9.77 kB | 9.77 kB | ✓ |
framework.HASH.js gzip | 39.1 kB | 39.1 kB | ✓ |
Overall change | 55.4 kB | 55.4 kB | ✓ |
Client Bundles (main, webpack, commons) Modern
zeit/next.js canary | plumdog/next.js handle-index-no-trailing-slash | Change | |
---|---|---|---|
main-HASH.module.js gzip | 4.78 kB | 4.78 kB | ✓ |
webpack-HASH..dule.js gzip | 746 B | 746 B | ✓ |
de003c3a9d30..dule.js gzip | 6.71 kB | 6.71 kB | ✓ |
framework.HA..dule.js gzip | 39.1 kB | 39.1 kB | ✓ |
Overall change | 51.4 kB | 51.4 kB | ✓ |
Legacy Client Bundles (polyfills)
zeit/next.js canary | plumdog/next.js handle-index-no-trailing-slash | Change | |
---|---|---|---|
polyfills-HASH.js gzip | 18.9 kB | 18.9 kB | ✓ |
Overall change | 18.9 kB | 18.9 kB | ✓ |
Client Pages
zeit/next.js canary | plumdog/next.js handle-index-no-trailing-slash | Change | |
---|---|---|---|
_app.js gzip | 1.09 kB | 1.09 kB | ✓ |
_error.js gzip | 2.96 kB | 2.96 kB | ✓ |
hooks.js gzip | 664 B | 664 B | ✓ |
index.js gzip | 222 B | 222 B | ✓ |
link.js gzip | 1.89 kB | 1.89 kB | ✓ |
routerDirect.js gzip | 279 B | 279 B | ✓ |
withRouter.js gzip | 278 B | 278 B | ✓ |
Overall change | 7.38 kB | 7.38 kB | ✓ |
Client Pages Modern
zeit/next.js canary | plumdog/next.js handle-index-no-trailing-slash | Change | |
---|---|---|---|
_app.module.js gzip | 594 B | 594 B | ✓ |
_error.module.js gzip | 2.06 kB | 2.06 kB | ✓ |
hooks.module.js gzip | 370 B | 370 B | ✓ |
index.module.js gzip | 212 B | 212 B | ✓ |
link.module.js gzip | 1.48 kB | 1.48 kB | ✓ |
routerDirect..dule.js gzip | 271 B | 271 B | ✓ |
withRouter.m..dule.js gzip | 270 B | 270 B | ✓ |
Overall change | 5.26 kB | 5.26 kB | ✓ |
Client Build Manifests
zeit/next.js canary | plumdog/next.js handle-index-no-trailing-slash | Change | |
---|---|---|---|
_buildManifest.js gzip | 61 B | 61 B | ✓ |
_buildManife..dule.js gzip | 61 B | 61 B | ✓ |
Overall change | 122 B | 122 B | ✓ |
Serverless bundles Overall decrease ✓
zeit/next.js canary | plumdog/next.js handle-index-no-trailing-slash | Change | |
---|---|---|---|
_error.js gzip | 293 kB | 293 kB | -397 B |
404.html gzip | 1.32 kB | 1.32 kB | ✓ |
hooks.html gzip | 956 B | 956 B | ✓ |
index.js gzip | 293 kB | 293 kB | |
link.js gzip | 301 kB | 301 kB | |
routerDirect.js gzip | 299 kB | 300 kB | |
withRouter.js gzip | 300 kB | 299 kB | -209 B |
Overall change | 1.49 MB | 1.49 MB | -72 B |
Seems like a bug in the specific implementation that you're using though, cc @ijjk can review this. |
@@ -262,7 +262,7 @@ const nextServerlessLoader: loader.Loader = function() { | |||
|
|||
const parsedUrl = handleRewrites(parse(req.url, true)) | |||
|
|||
if (parsedUrl.pathname.match(/_next\\/data/)) { | |||
if (parsedUrl.pathname && parsedUrl.pathname.match(/_next\\/data/)) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure that this should ever be the case with a proper set-up. On ZEIT Now we ensure that the req.url
is always valid. It looks like this section of code isn't making sure to set req.url
to /
when doing the replace so this makes me think the issue should be moved to that repo 🤔
@@ -315,6 +315,11 @@ const runTests = (dev = false, looseMode = false) => { | |||
expect(data.pageProps.params).toEqual({}) | |||
}) | |||
|
|||
it('should not error at the root with no trailing slash', async () => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This test doesn't fail without the above change due to this not causing req.url
to be empty
OK, so if I understand correctly, while it's true that the bit of code I found doesn't handle So I suppose if there's a fix needed in this repo it would be to check (probably early in request handling) if |
Correct |
@timneutkens ok, understood. Many thanks for explaining, and I'll follow with the other project. |
I found this when deploying to AWS API Gateway (via https://github.com/vincent-herlemont/next-aws-lambda-webpack-plugin to generate code for each AWS Lambda).
I found that the value of
req.url
could be''
, and that this meant thatparsedUrl.pathname
was null, and so this errored. I think this was introduced in #10261, so this issue exists from 9.2.2 onward.For a bit more context: AWS API Gateway gives a URL like
https://identifier123.execute-api.eu-west-1.amazonaws.com/prod/
where "prod" here is the "stage name". Requests both with and without the trailing slash invoke the root Lambda function, with the value ofreq.url
being'/'
and''
respectively.It might be that this is an oddity specific to API Gateway (or how I have deployed code to API Gateway) or it could be something that occurs more widely.