derbyparty/derby-faq

Загрузка компонентов в библиотеку

Closed this issue · 3 comments

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

Здесь видно, как Натан вручную прописел каждый компонент. Мне бы хотелось сделать что-то типа:

icons.forEach(function(icon) {
    app.component(require( "./icons/" + icon));
});

На сервере это работает, а на клиенте дает ошибку Error: Cannot find module './icons/air'.

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

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

Единственный workaround, который мне приходит в голову, это на серваке в эвент-хэндлере создания бандла expose'ить через browserify.require() нужные файлы, зафорсив таким образом их попадание в бандл.
Так, если модуль называется my-icons, то выглядеть это будет примерно так:

# icons.coffee
module.exports = ['home', 'back', 'forward']

# server/index.coffee
store.on 'bundle', (b) ->  
  require('../icons').forEach (icon) ->
    b.require 'my-icons/' + icon

# app/index.coffee
require('../icons').forEach (icon) ->
  app.component require 'my-icons/' + icon

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

Думаю я объеденю ветки и сделаю в итоге возможными оба подхода и спрайт и свг в коде. Обычно в проекте иконок с деяток не более, нет резона грузить все 250 в спрайт. А для экспериментов же спрайт удобен.