Federation Runtime
是新版本 Module Federation
的主要功能之一,它能够支持通过运行时 API 注册共享依赖、动态注册和加载远程模块,了解 Runtime 的设计原理可以参考:Why Runtime。
init(options: InitOptions): void
Type: loadRemote(id: string)
用于加载初始化的远程模块,当与构建插件一起使用时,它可以通过原生的 import("remote name/expose")
语法直接加载,并且构建插件会自动将其转换为loadRemote("remote name/expose")
用法。
Example
Type: loadShare(pkgName: string, extraOptions?: { customShareInfo?: Partial<Shared>;resolver?: (sharedOptions: ShareInfos[string]) => Shared;})
获取 share
依赖项。当全局环境中存在与当前消费者匹配的“共享”依赖时,现有的和符合共享条件的依赖将首先被复用。否则,加载它自己的依赖项并将它们存储在全局缓存中。
这个 API
通常不是由用户直接调用,而是由构建插件使用来转换它们自己的依赖项。
Example
如果设置了多个版本 shared,默认会返回已加载且最高版本的 shared 。可以通过设置 extraOptions.resolver
来改变这个行为:
只有当 entry 是 manifest 文件协议时,preloadRemote 接口才有效
Type: preloadRemote(preloadOptions: Array<PreloadRemoteArgs>)
用于预加载模块的远程资源,比如 remote-entry.js
和其他的 js chunk、css 文件,使用 preloadRemote API.
Type
通过 preloadRemote
,模块资源可以在较早的阶段预加载,以避免瀑布式请求。preloadRemote
可以预加载以下内容:
remote
的 remote entry
remote
中的 expose
资源remote
中的同步资源和异步资源remote
中 remote
的依赖Type: registerRemotes(remotes: Remote[], options?: { force?: boolean }): void
用于在初始化后注册远程模块.
Type
force:true
时请小心 !如果设置 force: true
,它将合并远程(包括已加载的远程),并移除已加载的远程缓存,同时会使用 console.warn
来警告此操作可能存在风险。
Federation Runtime
是新版本 Module Federation
的主要功能之一,它能够支持在运行时注册共享依赖、动态注册和加载远程模块,还可以通过 Plugin
来扩展 Module Federation
在运行时的能力,构建插件是基于 Runtime 的基础实现的。
Federation Runtime
和 Builder Plugin
存在以下差异:
Federation Runtime | Builder Plugin |
---|---|
可脱离构建插件使用,在 webpack4 等项目中可直接使用纯运行时进行模块加载 |
构建插件需要是 webpack5、Rspack、Vite 以上 |
支持动态注册模块 | 不支持动态注册模块 |
不支持 import 语法加载模块 |
支持 import 同步语法加载模块 |
支持 loadRemote 加载模块 |
支持 loadRemote 加载模块 |
设置 shared 必须提供具体版本和实例信息 |
设置 shared 只需要配置规则即可,无须提供具体版本及实例信息 |
shared 依赖只能供外部使用,无法使用外部 shared 依赖 |
shared 依赖按照特定规则双向共享 |
可以通过 runtime 的 plugin 机制影响加载流程 |
可以通过 runtimePlugin 配置影响加载流程 |
纯运行时不支持远程类型提示 | 支持远程类型提示 |
Runtime
对于之前使用 Webpack
内置的 Module Federation
构建插件的用户而言可能是一个全新的概念,在之前 Webpack 中的 Module Federation 无论是导出模块、还是消费模块都是纯构建的行为,所有模块的加载过程都被构建工具给封装了起来,对比模块加载器 Systemjs、esmodule 对比带来以下两点收益:
NPM
依赖一样 import
使用即可但是这种模式同时也对于项目的灵活性和构建插件的维护成本带来了以下影响:
因此在新版本 Module Federation
设计中,将 Runtime
单独抽离了出来,不同的构建工具基于 Runtime
去实现对于模块的导出的构建、共享模块的信息收集、远程模块引用的处理,其他具体的共享依赖复用、远程模块加载等行为全部内置到 Runtime 中。