Resolver perf: Use directory existence to cut down candidate list (3/n) #1333
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary:
Further optimise resolution with some work avoidance by using the fact that, when resolving
require('foo')
, we can eliminate any candidates of the form<prefix>/node_modules/foo<suffix>
unless<prefix>/node_modules
exists and is a directory. This saves a lot of lookups from deeply-nested origin modules.Further, when resolving
require('foo/bar')
, we can eliminate candidates of the form<prefix>/node_modules/foo/<suffix>
unless<prefix>/node_modules/foo
exists as a directory.This is a bit more subtle than it might seem, and can't be extended beyond these cases, due to redirection. For
require('foo/bar/baz')
,foo/bar
need not exist anywhere, because somefoo/package.json
could redirect it. However, when looking up apackage.json
for possible redirections, we stop atnode_modules
(we do not checknode_modules/package.json
), so it's safe to treat anything up to and includingnode_modules
(ornode_modules/foo
in the casenode_modules/foo.js
may not be a candidate) as a real file path that must be an extant directory.This fix reduces the existence checks we need to perform in RNTester such that total resolution speed is improved ~3x, or ~12x relative to the start of this stack / the previous Metro release.
Reviewed By: huntie
Differential Revision: D58594993