Microspa, Или Как Изобрести Квадратное Колесо

Всем привет, меня зовут Андрей Яковенко, я веб-разработчик в компании Digital Design. Наша компания имеет множество проектов, реализованных с использованием системы управления веб-контентом.

сайтфинити или просто CMS. Причины, по которым мы его используем, были описаны ранее в этот статья.

CMS — это, как правило, многостраничное приложение, и сегодня я расскажу о том, что может дать внедрение frontend-фреймворков в решения на sitefinity и как это сделать.



MicroSPA, или как изобрести квадратное колесо



Лирическое отступление

Хотя в sitefinity встроен Angular.js, возможность интеграции других фреймворков отсутствует из-за закрытых исходных кодов.

Однако это не мешает нам использовать возможности других фреймворков.

Примеры в этой статье не являются панацеей и носят преимущественно информационный характер.



Ищите что-то новое

Поскольку Angular, хотя и первая версия, уже присутствует в sitefinity, мы хотели объединить нашу CMS с React или Vue.js. Оба эти фреймворка по-своему хороши и имеют свои подходы к разработке приложений, но другого сравнения мы проводить не будем.

Бегло просмотрев возможные решения, я нашел интересный проект, который компилировал страницы, написанные на React, в статический html. Нам это решение не подошло, так как нам нужно не потерять все преимущества SSR (Server Side Render) вместе с использованием исполняемого кода на стороне клиента.



От слов к делу

Sitefinity, как и большинство CMS, позволяет компоновать страницу различными элементами для отображения контента (виджетами).

На примере мы рассмотрим варианты внедрения Vue.js в готовые виджеты.



Первый способ (простой)

Этот метод предполагает подключение Vue.js как библиотеки к шаблону главной страницы.

После этого мы можем инициализировать наше приложение в любом месте любого виджета.

Пример простого виджета:

  
  
  
  
  
   

new Vue({ el: '#widget-id', data: { msg: 'Hello world', }, })

Однако это будет означать, что весь блок виджета будет использоваться в качестве шаблона, а Vue.js попытается его интерполировать и, чтобы отобразить сообщение в нужном месте, необходимо будет написать специальную конструкцию, которая будет отображаться, если что-то приводит к приостановке выполнения кода js перед рендерингом или если у пользователя отключен JavaScript. Решение этой проблемы — написать свой шаблон, который будет дублировать виджет. Давайте расширим наш компонент. Пример:

new Vue({ el: '#widget-id', data: { msg: 'Hello world', }, template: '<div>{{msg}}</div>', })

Теперь весь html-код нашего виджета будет заменен на шаблон, описанный в поле шаблона, и для того, чтобы перенести данные из модели виджета в Vue, достаточно любым удобным способом преобразовать модель в JSON и передать ее в поле данных.



Второй способ (сложный)

Для этого метода нам понадобится вебпак, минимальной конфигурацией которого будет vue-loader. Также нам не нужно использовать html-extract-plugin, поскольку мы можем хранить шаблоны в js-коде.

Теперь мы можем использовать однофайловые компоненты Vue. Пример однофайлового компонента ( Образец.

vue ):

<template> <div>{{msg}}</div> </template> <script> export default { name: 'Sample', data: function () { return { msg: 'Hello world', } }, } </script>

Однофайловые компоненты имеют больше возможностей оформления, чем обычные компоненты, а также позволяют уменьшить количество файлов в каталоге проекта.

После написания компонента виджета нам необходимо его инициализировать.

Пример инициализации виджета:

import Vue from 'vue' import Sample from '.

/Sample.vue' Vue({ render: function (h) { return h(Sample) } }).

$mount('#widget-id')

Но в этом случае код выполнится сам по себе; если вам нужно контролировать инициализацию приложения, например указать селектор, рациональным решением будет обернуть приложение в метод, который можно будет вызвать в любой момент на странице.

Давайте расширим наш пример:

import Vue from 'vue' import Sample from '.

/Sample.vue' function initWidget (selector) { Vue({ render: function (h) { return h(Sample) } }).

$mount(selector) } initWidget('#widget-id')

Остается только передать данные модели виджета компоненту Vue.js. Это легко сделать, записав их в формате JSON перед передачей в объект данных экземпляра Vue, после чего их можно будет передать компоненту в качестве реквизита.

Пример:

import Vue from 'vue' import Sample from '.

/Sample.vue' function initWidget (selector) { Vue({ data: function () { return { some: 'some value', } }, render: function (h) { return h(Sample, { props: data }) } }).

$mount(selector) } initWidget('#widget-id')



Небольшой обзор

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

Таким образом, первый способ подходит для быстрой интеграции отдельного раздела приложения, например, кнопки или формы, а второй, в свою очередь, является более продвинутым и имеет больший набор возможностей для написания как отдельных частей приложения, так и приложение и автономные страницы.

Однако у обоих методов есть один большой недостаток — при таком использовании фреймворков возникает необходимость дважды проделывать одну и ту же работу для разделов страниц, от которых зависит SEO. С другой стороны, при желании с помощью такого подхода можно подключить любой фреймворк, библиотеку или написать собственный DOM-менеджер на ванильном JavaScript или jQuery. Вот и все.

Спасибо за внимание.

Теги: #JavaScript #frontend #vue.js #react.js #vue #react #webpack #spa #javascript framework #CMS #MPA #react #view #webpack 4 #webpack #sitefinity #reactjs. vue #builders #webpack 4 #sitefinity #microspa #mspa #microspa

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.