Какой лучший способ запустить какой-то код только на стороне клиента?

Я пытаюсь реализовать Firebase в Сапере. Я установил модули (@firebase/app, @firebase/auth, @firebase/firestore) и затем написал файл конфигурации:

import firebase from '@firebase/app';
import '@firebase/firestore'
import '@firebase/auth'

const config = {
...
};

// Initialize Firebase
firebase.initializeApp(config);
export { firebase };
// Initialize db
export const db = firebase.firestore();
export const auth = firebase.auth();

Когда я запускаю "npm run dev", я получаю сообщение о том, что эти модули Firebase предназначены только для клиентской части, а не для Node.js.

Итак, я попытался решить эту проблему разными способами, и пока что единственное, что работает, - это использование onMount.

  onMount(async () => {
    const {auth} = await import('../firebase/config');
    auth.signInWithEmailAndPassword("test@gmail.com", "test").then((res) => {
      // do some stuff
    })
  })

Сейчас это работает, но у меня есть 3 вопроса:

1) это правильный путь? 2) я должен удалить эти модули со стороны сервера или лучше их все равно оставить? 3) я должен использовать версию firebase как на стороне клиента, так и на стороне сервера, и использовать одну сторону клиента, чтобы получить все данные, которые различны для каждого посетителя и стороны сервера, для всех общих данных?

3 ответа

Я бы сказал, что вы довольно близки, но вы можете сохранить импорт onMount Перезвони:

<script>
import { auth } from '../firebase/config';
import { onMount } from 'svelte'

onMount(() => {
    auth.signInWithEmailAndPassword("test@gmail.com", "test").then((res) => {
      // do some stuff
    })
})
</script>

Если вы сделаете это таким образом, ваш код firebase не будет вызываться во время SSR, и вам не придется иметь дело с загрузкой асинхронного модуля.

С учетом сказанного, я бы сказал, что размещение вашего кода Firebase в маршруте сервера и вызов этого маршрута от клиента, вероятно, является более чистым и эффективным способом сделать это.

Я бы проверил process.browser

  onMount(async () => {
    if (process.browser) {
      const {auth} = await import('../firebase/config');
      auth.signInWithEmailAndPassword("test@gmail.com", "test").then((res) => {
        // do some stuff
      })
    }
  })

или

if (process.browser) {
  onMount(async () => {
    const {auth} = await import('../firebase/config');
    auth.signInWithEmailAndPassword("test@gmail.com", "test").then((res) => {
      // do some stuff
    })
  })
}

Вы можете использовать:

      typeof window === 'undefined' // server
typeof window !== 'undefined' // client

Источник

Другие вопросы по тегам