184 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
			
		
		
	
	
			184 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
/*
 | 
						|
 * Copyright 2025 coze-dev Authors
 | 
						|
 *
 | 
						|
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
 * you may not use this file except in compliance with the License.
 | 
						|
 * You may obtain a copy of the License at
 | 
						|
 *
 | 
						|
 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 *
 | 
						|
 * Unless required by applicable law or agreed to in writing, software
 | 
						|
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
 * See the License for the specific language governing permissions and
 | 
						|
 * limitations under the License.
 | 
						|
 */
 | 
						|
 
 | 
						|
import path from 'path';
 | 
						|
 | 
						|
import refreshPlugin from '@rspack/plugin-react-refresh';
 | 
						|
import rspack from '@rspack/core';
 | 
						|
import { type Configuration } from '@rspack/cli';
 | 
						|
 | 
						|
import { updateDTS } from './env/scripts/index';
 | 
						|
import { envs } from './env';
 | 
						|
 | 
						|
const { IS_DEV_MODE, IS_CI, IS_SCM } = envs;
 | 
						|
 | 
						|
const CDN_PATH = IS_SCM
 | 
						|
  ? `//${process.env.CDN_INNER_CN}/${process.env.CDN_PATH_PREFIX}`
 | 
						|
  : '/';
 | 
						|
 | 
						|
if (IS_DEV_MODE) {
 | 
						|
  updateDTS();
 | 
						|
}
 | 
						|
 | 
						|
const config: Configuration = {
 | 
						|
  mode: IS_DEV_MODE ? 'development' : 'production',
 | 
						|
  context: __dirname,
 | 
						|
  entry: { main: './src/index.tsx' },
 | 
						|
  output: { path: 'output', publicPath: CDN_PATH },
 | 
						|
  target: ['web'],
 | 
						|
  resolve: {
 | 
						|
    tsConfigPath: path.resolve(__dirname, 'tsconfig.json'), // https://www.rspack.dev/config/resolve.html#resolvetsconfigpath
 | 
						|
  },
 | 
						|
  devServer: {
 | 
						|
    historyApiFallback: true,
 | 
						|
  },
 | 
						|
  module: {
 | 
						|
    rules: [
 | 
						|
      {
 | 
						|
        test: /\.svg$/,
 | 
						|
        issuer: /\.[jt]sx?$/,
 | 
						|
        use: [
 | 
						|
          { loader: '@svgr/webpack', options: { native: false } },
 | 
						|
          'file-loader',
 | 
						|
        ],
 | 
						|
      },
 | 
						|
      {
 | 
						|
        test: /\.(png|gif|jpg|jpeg|woff2)$/,
 | 
						|
        use: ['file-loader'],
 | 
						|
      },
 | 
						|
      {
 | 
						|
        test: /\.css$/,
 | 
						|
        use: [
 | 
						|
          {
 | 
						|
            loader: 'postcss-loader',
 | 
						|
            options: {
 | 
						|
              postcssOptions: {
 | 
						|
                plugins: {
 | 
						|
                  tailwindcss: {},
 | 
						|
                  autoprefixer: {},
 | 
						|
                },
 | 
						|
              },
 | 
						|
            },
 | 
						|
          },
 | 
						|
        ],
 | 
						|
        type: 'css',
 | 
						|
      },
 | 
						|
      {
 | 
						|
        test: /\.module\.css$/i,
 | 
						|
        type: 'css/module',
 | 
						|
      },
 | 
						|
      {
 | 
						|
        test: /\.less$/,
 | 
						|
        use: [
 | 
						|
          {
 | 
						|
            loader: 'less-loader',
 | 
						|
          },
 | 
						|
        ],
 | 
						|
        type: 'css/auto',
 | 
						|
      },
 | 
						|
      {
 | 
						|
        test: /\.(jsx?|tsx?)$/,
 | 
						|
        use: [
 | 
						|
          {
 | 
						|
            loader: 'builtin:swc-loader',
 | 
						|
            options: {
 | 
						|
              sourceMap: true,
 | 
						|
              jsc: {
 | 
						|
                parser: {
 | 
						|
                  syntax: 'typescript',
 | 
						|
                  tsx: true,
 | 
						|
                  decorators: true,
 | 
						|
                },
 | 
						|
                transform: {
 | 
						|
                  react: {
 | 
						|
                    runtime: 'automatic',
 | 
						|
                    development: IS_DEV_MODE,
 | 
						|
                    refresh: IS_DEV_MODE,
 | 
						|
                  },
 | 
						|
                },
 | 
						|
              },
 | 
						|
              env: {
 | 
						|
                targets: [
 | 
						|
                  'chrome >= 87',
 | 
						|
                  'edge >= 88',
 | 
						|
                  'firefox >= 78',
 | 
						|
                  'safari >= 14',
 | 
						|
                ],
 | 
						|
              },
 | 
						|
            },
 | 
						|
          },
 | 
						|
        ],
 | 
						|
      },
 | 
						|
    ],
 | 
						|
  },
 | 
						|
  builtins: {
 | 
						|
    treeShaking: !IS_DEV_MODE && !IS_CI,
 | 
						|
  },
 | 
						|
  plugins: [
 | 
						|
    new rspack.DefinePlugin({
 | 
						|
      ...envs,
 | 
						|
    }),
 | 
						|
    new rspack.ProgressPlugin({}),
 | 
						|
    new rspack.HtmlRspackPlugin({
 | 
						|
      template: './index.html',
 | 
						|
    }),
 | 
						|
    IS_DEV_MODE ? new refreshPlugin() : null,
 | 
						|
    IS_DEV_MODE && new rspack.ProgressPlugin(),
 | 
						|
  ].filter(Boolean),
 | 
						|
  /** module is too large now, we may need better way to tackle this in the future */
 | 
						|
  stats: IS_DEV_MODE
 | 
						|
    ? false
 | 
						|
    : IS_CI
 | 
						|
    ? {
 | 
						|
        all: false,
 | 
						|
        modules: true,
 | 
						|
        assets: true,
 | 
						|
        chunks: true,
 | 
						|
        warnings: true,
 | 
						|
        errors: true,
 | 
						|
      }
 | 
						|
    : {
 | 
						|
        modules: false,
 | 
						|
        all: false,
 | 
						|
        warnings: false,
 | 
						|
        errors: true,
 | 
						|
        timings: true,
 | 
						|
      },
 | 
						|
  optimization: {
 | 
						|
    splitChunks: {
 | 
						|
      chunks: 'all',
 | 
						|
      minChunks: 1,
 | 
						|
      minSize: 20000,
 | 
						|
      maxAsyncRequests: 30,
 | 
						|
      maxInitialRequests: 30,
 | 
						|
      cacheGroups: {
 | 
						|
        defaultVendors: {
 | 
						|
          test: /[\\/]node_modules[\\/]/,
 | 
						|
          priority: -10,
 | 
						|
          reuseExistingChunk: true,
 | 
						|
        },
 | 
						|
        default: {
 | 
						|
          minChunks: 2,
 | 
						|
          priority: -20,
 | 
						|
          reuseExistingChunk: true,
 | 
						|
        },
 | 
						|
      },
 | 
						|
    },
 | 
						|
  },
 | 
						|
};
 | 
						|
 | 
						|
export default config;
 |