diff --git a/docs/config.md b/docs/config.md index ae7b3408..fd3daf7e 100644 --- a/docs/config.md +++ b/docs/config.md @@ -201,10 +201,10 @@ export default { #### output -- 类型:`string` +- 类型:`string` | `{ path?: string; filename?: string }` - 默认值:`dist/umd` -指定产物的输出目录,输出文件名暂不支持配置,单 `entry` 时默认以 NPM 包名命名、多 `entry` 时默认与源码文件同名。 +指定产物的输出目录及输出文件名,输出目录的默认值为 `dist/umd`,输出文件名在单 `entry` 时默认以 NPM 包名命名、多 `entry` 时默认与源码文件同名。 #### externals @@ -238,7 +238,7 @@ export default { ```ts export default { theme: { 'primary-color': '#1890ff' }, -} +}; ``` ### prebundle diff --git a/src/builder/config.ts b/src/builder/config.ts index 20e3e97e..5cddea80 100644 --- a/src/builder/config.ts +++ b/src/builder/config.ts @@ -40,7 +40,7 @@ export interface IBundlessConfig type: IFatherBuildTypes.BUNDLESS; format: IFatherBundlessTypes; input: string; - output: NonNullable; + output: NonNullable; } /** @@ -108,6 +108,8 @@ export function normalizeUserConfig( // normalize umd config if (umd) { const entryConfig = umd.entry; + const output = + typeof umd.output === 'object' ? umd.output : { path: umd.output }; const bundleConfig: Omit = { type: IFatherBuildTypes.BUNDLE, bundler: 'webpack', @@ -119,15 +121,22 @@ export function normalizeUserConfig( // generate default output output: { // default to generate filename from package name - filename: `${getAutoBundleFilename(pkg.name)}.min.js`, + filename: + output.filename || `${getAutoBundleFilename(pkg.name)}.min.js`, // default to output dist - path: umd.output || 'dist/umd', + path: output.path || 'dist/umd', }, }; if (typeof entryConfig === 'object') { // extract multiple entries to single configs Object.keys(entryConfig).forEach((entry) => { + const outputConfig = entryConfig[entry].output; + const entryOutput = + typeof outputConfig === 'object' + ? outputConfig + : { path: outputConfig }; + configs.push({ ...bundleConfig, @@ -137,8 +146,9 @@ export function normalizeUserConfig( // override output output: { - filename: `${path.parse(entry).name}.min.js`, - path: entryConfig[entry].output || bundleConfig.output.path, + filename: + entryOutput.filename || `${path.parse(entry).name}.min.js`, + path: entryOutput.path || bundleConfig.output.path, }, }); }); diff --git a/src/features/configPlugins/schema.ts b/src/features/configPlugins/schema.ts index 28286b48..3e577509 100644 --- a/src/features/configPlugins/schema.ts +++ b/src/features/configPlugins/schema.ts @@ -57,7 +57,7 @@ export function getSchemas(): Record any> { entry: Joi.alternatives() .try(Joi.string(), Joi.object().pattern(Joi.string(), Joi.object())) .optional(), - output: Joi.string().optional(), + output: Joi.alternatives().try(Joi.string(), Joi.object()).optional(), externals: Joi.alternatives().try( Joi.object(), Joi.string(), diff --git a/src/types.ts b/src/types.ts index 8b51d32f..de9930a4 100644 --- a/src/types.ts +++ b/src/types.ts @@ -5,9 +5,9 @@ import type { IConfig as IBundlerWebpackConfig } from '@umijs/bundler-webpack/di import type { IAdd, IModify, IServicePluginAPI, PluginAPI } from '@umijs/core'; import type { ITransformerItem } from './builder/bundless/loaders/javascript'; import type { + createConfigProviders, IBundleConfig, IBundlessConfig, - createConfigProviders, } from './builder/config'; import type { IDoctorReport } from './doctor'; import type { IDoctorSourceParseResult } from './doctor/parser'; @@ -175,7 +175,7 @@ export interface IFatherBundleConfig extends IFatherBaseConfig { * bundle output path * @default dist/umd */ - output?: string; + output?: string | { path?: string; filename?: string }; /** * extract CSS diff --git a/tests/fixtures/build/bundle-output-filename/.fatherrc.ts b/tests/fixtures/build/bundle-output-filename/.fatherrc.ts new file mode 100644 index 00000000..fd82fbe9 --- /dev/null +++ b/tests/fixtures/build/bundle-output-filename/.fatherrc.ts @@ -0,0 +1,18 @@ +import { defineConfig } from '../../../../src'; + +export default defineConfig({ + umd: { + output: { + path: 'nothing', + filename: 'nothing.js', + }, + entry: { + 'src/index': { + output: { + path: 'dist/abc', + filename: 'index.umd.min.js', + }, + }, + }, + }, +}); diff --git a/tests/fixtures/build/bundle-output-filename/expect.ts b/tests/fixtures/build/bundle-output-filename/expect.ts new file mode 100644 index 00000000..c211d3c4 --- /dev/null +++ b/tests/fixtures/build/bundle-output-filename/expect.ts @@ -0,0 +1,3 @@ +export default (files: Record) => { + expect(files['abc/index.umd.min.js']).not.toBeUndefined(); +}; diff --git a/tests/fixtures/build/bundle-output-filename/package.json b/tests/fixtures/build/bundle-output-filename/package.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/tests/fixtures/build/bundle-output-filename/package.json @@ -0,0 +1 @@ +{} diff --git a/tests/fixtures/build/bundle-output-filename/src/index.ts b/tests/fixtures/build/bundle-output-filename/src/index.ts new file mode 100644 index 00000000..eef0eaea --- /dev/null +++ b/tests/fixtures/build/bundle-output-filename/src/index.ts @@ -0,0 +1,4 @@ +let umdDemo = { + hello: 'hello father', +}; +export default umdDemo;