2018年5月24日更新:元の投稿から+3バージョンのAngularになりましたが、まだ実行可能な最終的なソリューションはありません。Lars Meijdam(@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と同様に)理想的な状況は、これらのプラグイン可能なコンポーネント(またはプラグイン)をフォルダーに簡単に配置し、アプリケーションにそれらを自動検出または検出させ、魔法のように「機能」させることです。これをある種のホットプラグ可能な方法で、つまりアプリの実行中に行うのが最適です。
私は現在、次の5つの質問に対する回答を(あなたの助けを借りて)決定しようとしています。
- 実用性:Angular 2/4/5/6アプリケーションのプラグインフレームワークは実用的ですか?(これまで、を使用して真にプラグイン可能なフレームワークを作成する実用的な方法はありませんでしたAngular2/4/5/6。)
- 予想される課題:Angular 2/4/5/6アプリケーションのプラグインフレームワークの実装で遭遇する可能性のある課題は何ですか?
- 実装戦略:Angular 2/4/5/6アプリケーションのプラグインフレームワークを実装するために使用できる特定の技術または戦略は何ですか?
- ベストプラクティス:Angular 2/4/5/6アプリケーションのプラグインシステムを実装するためのベストプラクティスは何ですか?
- 代替技術: プラグインフレームワークがアプリケーションで実用的でない場合、どのような比較的同等の技術(例)が、最新の非常に反応性の高いWebアプリケーションに適しているでしょうか?Angular 2/4/5/6React
一般に、次のAngular 2/4/5/6理由により、の使用は非常に望ましいです。
- 当然のことながら、非常に高速です。
- 帯域幅をほとんど消費しません(初期ロード後)
- フットプリントが比較的小さい(後AOTとtree shaking)-そしてそのフットプリントは縮小し続けています
- それは非常に機能的であり、Angularチームとコミュニティはそのエコシステムの急速な成長を続けています
- それは、次のような最高の、最新のWeb技術の多くとよく果たしている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-CLIAngular 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アプリケーションをインストールし、アプリケーションのアーキテクチャをすべて理解する必要なく、選択したプラグインをインストールできる方法を見つけることに非常に興味があります。
- 一般に、プラグ可能なアーキテクチャを提供する利点の1つは、サードパーティの開発者がシステムの機能を拡張することが非常に簡単なことです。明らかに、これらの開発者は、プラグインしているアプリケーションのコードの複雑さのすべてに精通しているわけではありません。プラグインが開発されると、それほど技術的でないユーザーでも、アプリケーションと選択したプラグインをインストールできます。ただし、 - 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アプリケーション、特に事前にコンパイルされたアプリケーションでは、1つの誤ったコードまたは競合するコードがアプリケーション全体を破壊する可能性があります。- Angular 2/4/5/6アプリケーションは常に最も簡単にデバッグできるとは限りません。不適切な動作をするプラグインを適用すると、非常に不愉快な体験になる可能性があります。私は現在、不正なプラグインを適切に処理するメカニズムを認識していません。