logologo
指南
实践
配置
插件
案例
博客
生态
Module Federation Examples
Practical Module Federation
Zephyr Cloud
Nx
简体中文
English
指南
实践
配置
插件
案例
博客
Module Federation Examples
Practical Module Federation
Zephyr Cloud
Nx
简体中文
English
logologo
Overview
name
filename
remotes
exposes
shared
runtimePlugins
getPublicPath
implementation
dts
dev
manifest
shareStrategy
experiments
Edit this page on GitHub
Previous Pagemanifest
Next Pageexperiments

#shareStrategy

  • 类型:'version-first' | 'loaded-first'
  • 是否必填:否
  • 默认值:'version-first' (由 webpack 插件/构建时运行时设置)

控制共享依赖的加载策略:

  • 'version-first':版本优先,确保使用最高版本的共享依赖。设置后,会在应用初始化时自动加载所有 remotes 入口文件,并注册对应的共享依赖,确保能获取到所有的共享依赖版本。当对版本有严格要求时,推荐使用此策略。

  • 'loaded-first':复用优先,大幅减少多余的依赖请求。设置后,不会自动加载 remotes 入口文件(仅在有需求时才会加载),优先复用已加载的共享依赖。当对版本没有严格要求且对性能有要求时,推荐使用此策略。

离线远程模块注意事项

'version-first' 策略会在应用启动时自动加载远程入口文件以初始化共享依赖。如果任何远程模块离线或无法访问,会在启动期间触发 errorLoadRemote 钩子,生命周期为 'beforeLoadShare'。如果没有适当的错误处理,可能导致应用初始化失败。

'loaded-first' 策略将远程模块加载推迟到实际请求模块时,这意味着离线的远程模块只会在访问特定远程模块时导致失败,而不会在应用启动时失败。

version-first 遇到离线远程模块时的处理流程:

  1. 初始化期间,通过 initializeSharing() 加载远程模块
  2. 如果远程清单/入口文件离线,module.getEntry() 失败
  3. 触发 errorLoadRemote 钩子,生命周期为 'beforeLoadShare'
  4. 如果未提供回退方案,初始化可能挂起或失败

version-first 所需的错误处理:

const plugin = {
  name: 'offline-resilient-plugin',
  errorLoadRemote(args) {
    if (args.lifecycle === 'beforeLoadShare') {
      // 处理启动时 version-first 离线远程模块
      return {
        init: () => Promise.resolve(),
        get: (module) => () => Promise.resolve(() => '离线回退组件')
      };
    }
  }
};

对于可能存在网络问题的生产应用,建议:

  • 使用 'loaded-first' 策略以获得更好的弹性
  • 为 'beforeLoadShare' 生命周期实现全面的错误处理
  • 通过插件实现重试机制
  • 使用适当的错误边界和回退组件

参见错误加载远程解决方案获取详细的离线处理策略。