diff --git a/.changeset/service-worker-module-output.md b/.changeset/service-worker-module-output.md new file mode 100644 index 000000000000..647c0e967432 --- /dev/null +++ b/.changeset/service-worker-module-output.md @@ -0,0 +1,6 @@ +--- +'@modern-js/builder': patch +--- + +fix: respect output.module for service-worker environment output +fix: 在 service-worker 环境中遵循 output.module 输出配置 diff --git a/packages/cli/builder/src/plugins/environmentDefaults.ts b/packages/cli/builder/src/plugins/environmentDefaults.ts index 36cec46f5822..6db582ef4523 100644 --- a/packages/cli/builder/src/plugins/environmentDefaults.ts +++ b/packages/cli/builder/src/plugins/environmentDefaults.ts @@ -85,7 +85,12 @@ export const pluginEnvironmentDefaults = ( const isServiceWorker = environment.name === SERVICE_WORKER_ENVIRONMENT_NAME; - if (isServiceWorker) { + if (isServiceWorker && chain.output.get('module') === true) { + chain.output.library({ + ...(chain.output.get('library') || {}), + type: 'module', + }); + } else if (isServiceWorker) { chain.output.library({ ...(chain.output.get('library') || {}), type: 'commonjs2', diff --git a/packages/cli/builder/tests/environment.test.ts b/packages/cli/builder/tests/environment.test.ts index 3a93e8e473f8..6be6e0bb4991 100644 --- a/packages/cli/builder/tests/environment.test.ts +++ b/packages/cli/builder/tests/environment.test.ts @@ -2,6 +2,7 @@ import { join } from 'path'; import { afterEach, describe, expect, it, rstest } from '@rstest/core'; import { after } from 'lodash'; import { createBuilder } from '../src'; +import { pluginEnvironmentDefaults } from '../src/plugins/environmentDefaults'; describe('builder environment compat', () => { afterEach(() => { @@ -42,4 +43,41 @@ describe('builder environment compat', () => { expect(bundlerConfigs).toMatchSnapshot(); }); + + it('should use module library output when service-worker output module is enabled', async () => { + let handler: ((chain: any, utils: any) => Promise) | undefined; + + pluginEnvironmentDefaults().setup({ + modifyBundlerChain: (registeredHandler: any) => { + handler = + typeof registeredHandler === 'function' + ? registeredHandler + : registeredHandler.handler; + }, + modifyEnvironmentConfig: () => {}, + modifyRsbuildConfig: () => {}, + } as any); + + if (!handler) { + throw new Error('Expected environment defaults bundler-chain handler.'); + } + + const libraryCalls: any[] = []; + const chain = { + output: { + get: (key: string) => (key === 'module' ? true : undefined), + library: (value: any) => { + libraryCalls.push(value); + }, + }, + }; + + await handler(chain, { + environment: { + name: 'workerSSR', + }, + }); + + expect(libraryCalls).toEqual([{ type: 'module' }]); + }); });