Пустое тело Использование Prerender.io с Meteor

Я пытаюсь использовать prerender.io с приложением Meteor 1.5. Я использую пакет npm prerender-node

  var prerenderio = Npm.require('prerender-node') .set('prerenderToken', token)
                                                .set('protocol', protocol)
                                                .set('host', host);  


  // Feed it to middleware! (app.use)
  WebApp.connectHandlers.use(prerenderio);  

Я запускаю журнал prerender.io с кодом 200. Страницы кэшируются, но страницы содержат только заголовок и пустое тело.

Чтобы сделать тесты, я добавил пакет meteorhacks:inject-initial и вставил строки в тело, и он отлично работает. Интересно, есть ли у меня проблема с маршрутизатором, который является flowrouter.

я тоже ставлю

<head>
  <meta charset="utf-8">
  <meta name="fragment" content="!">
  ALL  <meta ... >
  <!-- a script -->
  <scripts ... >
  <!-- prerenderio -->
  <script> console.log(Date()); window.prerenderReady = false; </script>  
</head>

Для проверки я сбросил кеш prerender.io. когда я тестирую https://www.toto.com?_escaped_fragment_=

У меня нет времени в клиентской консоли. Я вижу новую строку на prerender.io

Я провел тот же тест в https://www.bing.com/webmaster/diagnostics/seo/analyzer

Теперь давайте посмотрим на новое содержимое строки кэша:

  Server: nginx/1.4.6 (Ubuntu)
  Date: Wed, 21 Jun 2017 20:16:33 GMT
  Content-Type: text/html; charset=utf-8
  Transfer-Encoding: chunked
  Connection: close
  Vary: Accept-Encoding
  Cache-Control: no-cache
  Content-Encoding: gzip


  <!DOCTYPE html>
  <html>
  <head>
  <script type="text/javascript" src="/packages/meteorhacks_zones/assets/utils.js?1498075872540"></script>
  <script type="text/javascript" src="/packages/meteorhacks_zones/assets/before.js?1498075872540"></script>
  <script type="text/javascript" src="/packages/meteorhacks_zones/assets/zone.js?1498075872540"></script>
  <script type="text/javascript" src="/packages/meteorhacks_zones/assets/tracer.js?1498075872540"></script>
  <script type="text/javascript" src="/packages/meteorhacks_zones/assets/after.js?1498075872540"></script>
  <script type="text/javascript" src="/packages/meteorhacks_zones/assets/reporters.js?1498075872540"></script>


    <link rel="stylesheet" type="text/css" class="__meteor-css__" href="/f6675d95a01ce3ac63036505eb1ace94a68b1bb7.css?meteor_css_resource=true">
  <meta charset="utf-8">
    <title>Toto</title>

    ...

    <meta name="robots" content="index, follow">

    ...

    <!-- http referrer links -->
    <meta name="referrer" content="always">


    <meta name="fragment" content="!">



    <!-- No resize on mobiles -->
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"> <!--320-->

    <!-- a script -->
    <script ... ></script>

    <!-- prerenderio -->
    <script> console.log(Date()); window.prerenderReady = false; </script>

  </head>
  <body>



  <script type="text/javascript">__meteor_runtime_config__ = JSON.parse(decodeURIComponent("%7B%22meteorRelease%22%3A%22METEOR%401.5-beta.8%22%2C%22meteorEnv%22%3A%7B%22NODE_ENV%22%3A%22production%22%2C%22TEST_METADATA%22%3A%22%7B%7D%22%7D%2C%22PUBLIC_SETTINGS%22%3A%7B%22analyticsSettings%22%3A%7B%22autorun%22%3Afalse%2C%22Mixpanel%22%3A%7B%22token%22%3A%225fc6f49885cbf2ec8d80a15c0a310399%22%2C%22people%22%3Atrue%7D%2C%22Google%20Analytics%22%3A%7B%22trackingId%22%3A%22UA-60492530-2%22%7D%7D%2C%22ga%22%3A%7B%22account%22%3A%22UA-60492530-2%22%7D%7D%2C%22ROOT_URL%22%3A%22https%3A%2F%2Fwww.Toto.com%22%2C%22ROOT_URL_PATH_PREFIX%22%3A%22%22%2C%22appId%22%3A%221yyz6nr2dyysy1rxvng3%22%2C%22autoupdateVersion%22%3A%2237dc9ce25f5e0f5f3a2253bdcb3c80166a4e83d2%22%2C%22autoupdateVersionRefreshable%22%3A%2273bc2363ca210840ec3d6947a649e3388beca5c5%22%2C%22autoupdateVersionCordova%22%3A%224b9074136556412500d12284625a4f5d81ac3f3d%22%7D"));</script>

    <script type="text/javascript" src="/fef4959b1bc37d5a9c2a1c09ddcb28fd7c374f10.js?meteor_js_resource=true"></script>


  </body>
  </html>

Здесь я дал все содержание тела. Я не удалял ни одной строки.


person marcoDiroccho    schedule 21.06.2017    source источник
comment
Я думаю, что Meteor 1.5 может использовать некоторый код ES6, который наш браузер PhantomJS v2.1.1 не может обработать :( Мы работаем над переходом на Headless Chrome, но не можем сообщить ETA. Если вы можете переключиться на Meteor 1.4 в тем временем это должно исправить это Извините за беспокойство :(   -  person Prerender.io    schedule 22.06.2017
comment
Я понимаю. Я не могу вернуться к Meteor 1.4 из-за некоторых других особенностей. Мы воспользовались всеми преимуществами версии 1.5.   -  person marcoDiroccho    schedule 23.06.2017
comment
Можете ли вы отправить мне электронное письмо по адресу [email protected]? Я посмотрю, что мы можем сделать с вами на Chrome, как только мы сможем что-то подготовить.   -  person Prerender.io    schedule 24.06.2017
comment
Похоже, вы используете ES6, и Phantom, используемый prerender.io, не может с этим справиться. Вам может быть интересно попробовать эту службу с поддержкой ES6 или убедиться, что в ней нет кода ES6. пакет вашего приложения.   -  person dr.dimitru    schedule 27.06.2017
comment
Потрясающий! Установку делал утром. Всего пару минут и все работает. Интересно, нужен ли мне по-прежнему ‹script› window.prerenderReady = false; ‹/скрипт›   -  person marcoDiroccho    schedule 27.06.2017
comment
@MarcRoche используется window.IS_RENDERED, см. здесь   -  person dr.dimitru    schedule 15.07.2017
comment
@MarcRoche, у меня такая же проблема, как вам удалось решить проблему? я использую метеор [email protected]. Пожалуйста, дайте мне знать, если вам пришлось что-то изменить?   -  person Sijan Shrestha    schedule 10.08.2018


Ответы (1)


Пререндерить пользователя здесь. У нас были проблемы с Prerender, который не ждал, пока все скрипты будут выполнены до завершения, и поэтому рассчитанный dom еще не полностью визуализирован, что похоже на то, с чем вы сталкиваетесь. Мы решили эту проблему с помощью флага готовности к пререндеру, описанного в документации по пререндеру, скопированной здесь для удобства:

Поместите это в свой HTML:

<script> window.prerenderReady = false; </script>

Когда мы увидим, что для window.prerenderReady задано значение false, мы подождем, пока для него не будет установлено значение true, чтобы сохранить HTML. Выполните следующее, когда ваша страница будет готова (обычно после вызовов ajax).

window.prerenderReady = true;
person Sean    schedule 21.06.2017
comment
Я забыл сказать, что я поместил это в main.html ‹head›, и я также поместил еще один с инжектом. Я добавил console.log, чтобы убедиться, что оба выполняются. - person marcoDiroccho; 22.06.2017
comment
Вы уверены, что устанавливаете window.prerenderReady = true; после загрузки всех данных и полного отображения представления? - person Sean; 22.06.2017