rspack_plugin_runtime/
import_scripts_chunk_loading.rs

1use 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}