Есть ли сейчас "компиляторы" с базой плагинов, которые специализируются на трансформировании кода nodejs? Из вариантов нашел babel - но не уверен что это задача этой библиотеки. Из плагинов нужны typescript, обфускатор, абсолютной путь в импортах... Список может пополняться
babel это и есть "компилятор" для js. с плагинами и прочим. Не уверены - почитайте документацию чтобы понять это то что вам надо или нет. Можно еще всякие бандлеры взять. webpack, rollup.
Ну или конкретно напишите что за "компилятор" такой вам нужен, что и во что он должен компилировать.
Опишу задачу. Собираю систему модулей. Модули находятся в отдельной директории. При запуске программы ядро инициализирует все модули. Ядро заранее ничего не знает о модулях, ресолв производится в рантайме. Как итог, добавляя новый модуль в директорию ядро должно нормально определить его. Следовательно модули нужно компилировать отдельно от ядра (по бандлу на модуль + бандл ядра). Пытался сконфигурировать webpack и rollup для этой задачи - не смог. Компилировать модули мне нужно для расширения функционала js. Какие вы видите пути решения данной задачи?
UPD:
В принципе babel решает данную проблему. Сомнение возникает лишь потому, что babel позиционируется только как транспилятор es6 -> es5.
это не форум. Пищите комментарии кому-то к ответу либо упоминая в ответе через @, чтобы они видели. Я увидел ваш ответ только потому что захотел зайти в этот вопрос, а уведомлений нет и не было и Кобур даже не вкурсе что вы что-то написали.
А вот теперь Robur вкурсе.
Собираю систему модулей. Модули находятся в отдельной директории. При запуске программы ядро инициализирует все модули. Ядро заранее ничего не знает о модулях, ресолв производится в рантайме.
это все решается на уровне require(). Хоть при запуске, хоть динамически в процессе работы. Хоть "все что там лежит в этой папке". Даже "а не положили ли чего еще в эту папку" каждую минуту в процессе работы ядра.
я не понимаю зачем вам тут вебпак, бабель, какие-то бандлы, что-то от чего-то отдельно компилировать?
задача которую вы описали решается так:
- делаем папку для модулей.
- ядро при запуске читает эту папку, делает require для каждого файла.
- модули имеют какой-то стандартный апи, ядро через это апи инициализирует каждый модуль.
все. Если нужно добавить новый модуль, создаем его в папке для модулей, перезапускаем сервер, ядро подтягивает новый модуль автоматически, инициализирует, модуль запускается в работу.
Ну, можете еще какую-нибудь систему DI взять чтобы свой велосипед не городить, например inversify.
Как итог, добавляя новый модуль в директорию ядро должно нормально определить его. Следовательно модули нужно компилировать отдельно от ядра
Не важно как вы компилируете модули, в рантайме вы подключаете js-файлы, отуда они взялись не имеет значения, они запускаются и работают. Если пишете на TS, компилируете tsc получаете js файлы, их уже загружаете. Если пишете на JS с использованием фич которые ваша версия ноды не поддерживает - используете бабель чтобы перевести код в то что поддерживается. В любом случае - у вас в итоге папка с js файлами, которые грузятся в ноду через require и все.
для nodejs вообще в принципе не надо делать какие-то бандлы. Единственное в чем может быть полезен вебпак в этом случае - это если вы хотите сделать hot reload в процессе разработки. Но там будет много заморочек.
Если честно, впечатление что у вас не очень ясное понимание как оно все устроено, и вы решаете проблему которую наполовину придумали.
Robur, На самом деле сейчас это так и работает через require. Компиляция нужна для расширения возможностей js. Есть вы утверждаете, что задача babel расширять возможности js через плагины, то вопрос можно считать решенным
GreyCat9515, задача babel - это компилировать js в js.
nodejs и то как оно будет работать когда вы все это запустите - к бабелю не имеет отношения.
плагины в бабеле - это не то же самое что "плагины в ядре работающего приложения", общего между ними только слово "плагины".
Если вам надо плагины в вашем приложении (чтобы ядро при запуске могло загружать модули) - делайте это руками или ищите библиотеку которая позволяет добавить функционал плагины в ваш код.
Если под "расширить возможности js" вы подразумеваете предыдущий пункт, то никакие компиляторы, бабели-вебпаки вам не нужны.
Если вы под этим подразумеваете что-то другое - опишите внятно, что именно.
Robur,очень вряд ли что готовые решения существуют, если и да, он потом столкнутся с кучей проблем в которые эти решения и создали т..к не совершенны.
GreyCat9515, я недавно на чистом JS писал простую систему плагинов:
Загрузчик:
Обращается на сервер, сервер отдает что нужно делать и кто это исполняет.
Исполнителем является js-файл лежащий в отдельной папке на веб-сервере, внутри которого находится функция-класс, исполняющая свою логику.
Исполнитель:
Между фабрикой и плагином есть соглашение об общедоступных методах:
fn installPlugin() который возвращается экземпляер класса созданного некой функцией, класс в свою очередь имеет ряд согласованных функций: initPlugin(factoryRef), prepare, do, done, unload.
Что делает сам плагин и где - побоку. Он просто это делает. Соответственно сама фабрика через опять же согласования методов, может передать плагину что-то, настройки или указания.
Естественно загрузчик имеет некий массив где все плагины хранятся и отдельным setInterval гоняет их по кругу на предмет совершения ими каких-то действий.
НО это чистый js, без тайпскриптов, веб-паков и прочего.
acwartz, Есть небольшое отличие в наших задачах. Ваша система плагинов работает в среде браузера, а у меня все исполняется на сервере на ноде.
Вопрос можно считать решенным, всем участникам спасибо за помощь:)