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;
 |