Skip to content

feat: preserve defer/source import phase on external dependencies#20934

Merged
alexander-akait merged 4 commits into
mainfrom
claude/test-deferred-imports-TR1Md
May 8, 2026
Merged

feat: preserve defer/source import phase on external dependencies#20934
alexander-akait merged 4 commits into
mainfrom
claude/test-deferred-imports-TR1Md

Conversation

@alexander-akait
Copy link
Copy Markdown
Member

@alexander-akait alexander-akait commented May 8, 2026

Summary

Phase imports (import defer * as ns from "x", import source x from "x", import.defer("x"), import.source("x")) are now respected on external dependencies the same way import attributes already are.

  • For static module externals in ESM output, ModuleExternalInitFragment now emits import defer * as <id> from "x" for namespace defer imports and import source <id> from "x" for single-default source imports — instead of stripping the phase keyword.
  • For dynamic import externals, getSourceForImportExternal emits import.defer("x") / import.source("x") when the importFunctionName is the default "import" and a phase is set on the dependency.
  • ImportDependencyMeta now carries phase alongside attributes and externalType. ExternalModule.identifier() and updateHash() include phase and attributes, so the same external imported with two different phases (or attribute sets) no longer collapses into a single ExternalModule and silently drops one phase.
  • getSourceForModuleExternal keeps imported = true (namespace form) when the dependency phase is defer, since import defer only has a valid namespace native syntax.

Three configCases cover the new behaviour:

  • externals/phase-imports-defer — runtime case (var / promise externals, no output.module): asserts the optimized deferred runtime helper (__webpack_require__.zO(...)) is used for sync externals and skipped for already-async ones.
  • externals/phase-imports-source — same shape for source phase against runtime-form externals.
  • externals/phase-imports-esm — ESM output case (output.module: true) covering all three external types — module, import, module-import — at static and dynamic sites, plus a regression test for the same external imported with two different phases.

What kind of change does this PR introduce?

feat

Did you add tests for your changes?

yes — test/configCases/externals/phase-imports-defer/, test/configCases/externals/phase-imports-source/, test/configCases/externals/phase-imports-esm/.

Does this PR introduce a breaking change?

no — externals that were not imported with a phase keyword are emitted exactly as before. The added phase/attributes material in ExternalModule.identifier() only changes the identifier when those fields are non-default, so caches built before this change for non-phase externals stay valid.

If relevant, what needs to be documented…

n/a — the existing externals docs already describe import attributes flowing through unchanged; phase imports now flow through the same way and don't need a separate doc entry.

Use of AI

Claude Code was used to draft the implementation and tests under human review.

https://claude.ai/code/session_01BKSJuH4X5zjxsszYXHRqy2

Adds two configCases under test/configCases/externals to document the
runtime code webpack emits when a static `import defer` or `import source`
targets an external module:

- phase-imports-defer asserts that a sync `var` external is wrapped with
  `__webpack_require__.zO(...)` (the optimized deferred namespace helper)
  while an already-async `promise` external falls back to a regular harmony
  import (defer is a no-op).
- phase-imports-source asserts that source-phase static imports of externals
  emit a regular harmony import and are not lowered to the deferred helper.

https://claude.ai/code/session_01BKSJuH4X5zjxsszYXHRqy2
When an external is imported via a phase-aware import statement, the
phase keyword is now propagated through ExternalModule's emitted source
the same way import attributes are.

- Capture `dependency.phase` alongside `attributes` and `externalType`
  in ImportDependencyMeta when wiring up an ExternalModule.
- For static module-type externals, emit
  `import defer * as <id> from "x"` for namespace defer imports and
  `import source <id> from "x"` for single-binding source imports in the
  ModuleExternalInitFragment output.
- For dynamic import-type externals, emit `import.defer(…)` /
  `import.source(…)` instead of `import(…)` when the importFunctionName
  is the default `"import"`.

Adds a configCase under externals/phase-imports-esm covering both static
and dynamic phase forms; the existing phase-imports-defer / -source
tests continue to assert the runtime-bundle (non-ESM) behaviour.

https://claude.ai/code/session_01BKSJuH4X5zjxsszYXHRqy2
Extends phase-imports-esm to assert phase keyword emission across all
three external types that resolve to native ESM:

- `module` externals at static sites → `import defer * as …` /
  `import source … from …`.
- `import` externals at dynamic sites → `import.defer(…)` /
  `import.source(…)`.
- `module-import` externals dispatch to the `module` form for static
  imports and the `import` form for dynamic imports based on the
  consumer dependency.

https://claude.ai/code/session_01BKSJuH4X5zjxsszYXHRqy2
Copilot AI review requested due to automatic review settings May 8, 2026 12:51
@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 8, 2026

🦋 Changeset detected

Latest commit: 337223f

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
webpack Minor

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 8, 2026

This PR is packaged and the instant preview is available (b60f7bd).

Install it locally:

  • npm
npm i -D webpack@https://pkg.pr.new/webpack@b60f7bd
  • yarn
yarn add -D webpack@https://pkg.pr.new/webpack@b60f7bd
  • pnpm
pnpm add -D webpack@https://pkg.pr.new/webpack@b60f7bd

Comment thread lib/ExternalModule.js Fixed
@codecov
Copy link
Copy Markdown

codecov Bot commented May 8, 2026

Codecov Report

❌ Patch coverage is 97.56098% with 1 line in your changes missing coverage. Please review.
✅ Project coverage is 91.38%. Comparing base (4e45617) to head (337223f).
⚠️ Report is 3 commits behind head on main.

Files with missing lines Patch % Lines
lib/ExternalModule.js 97.29% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #20934      +/-   ##
==========================================
+ Coverage   91.34%   91.38%   +0.04%     
==========================================
  Files         566      568       +2     
  Lines       56130    56519     +389     
  Branches    14904    15022     +118     
==========================================
+ Hits        51274    51652     +378     
- Misses       4856     4867      +11     
Flag Coverage Δ
integration 90.33% <97.56%> (+0.04%) ⬆️
test262 45.59% <34.14%> (-0.02%) ⬇️
unit 36.01% <2.43%> (-0.03%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends external-module handling to carry import “phase” metadata (defer / source) through to code generation, and adds configCases to lock in the emitted runtime/code patterns for phase imports targeting externals.

Changes:

  • Propagate dependency.phase into ExternalModule dependency metadata (similar to import attributes).
  • Emit phase-aware forms for externals: native import defer / import source for module externals, and import.defer(...) / import.source(...) for import externals when applicable.
  • Add new externals configCases covering defer and source phase imports (including an ESM-output scenario).

Reviewed changes

Copilot reviewed 16 out of 17 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
types.d.ts Adds ImportDependencyMeta.phase to the published typings.
lib/ExternalModuleFactoryPlugin.js Threads dependency.phase into dependencyMeta for external module creation.
lib/ExternalModule.js Uses phase metadata to influence emitted import statements / dynamic import call forms for externals.
.changeset/external-module-phase-imports.md Changeset documenting the new phase-preservation behavior for externals.
test/configCases/externals/phase-imports-source/webpack.config.js New configCase enabling sourceImport for externals.
test/configCases/externals/phase-imports-source/test.config.js Selects the built test bundle for the new source-phase case.
test/configCases/externals/phase-imports-source/index.js Asserts generated bundle content for source-phase static imports of externals.
test/configCases/externals/phase-imports-source/bundle.js Entry containing import source statements against externals.
test/configCases/externals/phase-imports-esm/webpack.config.js New ESM-output configCase covering module, import, and module-import externals with phase usage.
test/configCases/externals/phase-imports-esm/test.config.js Selects the built test bundle for the ESM phase-imports case.
test/configCases/externals/phase-imports-esm/index.js Validates emitted native phase import syntax / import.defer / import.source strings in output.
test/configCases/externals/phase-imports-esm/bundle.js Entry exercising phase import syntax for different external types.
test/configCases/externals/phase-imports-defer/webpack.config.js New configCase enabling deferImport for externals.
test/configCases/externals/phase-imports-defer/test.config.js Selects the built test bundle for the defer-phase case.
test/configCases/externals/phase-imports-defer/infrastructure-log.js Filters expected infrastructure log noise when FS cache is enabled.
test/configCases/externals/phase-imports-defer/index.js Asserts deferred runtime helper usage for sync externals and no-op behavior for async externals.
test/configCases/externals/phase-imports-defer/bundle.js Entry using /* webpackDefer: true */ imports against externals.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread lib/ExternalModule.js
Comment on lines +357 to 367
const phase = dependencyMeta && dependencyMeta.phase;
let content = "";
if (imported === true) {
// namespace
content = `import * as ${identifier} from ${JSON.stringify(request)}${
attributes
};\n`;
const phaseKeyword = ImportPhaseUtils.isDefer(phase) ? "defer " : "";
content = `import ${phaseKeyword}* as ${identifier} from ${JSON.stringify(
request
)}${attributes};\n`;
} else if (imported.length === 0) {
// just import, no use
content = `import ${JSON.stringify(request)}${attributes};\n`;
Comment thread lib/ExternalModule.js
Comment on lines 775 to 783
/**
* Returns the unique identifier used to reference this module.
* @returns {string} a unique identifier of the module
*/
identifier() {
return `external ${this._resolveExternalType(this.externalType)} ${JSON.stringify(this.request)}`;
return `external ${this._resolveExternalType(
this.externalType
)} ${JSON.stringify(this.request)}`;
}
Comment on lines +1 to +5
---
"webpack": minor
---

Preserve `defer` / `source` import phase keywords on external dependencies in ESM output, the same way import attributes are preserved. Static `import defer * as ns from "x"` and `import source v from "x"` against a `module` external are now emitted as native `import defer * as …` / `import source … from …` statements at the top of the bundle, and dynamic `import.defer("x")` / `import.source("x")` against an `import` external is emitted as `import.defer(…)` / `import.source(…)`.
@codspeed-hq
Copy link
Copy Markdown

codspeed-hq Bot commented May 8, 2026

Merging this PR will degrade performance by 67.57%

⚡ 7 improved benchmarks
❌ 4 regressed benchmarks
✅ 133 untouched benchmarks
⏩ 72 skipped benchmarks1

⚠️ Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Mode Benchmark BASE HEAD Efficiency
Memory benchmark "asset-modules-resource", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 216 KB 329.4 KB -34.44%
Memory benchmark "context-commonjs", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 139.3 KB 299.9 KB -53.56%
Memory benchmark "many-chunks-commonjs", scenario '{"name":"mode-production","mode":"production"}' 8.3 MB 6.8 MB +22.08%
Memory benchmark "future-defaults", scenario '{"name":"mode-development","mode":"development"}' 1.9 MB 1.4 MB +36.01%
Memory benchmark "devtool-eval-source-map", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 278.2 KB 858 KB -67.57%
Memory benchmark "devtool-eval", scenario '{"name":"mode-development","mode":"development"}' 1,283.4 KB 971.9 KB +32.05%
Memory benchmark "react", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 239.1 KB 594.4 KB -59.78%
Memory benchmark "devtool-source-map", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 517.9 KB 139.5 KB ×3.7
Memory benchmark "three-long", scenario '{"name":"mode-development-rebuild","mode":"development","watch":true}' 1,147.8 KB 855.6 KB +34.14%
Memory benchmark "asset-modules-inline", scenario '{"name":"mode-development","mode":"development"}' 2.7 MB 2.1 MB +30.44%
Memory benchmark "many-modules-commonjs", scenario '{"name":"mode-development","mode":"development"}' 1,141.7 KB 832.5 KB +37.15%

Comparing claude/test-deferred-imports-TR1Md (337223f) with main (d21b845)

Open in CodSpeed

Footnotes

  1. 72 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@alexander-akait alexander-akait changed the title test: cover defer/source phase imports of external dependencies feat: preserve defer/source import phase on external dependencies May 8, 2026
- ExternalModule.identifier() and updateHash() now include `phase` and
  `attributes` from `dependencyMeta`, so the same external imported
  twice with different phases no longer collapses into a single
  ExternalModule and silently loses one phase keyword.
- Force `imported = true` (namespace form) in
  getSourceForModuleExternal when phase is `defer`, since `import defer`
  only has a valid namespace native syntax — concatenation can no longer
  silently drop the keyword by narrowing the import shape.
- Drop the duplicated `_isLegacyAssert && _isLegacyAssert` ternary in
  ModuleExternalInitFragment.getContent().
- Run prettier/eslint over the touched lib files.

Adds a regression test under externals/phase-imports-esm: importing
ext-both-phases with both `import defer * as` and `import source` must
emit both native statements in the bundle.

https://claude.ai/code/session_01BKSJuH4X5zjxsszYXHRqy2
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 8, 2026

Types Coverage

Coverage after merging claude/test-deferred-imports-TR1Md into main will be
98.93%
Coverage Report
FileStmtsBranchesFuncsLinesUncovered Lines
bin
   webpack.js98.77%100%100%98.77%91
examples
   build-common.js100%100%100%100%
   buildAll.js100%100%100%100%
   examples.js100%100%100%100%
   template-common.js98.21%100%100%98.21%72
examples/custom-javascript-parser
   test.filter.js100%100%100%100%
examples/custom-javascript-parser/internals
   acorn-parse.js100%100%100%100%
   meriyah-parse.js100%100%100%100%
   oxc-parse.js91.30%100%100%91.30%140, 142–143, 145, 147, 153–154, 161, 168, 90
examples/markdown
   webpack.config.mjs100%100%100%100%
examples/typescript
   test.filter.js50%100%100%50%5
examples/virtual-modules
   test.filter.js100%100%100%100%
examples/wasm-bindgen-esm
   test.filter.js100%100%100%100%
examples/wasm-complex
   test.filter.js100%100%100%100%
examples/wasm-simple
   test.filter.js100%100%100%100%
examples/wasm-simple-source-phase
   test.filter.js100%100%100%100%
lib
   APIPlugin.js100%100%100%100%
   AsyncDependenciesBlock.js100%100%100%100%
   AutomaticPrefetchPlugin.js100%100%100%100%
   BannerPlugin.js100%100%100%100%
   Cache.js98.21%100%100%98.21%101
   CacheFacade.js100%100%100%100%
   Chunk.js99.72%100%100%99.72%37
   ChunkGraph.js100%100%100%100%
   ChunkGroup.js100%100%100%100%
   ChunkTemplate.js100%100%100%100%
   CleanPlugin.js98.72%100%100%98.72%206, 226, 382
   CodeGenerationResults.js100%100%100%100%
   CompatibilityPlugin.js100%100%100%100%
   Compilation.js98.55%100%100%98.55%1554, 1850, 1857, 1865, 1887, 2783, 3208, 3870, 3899, 3952–3953, 3957, 3962, 3978–3979, 3993–3994, 3999–4000, 4477, 4503, 493, 498, 5211, 5292, 5307, 5332–5333, 5335, 5659, 5664, 5670, 5673, 5685, 5687, 5691, 5707, 5722, 5754, 5808, 5832, 5946, 712–713
   Compiler.js99.55%100%100%99.55%1116–1117, 1125
   ConcatenationScope.js98.59%100%100%98.59%189
   ConditionalInitFragment.js100%100%100%100%
   ConstPlugin.js100%100%100%100%
   ContextExclusionPlugin.js100%100%100%100%
   ContextModule.js100%100%100%100%
   ContextModuleFactory.js97.75%100%100%97.75%258, 393, 418, 443, 447, 458
   ContextReplacementPlugin.js100%100%100%100%
   DefinePlugin.js98.92%100%100%98.92%158–159, 175, 194, 268
   DependenciesBlock.js100%100%100%100%
   Dependency.js98.20%100%100%98.20%379, 425
   DependencyTemplate.js100%100%100%100%
   DependencyTemplates.js100%100%100%100%
   DotenvPlugin.js97.88%100%100%97.88%237, 378, 391–392
   DynamicEntryPlugin.js100%100%100%100%
   EntryOptionPlugin.js100%100%100%100%
   EntryPlugin.js100%100%100%100%
   Entrypoint.js100%100%100%100%
   EnvironmentPlugin.js97.14%100%100%97.14%49
   ErrorHelpers.js100%100%100%100%
   EvalDevToolModulePlugin.js100%100%100%100%
   EvalSourceMapDevToolPlugin.js100%100%100%100%
   ExportsInfo.js100%100%100%100%
   ExportsInfoApiPlugin.js100%100%100%100%
   ExternalModule.js98.96%100%100%98.96%424–428, 576
   ExternalModuleFactoryPlugin.js100%100%100%100%
   ExternalsPlugin.js100%100%100%100%
   FileSystemInfo.js99.50%100%100%99.50%182, 2252–2253, 2256, 2267, 2278, 2289, 278, 3694, 3709, 3733
   FlagAllModulesAsUsedPlugin.js100%100%100%100%
   FlagDependencyExportsPlugin.js98.74%100%100%98.74%399, 401, 405
   FlagDependencyUsagePlugin.js100%100%100%100%
   FlagEntryExportAsUsedPlugin.js100%100%100%100%
   Generator.js100%100%100%100%
   HotModuleReplacementPlugin.js100%100%100%100%
   HotUpdateChunk.js100%100%100%100%
   IgnorePlugin.js100%100%100%100%
   IgnoreWarningsPlugin.js100%100%100%100%
   InitFragment.js100%100%100%100%
   JavascriptMetaInfoPlugin.js100%100%100%100%
   LibraryTemplatePlugin.js100%100%100%100%
   LoaderOptionsPlugin.js100%100%100%100%
   LoaderTargetPlugin.js100%100%100%100%
   MainTemplate.js100%100%100%100%
   ManifestPlugin.js100%100%100%100%
   Module.js98.50%100%100%98.50%1304, 1309, 1370, 1384, 1446, 1455
   ModuleFactory.js100%100%100%100%
   ModuleFilenameHelpers.js98.85%100%100%98.85%106, 108
   ModuleGraph.js99.73%100%100%99.73%1004
   ModuleGraphConnection.js100%100%100%100%
   ModuleInfoHeaderPlugin.js100%100%100%100%
   ModuleProfile.js100%100%100%100%
   ModuleSourceTypeConstants.js100%100%100%100%
   ModuleTemplate.js100%100%100%100%
   ModuleTypeConstants.js100%100%100%100%
   MultiCompiler.js99.69%100%100%99.69%645
   MultiStats.js100%100%100%100%
   MultiWatching.js100%100%100%100%
   NoEmitOnErrorsPlugin.js100%100%100%100%
   NodeStuffPlugin.js100%100%100%100%
   NormalModule.js97.78%100%100%97.78%1020, 1036, 1123, 1774, 1779–1789, 708, 711, 728, 745, 986
   NormalModuleFactory.js99.47%100%100%99.47%1074, 1383, 473, 485
   NormalModuleReplacementPlugin.js100%100%100%100%
   NullFactory.js100%100%100%100%
   OptimizationStages.js100%100%100%100%
   OptionsApply.js100%100%100%100%
   Parser.js100%100%100%100%
   PlatformPlugin.js100%100%100%100%
   PrefetchPlugin.js100%100%100%100%
   ProgressPlugin.js98.85%100%100%98.85%519–520, 525, 527, 591
   ProvidePlugin.js100%100%100%100%
   RawModule.js100%100%100%100%
   RecordIdsPlugin.js100%100%100%100%
   RequestShortener.js100%100%100%100%
   ResolverFactory.js100%100%100%100%
   RuntimeGlobals.js100%100%100%100%
   RuntimeModule.js100%100%100%100%
   RuntimePlugin.js100%100%100%100%
   RuntimeTemplate.js100%100%100%100%
   SelfModuleFactory.js100%100%100%100%
   SingleEntryPlugin.js100%100%100%100%
   SourceMapDevToolModuleOptionsPlugin.js100%100%100%100%
   SourceMapDevToolPlugin.js99.16%100%100%99.16%267–268, 610
   Stats.js100%100%100%100%
   Template.js100%100%100%100%
   TemplatedPathPlugin.js98.86%100%100%98.86%134–135
   UseStrictPlugin.js100%100%100%100%
   WarnCaseSensitiveModulesPlugin.js100%100%100%100%
   WarnDeprecatedOptionPlugin.js100%100%100%100%
   WarnNoModeSetPlugin.js100%100%100%100%
   WatchIgnorePlugin.js100%100%100%100%
   Watching.js100%100%100%100%
   WebpackError.js100%100%100%100%
   WebpackIsIncludedPlugin.js100%100%100%100%
   WebpackOptionsApply.js100%100%100%100%
   WebpackOptionsDefaulter.js100%100%100%100%
   buildChunkGraph.js99.87%100%100%99.87%325
   cli.js98.71%100%100%98.71%117, 469, 501, 543, 813
   index.js100%100%100%100%
   validateSchema.js94.67%100%100%94.67%100, 87, 89, 98
   webpack.js97.22%100%100%97.22%196, 218, 220
lib/asset
   AssetBytesGenerator.js100%100%100%100%
   AssetBytesParser.js100%100%100%100%
   AssetGenerator.js100%100%100%100%
   AssetModulesPlugin.js97.77%100%100%97.77%285, 309, 312, 364, 40
   AssetParser.js100%100%100%100%
   AssetSourceGenerator.js100%100%100%100%
   AssetSourceParser.js100%100%100%100%
   RawDataUrlModule.js100%100%100%100%
lib/async-modules
   AsyncModuleHelpers.js100%100%100%100%
   AwaitDependenciesInitFragment.js100%100%100%100%
   InferAsyncModulesPlugin.js100%100%100%100%
lib/cache
   AddBuildDependenciesPlugin.js100%100%100%100%
   AddManagedPathsPlugin.js100%100%100%100%
   IdleFileCachePlugin.js97.92%100%100%97.92%71, 83, 91
   MemoryCachePlugin.js95.83%100%100%95.83%33
   MemoryWithGcCachePlugin.js93.15%100%100%93.15%106, 113–114, 122, 89
   PackFileCacheStrategy.js96.40%100%100%96.40%1250, 1350, 1354, 1416, 628, 647, 657–659, 661, 677–678, 683, 686, 688, 693, 698, 722, 728, 762, 768, 774, 779, 790, 799, 804–805, 807, 824, 830–831, 833
   ResolverCachePlugin.js100%100%100%100%
   getLazyHashedEtag.js100%100%100%100%
   mergeEtags.js100%100%100%100%
lib/config
   browserslistTargetHandler.js100%100%100%100%
   defaults.js99.15%100%100%99.15%1327–1329, 1337, 271, 274, 279, 283, 472
   normalization.js99%100%100%99%191–192, 258, 273
   target.js100%100%100%100%
lib/container
   ContainerEntryDependency.js100%100%100%100%
   ContainerEntryModule.js100%100%100%100%
   ContainerEntryModuleFactory.js100%100%100%100%
   ContainerExposedDependency.js100%100%100%100%
   ContainerPlugin.js100%100%100%100%
   ContainerReferencePlugin.js100%100%100%100%
   FallbackDependency.js100%100%100%100%
   FallbackItemDependency.js100%100%100%100%
   FallbackModule.js100%100%100%100%
   FallbackModuleFactory.js100%100%100%100%
   HoistContainerReferencesPlugin.js100%100%100%100%
   ModuleFederationPlugin.js100%100%100%100%
   RemoteModule.js100%100%100%100%
   RemoteRuntimeModule.js100%100%100%100%
   

@alexander-akait alexander-akait merged commit b60f7bd into main May 8, 2026
60 of 61 checks passed
@alexander-akait alexander-akait deleted the claude/test-deferred-imports-TR1Md branch May 8, 2026 15:31
aryanraj45 pushed a commit to aryanraj45/webpack that referenced this pull request May 8, 2026
bjohansebas added a commit to webpack/webpack.js.org that referenced this pull request May 17, 2026
…rnals

Webpack 5.107 preserves the defer and source import phase keywords on
external dependencies the same way it preserves import attributes. Adds
subsections under externalsType.module and externalsType.import showing
the static and dynamic forms emitted in the output bundle.

Refs: webpack/webpack#20934
alexander-akait pushed a commit to webpack/webpack.js.org that referenced this pull request May 19, 2026
…rnals (#8239)

* docs(externals): document defer/source phase preservation in ESM externals

Webpack 5.107 preserves the defer and source import phase keywords on
external dependencies the same way it preserves import attributes. Adds
subsections under externalsType.module and externalsType.import showing
the static and dynamic forms emitted in the output bundle.

Refs: webpack/webpack#20934

* docs(externals): fix broken anchor for import attributes link

The reference link pointed to /configuration/module/#ruleparserimportattributes,
which does not exist (the fragment-check on PR #8239 failed). Webpack
docs have no dedicated "import attributes" page; the closest internal
anchor is #rulewith, but that documents Rule.with as a matcher rather
than import attributes themselves. Replace the internal link with the
TC39 proposal URL so readers can learn what import attributes are.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants