azproduction / lmd

LMD - JavaScript Module-Assembler for building better web applications :warning: Project is no longer supported :warning:
http://azproduction.ru/lmd/
MIT License
449 stars 27 forks source link

How to use modules from exernal LMD package? #158

Closed generalov closed 10 years ago

generalov commented 10 years ago

Есть сторонний проект, с модулями Editor и css. Он отдается нам в виде LMD пакета package.lmd.js Как подключить такую штуку в сборку нашего .lmd бандла? Пробую:

"modules" : {
    "Editor": {
        "path": "bower_components/Editor/package.lmd.js",
    },
}

пишет info: Building main (.lmd/main.lmd.js(on)) warn: Some of your modules are undeclared (register them as "name": "@shortcut" or use directly if they are globals): warn: - main warn: - css

azproduction commented 10 years ago

Если подключать модули в таком виде bower_components/Editor/package.lmd.js те собранный бандл запихивать в бандл, то тем, что лежит в package.lmd.js нельзя будет воспользоваться. LMD просканировал package.lmd.js, нашел там require('css') и подумал, что этот модуль css кем-то используется, но не задекларирован в текущем бандле.

Лучше из стороннего проекта (bower_components/Editor) получить lmd.json (читай кусок файловой системы замапанной в имена модулей) и его уже смешать с основным бандлом.

{
    "mixins": ["bower_components/Editor/.lmd/package.lmd.json"],
    "modules": {}
}

Прим: https://github.com/azproduction/lmd/tree/master/examples/features/mixins (миксины можно определять во время сборки или пописывать в конфиге). Тут может быть проблема с конфликтами имен модулей... к сожалению, сейчас lmd не умеет неймспейсы, но можно научить.

azproduction commented 10 years ago

проблема с конфликтами имен модулей...

Эта проблема будет заключаться в том, что конфликтные модули из package.lmd.json перекроют существующие. Ты это увидишь в lmd info.

generalov commented 10 years ago

спасибо. так и сделаем. с общим пространством имен проблем нет - модулям можно давать уникальные имена. некоторое смущение вызывает тот факт, что lmd может подключать любые сборки, кроме своих собственных.

azproduction commented 10 years ago

lmd может подключать любые сборки, кроме своих собственных

миксы это что-то вроде подключения куска файловой системы к существующей (как mount(8)), если добавить прозрачные неймспейсы, то будет еще более похоже

jeron-diovis commented 10 years ago

А как насчёт того, чтобы расшаривать модули между пакетами уже в браузере? Чтобы можно было подключить на страницу несколько разных package.lmd.js, где у каждого может быть своё внутренне устройство и правила загрузки, но загруженные модули сохранялись бы в общий пул? Наподобие того, как сделано здесь: https://github.com/brunch/commonjs-require-definition/blob/master/require.js

Это было бы удобно с точки зрения деления приложения на части с последующим их кешированием браузером - скажем, отдельно изменчивый основной код, отдельно пачка шаблонов, отдельно сторонние бибилиотеки, которые не меняются вообще.

Сейчас подобного можно худо-бедно добиться с помощью бандлов, но думется, это скорее хак - т.к. по определению бандлы это опционально подгружаемые библиотеки. К тому же понадобятся дополнительные обвязки в коде. Просто добавить пару script на страницу было бы удобнее. И нагляднее.

Возможно ли реализовать такой функционал?

azproduction commented 10 years ago

кешированием браузером

Кэш - это миф. Он работает только для текущей сессии. Я специально замерял. У меня был кэш 50мб год назад он вымывался за 30 минут браузинга. Сегодня у меня 200Мб и они вымываются за 1 час. Просто каждый хитрый сайтодел кэширует все свое добро в том числе картинки :)

Я считаю, что нужно учитывать эту особенность и загружать 1 пак на приложение или разные паки скриптов если приложение много страничное.

с помощью бандлов

У бандлов совершенно другая задача - загрузка по требованию редко используемых страниц приложений(или попапов).

Подумай надо ли тебе это? :) Написать можно, но это будет деоптимизация (загрузка 2-3 дополнительных скриптов).

jeron-diovis commented 10 years ago

Что ж, с такой позиции, похоже, что действительно оно того не стоит) Спасибо за пример.

Тогда логическое деление приложения на крупные составляющие (чтобы не городить мега-конфиг для всего) должно реализовываться посредством миксинов (или depends, пока точно не понял, кто для чего служит) и присутствовать только на уровне сборки, но не браузера.

azproduction commented 10 years ago

Разница в том, что extend может перекрыть все поля, а mixin только безопасные (чтобы случайно нельзя было поменять output, например).

jeron-diovis commented 10 years ago

А список опасных/безопасных где-то есть? Или какое-то простое правило?

azproduction commented 10 years ago

Не безопасные все пути вывода файлов(output, styles_output, sourcemap), имя и описание модуля, root. Модули, плагины, флаги, стили, бандлы - все применяется.