Отдельные сборки ClojureScript для многостраничных веб-приложений

У меня есть веб-приложение, которое использует Clojure на бэкэнде и ClojureScript на внешнем интерфейсе, и оно состоит из нескольких страниц, каждая из которых требует соответствующего встроенного файла js.

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

Проблема в том: теперь мне нужно продублировать некоторый общий код в каждой папке для правильной сборки. Кроме того, очень раздражает, что мне приходится создавать целую новую папку даже для тривиального файла cljs, не говоря уже о редактировании каждый раз раздела :builds моего проекта.clj.

Итак, на дворе 2016 год, и все руководства по ClojureScript, которые я видел до сих пор, предназначены для одностраничных приложений. Есть ли какие-либо ресурсы или лучшие практики для того, что я ищу, я что-то упускаю?

Как использовать ClojureScript в стандартном многостраничном веб-приложении с стеком Clojure?

Спасибо.


person Twice_Twice    schedule 01.06.2016    source источник


Ответы (3)


Параметр :modules компилятора можно использовать для разделения сборки clojurescript на оптимизированные модули, которые можно требуется по требованию.

person Terje Norderhaug    schedule 08.06.2016
comment
Этот выглядит как то, что мне нужно. Спасибо, я проверю! - person Twice_Twice; 08.06.2016

Вам действительно нужно несколько сборок cljs?

Разве вы не можете просто создать один, export добавляя нужные вам компоненты и подключая их к dom всякий раз, когда они нужны?

person kongeor    schedule 01.06.2016
comment
Я предполагаю, что в вашем случае мне нужно включить один встроенный файл js на каждую страницу? - person Twice_Twice; 01.06.2016
comment
да. Почему бы и нет? Вы можете организовать свой код с помощью пространств имен. - person kongeor; 01.06.2016
comment
Можно подробнее, может код показать, ссылки? Дело в том, что я впервые имею дело с самой библиотекой Google Closure, может быть, проблема в этом. Любые примеры приветствуются. - person Twice_Twice; 02.06.2016

Это может быть так же просто, как использовать require из одного пространства имен в другое.

Например, скажем, что у вас есть следующая структура:

project ├── src │   └── cljs │   ├── page1 │   ├── page2 │   │  

Вы можете require вещи из пространства имен page1.subnamespace изнутри page2.

person nha    schedule 03.06.2016
comment
Да, это у меня есть, но как я могу включить функции из сборки, которые нужны только на конкретной html-странице? Должен ли я включать всю скомпилированную вещь js (которая может быть >x МБ) на каждой отдельной странице, даже если мне нужна небольшая часть кодовой базы cljs в ней? - person Twice_Twice; 04.06.2016
comment
Насколько я знаю, нет способа разделить сборку на части, поскольку компилятор закрытия Google предполагает, что каждый раз обрабатывает весь контент (и поэтому устраняет мертвый код). - person nha; 05.06.2016
comment
Итак, лучше всего создать один файл js, включить его на каждую страницу, а затем вызывать из него только те вещи, которые необходимы на этой странице? - person Twice_Twice; 06.06.2016
comment
Я не знаю о лучшей практике. Это может быть компромиссом (более медленная первая загрузка, более быстрая в следующий раз из-за кэширования), который приближает вас к SPA. Или вы также можете рассмотреть возможность создания сборки для каждой страницы, зная, что будет некоторая избыточность, но начальная загрузка страницы будет быстрее и что не будет ненужного кода (из-за устранения мертвого кода закрытия Google). - person nha; 06.06.2016
comment
Что касается вашего предыдущего комментария: вся скомпилированная вещь js (которая может быть › x МБ) на каждой отдельной странице, даже если мне нужна небольшая часть кодовой базы cljs, этого не должно происходить, поскольку компилятор закрытия устраняет мертвый код. - person nha; 07.06.2016