perf: using pkgId as nodeId for leaf deps

This commit is contained in:
Zoltan Kochan
2020-09-02 16:47:18 +03:00
parent a43c12afea
commit 9d9456442f
3 changed files with 28 additions and 9 deletions

View File

@@ -0,0 +1,5 @@
---
"@pnpm/resolve-dependencies": major
---
In case of leaf dependencies (dependencies that have no prod deps or peer deps), we only ever need to analyze one leaf dep in a graph, so the nodeId can be short and stateless, like the package ID.

View File

@@ -8,6 +8,7 @@ export function nodeIdContainsSequence (nodeId: string, pkgId1: string, pkgId2:
}
export function createNodeId (parentNodeId: string, pkgId: string) {
// using ">" as a separator because it will never be used inside a package ID
return `${parentNodeId}${pkgId}>`
}

View File

@@ -677,8 +677,11 @@ async function resolveDependency (
})
}
// using colon as it will never be used inside a package ID
const nodeId = createNodeId(options.parentPkg.nodeId, pkgResponse.body.id)
// In case of leaf dependencies (dependencies that have no prod deps or peer deps),
// we only ever need to analyze one leaf dep in a graph, so the nodeId can be short and stateless.
const nodeId = pkgIsLeaf(pkg)
? pkgResponse.body.id
: createNodeId(options.parentPkg.nodeId, pkgResponse.body.id)
const currentIsInstallable = (
ctx.force ||
@@ -732,13 +735,17 @@ async function resolveDependency (
ctx.resolvedPackagesByPackageId[pkgResponse.body.id].dev = ctx.resolvedPackagesByPackageId[pkgResponse.body.id].dev || wantedDependency.dev
ctx.resolvedPackagesByPackageId[pkgResponse.body.id].optional = ctx.resolvedPackagesByPackageId[pkgResponse.body.id].optional && wantedDependency.optional
ctx.pendingNodes.push({
alias: wantedDependency.alias || pkg.name,
depth: options.currentDepth,
installable,
nodeId,
resolvedPackage: ctx.resolvedPackagesByPackageId[pkgResponse.body.id],
})
if (ctx.dependenciesTree[nodeId]) {
ctx.dependenciesTree[nodeId].depth = Math.min(ctx.dependenciesTree[nodeId].depth, options.currentDepth)
} else {
ctx.pendingNodes.push({
alias: wantedDependency.alias || pkg.name,
depth: options.currentDepth,
installable,
nodeId,
resolvedPackage: ctx.resolvedPackagesByPackageId[pkgResponse.body.id],
})
}
}
return {
@@ -758,6 +765,12 @@ async function resolveDependency (
}
}
function pkgIsLeaf (pkg: PackageManifest) {
return R.isEmpty(pkg.dependencies ?? {}) &&
R.isEmpty(pkg.optionalDependencies ?? {}) &&
R.isEmpty(pkg.peerDependencies ?? {})
}
function getResolvedPackage (
options: {
dependencyLockfile?: PackageSnapshot