-
Notifications
You must be signed in to change notification settings - Fork 73
How do we install import maps in worker/worklet contexts? #2
Description
It's unclear how to apply import maps to a worker. There are essentially three categories of approach I can think of:
- The worker-creator specifies the import map, e.g. with
new Worker(url, { type: "module", importMap: ... })
- The worker itself specifies the import map, e.g. with
self.setImportMap(...)
orimport "map.json" assert { type: "importmap" }
. - The HTTP headers on the worker script specify the import map, e.g.
Import-Map: file.json
or maybe evenImport-Map: { ... a bunch of JSON inlined into the header ... }
.
The worker-creator specified import map is a bit strange:
- It's unlike the Window-context mechanism in that the creator of the realm controls the realm's module resolution, instead of the realm itself
- It's like the Window-context mechanism in that the script that runs in the realm does not control the realm's module resolution; the control is external to the script itself.
Basically, there is no clear translation of <script type="importmap">
into a worker setting.
Also, as pointed out below, anything where the creator controls the import map works poorly for service worker updates.
The worker itself specifying seems basically unworkable, for reasons discussed below.
And the header-based mechanism is hard to develop against and deploy.
Original post, for posterity, including references to the old "package name map" name
We have a sketch of an idea for how to supply a package name map to a worker:
new Worker(someURL, { type: "module", packageMap: ... });
This is interesting to contrast with the mechanism for window contexts proposed currently (and discussed in #1):
- It's unlike the Window-context mechanism in that the creator of the realm controls the realm's module resolution, instead of the realm itself
- It's like the Window-context mechanism in that the script that runs in the realm does not control the realm's module resolution; the control is external to the script itself.
Basically, there is no clear translation of <script type="packagemap">
into a worker setting.
If we went with this, presumably we'd do the same for SharedWorker. Service workers would probably use an option to navigator.serviceWorker.register()
, and have an impact similar to the other options?
For worklets, I guess you'd do something like CSS.paintWorklet.setModuleMap({ ... })
. Only callable once, of course.
In all cases, it would be nice to make it easy to inherit a package name map. With the current tentative proposal you could do
new Worker(url, {
type: "module",
packageMap: JSON.parse(document.querySelector('script[type="packagemap"]').textContent)
});
but this is fairly verbose and a bit wasteful (since the browser has already done all the parsing and processing of the map, and you're making it do that over again). At the same time, inheriting by default seems conceptually weird, since workers are a separate realm.