diff --git a/e2e/cases/esm-exports/test.mjs b/e2e/cases/esm-exports/test.mjs
index 148f398548..dbcf34c190 100644
--- a/e2e/cases/esm-exports/test.mjs
+++ b/e2e/cases/esm-exports/test.mjs
@@ -3,7 +3,6 @@ import { getBabelConfigForWeb } from '@rsbuild/babel-preset/web';
import { pluginAssetsRetry } from '@rsbuild/plugin-assets-retry';
import { pluginBabel } from '@rsbuild/plugin-babel';
import { pluginCheckSyntax } from '@rsbuild/plugin-check-syntax';
-import { pluginImageCompress } from '@rsbuild/plugin-image-compress';
import { pluginLess } from '@rsbuild/plugin-less';
import { pluginLightningcss } from '@rsbuild/plugin-lightningcss';
import { pluginPreact } from '@rsbuild/plugin-preact';
@@ -28,7 +27,6 @@ export default {
pluginAssetsRetry,
pluginBabel,
pluginCheckSyntax,
- pluginImageCompress,
pluginLess,
pluginReact,
pluginPreact,
diff --git a/e2e/cases/image-compress/index.test.ts b/e2e/cases/image-compress/index.test.ts
deleted file mode 100644
index 238a86de94..0000000000
--- a/e2e/cases/image-compress/index.test.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import { readFileSync } from 'node:fs';
-import { join } from 'node:path';
-import { build, globContentJSON } from '@e2e/helper';
-import { expect, test } from '@playwright/test';
-
-test('should compress image with use plugin-image-compress', async () => {
- await expect(
- build({
- cwd: __dirname,
- }),
- ).resolves.toBeDefined();
-
- const outputs = await globContentJSON(join(__dirname, 'dist'));
-
- const names = Object.keys(outputs);
-
- const jpeg = names.find((item) => item.endsWith('.jpeg'))!;
- const png = names.find((item) => item.endsWith('.png'))!;
- const svg = names.find((item) => item.endsWith('.svg'))!;
- // const ico = names.find((item) => item.endsWith('.ico'))!;
-
- const assetsDir = join(__dirname, '../../assets');
- const originJpeg = readFileSync(join(assetsDir, 'image.jpeg'), 'utf-8');
- const originPng = readFileSync(join(assetsDir, 'image.png'), 'utf-8');
- const originSvg = readFileSync(join(assetsDir, 'mobile.svg'), 'utf-8');
- // const originIco = readFileSync(join(assetsDir, 'image.ico'), 'utf-8');
-
- expect(outputs[jpeg].length).toBeLessThan(originJpeg.length);
- expect(outputs[png].length).toBeLessThan(originPng.length);
- expect(outputs[svg].length).toBeLessThan(originSvg.length);
- // TODO ico file size is not less than origin
- // expect(outputs[ico].length).toBeLessThan(originIco.length);
-});
diff --git a/e2e/cases/image-compress/rsbuild.config.ts b/e2e/cases/image-compress/rsbuild.config.ts
deleted file mode 100644
index 28b4efbeef..0000000000
--- a/e2e/cases/image-compress/rsbuild.config.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { pluginImageCompress } from '@rsbuild/plugin-image-compress';
-
-export default {
- plugins: [pluginImageCompress(['jpeg', 'png', 'ico', 'svg'])],
-};
diff --git a/e2e/cases/image-compress/src/index.js b/e2e/cases/image-compress/src/index.js
deleted file mode 100644
index 2659aa618a..0000000000
--- a/e2e/cases/image-compress/src/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import imageIco from '@assets/image.ico?url';
-import imageJpeg from '@assets/image.jpeg?url';
-import imagePng from '@assets/image.png?url';
-import imageSvg from '@assets/mobile.svg?url';
-
-const images = [imageIco, imagePng, imageJpeg, imageSvg];
-
-for (const image of images) {
- const el = new Image();
- el.src = image;
- document.body.appendChild(el);
-}
diff --git a/e2e/package.json b/e2e/package.json
index bddf078e85..9632dcdcf4 100644
--- a/e2e/package.json
+++ b/e2e/package.json
@@ -26,7 +26,6 @@
"@rsbuild/plugin-assets-retry": "workspace:*",
"@rsbuild/plugin-babel": "workspace:*",
"@rsbuild/plugin-check-syntax": "workspace:*",
- "@rsbuild/plugin-image-compress": "workspace:*",
"@rsbuild/plugin-less": "workspace:*",
"@rsbuild/plugin-lightningcss": "workspace:*",
"@rsbuild/plugin-preact": "workspace:*",
diff --git a/packages/core/src/configChain.ts b/packages/core/src/configChain.ts
index 8e1516956e..a7b040cf09 100644
--- a/packages/core/src/configChain.ts
+++ b/packages/core/src/configChain.ts
@@ -164,8 +164,6 @@ export const CHAIN_ID = {
SWC: 'swc',
/** svgr */
SVGR: 'svgr',
- /** plugin-image-compress svgo-loader */
- SVGO: 'svgo',
/** yaml-loader */
YAML: 'yaml',
/** babel-loader */
@@ -186,8 +184,6 @@ export const CHAIN_ID = {
MINI_CSS_EXTRACT: 'mini-css-extract',
/** resolve-url-loader */
RESOLVE_URL: 'resolve-url-loader',
- /** plugin-image-compress.loader */
- IMAGE_COMPRESS: 'image-compress',
},
/** Predefined plugins */
PLUGIN: {
diff --git a/packages/plugin-image-compress/LICENSE b/packages/plugin-image-compress/LICENSE
deleted file mode 100644
index 82d38c25b5..0000000000
--- a/packages/plugin-image-compress/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2023-present Bytedance, Inc. and its affiliates.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/packages/plugin-image-compress/README.md b/packages/plugin-image-compress/README.md
deleted file mode 100644
index 92531b7215..0000000000
--- a/packages/plugin-image-compress/README.md
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-# Rsbuild
-
-The Rspack-based build tool. It's fast, out-of-the-box and extensible.
-
-## Documentation
-
-https://rsbuild.dev/
-
-## Contributing
-
-Please read the [Contributing Guide](https://github.com/web-infra-dev/rsbuild/blob/main/CONTRIBUTING.md).
-
-## License
-
-Rsbuild is [MIT licensed](https://github.com/web-infra-dev/rsbuild/blob/main/LICENSE).
diff --git a/packages/plugin-image-compress/modern.config.ts b/packages/plugin-image-compress/modern.config.ts
deleted file mode 100644
index 006abf4e4a..0000000000
--- a/packages/plugin-image-compress/modern.config.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { configForDualPackage } from '@rsbuild/config/modern.config.ts';
-
-export default configForDualPackage;
diff --git a/packages/plugin-image-compress/package.json b/packages/plugin-image-compress/package.json
deleted file mode 100644
index 466444c2a0..0000000000
--- a/packages/plugin-image-compress/package.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
- "name": "@rsbuild/plugin-image-compress",
- "version": "1.0.0-alpha.9",
- "description": "Image compress plugin for Rsbuild",
- "homepage": "https://rsbuild.dev",
- "repository": {
- "type": "git",
- "url": "https://github.com/web-infra-dev/rsbuild",
- "directory": "packages/plugin-image-compress"
- },
- "license": "MIT",
- "type": "module",
- "exports": {
- ".": {
- "types": "./dist/index.d.ts",
- "import": "./dist/index.js",
- "require": "./dist/index.cjs"
- }
- },
- "main": "./dist/index.cjs",
- "types": "./dist/index.d.ts",
- "files": [
- "dist"
- ],
- "scripts": {
- "build": "modern build",
- "dev": "modern build --watch"
- },
- "dependencies": {
- "@napi-rs/image": "^1.9.2",
- "svgo": "^3.3.2"
- },
- "devDependencies": {
- "@rsbuild/core": "workspace:*",
- "@types/node": "18.x",
- "typescript": "^5.5.2"
- },
- "peerDependencies": {
- "@rsbuild/core": "workspace:^1.0.0-alpha.9"
- },
- "publishConfig": {
- "access": "public",
- "provenance": true,
- "registry": "https://registry.npmjs.org/"
- }
-}
diff --git a/packages/plugin-image-compress/src/index.ts b/packages/plugin-image-compress/src/index.ts
deleted file mode 100644
index 3409068a12..0000000000
--- a/packages/plugin-image-compress/src/index.ts
+++ /dev/null
@@ -1,61 +0,0 @@
-import assert from 'node:assert';
-import type { RsbuildPlugin } from '@rsbuild/core';
-import { ImageMinimizerPlugin } from './minimizer';
-import { withDefaultOptions } from './shared/utils';
-import type { Codecs, Options } from './types';
-
-export type PluginImageCompressOptions = Options[];
-export const DEFAULT_OPTIONS: Codecs[] = ['jpeg', 'png', 'ico'];
-
-export interface IPluginImageCompress {
- (...options: Options[]): RsbuildPlugin;
- (options: Options[]): RsbuildPlugin;
-}
-
-const castOptions = (args: (Options | Options[])[]): Options[] => {
- const head = args[0];
- // expect [['png', { use: 'jpeg' }]]
- if (Array.isArray(head)) {
- return head;
- }
- // expect ['png', { use: 'jpeg' }]
- const ret: Options[] = [];
- for (const arg of args) {
- assert(!Array.isArray(arg));
- ret.push(arg);
- }
- return ret;
-};
-
-const normalizeOptions = (options: Options[]) => {
- const opts = options.length ? options : DEFAULT_OPTIONS;
- const normalized = opts.map((opt) => withDefaultOptions(opt));
- return normalized;
-};
-
-export const PLUGIN_IMAGE_COMPRESS_NAME = 'rsbuild:image-compress';
-
-/** Options enable by default: {@link DEFAULT_OPTIONS} */
-export const pluginImageCompress: IPluginImageCompress = (
- ...args
-): RsbuildPlugin => ({
- name: PLUGIN_IMAGE_COMPRESS_NAME,
-
- setup(api) {
- const opts = normalizeOptions(castOptions(args));
-
- api.modifyBundlerChain((chain, { isDev }) => {
- if (isDev) {
- return;
- }
-
- chain.optimization.minimize(true);
-
- for (const opt of opts) {
- chain.optimization
- .minimizer(`image-compress-${opt.use}`)
- .use(ImageMinimizerPlugin, [opt]);
- }
- });
- },
-});
diff --git a/packages/plugin-image-compress/src/minimizer.ts b/packages/plugin-image-compress/src/minimizer.ts
deleted file mode 100644
index 3a2d7231c2..0000000000
--- a/packages/plugin-image-compress/src/minimizer.ts
+++ /dev/null
@@ -1,113 +0,0 @@
-import { Buffer } from 'node:buffer';
-import type { Rspack } from '@rsbuild/core';
-import Codecs from './shared/codecs';
-import type { FinalOptions } from './types';
-
-export const IMAGE_MINIMIZER_PLUGIN_NAME =
- '@rsbuild/plugin-image-compress/minimizer' as const;
-
-export interface MinimizedResult {
- source: Rspack.sources.RawSource;
-}
-
-export class ImageMinimizerPlugin {
- name: string = IMAGE_MINIMIZER_PLUGIN_NAME;
-
- options: FinalOptions;
-
- constructor(options: FinalOptions) {
- this.options = options;
- }
-
- async optimize(
- compiler: Rspack.Compiler,
- compilation: Rspack.Compilation,
- assets: Record,
- ): Promise {
- const cache = compilation.getCache(IMAGE_MINIMIZER_PLUGIN_NAME);
- const { RawSource } = compiler.webpack.sources;
- const { matchObject } = compiler.webpack.ModuleFilenameHelpers;
-
- const buildError = (error: unknown, file?: string, context?: string) => {
- const cause = error instanceof Error ? error : new Error();
- const message =
- file && context
- ? `"${file}" in "${context}" from Image Minimizer:\n${cause.message}`
- : cause.message;
- const ret = new compiler.webpack.WebpackError(message);
-
- if (error instanceof Error) {
- (ret as any).error = error;
- }
-
- return ret;
- };
-
- const codec = Codecs[this.options.use];
- if (!codec) {
- compilation.errors.push(
- buildError(new Error(`Codec ${this.options.use} is not supported`)),
- );
- }
- const opts = { ...codec.defaultOptions, ...this.options };
-
- const handleAsset = async (name: string) => {
- const info = compilation.getAsset(name)?.info;
- const fileName = name.split('?')[0];
-
- // 1. Skip double minimize assets from child compilation
- // 2. Test file by options (e.g. test, include, exclude)
- if (info?.minimized || !matchObject(opts, fileName)) {
- return;
- }
-
- const { source: inputSource } = compilation.getAsset(name)!;
-
- const eTag = cache.getLazyHashedEtag(inputSource);
- const cacheItem = cache.getItemCache(name, eTag);
- let result = await cacheItem.getPromise();
-
- try {
- if (!result) {
- const input = inputSource.source();
- const buf = await codec.handler(Buffer.from(input), opts);
- result = { source: new RawSource(buf) };
- await cacheItem.storePromise(result);
- }
- compilation.updateAsset(name, result.source, { minimized: true });
- } catch (error) {
- compilation.errors.push(buildError(error, name, compiler.context));
- }
- };
- const promises = Object.keys(assets).map((name) => handleAsset(name));
- await Promise.all(promises);
- }
-
- apply(compiler: Rspack.Compiler): void {
- const handleCompilation = (compilation: Rspack.Compilation) => {
- compilation.hooks.processAssets.tapPromise(
- {
- name: this.name,
- stage:
- compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_SIZE,
- // @ts-expect-error unsupported by Rspack
- additionalAssets: true,
- },
- (assets) => this.optimize(compiler, compilation, assets),
- );
-
- compilation.hooks.statsPrinter.tap(this.name, (stats) => {
- stats.hooks.print
- .for('asset.info.minimized')
- .tap(
- '@rsbuild/plugin-image-compress',
- (minimized, { green, formatFlag }) =>
- minimized && green && formatFlag
- ? green(formatFlag('minimized'))
- : '',
- );
- });
- };
- compiler.hooks.compilation.tap(this.name, handleCompilation);
- }
-}
diff --git a/packages/plugin-image-compress/src/shared/codecs.ts b/packages/plugin-image-compress/src/shared/codecs.ts
deleted file mode 100644
index 32c46b1f80..0000000000
--- a/packages/plugin-image-compress/src/shared/codecs.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-import { Buffer } from 'node:buffer';
-import {
- Transformer,
- compressJpeg,
- losslessCompressPng,
- pngQuantize,
-} from '@napi-rs/image';
-import svgo from 'svgo';
-import type { Codec, Codecs } from '../types';
-
-export const jpegCodec: Codec<'jpeg'> = {
- handler(buf, options) {
- return compressJpeg(buf, options);
- },
- defaultOptions: {
- test: /\.(?:jpg|jpeg)$/,
- },
-};
-
-export const pngCodec: Codec<'png'> = {
- handler(buf, options) {
- return pngQuantize(buf, options);
- },
- defaultOptions: {
- test: /\.png$/,
- },
-};
-
-export const pngLosslessCodec: Codec<'pngLossless'> = {
- handler(buf, options) {
- return losslessCompressPng(buf, options);
- },
- defaultOptions: {
- test: /\.png$/,
- },
-};
-
-export const icoCodec: Codec<'ico'> = {
- handler(buf) {
- return new Transformer(buf).ico();
- },
- defaultOptions: {
- test: /\.(?:ico|icon)$/,
- },
-};
-
-export const svgCodec: Codec<'svg'> = {
- async handler(buf, options) {
- const result = svgo.optimize(buf.toString(), options);
- return Buffer.from(result.data);
- },
- defaultOptions: {
- test: /\.svg$/,
- },
-};
-
-const codecs: Record> = {
- jpeg: jpegCodec,
- png: pngCodec,
- pngLossless: pngLosslessCodec,
- ico: icoCodec,
- svg: svgCodec,
-};
-
-export default codecs;
diff --git a/packages/plugin-image-compress/src/shared/utils.ts b/packages/plugin-image-compress/src/shared/utils.ts
deleted file mode 100644
index c6d71d0995..0000000000
--- a/packages/plugin-image-compress/src/shared/utils.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import assert from 'node:assert';
-import type { FinalOptions, Options } from '../types';
-import codecs from './codecs';
-
-export const withDefaultOptions = (opt: Options): FinalOptions => {
- const options = typeof opt === 'string' ? { use: opt } : opt;
- const { defaultOptions } = codecs[options.use];
- const ret = { ...defaultOptions, ...options };
- assert('test' in ret);
- return ret;
-};
diff --git a/packages/plugin-image-compress/src/types/index.ts b/packages/plugin-image-compress/src/types/index.ts
deleted file mode 100644
index c9dde03c9e..0000000000
--- a/packages/plugin-image-compress/src/types/index.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-import type { Buffer } from 'node:buffer';
-import type {
- JpegCompressOptions,
- PNGLosslessOptions,
- PngQuantOptions,
-} from '@napi-rs/image';
-import type { Config as SvgoConfig } from 'svgo';
-
-export type OneOrMany = T | T[];
-
-export interface WebpTransformOptions {
- quality?: number;
-}
-
-export interface CodecBaseOptions {
- jpeg: JpegCompressOptions;
- png: PngQuantOptions;
- pngLossless: PNGLosslessOptions;
- ico: Record;
- svg: SvgoConfig;
-}
-
-export interface BaseCompressOptions {
- use: T;
- test?: OneOrMany;
- include?: OneOrMany;
- exclude?: OneOrMany;
-}
-
-export type FinalOptionCollection = {
- [K in Codecs]: BaseCompressOptions & CodecBaseOptions[K];
-};
-
-export type FinalOptions = FinalOptionCollection[Codecs];
-
-export interface Codec {
- handler: (buf: Buffer, options: CodecBaseOptions[T]) => Promise;
- defaultOptions: Omit;
-}
-
-export type Codecs = keyof CodecBaseOptions;
-
-export type OptionCollection = {
- [K in Codecs]: K | FinalOptionCollection[K];
-};
-
-export type Options = OptionCollection[Codecs];
diff --git a/packages/plugin-image-compress/tests/__snapshots__/index.test.ts.snap b/packages/plugin-image-compress/tests/__snapshots__/index.test.ts.snap
deleted file mode 100644
index 7f187e2e8d..0000000000
--- a/packages/plugin-image-compress/tests/__snapshots__/index.test.ts.snap
+++ /dev/null
@@ -1,65 +0,0 @@
-// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
-
-exports[`plugin-image-compress > should accept \`...options: Options[]\` as parameter 1`] = `
-[
- ImageMinimizerPlugin {
- "name": "@rsbuild/plugin-image-compress/minimizer",
- "options": {
- "test": /\\\\\\.\\(\\?:jpg\\|jpeg\\)\\$/,
- "use": "jpeg",
- },
- },
- ImageMinimizerPlugin {
- "name": "@rsbuild/plugin-image-compress/minimizer",
- "options": {
- "test": /\\\\\\.png\\$/,
- "use": "png",
- },
- },
-]
-`;
-
-exports[`plugin-image-compress > should accept \`options: Options[]\` as parameter 1`] = `
-[
- ImageMinimizerPlugin {
- "name": "@rsbuild/plugin-image-compress/minimizer",
- "options": {
- "test": /\\\\\\.\\(\\?:jpg\\|jpeg\\)\\$/,
- "use": "jpeg",
- },
- },
- ImageMinimizerPlugin {
- "name": "@rsbuild/plugin-image-compress/minimizer",
- "options": {
- "test": /\\\\\\.png\\$/,
- "use": "png",
- },
- },
-]
-`;
-
-exports[`plugin-image-compress > should generate correct options 1`] = `
-[
- ImageMinimizerPlugin {
- "name": "@rsbuild/plugin-image-compress/minimizer",
- "options": {
- "test": /\\\\\\.\\(\\?:jpg\\|jpeg\\)\\$/,
- "use": "jpeg",
- },
- },
- ImageMinimizerPlugin {
- "name": "@rsbuild/plugin-image-compress/minimizer",
- "options": {
- "test": /\\\\\\.png\\$/,
- "use": "png",
- },
- },
- ImageMinimizerPlugin {
- "name": "@rsbuild/plugin-image-compress/minimizer",
- "options": {
- "test": /\\\\\\.\\(\\?:ico\\|icon\\)\\$/,
- "use": "ico",
- },
- },
-]
-`;
diff --git a/packages/plugin-image-compress/tests/index.test.ts b/packages/plugin-image-compress/tests/index.test.ts
deleted file mode 100644
index d42753499d..0000000000
--- a/packages/plugin-image-compress/tests/index.test.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import { createRsbuild } from '@rsbuild/core';
-import { pluginImageCompress } from '../src';
-
-process.env.NODE_ENV = 'production';
-
-describe('plugin-image-compress', () => {
- it('should generate correct options', async () => {
- const rsbuild = await createRsbuild({
- rsbuildConfig: {
- plugins: [pluginImageCompress()],
- output: {
- minify: false,
- },
- },
- });
- const configs = await rsbuild.initConfigs();
- expect(configs[0].optimization?.minimizer).toMatchSnapshot();
- });
-
- it('should accept `...options: Options[]` as parameter', async () => {
- const rsbuild = await createRsbuild({
- rsbuildConfig: {
- plugins: [pluginImageCompress('jpeg', { use: 'png' })],
- output: {
- minify: false,
- },
- },
- });
- const configs = await rsbuild.initConfigs();
- expect(configs[0].optimization?.minimizer).toMatchSnapshot();
- });
-
- it('should accept `options: Options[]` as parameter', async () => {
- const rsbuild = await createRsbuild({
- rsbuildConfig: {
- plugins: [pluginImageCompress(['jpeg', { use: 'png' }])],
- output: {
- minify: false,
- },
- },
- });
- const configs = await rsbuild.initConfigs();
- expect(configs[0].optimization?.minimizer).toMatchSnapshot();
- });
-});
diff --git a/packages/plugin-image-compress/tests/tsconfig.json b/packages/plugin-image-compress/tests/tsconfig.json
deleted file mode 100644
index a20c9af655..0000000000
--- a/packages/plugin-image-compress/tests/tsconfig.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "extends": "@rsbuild/config/tsconfig",
- "compilerOptions": {
- "baseUrl": "./",
- "types": ["vitest/globals"]
- },
- "include": ["./**/*.ts"]
-}
diff --git a/packages/plugin-image-compress/tsconfig.json b/packages/plugin-image-compress/tsconfig.json
deleted file mode 100644
index c695a9910b..0000000000
--- a/packages/plugin-image-compress/tsconfig.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "extends": "@rsbuild/config/tsconfig",
- "compilerOptions": {
- "outDir": "./dist",
- "baseUrl": "./",
- "rootDir": "src",
- "composite": true,
- "isolatedDeclarations": true
- },
- "references": [
- {
- "path": "../core"
- }
- ],
- "include": ["src"]
-}
diff --git a/packages/plugin-image-compress/vitest.config.ts b/packages/plugin-image-compress/vitest.config.ts
deleted file mode 100644
index e092bf0531..0000000000
--- a/packages/plugin-image-compress/vitest.config.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import path from 'node:path';
-import { defineConfig } from 'vitest/config';
-
-const config = defineConfig({
- resolve: {
- alias: {
- '~': path.resolve(__dirname),
- '@': path.resolve(__dirname, 'src'),
- },
- },
-});
-
-export default config;
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 37c4c282b3..e5201705d8 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -109,9 +109,6 @@ importers:
'@rsbuild/plugin-check-syntax':
specifier: workspace:*
version: link:../packages/plugin-check-syntax
- '@rsbuild/plugin-image-compress':
- specifier: workspace:*
- version: link:../packages/plugin-image-compress
'@rsbuild/plugin-less':
specifier: link:../packages/plugin-less
version: link:../packages/plugin-less
@@ -939,25 +936,6 @@ importers:
specifier: ^5.5.2
version: 5.5.2
- packages/plugin-image-compress:
- dependencies:
- '@napi-rs/image':
- specifier: ^1.9.2
- version: 1.9.2
- svgo:
- specifier: ^3.3.2
- version: 3.3.2
- devDependencies:
- '@rsbuild/core':
- specifier: link:../core
- version: link:../core
- '@types/node':
- specifier: 18.x
- version: 18.19.31
- typescript:
- specifier: ^5.5.2
- version: 5.5.2
-
packages/plugin-less:
dependencies:
deepmerge:
@@ -2459,12 +2437,6 @@ packages:
resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==}
engines: {node: '>=10.0.0'}
- '@emnapi/core@1.1.1':
- resolution: {integrity: sha512-eu4KjHfXg3I+UUR7vSuwZXpRo4c8h4Rtb5Lu2F7Z4JqJFl/eidquONEBiRs6viXKpWBC3BaJBy68xGJ2j56idw==}
-
- '@emnapi/runtime@1.1.1':
- resolution: {integrity: sha512-3bfqkzuR1KLx57nZfjr2NLnFOobvyS0aTszaEGCGqmYMVDRaGvgIZbjGSV/MHSSmLgQ/b9JFHQ5xm5WRZYd+XQ==}
-
'@emotion/is-prop-valid@1.2.2':
resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==}
@@ -2872,84 +2844,6 @@ packages:
'@module-federation/webpack-bundler-runtime@0.2.3':
resolution: {integrity: sha512-L/jt2uJ+8dwYiyn9GxryzDR6tr/Wk8rpgvelM2EBeLIhu7YxCHSmSjQYhw3BTux9zZIr47d1K9fGjBFsVRd/SQ==}
- '@napi-rs/image-android-arm64@1.9.2':
- resolution: {integrity: sha512-DQNI06ukKqpF4eogz9zyxfU+GYp11TfDqSNWKmk/IRU2oiB0DEgskuj7ZzaKMPJWFRZjI86V233UrrNRh76h2Q==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [android]
-
- '@napi-rs/image-darwin-arm64@1.9.2':
- resolution: {integrity: sha512-w+0X87sORbC2uDpH7NAdELOnvzhu3dB19h2oMaD+YIv/+CVXV5eK2PS3zkRgMLCinVtFOZFZK3dFbHU3kncCRw==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [darwin]
-
- '@napi-rs/image-darwin-x64@1.9.2':
- resolution: {integrity: sha512-8SnFDcgUSoL6Y38lstXi5FYECD1f4dJqQe2UCTwciED8gZnpC8Pju7JYJWcYgHHXn1JnKP9T1lPlSaX+L56EgA==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [darwin]
-
- '@napi-rs/image-freebsd-x64@1.9.2':
- resolution: {integrity: sha512-oS0+iSb8AekjaHgTZdARKceqTPxSokByLzNQ9vGf2lZlTwlRFmXGq4XYutyzqzRuLT3BATLwtGMXiguMEYMuUw==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [freebsd]
-
- '@napi-rs/image-linux-arm-gnueabihf@1.9.2':
- resolution: {integrity: sha512-bsbZSvw3wa7yaLVvz4M5VhJaB9LmgjAL3W7rnmXaX5BgpaQImNDm9MrxPG8ennr9Pbn6qDtCSioOz53ZgWUtgg==}
- engines: {node: '>= 10'}
- cpu: [arm]
- os: [linux]
-
- '@napi-rs/image-linux-arm64-gnu@1.9.2':
- resolution: {integrity: sha512-tiN9RMwEIcA8TodvmxdeJqsRdUGKAmxQ2aa0FkYjshdkmChG/sqUtUoL9LdmDf1tw1IACrSuT2Wj4LevxBdIJA==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [linux]
-
- '@napi-rs/image-linux-arm64-musl@1.9.2':
- resolution: {integrity: sha512-w6Sx1j9PtqO2bP3Jl6nuMryzxA3zsoc1U8u1H7AZketyhxXIxqVm0oGomZGs5Bgshzau45bcWinp6GWrlSwt6A==}
- engines: {node: '>= 10'}
- cpu: [arm64]
- os: [linux]
-
- '@napi-rs/image-linux-x64-gnu@1.9.2':
- resolution: {integrity: sha512-yB/s9wNB/9YHpQ4TwN8NWMA1tEK1gPLQwtysa68yMdHczb+7BTCKCIYIHD9rUulyT1Q/VgLIJCUMoxve0pIoeg==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [linux]
-
- '@napi-rs/image-linux-x64-musl@1.9.2':
- resolution: {integrity: sha512-x9dRlo27xYXonh+gZZTqQL4lAfi/lhi8K8LE2hczbZffqmXvWU7NuHSgPVVeU/nvcMMqw1Cjzn81h7ny44SLbQ==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [linux]
-
- '@napi-rs/image-wasm32-wasi@1.9.2':
- resolution: {integrity: sha512-BeA1wzzIG4+tdAwXWaAjObBOC6SzIbq0IhykSQ1xCGvYwd8stsn7ktPRz5b55PDo+Doj65PCT4H/xUgFcSiLCw==}
- engines: {node: '>=14.0.0'}
- cpu: [wasm32]
-
- '@napi-rs/image-win32-ia32-msvc@1.9.2':
- resolution: {integrity: sha512-JDJP04Hg9Qru5Pth4gfBkXz9hZd/otx6ymi2VTuSKDFjpJIjk4tyUr9+BIE1ghFCHDzeJGVe7CDGdF/NTA1xrg==}
- engines: {node: '>= 10'}
- cpu: [ia32]
- os: [win32]
-
- '@napi-rs/image-win32-x64-msvc@1.9.2':
- resolution: {integrity: sha512-baRyTED6FkTsPliSOH7x8TV/cyAST9y6L1ClSgSCVEx7+W8MKKig90fF302kEa2PwMAyrXM3Ytq9KuIC7xJ+eA==}
- engines: {node: '>= 10'}
- cpu: [x64]
- os: [win32]
-
- '@napi-rs/image@1.9.2':
- resolution: {integrity: sha512-CvTC3XL5/BzHaVkJOZy31xOJLNSY3rBuUIQixaE/LwEQNSUdaxWa9gUyUkC9lUekkUp26CzaLLj2w7l7bxB1ag==}
- engines: {node: '>= 10'}
-
- '@napi-rs/wasm-runtime@0.2.3':
- resolution: {integrity: sha512-e4qmGDzXu2MYjj/XiKSgJ7XS7Z83MYVRN1yYaYXeQNVEO56zmshqmzFaELfdb612sLq/GmiPfRIwSji+bIlyCw==}
-
'@nodelib/fs.scandir@2.1.5':
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
@@ -3461,9 +3355,6 @@ packages:
resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
engines: {node: '>=10.13.0'}
- '@tybys/wasm-util@0.8.3':
- resolution: {integrity: sha512-Z96T/L6dUFFxgFJ+pQtkPpne9q7i6kIPYCFnQBHSgSPV9idTsKfIhCss0h5iM9irweZCatkrdeP8yi5uM1eX6Q==}
-
'@types/acorn@4.0.6':
resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==}
@@ -9204,16 +9095,6 @@ snapshots:
'@discoveryjs/json-ext@0.5.7': {}
- '@emnapi/core@1.1.1':
- dependencies:
- tslib: 2.6.2
- optional: true
-
- '@emnapi/runtime@1.1.1':
- dependencies:
- tslib: 2.6.2
- optional: true
-
'@emotion/is-prop-valid@1.2.2':
dependencies:
'@emotion/memoize': 0.8.1
@@ -9625,66 +9506,6 @@ snapshots:
'@module-federation/runtime': 0.2.3
'@module-federation/sdk': 0.2.3
- '@napi-rs/image-android-arm64@1.9.2':
- optional: true
-
- '@napi-rs/image-darwin-arm64@1.9.2':
- optional: true
-
- '@napi-rs/image-darwin-x64@1.9.2':
- optional: true
-
- '@napi-rs/image-freebsd-x64@1.9.2':
- optional: true
-
- '@napi-rs/image-linux-arm-gnueabihf@1.9.2':
- optional: true
-
- '@napi-rs/image-linux-arm64-gnu@1.9.2':
- optional: true
-
- '@napi-rs/image-linux-arm64-musl@1.9.2':
- optional: true
-
- '@napi-rs/image-linux-x64-gnu@1.9.2':
- optional: true
-
- '@napi-rs/image-linux-x64-musl@1.9.2':
- optional: true
-
- '@napi-rs/image-wasm32-wasi@1.9.2':
- dependencies:
- '@napi-rs/wasm-runtime': 0.2.3
- optional: true
-
- '@napi-rs/image-win32-ia32-msvc@1.9.2':
- optional: true
-
- '@napi-rs/image-win32-x64-msvc@1.9.2':
- optional: true
-
- '@napi-rs/image@1.9.2':
- optionalDependencies:
- '@napi-rs/image-android-arm64': 1.9.2
- '@napi-rs/image-darwin-arm64': 1.9.2
- '@napi-rs/image-darwin-x64': 1.9.2
- '@napi-rs/image-freebsd-x64': 1.9.2
- '@napi-rs/image-linux-arm-gnueabihf': 1.9.2
- '@napi-rs/image-linux-arm64-gnu': 1.9.2
- '@napi-rs/image-linux-arm64-musl': 1.9.2
- '@napi-rs/image-linux-x64-gnu': 1.9.2
- '@napi-rs/image-linux-x64-musl': 1.9.2
- '@napi-rs/image-wasm32-wasi': 1.9.2
- '@napi-rs/image-win32-ia32-msvc': 1.9.2
- '@napi-rs/image-win32-x64-msvc': 1.9.2
-
- '@napi-rs/wasm-runtime@0.2.3':
- dependencies:
- '@emnapi/core': 1.1.1
- '@emnapi/runtime': 1.1.1
- '@tybys/wasm-util': 0.8.3
- optional: true
-
'@nodelib/fs.scandir@2.1.5':
dependencies:
'@nodelib/fs.stat': 2.0.5
@@ -10173,11 +9994,6 @@ snapshots:
'@trysound/sax@0.2.0': {}
- '@tybys/wasm-util@0.8.3':
- dependencies:
- tslib: 2.6.2
- optional: true
-
'@types/acorn@4.0.6':
dependencies:
'@types/estree': 1.0.5
diff --git a/website/docs/en/guide/migration/modern-builder.mdx b/website/docs/en/guide/migration/modern-builder.mdx
index 3c773fc51d..91de7c48af 100644
--- a/website/docs/en/guide/migration/modern-builder.mdx
+++ b/website/docs/en/guide/migration/modern-builder.mdx
@@ -63,15 +63,15 @@ Rsbuild and Builder have incompatible plugin systems, so you need to replace Bui
The following table shows the correspondence between Builder plugins and Rsbuild plugins:
-| Builder | Rsbuild |
-| ---------------------------------------- | ----------------------------------------------------------------------------------------------- |
-| @modern-js/builder-plugin-vue | [@rsbuild/plugin-vue](/plugins/list/plugin-vue) |
-| @modern-js/builder-plugin-vue2 | [@rsbuild/plugin-vue2](/plugins/list/plugin-vue2) |
-| @modern-js/builder-plugin-stylus | [@rsbuild/plugin-stylus](/plugins/list/plugin-stylus) |
-| @modern-js/builder-plugin-node-polyfill | [@rsbuild/plugin-node-polyfill](https://github.com/rspack-contrib/rsbuild-plugin-node-polyfill) |
-| @modern-js/builder-plugin-image-compress | [@rsbuild/plugin-image-compress](/plugins/list/plugin-image-compress) |
-| @modern-js/builder-plugin-swc | Enabled by default, no need to use |
-| @modern-js/builder-plugin-esbuild | No longer supported |
+| Builder | Rsbuild |
+| ---------------------------------------- | ------------------------------------------------------------------------------------------------- |
+| @modern-js/builder-plugin-vue | [@rsbuild/plugin-vue](/plugins/list/plugin-vue) |
+| @modern-js/builder-plugin-vue2 | [@rsbuild/plugin-vue2](/plugins/list/plugin-vue2) |
+| @modern-js/builder-plugin-stylus | [@rsbuild/plugin-stylus](/plugins/list/plugin-stylus) |
+| @modern-js/builder-plugin-node-polyfill | [@rsbuild/plugin-node-polyfill](https://github.com/rspack-contrib/rsbuild-plugin-node-polyfill) |
+| @modern-js/builder-plugin-image-compress | [@rsbuild/plugin-image-compress](https://github.com/rspack-contrib/rsbuild-plugin-image-compress) |
+| @modern-js/builder-plugin-swc | Enabled by default, no need to use |
+| @modern-js/builder-plugin-esbuild | No longer supported |
For example, if you were using `@modern-js/builder-plugin-vue`, you need to first install `@rsbuild/plugin-vue`, then import the plugin in `rsbuild.config.ts` and add it to the `plugins` field.
diff --git a/website/docs/en/guide/optimization/optimize-bundle.mdx b/website/docs/en/guide/optimization/optimize-bundle.mdx
index 58fa238edd..e70455b011 100644
--- a/website/docs/en/guide/optimization/optimize-bundle.mdx
+++ b/website/docs/en/guide/optimization/optimize-bundle.mdx
@@ -98,7 +98,7 @@ export default {
};
```
-See details in [plugin-image-compress](/plugins/list/plugin-image-compress).
+See details in [@rsbuild/plugin-image-compress](https://github.com/rspack-contrib/rsbuild-plugin-image-compress).
## Split Chunk
diff --git a/website/docs/en/guide/start/features.mdx b/website/docs/en/guide/start/features.mdx
index 19ac45295b..ebede5d8e7 100644
--- a/website/docs/en/guide/start/features.mdx
+++ b/website/docs/en/guide/start/features.mdx
@@ -98,7 +98,7 @@ Here are all the main features supported by Rsbuild.
| Remove console | Optional feature, remove `console.[methodName]` in code | - [performance.removeConsole](/config/performance/remove-console)
|
| Optimize moment.js size | Optional feature, remove the redundant locale files of moment.js | - [performance.removeMomentLocale](/config/performance/remove-moment-locale)
|
| Component on-demand import | Optional feature, selectively import code and styles from component libraries | - [source.transformImport](/config/source/transform-import)
|
-| Image compression | Optional feature, compress used image resources | - [Image Compress Plugin](/plugins/list/plugin-image-compress)
|
+| Image compression | Optional feature, compress used image resources | - [Image Compress Plugin](https://github.com/rspack-contrib/rsbuild-plugin-image-compress)
|
| Preload | Optional feature, preemptively fetch and cache the target resource for current navigation | - [performance.preload](/config/performance/preload)
|
| Prefetch | Optional feature, preemptively fetch and cache the target resource for a followup navigation | - [performance.prefetch](/config/performance/prefetch)
|
| Preconnect | Optional feature, preemptively connect to the target resource's origin | - [performance.preconnect](/config/performance/preconnect)
|
diff --git a/website/docs/en/guide/start/npm-packages.mdx b/website/docs/en/guide/start/npm-packages.mdx
index 6c11c7a626..9c493ec42f 100644
--- a/website/docs/en/guide/start/npm-packages.mdx
+++ b/website/docs/en/guide/start/npm-packages.mdx
@@ -122,16 +122,6 @@ Stylus plugin that uses Stylus as the CSS preprocessor.
- [Source Code](https://github.com/web-infra-dev/rsbuild/tree/main/packages/plugin-stylus)
- [Documentation](/plugins/list/plugin-stylus)
-## @rsbuild/plugin-image-compress
-
-
-
-Image Compress plugin used to compress image resources used in the project.
-
-- [npm](https://npmjs.com/package/@rsbuild/plugin-image-compress)
-- [Source Code](https://github.com/web-infra-dev/rsbuild/tree/main/packages/plugin-image-compress)
-- [Documentation](/plugins/list/plugin-image-compress)
-
## @rsbuild/plugin-check-syntax

diff --git a/website/docs/en/plugins/list/_meta.json b/website/docs/en/plugins/list/_meta.json
index 81acfc5070..90fae1b17e 100644
--- a/website/docs/en/plugins/list/_meta.json
+++ b/website/docs/en/plugins/list/_meta.json
@@ -15,7 +15,6 @@
"plugin-stylus",
"plugin-assets-retry",
"plugin-type-check",
- "plugin-image-compress",
"plugin-lightningcss",
"plugin-source-build",
"plugin-styled-components",
diff --git a/website/docs/en/plugins/list/index.mdx b/website/docs/en/plugins/list/index.mdx
index 8923387cea..63977d0fc9 100644
--- a/website/docs/en/plugins/list/index.mdx
+++ b/website/docs/en/plugins/list/index.mdx
@@ -61,7 +61,7 @@ The following are common framework-agnostic plugins:
- [Basic SSL Plugin](https://github.com/rspack-contrib/rsbuild-plugin-basic-ssl): Generate an untrusted, self-signed certificate for the HTTPS server.
- [ESLint Plugin](https://github.com/rspack-contrib/rsbuild-plugin-eslint): Used to run ESLint checks during the compilation.
- [Type Check Plugin](/plugins/list/plugin-type-check): Used to run TypeScript type checker on a separate process.
-- [Image Compress Plugin](/plugins/list/plugin-image-compress): Compress the image resources used in the project.
+- [Image Compress Plugin](https://github.com/rspack-contrib/rsbuild-plugin-image-compress): Compress the image assets.
- [MDX Plugin](https://github.com/rspack-contrib/rsbuild-plugin-mdx): Provide support for MDX.
- [Node Polyfill Plugin](https://github.com/rspack-contrib/rsbuild-plugin-node-polyfill): Used to inject polyfills of Node core modules in the browser side.
- [Lightning CSS Plugin](/plugins/list/plugin-lightningcss): Used to use LightningCSS as CSS transformer and minimizer.
diff --git a/website/docs/en/plugins/list/plugin-image-compress.mdx b/website/docs/en/plugins/list/plugin-image-compress.mdx
deleted file mode 100644
index 7bdc1a322e..0000000000
--- a/website/docs/en/plugins/list/plugin-image-compress.mdx
+++ /dev/null
@@ -1,72 +0,0 @@
-# Image Compress Plugin
-
-import { SourceCode } from 'rspress/theme';
-
-
-
-With the image compression plugin, image resources used in the project can be compressed to reduce the size of the artifacts without affecting the visual appearance of the image.
-
-## Quick Start
-
-### Install Plugin
-
-You can install the plugin using the following command:
-
-import { PackageManagerTabs } from '@theme';
-
-
-
-### Register Plugin
-
-You can register the plugin in the `rsbuild.config.ts` file:
-
-```ts title="rsbuild.config.ts"
-import { pluginImageCompress } from '@rsbuild/plugin-image-compress';
-
-export default {
- plugins: [pluginImageCompress()],
-};
-```
-
-## Options
-
-The plugin accepts an array of compressor configuration options, each of which can be either a string or an object. The string can be the name of a built-in compressor and its default configuration enabled.
-Or use the object format configuration and specify the compressor in the `use` field. The remaining fields of the object will be used as compressor configuration options.
-
-By default, the plugin will enable `jpeg`, `png`, `ico` image compressors, which are equivalent to the following two examples:
-
-```js
-pluginImageCompress(['jpeg', 'png', 'ico']);
-```
-
-```js
-pluginImageCompress([{ use: 'jpeg' }, { use: 'png' }, { use: 'ico' }]);
-```
-
-The default configuration can be overridden by specifying a configuration option.
-For example, to allow the jpeg compressor to recognize new extension name and to set the quality of the png compressor.
-
-```js
-pluginImageCompress([
- { use: 'jpeg', test: /\.(?:jpg|jpeg|jpe)$/ },
- { use: 'png', minQuality: 50 },
- 'ico',
-]);
-```
-
-The default `png` compressor is lossy.
-If you want to replace it with a lossless compressor, you can use the following configuration.
-
-```js
-pluginImageCompress(['jpeg', 'pngLossless', 'ico']);
-```
-
-The list of configuration options will eventually be converted to the corresponding bundler loader configuration, so compressors follow the same bottom-to-top matching rule.
-
-For example, the `png` compressor will take precedence over the `pngLossless` compressor for the following configuration:
-
-```js
-pluginImageCompress(['jpeg', 'pngLossless', 'ico', 'png']);
-```
-
-For more information on compressors, please visit [@napi-rs/image](https://image.napi.rs/docs).
diff --git a/website/docs/zh/guide/migration/modern-builder.mdx b/website/docs/zh/guide/migration/modern-builder.mdx
index 3bca377899..6c02401067 100644
--- a/website/docs/zh/guide/migration/modern-builder.mdx
+++ b/website/docs/zh/guide/migration/modern-builder.mdx
@@ -63,15 +63,15 @@ Rsbuild 和 Builder 的插件系统不兼容,因此需要将 Builder 的插件
下面是 Builder 插件和 Rsbuild 插件的对应关系:
-| Builder | Rsbuild |
-| ---------------------------------------- | ----------------------------------------------------------------------------------------------- |
-| @modern-js/builder-plugin-vue | [@rsbuild/plugin-vue](/plugins/list/plugin-vue) |
-| @modern-js/builder-plugin-vue2 | [@rsbuild/plugin-vue2](/plugins/list/plugin-vue2) |
-| @modern-js/builder-plugin-stylus | [@rsbuild/plugin-stylus](/plugins/list/plugin-stylus) |
-| @modern-js/builder-plugin-node-polyfill | [@rsbuild/plugin-node-polyfill](https://github.com/rspack-contrib/rsbuild-plugin-node-polyfill) |
-| @modern-js/builder-plugin-image-compress | [@rsbuild/plugin-image-compress](/plugins/list/plugin-image-compress) |
-| @modern-js/builder-plugin-swc | 默认生效,无须使用 |
-| @modern-js/builder-plugin-esbuild | 不再支持 |
+| Builder | Rsbuild |
+| ---------------------------------------- | ------------------------------------------------------------------------------------------------- |
+| @modern-js/builder-plugin-vue | [@rsbuild/plugin-vue](/plugins/list/plugin-vue) |
+| @modern-js/builder-plugin-vue2 | [@rsbuild/plugin-vue2](/plugins/list/plugin-vue2) |
+| @modern-js/builder-plugin-stylus | [@rsbuild/plugin-stylus](/plugins/list/plugin-stylus) |
+| @modern-js/builder-plugin-node-polyfill | [@rsbuild/plugin-node-polyfill](https://github.com/rspack-contrib/rsbuild-plugin-node-polyfill) |
+| @modern-js/builder-plugin-image-compress | [@rsbuild/plugin-image-compress](https://github.com/rspack-contrib/rsbuild-plugin-image-compress) |
+| @modern-js/builder-plugin-swc | 默认生效,无须使用 |
+| @modern-js/builder-plugin-esbuild | 不再支持 |
以 `@modern-js/builder-plugin-vue` 为例,你需要先安装 `@rsbuild/plugin-vue`,然后在 `rsbuild.config.ts` 中引入插件,并添加到 `plugins` 字段中。
diff --git a/website/docs/zh/guide/optimization/optimize-bundle.mdx b/website/docs/zh/guide/optimization/optimize-bundle.mdx
index ee12ac2bde..1e037d0cfb 100644
--- a/website/docs/zh/guide/optimization/optimize-bundle.mdx
+++ b/website/docs/zh/guide/optimization/optimize-bundle.mdx
@@ -98,7 +98,7 @@ export default {
};
```
-详见 [Image Compress 插件](/plugins/list/plugin-image-compress)。
+详见 [@rsbuild/plugin-image-compress](https://github.com/rspack-contrib/rsbuild-plugin-image-compress)。
## 代码拆包
diff --git a/website/docs/zh/guide/start/features.mdx b/website/docs/zh/guide/start/features.mdx
index 055d99f64e..7264c6d9bb 100644
--- a/website/docs/zh/guide/start/features.mdx
+++ b/website/docs/zh/guide/start/features.mdx
@@ -98,7 +98,7 @@
| 移除 console | 可选功能,移除代码中的 `console.[methodName]` | - [performance.removeConsole](/config/performance/remove-console)
|
| 优化 moment.js 体积 | 可选功能,移除 moment.js 多余的 locale 文件 | - [performance.removeMomentLocale](/config/performance/remove-moment-locale)
|
| 组件库按需引入 | 可选功能,按需引入组件库的代码和样式 | - [source.transformImport](/config/source/transform-import)
|
-| 图片压缩 | 可选功能,对引用的图片资源进行压缩处理 | - [Image Compress 插件](/plugins/list/plugin-image-compress)
|
+| 图片压缩 | 可选功能,对引用的图片资源进行压缩处理 | - [Image Compress 插件](https://github.com/rspack-contrib/rsbuild-plugin-image-compress)
|
| Preload | 可选功能,对资源进行预加载 | - [performance.preload](/config/performance/preload)
|
| Prefetch | 可选功能,对资源进行预获取 | - [performance.prefetch](/config/performance/prefetch)
|
| Preconnect | 可选功能,对资源进行预连接 | - [performance.preconnect](/config/performance/preconnect)
|
diff --git a/website/docs/zh/guide/start/npm-packages.mdx b/website/docs/zh/guide/start/npm-packages.mdx
index 6b0d42281c..c94fd9dc9d 100644
--- a/website/docs/zh/guide/start/npm-packages.mdx
+++ b/website/docs/zh/guide/start/npm-packages.mdx
@@ -122,16 +122,6 @@ Stylus 插件,使用 Stylus 作为 CSS 预处理器。
- [源代码](https://github.com/web-infra-dev/rsbuild/tree/main/packages/plugin-source-build)
- [文档](/plugins/list/plugin-source-build)
-## @rsbuild/plugin-image-compress
-
-
-
-Image Compress 插件,将项目中用到的图片资源进行压缩处理。
-
-- [npm](https://npmjs.com/package/@rsbuild/plugin-image-compress)
-- [源代码](https://github.com/web-infra-dev/rsbuild/tree/main/packages/plugin-image-compress)
-- [文档](/plugins/list/plugin-image-compress)
-
## @rsbuild/plugin-check-syntax

diff --git a/website/docs/zh/plugins/list/_meta.json b/website/docs/zh/plugins/list/_meta.json
index 81acfc5070..90fae1b17e 100644
--- a/website/docs/zh/plugins/list/_meta.json
+++ b/website/docs/zh/plugins/list/_meta.json
@@ -15,7 +15,6 @@
"plugin-stylus",
"plugin-assets-retry",
"plugin-type-check",
- "plugin-image-compress",
"plugin-lightningcss",
"plugin-source-build",
"plugin-styled-components",
diff --git a/website/docs/zh/plugins/list/index.mdx b/website/docs/zh/plugins/list/index.mdx
index e839179b81..e41f6abfea 100644
--- a/website/docs/zh/plugins/list/index.mdx
+++ b/website/docs/zh/plugins/list/index.mdx
@@ -61,7 +61,7 @@
- [Basic SSL 插件](https://github.com/rspack-contrib/rsbuild-plugin-basic-ssl): 为 HTTPS server 生成不受信任的自签名证书。
- [ESLint 插件](https://github.com/rspack-contrib/rsbuild-plugin-eslint):用于在编译过程中运行 ESLint 检查。
- [Type Check 插件](/plugins/list/plugin-type-check):用于在单独的进程中运行 TypeScript 类型检查。
-- [Image Compress 插件](/plugins/list/plugin-image-compress):将项目中用到的图片资源进行压缩处理。
+- [Image Compress 插件](https://github.com/rspack-contrib/rsbuild-plugin-image-compress):压缩图片资源。
- [MDX 插件](https://github.com/rspack-contrib/rsbuild-plugin-mdx):提供 MDX 支持。
- [Node Polyfill 插件](https://github.com/rspack-contrib/rsbuild-plugin-node-polyfill):用于注入 Node 核心模块在浏览器端的 polyfills。
- [Lightning CSS 插件](/plugins/list/plugin-lightningcss):用于使用 LightningCSS 作为 CSS 的转译和压缩工具。
diff --git a/website/docs/zh/plugins/list/plugin-image-compress.mdx b/website/docs/zh/plugins/list/plugin-image-compress.mdx
deleted file mode 100644
index 65bbeb6cfc..0000000000
--- a/website/docs/zh/plugins/list/plugin-image-compress.mdx
+++ /dev/null
@@ -1,69 +0,0 @@
-# Image Compress 插件
-
-import { SourceCode } from 'rspress/theme';
-
-
-
-Image Compress 插件会将项目中用到的图片资源进行压缩处理,进而在图片视觉观感不受影响的同时减小产物体积。
-
-## 快速开始
-
-### 安装插件
-
-你可以通过如下的命令安装插件:
-
-import { PackageManagerTabs } from '@theme';
-
-
-
-### 注册插件
-
-你可以在 `rsbuild.config.ts` 文件中注册插件:
-
-```ts title="rsbuild.config.ts"
-import { pluginImageCompress } from '@rsbuild/plugin-image-compress';
-
-export default {
- plugins: [pluginImageCompress()],
-};
-```
-
-## 选项
-
-插件接受一系列压缩器配置项组成的数组,数组的每一项既可以是字符串也可以是对象。字符串代表使用对应名称的压缩器并启用其默认配置,
-或是使用对象格式配置并在 `use` 字段指定压缩器,对象的剩余字段将作为压缩器的配置项。
-
-插件默认会开启 `jpeg`, `png`, `ico` 三种图片压缩器,即等同于如下两种写法的配置:
-
-```js
-pluginImageCompress(['jpeg', 'png', 'ico']);
-```
-
-```js
-pluginImageCompress([{ use: 'jpeg' }, { use: 'png' }, { use: 'ico' }]);
-```
-
-通过指定配置项可以覆盖默认配置,例如让 jpeg 压缩器识别新的拓展名并设置 png 压缩器的质量:
-
-```js
-pluginImageCompress([
- { use: 'jpeg', test: /\.(?:jpg|jpeg|jpe)$/ },
- { use: 'png', minQuality: 50 },
- 'ico',
-]);
-```
-
-默认的 `png` 压缩器为有损压缩,如果需要将其替换为无损压缩器,你可以使用如下配置:
-
-```js
-pluginImageCompress(['jpeg', 'pngLossless', 'ico']);
-```
-
-配置项列表最终会转换成对应的 bundler loader 配置,因此压缩器也遵循从下到上依次匹配的规则。
-例如对于如下配置,`png` 压缩器会优先于 `pngLossless` 压缩器生效:
-
-```js
-pluginImageCompress(['jpeg', 'pngLossless', 'ico', 'png']);
-```
-
-压缩器的具体配置项请参考 [@napi-rs/image](https://image.napi.rs/docs)。