Skip to content

Commit 8d4f0f5

Browse files
add Wrangler 'find_additional_modules' documentation
1 parent ee8ebed commit 8d4f0f5

File tree

2 files changed

+63
-20
lines changed

2 files changed

+63
-20
lines changed

src/content/docs/workers/wrangler/bundling.mdx

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,28 @@ pcx_content_type: configuration
33
title: Bundling
44
head: []
55
description: Review Wrangler's default bundling.
6-
76
---
87

98
By default, Wrangler bundles your Worker code using [`esbuild`](https://esbuild.github.io/). This means that Wrangler has built-in support for importing modules from [npm](https://www.npmjs.com/) defined in your `package.json`. To review the exact code that Wrangler will upload to Cloudflare, run `npx wrangler deploy --dry-run --outdir dist`, which will show your Worker code after Wrangler's bundling.
109

1110
:::note
1211

13-
We recommend using Wrangler's inbuilt bundling, but we understand there are cases where you will need more flexibility. We have built an escape hatch in the form of [Custom Builds](/workers/wrangler/custom-builds/), which lets you run your own build before Wrangler's built-in one.
12+
Wrangler's inbuilt bundling usually provides the best experience, but we understand there are cases where you will need more flexibility.
13+
You can provide `rules` and set `find_additional_modules` in your configuration to control which files are included in the deployed Worker but not bundled into the entry-point file.
14+
Furthermore, we have an escape hatch in the form of [Custom Builds](/workers/wrangler/custom-builds/), which lets you run your own build before Wrangler's built-in one.
1415
:::
1516

16-
## Files which will not be bundled
17+
## Including non-JavaScript modules
1718

18-
Bundling your Worker code takes multiple modules and bundles them into one. Sometimes, you might have modules that should not be inlined directly into the bundle. For example, instead of bundling a Wasm file into your JavaScript Worker, you would want to upload the Wasm file as a separate module that can be imported at runtime. Wrangler supports this for the following file types:
19+
Bundling your Worker code takes multiple modules and bundles them into one file.
20+
Sometimes, you might have modules that cannot be inlined directly into the bundle.
21+
For example, instead of bundling a Wasm file into your JavaScript Worker, you would want to upload the Wasm file as a separate module that can be imported at runtime.
22+
Wrangler supports this for the following file types:
1923

20-
* `.txt`
21-
* `.html`
22-
* `.bin`
23-
* `.wasm` and `.wasm?module`
24+
- `.txt`
25+
- `.html`
26+
- `.bin`
27+
- `.wasm` and `.wasm?module`
2428

2529
Refer to [Bundling configuration](/workers/wrangler/configuration/#bundling) to customize these file types.
2630

@@ -37,17 +41,30 @@ import wasm from "./example.wasm"; // Where `example.wasm` is a file in your loc
3741
const instance = await WebAssembly.instantiate(wasm); // Instantiate Wasm modules in global scope, not within the fetch() handler
3842

3943
export default {
40-
fetch(request) {
41-
const result = instance.exports.exported_func();
42-
},
44+
fetch(request) {
45+
const result = instance.exports.exported_func();
46+
},
4347
};
4448
```
4549

4650
:::caution
4751

48-
Cloudflare Workers does not support `WebAssembly.instantiateStreaming()`.
52+
Cloudflare Workers does not support `WebAssembly.instantiateStreaming()`.
4953
:::
5054

55+
## Find additional modules
56+
57+
By setting `find_additional_modules` to `true` in your configuration file, Wrangler will traverse the file tree below `base_dir`.
58+
Any files that match the `rules` you define will also be included as unbundled, external modules in the deployed Worker.
59+
60+
This approach is useful for supporting lazy loading of large or dynamically imported JavaScript files:
61+
62+
- Normally a large lazy imported file (e.g. `await import("./large-dep.mjs")`) would be bundled directly into your entrypoint, making lazy loading less effective.
63+
If matching rule is added to `rules`, then this file would only be loaded and executed at runtime when it is actually imported.
64+
- Previously, variable based dynamic imports (e.g. ``await import(`./lang/${language}.mjs`)``) would always fail at runtime, as Wrangler would have no way of knowing which modules to include in the upload.
65+
Providing a rule that matches all these files (e.g. ` { type = "EsModule", globs = ["./land/**/*.mjs"], fallthrough = true }), will ensure this module is available at runtime.
66+
- "Partial bundling" is supported when `find_additional_modules` is `true`, and a source file matches one of the configured `rules`, since Wrangler will then treat it as "external" and not try to bundle it into the entry-point file.
67+
5168
## Conditional exports
5269

5370
Wrangler respects the [conditional `exports` field](https://nodejs.org/api/packages.html#conditional-exports) in `package.json`. This allows developers to implement isomorphic libraries that have different implementations depending on the JavaScript runtime they are running in. When bundling, Wrangler will try to load the [`workerd` key](https://runtime-keys.proposal.wintercg.org/#workerd). Refer to the Wrangler repository for [an example isomorphic package](https://github.com/cloudflare/workers-sdk/tree/main/fixtures/isomorphic-random-example).
@@ -56,7 +73,7 @@ Wrangler respects the [conditional `exports` field](https://nodejs.org/api/packa
5673

5774
:::caution
5875

59-
Disabling bundling is not recommended in most scenarios. Use this option only when deploying code pre-processed by other tooling.
76+
Disabling bundling is not recommended in most scenarios. Use this option only when deploying code pre-processed by other tooling.
6077
:::
6178

6279
If your build tooling already produces build artifacts suitable for direct deployment to Cloudflare, you can opt out of bundling by using the `--no-bundle` command line flag: `npx wrangler deploy --no-bundle`. If you opt out of bundling, Wrangler will not process your code and some features introduced by Wrangler bundling (for example minification, and polyfills injection) will not be available.

src/content/docs/workers/wrangler/configuration.mdx

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -132,22 +132,33 @@ At a minimum, the `name`, `main` and `compatibility_date` keys are required to d
132132

133133
- Skip internal build steps and directly deploy your Worker script. You must have a plain JavaScript Worker with no dependencies.
134134

135-
- `minify` <Type text="boolean" /> <MetaInfo text="optional" />
135+
- `find_additional_modules` <Type text="boolean" /> <MetaInfo text="optional" />
136136

137-
- Minify the Worker script before uploading.
137+
- If true then Wrangler will traverse the file tree below `base_dir`.
138+
Any files that match `rules` will be included in the deployed Worker.
139+
Defaults to true if `no_bundle` is true, otherwise false.
140+
Can only be used with Module format workers (not Service Worker format).
138141

139-
- `node_compat` <Type text="boolean" /> <MetaInfo text="optional" />
142+
- `base_dir` <Type text="string" /> <MetaInfo text="optional" />
140143

141-
- Deprecated — Instead, [enable the `nodejs_compat_v2` compatibility flag](/workers/runtime-apis/nodejs/#enable-nodejs-with-workers), which enables both built-in Node.js APIs, and adds polyfills as necessary.
142-
Setting `node_compat = true` will add polyfills for Node.js built-in modules and globals to your Worker's code, when bundled with Wrangler.
143-
This is powered by `@esbuild-plugins/node-globals-polyfill` which in itself is powered by [rollup-plugin-node-polyfills](https://github.com/ionic-team/rollup-plugin-node-polyfills/).
144+
- The directory in which module "rules" should be evaluated when including additional files (via `find_additional_modules`) into a Worker deployment. Defaults to the directory containing the `main` entry point of the Worker if not specified.
144145

145146
- `preserve_file_names` <Type text="boolean" /> <MetaInfo text="optional" />
146147

147148
- Determines whether Wrangler will preserve the file names of additional modules bundled with the Worker.
148149
The default is to prepend filenames with a content hash.
149150
For example, `34de60b44167af5c5a709e62a4e20c4f18c9e3b6-favicon.ico`.
150151

152+
- `minify` <Type text="boolean" /> <MetaInfo text="optional" />
153+
154+
- Minify the Worker script before uploading.
155+
156+
- `node_compat` <Type text="boolean" /> <MetaInfo text="optional" />
157+
158+
- Deprecated — Instead, [enable the `nodejs_compat_v2` compatibility flag](/workers/runtime-apis/nodejs/#enable-nodejs-with-workers), which enables both built-in Node.js APIs, and adds polyfills as necessary.
159+
Setting `node_compat = true` will add polyfills for Node.js built-in modules and globals to your Worker's code, when bundled with Wrangler.
160+
This is powered by `@esbuild-plugins/node-globals-polyfill` which in itself is powered by [rollup-plugin-node-polyfills](https://github.com/ionic-team/rollup-plugin-node-polyfills/).
161+
151162
- `logpush` <Type text="boolean" /> <MetaInfo text="optional" />
152163

153164
- Enables Workers Trace Events Logpush for a Worker. Any scripts with this property will automatically get picked up by the Workers Logpush job configured for your account. Defaults to `false`.
@@ -942,7 +953,13 @@ assets = { directory = "./public", binding = "ASSETS", html_handling = "force-tr
942953

943954
## Bundling
944955

945-
You can bundle modules into your Worker using the `rules` key, making these modules available to be imported when your Worker is invoked. The `rules` key will be an array of the below object.
956+
Wrangler can operate in two modes: the default bundling mode and `--no-bundle` mode.
957+
In bundling mode, Wrangler will traverse all the imports of your code and generate a single JavaScript "entry-point" file.
958+
Imported source code is "inlined/bundled" into this entry-point file.
959+
960+
It is also possible to include additional modules into your Worker, which are uploaded alongside the entry-point.
961+
You specify which additional modules should be included into your Worker using the `rules` key, making these modules available to be imported when your Worker is invoked.
962+
The `rules` key will be an array of the below object.
946963

947964
- `type` <Type text="string" /> <MetaInfo text="required" />
948965

@@ -978,6 +995,15 @@ export default {
978995
};
979996
```
980997

998+
### Find additional modules
999+
1000+
Normally Wrangler will only include additional modules that are statically imported in your source code as in the example above.
1001+
By setting `find_additional_modules` to `true` in your configuration file, Wrangler will traverse the file tree below `base_dir`.
1002+
Any files that match `rules` will also be included as unbundled, external modules in the deployed Worker.
1003+
`base_dir` defaults to the directory containing your `main` entrypoint.
1004+
1005+
See https://developers.cloudflare.com/workers/wrangler/bundling/ for more details and examples.
1006+
9811007
## Local development settings
9821008

9831009
You can configure various aspects of local development, such as the local protocol or port.

0 commit comments

Comments
 (0)