esbuild icon indicating copy to clipboard operation
esbuild copied to clipboard

Cannot implement import attribute `with { type: "external" }`

Open brillout opened this issue 1 year ago • 3 comments

I'm trying to implement this:

// Not externalized
import { something } from 'some-package'
// Externalized
import { something } from 'some-package' with { type: "external" }

In other words:

build.onResolve({filter: /.*/}, async (args) => {
  if (args.kind !== 'import-statement') return undefined
  if (args.with === 'external') {
    return { external: true, /*...*/ }
  }
  // ...
})

That would work but the issue is that args.with is missing at onResolve(). It seems to be provided only to onLoad().

Is there a way to implement such import attribute?

brillout avatar Feb 13 '24 20:02 brillout

This is not currently supported, but it's something to add to esbuild in the future. I think this issue is related to at least #3384 and #3639.

evanw avatar Feb 20 '24 07:02 evanw

Keep in mind that

build.onResolve({filter: /.*/}, async (args) => {

is a pretty punishing operation. What you ask from esbuild here is call a javascript method on every single import statement, which blocks esbuild from grinding through your project as fast as possible, as it can only pick the next file when your resolver answered. Even if this took only a millisecond to answer, on 1000 import statements you added 1 second of overhead.

sod avatar Feb 21 '24 16:02 sod

It might turn out to be a really handy option. As for possible performance issues I saw someone had suggested to introduce extra filtering property, smth. like { filter: /.*/, withType: "external" }.

magoniac avatar Apr 16 '24 21:04 magoniac