Stenil js - предварительный рендеринг с запросами Firestore - PullRequest
0 голосов
/ 28 марта 2020

У меня возникли проблемы с предварительным просмотром приложения Stencil PWA с интеграцией с Firestore. Еще не добавил ни одной страницы / маршрута в сгенерированный код. Это просто firebase, интегрированный в стандартное приложение Stencil PWA.

Я попытался импортировать firebase через тег Script в index. html и npm при установке firebase. В обоих случаях приложение работает в браузере, но не работает во время предварительного рендеринга. Я также использую rxFire.

Проект с проблемой находится в https://github.com/saiy2k/stencil-firestore-prerender dev ответвление

Метод 1: Импорт Firebase через теги Script

index. html

  <script src="https://www.gstatic.com/firebasejs/5.3.0/firebase-app.js"></script>
  <script src="https://www.gstatic.com/firebasejs/5.3.0/firebase-auth.js"></script>
  <script src="https://www.gstatic.com/firebasejs/5.3.0/firebase-firestore.js"></script>
  <script>
      firebase.initializeApp({
          apiKey: "#####",
          authDomain: "#####",
          databaseURL: "#####",
          projectId: "#####",
          storageBucket: "#####",
          messagingSenderId: "#####",
          appId: "#####"
      });
      const firestore = firebase.firestore();
      const settings = { timestampsInSnapshots: true };
      firestore.settings(settings);
      console.log('firebase initialized');
  </script>

компонентов / app-home / app-home.tsx

/// <reference types="firebase" />
declare var firebase: firebase.app.App;

... 

  componentWillLoad() {

    //Method 1: via Script
    const ref = firebase.firestore().collection('Category');
    collectionData(ref, 'id').subscribe(cat => {
        console.log(cat);
        this.cats = cat;
    });

  }

С выше код, когда я пытаюсь выполнить предварительный рендеринг, я получаю эту ошибку:

[ ~/projects/ssrapp ]$ npm run build --prerender

> ssrapp@0.0.1 build /Users/saiy2k/projects/ssrapp
> stencil build

[13:47.8]  @stencil/core v1.11.2 ?
[13:51.6]  build, app, prod mode, started ...
[13:51.8]  transpile started ...
[13:57.6]  transpile finished in 5.82 s
[13:57.6]  copy started ...
[13:57.6]  generate hydrate app started ...
[13:57.6]  generate lazy started ...
[14:00.9]  copy finished (1235 files) in 3.27 s
[14:12.5]  generate hydrate app finished in 14.88 s
[14:32.8]  generate lazy finished in 35.17 s
[14:32.9]  build finished in 41.26 s

[14:33.2]  prerendering started ...
[14:35.1]  prerendering failed in 1.96 s

[ ERROR ]  Hydrate Error
           ReferenceError: firebase is not defined at new AppHome
           (/Users/saiy2k/projects/ssrapp/dist/hydrate/index.js:9787:20) at initializeComponent
           (/Users/saiy2k/projects/ssrapp/dist/hydrate/index.js:6405:17) at connectedCallback
           (/Users/saiy2k/projects/ssrapp/dist/hydrate/index.js:6497:17) at hydrateComponent
           (/Users/saiy2k/projects/ssrapp/dist/hydrate/index.js:6831:17) at connectElement
           (/Users/saiy2k/projects/ssrapp/dist/hydrate/index.js:6786:28) at MockHTMLElement.patchedConnectedCallback
           [as connectedCallback] (/Users/saiy2k/projects/ssrapp/dist/hydrate/index.js:6742:20) at
           fireConnectedCallback (/Users/saiy2k/projects/ssrapp/dist/hydrate/index.js:298:14) at connectNode
           (/Users/saiy2k/projects/ssrapp/dist/hydrate/index.js:275:9) at MockHTMLElement.appendChild
           (/Users/saiy2k/projects/ssrapp/dist/hydrate/index.js:1364:7) at attachComponent
           (/Users/saiy2k/projects/ssrapp/dist/hydrate/index.js:16103:15)

[ ERROR ]  Hydrate Error
           TypeError: Cannot read property 'map' of undefined at AppHome.render
           (/Users/saiy2k/projects/ssrapp/dist/hydrate/index.js:9816:626) at callRender
           (/Users/saiy2k/projects/ssrapp/dist/hydrate/index.js:5925:49) at updateComponent
           (/Users/saiy2k/projects/ssrapp/dist/hydrate/index.js:5874:33) at update
           (/Users/saiy2k/projects/ssrapp/dist/hydrate/index.js:5835:26) at process.nextTick
           (/Users/saiy2k/projects/ssrapp/dist/hydrate/index.js:6969:13) at process._tickCallback
           (internal/process/next_tick.js:61:11)

Метод 2: Импорт Firebase через npm i

Я предполагал, что предварительный рендер не может получить доступ к Firebase так как его импортировали через скрипт. Поэтому я закомментировал теги сценария и сделал npm i --save firebase

и сделал следующий код:

components / app-home / app-home.tsx

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

... 

  componentWillLoad() {

    //Method 2: via npm module
    const app = firebase.initializeApp({
        apiKey: "AIzaSyBxT5MFxXvfAGDVcWLhYQ3vSBW7dOnKjBs",
        authDomain: "bazon-india.firebaseapp.com",
        databaseURL: "https://bazon-india.firebaseio.com",
        projectId: "bazon-india",
        storageBucket: "bazon-india.appspot.com",
        messagingSenderId: "928019631782",
        appId: "1:928019631782:web:ea7c413839ee346dac6e67"
    });
    const ref = app.firestore().collection('Category');
    collectionData(ref, 'id').subscribe(cat => {
        console.log(cat);
        this.cats = cat;
    });

  }

С приведенным выше кодом, когда я пытаюсь выполнить предварительный рендеринг, я получаю эту ошибку:

[ ~/projects/ssrapp ]$ npm run build --prerender

> ssrapp@0.0.1 build /Users/saiy2k/projects/ssrapp
> stencil build

[20:50.4]  @stencil/core v1.11.2 ?
[20:53.2]  build, app, prod mode, started ...
[20:53.3]  transpile started ...
[20:57.2]  transpile finished in 3.83 s
[20:57.2]  copy started ...
[20:57.2]  generate hydrate app started ...
[20:57.2]  generate lazy started ...
[21:00.7]  copy finished (1235 files) in 3.58 s
[21:17.0]  generate hydrate app finished in 19.81 s
[21:44.8]  generate lazy finished in 47.66 s
[21:45.0]  build finished in 51.76 s

[21:45.3]  prerendering started ...
[21:49.0]  prerendered 4 urls, averaging 926 ms per url
[21:49.0]  prerendering failed in 3.71 s

[ ERROR ]  Hydrate Error
           ReferenceError: crypto is not defined at t.randomBytes
           (/Users/saiy2k/projects/ssrapp/dist/hydrate/index.js:26833:9) at Function.t.Ur
           (/Users/saiy2k/projects/ssrapp/dist/hydrate/index.js:16509:20) at new t
           (/Users/saiy2k/projects/ssrapp/dist/hydrate/index.js:22306:95) at t.pv
           (/Users/saiy2k/projects/ssrapp/dist/hydrate/index.js:22880:26) at t.cv
           (/Users/saiy2k/projects/ssrapp/dist/hydrate/index.js:22872:14) at t.collection
           (/Users/saiy2k/projects/ssrapp/dist/hydrate/index.js:22905:14) at AppHome.componentWillLoad
           (/Users/saiy2k/projects/ssrapp/dist/hydrate/index.js:26917:37) at safeCall
           (/Users/saiy2k/projects/ssrapp/dist/hydrate/index.js:6002:36) at scheduleUpdate
           (/Users/saiy2k/projects/ssrapp/dist/hydrate/index.js:5847:23) at schedule
           (/Users/saiy2k/projects/ssrapp/dist/hydrate/index.js:6433:28)

Похоже, что какая-то проблема внутри collection(). Означает ли это, что FireBase не готова к предварительному рендерингу? или я что-то не так делаю?

Пожалуйста, помогите.

...