AI图鉴

AI图鉴首页 › AI 资讯 › Rspack 源码解析(三十三):Module Federation 如何用 R

Rspack 源码解析(三十三):Module Federation 如何用 RemoteModule 与 ContainerEntryModule 表示远程代

来源:掘金 · 发布时间:10-28 · 由 AI图鉴每小时自动聚合

本文进入 `rspack_plugin_mf`,看 Module Federation 的 `RemoteModule`(消费远程)和 `ContainerEntryModule`(暴露本地)如何实现

Rspack 外部外部外部外部外部外部外部外部外部外部外部外部外部外部外部外部

前言:远程模块不是真实模块

模块联合会:

导入“ 远程/ 按钮 ”

- > 键

- > 键

这和 externals(第 22 篇)的「假模块代替真实模块」一脉相承。区别是 externals 从全局变量/require 取,remote 从远程容器的 get/init 接口取。

校对:Soup

箱/rspack plugin mf/src/contain/contain.rs CH 集装箱Plugin 负责「我暴露什么给别人」。它的使Hook 创建一个集装箱依赖性并 hook 创建一个 hook 创建一个 ccontain enter:

# [plugin hook(集装箱管道的编译器)]

async fn make( &self,汇编:& mut 汇编) - > 结果 < () > {

让 dep = 容器依赖性:new ()

自定义。 options.name.clone ()

自定义。 options.exposes.clone ()

自定义。 options.share scope.clone ()

自我。 选项。 增强

);

编译。添加条目(

框:新建(dep)

条目选项{

名称:Some( self. options. name. clone ())

运行时间:self. options.runtime.clone ()

文件名:自。 options. filename.clone ()

库:Some(self.options.library.clone ())

. 默认:默认()

},

等待吗?

Ok(())

}

集装箱进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口进口

# [plugin hook(集装箱管道汇编)]

async fn 汇编( &self,汇编,parms) - > 结果 < () > {

编译。 set dependency factory (Dependency Type:: Contener Entry, Arc: new (ContenerEntry ModuleFactory));;;;;;;;;;。

编译。 set dependency factory (Dependency Type:: Contener Exposed, params. 正常 module factory.clone ());编译。 set dependency factory (DependencyType:: Contener Exposed, params.

Ok(())

}

集装箱入口单元:

箱/rspack plugin mf/src/容器/容器 enter module.rs CH Control EntryMudule 建 X 暴露 Q+块:

async fn 构建( mut self: box <self>, building context,: Option QQ汇编>) - > 结果 <BuildResult > {

让哑巴块=vec!

让 mut 依赖性:Vec < BoxDependency > = vec! [;];

//集装箱逻辑

用于( 名称、 选项)。 曝光 {

让 mut 块 = Async 依赖性Block: new ()

自定义

无

一些( 名称)

选项.import.iter ().map (\\\ request\\\\\\ n{

框:new( 容器的依赖性:new( name.clone (), request.clone ()) 作为框<dyn依赖性>

\ ) 收集 ()

无

);

块。 set group options( Group options:: ChunkGroup ())

ChunkGroup 选项:默认 (). name optional (options.name.clone ())

));

block.push(框:新(块));

}

依赖性。 push( 框:new( staticExports dependency: new( 框:))

StaticExportsSpec::Array(vec!["get".into(), "init".into()]),

虚假

)));

// ...

}

* * * 揭露 {Async DependenitysBlock( {} ),}:获取 – 输入。

代码( G): − 获取/init

容器 EntryModule CH代码生成 Q模块映射:

let module map = ExposeModuleMap: new(编译、自我、运行时间 template);

让模块 map str = 模块 map.render(运行时间 template);

将工厂曝光

程序 ExposeModuleMap {

pub fn 新(汇编、容器输入模块、运行时间温度) - > 自我 {

让mut模块 map=vec![;];

用于在容器中的块 ID 模块。 get blocks() {

// ...

让 str = 如果模块 iter.clone (). any (,模块,, ) 模块.is none () {

运行时间 template. throw missing module error block(...)

否则

让块保证=运行时间 template.block promise(Some(block id),编译,"");

让模块=模块 iter.map(,,请求,依赖 id){{

运行时间 template.module raw(汇编、依赖 id、请求、虚假)

}))收集:<Vec< >>().join(,");

让模块 raw = 运行时间 template. return 函数 ()

运行时间 template. return 函数( & modules, "");

格式!(“ return {block promise}}.when({module raw}) )

};

模块 map.push((name.to string (, str)));

}

自定义( 模块映射)

}

}

* 显示 CH 值 CH 值 CH 返回块 Promise.when(模块 QQ () 模块) QQ 块 QQ

生成的 get/init 代码

代码 %% 1:

让源=格式!()

r#"

var 模块Map = {module map str};

var 获得 = 函数( 模块,获取Scope) QQ

{当前 remote get scope} = 获得范围;

获取Scope=(

{has own property}(模块地图,模块)

模块映射 [模块] ()

: promise.resolve ().when({get scope reject}) 存档副本。

);

{当前 remote get scope}}=未定义;

返回获取范围;

}}

var init = 函数(份额范围,initSope) QQ

如果 (!{share scope map}) 返回;

var 名称 = {share scope};

var 旧Scope = {share scope map} [名称];

如果( oldScope QQ 旧Scope! ==============================================================================================================================================================================================================================================

{share scope map}[名称]=shareScope;

返回 {初始化共享} (名称,initScope);

}}

{ define property getters}({导出} ), {}

获取:{导出 get}

输入:{导出 init}

}});"#,

// ...

);

获得 hight 模块Map QQ( QQ), init QQ 共享范围( QX). define property getters left/ init QQ getter.

校对:Soup

容器 reference plugin.rs CH 集装箱ReferencePlugin 将 Hook + 远程/xxxx, pdf 远程模块化。

远程模块:

条框/rspack plugin mf/src/容器/remote module.rs 的的的:

[可解

# [贬低(debug)]

酒吧结构远程模块{

// ...

请求:字符串

外部请求:Vec < String >

酒吧内请求:字符串

酒吧共享( S):字符串

酒吧远程键:字符串

// ...

}

建造:

async fn 构建(mut self: box <self>, build context: buildContext,: Option QQ汇编>) - > 结果 <BuildResult> {

让 mut 依赖性:Vec < BoxDependency > = Vec: new ();

如果属于自身。 external requests.len () == 1 {

让 dep = 远程外部依赖性:new(self.external requests[0].clone ());

// ...

依赖性.push(框:new(dep));

否则

让 dep = 倒背依赖性:new(self.external requests.clone ());

// ...

依赖性.push(框:new(dep));

}

// ...

}

* 远程外部依赖,(10)( 重复) 260。

代码( E):

远程模块 CH 代码生成 Q:

async fn 代码生成( &self,代码生成 context) - > 结果 < CodeGenerationResult > {

让mut codegen=codeGenerationResult::default();

let module graph = 代码生成 context.c 汇编.get module graph ();

let module = module_graph.get_module_by_dependency_id(&self.dependencies[0]);

让 id = module.和 (|m|chunkGraph::get module id(...));

codegen.add(SourceType:Remote, RawString 来源:from static (")). boxed ());.

codegen.data. 插入(代码GenerationDataShareInit {

项:vec! [ShareInitData {

share scope.clone () 常规

进入阶段:20

init: DataInitInfo:External ModuleId(id.cloned()) 互联网档案馆的存檔,存档日期2013-12-21.

}],

});

Ok( 代码)

}

(原始内容存档于2019-09-25). Remodel Module QQ JS, QQ CodeGenerationDataShareInit 分享范围,idQQ 远程 runtime module – 远程Loading.ejs QQQ).

来源类型:remote $ shareInit

远程模块 CH 源类型 QQ:

fn 源代码类型( &self, module graph: &ModuleGraph) - > & [來源Type] {

& [來源請求:讀取,源碼:分享]

}

远程 QQ, ShareInit lair 共享范围 QQ 源类型 QQ 代码生成 QQ

:假设共享模块

箱/rspack plugin mf/src/share/consume share module.rs 的 ConsummeredModule 表示「消费共享模块」(如 shared shared shared shared shared).

+++ 代码生成 ++ 装载器 ++:

让 mut 函数 = 字符串:from("loaders.load");

让mut args = vec!

json 字符串( &self. options.share scope)

json 字符串( &self. options.share key)

];

如果让 Some( version) = &self. options. required version {

如果自定义。 options. print version {

函数“ Q”;

}

如果自定义。 options. singleton {

函数“ singleton ”;

}

让版本 = json stringify( & version.to string ());

args.push(格式!("loaders.parse Range({versive})"));;;;;;。

函数“ VersionCheck”;

\ 如果自选。 singleton {

函数“ singleton ”;

}

tright version-singleton, required version {}装入器:装入器:装入器:装入器:装入器:装入器:装入器:装入器:

假设共享插件:创建 QQ

clus shared plugin.rs ya 将 Hook {{}\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

# [plugin hook(常规模块 Factory Factorize for ConsumeShared Plugin)] (英语).

async fn因子化( &self,数据:&mut ModuleFactoryCreateData) - > 结果 < option<BoxModule}{

// 跳过后退 / 相关依赖

如果匹配!(dep. dependency type (),依赖类型:: ConsumeSharedFallback {...}{

返回 Ok( 无);

}

让请求=数据。 request;

允许消费 = self.get complete cumes();

如果让 Some( 匹配) = 消耗。 unresolved. get( request) {

let module = self.create consume shared module( & data.context, request, matched.clone (,...)).await;存档副本。

返回 OK( Some( module. boxed () ) );

}

// 前缀匹配

用于 & concumes 中的(前缀,选项)。 前缀 {

如果请求。 starts with(前缀) {

// ...

}

}

OK( 无)

}

外在因素化::,:

解析 matched configs: laid 共享 {}

共享QQ请求QQ:

用于配置 {% (request, config)

如果 REQEST.is match( 请求) {

// ./xxx 相对路径 -> resolver 解析

否则,如果ABSOLUTE REQUTE.is match(请求){

// /xxx 绝对路径

} 如果请求。 ends with ('/') {

// 前缀匹配

前缀。 插入( request. to owned (), config.clone ());

否则

// 裸包名,运行时解析

尚未解决。 插入( request. to owned (), config.clone () );

}

}

未解决的 QQ (% react), QQ, QQ 系数化 QQ;解 QQ,走创建模块 QQ)

(原始内容存档于2019-03-01). Rust 18: XXX: QQ

模块联合会:

容器输入模块 - > sourceType::JavaScript + Expose

远程模块 - > sourceType:: remote + ShareInit

组合共享模块 - > 源类型:假设共享

QQ 模块 ^, 12. 1 来源类型 QQ 代码生成,12. 1 set dependent factory → MF →

这一篇应该带走什么

- 集装箱管道,集装箱单元 ++++++++;

- 集装箱参考

- 远程QQ, 212运行时模块+远程Loading.ejs;

- 装填器:

- MF + 依赖工厂

写在最后

MF rust ##[plugin] [plugin hook] ##[可处理] ***, rspack hook $ rspack macros, $ 钩子钩子

本文由 AI图鉴自动抓取并翻译,版权归原作者所有;如需查看原文请点下方链接。

相关 AI 工具

相关免费羊毛

同源资讯

阅读原文(juejin.cn)

标题、摘要与正文均来自该信源的公开页面,版权归原作者所有;本站自动聚合与翻译,仅作出处跳转。

← 返回 AI 资讯列表AI工具图鉴首页

返回 AI图鉴首页 · 提交工具 · 商务合作 · 关于本站 · 596 款 AI 工具分类导航 · 每日 AI 热门项目与动态