Skip to content

Commit bf897f4

Browse files
authored
feat!: support --lib param of mf-dev command (#590)
1 parent 4066395 commit bf897f4

File tree

38 files changed

+382
-171
lines changed

38 files changed

+382
-171
lines changed

examples/module-federation/mf-react-component/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"types": "./dist/cjs/index.d.ts",
1414
"scripts": {
1515
"build": "rslib build",
16-
"dev": "rslib mf dev",
16+
"dev": "rslib mf-dev",
1717
"serve": "pnpm build & http-server -p 3001 ./dist/ --cors",
1818
"storybook": "storybook dev -p 6006"
1919
},

examples/module-federation/mf-react-component/rslib.config.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,6 @@ export default defineConfig({
3434
dev: {
3535
assetPrefix: 'http://localhost:3001/mf',
3636
},
37-
// just for dev
38-
server: {
39-
port: 3001,
40-
},
4137
plugins: [
4238
pluginModuleFederation({
4339
name: 'rslib_provider',
@@ -56,5 +52,9 @@ export default defineConfig({
5652
],
5753
},
5854
],
55+
// just for dev
56+
server: {
57+
port: 3001,
58+
},
5959
plugins: [pluginReact()],
6060
});

packages/core/src/asset/assetConfig.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import type { RsbuildConfig } from '@rsbuild/core';
1+
import type { EnvironmentConfig } from '@rsbuild/core';
22
import type { Format } from '../types';
33

44
// TODO: asset config document
55
export const composeAssetConfig = (
66
bundle: boolean,
77
format: Format,
8-
): RsbuildConfig => {
8+
): EnvironmentConfig => {
99
if (format === 'esm' || format === 'cjs') {
1010
if (bundle) {
1111
return {

packages/core/src/cli/build.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,15 @@ import { onBeforeRestart } from './restart';
66

77
export async function build(
88
config: RslibConfig,
9-
options: Pick<BuildOptions, 'lib' | 'watch'> = {},
9+
options: Pick<BuildOptions, 'lib' | 'watch' | 'root'> = {},
1010
): Promise<RsbuildInstance> {
11-
const environments = await composeRsbuildEnvironments(config);
11+
const { environments } = await composeRsbuildEnvironments(config);
1212
const rsbuildInstance = await createRsbuild({
1313
rsbuildConfig: {
14+
mode: 'production',
15+
root: config.root,
1416
plugins: config.plugins,
17+
dev: config.dev,
1518
server: config.server,
1619
environments: pruneEnvironments(environments, options.lib),
1720
},

packages/core/src/cli/commands.ts

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,12 @@ const applyCommonOptions = (command: Command) => {
3939
'--env-mode <mode>',
4040
'specify the env mode to load the `.env.[mode]` file',
4141
)
42-
.option('--env-dir <dir>', 'specify the directory to load `.env` files');
42+
.option('--env-dir <dir>', 'specify the directory to load `.env` files')
43+
.option(
44+
'--lib <id>',
45+
'specify the library (repeatable, e.g. --lib esm --lib cjs)',
46+
repeatableOption,
47+
);
4348
};
4449

4550
const repeatableOption = (value: string, previous: string[]) => {
@@ -51,16 +56,11 @@ export function runCli(): void {
5156

5257
const buildCommand = program.command('build');
5358
const inspectCommand = program.command('inspect');
54-
const mfDevCommand = program.command('mf dev');
59+
const mfDevCommand = program.command('mf-dev');
5560

5661
[buildCommand, inspectCommand, mfDevCommand].forEach(applyCommonOptions);
5762

5863
buildCommand
59-
.option(
60-
'--lib <id>',
61-
'build the specified library (may be repeated)',
62-
repeatableOption,
63-
)
6464
.option('-w --watch', 'turn on watch mode, watch for changes and rebuild')
6565
.description('build the library for production')
6666
.action(async (options: BuildOptions) => {
@@ -87,11 +87,6 @@ export function runCli(): void {
8787

8888
inspectCommand
8989
.description('inspect the Rsbuild / Rspack configs of Rslib projects')
90-
.option(
91-
'--lib <id>',
92-
'inspect the specified library (may be repeated)',
93-
repeatableOption,
94-
)
9590
.option(
9691
'--output <output>',
9792
'specify inspect content output path',
@@ -121,8 +116,9 @@ export function runCli(): void {
121116
try {
122117
const cliMfDev = async () => {
123118
const { config, watchFiles } = await init(options);
124-
// TODO: support lib option in mf dev server
125-
await startMFDevServer(config);
119+
await startMFDevServer(config, {
120+
lib: options.lib,
121+
});
126122

127123
watchFilesForRestart(watchFiles, async () => {
128124
await cliMfDev();
@@ -131,7 +127,7 @@ export function runCli(): void {
131127

132128
await cliMfDev();
133129
} catch (err) {
134-
logger.error('Failed to start mf dev.');
130+
logger.error('Failed to start mf-dev.');
135131
logger.error(err);
136132
process.exit(1);
137133
}

packages/core/src/cli/inspect.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@ export async function inspect(
77
config: RslibConfig,
88
options: Pick<InspectOptions, 'lib' | 'mode' | 'output' | 'verbose'> = {},
99
): Promise<RsbuildInstance> {
10-
const environments = await composeRsbuildEnvironments(config);
10+
const { environments } = await composeRsbuildEnvironments(config);
1111
const rsbuildInstance = await createRsbuild({
1212
rsbuildConfig: {
13+
mode: 'production',
14+
root: config.root,
1315
plugins: config.plugins,
16+
dev: config.dev,
1417
server: config.server,
1518
environments: pruneEnvironments(environments, options.lib),
1619
},

packages/core/src/cli/mf.ts

Lines changed: 43 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,63 @@
1-
import { createRsbuild, mergeRsbuildConfig } from '@rsbuild/core';
2-
import type { RsbuildConfig, RsbuildInstance } from '@rsbuild/core';
3-
import { composeCreateRsbuildConfig } from '../config';
1+
import { createRsbuild } from '@rsbuild/core';
2+
import type { RsbuildInstance } from '@rsbuild/core';
3+
import { composeRsbuildEnvironments, pruneEnvironments } from '../config';
44
import type { RslibConfig } from '../types';
5+
import type { CommonOptions } from './commands';
56
import { onBeforeRestart } from './restart';
67

78
export async function startMFDevServer(
89
config: RslibConfig,
10+
options: Pick<CommonOptions, 'lib'> = {},
911
): Promise<RsbuildInstance | undefined> {
10-
const rsbuildInstance = await initMFRsbuild(config);
12+
const rsbuildInstance = await initMFRsbuild(config, options);
1113
return rsbuildInstance;
1214
}
1315

1416
async function initMFRsbuild(
15-
rslibConfig: RslibConfig,
17+
config: RslibConfig,
18+
options: Pick<CommonOptions, 'lib'> = {},
1619
): Promise<RsbuildInstance | undefined> {
17-
const rsbuildConfigObject = await composeCreateRsbuildConfig(rslibConfig);
18-
const mfRsbuildConfig = rsbuildConfigObject.find(
19-
(config) => config.format === 'mf',
20-
);
20+
const { environments, environmentWithInfos } =
21+
await composeRsbuildEnvironments(config);
2122

22-
if (!mfRsbuildConfig) {
23-
// no mf format, return.
24-
return;
23+
const selectedEnvironmentIds = environmentWithInfos
24+
.filter((env) => {
25+
const isMf = env.format === 'mf';
26+
if (!options?.lib) {
27+
return isMf;
28+
}
29+
return env.id && options.lib.includes(env.id);
30+
})
31+
.map((env) => env.id);
32+
33+
if (!selectedEnvironmentIds.length) {
34+
throw new Error('No mf format found, please check your config.');
2535
}
2636

27-
mfRsbuildConfig.config = changeEnvToDev(mfRsbuildConfig.config);
37+
const selectedEnvironments = pruneEnvironments(
38+
environments,
39+
selectedEnvironmentIds,
40+
);
2841

2942
const rsbuildInstance = await createRsbuild({
3043
rsbuildConfig: {
31-
...mfRsbuildConfig.config,
32-
plugins: [
33-
...(rslibConfig.plugins || []),
34-
...(mfRsbuildConfig.config.plugins || []),
35-
],
36-
server: mergeRsbuildConfig(
37-
rslibConfig.server,
38-
mfRsbuildConfig.config.server,
39-
),
44+
mode: 'development',
45+
root: config.root,
46+
plugins: config.plugins,
47+
dev: {
48+
...(config.dev ?? {}),
49+
writeToDisk: true,
50+
},
51+
server: config.server,
52+
tools: {
53+
rspack: {
54+
optimization: {
55+
nodeEnv: 'development',
56+
moduleIds: 'named',
57+
},
58+
},
59+
},
60+
environments: selectedEnvironments,
4061
},
4162
});
4263

@@ -45,20 +66,3 @@ async function initMFRsbuild(
4566
onBeforeRestart(devServer.server.close);
4667
return rsbuildInstance;
4768
}
48-
49-
function changeEnvToDev(rsbuildConfig: RsbuildConfig) {
50-
return mergeRsbuildConfig(rsbuildConfig, {
51-
mode: 'development',
52-
dev: {
53-
writeToDisk: true,
54-
},
55-
tools: {
56-
rspack: {
57-
optimization: {
58-
nodeEnv: 'development',
59-
moduleIds: 'named',
60-
},
61-
},
62-
},
63-
});
64-
}

0 commit comments

Comments
 (0)