Webpack 5 モジュールのフェデレーション機能を調べていましたが、コードが機能しない理由を理解するのに苦労しています。この考え方は、標準モジュール フェデレーションの例が行うことと非常によく似ています。
app1
- ホストアプリです
app2
- アプリ全体を公開するリモートですapp1
(app1
ヘッダーと水平線をレンダリングし、その下にapp2
レンダリングする必要があります)
との両方が、 との共有、シングルトン、熱心な依存関係として次のようapp1
にapp2
宣言しreact
ます。react-dom
weback.config.js
// app1 webpack.config.js
module.exports = {
entry: path.resolve(SRC_DIR, './index.js');,
...
plugins: [
new ModuleFederationPlugin({
name: "app1",
remotes: {
app2: `app2@//localhost:2002/remoteEntry.js`,
},
shared: { react: { singleton: true, eager: true }, "react-dom": { singleton: true, eager: true } },
}),
...
],
};
// app2 webpack.config.js
module.exports = {
entry: path.resolve(SRC_DIR, './index.js');,
...
plugins: [
new ModuleFederationPlugin({
name: "app2",
library: { type: "var", name: "app2" },
filename: "remoteEntry.js",
exposes: {
"./App": "./src/App",
},
shared: { react: { singleton: true, eager: true }, "react-dom": { singleton: true, eager: true } },
}),
...
],
};
App1 index.js には、次のコードがあります。
import React from "react";
import ReactDOM from "react-dom";
import App from "./App";
ReactDOM.render(<App />, document.getElementById("root"));
App1App.js
コンポーネントは次のとおりです。
import React, { Suspense } from 'react';
const RemoteApp2 = React.lazy(() => import("app2/App"));
export default function App() {
return (
<div>
<h1>App 1</h1>
<p>Below will be some content</p>
<hr/>
<Suspense fallback={'Loading App 2'}>
<RemoteApp2 />
</Suspense>
</div>
);
}
しかし、アプリケーションを起動すると、次のエラーが発生します。
Uncaught Error: Shared module is not available for eager consumption: webpack/sharing/consume/default/react/react?1bb3
at Object.__webpack_modules__.<computed> (consumes:133)
at __webpack_require__ (bootstrap:21)
at fn (hot module replacement:61)
at Module../src/index.js (main.bundle.a8d89941f5dd9a37d429.js:239)
at __webpack_require__ (bootstrap:21)
at startup:4
at startup:6
index.js
tobootstrap.js
と inからすべてを抽出するとうまくindex.js
いきます
import('./bootstrap');
すべてがうまく機能します。
これは、作成者からの公式ドキュメントとブログ投稿が、どちらの方法でも実行できるか、bootstrap.js
依存関係を熱心なものとして宣言できると述べているため、私を混乱させます。
bootstrap.js
パターンなしでは機能しない理由について、ヘルプ/洞察をいただければ幸いです。
これは、私が構築していた完全な GitHub サンドボックスへのリンクです: https://github.com/vovkvlad/webpack-module-federation-sandbox/tree/master/simple