Краткий обзор практики Vue.js (3) Рендеринг скелетного экрана

Vue.js

Сценарии применения

Проще говоря, экран-скелет — это страница изhtml загрузка завершенаДля завершения загрузки js и выполнениявизуализация данныхСхема временного рендеринга базовой структуры страницы между этими двумя моментами времени.

Насколько я понимаю, существуют определенные сценарии оптимизации экрана скелета, включая, помимо прочего, следующие ситуации:

  • Маршрутизация SPA с механизмом ленивой загрузки
  • Рендеринг домашней страницы для многостраничных программ
  • Маршрутизация без ленивой загрузки в SPA, но объем данных большой, и полная загрузка и рендеринг данных занимает много времени

https://huangxuan.me/2017/07/12/upgrading-eleme-to-pwa

На приведенном выше рисунке наглядно показано переключение между двумя многостраничными программами с использованием Skeleton Screen для оптимизации внешнего вида пользователя.

Рендеринг скелета находится вВремя компиляции внешнего проектаЗавершено, что соответствует тому факту, что компонент визуализируется в DOM в режиме реального времени во время выполнения браузера, что технически находится на стороне сервера.Предварительный рендеринг макета компонента и данных в строки htmlИ вставьте его в html-файл. Для этого требуется поддержка рендеринга на стороне сервера (ssr). Фронтенд-фреймворки, такие как react и vue.js, которые полагаются на виртуальную модель DOM, естественным образом поддерживают рендеринг на стороне сервера. Потому что для простого создания виртуального дома и сопоставления его с деревом DOM требуется только среда выполнения JavaScript на стороне сервера (например, движок V8). Рендеринг на стороне сервера на основе виртуального дома, созданного в ответ, вы можете обратиться ктехнический блог поразительно

Рендеринг на стороне сервера

Рендеринг на стороне сервера используется в качестве основного стека технологий каркасного экрана.Вы можете обратиться к официальным документам каждой внешней среды, таким какvue-ssr guide, В основном зависитvue-server-rendererЭта библиотека реализует

Возьмите компонент Vue.js, визуализируйте HTML-строку в Node.js, вы можете просто разделить шаги:

// 第 1 步:创建一个 Vue 实例
const Vue = require('vue')
const app = new Vue({
// el: 是不需要的,因为一旦设置目标 el,就会涉及document 操作
  template: `<div>Hello World</div>`
})

// 第 2 步:创建一个 renderer
const renderer = require('vue-server-renderer').createRenderer()

// 第 3 步:将 Vue 实例渲染为 HTML
renderer.renderToString(app, (err, html) => {
  if (err) throw err
  console.log(html)
  // => <div data-server-rendered="true">Hello World</div>
})

Официальная демонстрация выше очень проста, определите компонент vue непосредственно в файле скрипта nodejs. Однако в практических приложениях наши компоненты, как правило, более сложны, это может быть запись app.vue, которая зависит от нескольких компонентов, поэтому нам нужно представить ее по-другому.Объект vm, созданный новым Vue.Этот объект vm в качестве первого параметра функции renderer.renderToString является ядром. На самом деле, отслеживая исходный код vue-server-renderer, ssr по-прежнему полагается на функцию рендеринга компонента vue для выполнения большей части работы, которая является основной функцией компонента vue.

                                          | installSSRHelpers(component); 
renderToString -> createRenderFunction -> | normalizeRender(component);  // get component render function
                                          | renderNode(component._render(), true, context); 
                                          // call component render to VNode.

несколько ям

  • document not defined

рендеринг на стороне сервера иНе эквивалентно запуску процесса браузера на стороне сервера., поэтому глобальные объекты, такие как окно, документ и т. д., в форме браузера получить нельзя. Как только операция с документом будет задействована в js-скрипте, отображаемом на стороне сервера, будет сообщено об этой ошибке документа, не определенной.

Таким образом, либо в компоненте vue, либо во всех зависимостях, где используется документ, должно быть выполнено обнаружение, либо глобальный объект должен быть добавлен в определение документа перед рендерингом на стороне сервера.github issue

  • unexpected token =

Во время выполнения vue-server-renderer предоставляет API для рендеринга компонентов vue в html-фрагменты и вставки их в HTML-шаблон.При создании рендерера передается шаблон. Позже выяснилось, что шаблон ssrНе может содержать такие символы, как <% ddd>Да, то есть шаблон должен иметьСовместим с синтаксисом шаблона vue..

// 最后ssr 就会输出 Vue 组件的内容,并且注入到template 中 注释 <!--vue-ssr-outlet--> 的地方

const renderer = createRenderer({
  template: require('fs').readFileSync('./index.template.html', 'utf-8')
})
const context = { title: 'Hello' }
renderer.renderToString(app, context, (err, html) => {
  // 页面模板中 {{ title }} 将会是 "Hello"
})

конкретная ссылкаssr использует шаблоны страниц. Поскольку некоторые бэкенд-программисты привыкли к синтаксису шаблонов asp или jsp, использование <% vue ssr.>

написать на обороте

Подводя итог, на этот раз я просто кратко проанализировал и записал первую часть реализации каркасного экрана Skeleton, которая представляет собой рендеринг на стороне сервера, который является технической предпосылкой предварительного рендеринга. На самом деле такое бэкенд-сращивание Html-строк живет в эпоху PHP, на сервере python и даже на сервере node.js, мы это уже делали (ejs или jade).По сути, объединение строк Html для улучшения SEO и отклика на первый экран..

На Github есть много генераторов статических веб-сайтов или инструментов для ведения блогов, основанных на рендеринге на стороне сервера, которые могут обеспечить относительно плавный просмотр, например:vuepress.

Что касается реализации каркасного экрана, то в индустрии уже есть очень зрелые решения, как на основе ssr, так и непосредственно на основе ядра браузера для запуска процесса пререндеринга, которые вообще не используют стек технологий Vue ssr. В следующий раз я поделюсь последним подробно

Справочное чтение:

vue ssr guide

Жажда обновления PWA

Вторая серия разработки Vue.js: функция рендеринга

essential-guide-to-improve-seo-in-single-page-application-vuejs