You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非Nx环境下Angular Module Federation共享服务单例失效问题

问题:Angular Module Federation 无法共享自定义库服务单例

我是Angular Module Federation新手,未使用Nx,创建了两个独立Angular 15项目:Host(项目1)和Remote(项目2),还有一个包含服务类的独立Angular库ezy-data-lib,尝试通过该服务实现联邦应用间通信。

已将ezy-data-lib安装并导入至两个项目的AppModule中,期望通过shareAll配置实现服务单例共享:在Host中更新服务值后,Remote能读取到更新后的值,但实际未实现单例共享。

尝试过的操作

  • 在Host和Remote的tsconfig.json中配置路径映射:
"paths": {
  "ezyDataLib": [
    "./node_modules/ezy-data-lib/public-api.d.ts"
  ]
}

更新webpack的sharedMappings注册:

sharedMappings.register(
  path.join(__dirname, 'tsconfig.json'),
  ['ezyDataLib']);

修改导入路径后出现assertion failed错误,恢复导入路径后错误消失,但单例问题仍存在;

  • 将shareAll替换为手动配置共享依赖:
shared: share({
  "@angular/core": { singleton: true, strictVersion: true, requiredVersion: 'auto', includeSecondaries: true },
  "@angular/common": { singleton: true, strictVersion: true, requiredVersion: 'auto', includeSecondaries: true },
  "@angular/common/http": { singleton: true, strictVersion: true, requiredVersion: 'auto', includeSecondaries: true },
  "@angular/router": { singleton: true, strictVersion: true, requiredVersion: 'auto', includeSecondaries: true },

  ...sharedMappings.getDescriptors()
})

仍无法实现单例;

  • 尝试在shareAll中开启eager加载,问题依旧。

当前场景

点击Host中的按钮更新库服务值,通过loadRemoteModule加载Remote后,无法在Remote中获取到更新后的值。

Host的webpack配置

const ModuleFederationPlugin = require("webpack/lib/container/ModuleFederationPlugin");
const mf = require("@angular-architects/module-federation/webpack");
const path = require("path");
const share = mf.share;
const shareAll = mf.shareAll;

const sharedMappings = new mf.SharedMappings();
sharedMappings.register(
  path.join(__dirname, 'tsconfig.json'),
  [/* mapped paths to share */]);

module.exports = {
  output: {
    uniqueName: "host",
    publicPath: "auto"
  },
  optimization: {
    runtimeChunk: false
  },
  resolve: {
    alias: {
      ...sharedMappings.getAliases(),
    }
  },
  experiments: {
    outputModule: true
  },
  plugins: [
    new ModuleFederationPlugin({
      library: { type: "module" },

      shared: shareAll({ singleton: true, strictVersion: true, requiredVersion: 'auto',includeSecondaries: true }),


    }),
    sharedMappings.getPlugin()
  ],
};

Remote的webpack配置

const ModuleFederationPlugin = require("webpack/lib/container/ModuleFederationPlugin");
const mf = require("@angular-architects/module-federation/webpack");
const path = require("path");
const share = mf.share;
const shareAll = mf.shareAll;

const sharedMappings = new mf.SharedMappings();
sharedMappings.register(
  path.join(__dirname, 'tsconfig.json'),
  []);

module.exports = {
  output: {
    uniqueName: "eRemote",
    publicPath: "auto"
  },
  optimization: {
    runtimeChunk: false
  },
  resolve: {
    alias: {
      ...sharedMappings.getAliases(),
    }
  },
  experiments: {
    outputModule: true
  },
  plugins: [
    new ModuleFederationPlugin({
      library: { type: "module" },

      // For remotes (please adjust)
      name: "eRemote",
      filename: "remoteEntry.js",
      exposes: {
        './AppModule': './src/app/app.module.ts',
      },


      shared: shareAll({ singleton: true, strictVersion: true, requiredVersion: 'auto', includeSecondaries: true, }),

    }),
    sharedMappings.getPlugin()
  ],
};

内容的提问来源于stack exchange,提问作者Jayanth R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 09:39:55