Skip to content
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
3 changes: 2 additions & 1 deletion e2e/cases/legal-comments/index.test.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { expect, test } from '@playwright/test';
import { build, getHrefByEntryName } from '@scripts/shared';
import { rspackOnlyTest } from '@scripts/helper';
import { pluginReact } from '@rsbuild/plugin-react';

const fixtures = __dirname;

test('legalComments linked (default)', async ({ page }) => {
rspackOnlyTest('legalComments linked (default)', async ({ page }) => {
const rsbuild = await build({
cwd: fixtures,
runServer: true,
Expand Down
44 changes: 18 additions & 26 deletions packages/compat/plugin-swc/src/minimizer.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
import { webpack } from '@rsbuild/webpack';
import { merge } from 'lodash';
import { logger } from '@rsbuild/core';
import { color, type RsbuildConfig } from '@rsbuild/shared';
import {
Output,
JsMinifyOptions,
CssMinifyOptions,
TerserCompressOptions,
} from './types';
color,
getSwcMinimizerOptions,
type NormalizedConfig,
} from '@rsbuild/shared';
import { Output, JsMinifyOptions, CssMinifyOptions } from './types';
import { minify, minifyCss } from './binding';
import { CSS_REGEX, JS_REGEX } from './constants';

Expand All @@ -34,13 +33,11 @@ export class SwcMinimizerPlugin {

private name: string = 'swc-minimizer-plugin';

constructor(
options: {
jsMinify?: boolean | JsMinifyOptions;
cssMinify?: boolean | CssMinifyOptions;
rsbuildConfig?: RsbuildConfig;
} = {},
) {
constructor(options: {
jsMinify?: boolean | JsMinifyOptions;
cssMinify?: boolean | CssMinifyOptions;
rsbuildConfig: NormalizedConfig;
}) {
this.minifyOptions = {
jsMinify: merge(
this.getDefaultJsMinifyOptions(options.rsbuildConfig),
Expand All @@ -50,21 +47,16 @@ export class SwcMinimizerPlugin {
};
}

getDefaultJsMinifyOptions(rsbuildConfig?: RsbuildConfig): JsMinifyOptions {
const compressOptions: TerserCompressOptions = {};
const { removeConsole } = rsbuildConfig?.performance || {};

if (removeConsole === true) {
compressOptions.drop_console = true;
} else if (Array.isArray(removeConsole)) {
const pureFuncs = removeConsole.map((method) => `console.${method}`);
compressOptions.pure_funcs = pureFuncs;
}

return {
compress: compressOptions,
getDefaultJsMinifyOptions(rsbuildConfig: NormalizedConfig): JsMinifyOptions {
const options = {
...getSwcMinimizerOptions(rsbuildConfig),
mangle: true,
};

// extractComments not supported yet
delete options.extractComments;

return options;
}

apply(compiler: webpack.Compiler): void {
Expand Down
1 change: 0 additions & 1 deletion packages/compat/plugin-swc/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ export type {
Output,
TransformConfig,
JsMinifyOptions,
TerserCompressOptions,
} from '@modern-js/swc-plugins';

export type OuterExtensions = Omit<Extensions, 'ssrLoaderId' | 'configRoutes'>;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -488,6 +488,9 @@ exports[`plugin-swc > should set correct swc minimizer options in production 1`]
"cssMinify": {},
"jsMinify": {
"compress": false,
"format": {
"asciiOnly": true,
},
"mangle": false,
},
},
Expand All @@ -505,6 +508,9 @@ exports[`plugin-swc > should set correct swc minimizer options using raw swc con
"cssMinify": {},
"jsMinify": {
"compress": false,
"format": {
"asciiOnly": true,
},
"mangle": false,
},
},
Expand Down Expand Up @@ -701,7 +707,9 @@ exports[`plugin-swc > should set swc minimizer in production 1`] = `
"minifyOptions": {
"cssMinify": {},
"jsMinify": {
"compress": {},
"format": {
"asciiOnly": true,
},
"mangle": true,
},
},
Expand Down
9 changes: 8 additions & 1 deletion packages/compat/plugin-swc/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,15 @@
"extends": "@rsbuild/tsconfig/base",
"compilerOptions": {
"outDir": "./dist",
"baseUrl": "./"
"baseUrl": "./",
"rootDir": "src",
"composite": true
},
"references": [
{
"path": "../../shared"
}
],
"include": ["src"],
"exclude": ["./tests/fixtures"]
}
4 changes: 2 additions & 2 deletions packages/compat/webpack/src/plugins/minimize.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import {
CHAIN_ID,
BundlerChain,
getJSMinifyOptions,
getTerserMinifyOptions,
type RsbuildPlugin,
type NormalizedConfig,
} from '@rsbuild/shared';

async function applyJSMinimizer(chain: BundlerChain, config: NormalizedConfig) {
const { default: TerserPlugin } = await import('terser-webpack-plugin');

const finalOptions = await getJSMinifyOptions(config);
const finalOptions = await getTerserMinifyOptions(config);

chain.optimization
.minimizer(CHAIN_ID.MINIMIZER.JS)
Expand Down
47 changes: 3 additions & 44 deletions packages/core/src/provider/plugins/minimize.ts
Original file line number Diff line number Diff line change
@@ -1,46 +1,5 @@
import { CHAIN_ID, isObject, type RspackBuiltinsConfig } from '@rsbuild/shared';
import type { RsbuildPlugin, NormalizedConfig } from '../../types';

const getJsMinimizerOptions = (config: NormalizedConfig) => {
const options: RspackBuiltinsConfig['minifyOptions'] = {};

const { removeConsole } = config.performance;

if (removeConsole === true) {
options.compress = {
...(isObject(options.compress) ? options.compress : {}),
drop_console: true,
};
} else if (Array.isArray(removeConsole)) {
const pureFuncs = removeConsole.map((method) => `console.${method}`);
options.compress = {
...(isObject(options.compress) ? options.compress : {}),
pure_funcs: pureFuncs,
};
}

options.format ||= {};

switch (config.output.legalComments) {
case 'inline':
options.format.comments = 'some';
options.extractComments = false;
break;
case 'linked':
options.extractComments = true;
break;
case 'none':
options.format.comments = false;
options.extractComments = false;
break;
default:
break;
}

options.format.asciiOnly = config.output.charset === 'ascii';

return options;
};
import { CHAIN_ID, getSwcMinimizerOptions } from '@rsbuild/shared';
import type { RsbuildPlugin } from '../../types';

export const pluginMinimize = (): RsbuildPlugin => ({
name: 'rsbuild:minimize',
Expand All @@ -62,7 +21,7 @@ export const pluginMinimize = (): RsbuildPlugin => ({

chain.optimization
.minimizer(CHAIN_ID.MINIMIZER.JS)
.use(SwcJsMinimizerRspackPlugin, [getJsMinimizerOptions(config)])
.use(SwcJsMinimizerRspackPlugin, [getSwcMinimizerOptions(config)])
.end()
.minimizer(CHAIN_ID.MINIMIZER.CSS)
.use(SwcCssMinimizerRspackPlugin, [])
Expand Down
4 changes: 2 additions & 2 deletions packages/shared/src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ import { pick, color, upperFirst } from './utils';

import _ from 'lodash';
import { DEFAULT_DEV_HOST } from './constants';
import { getJSMinifyOptions } from './minimize';
import { getTerserMinifyOptions } from './minimize';

export const getDefaultDevConfig = (): NormalizedDevConfig => ({
hmr: true,
Expand Down Expand Up @@ -231,7 +231,7 @@ export async function getMinify(isProd: boolean, config: NormalizedConfig) {
if (config.output.disableMinimize || !isProd) {
return false;
}
const minifyJS: MinifyOptions = (await getJSMinifyOptions(config))
const minifyJS: MinifyOptions = (await getTerserMinifyOptions(config))
.terserOptions!;

return {
Expand Down
50 changes: 48 additions & 2 deletions packages/shared/src/minimize.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
import { TerserPluginOptions, NormalizedConfig } from './types';
import { isObject } from './utils';
import { mergeChainedOptions } from './mergeChainedOptions';
import type {
NormalizedConfig,
TerserPluginOptions,
RspackBuiltinsConfig,
} from './types';

function applyRemoveConsole(
options: TerserPluginOptions,
Expand Down Expand Up @@ -31,7 +36,7 @@ function applyRemoveConsole(
return options;
}

export async function getJSMinifyOptions(config: NormalizedConfig) {
export async function getTerserMinifyOptions(config: NormalizedConfig) {
const DEFAULT_OPTIONS: TerserPluginOptions = {
terserOptions: {
mangle: {
Expand Down Expand Up @@ -69,3 +74,44 @@ export async function getJSMinifyOptions(config: NormalizedConfig) {

return finalOptions;
}

export const getSwcMinimizerOptions = (config: NormalizedConfig) => {
const options: RspackBuiltinsConfig['minifyOptions'] = {};

const { removeConsole } = config.performance;

if (removeConsole === true) {
options.compress = {
...(isObject(options.compress) ? options.compress : {}),
drop_console: true,
};
} else if (Array.isArray(removeConsole)) {
const pureFuncs = removeConsole.map((method) => `console.${method}`);
options.compress = {
...(isObject(options.compress) ? options.compress : {}),
pure_funcs: pureFuncs,
};
}

options.format ||= {};

switch (config.output.legalComments) {
case 'inline':
options.format.comments = 'some';
options.extractComments = false;
break;
case 'linked':
options.extractComments = true;
break;
case 'none':
options.format.comments = false;
options.extractComments = false;
break;
default:
break;
}

options.format.asciiOnly = config.output.charset === 'ascii';

return options;
};