Я поддерживаю (PHP) веб-приложение, которое состоит из ядра приложения и нескольких плагинов, которые можно добавить в ядро. Каждый экземпляр приложения может иметь собственный набор плагинов, в зависимости от назначения экземпляра. Ядро приложения и плагины разрабатываются в своих соответствующих репозиториях.
Если плагин установлен, он внедряет свой JavaScript в шаблоны внешнего интерфейса. Это может выглядеть следующим образом:
<script src="core.min.js"></script>
<script src="plugin-1.min.js"></script>
<script src="plugin-2.min.js"></script>
Порядок важен, потому что плагин может использовать ресурсы ядра или другой плагин, который был добавлен ранее. В настоящее время это совместное использование ресурсов реализовано в виде единой переменной в глобальной области, которая собирает ресурсы, которые «экспортируются» ядром и плагинами. В плагине к ресурсу можно получить доступ и использовать его через эту глобальную переменную:
var resource = myapp.core.resource;
Теперь на мой вопрос: Есть ли способ реализовать архитектуру ядра / плагина, описанную выше, с помощью модулей ES6 (с помощью Webpack или чего-то подобного)? Я хотел бы использовать более современный способ разработки JavaScript или даже использовать TypeScript, но я не знаю, можно ли это сделать или как это сделать. Я понимаю, что возможно было бы импортировать некоторые ресурсы из основного JavaScript в плагине, но не будет ли это также скомпилировано в файл JavaScript плагина? Это дублирует код.
Пояснение:
Базовое приложение и плагины разрабатываются в отдельных репозиториях, например как это:
core/src/main.js
plugin-1/src/main.js
plugin-2/src/main.js
Код для каждого хранилища встроен в пакет PHP. Конечный экземпляр приложения состоит из ядра приложения и нескольких плагинов, которые устанавливаются как пакеты PHP. JavaScript не перестраивается при установке пакета PHP.
Я мог бы импортировать некоторые ресурсы из ядра приложения в виде плагина, например:
import {resource} from '../../../core/src/main'
Однако это дублирует код ядра приложения, поскольку ядро и плагин создаются отдельно.
Я спрашиваю, возможно ли создать конфигурацию сборки, которая «знает» об общих переменных между ядром и плагинами. Например, если я определю класс Main
в ядре, он может быть встроен в глобальную переменную myapp.core.Main
. Если я затем импортирую Main
в один из плагинов, вместо него может быть решено использовать переменную myapp.core.Main
. Вот как работает текущая реализация, но все это определяется вручную. Возможно, есть более разумный путь с современными инструментами сборки, такими как Webpack.