Angular 11 と Webpack 5 を使用して新しいプロジェクトに取り組んでいます。Angular CLI を使用する Manfred Steyer のモジュール フェデレーション プラグイン サンプルリポジトリに基づいて作業しています。2 つのアプリ間で共有ローカル Angular ライブラリからシングルトン サービスを共有する方法がわかりません。
私のセットアップを説明するために最善を尽くします..これがどれくらい長くなるかについて本当に申し訳ありません.
簡素化されたファイル構造
root
package.json
projects/
shell/
src/app/
app.module.ts
app.component.ts
webpack.config.ts <-- partial config
mfe1/
src/app/
app.module.ts
app.component.ts
webpack.config.ts <-- partial config
shared/
src/lib/
global.service.ts
package.json <-- package.json for lib
角度
両方の app.component.ts ファイルは同一です
import {GlobalService} from 'shared';
@Component({
selector: 'app-root',
templateUrl: './app.component.html'
})
export class AppComponent {
constructor(shared: SharedService) {}
}
global.service.ts
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class GlobalService {
constructor() {
console.log('constructed SharedService');
}
}
ウェブパック
shell/webpack.config.ts
const ModuleFederationPlugin = require("webpack/lib/container/ModuleFederationPlugin");
module.exports = {
output: {
publicPath: "http://localhost:5000/",
uniqueName: "shell"
},
optimization: {
// Only needed to bypass a temporary bug
runtimeChunk: false
},
plugins: [
new ModuleFederationPlugin({
remotes: {
'mfe1': "mfe1@http://localhost:3000/remoteEntry.js"
},
shared: ["@angular/core", "@angular/common", "@angular/router"]
})
],
};
mfe1/webpack.config.ts
const ModuleFederationPlugin = require("webpack/lib/container/ModuleFederationPlugin");
module.exports = {
output: {
publicPath: "http://localhost:3000/",
uniqueName: "mfe1"
},
optimization: {
// Only needed to bypass a temporary bug
runtimeChunk: false
},
plugins: [
new ModuleFederationPlugin({
// For remotes (please adjust)
name: "mfe1",
library: {type: "var", name: "mfe1"},
filename: "remoteEntry.js",
exposes: {
'./Module': './projects/mfe1/src/app/app.module.ts',
},
shared: ["@angular/core", "@angular/common", "@angular/router"]
})
],
};
共有ライブラリ package.json
{
"name": "shared",
"version": "0.0.1",
"main": "src/public-api.ts",
"peerDependencies": {
"@angular/common": "^11.0.0-next.5",
"@angular/core": "^11.0.0-next.5"
},
"dependencies": {
"tslib": "^2.0.0"
}
}
この構成はコンパイルおよび実行されますがmfe1
、新しいGlobalService
. アプリの読み込み時に「構築された SharedService」が記録され、リモート モジュールが読み込まれるとすぐに記録されます。ScriptedAlchemy による別の例に従おうとしましたが、それを機能させる方法がわかりません。コンパイルして実行し、2 つのインスタンスを作成するか、構成をどのように台無しにするかに応じて、不足しているモジュールを引用してコンパイルに失敗します。
shared
ScriptedAlchemy の例では、ファイル内のライブラリ配列で共有ライブラリを参照する必要があるように見えwebpack.config.ts
ます。これは完全に理にかなっていますが、機能させることができません
shell/webpack.config.ts and mfe1/webpack.config.ts
...
shared: ["@angular/core", "@angular/common", "@angular/router", "shared"]
この方法でローカル ライブラリを参照すると、必然的にビルド中にエラーが発生します。
Error: Module not found: Error: Can't resolve 'shared' in '/Path/to/module-federation-plugin-example/projects/shell/src/app'
私が投稿した例は単純化されています。あまりそうでないことを願っていますが、ここに問題を示すレポへのリンクがあります