- PVSM.RU - https://www.pvsm.ru -
В этой статье я расскажу как можно организовать процесс сборки фронтэнда «от и до».
Советую начать со вводной статьи [1], если кто не читал.
Там я рассказывал про TeaCSS как про надмножество CSS, и это была неправда. Точнее – полуправда. И таким он был во времена своего создания (откуда и название).
Сейчас – это декларативный метаязык для генерации контента, во многом черпающий вдохновение из QML, Lisp, Clojure, Nemerle.
Я бы для начала хотел договориться о некоторых базовых вещах, чтоб избежать холиваров:
Именно из-за такого разделения «способностей» сейчас буйным цветом цветут различные сторонние DSL (Domain Specific Language), встроенные в язык DSL (в руби, лисп и т.д.) декларативного толка. На них удобно описывать процессы сборки, тестирования, интерфейсы, внешний вид – т.е. все, где базовая сущность уже определена. Для приведенных примеров сущности – это «проект», «функциональность», «пользовательский ввод и поведение программы» и «типаж предмета, чей внешний вид описывается».
Это каркас для декларативных DSL, конструктор компиляторов с Javascript API. И несколько базовых реализаций DSL для стилей, скриптов, шаблонов и изображений из коробки.
Он берет на себя парсинг, оказывает существенную помощь в генерации контента. Чем-то этот проект родственнен PEG.js [2] и Jison [3] – если есть время, рекомендую ознакомиться.
И если есть желание, то могу написать статью про парсеры и компиляторы, если это кому-то нужно.
Синтаксис у TeaCSS прост до безобразия:
[Язык] Блочное_Правило {
// комментарий
/* многострочный комментарий */
@import "another_tea_file.tea";
@ строчка JS
@{ многострочный JS }
[Язык] Правило;
[Язык] Блочное_правило {
// и так далее, сколько угодно уровней вложенности
}
}
Он такой именно потому, что практически любой декларативный язык можно описать как набор вложенных правил, а встроенный JS позволяет добавлять императивные элементы в язык, такие как переменные, условия, циклы и прочее.
Например, чтоб описать LESS-подобный язык для стилей достаточно всего 150 строк кода.
github.com/boomyjee/teacss/blob/master/src/teacss/core.js#L309 [4]
Именно он и являетc языком генерации по умолчанию (Style).
Чтоб переключиться на другой язык достаточно начать селектор с него:
SomeLang {
// правила специфичные для этого языка
}
Второй встроенный язык в teacss – это Script, как несложно догадаться, он служит для сборки скриптов приложения.
Синтаксис у него простой:
Script some_name {
@append "some/script/path.js";
@append {
function bla() { /* … */ } // Some javascript Code
}
}
Т.е. линейные элементы – это просто сторонние скрипты, блочные – просто код, который вы не хотите выделять отдельно. В продакшене все скрипты будут объединены по some_name, т.е. вы можете сгруппировать JS, как вам удобно.
Сама библиотека TeaCSS собирается сама собой, вот ее «мейкфайл»:
github.com/boomyjee/teacss/blob/master/src/build.tea [5]
При таком подходе TeaCSS является заменой библиотек для модульной разработки и экосистемой для сборки фасада веб-приложений.
Он берет на себя то, что делают RequireJS [6] или StealJS [7].
Я привел как пример именно эти 2 библиотеки потому, что AFAIK только они две также поддерживают минификацию и создание продакшен версии скриптов.
Но у них (скорее даже не у самих библиотек, а у самого подхода) есть ряд серьезных недостатков:
Поэтому сразу напрашивается правила сборки выделять в отдельное место (в C разработке — это мейкфайл).
Роль такого мейкфайла и берет на себя teacss.Script.
Подход к использованию тот же самый.
<? if ($applicationMode=="development") ?>
<link tea="scripts.tea">
<script src="teacss.js"></script>
<? else ?>
<script src="production.js">
<? endif ?>
TeaCSS сам по себе – модульная и расширяемая система сборки. Чтоб подключить новый язык на основе базового синтаксиса достаточно добавить импорт с описанием языка.
Например:
@import "some_language_definition.js";
@import "some_tea_file.tea"; // внутри этого файла уже будет доступен новый язык
Про то, как описать новый язык в экосистеме TeaCSS, я напишу отдельную статью. А пока покажу пример такого языка.
TeaCSS может быть использован как система генерации статических сайтов, аналоги – Jekyll [8] и вот списком, много iwantmyname.com/blog/2011/02/list-static-website-generators.html [9]
Синтаксис интуитивно понятный, при этом есть поддержка компиляции в Liquid.
Template layout {
html {
head {
meta[http-equiv="Content-Type"][content="text/html; charset=utf-8"];
title TeaCSS;
}
body {
#header {
.item(url,text) {
% if path == "@{url}" {
a.active[href="@{url}"] @text;
}
% else {
a[href="@{url}"] @text;
}
}
div {
.item('index.htm','Intro');
.item('canvas.htm','Canvas');
a[href="download.htm"][target="_blank"] Download;
}
}
#content {
% block content {}
}
}
}
}
Это, используется, например, чтоб сгенерировать сайт teacss.org [10].
Вот репозиторий в котором лежит сам сайт и его генератор — github.com/boomyjee/teacss-docs [11]
И более развернутый пример — github.com/boomyjee/teacss-docs/blob/master/build/templates/pages/index.tea [12]
В качестве вспомогательного языка используются конструкции вроде
Highlight xml {
<link tea="style.tea">
<script src="teacss.js"></script>
}
Которые дают на выходе html для подсвеченного кода.
Я сделал небольшой плейграунд, чтоб вы могли подробнее посмотреть, как работает генерация html – teacss.org/template.htm [13]
[13]
TeaCSS – это мета-DSL декларативного толка, который изначально был придуман для облегчения разработки и сборки веб-приложений, но по сути является универсальным генератором контента на декларативной основе используя в качестве дружественного языка браузерный JS.
Это означает, что для запуска и работы не нужно ничего, кроме браузера, чтоб открывает возможность создавать интерактивный процесс разработки прямо в браузере.
Про это я расскажу в одной из следующих статей.
Напомню, что я решил написать эту статью т.к. по сути делаю вещи очень похожие одновременно на последний проект Adobe — Brackets и на кикстартеровский Light-table. Но есть несколько отличий и мне кажется, что они могут быть ключевыми, чтоб рассказать про них, нужно начать с библиотеки, которая лежит в основе проекта — teacss. Надеюсь найти на хабре единомышленников и помощников/партнеров этот самый большой проект.
Автор: boomyjee
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/10487
Ссылки в тексте:
[1] вводной статьи: http://habrahabr.ru/post/146745/
[2] PEG.js: http://pegjs.majda.cz/
[3] Jison: http://zaach.github.com/jison/
[4] github.com/boomyjee/teacss/blob/master/src/teacss/core.js#L309: https://github.com/boomyjee/teacss/blob/master/src/teacss/core.js#L309
[5] github.com/boomyjee/teacss/blob/master/src/build.tea: https://github.com/boomyjee/teacss/blob/master/src/build.tea
[6] RequireJS: http://requirejs.org/
[7] StealJS: http://javascriptmvc.com/docs.html#!steal.build
[8] Jekyll: http://jekyllrb.com/
[9] iwantmyname.com/blog/2011/02/list-static-website-generators.html: http://iwantmyname.com/blog/2011/02/list-static-website-generators.html
[10] teacss.org: http://teacss.org
[11] github.com/boomyjee/teacss-docs: http://github.com/boomyjee/teacss-docs
[12] github.com/boomyjee/teacss-docs/blob/master/build/templates/pages/index.tea: http://github.com/boomyjee/teacss-docs/blob/master/build/templates/pages/index.tea
[13] teacss.org/template.htm: http://teacss.org/template.htm
Нажмите здесь для печати.