Tailor - это служба макета, которая использует потоки для составления веб -страницы из Fragment Services. О'Рейли описывает его в названии этого сообщения в блоге как «библиотека, которая предоставляет промежуточное программное обеспечение, которое вы можете интегрировать в любой сервер node.js». Это частично вдохновлено BigPipe Facebook, но разработано в контексте электронной коммерции.
Некоторые из особенностей и преимуществ Tailor:
Tailor является частью Project Mosaic, которая направлена на то, чтобы помочь разработчикам создать микросервисы для фронта. Мозаика также включает в себя расширяемый HTTP -маршрутизатор для состава обслуживания (шкипер) с соответствующим RESTFUL API, который хранит маршруты (Honceeker); Больше компонентов в процессе публичного выпуска. Если ваша фронтальная команда делает переход монолита к микросервисам, вы можете найти портный и ее доступные братья и сестры полезным.
Микросервисы получают большую тягу в наши дни. Они позволяют нескольким командам работать независимо друг от друга, выбирать свои собственные технологические стеки и устанавливать свои собственные циклы выпуска. К сожалению, разработка фронта еще не полностью заработала в отношении преимуществ, которые предлагают микросервисы. Общая практика для построения веб -сайтов остается «монолит»: единственная кодовая база фронта, которая потребляет несколько API.
Что если бы мы могли иметь микросервисы на фронте? Это позволило бы разработчикам Frontend работать вместе со своими бэкэнд -аналогами над одной и той же функцией и независимо развернуть части веб -сайта - «фрагменты», такие как заголовок, продукт и нижний колонтитул. Донесение микросервисов на Frontend требует службы макета, которая составляет веб -сайт из фрагментов. Tailor был разработан для решения этой потребности.
Начните использовать Tailor с:
yarn add node-tailor const http = require ( 'http' ) ;
const Tailor = require ( 'node-tailor' ) ;
const tailor = new Tailor ( { /* Options */ } ) ;
const server = http . createServer ( tailor . requestHandler ) ;
server . listen ( process . env . PORT || 8080 ) ; fetchContext(request) - функция, которая возвращает обещание контекста, то есть объект, который отображает идентификатор фрагмента в фрагменте URL, чтобы иметь возможность переопределить URL -адреса фрагментов на странице, по умолчанию Promise.resolve({})fetchTemplate(request, parseTemplate) - функция, которая должна принести шаблон, вызовать parseTemplate и вернуть обещание результата. Полезно для реализации собственного способа извлечения и кэширования шаблонов, например, от S3. Реализация по умолчанию lib/fetch-template.js извлекает шаблон из файловой системыtemplatesPath - чтобы указать путь, в котором шаблоны хранятся локально, по умолчанию /templates/fragmentTag - имя тега фрагмента, по умолчанию fragmenthandledTags - массив пользовательских тегов, проверьте tests/handle-tag для получения дополнительной информацииhandleTag(request, tag, options, context) - получает тег или закрывающий тег и сериализует его на строку или возвращает потокfilterRequestHeaders(attributes, request) - функция, которая фильтрует заголовки запроса, которые передаются в запрос на фрагмент, проверьте реализацию по умолчанию в lib/filter-headersfilterResponseHeaders(attributes, headers) - функция, которая отображает заданные заголовки ответов из запроса первичного фрагмента до окончательного ответаmaxAssetLinks - Количество директив заголовков Link для CSS и JS Соответствует на фрагмент - по умолчанию к 1requestFragment(filterHeaders)(url, attributes, request) - функция, которая возвращает обещание запроса на фрагментный сервер, проверьте реализацию по умолчанию в lib/request-fragmentamdLoaderUrl - URL -AMD Loader. Мы используем require -gr от cdnjs в качестве дефолтаpipeInstanceName - Имя экземпляра трубы, которое доступно в окне браузера для потребления крючков Frontend.pipeAttributes(attributes) - Функция, которая возвращает минимальный набор атрибутов фрагмента, доступный на крючках Frontend.tracer - Apentraging Compliant Tracer реализация. Tailor использует Parse5, чтобы проанализировать шаблон, где он заменяет каждый fragmentTag на потоке от фрагментного сервера и handledTags с результатом функции handleTag .
< html >
< head >
< script type =" fragment " src =" http://assets.domain.com " > </ script >
</ head >
< body >
< fragment src =" http://header.domain.com " > </ fragment >
< fragment src =" http://content.domain.com " primary > </ fragment >
< fragment src =" http://footer.domain.com " async > </ fragment >
</ body >
</ html >id - необязательный уникальный идентификатор (автогенерированный)src - URL фрагментаprimary - обозначает фрагмент, который устанавливает код ответа страницыtimeout - необязательный тайм -аут фрагмента в миллисекундах (по умолчанию 3000)async - откладывает фрагмент до конца тега телаpublic - чтобы предотвратить отдача отфильтрованных заголовков запросов от вверх по течению в фрагменты.fallback-src - URL фрагмента резервного отступления в случае тайм -аута/ошибки на текущем фрагментеДругие атрибуты разрешены и будут переданы также соответствующим функциям (например,
filterRequestHeaders,filterResponseHeadersи т. Д.)
Фрагмент - это сервер HTTP (S), который отображает только часть страницы и устанавливает заголовок Link для предоставления URL -адресов CSS и ресурсов JavaScript. Проверьте examples/basic-css-and-js/index.js для проекта реализации.
JavaScript фрагмента - это модуль AMD, который экспортирует функцию init , которая будет вызвана элементом DOM фрагмента в качестве аргумента.
Tailor не будет следовать перенаправлениям, даже если отклик фрагмента содержит заголовок «местоположение», то есть намеренно, поскольку перенаправления могут ввести нежелательную задержку. Фрагменты с атрибутом primary может сделать перенаправление, поскольку он управляет кодом состояния страницы.
Примечание: для совместимости с AWS заголовок Link также может быть передан как x-amz-meta-link
По умолчанию входящий запрос будет использоваться для выбора шаблона.
Итак, чтобы получить шаблон index.html , вы переходите в /index .
Если вы хотите прослушать /product/my-product-123 чтобы перейти к шаблону product.html , вы можете изменить req.url на /product .
Каждый заголовок по умолчанию фильтруется, чтобы избежать протекающей информации, но вы можете дать оригинальный URI и хост, добавив его в заголовки, x-request-host и x-request-uri , а затем считывая в фрагменте заголовки, чтобы узнать, какой продукт принести и отображать.
http
. createServer ( ( req , res ) => {
req . headers [ 'x-request-uri' ] = req . url
req . url = '/index'
tailor . requestHandler ( req , res ) ;
} )
. listen ( 8080 , function ( ) {
console . log ( 'Tailor server listening on port 8080' ) ;
} ) ;Некоторые из концепций в Tailor подробно описаны в конкретных документах.
Tailor имеет из распределенного приборочного прибора для распределенного трассировки с Opentracing. Он поднимет любой контекст SPAN по запросу http и распространяет его на существующие вызовы удаленной процедуры (RPCS).
В настоящее время только извлечение фрагментов приводится в силу, предоставляя некоторые дополнительные детали, такие как тег фрагмента, атрибуты и некоторая полезная нагрузка, такую как The Stack Trace для ошибок.
# Get a copy of the repository
git clone https://github.com/zalando/tailor.git
# Change to the folder
cd tailor
# Install dependencies
yarnnode examples/basicnode examples/basic-css-and-jsnode examples/multiple-fragments-with-custom-amdnode examples/fragment-performanceПерейдите на http: // localhost: 8080/index после запуска конкретного примера.
Примечание. Пожалуйста, запустите примеры с версиями узла> 6.0.0
Также доступны примеры применения на одну страницу:
Чтобы начать запуск Benchmark выполнить npm run benchmark и подождите пару секунд, чтобы увидеть результаты.
Пожалуйста, проверьте рекомендации здесь.