fix(hybrid-nodejs-compat): inject modules only once#8191
Conversation
🦋 Changeset detectedLatest commit: 99fd8cf The changes in this PR will be included in the next version bump. This PR includes changesets to release 2 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
|
A wrangler prerelease is available for testing. You can install this latest build in your project with: npm install --save-dev https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/runs/13519060360/npm-package-wrangler-8191You can reference the automatically updated head of this PR with: npm install --save-dev https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/prs/8191/npm-package-wrangler-8191Or you can use npx https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/runs/13519060360/npm-package-wrangler-8191 dev path/to/script.jsAdditional artifacts:cloudflare-workers-bindings-extension: wget https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/runs/13519060360/npm-package-cloudflare-workers-bindings-extension-8191 -O ./cloudflare-workers-bindings-extension.0.0.0-v528e94d6c.vsix && code --install-extension ./cloudflare-workers-bindings-extension.0.0.0-v528e94d6c.vsixcreate-cloudflare: npx https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/runs/13519060360/npm-package-create-cloudflare-8191 --no-auto-update@cloudflare/kv-asset-handler: npm install https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/runs/13519060360/npm-package-cloudflare-kv-asset-handler-8191miniflare: npm install https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/runs/13519060360/npm-package-miniflare-8191@cloudflare/pages-shared: npm install https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/runs/13519060360/npm-package-cloudflare-pages-shared-8191@cloudflare/unenv-preset: npm install https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/runs/13519060360/npm-package-cloudflare-unenv-preset-8191@cloudflare/vite-plugin: npm install https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/runs/13519060360/npm-package-cloudflare-vite-plugin-8191@cloudflare/vitest-pool-workers: npm install https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/runs/13519060360/npm-package-cloudflare-vitest-pool-workers-8191@cloudflare/workers-editor-shared: npm install https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/runs/13519060360/npm-package-cloudflare-workers-editor-shared-8191@cloudflare/workers-shared: npm install https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/runs/13519060360/npm-package-cloudflare-workers-shared-8191@cloudflare/workflows-shared: npm install https://prerelease-registry.devprod.cloudflare.dev/workers-sdk/runs/13519060360/npm-package-cloudflare-workflows-shared-8191Note that these links will no longer work once the GitHub Actions artifact expires.
Please ensure constraints are pinned, and |
3d2c3f7 to
2589173
Compare
petebacondarwin
left a comment
There was a problem hiding this comment.
LGTM with a few nits that you can take a call on.
packages/wrangler/src/deployment-bundle/esbuild-plugins/hybrid-nodejs-compat.ts
Show resolved
Hide resolved
packages/wrangler/src/deployment-bundle/esbuild-plugins/hybrid-nodejs-compat.ts
Outdated
Show resolved
Hide resolved
packages/wrangler/src/deployment-bundle/esbuild-plugins/hybrid-nodejs-compat.ts
Outdated
Show resolved
Hide resolved
packages/wrangler/src/deployment-bundle/esbuild-plugins/hybrid-nodejs-compat.ts
Outdated
Show resolved
Hide resolved
packages/wrangler/src/deployment-bundle/esbuild-plugins/hybrid-nodejs-compat.ts
Outdated
Show resolved
Hide resolved
packages/wrangler/src/deployment-bundle/esbuild-plugins/hybrid-nodejs-compat.ts
Outdated
Show resolved
Hide resolved
|
I wonder if we could build these helpers into our preset package somehow? |
Co-authored-by: Pete Bacon Darwin <pete@bacondarwin.com>
Let's add polyfill (and other potential updates for unenv) and then we can think about sharing this code but it would be great. |
|
Thanks for the review @petebacondarwin. |
This PR makes sure that modules are injected only once before injected all the related values.
You can see the effect for (from the Cloudflare preset):
The generated code before this PR:
and after this PR:
So the first thing is that the code size is reduced - as a data point
init_virtual_unenv_global_polyfill_unenv_runtime_node_console_cloudflare(); / init_virtual_unenv_global_polyfill_unenv_runtime_node_timers_cloudflare();is repeated 106 times in thenodejs-hybrid-apptest.Another benefit (which actually is the reason for which I created this PR) is that you can inject multiple export from the same file when they have a dependency.
For examples, we would like to inject
performanceandPerformancefromperf_hooks. Howeverperformanceneeds to instantiate aPerformanceso there is no way we could initialize with the current code.Let's say
Performanceis injected first fromperf_hooks. Soperf_hookswill be imported. The first thing that module will do (seeinit_utilsabove) would be to inject all the values. It will then try to injectperformancewhich importsperf_hookstoo which result in ESBuild doing nothing (because of the circular dependency) and then it can instantiatePerformancebecause it is undefined.One last benefit is that we would stop using the polyfills (i.e.
init_virtual_unenv_global_polyfill_unenv_runtime_polyfill_performance();) as I think the preferred way is to useinject(the performance polyfill directly adds props onglobalThis)