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

docs: add documentation on minimizing lambda bundle #167

Merged
merged 3 commits into from
Oct 12, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion docs/pages/common_issues.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,9 @@ If you are using sentry, API routes returns empty body. You could try configurin

#### My ISR page has this cache-control header `s-maxage=2, stale-while-revalidate=2592000`

Given how ISR works, while waiting for the revalidation to happen, the page will be served using this cache control header. This prevent your server from being overloaded by a lot of requests while the revalidation is done. You can read more about it [here](/inner_workings/isr).
Given how ISR works, while waiting for the revalidation to happen, the page will be served using this cache control header. This prevent your server from being overloaded by a lot of requests while the revalidation is done. You can read more about it [here](/inner_workings/isr).

#### Unzipped size must be smaller than 262144000 bytes

AWS Lambda has an unzipped size limit of 250MB. If your app is over this limit, then it is most likely using a node_module library that is too large for serverless or there is a large dev dependency getting bundled.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe add that what's important is the .open-next/server-function folder, and the rest are mostly irrelevant.
We could also add that a big bundle size will increase cold start a lot

For example, `pdfjs` has `canvas` optional dependency which takes up 180MB. For more details, [read me](/common_issues/bundle_size)
39 changes: 39 additions & 0 deletions docs/pages/common_issues/bundle_size.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import {Callout} from 'nextra/components'


#### Reducing Bundle Size

Next will incorrectly trace dev dependencies to be included in the output `node_modules`, which will significantly increase the lambda bundle. For example, the @swc/core-\* binary is ~33MB!
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

With 13.5.1+ they probably will not even end up in node_modules, a big part is now bundled by next and may end up in one of the bundle

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I built w/ 13.5.4 and the core-darwin-arm64 binary was still there unfortunately


Add this to your next.config.js to help minimize the lambda bundle size:

```typescript
outputFileTracingExcludes: {
'*': [
'@swc/core',
'esbuild',
'uglify-js',
'watchpack',
'webassemblyjs'
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could probably add sharp here, people might have installed but it's not needed outside of the image optimization function.
We should probably add a comment to explain it

],
},
```

<Callout type="warning" emoji="⚠️">
NextJS currently doesn't expose `outputFileTracingExcludes` as an environmental variable so `open-next`cannot programmatically set this like it does for`output`and`outputFileTracingRoot`.
Currently, next uses `webpack` to trace server actions, so you shouldn't add `webpack` to the excludes list, otherwise it will break server actions.
</Callout>

#### Unzipped size must be smaller than 262144000 bytes

To identify the module that's taking up too much space (and isn't serverless friendly):

```bash
du -hs .open-next/server-function/node_modules/* | sort -rh
```

If your app requires the offending library, then consider moving your business logic of the `api` to its own lambda, eg: `/api/v2` => `Api Lambda`

<Callout type="info" emoji="ℹ️">
There is a [PR](https://github.com/sst/open-next/pull/242) to remove some dev dependency from the output node_modules but that requires more testing before it can merge.
</Callout>