berry: [Bug?] Virtual paths cause duplicate module instantiation

  • I’d be willing to implement a fix

Describe the bug

For Parcel , we have multiple modules that do this:

import {register} from "@parcel/core";
class X {}
register("X", X);

When installing Parcel via PnP, it seems like these modules are called multiple times (and register mustn’t be called multiple times - this works fine with Yarn 1).

I found out that the problematic file (@parcel/package-manager/lib/Npm.js) is required & compiled via two different require chains, @parcel-package-manager-virtual-<TWO-DIFFERENT-IDS-HERE> (see below).

I known this is problematic and somewhat relies on hoisting (and I already get some peerdependency warnings).

To Reproduce

😬

Example

Call chain 1

Trace: 2.0.0-alpha.3.2-dccf3d96:Npm
    at registerSerializableClass (pnp/.yarn/unplugged/@parcel-core-npm-2.0.0-alpha.3.2-dccf3d96-27a2fe7d38/node_modules/@parcel/core/lib/serializer.js:27:13)
    at Object.<anonymous> (pnp/.yarn/$$virtual/@parcel-package-manager-virtual-e6cacad87d/0/cache/@parcel-package-manager-npm-2.0.0-alpha.3.2-dccf3d96-3ccef4b8cf-2.zip/node_modules/@parcel/package-manager/lib/Npm.js:84:37)
    at Module._compile (internal/modules/cjs/loader.js:1158:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1178:10)
    at Module.load (internal/modules/cjs/loader.js:1002:32)
    at Function.module_1.Module._load (pnp/.pnp.js:23984:14)
    at Module.require (internal/modules/cjs/loader.js:1044:19)
    at require (internal/modules/cjs/helpers.js:77:18)
    at Object.<anonymous> (pnp/.yarn/$$virtual/@parcel-package-manager-virtual-e6cacad87d/0/cache/@parcel-package-manager-npm-2.0.0-alpha.3.2-dccf3d96-3ccef4b8cf-2.zip/node_modules/@parcel/package-manager/lib/index.js:19:12)
    at Module._compile (internal/modules/cjs/loader.js:1158:30)

Call chain 2

Trace: 2.0.0-alpha.3.2-dccf3d96:Npm
    at registerSerializableClass (pnp/.yarn/unplugged/@parcel-core-npm-2.0.0-alpha.3.2-dccf3d96-27a2fe7d38/node_modules/@parcel/core/lib/serializer.js:27:13)
    at Object.<anonymous> (pnp/.yarn/$$virtual/@parcel-package-manager-virtual-939cfbf528/0/cache/@parcel-package-manager-npm-2.0.0-alpha.3.2-dccf3d96-3ccef4b8cf-2.zip/node_modules/@parcel/package-manager/lib/Npm.js:84:37)
    at Module._compile (internal/modules/cjs/loader.js:1158:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1178:10)
    at Module.load (internal/modules/cjs/loader.js:1002:32)
    at Function.module_1.Module._load (pnp/.pnp.js:23984:14)
    at Module.require (internal/modules/cjs/loader.js:1044:19)
    at require (internal/modules/cjs/helpers.js:77:18)
    at Object.<anonymous> (pnp/.yarn/$$virtual/@parcel-package-manager-virtual-939cfbf528/0/cache/@parcel-package-manager-npm-2.0.0-alpha.3.2-dccf3d96-3ccef4b8cf-2.zip/node_modules/@parcel/package-manager/lib/index.js:19:12)
    at Module._compile (internal/modules/cjs/loader.js:1158:30)

Environment if relevant (please complete the following information):

  • OS: macOS
  • Node version: 12
  • Yarn version: 2.0.0-rc.29

Additional context

Add any other context about the problem here.

About this issue

  • Original URL
  • State: closed
  • Created 4 years ago
  • Comments: 15 (13 by maintainers)

Most upvoted comments

but @parcel/package-manager is still duplicated…

Yep, I still need to look into it, there’s a missing deduplication (cf my previous comment). Probably fixable on our side, will report back once I have more info 👍