rspack_plugin_runtime/
import_scripts_chunk_loading.rs1use rspack_core::{
2 ChunkLoading, ChunkLoadingType, ChunkUkey, Compilation, CompilationRuntimeRequirementInTree,
3 Plugin, RuntimeGlobals, RuntimeModuleExt,
4};
5use rspack_error::Result;
6use rspack_hook::{plugin, plugin_hook};
7
8use crate::runtime_module::{ImportScriptsChunkLoadingRuntimeModule, is_enabled_for_chunk};
9
10#[plugin]
11#[derive(Debug, Default)]
12pub struct ImportScriptsChunkLoadingPlugin;
13
14#[plugin_hook(CompilationRuntimeRequirementInTree for ImportScriptsChunkLoadingPlugin)]
15async fn runtime_requirements_in_tree(
16 &self,
17 compilation: &mut Compilation,
18 chunk_ukey: &ChunkUkey,
19 _all_runtime_requirements: &RuntimeGlobals,
20 runtime_requirements: &RuntimeGlobals,
21 runtime_requirements_mut: &mut RuntimeGlobals,
22) -> Result<Option<()>> {
23 let chunk_loading_value = ChunkLoading::Enable(ChunkLoadingType::ImportScripts);
24 let is_enabled_for_chunk = is_enabled_for_chunk(chunk_ukey, &chunk_loading_value, compilation);
25
26 let mut has_chunk_loading = false;
27 for runtime_requirement in runtime_requirements.iter() {
28 match runtime_requirement {
29 RuntimeGlobals::ENSURE_CHUNK_HANDLERS if is_enabled_for_chunk => {
30 has_chunk_loading = true;
31 runtime_requirements_mut.insert(RuntimeGlobals::PUBLIC_PATH);
32 runtime_requirements_mut.insert(RuntimeGlobals::GET_CHUNK_SCRIPT_FILENAME);
33 }
34 RuntimeGlobals::HMR_DOWNLOAD_UPDATE_HANDLERS if is_enabled_for_chunk => {
35 has_chunk_loading = true;
36 runtime_requirements_mut.insert(RuntimeGlobals::PUBLIC_PATH);
37 runtime_requirements_mut.insert(RuntimeGlobals::GET_CHUNK_UPDATE_SCRIPT_FILENAME);
38 runtime_requirements_mut.insert(RuntimeGlobals::MODULE_CACHE);
39 runtime_requirements_mut.insert(RuntimeGlobals::HMR_MODULE_DATA);
40 runtime_requirements_mut.insert(RuntimeGlobals::MODULE_FACTORIES_ADD_ONLY);
41 }
42 RuntimeGlobals::HMR_DOWNLOAD_MANIFEST if is_enabled_for_chunk => {
43 has_chunk_loading = true;
44 runtime_requirements_mut.insert(RuntimeGlobals::PUBLIC_PATH);
45 runtime_requirements_mut.insert(RuntimeGlobals::GET_UPDATE_MANIFEST_FILENAME);
46 }
47 RuntimeGlobals::BASE_URI | RuntimeGlobals::ON_CHUNKS_LOADED if is_enabled_for_chunk => {
48 has_chunk_loading = true;
49 }
50 _ => {}
51 }
52
53 if has_chunk_loading && is_enabled_for_chunk {
54 runtime_requirements_mut.insert(RuntimeGlobals::MODULE_FACTORIES_ADD_ONLY);
55 runtime_requirements_mut.insert(RuntimeGlobals::HAS_OWN_PROPERTY);
56 let with_create_script_url = compilation.options.output.trusted_types.is_some();
57 if with_create_script_url {
58 runtime_requirements_mut.insert(RuntimeGlobals::CREATE_SCRIPT_URL);
59 }
60 compilation.add_runtime_module(
61 chunk_ukey,
62 ImportScriptsChunkLoadingRuntimeModule::new(with_create_script_url).boxed(),
63 )?;
64 }
65 }
66 Ok(None)
67}
68
69impl Plugin for ImportScriptsChunkLoadingPlugin {
70 fn name(&self) -> &'static str {
71 "ImportScriptsChunkLoadingPlugin"
72 }
73
74 fn apply(&self, ctx: &mut rspack_core::ApplyContext<'_>) -> Result<()> {
75 ctx
76 .compilation_hooks
77 .runtime_requirement_in_tree
78 .tap(runtime_requirements_in_tree::new(self));
79 Ok(())
80 }
81}