Skip to content

Commit efcea76

Browse files
feat(turbopack-ecmascript): cache external modules with wrapper (#7988)
1 parent 4061e06 commit efcea76

File tree

25 files changed

+435
-119
lines changed

25 files changed

+435
-119
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/turbopack-core/src/resolve/mod.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use anyhow::{bail, Result};
1111
use indexmap::{indexmap, IndexMap, IndexSet};
1212
use serde::{Deserialize, Serialize};
1313
use tracing::{Instrument, Level};
14-
use turbo_tasks::{trace::TraceRawVcs, RcStr, TryJoinIterExt, Value, ValueToString, Vc};
14+
use turbo_tasks::{trace::TraceRawVcs, RcStr, TaskInput, TryJoinIterExt, Value, ValueToString, Vc};
1515
use turbo_tasks_fs::{
1616
util::{normalize_path, normalize_request},
1717
FileSystemEntryType, FileSystemPath, RealPathResult,
@@ -392,9 +392,8 @@ impl ModuleResolveResultOption {
392392
}
393393
}
394394

395-
#[derive(Copy, Clone, Debug, Eq, PartialEq, Serialize, Deserialize, TraceRawVcs)]
395+
#[derive(Copy, Clone, Debug, Eq, PartialEq, Serialize, Deserialize, TraceRawVcs, TaskInput)]
396396
pub enum ExternalType {
397-
OriginalReference,
398397
Url,
399398
CommonJs,
400399
EcmaScriptModule,
@@ -403,7 +402,6 @@ pub enum ExternalType {
403402
impl Display for ExternalType {
404403
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
405404
match self {
406-
ExternalType::OriginalReference => write!(f, "original reference"),
407405
ExternalType::CommonJs => write!(f, "commonjs"),
408406
ExternalType::EcmaScriptModule => write!(f, "esm"),
409407
ExternalType::Url => write!(f, "url"),

crates/turbopack-ecmascript-runtime/js/src/shared/runtime-utils.ts

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -406,21 +406,31 @@ function asyncModule(
406406

407407
const depQueues: Set<AsyncQueue> = new Set();
408408

409-
ensureDynamicExports(module, module.exports);
410-
const exports = module.exports;
411-
412409
const { resolve, reject, promise: rawPromise } = createPromise<Exports>();
413410

414411
const promise: AsyncModulePromise = Object.assign(rawPromise, {
415-
[turbopackExports]: exports,
412+
[turbopackExports]: module.exports,
416413
[turbopackQueues]: (fn) => {
417414
queue && fn(queue);
418415
depQueues.forEach(fn);
419416
promise["catch"](() => {});
420417
},
421418
} satisfies AsyncModuleExt);
422419

423-
module.exports = module.namespaceObject = promise;
420+
const attributes: PropertyDescriptor = {
421+
get(): any {
422+
return promise;
423+
},
424+
set(v: any) {
425+
// Calling `esmExport` leads to this.
426+
if (v !== promise) {
427+
promise[turbopackExports] = v;
428+
}
429+
},
430+
};
431+
432+
Object.defineProperty(module, "exports", attributes);
433+
Object.defineProperty(module, "namespaceObject", attributes);
424434

425435
function handleAsyncDependencies(deps: Dep[]) {
426436
const currentDeps = wrapDeps(deps);
@@ -456,7 +466,7 @@ function asyncModule(
456466
if (err) {
457467
reject((promise[turbopackError] = err));
458468
} else {
459-
resolve(exports);
469+
resolve(promise[turbopackExports]);
460470
}
461471

462472
resolveQueue(queue);

crates/turbopack-ecmascript/src/chunk/chunk_type.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ use turbopack_core::{
99

1010
use super::{EcmascriptChunk, EcmascriptChunkContent, EcmascriptChunkItem};
1111

12-
#[derive(Default)]
1312
#[turbo_tasks::value]
13+
#[derive(Default)]
1414
pub struct EcmascriptChunkType {}
1515

1616
#[turbo_tasks::value_impl]

crates/turbopack-ecmascript/src/references/async_module.rs

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,7 @@ use turbopack_core::{
1616
};
1717

1818
use super::esm::base::ReferencedAsset;
19-
use crate::{
20-
chunk::EcmascriptChunkPlaceable, code_gen::CodeGeneration, create_visitor,
21-
references::esm::base::insert_hoisted_stmt,
22-
};
19+
use crate::{code_gen::CodeGeneration, create_visitor, references::esm::base::insert_hoisted_stmt};
2320

2421
/// Information needed for generating the async module wrapper for
2522
/// [EcmascriptChunkItem](crate::chunk::EcmascriptChunkItem)s.
@@ -47,7 +44,6 @@ impl OptionAsyncModuleOptions {
4744
/// level await statement or is referencing an external ESM module.
4845
#[turbo_tasks::value(shared)]
4946
pub struct AsyncModule {
50-
pub placeable: Vc<Box<dyn EcmascriptChunkPlaceable>>,
5147
pub has_top_level_await: bool,
5248
pub import_externals: bool,
5349
}
@@ -116,10 +112,7 @@ impl AsyncModule {
116112
return Ok(None);
117113
};
118114
Ok(match &*referenced_asset {
119-
ReferencedAsset::External(
120-
_,
121-
ExternalType::OriginalReference | ExternalType::EcmaScriptModule,
122-
) => {
115+
ReferencedAsset::External(_, ExternalType::EcmaScriptModule) => {
123116
if self.import_externals {
124117
referenced_asset.get_ident().await?
125118
} else {
@@ -168,10 +161,7 @@ impl AsyncModule {
168161
};
169162
Ok(matches!(
170163
&*referenced_asset,
171-
ReferencedAsset::External(
172-
_,
173-
ExternalType::OriginalReference | ExternalType::EcmaScriptModule
174-
)
164+
ReferencedAsset::External(_, ExternalType::EcmaScriptModule)
175165
))
176166
})
177167
.try_join()

crates/turbopack-ecmascript/src/references/esm/base.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -264,10 +264,7 @@ impl CodeGenerateable for EsmAssetReference {
264264
insert_hoisted_stmt(program, stmt);
265265
}));
266266
}
267-
ReferencedAsset::External(
268-
request,
269-
ExternalType::OriginalReference | ExternalType::EcmaScriptModule,
270-
) => {
267+
ReferencedAsset::External(request, ExternalType::EcmaScriptModule) => {
271268
if !*chunking_context
272269
.environment()
273270
.supports_esm_externals()

crates/turbopack-ecmascript/src/references/esm/url.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -182,10 +182,7 @@ impl CodeGenerateable for UrlAssetReference {
182182
}
183183
}));
184184
}
185-
ReferencedAsset::External(
186-
request,
187-
ExternalType::OriginalReference | ExternalType::Url,
188-
) => {
185+
ReferencedAsset::External(request, ExternalType::Url) => {
189186
let request = request.to_string();
190187
visitors.push(create_visitor!(ast_path, visit_mut_expr(new_expr: &mut Expr) {
191188
let should_rewrite_to_relative = if let Expr::New(NewExpr { args: Some(args), .. }) = new_expr {
@@ -274,10 +271,7 @@ impl CodeGenerateable for UrlAssetReference {
274271
}
275272
}));
276273
}
277-
ReferencedAsset::External(
278-
request,
279-
ExternalType::OriginalReference | ExternalType::Url,
280-
) => {
274+
ReferencedAsset::External(request, ExternalType::Url) => {
281275
let request = request.to_string();
282276
visitors.push(create_visitor!(ast_path, visit_mut_expr(new_expr: &mut Expr) {
283277
if let Expr::New(NewExpr { args: Some(args), .. }) = new_expr {

0 commit comments

Comments
 (0)