diff --git a/.changeset/five-pumpkins-join.md b/.changeset/five-pumpkins-join.md new file mode 100644 index 000000000000..17177784a85f --- /dev/null +++ b/.changeset/five-pumpkins-join.md @@ -0,0 +1,5 @@ +--- +"@sveltejs/kit": patch +--- + +fix: provide helpful error/warning when calling `fetch` during render diff --git a/packages/kit/src/runtime/server/page/render.js b/packages/kit/src/runtime/server/page/render.js index ec569666cd18..12a49c4b4ecb 100644 --- a/packages/kit/src/runtime/server/page/render.js +++ b/packages/kit/src/runtime/server/page/render.js @@ -113,7 +113,32 @@ export async function render_response({ form: form_value }; - rendered = options.root.render(props); + if (__SVELTEKIT_DEV__) { + const fetch = globalThis.fetch; + let warned = false; + globalThis.fetch = (info, init) => { + if (typeof info === 'string' && !/^\w+:\/\//.test(info)) { + throw new Error( + `Cannot call \`fetch\` eagerly during server side rendering with relative URL (${info}) — put your \`fetch\` calls inside \`onMount\` or a \`load\` function instead` + ); + } else if (!warned) { + console.warn( + `Avoid calling \`fetch\` eagerly during server side rendering — put your \`fetch\` calls inside \`onMount\` or a \`load\` function instead` + ); + warned = true; + } + + return fetch(info, init); + }; + + try { + rendered = options.root.render(props); + } finally { + globalThis.fetch = fetch; + } + } else { + rendered = options.root.render(props); + } for (const { node } of branch) { if (node.imports) {