RequireJS: загрузка модулей, включая шаблоны и CSS

После экспериментов с AMD/RequireJS мне стало интересно, стоит ли загружать модули пользовательского интерфейса, включая шаблоны и CSS, чтобы они были полностью независимы от веб-страницы.

Звучит неплохо, но я не видел, чтобы это было реализовано в дикой природе, так что могут быть подводные камни.

Подумайте о каком-нибудь модуле пользовательского интерфейса со следующей структурой:

myWidget
    |--img 
    |--main.js
    |--styles.css
    +--template.tpl

Все материалы в одной папке. Выглядит очень красиво.

Модуль в main.js будет выглядеть примерно так:

define(["TemplateEngine", "text!myWidget/template.tpl"], function(TemplateEngine, template) {

    // Load CSS (Pseudo Code)
    var cssUrl = "myWidget/styles.css";
    appendToHead(cssUrl);

    return function() {
        return {
            render: function(data) {
                  return TemplateEngine.toHtml(template, data);
            } 
        }
    }
});

Вопросы теперь:

  1. Я что-то пропустил?
  2. Существуют ли какие-либо плагины/концепции, как добиться этого «стандартным» способом?
  3. Может ли оптимизатор RequireJS обрабатывать часть CSS здесь, скажем, объединять/минимизировать таблицы стилей, как это делается с частями JS?
  4. Есть мнения по этому поводу? Хорошо или плохо?

person fbrandel    schedule 27.10.2011    source источник
comment
я делаю это для шаблонов, и он отлично работает. Единственная проблема, с которой я столкнулся, была с CSS, где я не мог заставить работать оптимизацию. Это дало бы мне загадочную ошибку, и у меня не было времени ее решить. В настоящее время он находится в моем списке вещей, которые нужно попытаться решить, поэтому я буду следить за вашим вопросом, чтобы узнать, есть ли у кого-то решение.   -  person timDunham    schedule 27.10.2011


Ответы (2)


Вы можете указать шаблон как зависимость, используя текст! модуль, как вы показали. Я делаю это с помощью шаблонов усов.

Однако Require.js явно не поддерживает файлы css.

Вот официальное объяснение, оно довольно хорошо объяснено: http://requirejs.org/docs/faq-advanced.html#css

Редактировать: февраль 2012.

Такие шаблоны, как handlebars, также могут быть предварительно скомпилированы и включены, как и любой другой модуль JS http://handlebarsjs.com/precompilation.html.

Редактировать: август 2015 г.

Если вам нужна такая модульность, вам следует изучить webpack и, в частности, css-загрузчик. Я использую его для соединения файлов .css с файлами .jsx в качестве единого «модуля» и извлечения соответствующего CSS в единую таблицу стилей во время сборки.

person Chris Biscardi    schedule 02.11.2011
comment
Как правильно работать с CSS? - person hugomg; 02.11.2011
comment
AFAIK нет правильного пути. ваши варианты: 1) традиционный тег ссылки 2) динамическое включение таблицы стилей с использованием javascript. Если ваш javascript зависит от вашего css, и вы хотите динамически загружать его, вам нужно будет создать функцию для проверки существования атрибута из загруженного класса css до запуска вашего виджета javascript. - person Chris Biscardi; 02.11.2011
comment
вы также можете загрузить css через текст! модуль и разобрать его, хотя я никогда этого не делал. - person Chris Biscardi; 02.11.2011
comment
Да, я знаю, что есть много альтернатив. Меня все еще немного огорчает, что у нас есть стандартная система для модулей JS, но когда дело доходит до CSS, мы возвращаемся на дикий запад. - person hugomg; 02.11.2011
comment
Вы можете использовать yesnope.js для загрузки файлов css через функцию injectCSS. - person Saleh; 13.12.2012
comment
Наверное, я не понимаю, почему CSS не может быть загружен текстом! плагин? Разве CSS не просто текст utf8? - person Alexander Mills; 16.08.2015

Существует сторонний плагин CSS для RequireJS, который работает хорошо: https://github.com/VIISON/RequireCSS/.

person Chad Johnson    schedule 22.09.2012
comment
Несмотря на то, что плагин очень старый, он отлично работает до сих пор в 2015 году. - person budhajeewa; 05.05.2015
comment
лучше используйте этот, который поддерживает оптимизатор r.js github.com/guybedford/require-css/ вопросы - person Offirmo; 06.07.2015