-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
breaking: require nodejs_als
compatibility flag
#14189
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
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
--- | ||
'@sveltejs/adapter-cloudflare': major | ||
--- | ||
|
||
breaking: require `nodejs_als` compatibility flag |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -89,6 +89,7 @@ When building for Cloudflare Workers, this adapter expects to find a [Wrangler c | |||||
"name": "<any-name-you-want>", | ||||||
"main": ".svelte-kit/cloudflare/_worker.js", | ||||||
"compatibility_date": "2025-01-01", | ||||||
"compatibility_flags": ["nodejs_als"], | ||||||
"assets": { | ||||||
"binding": "ASSETS", | ||||||
"directory": ".svelte-kit/cloudflare", | ||||||
|
@@ -102,6 +103,8 @@ Please follow the [framework guide](https://developers.cloudflare.com/workers/fr | |||||
|
||||||
## Cloudflare Pages | ||||||
|
||||||
Ensure that you have enabled the `nodejs_als` compatibility flag in your dashboard, or via your Wrangler configuration. | ||||||
|
||||||
### Deployment | ||||||
|
||||||
Please follow the [Get Started Guide](https://developers.cloudflare.com/pages/get-started/) for Cloudflare Pages to begin. | ||||||
|
@@ -120,6 +123,19 @@ You may wish to refer to [Cloudflare's documentation for deploying a SvelteKit s | |||||
|
||||||
Functions contained in the [`/functions` directory](https://developers.cloudflare.com/pages/functions/routing/) at the project's root will _not_ be included in the deployment. Instead, functions should be implemented as [server endpoints](routing#server) in your SvelteKit app, which is compiled to a [single `_worker.js` file](https://developers.cloudflare.com/pages/functions/advanced-mode/). | ||||||
|
||||||
## Node compatibility | ||||||
|
||||||
SvelteKit uses the [`AsyncLocalStorage`](https://nodejs.org/api/async_context.html#class-asynclocalstorage) API internally. You need to enable the `nodejs_als` [compatibility flag](https://developers.cloudflare.com/workers/runtime-apis/nodejs/), either via the Cloudflare dashboard (if using Pages) or your Wrangler configuration, or your app may break in production. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
It may be better to force Cloudflare Pages users to have a Wrangler configuration since it's required when migrating to Cloudflare Workers anyway. Also makes it easier for us since we can't detect dashboard settings during a local build. |
||||||
|
||||||
```jsonc | ||||||
/// file: wrangler.jsonc | ||||||
{ | ||||||
"compatibility_flags": ["nodejs_als"] | ||||||
} | ||||||
``` | ||||||
|
||||||
If you app makes use of other Node.js APIs such as `node:path`, enable support via the `nodejs_compat` compatibility flag instead. | ||||||
|
||||||
## Runtime APIs | ||||||
|
||||||
The [`env`](https://developers.cloudflare.com/workers/runtime-apis/fetch-event#parameters) object contains your project's [bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/), which consist of KV/DO namespaces, etc. It is passed to SvelteKit via the `platform` property, along with [`ctx`](https://developers.cloudflare.com/workers/runtime-apis/context/), [`caches`](https://developers.cloudflare.com/workers/runtime-apis/cache/), and [`cf`](https://developers.cloudflare.com/workers/runtime-apis/request/#incomingrequestcfproperties), meaning that you can access it in hooks and endpoints: | ||||||
|
@@ -167,17 +183,6 @@ However, they will have no effect on responses dynamically rendered by SvelteKit | |||||
|
||||||
## Troubleshooting | ||||||
|
||||||
### Node.js compatibility | ||||||
|
||||||
If you would like to enable [Node.js compatibility](https://developers.cloudflare.com/workers/runtime-apis/nodejs/), you can add the `nodejs_compat` compatibility flag to your Wrangler configuration file: | ||||||
|
||||||
```jsonc | ||||||
/// file: wrangler.jsonc | ||||||
{ | ||||||
"compatibility_flags": ["nodejs_compat"] | ||||||
} | ||||||
``` | ||||||
|
||||||
### Worker size limits | ||||||
|
||||||
When deploying your application, the server generated by SvelteKit is bundled into a single file. Wrangler will fail to publish your worker if it exceeds [the size limits](https://developers.cloudflare.com/workers/platform/limits/#worker-size) after minification. You're unlikely to hit this limit usually, but some large libraries can cause this to happen. In that case, you can try to reduce the size of your worker by only importing such libraries on the client side. See [the FAQ](./faq#How-do-I-use-a-client-side-library-accessing-document-or-window) for more information. | ||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -301,6 +301,22 @@ function validate_wrangler_config(config_file = undefined) { | |
validate_worker_settings(wrangler_config); | ||
} | ||
|
||
const flags = wrangler_config?.compatibility_flags ?? []; | ||
|
||
if (flags.includes('nodejs_compat') && flags.includes('nodejs_als')) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We should check that a |
||
const file = config_file | ||
? path.relative(process.cwd(), config_file) | ||
: 'your wrangler configuration'; | ||
|
||
throw new Error( | ||
`\u001B\u001B[31m` + | ||
`\nPlease add the "nodejs_als" compatibility flag to ${file}, as SvelteKit uses the AsyncLocalStorage API and your app may break in production without it.\n\n` + | ||
`Alternatively, if you are using Node APIs in your app, you should add the "nodejs_compat" flag.\n\n` + | ||
`For more information on compatibility flags see https://svelte.dev/docs/kit/adapter-cloudflare#Node-compatibility.\n` + | ||
`\u001B[39m\u001B` | ||
); | ||
} | ||
|
||
return wrangler_config; | ||
} | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
{ | ||
"compatibility_flags": ["nodejs_als"] | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
{ | ||
"compatibility_flags": ["nodejs_als"] | ||
} |
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 says you need to enable it via the dashboard or config file, but it looks like the code will error if it's not in the config file, so maybe we should drop the reference to the dashboard here?
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.
oh right, I've remembered why I hesitated to put this PR up — it's entirely possible that you've set the flag via the dashboard and so don't need the config file at all. The way this should work is that the framework should be able to configure this stuff on the user's behalf but I don't think that exists on Cloudflare
So maybe it should only error for workers, and be a warning for pages? Ugh
Uh oh!
There was an error while loading. Please reload this page.
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've talked to the Cloudflare folks and the recommended way to handle this is through a generated Wrangler config: https://developers.cloudflare.com/workers/wrangler/configuration/#generated-wrangler-configuration . I'm not a big fan of it though as it requires duplicating the user's config since it doesn't extend an existing one. Duplicating can also get tricky because any relative paths set need to be changed to resolve from where the generated config is instead of where the original config is.