在没有 CDN 的微前端包之间共享反应

如何解决在没有 CDN 的微前端包之间共享反应

我正在使用带有 Single-Spa 框架的微前端架构构建应用。

我有

  • 根配置 Web 应用:定义应用的布局并将每个微前端作为 NPM 依赖项包含
  • N 个微前端:加载到根配置应用中的 React 应用。

因为每个微前端都在使用 React,所以我不想每次都捆绑它。相反,我想让根配置应用程序将 React 指定为依赖项,然后它可以由每个微前端加载。

我已将 react 和 react-dom 声明为 webpack 外部对象,因此它们没有捆绑在一起,但我认为这仅在我在根配置应用程序的 index.html 中包含来自 CDN 的 React 时才有效。有没有办法配置 webpack 以便它将 React 包含在根配置中并使其可用于每个微前端?我不能在我的公司使用公共 CDN。

谢谢!

解决方法

"Getting Started: Quick start" guide 中,我们介绍了如何添加共享依赖项,示例中具体展示了将 React 和 ReactDOM 添加到导入映射中。

您不应该尝试将 React 捆绑到根配置中,因为由 Webpack 捆绑到应用程序中的模块是命名空间的,而不是全局共享的。相反,根据您的要求,您可以将这些 React 文件托管在您自己的 CDN 中,甚至可以通过 root-config 在本地提供它们,因为最终会有静态文件。加载这些文件的位置与 SystemJS 无关,只要它可以加载它们。这意味着您可以像在本地复制这些文件并从根配置服务器提供它们一样简单,也可以像 setting up your own unpkg server 一样复杂。

,

如果你想在微前端有灵活性,也就是如果你想让每个微前端相互独立部署,你可以使用客户端集成。

反应

您可以将 CDN 用于静态文件。 (图像、字体、pdf、doc)Webpack 模块联合可用于客户端集成。

配置示例 webpack 和模块联合。

我们将 webpack 配置文件分为 3 部分。通用,开发,生产

webpack.common.js

module.exports = {
  module: {
    rules: [
      {
        test: /\.m?js$/,exclude: /node_modules/,use: {
          loader: 'babel-loader',options: {
            presets: ['@babel/preset-react','@babel/preset-env'],plugins: ['@babel/plugin-transform-runtime'],},],};

webpack.dev.js

const { merge } = require('webpack-merge');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ModuleFederationPlugin = require('webpack/lib/container/ModuleFederationPlugin');
const commonConfig = require('./webpack.common');
const packageJson = require('../package.json');

const devConfig = {
  mode: 'development',output: {
    publicPath: 'http://localhost:8082/',devServer: {
    port: 8082,historyApiFallback: {
      index: 'index.html',plugins: [
    new ModuleFederationPlugin({
      name: 'auth',filename: 'remoteEntry.js',exposes: {
        './AuthApp': './src/bootstrap',shared: packageJson.dependencies,}),new HtmlWebpackPlugin({
      template: './public/index.html',};

module.exports = merge(commonConfig,devConfig);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?