Skip to content

Don't emit redundant empty arrays for modules with no dependencies (#1858) - #1858

Closed
robhogan wants to merge 1 commit into
mainfrom
export-D113660291
Closed

Don't emit redundant empty arrays for modules with no dependencies (#1858)#1858
robhogan wants to merge 1 commit into
mainfrom
export-D113660291

Conversation

@robhogan

@robhogan robhogan commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

Summary:

Why?

This is a small optimisation for runtime speed and bundle size that avoids allocating an empty array for an argument that is not referenced by the function (module) body.

Metro-Buck already does this. This diff aligns Metro core and dev, which unblocks unforking the serialisers without introducing a regression.

Why this is non-breaking

By construction, an empty dependency map means the module has no collected dependencies, so the module body has no references to the dependency map injected by Metro.

We must still ensure there are no references not injected by Metro. Two cases:

  • transformer.unstable_dependencyMapReservedName is set - in this case we enforce that there are no occurrences of the name (as a string) in the module body at all.
  • Above is not set (default). In that case we use generateUid when wrapping the module to ensure we pick a name that is not already bound (and note, this is after any user/framework-supplied transforms)

In either case, the module body has no references to the argument.

One caveat to mention is that the argument is technically accessible using the arguments array-like. This is definitely not considered part of the stable API of Metro.

Note: Bundle analysers

A category of potentially-affected consumers are those which statically analyse the bundle and might expect an array at the dependency map position. Even here, we should be safe because we already have certain module types with a simpler module wrapper - e.g. wrapJson never emits a dependency map. That said, heads up @byCedric / Atlas.

Changelog: Internal

Reviewed By: huntie

Differential Revision: D113660291

@meta-codesync

meta-codesync Bot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

@robhogan has exported this pull request. If you are a Meta employee, you can view the originating Diff in D113660291.

@meta-cla meta-cla Bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Aug 12, 2026
…1858)

Summary:

## Why?

This is a small optimisation for runtime speed and bundle size that avoids allocating an empty array for an argument that is not referenced by the function (module) body.

Metro-Buck already does this. This diff aligns Metro core and dev, which unblocks unforking the serialisers without introducing a regression.

## Why this is non-breaking
By construction, an empty dependency map means the module has no collected dependencies, so the module body has no references to the dependency map *injected by Metro*.

We must still ensure there are no references not injected by Metro. Two cases:
 - `transformer.unstable_dependencyMapReservedName` is set - in this case we enforce that there are no occurrences of the name (as a string) in the module body at all.
 - Above is not set (default). In that case we use `generateUid` when wrapping the module to ensure we pick a name that is not already bound (and note, this is after any user/framework-supplied transforms)

In either case, the module body has no references to the argument.

One caveat to mention is that the argument is technically accessible using the `arguments` array-like. This is definitely not considered part of the stable API of Metro.

## Note: Bundle analysers

A category of potentially-affected consumers are those which statically analyse the bundle and might expect an array at the dependency map position. Even here, we should be safe because we already have certain module types with a simpler module wrapper - e.g. `wrapJson` never emits a dependency map. That said, heads up byCedric / Atlas.

Changelog: Internal

Reviewed By: huntie

Differential Revision: D113660291
@meta-codesync meta-codesync Bot changed the title Don't emit redundant empty arrays for modules with no dependencies Don't emit redundant empty arrays for modules with no dependencies (#1858) Aug 12, 2026
@meta-codesync
meta-codesync Bot force-pushed the export-D113660291 branch from 1274f23 to fdcb3f5 Compare August 12, 2026 15:32
@meta-codesync meta-codesync Bot closed this in db49f2c Aug 12, 2026
@meta-codesync meta-codesync Bot added the Merged label Aug 12, 2026
@meta-codesync

meta-codesync Bot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

This pull request has been merged in db49f2c.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. Merged meta-exported

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant