задний план
Несколько дней назад я сделал гаджет для измерения скорости веб-страницы в ответ на спрос. После рассмотрения я сделал несколько выборов. Поскольку я использовал реакцию для перемещения кирпичей в компании, на этот раз я решил улучшить всесторонние возможности, свяжитесь и используйте vue для создания небольшого проекта, vue После сжатия с помощью gizp он составляет всего около 33 КБ, плюс axios, prerender-spa-plugin и бизнес-код, он после сжатия составляет менее 50 КБ, и пользовательский опыт относительно хорош.
Поскольку я не использовал Vue много раз, я искал различные материалы, но я чувствую, что процесс очень негладкий.Из моего опыта, средняя информация, предоставляемая Vue в Интернете, намного уступает информации, предоставляемой React, и я наступили на некоторые ямы, особенно prerender-spa Плагин -plugin столкнулся со многими проблемами, которые не упоминались в Интернете, поэтому я поделился своими достижениями и внес свой вклад в Vue.
Источник
добавить описание: предварительный рендеринг выполняется один раз заранее при компиляции, рендеринг на стороне сервера ssr заключается в том, что каждый раз, когда пользователь запрашивает сервер, сервер заполняет соответствующий контент (эти два существенно различаются, поясняется здесь!)
Установить
Установка этого плагина - первая ямка.Поскольку этот небольшой проект самостоятельный, то версию npm-пакета учитывать не нужно.Просто запускаем всю среду на последнем vuecli3.0,но если честно,скаффолдинг vuecli3 дает мне очень хороший опыт.Ой, исходная конфигурация веб-пакета была скрыта и заменена на vue.config.js, но в Интернете не так много информации, и настройка заняла больше времени При установке плагина prerender-spa-plugin я использовал nrm для переключения на cnpm, но он всегда застревает в том месте, где установлен puppeteer. Плагин prerender-spa-plugin должен зависеть от puppeteer. загрузите последнюю версию хрома, созданную ядром браузера Google Headless (около 200 миллионов+), поэтому, если вы не можете получить доступ к Интернету с научной точки зрения, вы получите сообщение об ошибке при загрузке. Пользовался lantern и долго ждал, чтобы скачать.Версия 72, поэтому очень важно часто переворачивать стену 😅
принцип
puppeteer — это подключаемый модуль, созданный Google, который может выполнять множество операций и широко используется в приложениях для автоматизации браузера, таких как поисковый робот и автоматизация тестирования. SPA запустился один раз, чтобы сгенерировать статический HTML с заполненными DOM-узлами и данными.Это было так просто и грубо.Чтобы напрямую вернуть пользователю xhtml-документ с содержимым, он заранее запускал его в браузере и генерировал работает через js и css index.html (с маршрутизацией) и другие документы. В этом случае есть два недостатка: первый — он не может отображать собственный контент пользователя, а второй — не подходит для масштабных проектов с множеством динамических маршрутов. Как только вы поймете принцип, вы сможете уверенно его использовать 🙂
настроить
Если вы начнете его использовать, то первый момент, на который следует обратить внимание, это установить введенный vue-router режим в историю (обычно я также рекомендую использовать режим истории, хеш имеет # некрасивый, просто настройте историю, чтобы вернуться к корневой каталог), но если это корневой путь и нет подчиненного маршрута, то он будет скомпилирован без введения vue-router. . .
vue.config.jsв.
Если у вас есть время, рекомендуется прочитать github с самого началаОфициальный доктор медицинысуществуетvue.config.jsсначала импортировать
const PrerenderSPAPlugin = require('prerender-spa-plugin');
const Renderer = PrerenderSPAPlugin.PuppeteerRenderer;
затем модуль.экспорт
configureWebpack: {
plugins: [
new PrerenderSPAPlugin({
staticDir: path.join(__dirname,'dist'),
routes: ['/'],
renderer: new Renderer({
inject: {
foo: 'bar'
},
headless: false,
renderAfterDocumentEvent: 'render-event',
//renderAfterTime: 5000,
//renderAfterElementExists: 'my-app-element'
}),
}),
..............
- Излишне говорить, что dist в staticDir — это имя выходной папки.
- Маршруты настраивают маршруты, которые вы хотите реализовать предварительный рендеринг.Здесь у меня есть только корневой маршрут, который нужно предварительно рендерить.Есть и другие маршруты, которые можно добавить в массив.
- Предварительный рендеринг средства визуализации обеспечивает три реализации синхронизации: renderAfterDocumentEvent, renderAfterTime, renderAfterElementExists.
Обычно используются renderAfterDocumentEvent и renderAfterTime, смысл которых очень прост: один запускает предварительную отрисовку после события, а другой — запускает предварительную отрисовку через несколько секунд после загрузки.
Если вы используетеrenderAfterDocumentEventДля реализации в жизненном цикле vue
mounted: function(){
document.dispatchEvent(new Event('render-event'));
},
После такой настройки каждый раз при упаковке сборки плагин будет автоматически вызывать ядро хрома для заливки html в роут.Если вы хотите наблюдать разницу, то можете просмотреть ее через превью хрома Без предварительного рендеринга (похожие эффекты Baidu проделал большую обработку):
Это сделано, уровень ограничен, написание недостаточно глубокое, спасибо за прочтение!