Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: support output bundler unminified #772

Merged
merged 11 commits into from
Dec 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 41 additions & 4 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 1 addition & 2 deletions src/builder/bundle/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,6 @@ async function bundle(opts: IBundleOpts): Promise<void | IBundleWatcher> {
devtool: config.sourcemap && 'source-map',
externals: config.externals,
outputPath: config.output.path,

// postcss config
extraPostCSSPlugins,
postcssLoader,
Expand All @@ -82,7 +81,7 @@ async function bundle(opts: IBundleOpts): Promise<void | IBundleWatcher> {

// compatible with IE11 by default
targets: getBundleTargets(config),
jsMinifier: JSMinifier.terser,
jsMinifier: config.jsMinifier || JSMinifier.terser,
cssMinifier: CSSMinifier.cssnano,
extraBabelIncludes: [/node_modules/],

Expand Down
114 changes: 81 additions & 33 deletions src/builder/config.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import { JSMinifier } from '@umijs/bundler-webpack/dist/types';
import { winPath } from '@umijs/utils';
import assert from 'assert';
import { Minimatch } from 'minimatch';
import path from 'path';
import { loadConfig } from 'tsconfig-paths';
Expand All @@ -24,6 +26,7 @@ export interface IBundleConfig
Omit<IFatherBundleConfig, 'entry' | 'output'> {
type: IFatherBuildTypes.BUNDLE;
bundler: 'webpack';
jsMinifier: JSMinifier;
entry: string;
output: {
filename: string;
Expand Down Expand Up @@ -111,55 +114,100 @@ export function normalizeUserConfig(
const entryConfig = umd.entry;
const output =
typeof umd.output === 'object' ? umd.output : { path: umd.output };
const bundleConfig: Omit<IBundleConfig, 'entry'> = {
type: IFatherBuildTypes.BUNDLE,
bundler: 'webpack',
...baseConfig,
const bundleConfig: Omit<IBundleConfig, 'entry' | 'output' | 'jsMinifier'> =
{
type: IFatherBuildTypes.BUNDLE,
bundler: 'webpack',
...baseConfig,

// override base configs from umd config
...umd,

// generate default output
output: {
// default to generate filename from package name
filename:
output.filename || `${getAutoBundleFilename(pkg.name)}.min.js`,
Jinbao1001 marked this conversation as resolved.
Show resolved Hide resolved
// default to output dist
path: output.path || 'dist/umd',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这部分还是可以继续放在公共配置里?

},
};
// override base configs from umd config
...umd,
};

if (typeof entryConfig === 'object') {
// extract multiple entries to single configs
Object.keys(entryConfig).forEach((entry) => {
const outputConfig = entryConfig[entry].output;
Object.entries(entryConfig).forEach(([entry, singleConfig]) => {
const outputConfig = singleConfig.output;

const entryOutput =
typeof outputConfig === 'object'
? outputConfig
: { path: outputConfig };
assert(
!(
singleConfig.generateUnminified &&
entryOutput.filename?.includes('.min')
),
'if set generateUnminified enabled, you need to delete ".min" in the output filename config',
);

configs.push({
const minifiedConfig = {
...bundleConfig,

// override all configs from entry config
...entryConfig[entry],
...singleConfig,
entry,

// override output
jsMinifier: JSMinifier.terser,
output: {
filename:
entryOutput.filename || `${path.parse(entry).name}.min.js`,
path: entryOutput.path || bundleConfig.output.path,
filename: entryOutput.filename
? entryOutput.filename.replace(
/(\.js)?$/,
singleConfig.generateUnminified ? '.min.js' : '.js',
)
: `${path.parse(entry).name}.min.js`,
path: entryOutput.path || output.path || 'dist/umd',
},
});
};

if (singleConfig.generateUnminified) {
const unminifiedConfig = {
...bundleConfig,
...singleConfig,
entry,
jsMinifier: JSMinifier.none,
sourcemap: false,
output: {
filename: entryOutput.filename || `${path.parse(entry).name}.js`,
path: entryOutput.path || output.path || 'dist/umd',
},
};
configs.push(unminifiedConfig, minifiedConfig);
} else {
configs.push(minifiedConfig);
}
});
} else {
// generate single entry to single config
const defaultEntry = entryConfig || 'src/index';
const defaultFileName = getAutoBundleFilename(pkg.name);
if (umd.generateUnminified) {
assert(
!output.filename?.includes('.min'),
'if set generateUnminified enabled, you need to delete ".min" in the output filename config',
);
configs.push({
...bundleConfig,
entry: defaultEntry,
jsMinifier: JSMinifier.none,
sourcemap: false,
output: {
filename: output.filename
? `${output.filename}`
: `${defaultFileName}.js`,
path: output.path || 'dist/umd',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个默认值还是写了多次;可以 bundlerConfig.output.path 有个默认值,后续各配置生成的时候优先取配置里的,兜底到默认值

},
});
}

configs.push({
...bundleConfig,

// default to bundle src/index
entry: entryConfig || 'src/index',
entry: defaultEntry,
jsMinifier: JSMinifier.terser,
output: {
filename: output.filename
? output.filename.replace(
/(\.js)?$/,
umd.generateUnminified ? '.min.js' : '.js',
)
: `${defaultFileName}.min.js`,
path: output.path || 'dist/umd',
},
});
}
}
Expand Down
1 change: 1 addition & 0 deletions src/features/configPlugins/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ export function getSchemas(): Record<string, (Joi: Root) => any> {
Joi.string(),
Joi.array(),
),
generateUnminified: Joi.boolean().optional(),
chainWebpack: Joi.function().optional(),
extractCSS: Joi.boolean().optional(),
name: Joi.string().optional(),
Expand Down
7 changes: 7 additions & 0 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,13 @@ export interface IFatherBundleConfig extends IFatherBaseConfig {
* configure less variables
*/
theme?: Record<string, string>;

/**
* output unminified js file
* @default false
* @note When set to true, unminified js file will be generated in the same directory without sourcemap.
*/
generateUnminified?: boolean;
}

export interface IFatherPreBundleConfig {
Expand Down
Loading