type Entry = Record<
string,
string | string[] | (Rspack.EntryDescription & { html?: boolean })
>;
const defaultEntry = {
// Rsbuild also supports other suffixes by default, such as ts, tsx, jsx, mts, cts, mjs, cjs
index: './src/index.js',
};
Set the entry modules for building.
source.entry
is an object where the key is the entry name and the value is the path of the entry module or a description object.
If the value is a path, it can be an absolute path or a relative path. Relative paths will be resolved based on root.
Rsbuild will register html-rspack-plugin for each entry in source.entry
and generate the corresponding HTML files.
export default {
source: {
entry: {
foo: './src/pages/foo/index.ts', // generate foo.html
bar: './src/pages/bar/index.ts', // generate bar.html
},
},
};
The generated directory structure is as follows:
.
├── foo.html
├── bar.html
└── static
├── css
│ ├── foo.css
│ └── bar.css
└── js
├── foo.js
└── bar.js
If you do not need to generate HTML files:
false
in the entry description object to disable the HTML generation for a single entry.false
to disable the HTML generation for all entries.source.entry
also supports Rspack's entry description object. For example:
export default {
source: {
entry: {
foo: {
import: './src/foo.js',
runtime: 'foo',
},
bar: {
import: './src/bar.js',
runtime: 'bar',
},
},
},
};
html
propertyRsbuild has added an html
property to the description object that controls whether an HTML file is generated.
For example, the bar
entry does not generate an HTML file:
export default {
source: {
entry: {
foo: './src/foo.js',
bar: {
import: './src/bar.js',
html: false,
},
},
},
};
In the above example, foo.html
will be generated, while bar.html
will not be generated.
For detailed usage of the description object, refer to Rspack - Entry description object.
When you build for multiple environments, you can set different entry for each environment:
For example, set different entry for web
and node
environments:
export default {
environments: {
web: {
source: {
entry: {
index: './src/index.client.js',
},
},
output: {
target: 'web',
},
},
node: {
source: {
entry: {
index: './src/index.server.js',
},
},
output: {
target: 'node',
},
},
},
};
To set entry asynchronously, for example, use glob to scan the directory, you can export an async function in rsbuild.config.ts
:
import path from 'node:path';
import { glob } from 'glob';
import { defineConfig } from '@rsbuild/core';
export default defineConfig(async () => {
const entryFiles = await glob('./src/**/main.{ts,tsx,js,jsx}');
const entry = Object.fromEntries(
entryFiles.map((file) => {
const entryName = path.basename(path.dirname(file));
return [entryName, `./${file}`];
}),
);
return {
source: {
entry: entry,
},
};
});