@urql/svelte, "Функция, вызываемая вне инициализации компонента", если не в onMount
Я пробую удивительные работы, сделанные ребятами https://github.com/FormidableLabs/urql/tree/master/packages/svelte-urql.
Все работает до сегодняшнего дня.
Я использую приведенный ниже код, и он дает мне эту ошибку:
Error: Function called outside component initialization
at get_current_component (index.mjs:615)
at getContext (index.mjs:648)
at getClient (urql-svelte.mjs:55)
at query (urql-svelte.mjs:81)
at Players.svelte:41
Код:
<script>
import { query } from '@urql/svelte'
import { myQuery } from './myQuery'
let players
let myVars
function sleep (ms) {
return new Promise((resolve) => setTimeout(resolve, ms))
}
$: (async () => {
await sleep(2000) // this gives me the error; removing it make it work
players = query({
query: myQuery,
variables: { ...myVars },
requestPolicy: 'cache-and-network'
})
})()
</script>
{#if !players}
Loading players...
{:else}
Players loaded! Do the work.
{/if}
Подскажите, в чем проблема?
Если я использую await()
в onMount()
оно работает! Как это:
onMount(async () => {
await sleep(2000)
loaded = true
})
Вот код для @urql/svelte
:
- query.ts: https://github.com/FormidableLabs/urql/blob/master/packages/svelte-urql/src/operations/query.ts
- context.ts: https://github.com/FormidableLabs/urql/blob/master/packages/svelte-urql/src/context.ts
Может быть context
код?
import { setContext, getContext } from 'svelte';
import { Client, ClientOptions } from '@urql/core';
const CLIENT = '$$_URQL';
export const getClient = (): Client => getContext(CLIENT);
export const setClient = (client: Client): void => {
setContext(CLIENT, client);
};
export const initClient = (args: ClientOptions): Client => {
const client = new Client(args);
setClient(client);
return client;
};
Я могу создать REPL на CodeSandbox, если вам нужно, без проблем.
Ошибка на @urql/svelte
: https://github.com/FormidableLabs/urql/issues/795._.
Информация о вашем проекте Svelte:- Chrome 83- Версия Svelte: 3.23.0 - Накопительный пакет
2 ответа
Если вы используете Vite в качестве сборщика, вам нужно будет исключить
@urql/svelte
из предварительной сборки зависимостей, которая, по-видимому, вызвала у меня эту ошибку.
Добавьте это в свою конфигурацию Vite:
{
optimizeDeps: {
exclude: ['@urql/svelte']
}
}
Это также работает для
svelte-apollo
, сделайте то же самое, но замените имя пакета!
Если интересно, есть документация по предварительной сборке зависимостей Vite .
Моя ситуация была немного другой, но возникла та же ошибка. В моем случае я пытался запустить Svelte/Sapper в контейнере Docker в целях разработки. Я возился сpackage.json
до этого и в какой-то момент я решил тоже переехать svelte
а также sapper
на "зависимости" вместо "devDependencies".
"dependencies": {
// ...
"sapper": "^0.27.0",
"svelte": "^3.0.0"
}
Это была плохая идея. Как только я переместил его обратно в devDependencies, ошибка исчезла, и все заработало, как ожидалось.
"devDependencies": {
// ...
"sapper": "^0.27.0",
"svelte": "^3.0.0"
}
Я надеюсь, что это поможет кому-то в будущем.