-
Notifications
You must be signed in to change notification settings - Fork 17
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Customizing import.meta
#159
Comments
To give a bit more of context, it's already possible to customize But I agree it's worth discussing, and if someone wanted to implement that, it would probably be well received. |
Hey, i'm working on a small library to have some sort of "HMR" with Node ( using the query params hack in the import path ) and I met this need today, so I wanted to share my use case I need to add two methods in So to do this, I ended up injecting code via the I think, if an API is proposed, it should also be possible to access other properties in // loader.ts
// Let's say we can do that from a `load` hook
export const load: LoadHook = (url, context, nextLoad) => {
// maybe using the `context` property? I am not super aware of Nodejs internals
// so this is probably a dumb idea
context.initializeImportMeta(importMeta => {
return {
hot: {
dispose: () => {
// I can access the `import.meta` content through `importMeta`
myFunction(importMeta.url)
},
decline: () => {
myFunction(importMeta.url)
}
}
}
})
} So having an API for that would allow us to avoid doing code transformations and breaking source maps. Using |
@GeoffreyBooth @joyeecheung (et al) I wanted to get your opinion on this: Re: nodejs/node#54769 & 3ac5b49d85e4edb9efc7a64e880403d3182bf64c This commit removes I'm certainly happy to submit a PR but it occurs to me that there may be other plans for |
(Unrelated to the above comment) @Julien-R44 hot-hook looks cool. I made dynohot which implements similar behavior. I've implemented the linking algorithm from the JS modules specification in the loader runtime so we can hot reload without any explicit boundary. And, for example, if module A depends on module B and module B is reloaded, you don't have to reload module A. |
I feel like users should be able to customize
import.meta
. For example, nodejs/node#48740 might very well land in core sometime soon, but it also feels like something that should be achievable via the module customization hooks. Likewise forimport.meta.resolveURL
, a version ofimport.meta.resolve
that returns an URL instance instead of a string.I assume this can be done already today by prepending some code into the source returned by the
load
hook, kind of like adding a polyfill but it’s one that runs for every module. Though I suppose if we create a new hook, that would also run for every module, so the performance impact is the same?There’s also the question of adding functions/methods to
import.meta
. Say we create a newimportMeta
hook, with a signature likeimportMeta(url, context, next)
. If this runs on the separate thread with all the other hooks, what happens when the return value of the user’s hook has a function on it, likeresolveURL
? We can’t transfer that across the thread boundary, can we? Is there some other way to make this work, like making the return value ofimportMeta
be a string to evaluate on the main thread; but if we do that, it’s pretty much the same as prepending toload
, I’d think. Are there other approaches?Maybe in the end the “prepend to
load
“ approach is the best one, and we should perhaps add an example to the docs. But I thought that this should get some discussion.The text was updated successfully, but these errors were encountered: