Чистый способ визуализации и повторного использования компонентов / шаблонов RactiveJS

Хорошо. Я обременен причинами SEO, чтобы изменить приложение, выполненное в expressjs/Ractive для поддержки рендеринга на стороне сервера.

Передняя сторона вещей упакована с использованием gulp, и все организовано в чистую вложенную компонентную структуру.

Есть ли способ использовать большинство из того, что имеется, чтобы также отобразить некоторые из этих компонентов на сервере? Я взломал ractive-render, но документация оставляет желать лучшего, и, честно говоря, я боюсь, что в конце концов меня покинут.

Мои компоненты, по большей части, содержат слишком много шаблонов, чтобы вставлять их в определение компонента. Они организованы в иерархию папок, причем самым низким уровнем является папка с отдельным компонентом, содержащая определение компонента index.js и файл шаблона template.html. Я использую ractivate для процесса gulp / browserify, чтобы вытащить эти файлы шаблона.html при сборке.

Я ищу решение, которое позволит мне упаковать компоненты для использования как с browserify / gulp, так и с чем-то вроде ractive-render для рендеринга их в экспресс.

Это круто, если это невозможно, но мои исследования до сих пор были хорошими в том, чтобы доставлять мне головные боли.

1 ответ

Это возможно - сайт http://examples.ractivejs.org/ представляет собой приложение Express, которое отображает компоненты Ractive на сервере. (FWIW репо здесь, хотя это постоянная незавершенная работа и, возможно, не особенно освещает, кроме как показать, что это возможно - shared папка содержит некоторые компоненты, которые отображаются на сервере и клиенте).

По сути, вы просто создаете экземпляр Ractive точно так же, как в браузере, за исключением того, что вы не предоставляете el собственность или звонок ractive.render(el), Вместо этого вы звоните ractive.toHTML(),

Таким образом, фрагмент вашего экспресс-приложения может выглядеть так:

var Article = require( './components/Article' );
var fetchArticle = require( './utils/fetchArticle' );

var page = `
  <!DOCTYPE html>
  <html>
  <head>...</head>
  <body>
    <@content@>
    <script src='app.js'></script>
  </body>
  </html>`;

app.get( '/articles/:slug', function ( req, res ) {
  var slug = req.params.slug;

  fetchArticle( slug )
    .then( articleData => {
      var ractive = new Article({
        data: {
          article: articleData,
          user: userData
        }
      });

      var html = page
        .replace( '<@content@>', ractive.toHTML() );

      res.send( html );
    });
  });
});

Конечно, вы также можете повторно использовать один и тот же экземпляр каждый раз, просто сбрасывая данные.

В настоящее время Ractive не имеет никакого способа для постепенного улучшения HTML-кода, отображаемого на сервере - другими словами, когда вы рендерите компонент на стороне клиента, вы уничтожаете существующий DOM. Это то, что мы планируем рассмотреть в будущем выпуске.

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