Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Resolver perf: Weakly cache normalisation of exports field (4/n) #1334

Closed
wants to merge 1 commit into from

Conversation

robhogan
Copy link
Contributor

Summary:
Typically, a given package is required multiple times within a project, but currently we normalise the same exports JSON for every dependency.

In RNTester, only three of its dependencies have non-primitive exports fields:

/node_modules/babel/runtime
/node_modules/react
/packages/react-native-test-library

But these are referenced 760 times, meaning 760 calls to the internal normalizeExportsField.

This diff uses the property of Metro's upstream ModuleCache._packageCache, which avoids reading/parsing package.json unless it has changed. This makes exports stable, and (when it is non-primitive), weakly referenceable.

By caching these values we reduce time spent in normalizeExportsField by ~10x and resolution time overall by 10% for RNTester, though the impact is likely to be larger for larger projects. By using a WeakMap, the cache can be GCed as corresponding packages are deleted from ModuleCache.

- **[Performance]**: Cache normalisation of `exports` fields for improved resolution performance.

Differential Revision: D61841586

@facebook-github-bot facebook-github-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 27, 2024
@facebook-github-bot
Copy link
Contributor

This pull request was exported from Phabricator. Differential Revision: D61841586

@facebook-github-bot
Copy link
Contributor

This pull request was exported from Phabricator. Differential Revision: D61841586

robhogan added a commit to robhogan/metro that referenced this pull request Aug 27, 2024
…acebook#1334)

Summary:
Pull Request resolved: facebook#1334

Typically, a given package is required multiple times within a project, but currently we normalise the same `exports` JSON for every dependency.

In RNTester, only three of its dependencies have non-primitive `exports` fields:

```
/node_modules/babel/runtime
/node_modules/react
/packages/react-native-test-library
```

But these are referenced 760 times, meaning 760 calls to the internal `normalizeExportsField`.

This diff uses the property of Metro's upstream `ModuleCache._packageCache`, which avoids reading/parsing `package.json` unless it has changed. This makes `exports` stable, and (when it is non-primitive), weakly referenceable.

By caching these values we reduce time spent in `normalizeExportsField` by ~10x and resolution time overall by 10% for RNTester, though the impact is likely to be larger for larger projects. By using a `WeakMap`, the cache can be GCed as corresponding packages are deleted from `ModuleCache`.

```
- **[Performance]**: Cache normalisation of `exports` fields for improved resolution performance.
```

Differential Revision: D61841586
…acebook#1334)

Summary:
Pull Request resolved: facebook#1334

Typically, a given package is required multiple times within a project, but currently we normalise the same `exports` JSON for every dependency.

In RNTester, only three of its dependencies have non-primitive `exports` fields:

```
/node_modules/babel/runtime
/node_modules/react
/packages/react-native-test-library
```

But these are referenced 760 times, meaning 760 calls to the internal `normalizeExportsField`.

This diff uses the property of Metro's upstream `ModuleCache._packageCache`, which avoids reading/parsing `package.json` unless it has changed. This makes `exports` stable, and (when it is non-primitive), weakly referenceable.

By caching these values we reduce time spent in `normalizeExportsField` by ~10x and resolution time overall by 10% for RNTester, though the impact is likely to be larger for larger projects. By using a `WeakMap`, the cache can be GCed as corresponding packages are deleted from `ModuleCache`.

```
- **[Performance]**: Cache normalisation of `exports` fields for improved resolution performance.
```

Reviewed By: huntie

Differential Revision: D61841586
@facebook-github-bot
Copy link
Contributor

This pull request was exported from Phabricator. Differential Revision: D61841586

facebook-github-bot pushed a commit that referenced this pull request Aug 27, 2024
…1334)

Summary:

Typically, a given package is required multiple times within a project, but currently we normalise the same `exports` JSON for every dependency.

In RNTester, only three of its dependencies have non-primitive `exports` fields:

```
/node_modules/babel/runtime
/node_modules/react
/packages/react-native-test-library
```

But these are referenced 760 times, meaning 760 calls to the internal `normalizeExportsField`.

This diff uses the property of Metro's upstream `ModuleCache._packageCache`, which avoids reading/parsing `package.json` unless it has changed. This makes `exports` stable, and (when it is non-primitive), weakly referenceable.

By caching these values we reduce time spent in `normalizeExportsField` by ~10x and resolution time overall by 10% for RNTester, though the impact is likely to be larger for larger projects. By using a `WeakMap`, the cache can be GCed as corresponding packages are deleted from `ModuleCache`.

```
- **[Performance]**: Cache normalisation of `exports` fields for improved resolution performance.
```

Reviewed By: huntie

Differential Revision: D61841586
@facebook-github-bot
Copy link
Contributor

This pull request has been merged in 16d2205.

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. fb-exported Merged
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants