Обновление от 24.05.2008: У нас сейчас +3 версии Angular из моего исходного поста, и у нас до сих пор нет окончательного работоспособного решения. Ларс Мейдам (@LarsMeijdam) предложил интересный подход, который, безусловно, стоит посмотреть. (Из-за проблем с собственностью ему пришлось временно удалить репозиторий GitHub, в котором он изначально разместил свой образец. Однако вы можете написать ему напрямую, если хотите получить копию. Дополнительные сведения см. В комментариях ниже.)
Недавние архитектурные изменения в Angular 6 действительно приближают нас к решению. Кроме того, Angular Elements ( https://angular.io/guide/elements ) предоставляет некоторые функциональные возможности компонента - хотя и не совсем то, что я первоначально описал в этом посте.
Если кто-то из удивительной команды Angular случайно сталкивался с этим, обратите внимание, что, похоже, есть много других людей, которые также очень заинтересованы в этой функциональности. Возможно, стоит подумать об отставании.
Я хотел бы реализовать подключаемые (плагин) рамки в качестве Angular 2
, Angular 4
, Angular 5
или Angular 6
приложении.
(Мой конкретный вариант использования для разработки этой подключаемой инфраструктуры заключается в том, что мне нужно разработать миниатюрную систему управления контентом. По ряду причин, которые не обязательно подробно описаны здесь, Angular 2/4/5/6
она почти идеально подходит для большинства потребностей этой системы.)
Под подключаемой структурой (или подключаемой архитектурой) я конкретно имею в виду систему, которая позволяет сторонним разработчикам создавать или расширять функциональность основного приложения за счет использования подключаемых компонентов, не имея прямого доступа или знания исходного кода основного приложения. или внутренняя работа .
(Эта формулировка о том, что « не имея прямого доступа к исходному коду или внутренним принципам работы или знания этих программ », является основной целью.)
Примеры подключаемых платформ включают в себя общие системы управления контентом, такие как WordPress
или Drupal
.
Идеальная ситуация (как и в случае с Drupal) - это просто иметь возможность поместить эти подключаемые компоненты (или подключаемые модули) в папку, чтобы приложение автоматически обнаруживало или обнаруживало их, и они просто волшебным образом «работали». Если бы это происходило каким-то образом с возможностью «горячей» замены, то есть во время работы приложения было бы оптимальным.
В настоящее время я пытаюсь определить ответы ( с вашей помощью ) на следующие пять вопросов.
- Практичность: действительно ли плагин-фреймворк для
Angular 2/4/5/6
приложения практичен? (До сих пор я не нашел практического способа создать действительно подключаемый фреймворк сAngular2/4/5/6
.) - Ожидаемые проблемы: с какими проблемами можно столкнуться при реализации инфраструктуры плагинов для
Angular 2/4/5/6
приложения? - Стратегии реализации: Какие конкретные методы или стратегии могут быть использованы для реализации инфраструктуры плагинов для
Angular 2/4/5/6
приложения? - Рекомендации: каковы рекомендации по внедрению системы плагинов для
Angular 2/4/5/6
приложения? - Альтернативные технологии: если плагинная структура не
Angular 2/4/5/6
применима в приложении, какие относительно эквивалентные технологии (напримерReact
) могут подойти для современного высокореактивного веб-приложения ?
В общем, использование Angular 2/4/5/6
очень желательно, потому что:
- это естественно очень быстро - чертовски так.
- он потребляет очень небольшую пропускную способность (после начальной загрузки)
- он имеет относительно небольшой след (после
AOT
иtree shaking
) - и этот след продолжает сокращаться - это очень функциональный, и команда и сообщество Angular продолжают быстрый рост своей экосистемы
- он хорошо сочетается со многими лучшими и новейшими веб-технологиями, такими как
TypeScript
иObservables
- Angular 5 теперь поддерживает сервисных работников ( https://medium.com/@webmaxru/a-new-angular-service-worker-creating-automatic-progressive-web-apps-part-1-theory-37d7d7647cc7 )
- опираясь на него
Google
, он, вероятно, будет поддерживаться и улучшаться в будущем
Я бы очень хотел использовать Angular 2/4/5/6
для своего текущего проекта. Если я смогу использовать Angular 2/4/5/6
, я также буду использовать Angular-CLI
и, вероятно, Angular Universal
(для рендеринга на стороне сервера).
Вот мои мысли, что касается вопросов выше. Пожалуйста, просмотрите и поделитесь своим мнением и мнением.
Angular 2/4/5/6
приложения используют пакеты, но это не обязательно то же самое, что разрешать плагины в приложении. Плагин в других системах (напримерDrupal
) может быть по существу добавлен путем перетаскивания папки плагина в общий каталог модулей, где он автоматически "подбирается" системой. ВAngular 2/4/5/6
пакет (как и плагин) обычно устанавливается черезnpm
, добавляется вpackage.json
, а затем вручную импортируется в приложение - как вapp.module
. Это намного сложнее, чемDrupal
метод удаления папки и автоматического обнаружения системой пакета. Чем сложнее установить плагин, тем менее вероятно, что люди будут его использовать. Было бы намного лучше, если бы был способAngular 2/4/5/6
автоматически обнаруживать и устанавливать плагины. Мне очень интересно найти метод, который позволит людям, не являющимся разработчиками, устанавливатьAngular 2/4/5/6
приложение и устанавливать любые выбранные плагины без необходимости понимать всю архитектуру приложения.Как правило, одним из преимуществ предоставления подключаемой архитектуры является то, что сторонним разработчикам очень легко расширить функциональные возможности системы. Очевидно, что эти разработчики не будут знакомы со всеми тонкостями кода для приложения, к которому они подключаются. Как только плагины разработаны, другие, даже менее технические пользователи могут просто установить приложение и любые выбранные плагины. Однако
Angular 2/4/5/6
это относительно сложно и требует очень длительного обучения. Чтобы еще более усложнить вещи, большинство производственныхAngular 2/4/5/6
приложений также используютAngular-CLI
,Angular Universal
иWebPack
. Кто-то, кто реализует плагин, вероятно, должен был бы иметь хотя бы некоторые базовые знания о том, как все они сочетаются друг с другом - наряду с сильным рабочим знаниемTypeScript
и разумное знакомство сNodeJS
. Являются ли требования к знаниям настолько экстремальными, что ни одна третья сторона никогда не захочет разработать плагин?Большинство плагинов, вероятно, будут иметь некоторый компонент на стороне сервера (например, для хранения / извлечения данных, связанных с плагином), а также некоторые выходные данные на стороне клиента.
Angular 2/4/5
в частности (и строго) отговаривает разработчиков внедрять свои собственные шаблоны во время выполнения - так как это создает серьезную угрозу безопасности. Чтобы обрабатывать многие типы вывода, которые может поддерживать плагин (например, отображение графика), кажется, что, вероятно, необходимо разрешить пользователям создавать контент, который вводится в поток ответов в одной форме в другой. Интересно, как можно было бы удовлетворить эту потребность без изобразительного уничтоженияAngular 2/4/5/6
механизмов безопасности.Большинство производственных
Angular 2/4/5/6
приложений предварительно скомпилированы с использованиемAhead of Time
(AOT
) компиляции. (Вероятно, все должно быть.) Я не уверен, как плагины могут быть добавлены (или интегрированы) в предварительно скомпилированные приложения. Лучший сценарий - компиляция плагинов отдельно от основного приложения. Однако я не уверен, как это сделать. Резервным вариантом может быть повторная компиляция всего приложения с любыми включенными плагинами, но это немного усложняет ситуацию для пользователя с правами администратора, который просто хочет установить приложение (на своем собственном сервере) вместе с любыми выбранными плагинами.В
Angular 2/4/5/6
приложении, особенно предварительно скомпилированном, один фрагмент ошибочного или конфликтующего кода может нарушить работу всего приложения.Angular 2/4/5/6
приложения не всегда легче всего отлаживать. Применение некорректных плагинов может привести к очень неприятным результатам. В настоящее время я не знаю о механизме корректной обработки некорректных плагинов.