Skip to content

Commit d39d201

Browse files
committed
feat: support OutputChunk#dynamicImports and RenderedChunk#dynamicImports
1 parent cab8e2b commit d39d201

File tree

15 files changed

+103
-70
lines changed

15 files changed

+103
-70
lines changed

crates/rolldown/src/stages/generate_stage/compute_cross_chunk_links.rs

Lines changed: 18 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ use rolldown_common::{
99
NamedImport, OutputFormat, SymbolRef,
1010
};
1111
use rolldown_rstr::{Rstr, ToRstr};
12-
use rolldown_utils::rayon::{IntoParallelIterator, ParallelBridge, ParallelIterator};
12+
use rolldown_utils::rayon::{ParallelBridge, ParallelIterator};
1313
use rustc_hash::{FxHashMap, FxHashSet};
1414

1515
type ChunkMetaImports = IndexVec<ChunkId, FxHashSet<SymbolRef>>;
1616
type ChunkMetaImportsForExternalModules =
1717
IndexVec<ChunkId, FxHashMap<ExternalModuleId, Vec<NamedImport>>>;
1818
type ChunkMetaExports = IndexVec<ChunkId, FxHashSet<SymbolRef>>;
19-
type IndexCrossChunkImports = IndexVec<ChunkId, FxHashSet<ChunkId>>;
19+
type IndexCrossChunkImports = IndexVec<ChunkId, Vec<ChunkId>>;
2020

2121
impl<'a> GenerateStage<'a> {
2222
/// - Assign each symbol to the chunk it belongs to
@@ -26,7 +26,7 @@ impl<'a> GenerateStage<'a> {
2626
chunk_graph: &mut ChunkGraph,
2727
chunk_meta_imports: &mut ChunkMetaImports,
2828
chunk_meta_imports_from_external_modules: &mut ChunkMetaImportsForExternalModules,
29-
index_cross_chunk_imports: &mut IndexCrossChunkImports,
29+
cross_chunk_dynamic_imports: &mut IndexCrossChunkImports,
3030
) {
3131
let symbols = &Mutex::new(&mut self.link_output.symbols);
3232

@@ -38,15 +38,15 @@ impl<'a> GenerateStage<'a> {
3838
chunk_meta_imports.iter_mut().zip(
3939
chunk_meta_imports_from_external_modules
4040
.iter_mut()
41-
.zip(index_cross_chunk_imports.iter_mut()),
41+
.zip(cross_chunk_dynamic_imports.iter_mut()),
4242
),
4343
)
4444
.par_bridge()
4545
};
4646
chunks_iter.for_each(
4747
|(
4848
(chunk_id, chunk),
49-
(chunk_meta_imports, (imports_from_external_modules, cross_chunk_imports)),
49+
(chunk_meta_imports, (imports_from_external_modules, cross_chunk_dynamic_imports)),
5050
)| {
5151
chunk.modules.iter().copied().for_each(|module_id| {
5252
let module = &self.link_output.module_table.normal_modules[module_id];
@@ -58,7 +58,7 @@ impl<'a> GenerateStage<'a> {
5858
if let ModuleId::Normal(importee_id) = rec.resolved_module {
5959
let importee_chunk =
6060
chunk_graph.module_to_chunk[importee_id].expect("importee chunk should exist");
61-
cross_chunk_imports.insert(importee_chunk);
61+
cross_chunk_dynamic_imports.push(importee_chunk);
6262
}
6363
}
6464
})
@@ -145,14 +145,16 @@ impl<'a> GenerateStage<'a> {
145145
ChunkId,
146146
FxHashMap<ChunkId, Vec<CrossChunkImportItem>>,
147147
> = index_vec![FxHashMap::<ChunkId, Vec<CrossChunkImportItem>>::default(); chunk_graph.chunks.len()];
148-
let mut index_cross_chunk_imports: IndexCrossChunkImports =
149-
index_vec![FxHashSet::default(); chunk_graph.chunks.len()];
148+
let mut cross_chunk_imports: IndexCrossChunkImports =
149+
index_vec![vec![]; chunk_graph.chunks.len()];
150+
let mut cross_chunk_dynamic_imports: IndexCrossChunkImports =
151+
index_vec![vec![]; chunk_graph.chunks.len()];
150152

151153
self.collect_potential_chunk_imports(
152154
chunk_graph,
153155
&mut chunk_meta_imports_vec,
154156
&mut chunk_meta_imports_from_external_modules_vec,
155-
&mut index_cross_chunk_imports,
157+
&mut cross_chunk_dynamic_imports,
156158
);
157159

158160
// - Find out what imports are actually come from other chunks
@@ -171,7 +173,7 @@ impl<'a> GenerateStage<'a> {
171173
});
172174
// Check if the import is from another chunk
173175
if chunk_id != importee_chunk_id {
174-
index_cross_chunk_imports[chunk_id].insert(importee_chunk_id);
176+
cross_chunk_imports[chunk_id].push(importee_chunk_id);
175177
let imports_from_other_chunks = &mut imports_from_other_chunks_vec[chunk_id];
176178
imports_from_other_chunks
177179
.entry(importee_chunk_id)
@@ -234,47 +236,29 @@ impl<'a> GenerateStage<'a> {
234236
}
235237
}
236238

237-
let index_sorted_cross_chunk_imports = index_cross_chunk_imports
238-
.into_iter()
239-
// FIXME: Extra traversing. This is a workaround due to `par_bridge` doesn't ensure order https://github.com/rayon-rs/rayon/issues/551#issuecomment-882069261
240-
.collect::<Vec<_>>()
241-
.into_par_iter()
242-
.map(|cross_chunk_imports| {
243-
let mut cross_chunk_imports = cross_chunk_imports.into_iter().collect::<Vec<_>>();
244-
cross_chunk_imports.sort_by_cached_key(|chunk_id| {
245-
let mut resource_ids = chunk_graph.chunks[*chunk_id]
246-
.modules
247-
.iter()
248-
.map(|id| {
249-
self.link_output.module_table.normal_modules[*id].resource_id.expect_file().as_str()
250-
})
251-
.collect::<Vec<_>>();
252-
resource_ids.sort_unstable();
253-
resource_ids
254-
});
255-
cross_chunk_imports
256-
})
257-
.collect::<Vec<_>>();
258-
259239
chunk_graph
260240
.chunks
261241
.iter_mut()
262242
.zip(
263243
imports_from_other_chunks_vec.into_iter().zip(
264244
chunk_meta_imports_from_external_modules_vec
265245
.into_iter()
266-
.zip(index_sorted_cross_chunk_imports),
246+
.zip(cross_chunk_imports.into_iter().zip(cross_chunk_dynamic_imports)),
267247
),
268248
)
269249
.par_bridge()
270250
.for_each(
271251
|(
272252
chunk,
273-
(imports_from_other_chunks, (imports_from_external_modules, cross_chunk_imports)),
253+
(
254+
imports_from_other_chunks,
255+
(imports_from_external_modules, (cross_chunk_imports, cross_chunk_dynamic_imports)),
256+
),
274257
)| {
275258
chunk.imports_from_other_chunks = imports_from_other_chunks;
276259
chunk.imports_from_external_modules = imports_from_external_modules;
277260
chunk.cross_chunk_imports = cross_chunk_imports;
261+
chunk.cross_chunk_dynamic_imports = cross_chunk_dynamic_imports;
278262
},
279263
);
280264
}

crates/rolldown/src/stages/generate_stage/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ impl<'a> GenerateStage<'a> {
175175
exports: rendered_chunk.exports,
176176
module_ids: rendered_chunk.module_ids,
177177
imports: rendered_chunk.imports,
178+
dynamic_imports: rendered_chunk.dynamic_imports,
178179
map,
179180
sourcemap_file_name,
180181
})));

crates/rolldown/src/utils/chunk/finalize_chunks.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,11 @@ pub fn finalize_chunks(
9999
.iter()
100100
.map(|id| chunk_graph.chunks[*id].filename.clone().expect("should have file name"))
101101
.collect();
102+
chunk_render_return.rendered_chunk.dynamic_imports = chunk
103+
.cross_chunk_dynamic_imports
104+
.iter()
105+
.map(|id| chunk_graph.chunks[*id].filename.clone().expect("should have file name"))
106+
.collect();
102107
},
103108
);
104109

crates/rolldown/src/utils/chunk/mod.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,5 +67,16 @@ pub fn generate_rendered_chunk(
6767
.clone()
6868
})
6969
.collect(),
70+
dynamic_imports: chunk
71+
.cross_chunk_dynamic_imports
72+
.iter()
73+
.map(|id| {
74+
chunk_graph.chunks[*id]
75+
.preliminary_filename
76+
.as_deref()
77+
.expect("should have preliminary_filename")
78+
.clone()
79+
})
80+
.collect(),
7081
}
7182
}

crates/rolldown_binding/src/types/binding_output_chunk.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,11 @@ impl BindingOutputChunk {
6262
self.inner.imports.iter().map(|x| x.to_string()).collect()
6363
}
6464

65+
#[napi(getter)]
66+
pub fn dynamic_imports(&self) -> Vec<String> {
67+
self.inner.dynamic_imports.iter().map(|x| x.to_string()).collect()
68+
}
69+
6570
// OutputChunk
6671
#[napi(getter)]
6772
pub fn code(&self) -> String {

crates/rolldown_binding/src/types/binding_rendered_chunk.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ pub struct RenderedChunk {
2121
#[serde(skip)]
2222
pub modules: HashMap<String, BindingRenderedModule>,
2323
pub imports: Vec<String>,
24+
pub dynamic_imports: Vec<String>,
2425
}
2526

2627
impl From<rolldown_common::RenderedChunk> for RenderedChunk {
@@ -38,6 +39,7 @@ impl From<rolldown_common::RenderedChunk> for RenderedChunk {
3839
.map(|(key, value)| (key.to_string(), value.into()))
3940
.collect(),
4041
imports: value.imports.iter().map(|x| x.to_string()).collect(),
42+
dynamic_imports: value.dynamic_imports.iter().map(|x| x.to_string()).collect(),
4143
}
4244
}
4345
}

crates/rolldown_common/src/chunk/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ pub struct Chunk {
2323
pub canonical_names: FxHashMap<SymbolRef, Rstr>,
2424
// Sorted by resource_id of modules in the chunk
2525
pub cross_chunk_imports: Vec<ChunkId>,
26+
pub cross_chunk_dynamic_imports: Vec<ChunkId>,
2627
pub bits: BitSet,
2728
pub imports_from_other_chunks: FxHashMap<ChunkId, Vec<CrossChunkImportItem>>,
2829
pub imports_from_external_modules: FxHashMap<ExternalModuleId, Vec<NamedImport>>,

crates/rolldown_common/src/types/output_chunk.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ pub struct OutputChunk {
1818
pub file_name: FilePath,
1919
pub modules: FxHashMap<FilePath, RenderedModule>,
2020
pub imports: Vec<FilePath>,
21+
pub dynamic_imports: Vec<FilePath>,
2122
// OutputChunk
2223
pub code: String,
2324
pub map: Option<SourceMap>,

crates/rolldown_common/src/types/rendered_chunk.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,5 @@ pub struct RenderedChunk {
1414
pub file_name: FilePath,
1515
pub modules: FxHashMap<FilePath, RenderedModule>,
1616
pub imports: Vec<FilePath>,
17+
pub dynamic_imports: Vec<FilePath>,
1718
}

packages/rolldown/src/binding.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export class BindingOutputChunk {
2525
get fileName(): string
2626
get modules(): Record<string, BindingRenderedModule>
2727
get imports(): Array<string>
28+
get dynamicImports(): Array<string>
2829
get code(): string
2930
get map(): string | null
3031
get sourcemapFileName(): string | null
@@ -160,5 +161,6 @@ export interface RenderedChunk {
160161
fileName: string
161162
modules: Record<string, BindingRenderedModule>
162163
imports: Array<string>
164+
dynamicImports: Array<string>
163165
}
164166

0 commit comments

Comments
 (0)