2017-08-31 8 views
0

モジュールを動的にロードするモジュールを作成しようとしています(ルータのように)。現在私は開発環境でこれを行うことができますが、プロダクションでプロジェクトを構築することはできませんでした。私は、問題を絞り込んと私はこのように私のモジュールのプロバイダにANALYZE_FOR_ENTRY_COMPONENTSを追加することで、ルータのprovideRoutes機能を模倣しようとしたところ、問題がどこかであることが判明: providers: [ { provide: ANALYZE_FOR_ENTRY_COMPONENTS, useValue: dynamicModules, multi: true }, { provide: DYNAMIC_MODULE_PATHS, useValue: dynamicModules }, { provide: NgModuleFactoryLoader, useClass: SystemJsNgModuleLoader }, ModuleLoaderService ]ANALYZE_FOR_ENTRY_COMPONENTSがモジュールを動的にロードするために本番環境で動作していません

しかし、私はこのエラーを得続ける: エラー:することはできません'DynamicModule' in '../dynamic/dynamic.module'を見つけてください

絶対パスまたは相対パスを使用するかどうかは関係ありません。

奇妙な部分は、私がプロバイダを持っている場所にファイルを再保存するとngのサービスを提供し、うまく動作します。

ルータのソースから見ると、これはうまくいくはずですが、何か不足している可能性があります。

私はこれを長い間無視していましたが、現在は生産用にビルドしようとするとエラーが発生します。

サンプルプロジェクトでは、ここで見つけることができます: Sample

それはコンソールにメッセージをログに記録します。

TL; DR;

私は@angular/routerから任意の機能を使用せずにdynamiclyモジュールをロードしようとしていますので、私はANALYZE_FOR_ENTRY_COMPONENTSを使用していますが、私は、このランタイムエラーを得続ける:Cannot find module 'SomeModule' in 'path/to/some.module'を。エラーが表示されるのは、最初にng serveを実行したときにローダー部分を再保存すると表示され、消えてすべて正常に機能します。

答えて

0

さて、誰も私を助けなかったので、私はこの問題に再び遭遇し、私の問題の理由と解決策を見つけました。

TL; DR:

provide: [ 
    ... 
    { provide: ROUTES, useValue: yourDynamicModuleRoutesArray, multi: true }, 
    ... 
] 

をそして、あなたがロードしたい場合は、あなただけのSystemJsNgModuleLoader(またはそれ以上の抽象化を使用することができます。 あなたはモジュールをロードしたい場合は、あなたがこのようなあなたのモジュールパスを提供しなければならないdynamicly NgModuleFactoryLoader)を使用して、パスで指定されたモジュールをロードします。

下記の私の懸念事項と詳細な説明を読むことができます。

@angular/routerからROUTES注入トークンを提供する必要があります。コンパイラがモジュールパスを見つけることができ、webpackのパスのマップを作成することができます。しかし、私はそれが本当に角の側から良い解決策ではないと思います。このように、あなたはloadChildrensをルートとして提供する必要があります。これらのモジュールがルートに関係していない場合は、何も一致しないルートを作成する必要がありますが、ルータ設定に含まれます。同じInjectionTokenを使用します。私の場合、私はrouterConfigにこれらのloadChildrensが存在することを望んでいませんでした。そのため、カスタムModuleLoaderを自分で作成しましたが、loadChildrenをルータに追加することは避けられません。

You can also see my answer here

関連する問題